diff --git a/spec/observables/dom/webSocket-spec.ts b/spec/observables/dom/webSocket-spec.ts index 4254248d84..854e9369da 100644 --- a/spec/observables/dom/webSocket-spec.ts +++ b/spec/observables/dom/webSocket-spec.ts @@ -143,6 +143,34 @@ describe('webSocket', () => { (socket.close).restore(); }); + it('should close the socket when unsubscribed before socket open', () => { + const subject = webSocket('ws://mysocket'); + subject.subscribe(); + subject.unsubscribe(); + const socket = MockWebSocket.lastSocket; + sinon.spy(socket, 'close'); + socket.open(); + + expect(socket.close).have.been.called; + expect(socket.readyState).to.equal(3); // closed + + (socket.close).restore(); + }); + + it('should close the socket when subscription is cancelled before socket open', () => { + const subject = webSocket('ws://mysocket'); + const subscription = subject.subscribe(); + subscription.unsubscribe(); + const socket = MockWebSocket.lastSocket; + sinon.spy(socket, 'close'); + socket.open(); + + expect(socket.close).have.been.called; + expect(socket.readyState).to.equal(3); // closed + + (socket.close).restore(); + }); + it('should close the socket with a code and a reason when errored', () => { const subject = webSocket('ws://mysocket'); subject.subscribe(); diff --git a/src/internal/observable/dom/WebSocketSubject.ts b/src/internal/observable/dom/WebSocketSubject.ts index 9dca5a256f..c9be095e68 100644 --- a/src/internal/observable/dom/WebSocketSubject.ts +++ b/src/internal/observable/dom/WebSocketSubject.ts @@ -184,6 +184,12 @@ export class WebSocketSubject extends AnonymousSubject { }); socket.onopen = (e: Event) => { + const { _socket } = this; + if (!_socket) { + socket.close(); + this._resetState(); + return; + } const { openObserver } = this._config; if (openObserver) { openObserver.next(e); @@ -280,14 +286,11 @@ export class WebSocketSubject extends AnonymousSubject { } unsubscribe() { - const { source, _socket } = this; + const { _socket } = this; if (_socket && _socket.readyState === 1) { _socket.close(); - this._resetState(); } + this._resetState(); super.unsubscribe(); - if (!source) { - this.destination = new ReplaySubject(); - } } }