@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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +446 -0
  3. package/dist/adapters/client.d.ts +117 -0
  4. package/dist/adapters/client.js +241 -0
  5. package/dist/adapters/cloudflare-do.d.ts +72 -0
  6. package/dist/adapters/cloudflare-do.js +192 -0
  7. package/dist/adapters/index.d.ts +13 -0
  8. package/dist/adapters/index.js +16 -0
  9. package/dist/adapters/server.d.ts +10 -0
  10. package/dist/adapters/server.js +122 -0
  11. package/dist/adapters/types.d.ts +125 -0
  12. package/dist/adapters/types.js +3 -0
  13. package/dist/codecs/cbor.d.ts +16 -0
  14. package/dist/codecs/cbor.js +36 -0
  15. package/dist/codecs/factory.d.ts +3 -0
  16. package/dist/codecs/factory.js +3 -0
  17. package/dist/codecs/index.d.ts +5 -0
  18. package/dist/codecs/index.js +5 -0
  19. package/dist/codecs/json.d.ts +4 -0
  20. package/dist/codecs/json.js +4 -0
  21. package/dist/codecs/msgpack.d.ts +16 -0
  22. package/dist/codecs/msgpack.js +34 -0
  23. package/dist/codecs-BmYG2d_U.js +0 -0
  24. package/dist/default-BkrMd28n.js +253 -0
  25. package/dist/default-xDNNMrg0.d.ts +129 -0
  26. package/dist/durable-MZjkvyS6.js +165 -0
  27. package/dist/errors-5BfreE63.js +96 -0
  28. package/dist/errors.d.ts +69 -0
  29. package/dist/errors.js +7 -0
  30. package/dist/factory-3ziwTuZe.js +132 -0
  31. package/dist/factory-C1v0AEHY.d.ts +101 -0
  32. package/dist/index-Be7jjS77.d.ts +1 -0
  33. package/dist/index.d.ts +14 -0
  34. package/dist/index.js +14 -0
  35. package/dist/interface-C4S-WCqW.d.ts +120 -0
  36. package/dist/json-54Z2bIIs.d.ts +22 -0
  37. package/dist/json-Bshec-bZ.js +41 -0
  38. package/dist/memory-Bqb3KEVr.js +48 -0
  39. package/dist/memory-D1nGjzzH.d.ts +41 -0
  40. package/dist/multi-peer-BAi9yVzp.js +242 -0
  41. package/dist/peers/default.d.ts +8 -0
  42. package/dist/peers/default.js +8 -0
  43. package/dist/peers/durable.d.ts +136 -0
  44. package/dist/peers/durable.js +9 -0
  45. package/dist/peers/index.d.ts +10 -0
  46. package/dist/peers/index.js +9 -0
  47. package/dist/protocol-DA84zrc2.d.ts +211 -0
  48. package/dist/protocol-_mpoOPp6.js +192 -0
  49. package/dist/protocol.d.ts +6 -0
  50. package/dist/protocol.js +6 -0
  51. package/dist/reconnect-CGAA_1Gf.js +26 -0
  52. package/dist/reconnect-DbcN0R_1.d.ts +35 -0
  53. package/dist/schema-CN5HHHku.d.ts +108 -0
  54. package/dist/schema.d.ts +2 -0
  55. package/dist/schema.js +43 -0
  56. package/dist/server-zTjpJpoX.d.ts +209 -0
  57. package/dist/sql-CCjc6Bid.js +142 -0
  58. package/dist/sql-DPmHOeZy.d.ts +131 -0
  59. package/dist/storage/index.d.ts +8 -0
  60. package/dist/storage/index.js +7 -0
  61. package/dist/storage/interface.d.ts +3 -0
  62. package/dist/storage/interface.js +0 -0
  63. package/dist/storage/memory.d.ts +7 -0
  64. package/dist/storage/memory.js +6 -0
  65. package/dist/storage/sql.d.ts +7 -0
  66. package/dist/storage/sql.js +6 -0
  67. package/dist/types-Be-qmQu0.d.ts +111 -0
  68. package/dist/types-D_psiH09.js +13 -0
  69. package/dist/types.d.ts +7 -0
  70. package/dist/types.js +3 -0
  71. package/dist/utils/index.d.ts +2 -0
  72. package/dist/utils/index.js +3 -0
  73. package/dist/utils/reconnect.d.ts +2 -0
  74. package/dist/utils/reconnect.js +3 -0
  75. package/package.json +156 -0
  76. package/src/adapters/client.ts +396 -0
  77. package/src/adapters/cloudflare-do.ts +346 -0
  78. package/src/adapters/index.ts +16 -0
  79. package/src/adapters/multi-peer.ts +404 -0
  80. package/src/adapters/server.ts +192 -0
  81. package/src/adapters/types.ts +202 -0
  82. package/src/codecs/cbor.ts +42 -0
  83. package/src/codecs/factory.ts +210 -0
  84. package/src/codecs/index.ts +30 -0
  85. package/src/codecs/json.ts +42 -0
  86. package/src/codecs/msgpack.ts +36 -0
  87. package/src/errors.ts +105 -0
  88. package/src/index.ts +102 -0
  89. package/src/peers/default.ts +433 -0
  90. package/src/peers/durable.ts +280 -0
  91. package/src/peers/index.ts +13 -0
  92. package/src/protocol.ts +306 -0
  93. package/src/schema.ts +167 -0
  94. package/src/storage/index.ts +20 -0
  95. package/src/storage/interface.ts +146 -0
  96. package/src/storage/memory.ts +84 -0
  97. package/src/storage/sql.ts +266 -0
  98. package/src/types.ts +158 -0
  99. package/src/utils/index.ts +9 -0
  100. 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,9 @@
1
+ /**
2
+ * Utility Exports
3
+ */
4
+
5
+ export {
6
+ calculateReconnectDelay,
7
+ defaultReconnectOptions,
8
+ type ReconnectOptions,
9
+ } from "./reconnect.js";
@@ -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
+ }