0.2.15 • Published 1 month ago
@prsm/keepalive-ws v0.2.15
For a TCP-based, node-only solution with a similar API, see duplex.
keepalive-ws
A command server and client for simplified WebSocket communication, with builtin ping and latency messaging.
Built for grove, but works anywhere.
Server
For node.
import { KeepAliveServer, WSContext } from "@prsm/keepalive-ws/server";
const ws = new KeepAliveServer({
// Where to mount this server and listen to messages.
path: "/",
// How often to send ping messages to connected clients.
pingInterval: 30_000,
// Calculate round-trip time and send latency updates
// to clients every 5s.
latencyInterval: 5_000,
});
ws.registerCommand(
"authenticate",
async (c: WSContext) => {
// use c.payload to authenticate c.connection
return { ok: true, token: "..." };
},
);
ws.registerCommand(
"throws",
async (c: WSContext) => {
throw new Error("oops");
},
);
Extended API:
Rooms
It can be useful to collect connections into rooms.
addToRoom(roomName: string, connection: Connection): void
removeFromRoom(roomName: string, connection: Connection): void
getRoom(roomName: string): Connection[]
clearRoom(roomName: string): void
Command middleware
- Broadcasting to:
- all
broadcast(command: string, payload: any, connections?: Connection[]): void
- all connections that share the same IP
broadcastRemoteAddress(c: Connection, command: string, payload: any): void
- rooms
broadcastRoom(roomName: string, command: string, payload: any): void
- all
Client
For the browser.
import { KeepAliveClient } from "@prsm/keepalive-ws/client";
const opts = {
// After 30s (+ maxLatency) of no ping, assume we've disconnected and attempt a
// reconnection if shouldReconnect is true.
// This number should be coordinated with the pingInterval from KeepAliveServer.
pingTimeout: 30_000,
// Try to reconnect whenever we are disconnected.
shouldReconnect: true,
// This number, added to pingTimeout, is the maximum amount of time
// that can pass before the connection is considered closed.
// In this case, 32s.
maxLatency: 2_000,
// How often to try and connect during reconnection phase.
reconnectInterval: 2_000,
// How many times to try and reconnect before giving up.
maxReconnectAttempts: Infinity,
};
const ws = new KeepAliveClient("ws://localhost:8080", opts);
const { ok, token } = await ws.command("authenticate", {
username: "user",
password: "pass",
});
const result = await ws.command("throws", {});
// result is: { error: "oops" }
ws.on("latency", (e: CustomEvent<{ latency: number }>) => {
// e.detail.latency is round-trip time in ms
});
0.2.15
1 month ago
0.2.14
2 months ago
0.2.13
5 months ago
0.2.12
10 months ago
0.2.11
10 months ago
0.2.10
10 months ago
0.2.7
10 months ago
0.2.6
10 months ago
0.2.8
10 months ago
0.2.5
10 months ago
0.2.4
10 months ago
0.2.3
11 months ago
0.2.2
11 months ago
0.2.1
1 year ago
0.2.0
1 year ago
0.1.9
1 year ago
0.1.8
1 year ago
0.1.7
1 year ago
0.1.6
1 year ago
0.1.5
1 year ago
0.1.4
1 year ago
0.1.3
1 year ago
0.1.2
1 year ago
0.1.1
1 year ago
0.1.0
1 year ago