WebSocketService вызывается WebSocketConnector
const CHAT_URL = 'ws://xyz.herokuapp.com';
@Injectable()
export class WebSocketConnector {
public messages: Subject<object>;
constructor(private wsService: WebsocketService) {
this.wsService.connect(CHAT_URL);
this.messages = <Subject<object>>this.wsService.subject.pipe(map(
(response: MessageEvent): object => {
return JSON.parse(response.data);
}));
}
}
После повторного подключения через onCloseEvent подписка, такая как this.chatService.messages.subscribe(msg => {
, не обнаруживает никаких новых результатов, которые будут отправлены.
export class WebsocketService {
constructor() {}
public subject: Subject<MessageEvent>;
private ws: WebSocket = null;
private url: string = null;
public connect(url) {
if (!this.subject) {
this.create(url);
console.log('Successfully connected: ' + url);
}
}
private create(url) {
this.url = url ? url : this.url;
this.ws = new WebSocket(this.url);
const observable = Observable.create((obs: Observer<MessageEvent>) => {
this.ws.onmessage = obs.next.bind(obs);
this.ws.onerror = function (event) {
obs.error.bind(obs);
}
this.ws.onclose = this.onCloseEvent;
return this.ws.close.bind(this.ws);
});
const observer = {
next: (data: Object) => {
if (this.ws.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify(data));
}
}
};
this.subject = Subject.create(observer, observable);
}
onCloseEvent = (evt: CloseEvent) => {
this.ws = null;
setTimeout(this.create(undefined), 5000);
}
}
в качестве дополнительной информации: у меня есть два соединения в двух вкладках браузера на одном компьютере.