UNPKG

@tapsioss/client-socket-manager

Version:
230 lines (156 loc) 6.42 kB
<div align="center"> # Client Socket Manager </div> <div align="center"> A wrapper for `socket.io-client` that handles best practices and edge cases in a more abstracted and opinionated manner. </div> <hr /> `ClientSocketManager` is a flexible and robust manager for handling socket connections using `socket.io-client`. It provides easy setup and management of socket connections with support for automatic reconnections, event handling, and visibility change management. ## Installation First, install the necessary dependencies: ```sh npm install @tapsioss/client-socket-manager socket.io-client ``` ## Usage Here is an example of how to use `ClientSocketManager` in your project: ```ts import { ClientSocketManager } from '@tapsioss/client-socket-manager'; const socketManager = new ClientSocketManager('http://localhost:3000', { eventHandlers: { onSocketConnection() { console.log('Socket connected'); }, onSocketDisconnection(reason) { console.log('Socket disconnected:', reason); }, onSuccessfulReconnection(attempt) { console.log('Socket reconnected after', attempt, 'attempt(s)'); }, onAnySubscribedMessageReceived(channel, message) { console.log(`Message received on ${channel}:`, message); }, }, }); // Emit an event socketManager.emit('message', 'Hello, world!'); // Subscribe to a channel socketManager.subscribe('message', (msg) => { console.log('Message from server:', msg); }); ``` ## API Reference ### Constructor ```ts constructor(uri: string, options?: Partial<ClientSocketManagerOptions>) ``` #### Parameters: - `uri`: The URI of the socket server. - `options`: (optional): Configuration options for the socket connection. ##### Options: We have extended [socket-io's options](https://socket.io/docs/v4/client-options/) to include additional options: - `eventHandlers`: Handlers for various socket events. - `onInit`: Fired upon instantiation. - `onDispose`: Fired upon disposal. - `onSocketConnection`: Fired when the socket is successfully connected. - `onSocketDisconnection`: Fired when the socket is disconnected. - `onServerPing`: Fired when a ping packet is received from the server. - `onConnectionError`: Fired upon a connection error. - `onReconnecting`: Fired upon an attempt to reconnect. - `onReconnectingError`: Fired upon a reconnection attempt error. - `onReconnectionFailure`: Fired when couldn't reconnect within `reconnectionAttempts`. - `onSuccessfulReconnection`: Fired upon a successful reconnection. - `onAnySubscribedMessageReceived`: Fired when any message is received from a subscribed channel. - `onVisiblePage`: Fired when the page's `visibilityState` changes to `visible`. - `onHiddenPage`: Fired when the page's `visibilityState` changes to `hidden`. ### Properties: #### `id: string | null` A unique identifier for the session. `null` when the socket is not connected. #### `connected: boolean` Whether the socket is currently connected to the server. #### `disposed: boolean` Whether the client is disposed. #### `recovered: boolean` Whether the connection state was recovered after a temporary disconnection. #### `autoReconnectable: boolean` Whether the Socket will try to reconnect when its Manager connects or reconnects. ### Methods: #### `emit`: ```ts emit<Ev extends EventNames<EmitEvents>>( channel: Ev, ...args: EventParams<EmitEvents, Ev> ): void; ``` Emits an event to the socket identified by the channel name. ##### Parameters: - `channel`: The name of the channel to emit the event to. - `args`: The arguments to pass with the event. #### `subscribe`: ```ts subscribe<Ev extends EventNames<ListenEvents>>( channel: Ev, cb: ListenEvents[Ev], options?: { onSubscriptionComplete?: (channel: string) => void; signal?: AbortSignal; }, ): void; ``` Subscribes to a specified channel with a callback function. Ensures that only one listener exists per channel. ##### Parameters: - `channel`: The name of the channel to subscribe to. - `cb`: The callback function to invoke when a message is received on the channel. - `options`: Optional parameters. - `onSubscriptionComplete`: The callback function to invoke when the subscription is complete. - `signal`: The `AbortSignal` to unsubscribe the listener upon abortion. #### `unsubscribe`: ```ts unsubscribe<Ev extends EventNames<ListenEvents>>( channel: Ev, cb?: ListenEvents[Ev], ): void; ``` Removes the listener for the specified channel. If no callback is provided, it removes all listeners for that channel. ##### Parameters: - `channel`: The name of the channel whose listener should be deleted. - `cb` (optional): The subscriber callback function to remove. #### `connect`: ```ts connect(): void; ``` Manually connects/reconnects the socket. #### `disconnect`: ```ts disconnect(): void; ``` Manually disconnects the socket. In that case, the socket will not try to reconnect. If this is the last active Socket instance of the Manager, the low-level connection will be closed. #### `dispose`: ```ts dispose(): void; ``` Disposes of the socket, manager, and engine, ensuring all connections are closed and cleaned up. ## `ClientSocketManagerStub` The package also exports a stubbed version of the socket manager for use in **testing** or **server-side rendering (SSR)** environments: ```ts import { ClientSocketManagerStub } from '@tapsioss/client-socket-manager'; const stub = new ClientSocketManagerStub("mock://url", { eventHandlers: { onSocketConnection() { console.log("Simulated connection"); }, }, }); stub.connect(); // Triggers onSocketConnection stub.emit("message", "noop"); // No-op stub.dispose(); // Marks the client as disposed ``` ### Why use the stub? - Prevents actual network communication in unit tests and SSR. - Mimics the API surface of the real `ClientSocketManager`. - Triggers configured event handlers like `onSocketConnection` and `onSocketDisconnection`. ### Stub Behavior Summary - Methods like `emit`, `subscribe`, and `unsubscribe` are no-ops. - `connect()` and `disconnect()` simulate connection lifecycle events. - The `connected`, `disposed`, `id`, and other properties behave consistently with a mock socket. ## License This project is licensed under the terms of the [MIT license](https://github.com/Tap30/client-socket-manager/blob/main/packages/core/LICENSE).