From 19a8c9952bfa95b568c3ad09ddb6a1c75a09f35a Mon Sep 17 00:00:00 2001 From: Bryan Bonnet Date: Mon, 14 May 2018 07:48:32 -0400 Subject: [PATCH] fix(WebSocketSubject): Check to see if WebSocket exists in global scope before using it --- spec/observables/dom/webSocket-spec.ts | 42 +++++++++++++++++++ .../observable/dom/WebSocketSubject.ts | 6 ++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/spec/observables/dom/webSocket-spec.ts b/spec/observables/dom/webSocket-spec.ts index 2f8caa9cca..4254248d84 100644 --- a/spec/observables/dom/webSocket-spec.ts +++ b/spec/observables/dom/webSocket-spec.ts @@ -636,6 +636,48 @@ describe('webSocket', () => { ]); }); }); + + describe('node constructor', () => { + + it('should send and receive messages', () => { + let messageReceived = false; + const subject = webSocket({ + url: 'ws://mysocket', + WebSocketCtor: (url: string, protocol: string): MockWebSocket => { + return new MockWebSocket(url, protocol); + } + }); + + subject.next('ping'); + + subject.subscribe(x => { + expect(x).to.equal('pong'); + messageReceived = true; + }); + + const socket = MockWebSocket.lastSocket; + expect(socket.url).to.equal('ws://mysocket'); + + socket.open(); + expect(socket.lastMessageSent).to.equal(JSON.stringify('ping')); + + socket.triggerMessage(JSON.stringify('pong')); + expect(messageReceived).to.be.true; + + subject.unsubscribe(); + }); + + it('should handle constructor errors if no WebSocketCtor', () => { + + expect(() => { + const subject = webSocket({ + url: 'ws://mysocket' + }); + }).to.throw('no WebSocket constructor can be found'); + + }); + }); + }); class MockWebSocket { diff --git a/src/internal/observable/dom/WebSocketSubject.ts b/src/internal/observable/dom/WebSocketSubject.ts index 6a76461398..4f1f91e5c0 100644 --- a/src/internal/observable/dom/WebSocketSubject.ts +++ b/src/internal/observable/dom/WebSocketSubject.ts @@ -80,7 +80,6 @@ export class WebSocketSubject extends AnonymousSubject { this.source = urlConfigOrSource as Observable; } else { const config = this._config = { ...DEFAULT_WEBSOCKET_CONFIG }; - config.WebSocketCtor = WebSocket; this._output = new Subject(); if (typeof urlConfigOrSource === 'string') { config.url = urlConfigOrSource; @@ -91,7 +90,10 @@ export class WebSocketSubject extends AnonymousSubject { } } } - if (!config.WebSocketCtor) { + + if (!config.WebSocketCtor && WebSocket) { + config.WebSocketCtor = WebSocket; + } else if (!config.WebSocketCtor) { throw new Error('no WebSocket constructor can be found'); } this.destination = new ReplaySubject();