Tengo un problema para conectarme simultáneamente a varios WebSockets con diferentes URL. Hasta ahora, utilicé los siguientes métodos para conectarme a un socket dado desde la URL (uno a la vez) o enviar un mensaje a uno y desconectarme inmediatamente después del método Send()
, y luego crear uno nuevo. En este caso necesito escuchar algunos sockets (no predefinidos) y recibir mensajes a mi Asunto. Desafortunadamente, para crear cada enlace nuevo, tengo que proporcionar una nueva URL. ¿Cómo hacerlo para no perder conexiones anteriores y que todo se escuche en un Observable (Sujeto)?
Aquí tengo una función en la que primero necesito obtener datos en la matriz ( por lo que puede haber una cantidad diferente ), y luego abrir tantas conexiones como haya en la matriz:
componente.ts
arrayIds = ['1abc', '2abc', '3abc'] // fetched data from API ... startConnecting() { this.arrayIds.forEach( id => { this.websocketService.connect(id).subscribe(); }); }
A continuación, tengo métodos en mi websocketService.service.ts
:
websocketService.servicio.ts.ts
export class WebsocketService implements OnDestroy{ connection$: WebSocketSubject<any>; RETRY_SECONDS = 10; constructor() { } connect(id: string): Observable<WebSocketSubject<any>> { return of(environment.WEBSOCKET_URL).pipe( filter(apiUrl => !!apiUrl), map(apiUrl => apiUrl + `/${id}/`), // here I need update new socket URL switchMap(wsUrl => { if (this.connection$) { return this.connection$; } else { this.connection$ = webSocket(wsUrl); return this.connection$; } }), retryWhen((errors) => errors.pipe(delay(this.RETRY_SECONDS))) ); } send(data): void { if (this.connection$) { this.connection$.next(data); } else { console.error('error'); } } closeConnection(): void { if (this.connection$) { this.connection$.complete(); this.connection$ = null; } } ngOnDestroy(): void { this.closeConnection(); } }
Entonces, en este ejemplo, necesito una conexión abierta con:
1. ws://URL/1abc 2. ws://URL/2abc 3. ws://URL/3abc
y recibir mensajes de todos a un Observable si esto es posible?