add removeFromAllRooms

This commit is contained in:
nvms 2024-09-11 13:13:40 -04:00
parent 5546e845ac
commit 2214a58113
2 changed files with 102 additions and 26 deletions

View File

@ -13,37 +13,89 @@ type LatencyPayload = {
};
export declare interface Connection extends EventTarget {
addEventListener(type: "message", listener: (ev: CustomEvent) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "message",
listener: (ev: CustomEvent) => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is made. */
addEventListener(type: "connection", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "connection",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is made. */
addEventListener(type: "connected", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "connected",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is made. */
addEventListener(type: "connect", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "connect",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is closed. */
addEventListener(type: "close", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "close",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is closed. */
addEventListener(type: "closed", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "closed",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is closed. */
addEventListener(type: "disconnect", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "disconnect",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a connection is closed. */
addEventListener(type: "disconnected", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "disconnected",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a reconnect event is successful. */
addEventListener(type: "reconnect", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "reconnect",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a reconnect fails after @see KeepAliveClientOptions.maxReconnectAttempts attempts. */
addEventListener(type: "reconnectfailed", listener: () => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "reconnectfailed",
listener: () => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a ping message is received from @see KeepAliveServer from `@prsm/keepalive-ws/server`. */
addEventListener(type: "ping", listener: (ev: CustomEventInit<{}>) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "ping",
listener: (ev: CustomEventInit<{}>) => any,
options?: boolean | AddEventListenerOptions,
): void;
/** Emits when a latency event is received from @see KeepAliveServer from `@prsm/keepalive-ws/server`. */
addEventListener(type: "latency", listener: (ev: CustomEventInit<LatencyPayload>) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: "latency",
listener: (ev: CustomEventInit<LatencyPayload>) => any,
options?: boolean | AddEventListenerOptions,
): void;
addEventListener(type: string, listener: (ev: CustomEvent) => any, options?: boolean | AddEventListenerOptions): void;
addEventListener(
type: string,
listener: (ev: CustomEvent) => any,
options?: boolean | AddEventListenerOptions,
): void;
}
export class Connection extends EventTarget {
@ -64,7 +116,11 @@ export class Connection extends EventTarget {
* @param listener The function to call when the event is fired.
* @param options An options object that specifies characteristics about the event listener.
*/
on(event: string, listener: (ev: CustomEvent) => any, options?: boolean | AddEventListenerOptions) {
on(
event: string,
listener: (ev: CustomEvent) => any,
options?: boolean | AddEventListenerOptions,
) {
this.addEventListener(event, listener, options);
}
@ -74,7 +130,11 @@ export class Connection extends EventTarget {
* @param listener The event listener to be removed.
* @param options An options object that specifies characteristics about the event listener.
*/
off(event: string, listener: (ev: CustomEvent) => any, options?: boolean | AddEventListenerOptions) {
off(
event: string,
listener: (ev: CustomEvent) => any,
options?: boolean | AddEventListenerOptions,
) {
this.removeEventListener(event, listener, options);
}
@ -119,24 +179,28 @@ export class Connection extends EventTarget {
if (data.command === "latency:request") {
this.dispatchEvent(
new CustomEvent<LatencyPayload>(
"latency:request",
{ detail: { latency: data.payload.latency ?? undefined }}
)
new CustomEvent<LatencyPayload>("latency:request", {
detail: { latency: data.payload.latency ?? undefined },
}),
);
this.command(
"latency:response",
{ latency: data.payload.latency ?? undefined },
null,
);
this.command("latency:response", { latency: data.payload.latency ?? undefined }, null);
} else if (data.command === "latency") {
this.dispatchEvent(
new CustomEvent<LatencyPayload>(
"latency",
{ detail: { latency: data.payload ?? undefined }}
)
new CustomEvent<LatencyPayload>("latency", {
detail: { latency: data.payload ?? undefined },
}),
);
} else if (data.command === "ping") {
this.dispatchEvent(new CustomEvent("ping", {}));
this.command("pong", {}, null);
} else {
this.dispatchEvent(new CustomEvent(data.command, { detail: data.payload }));
this.dispatchEvent(
new CustomEvent(data.command, { detail: data.payload }),
);
}
if (this.callbacks[data.id]) {
@ -148,7 +212,12 @@ export class Connection extends EventTarget {
};
}
async command(command: string, payload: any, expiresIn: number = 30_000, callback: Function | null = null) {
async command(
command: string,
payload: any,
expiresIn: number = 30_000,
callback: Function | null = null,
) {
const id = this.ids.reserve();
const cmd = { id, command, payload: payload ?? {} };

View File

@ -319,6 +319,13 @@ export class KeepAliveServer extends WebSocketServer {
this.rooms[roomName].delete(connection.id);
}
removeFromAllRooms(connection: Connection | string) {
const connectionId = typeof connection === "string" ? connection : connection.id;
Object.keys(this.rooms).forEach((roomName) => {
this.rooms[roomName].delete(connectionId);
});
}
/**
* Returns a "room", which is simply a Set of Connection ids.
* @param roomName