Повторное подключение WebSocket не дает новых результатов (angular 6) - PullRequest
0 голосов
/ 18 июня 2020

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);
  }
}

в качестве дополнительной информации: у меня есть два соединения в двух вкладках браузера на одном компьютере.

...