rxprotoplex-peers
Version:
A reactive peer-to-peer management library built on RxJS and Protoplex for efficient signaling, matchmaking, and multiplexing.
55 lines (48 loc) • 2.22 kB
JavaScript
import {server} from "./server.js";
import {catchError, EMPTY, finalize, fromEvent, map, merge, NEVER, share, shareReplay, take, takeUntil} from "rxjs";
import {fromWebSocket} from "rxprotoplex-websocket";
import {destroy} from "rxprotoplex";
import {onStoreReset$} from "../store.js";
/**
* Creates a WebSocket server for managing socket connections using a socket manager.
* @param {Object} wss - The WebSocket server instance (`ws.Server`) to handle WebSocket connections.
* @param {Object} [config={}] - Configuration options for the WebSocket server.
* @param {Observable} [config.close$=NEVER] - An observable that signals the server to close.
* @param {Subject} [config.server$] - An existing server subject. Defaults to a new server created using the `server` function.
* @param {Object} [config.plexConfig] - Additional configuration options for Plex instances.
* @returns {Subject} A subject for managing server socket connections.
*/
export const webSocketServer = (wss, config = {}) => {
const connections = new Set();
const {
server$: server$ = server(config),
...plexConfig
} = config;
const close$ = server$.close$;
const wssClose$ = merge(onStoreReset$, server$.close$, fromEvent(wss, "close"))
.pipe(take(1), share());
wssClose$.subscribe(() => {
console.debug("[webSocketServer] Server closing, cleaning up connections.");
wss.close(); // Prevent new connections
connections.forEach((s) => destroy(s));
connections.clear();
});
fromEvent(wss, "connection").pipe(
takeUntil(close$),
takeUntil(wssClose$),
map(([socket]) => {
console.debug("[webSocketServer] New WebSocket connection received.");
const plex = fromWebSocket(socket, plexConfig);
connections.add(plex);
return plex;
}),
catchError((err) => {
console.error("[webSocketServer] Connection error:", err);
return EMPTY; // Ignore errors and continue
}),
finalize(() => {
console.debug("[webSocketServer] Finalized connection handling.");
})
).subscribe(server$);
return server$;
};