| import { Injectable } from '@angular/core'; | import { Injectable } from '@angular/core'; | ||||
| import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; | import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; | ||||
| import { BehaviorSubject, Subject } from "rxjs"; | |||||
| import { BehaviorSubject,Subject } from "rxjs"; | |||||
| import { config } from "../../../assets/config/config"; | import { config } from "../../../assets/config/config"; | ||||
| export class SocketService { | export class SocketService { | ||||
| gateway = config.gateway; | gateway = config.gateway; | ||||
| websocket$!: WebSocketSubject<any> ; | |||||
| websocket$: WebSocketSubject<any> | undefined ; | |||||
| private isConnected: boolean = false; | private isConnected: boolean = false; | ||||
| private messagesSubject$ = new Subject(); | private messagesSubject$ = new Subject(); | ||||
| public messages$ = this.messagesSubject$.asObservable(); | public messages$ = this.messagesSubject$.asObservable(); | ||||
| constructor() { | constructor() { | ||||
| } | } | ||||
| public connect(cfg: { reconnect: boolean } = {reconnect: false}): void { | |||||
| if (!this.websocket$ || this.websocket$.closed) { | |||||
| console.log('Trying to open a WebSocket connection…'); | |||||
| public connect(cfg: { reconnect: boolean } = { reconnect: false }): void { | |||||
| if (cfg.reconnect || !this.websocket$ || this.websocket$.closed) { | |||||
| console.log(cfg.reconnect ? 'Reconnecting WebSocket…' : 'Trying to open a WebSocket connection…'); | |||||
| this.websocket$ = this.getNewWebSocket(); | this.websocket$ = this.getNewWebSocket(); | ||||
| this.websocket$.subscribe((messages) => { | this.websocket$.subscribe((messages) => { | ||||
| this.messagesSubject$.next(messages); | this.messagesSubject$.next(messages); | ||||
| }); | }); | ||||
| } | } | ||||
| } | } | ||||
| close() { | close() { | ||||
| this.websocket$.complete(); | |||||
| this.websocket$?.complete(); | |||||
| this.websocket$ = undefined; | |||||
| } | } | ||||
| sendMessage(msg: any) { | sendMessage(msg: any) { | ||||
| this.websocket$.next(msg); | |||||
| this.websocket$?.next(msg); | |||||
| } | } | ||||
| private getNewWebSocket() { | private getNewWebSocket() { | ||||
| closeObserver: { | closeObserver: { | ||||
| next: () => { | next: () => { | ||||
| console.log('Connection closed'); | console.log('Connection closed'); | ||||
| this.websocket$ = undefined; | |||||
| this.isConnected = false; | this.isConnected = false; | ||||
| this.connect({reconnect: true}); | this.connect({reconnect: true}); | ||||
| this.statusSubject.next(this.isConnected); | this.statusSubject.next(this.isConnected); |