Skip to content

Commit 848a527

Browse files
deontologiciankwonoj
authored andcommitted
fix(WebSocketSubject): prevent early close (#1831)
1 parent 8f0dc01 commit 848a527

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

spec/observables/dom/webSocket-spec.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,5 +436,56 @@ describe('Observable.webSocket', () => {
436436

437437
expect(results).to.deep.equal(['sub', 'unsub', 'sub', error, 'unsub']);
438438
});
439+
440+
it('should not close the socket until all subscriptions complete', () => {
441+
const socketSubject = Rx.Observable.webSocket(<any>{url: 'ws://mysocket'});
442+
const results = [];
443+
const socketMessages = [
444+
{id: 'A'},
445+
{id: 'B'},
446+
{id: 'A', complete: true},
447+
{id: 'B'},
448+
{id: 'B', complete: true},
449+
];
450+
451+
socketSubject.multiplex(
452+
() => 'no-op',
453+
() => results.push('A unsub'),
454+
(req: any) => req.id === 'A')
455+
.takeWhile((req: any) => !req.complete)
456+
.subscribe(
457+
() => results.push('A next'),
458+
(e) => results.push('A error ' + e),
459+
() => results.push('A complete')
460+
);
461+
462+
socketSubject.multiplex(
463+
() => 'no-op',
464+
() => results.push('B unsub'),
465+
(req: any) => req.id === 'B')
466+
.takeWhile((req: any) => !req.complete)
467+
.subscribe(
468+
() => results.push('B next'),
469+
(e) => results.push('B error ' + e),
470+
() => results.push('B complete')
471+
);
472+
473+
// Setup socket and send messages
474+
let socket = MockWebSocket.lastSocket;
475+
socket.open();
476+
socketMessages.forEach((msg) => {
477+
socket.triggerMessage(JSON.stringify(msg));
478+
});
479+
480+
expect(results).to.deep.equal([
481+
'A next',
482+
'B next',
483+
'A complete',
484+
'A unsub',
485+
'B next',
486+
'B complete',
487+
'B unsub',
488+
]);
489+
});
439490
});
440-
});
491+
});

src/observable/dom/WebSocketSubject.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ export class WebSocketSubject<T> extends AnonymousSubject<T> {
203203
subscription.add(this._output.subscribe(subscriber));
204204
subscription.add(() => {
205205
const { socket } = this;
206-
if (socket && socket.readyState === 1) {
206+
if (this._output.observers.length === 0 && socket && socket.readyState === 1) {
207207
socket.close();
208208
this.socket = null;
209209
}

0 commit comments

Comments
 (0)