Skip to content

Commit

Permalink
fix reconnect on close before transport open (#281)
Browse files Browse the repository at this point in the history
  • Loading branch information
FZambia authored Apr 9, 2024
1 parent 3bac6dd commit f7f0391
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
40 changes: 40 additions & 0 deletions src/centrifuge.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -499,3 +499,43 @@ test.each(websocketOnly)("%s: unsubscribe in between connect command and reply",
await disconnectedPromise;
expect(c.state).toBe(State.Disconnected);
});

// Make sure we can resubscribe when offline event triggered before WebSocket transport open.
test.each(websocketOnly)("%s: reconnect after close before transport open", async (transport, endpoint) => {
const networkEventTarget = new EventTarget();

const c = new Centrifuge([{
transport: transport as TransportName,
endpoint: endpoint,
}], {
websocket: WebSocket,
fetch: fetch,
eventsource: EventSource,
readableStream: ReadableStream,
emulationEndpoint: 'http://localhost:8000/emulation',
networkEventTarget: networkEventTarget,
});

const offlineEvent = new Event('offline', { bubbles: true });

// @ts-ignore this is only for test purposes.
c.once('__centrifuge_debug:transport_initialized', () => {
networkEventTarget.dispatchEvent(offlineEvent);
})

c.connect();

await c.ready()

let disconnectCalled: any;
const disconnectedPromise = new Promise<DisconnectedContext>((resolve, _) => {
disconnectCalled = resolve;
})
c.on('disconnected', (ctx) => {
disconnectCalled(ctx);
})

c.disconnect();
await disconnectedPromise;
expect(c.state).toBe(State.Disconnected);
});
5 changes: 4 additions & 1 deletion src/centrifuge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,8 @@ export class Centrifuge extends (EventEmitter as new () => TypedEventEmitter<Cli
self._dataReceived(data);
}
}, initialData);
//@ts-ignore must be used only for debug and test purposes.
self.emit('__centrifuge_debug:transport_initialized', {})
}

private _sendConnect(skipSending: boolean): any {
Expand Down Expand Up @@ -1003,7 +1005,6 @@ export class Centrifuge extends (EventEmitter as new () => TypedEventEmitter<Cli
'error': err
});
this._debug('closing transport due to connect error');
this._reconnecting = false;
this._disconnect(err.code, err.message, true);
} else {
this._disconnect(err.code, err.message, false);
Expand All @@ -1023,6 +1024,7 @@ export class Centrifuge extends (EventEmitter as new () => TypedEventEmitter<Cli
delay = 0;
}
this._debug('reconnect after ' + delay + ' milliseconds');
this._clearReconnectTimeout();
this._reconnectTimeout = setTimeout(() => {
this._startReconnecting();
}, delay);
Expand Down Expand Up @@ -1213,6 +1215,7 @@ export class Centrifuge extends (EventEmitter as new () => TypedEventEmitter<Cli
// if transport will still be open at this time, subscribe frames will be sent to closing transport
this._transportIsOpen = false;
const previousState = this.state;
this._reconnecting = false;

const ctx = {
code: code,
Expand Down

0 comments on commit f7f0391

Please # to comment.