diff --git a/spec/observables/dom/webSocket-spec.ts b/spec/observables/dom/webSocket-spec.ts index a121e3f0e2..cc367cec59 100644 --- a/spec/observables/dom/webSocket-spec.ts +++ b/spec/observables/dom/webSocket-spec.ts @@ -416,6 +416,52 @@ describe('webSocket', () => { subject.unsubscribe(); }); + it('should take a serializer', () => { + const subject = webSocket<{ data: string}>({ + url: 'ws://mysocket', + serializer: (e: any) => { + return e.data + '!'; + } + }); + + subject.subscribe(); + + const socket = MockWebSocket.lastSocket; + socket.open(); + + + ['ahoy', 'yarr', 'shove off'].forEach(x => { + subject.next({ data: x }); + expect(socket.lastMessageSent).to.equal(x + '!'); + }); + + subject.unsubscribe(); + }); + + it('if the serializer fails it should go down the error path', () => { + const subject = webSocket({ + url: 'ws://mysocket', + serializer: (e: any) => { + throw new Error('I am a bad error'); + } + }); + + const error = sinon.spy(); + subject.subscribe({ next: (x: any) => { + expect(x).to.equal('this should not happen'); + }, error }); + + const socket = MockWebSocket.lastSocket; + socket.open(); + + subject.next('weee!'); + expect(error).to.have.been.calledWithMatch({ message: 'I am a bad error' }); + expect(socket.readyState).to.equal(WebSocketState.CLOSING); + expect(socket.closeCode).to.equal(1000); + + subject.unsubscribe(); + }); + it('should accept a closingObserver', () => { let calls = 0; const subject = webSocket({ diff --git a/src/internal/observable/dom/WebSocketSubject.ts b/src/internal/observable/dom/WebSocketSubject.ts index 9eecbf5ec5..ab62b4ece2 100644 --- a/src/internal/observable/dom/WebSocketSubject.ts +++ b/src/internal/observable/dom/WebSocketSubject.ts @@ -303,7 +303,10 @@ export class WebSocketSubject extends AnonymousSubject { const { serializer } = this._config; socket!.send(serializer!(x!)); } catch (e) { - this.destination!.error(e); + this.destination!.error({ + code: 1000, + }); + observer.error(e); } } },