Skip to content

Commit 19e5d18

Browse files
committed
add onDisconnect callback
1 parent 1a3fddd commit 19e5d18

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

lib/session.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export class Session {
4343
private _baseSession: IBaseSession;
4444
private _wampSession: WAMPSession;
4545
private _idGen: SessionScopeIDGenerator = new SessionScopeIDGenerator();
46+
private _disconnectCallbacks: Array<() => Promise<void>> = [];
4647

4748
private _callRequests: Map<number, {
4849
resolve: (value: Result) => void,
@@ -76,6 +77,7 @@ export class Session {
7677
constructor(baseSession: IBaseSession) {
7778
this._baseSession = baseSession;
7879
this._wampSession = new WAMPSession(baseSession.serializer());
80+
this._baseSession.onDisconnect(async () => { await this.markDisconnected();});
7981

8082
(async () => {
8183
for (; ;) {
@@ -85,6 +87,10 @@ export class Session {
8587
})();
8688
}
8789

90+
onDisconnect(callback: () => Promise<void>): void {
91+
this._disconnectCallbacks.push(callback);
92+
}
93+
8894
private get _nextID(): number {
8995
return this._idGen.next();
9096
}
@@ -234,15 +240,15 @@ export class Session {
234240
throw new ProtocolError(wampErrorString(message));
235241
}
236242
} else if (message instanceof Goodbye) {
237-
this.markDisconnected()
243+
await this.markDisconnected()
238244
} else {
239245
throw new ProtocolError(`Unexpected message type ${typeof message}`);
240246
}
241247
}
242248

243-
private markDisconnected() {
244-
if (!this.isConnected()) {
245-
return
249+
private async markDisconnected() {
250+
if (this._disconnectCallbacks.length > 0) {
251+
await Promise.all(this._disconnectCallbacks.map(cb => cb()));
246252
}
247253

248254
if (this._goodbyeRequest && !this._goodbyeRequest.isCompleted) {

lib/types.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,18 @@ export abstract class IBaseSession {
4848
isConnected(): boolean {
4949
throw new Error("UnimplementedError");
5050
}
51+
52+
onDisconnect(callback: () => Promise<void>): void {
53+
throw new Error("UnimplementedError");
54+
}
5155
}
5256

5357
export class BaseSession extends IBaseSession {
5458
private readonly _ws: WebSocket;
5559
private readonly _wsMessageHandler: any;
5660
private readonly sessionDetails: SessionDetails;
5761
private readonly _serializer: Serializer;
62+
private _disconnectCallbacks: Array<() => Promise<void>> = [];
5863

5964
constructor(
6065
ws: WebSocket,
@@ -70,6 +75,9 @@ export class BaseSession extends IBaseSession {
7075

7176
// close cleanly on abrupt client disconnect
7277
this._ws.addEventListener("close", async () => {
78+
if (this._disconnectCallbacks.length > 0) {
79+
await Promise.all(this._disconnectCallbacks.map(cb => cb()));
80+
}
7381
await this.close();
7482
});
7583
}
@@ -134,6 +142,10 @@ export class BaseSession extends IBaseSession {
134142
isConnected(): boolean {
135143
return this._ws.readyState === WebSocket.OPEN;
136144
}
145+
146+
onDisconnect(callback: () => Promise<void>): void {
147+
this._disconnectCallbacks.push(callback);
148+
}
137149
}
138150

139151
export class Result {

0 commit comments

Comments
 (0)