Skip to content

Commit cd8cdd0

Browse files
trxcllntbenlesh
authored andcommitted
fix(WebSocketSubject): respect WebSockeCtor, support source/destination arguments in constructor. (#1790)
Fixes #1745 and #1784
1 parent 43d05e7 commit cd8cdd0

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

src/observable/dom/WebSocketSubject.ts

+36-16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {Subject, AnonymousSubject} from '../../Subject';
22
import {Subscriber} from '../../Subscriber';
33
import {Observable} from '../../Observable';
44
import {Subscription} from '../../Subscription';
5+
import {Operator} from '../../Operator';
56
import {root} from '../../util/root';
67
import {ReplaySubject} from '../../ReplaySubject';
78
import {Observer, NextObserver} from '../../Observer';
@@ -25,14 +26,16 @@ export interface WebSocketSubjectConfig {
2526
* @hide true
2627
*/
2728
export class WebSocketSubject<T> extends AnonymousSubject<T> {
29+
2830
url: string;
2931
protocol: string|Array<string>;
3032
socket: WebSocket;
3133
openObserver: NextObserver<Event>;
3234
closeObserver: NextObserver<CloseEvent>;
3335
closingObserver: NextObserver<void>;
3436
WebSocketCtor: { new(url: string, protocol?: string|Array<string>): WebSocket };
35-
private _output: Subject<T> = new Subject<T>();
37+
38+
private _output: Subject<T>;
3639

3740
resultSelector(e: MessageEvent) {
3841
return JSON.parse(e.data);
@@ -50,21 +53,29 @@ export class WebSocketSubject<T> extends AnonymousSubject<T> {
5053
}
5154

5255
constructor(urlConfigOrSource: string | WebSocketSubjectConfig | Observable<T>, destination?: Observer<T>) {
53-
super();
54-
this.WebSocketCtor = root.WebSocket;
55-
56-
if (typeof urlConfigOrSource === 'string') {
57-
this.url = urlConfigOrSource;
56+
if (urlConfigOrSource instanceof Observable) {
57+
super(destination, <Observable<T>> urlConfigOrSource);
5858
} else {
59-
// WARNING: config object could override important members here.
60-
assign(this, urlConfigOrSource);
61-
}
62-
63-
if (!this.WebSocketCtor) {
64-
throw new Error('no WebSocket constructor can be found');
59+
super();
60+
this.WebSocketCtor = root.WebSocket;
61+
this._output = new Subject<T>();
62+
if (typeof urlConfigOrSource === 'string') {
63+
this.url = urlConfigOrSource;
64+
} else {
65+
// WARNING: config object could override important members here.
66+
assign(this, urlConfigOrSource);
67+
}
68+
if (!this.WebSocketCtor) {
69+
throw new Error('no WebSocket constructor can be found');
70+
}
71+
this.destination = new ReplaySubject();
6572
}
73+
}
6674

67-
this.destination = new ReplaySubject();
75+
lift<R>(operator: Operator<T, R>): WebSocketSubject<R> {
76+
const sock = new WebSocketSubject<R>(this, <any> this.destination);
77+
sock.operator = operator;
78+
return sock;
6879
}
6980

7081
// TODO: factor this out to be a proper Operator/Subscriber implementation and eliminate closures
@@ -102,7 +113,10 @@ export class WebSocketSubject<T> extends AnonymousSubject<T> {
102113
}
103114

104115
private _connectSocket() {
105-
const socket = this.protocol ? new WebSocket(this.url, this.protocol) : new WebSocket(this.url);
116+
const { WebSocketCtor } = this;
117+
const socket = this.protocol ?
118+
new WebSocketCtor(this.url, this.protocol) :
119+
new WebSocketCtor(this.url);
106120
this.socket = socket;
107121
const subscription = new Subscription(() => {
108122
this.socket = null;
@@ -178,6 +192,10 @@ export class WebSocketSubject<T> extends AnonymousSubject<T> {
178192
}
179193

180194
protected _subscribe(subscriber: Subscriber<T>): Subscription {
195+
const { source } = this;
196+
if (source) {
197+
return source.subscribe(subscriber);
198+
}
181199
if (!this.socket) {
182200
this._connectSocket();
183201
}
@@ -194,12 +212,14 @@ export class WebSocketSubject<T> extends AnonymousSubject<T> {
194212
}
195213

196214
unsubscribe() {
197-
const { socket } = this;
215+
const { source, socket } = this;
198216
if (socket && socket.readyState === 1) {
199217
socket.close();
200218
this.socket = null;
201219
}
202220
super.unsubscribe();
203-
this.destination = new ReplaySubject();
221+
if (!source) {
222+
this.destination = new ReplaySubject();
223+
}
204224
}
205225
}

0 commit comments

Comments
 (0)