Skip to content

Instantly share code, notes, and snippets.

@Tazaf
Last active December 20, 2021 09:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tazaf/d2530cfafc287e53ef20ea3dc1057617 to your computer and use it in GitHub Desktop.
Save Tazaf/d2530cfafc287e53ef20ea3dc1057617 to your computer and use it in GitHub Desktop.
Minimal Angular WebSocket Service
import { Injectable } from '@angular/core';
import { Observable, Observer, ReplaySubject } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
const WS_SERVER_URL = '<YOUR_WEBSOCKET_URL>';
@Injectable({ providedIn: 'root' })
export class WebsocketService {
private ws$ = new ReplaySubject<WebSocket>(1);
constructor() {
const socket = new WebSocket(WS_SERVER_URL);
socket.onopen = () => {
console.log('Successfully connected to the WebSocket at', WS_SERVER_URL);
this.ws$.next(socket);
};
}
public listen<T = any>(): Observable<T> {
return this.ws$.pipe(
switchMap(
(socket) =>
new Observable((subscriber: Observer<MessageEvent<T>>) => {
socket.onmessage = (message) => subscriber.next(message);
socket.onerror = (error) => subscriber.error(error);
socket.onclose = () => subscriber.complete();
return () => socket.close();
})
),
map((event: MessageEvent<T>) => event.data)
);
}
public send(data: unknown): void {
this.ws$.subscribe((socket) => {
socket.send(JSON.stringify(data));
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment