@igoforth/ws-rpc 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +446 -0
- package/dist/adapters/client.d.ts +117 -0
- package/dist/adapters/client.js +241 -0
- package/dist/adapters/cloudflare-do.d.ts +72 -0
- package/dist/adapters/cloudflare-do.js +192 -0
- package/dist/adapters/index.d.ts +13 -0
- package/dist/adapters/index.js +16 -0
- package/dist/adapters/server.d.ts +10 -0
- package/dist/adapters/server.js +122 -0
- package/dist/adapters/types.d.ts +125 -0
- package/dist/adapters/types.js +3 -0
- package/dist/codecs/cbor.d.ts +16 -0
- package/dist/codecs/cbor.js +36 -0
- package/dist/codecs/factory.d.ts +3 -0
- package/dist/codecs/factory.js +3 -0
- package/dist/codecs/index.d.ts +5 -0
- package/dist/codecs/index.js +5 -0
- package/dist/codecs/json.d.ts +4 -0
- package/dist/codecs/json.js +4 -0
- package/dist/codecs/msgpack.d.ts +16 -0
- package/dist/codecs/msgpack.js +34 -0
- package/dist/codecs-BmYG2d_U.js +0 -0
- package/dist/default-BkrMd28n.js +253 -0
- package/dist/default-xDNNMrg0.d.ts +129 -0
- package/dist/durable-MZjkvyS6.js +165 -0
- package/dist/errors-5BfreE63.js +96 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.js +7 -0
- package/dist/factory-3ziwTuZe.js +132 -0
- package/dist/factory-C1v0AEHY.d.ts +101 -0
- package/dist/index-Be7jjS77.d.ts +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +14 -0
- package/dist/interface-C4S-WCqW.d.ts +120 -0
- package/dist/json-54Z2bIIs.d.ts +22 -0
- package/dist/json-Bshec-bZ.js +41 -0
- package/dist/memory-Bqb3KEVr.js +48 -0
- package/dist/memory-D1nGjzzH.d.ts +41 -0
- package/dist/multi-peer-BAi9yVzp.js +242 -0
- package/dist/peers/default.d.ts +8 -0
- package/dist/peers/default.js +8 -0
- package/dist/peers/durable.d.ts +136 -0
- package/dist/peers/durable.js +9 -0
- package/dist/peers/index.d.ts +10 -0
- package/dist/peers/index.js +9 -0
- package/dist/protocol-DA84zrc2.d.ts +211 -0
- package/dist/protocol-_mpoOPp6.js +192 -0
- package/dist/protocol.d.ts +6 -0
- package/dist/protocol.js +6 -0
- package/dist/reconnect-CGAA_1Gf.js +26 -0
- package/dist/reconnect-DbcN0R_1.d.ts +35 -0
- package/dist/schema-CN5HHHku.d.ts +108 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.js +43 -0
- package/dist/server-zTjpJpoX.d.ts +209 -0
- package/dist/sql-CCjc6Bid.js +142 -0
- package/dist/sql-DPmHOeZy.d.ts +131 -0
- package/dist/storage/index.d.ts +8 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/interface.d.ts +3 -0
- package/dist/storage/interface.js +0 -0
- package/dist/storage/memory.d.ts +7 -0
- package/dist/storage/memory.js +6 -0
- package/dist/storage/sql.d.ts +7 -0
- package/dist/storage/sql.js +6 -0
- package/dist/types-Be-qmQu0.d.ts +111 -0
- package/dist/types-D_psiH09.js +13 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +3 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/reconnect.d.ts +2 -0
- package/dist/utils/reconnect.js +3 -0
- package/package.json +156 -0
- package/src/adapters/client.ts +396 -0
- package/src/adapters/cloudflare-do.ts +346 -0
- package/src/adapters/index.ts +16 -0
- package/src/adapters/multi-peer.ts +404 -0
- package/src/adapters/server.ts +192 -0
- package/src/adapters/types.ts +202 -0
- package/src/codecs/cbor.ts +42 -0
- package/src/codecs/factory.ts +210 -0
- package/src/codecs/index.ts +30 -0
- package/src/codecs/json.ts +42 -0
- package/src/codecs/msgpack.ts +36 -0
- package/src/errors.ts +105 -0
- package/src/index.ts +102 -0
- package/src/peers/default.ts +433 -0
- package/src/peers/durable.ts +280 -0
- package/src/peers/index.ts +13 -0
- package/src/protocol.ts +306 -0
- package/src/schema.ts +167 -0
- package/src/storage/index.ts +20 -0
- package/src/storage/interface.ts +146 -0
- package/src/storage/memory.ts +84 -0
- package/src/storage/sql.ts +266 -0
- package/src/types.ts +158 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/reconnect.ts +51 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core RPC Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Shared interfaces for RPC options, method handling, event control,
|
|
5
|
+
* and platform-agnostic WebSocket abstractions.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { WireInput } from "./protocol";
|
|
9
|
+
import type { EventEmitter, EventHandler, Provider, RpcSchema } from "./schema";
|
|
10
|
+
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// WebSocket Interfaces (Platform-Agnostic)
|
|
13
|
+
// =============================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* WebSocket ready state constants type
|
|
17
|
+
*/
|
|
18
|
+
export interface WebSocketReadyState {
|
|
19
|
+
CONNECTING: 0;
|
|
20
|
+
OPEN: 1;
|
|
21
|
+
CLOSING: 2;
|
|
22
|
+
CLOSED: 3;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* WebSocket ready states
|
|
27
|
+
*/
|
|
28
|
+
export const WebSocketReadyState: WebSocketReadyState = {
|
|
29
|
+
CONNECTING: 0,
|
|
30
|
+
OPEN: 1,
|
|
31
|
+
CLOSING: 2,
|
|
32
|
+
CLOSED: 3,
|
|
33
|
+
} as const;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Minimal WebSocket interface for sending and receiving
|
|
37
|
+
*/
|
|
38
|
+
export interface IMinWebSocket {
|
|
39
|
+
send(data: string | ArrayBuffer | Uint8Array): void;
|
|
40
|
+
close(code?: number, reason?: string): void;
|
|
41
|
+
readonly readyState: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Extended WebSocket interface with events
|
|
46
|
+
*/
|
|
47
|
+
export interface IWebSocket extends IMinWebSocket {
|
|
48
|
+
send(data: string | ArrayBuffer): void;
|
|
49
|
+
addEventListener?(
|
|
50
|
+
type: "open" | "close" | "message" | "error",
|
|
51
|
+
listener: (event: unknown) => void,
|
|
52
|
+
): void;
|
|
53
|
+
removeEventListener?(
|
|
54
|
+
type: "open" | "close" | "message" | "error",
|
|
55
|
+
listener: (event: unknown) => void,
|
|
56
|
+
): void;
|
|
57
|
+
onopen?: ((event: unknown) => void) | null;
|
|
58
|
+
onclose?: ((event: unknown) => void) | null;
|
|
59
|
+
onmessage?: ((event: unknown) => void) | null;
|
|
60
|
+
onerror?: ((event: unknown) => void) | null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* WebSocket constructor options (Bun-compatible)
|
|
65
|
+
*/
|
|
66
|
+
export interface WebSocketOptions {
|
|
67
|
+
protocols?: string | string[];
|
|
68
|
+
headers?: Record<string, string>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Minimal WebSocket server interface
|
|
73
|
+
*/
|
|
74
|
+
export interface IWebSocketServer {
|
|
75
|
+
on(event: "connection", listener: (ws: IWebSocket) => void): this;
|
|
76
|
+
on(event: "close", listener: () => void): this;
|
|
77
|
+
on(event: "error", listener: (error: Error) => void): this;
|
|
78
|
+
close(callback?: (err?: Error) => void): void;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* WebSocket server constructor options
|
|
83
|
+
*/
|
|
84
|
+
export interface WebSocketServerOptions {
|
|
85
|
+
port?: number;
|
|
86
|
+
host?: string;
|
|
87
|
+
path?: string;
|
|
88
|
+
server?: unknown;
|
|
89
|
+
noServer?: boolean;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// RPC Core Interfaces
|
|
94
|
+
// =============================================================================
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Base RPC Options used across Peers and Adapters
|
|
98
|
+
*/
|
|
99
|
+
export interface IRpcOptions<
|
|
100
|
+
TLocalSchema extends RpcSchema,
|
|
101
|
+
TRemoteSchema extends RpcSchema,
|
|
102
|
+
> {
|
|
103
|
+
/** Schema defining local methods we implement */
|
|
104
|
+
readonly localSchema: TLocalSchema;
|
|
105
|
+
/** Schema defining remote methods we can call */
|
|
106
|
+
readonly remoteSchema: TRemoteSchema;
|
|
107
|
+
/** Default timeout for RPC calls in ms */
|
|
108
|
+
readonly timeout?: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Interface for types that provide RPC method implementations
|
|
113
|
+
*
|
|
114
|
+
* @typeParam TLocalSchema - Schema defining local methods
|
|
115
|
+
*/
|
|
116
|
+
export interface IMethodController<TLocalSchema extends RpcSchema> {
|
|
117
|
+
/** Implementation of local methods */
|
|
118
|
+
readonly provider: Provider<TLocalSchema>;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Interface for types that can emit and receive events
|
|
123
|
+
*
|
|
124
|
+
* @typeParam TLocalSchema - Schema defining local events we can emit
|
|
125
|
+
* @typeParam TRemoteSchema - Schema defining remote events we receive
|
|
126
|
+
* @typeParam EmitArgs - Additional arguments for emit (e.g., peer IDs)
|
|
127
|
+
* @typeParam EventArgs - Additional arguments for event handler
|
|
128
|
+
*/
|
|
129
|
+
export interface IEventController<
|
|
130
|
+
TLocalSchema extends RpcSchema,
|
|
131
|
+
TRemoteSchema extends RpcSchema,
|
|
132
|
+
EmitArgs extends any[] = [],
|
|
133
|
+
EventArgs extends any[] = [],
|
|
134
|
+
> {
|
|
135
|
+
/** Emit an event to the connected peer */
|
|
136
|
+
emit: EventEmitter<TLocalSchema, EmitArgs>;
|
|
137
|
+
|
|
138
|
+
/** Called when receiving an event from the connected peer */
|
|
139
|
+
onEvent?: EventHandler<TRemoteSchema, EventArgs>;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Base interface for RPC connections (1-1)
|
|
144
|
+
*
|
|
145
|
+
* Implemented by RpcPeer.
|
|
146
|
+
*/
|
|
147
|
+
export interface IRpcConnection<
|
|
148
|
+
TLocalSchema extends RpcSchema,
|
|
149
|
+
TRemoteSchema extends RpcSchema,
|
|
150
|
+
> extends IRpcOptions<TLocalSchema, TRemoteSchema>,
|
|
151
|
+
IMethodController<TLocalSchema>,
|
|
152
|
+
IEventController<TLocalSchema, TRemoteSchema> {
|
|
153
|
+
/** Timeout for RPC calls in ms */
|
|
154
|
+
readonly timeout: number;
|
|
155
|
+
|
|
156
|
+
/** Handle an incoming WebSocket message */
|
|
157
|
+
handleMessage(data: WireInput): void;
|
|
158
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reconnection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Exponential backoff with jitter for client-side reconnection.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Options for client-side reconnection
|
|
9
|
+
*/
|
|
10
|
+
export interface ReconnectOptions {
|
|
11
|
+
/** Initial delay before first reconnect attempt (ms) */
|
|
12
|
+
initialDelay?: number;
|
|
13
|
+
/** Maximum delay between reconnect attempts (ms) */
|
|
14
|
+
maxDelay?: number;
|
|
15
|
+
/** Multiplier for exponential backoff */
|
|
16
|
+
backoffMultiplier?: number;
|
|
17
|
+
/** Maximum number of reconnect attempts (0 = unlimited) */
|
|
18
|
+
maxAttempts?: number;
|
|
19
|
+
/** Jitter factor (0-1) to randomize delays */
|
|
20
|
+
jitter?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Default reconnection options
|
|
25
|
+
*/
|
|
26
|
+
export const defaultReconnectOptions: Required<ReconnectOptions> = {
|
|
27
|
+
initialDelay: 1000,
|
|
28
|
+
maxDelay: 30000,
|
|
29
|
+
backoffMultiplier: 2,
|
|
30
|
+
maxAttempts: 0,
|
|
31
|
+
jitter: 0.1,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Calculate delay for reconnection attempt with exponential backoff
|
|
36
|
+
*
|
|
37
|
+
* @param attempt - Reconnection attempt number (0-indexed)
|
|
38
|
+
* @param options - Reconnection options including backoff multiplier and max delay
|
|
39
|
+
* @returns Delay in milliseconds before the next reconnection attempt
|
|
40
|
+
*/
|
|
41
|
+
export function calculateReconnectDelay(
|
|
42
|
+
attempt: number,
|
|
43
|
+
options: Required<ReconnectOptions>,
|
|
44
|
+
): number {
|
|
45
|
+
const baseDelay = Math.min(
|
|
46
|
+
options.initialDelay * Math.pow(options.backoffMultiplier, attempt),
|
|
47
|
+
options.maxDelay,
|
|
48
|
+
);
|
|
49
|
+
const jitter = baseDelay * options.jitter * (Math.random() * 2 - 1);
|
|
50
|
+
return Math.max(0, baseDelay + jitter);
|
|
51
|
+
}
|