@relaymessenger/sdk 0.2.0 → 0.3.0-staging.1

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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +201 -0
  3. package/NOTICE +6 -0
  4. package/README.md +189 -17
  5. package/dist/client.d.ts +135 -57
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +520 -144
  8. package/dist/client.js.map +1 -1
  9. package/dist/errors.d.ts +26 -19
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +28 -37
  12. package/dist/errors.js.map +1 -1
  13. package/dist/index.d.ts +9 -9
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -8
  16. package/dist/index.js.map +1 -1
  17. package/dist/operations.d.ts +144 -0
  18. package/dist/operations.d.ts.map +1 -0
  19. package/dist/operations.js +190 -0
  20. package/dist/operations.js.map +1 -0
  21. package/dist/pagination.d.ts +24 -0
  22. package/dist/pagination.d.ts.map +1 -0
  23. package/dist/pagination.js +48 -0
  24. package/dist/pagination.js.map +1 -0
  25. package/dist/types.d.ts +436 -74
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +0 -1
  28. package/dist/types.js.map +1 -1
  29. package/dist/webhooks.d.ts +19 -0
  30. package/dist/webhooks.d.ts.map +1 -0
  31. package/dist/webhooks.js +36 -0
  32. package/dist/webhooks.js.map +1 -0
  33. package/dist/websocket.d.ts +38 -0
  34. package/dist/websocket.d.ts.map +1 -0
  35. package/dist/websocket.js +547 -0
  36. package/dist/websocket.js.map +1 -0
  37. package/package.json +22 -15
  38. package/dist/file-cursor.d.ts +0 -10
  39. package/dist/file-cursor.js +0 -53
  40. package/dist/file-cursor.js.map +0 -1
  41. package/dist/idempotency.d.ts +0 -8
  42. package/dist/idempotency.js +0 -35
  43. package/dist/idempotency.js.map +0 -1
  44. package/dist/memory-dedupe.d.ts +0 -13
  45. package/dist/memory-dedupe.js +0 -25
  46. package/dist/memory-dedupe.js.map +0 -1
  47. package/dist/poll-loop.d.ts +0 -43
  48. package/dist/poll-loop.js +0 -164
  49. package/dist/poll-loop.js.map +0 -1
  50. package/dist/signature.d.ts +0 -18
  51. package/dist/signature.js +0 -61
  52. package/dist/signature.js.map +0 -1
  53. package/dist/url.d.ts +0 -6
  54. package/dist/url.js +0 -40
  55. package/dist/url.js.map +0 -1
@@ -0,0 +1,38 @@
1
+ import type { RelayWebhookEvent, WebSocketFullSyncFrame } from "./types.js";
2
+ export interface WebSocketEventContext {
3
+ sequence: string;
4
+ }
5
+ export interface WebSocketFullSyncContext {
6
+ throughSequence: string;
7
+ reason: WebSocketFullSyncFrame["reason"];
8
+ }
9
+ export interface WebSocketLike {
10
+ addEventListener(type: "message" | "close" | "error", listener: (event: any) => void): void;
11
+ removeEventListener(type: "message" | "close" | "error", listener: (event: any) => void): void;
12
+ send(data: string): void;
13
+ close(code?: number, reason?: string): void;
14
+ ping?(): void;
15
+ on?(type: string, listener: (...args: any[]) => void): unknown;
16
+ off?(type: string, listener: (...args: any[]) => void): unknown;
17
+ }
18
+ export interface WebSocketConstructor {
19
+ new (url: string, options?: {
20
+ headers?: Record<string, string>;
21
+ }): WebSocketLike;
22
+ }
23
+ export interface WebSocketRunOptions {
24
+ signal?: AbortSignal;
25
+ WebSocket?: WebSocketConstructor;
26
+ minReconnectDelayMs?: number;
27
+ maxReconnectDelayMs?: number;
28
+ random?: () => number;
29
+ onEvent(event: RelayWebhookEvent, context: WebSocketEventContext): Promise<void>;
30
+ /**
31
+ * Replace local state with a complete REST snapshot through this sequence.
32
+ * Resolve only after that snapshot is durably committed.
33
+ */
34
+ onFullSync(context: WebSocketFullSyncContext): Promise<void>;
35
+ onError?(error: unknown): void;
36
+ }
37
+ export declare const runWebSocket: (baseURL: string, agentToken: string, options: WebSocketRunOptions) => Promise<void>;
38
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAIjB,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CACd,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC7B,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC7B,IAAI,CAAC;IACR,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC;IACd,EAAE,CAAC,CACD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GACjC,OAAO,CAAC;IACX,GAAG,CAAC,CACF,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GACjC,OAAO,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,KACE,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC7C,aAAa,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,CACL,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC;AAwoBD,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,SAAS,mBAAmB,KAC3B,OAAO,CAAC,IAAI,CAkDd,CAAC"}
@@ -0,0 +1,547 @@
1
+ import NodeWebSocket from "ws";
2
+ import { RelayWebhookConfiguredError } from "./errors.js";
3
+ import { RELAY_WEBHOOK_EVENT_TYPES } from "./operations.js";
4
+ const wait = (milliseconds, signal) => new Promise((resolve) => {
5
+ if (signal?.aborted) {
6
+ resolve();
7
+ return;
8
+ }
9
+ const onAbort = () => {
10
+ clearTimeout(timer);
11
+ signal?.removeEventListener("abort", onAbort);
12
+ resolve();
13
+ };
14
+ const timer = setTimeout(() => {
15
+ signal?.removeEventListener("abort", onAbort);
16
+ resolve();
17
+ }, milliseconds);
18
+ signal?.addEventListener("abort", onAbort, { once: true });
19
+ });
20
+ const text = async (value) => {
21
+ if (typeof value === "string")
22
+ return value;
23
+ if (value instanceof ArrayBuffer) {
24
+ return new TextDecoder().decode(value);
25
+ }
26
+ if (ArrayBuffer.isView(value)) {
27
+ return new TextDecoder().decode(value);
28
+ }
29
+ if (typeof Blob !== "undefined" && value instanceof Blob) {
30
+ return value.text();
31
+ }
32
+ throw new Error("Relay WebSocket received a non-text frame.");
33
+ };
34
+ const validSequence = (value) => typeof value === "string" && /^(0|[1-9][0-9]*)$/.test(value);
35
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
36
+ const hasExactKeys = (value, keys) => {
37
+ const actual = Object.keys(value).sort();
38
+ const expected = [...keys].sort();
39
+ return actual.length === expected.length
40
+ && actual.every((key, index) => key === expected[index]);
41
+ };
42
+ const validUUID = (value) => typeof value === "string"
43
+ && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
44
+ .test(value);
45
+ const WEBHOOK_EVENT_TYPES = new Set(RELAY_WEBHOOK_EVENT_TYPES);
46
+ const WEBSOCKET_ERROR_CODES = new Set([
47
+ "invalid_frame",
48
+ "ack_out_of_range",
49
+ "stale_connection",
50
+ "ack_failed",
51
+ "delivery_failed",
52
+ "full_sync_required",
53
+ "full_sync_mismatch",
54
+ ]);
55
+ const HEARTBEAT_PING_INTERVAL_MS = 30_000;
56
+ const HEARTBEAT_PONG_TIMEOUT_MS = 60_000;
57
+ const CLIENT_CLOSE_DURABLE_ACCEPTANCE = 4001;
58
+ const CLIENT_CLOSE_PROTOCOL_ERROR = 4002;
59
+ const CLIENT_CLOSE_RECONNECT = 4003;
60
+ class WebSocketProtocolError extends Error {
61
+ closeCode = CLIENT_CLOSE_PROTOCOL_ERROR;
62
+ stop = true;
63
+ }
64
+ const parseReady = (value) => {
65
+ if (!isRecord(value)
66
+ || !hasExactKeys(value, [
67
+ "type",
68
+ "connection_id",
69
+ "acked_through",
70
+ "full_sync_required",
71
+ "full_sync_through",
72
+ "heartbeat_interval_ms",
73
+ "max_in_flight",
74
+ ])
75
+ || value.type !== "ready"
76
+ || !validUUID(value.connection_id)
77
+ || !validSequence(value.acked_through)
78
+ || typeof value.full_sync_required !== "boolean"
79
+ || (value.full_sync_required
80
+ ? !validSequence(value.full_sync_through)
81
+ : value.full_sync_through !== null)
82
+ || !Number.isInteger(value.heartbeat_interval_ms)
83
+ || value.heartbeat_interval_ms < 1
84
+ || !Number.isInteger(value.max_in_flight)
85
+ || value.max_in_flight < 1) {
86
+ throw new WebSocketProtocolError("Relay WebSocket received an invalid ready frame.");
87
+ }
88
+ return value;
89
+ };
90
+ const parseEvent = (value) => {
91
+ if (!isRecord(value)
92
+ || !hasExactKeys(value, ["type", "sequence", "event"])
93
+ || value.type !== "event"
94
+ || !validSequence(value.sequence)
95
+ || !isRecord(value.event)
96
+ || value.event.api_version !== "v1"
97
+ || typeof value.event.webhook_version !== "string"
98
+ || !WEBHOOK_EVENT_TYPES.has(String(value.event.event_type))
99
+ || !validUUID(value.event.event_id)
100
+ || typeof value.event.created_at !== "string"
101
+ || typeof value.event.trace_id !== "string"
102
+ || !validUUID(value.event.agent_id)
103
+ || !isRecord(value.event.data)) {
104
+ throw new WebSocketProtocolError("Relay WebSocket received an invalid event frame.");
105
+ }
106
+ return value;
107
+ };
108
+ const parseFullSync = (value) => {
109
+ if (!isRecord(value)
110
+ || !hasExactKeys(value, ["type", "through_sequence", "reason"])
111
+ || value.type !== "full_sync"
112
+ || !validSequence(value.through_sequence)
113
+ || value.reason !== "checkpoint_outside_retention") {
114
+ throw new WebSocketProtocolError("Relay WebSocket received an invalid FULL sync frame.");
115
+ }
116
+ return value;
117
+ };
118
+ const parsePing = (value) => {
119
+ if (!isRecord(value)
120
+ || !hasExactKeys(value, ["type", "sent_at"])
121
+ || value.type !== "ping"
122
+ || typeof value.sent_at !== "string"
123
+ || Number.isNaN(Date.parse(value.sent_at))) {
124
+ throw new WebSocketProtocolError("Relay WebSocket received an invalid ping frame.");
125
+ }
126
+ return value;
127
+ };
128
+ const parseError = (value) => {
129
+ if (!isRecord(value)
130
+ || !hasExactKeys(value, [
131
+ "type",
132
+ "code",
133
+ "message",
134
+ "fatal",
135
+ "retryable",
136
+ ])
137
+ || value.type !== "error"
138
+ || typeof value.code !== "string"
139
+ || !WEBSOCKET_ERROR_CODES.has(value.code)
140
+ || typeof value.message !== "string"
141
+ || typeof value.fatal !== "boolean"
142
+ || typeof value.retryable !== "boolean") {
143
+ throw new WebSocketProtocolError("Relay WebSocket received an invalid error frame.");
144
+ }
145
+ return value;
146
+ };
147
+ const parseDisconnect = (value) => {
148
+ if (!isRecord(value)
149
+ || !hasExactKeys(value, ["type", "reason"])
150
+ || value.type !== "disconnect"
151
+ || ![
152
+ "revoked",
153
+ "heartbeat_timeout",
154
+ "restart",
155
+ "webhook_configured",
156
+ ].includes(String(value.reason))) {
157
+ throw new WebSocketProtocolError("Relay WebSocket received an invalid disconnect frame.");
158
+ }
159
+ return value;
160
+ };
161
+ class WebSocketStoppedError extends Error {
162
+ closeCode;
163
+ stop = true;
164
+ constructor(message, closeCode = 1000) {
165
+ super(message);
166
+ this.closeCode = closeCode;
167
+ }
168
+ }
169
+ class DurableApplicationError extends Error {
170
+ closeCode = CLIENT_CLOSE_DURABLE_ACCEPTANCE;
171
+ constructor(operation, cause) {
172
+ super(`Relay WebSocket durable ${operation} application failed: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
173
+ }
174
+ }
175
+ class RetryableWebSocketError extends Error {
176
+ closeCode;
177
+ constructor(message, closeCode = CLIENT_CLOSE_RECONNECT) {
178
+ super(message);
179
+ this.closeCode = closeCode;
180
+ }
181
+ }
182
+ const upgradeResponseBody = (status, statusMessage, textBody) => {
183
+ let body = textBody;
184
+ let message;
185
+ let traceId;
186
+ try {
187
+ const parsed = textBody ? JSON.parse(textBody) : undefined;
188
+ body = parsed;
189
+ if (isRecord(parsed)) {
190
+ if (typeof parsed.trace_id === "string")
191
+ traceId = parsed.trace_id;
192
+ if (isRecord(parsed.error)
193
+ && typeof parsed.error.message === "string") {
194
+ message = parsed.error.message;
195
+ }
196
+ }
197
+ }
198
+ catch {
199
+ // Keep the unparsed response body for diagnostics.
200
+ }
201
+ if (status === 409) {
202
+ return new RelayWebhookConfiguredError(message
203
+ ?? "This Agent delivers by webhook; delete its webhook subscription to use the WebSocket.", {
204
+ ...(traceId === undefined ? {} : { traceId }),
205
+ body,
206
+ });
207
+ }
208
+ const fallback = status > 0
209
+ ? `Relay WebSocket upgrade failed with HTTP ${status}${statusMessage ? ` ${statusMessage}` : ""}.`
210
+ : "Relay WebSocket upgrade failed before receiving an HTTP status.";
211
+ const errorMessage = message ?? fallback;
212
+ return status === 429 || status >= 500 || status === 0
213
+ ? new RetryableWebSocketError(errorMessage)
214
+ : new WebSocketStoppedError(errorMessage);
215
+ };
216
+ const deriveWebSocketURL = (baseURL) => {
217
+ let url;
218
+ try {
219
+ url = new URL(baseURL);
220
+ }
221
+ catch {
222
+ throw new TypeError("Relay baseURL must be an absolute HTTP(S) URL.");
223
+ }
224
+ if ((url.protocol !== "http:" && url.protocol !== "https:")
225
+ || url.username !== ""
226
+ || url.password !== "") {
227
+ throw new TypeError("Relay baseURL must be an absolute HTTP(S) URL.");
228
+ }
229
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
230
+ url.pathname = "/v1/websocket";
231
+ url.search = "";
232
+ url.hash = "";
233
+ return url.toString();
234
+ };
235
+ const runConnection = (url, agentToken, options, Constructor, onReady) => new Promise((resolve, reject) => {
236
+ const socket = new Constructor(url, {
237
+ headers: {
238
+ Authorization: `Bearer ${agentToken}`,
239
+ },
240
+ });
241
+ let chain = Promise.resolve();
242
+ let settled = false;
243
+ let ready = false;
244
+ let acceptedThrough;
245
+ let fullSyncThrough;
246
+ let heartbeatTimer;
247
+ let lastPongAt = 0;
248
+ const finish = (error) => {
249
+ if (settled)
250
+ return;
251
+ settled = true;
252
+ if (heartbeatTimer !== undefined)
253
+ clearInterval(heartbeatTimer);
254
+ heartbeatTimer = undefined;
255
+ socket.removeEventListener("message", onMessage);
256
+ socket.removeEventListener("close", onClose);
257
+ socket.removeEventListener("error", onSocketError);
258
+ socket.off?.("pong", onPong);
259
+ socket.off?.("unexpected-response", onUnexpectedResponse);
260
+ options.signal?.removeEventListener("abort", onAbort);
261
+ if (error === undefined)
262
+ resolve();
263
+ else
264
+ reject(error);
265
+ };
266
+ const stopReceiving = () => {
267
+ socket.removeEventListener("message", onMessage);
268
+ };
269
+ const send = (frame) => {
270
+ try {
271
+ socket.send(JSON.stringify(frame));
272
+ }
273
+ catch (cause) {
274
+ throw new RetryableWebSocketError(`Relay WebSocket could not send a client frame: ${cause instanceof Error ? cause.message : String(cause)}`);
275
+ }
276
+ };
277
+ const closeForRetry = (error) => {
278
+ stopReceiving();
279
+ try {
280
+ socket.close(error.closeCode, "Relay requested reconnect");
281
+ }
282
+ finally {
283
+ finish(error);
284
+ }
285
+ };
286
+ const onPong = () => {
287
+ lastPongAt = Date.now();
288
+ };
289
+ const startHeartbeat = () => {
290
+ if (heartbeatTimer !== undefined
291
+ || socket.ping === undefined
292
+ || socket.on === undefined) {
293
+ return;
294
+ }
295
+ lastPongAt = Date.now();
296
+ socket.on("pong", onPong);
297
+ heartbeatTimer = setInterval(() => {
298
+ if (Date.now() - lastPongAt >= HEARTBEAT_PONG_TIMEOUT_MS) {
299
+ closeForRetry(new RetryableWebSocketError("Relay WebSocket did not receive a pong within 60 seconds."));
300
+ return;
301
+ }
302
+ try {
303
+ socket.ping?.();
304
+ }
305
+ catch (cause) {
306
+ closeForRetry(new RetryableWebSocketError(`Relay WebSocket ping failed: ${cause instanceof Error ? cause.message : String(cause)}`));
307
+ }
308
+ }, HEARTBEAT_PING_INTERVAL_MS);
309
+ };
310
+ const onUnexpectedResponse = (_request, response) => {
311
+ const chunks = [];
312
+ let bytes = 0;
313
+ response.setEncoding?.("utf8");
314
+ response.on("data", (chunk) => {
315
+ if (bytes >= 65_536)
316
+ return;
317
+ const value = String(chunk);
318
+ bytes += value.length;
319
+ chunks.push(value.slice(0, Math.max(0, 65_536 - (bytes - value.length))));
320
+ });
321
+ response.on("end", () => {
322
+ finish(upgradeResponseBody(response.statusCode ?? 0, response.statusMessage, chunks.join("")));
323
+ });
324
+ response.on("error", () => {
325
+ finish(upgradeResponseBody(response.statusCode ?? 0, response.statusMessage, chunks.join("")));
326
+ });
327
+ };
328
+ const onMessage = (message) => {
329
+ chain = chain.then(async () => {
330
+ let frame;
331
+ try {
332
+ frame = JSON.parse(await text(message.data));
333
+ }
334
+ catch (cause) {
335
+ throw new WebSocketProtocolError(cause instanceof SyntaxError
336
+ ? "Relay WebSocket received invalid JSON."
337
+ : "Relay WebSocket received a non-text frame.");
338
+ }
339
+ if (isRecord(frame) && frame.type === "ready") {
340
+ if (ready) {
341
+ throw new WebSocketProtocolError("Relay WebSocket received more than one ready frame.");
342
+ }
343
+ const parsed = parseReady(frame);
344
+ ready = true;
345
+ acceptedThrough = BigInt(parsed.acked_through);
346
+ fullSyncThrough = parsed.full_sync_required
347
+ ? BigInt(parsed.full_sync_through)
348
+ : null;
349
+ startHeartbeat();
350
+ onReady();
351
+ return;
352
+ }
353
+ if (isRecord(frame) && frame.type === "disconnect") {
354
+ const parsed = parseDisconnect(frame);
355
+ if (parsed.reason === "heartbeat_timeout"
356
+ || parsed.reason === "restart") {
357
+ throw new RetryableWebSocketError(parsed.reason === "restart"
358
+ ? "Relay WebSocket is restarting."
359
+ : "Relay WebSocket heartbeat timed out.");
360
+ }
361
+ if (parsed.reason === "webhook_configured") {
362
+ throw new RelayWebhookConfiguredError("Webhook delivery is now configured for this Agent.", { code: 4410 });
363
+ }
364
+ throw new WebSocketStoppedError(`Relay WebSocket disconnected permanently: ${parsed.reason}.`, 4401);
365
+ }
366
+ if (isRecord(frame) && frame.type === "ping") {
367
+ if (!ready) {
368
+ throw new WebSocketProtocolError("Relay WebSocket received a ping before the ready frame.");
369
+ }
370
+ parsePing(frame);
371
+ send({ type: "pong" });
372
+ return;
373
+ }
374
+ if (isRecord(frame) && frame.type === "error") {
375
+ const parsed = parseError(frame);
376
+ if (!parsed.retryable) {
377
+ throw new WebSocketStoppedError(parsed.message);
378
+ }
379
+ throw new RetryableWebSocketError(parsed.message);
380
+ }
381
+ if (!ready || acceptedThrough === undefined || fullSyncThrough === undefined) {
382
+ throw new WebSocketProtocolError("Relay WebSocket received a data frame before the ready frame.");
383
+ }
384
+ if (isRecord(frame) && frame.type === "full_sync") {
385
+ const fullSync = parseFullSync(frame);
386
+ if (fullSyncThrough === null
387
+ || BigInt(fullSync.through_sequence) !== fullSyncThrough) {
388
+ throw new WebSocketProtocolError("Relay WebSocket FULL sync did not match the ready checkpoint.");
389
+ }
390
+ try {
391
+ await options.onFullSync({
392
+ throughSequence: fullSync.through_sequence,
393
+ reason: fullSync.reason,
394
+ });
395
+ }
396
+ catch (cause) {
397
+ throw new DurableApplicationError("FULL sync", cause);
398
+ }
399
+ if (options.signal?.aborted)
400
+ return;
401
+ send({
402
+ type: "full_sync_complete",
403
+ through_sequence: fullSync.through_sequence,
404
+ });
405
+ acceptedThrough = fullSyncThrough;
406
+ fullSyncThrough = null;
407
+ return;
408
+ }
409
+ if (fullSyncThrough !== null) {
410
+ throw new WebSocketProtocolError("Relay WebSocket received an event while FULL sync was pending.");
411
+ }
412
+ const event = parseEvent(frame);
413
+ const sequence = BigInt(event.sequence);
414
+ if (sequence > acceptedThrough + 1n) {
415
+ throw new WebSocketProtocolError("Relay WebSocket received a non-contiguous event sequence.");
416
+ }
417
+ try {
418
+ await options.onEvent(event.event, { sequence: event.sequence });
419
+ }
420
+ catch (cause) {
421
+ throw new DurableApplicationError("event", cause);
422
+ }
423
+ if (sequence === acceptedThrough + 1n) {
424
+ acceptedThrough = sequence;
425
+ }
426
+ if (options.signal?.aborted)
427
+ return;
428
+ send({
429
+ type: "ack",
430
+ through_sequence: acceptedThrough.toString(),
431
+ });
432
+ }).catch((error) => {
433
+ stopReceiving();
434
+ socket.close(error instanceof WebSocketStoppedError
435
+ ? error.closeCode
436
+ : error instanceof WebSocketProtocolError
437
+ ? error.closeCode
438
+ : error instanceof RetryableWebSocketError
439
+ ? error.closeCode
440
+ : CLIENT_CLOSE_DURABLE_ACCEPTANCE, error instanceof WebSocketStoppedError
441
+ ? "Relay stopped this consumer"
442
+ : error instanceof WebSocketProtocolError
443
+ ? "protocol error"
444
+ : error instanceof RetryableWebSocketError
445
+ ? "Relay requested reconnect"
446
+ : "durable application failed");
447
+ finish(error);
448
+ });
449
+ };
450
+ const onClose = (event) => {
451
+ stopReceiving();
452
+ void chain.then(() => {
453
+ if (options.signal?.aborted) {
454
+ finish();
455
+ return;
456
+ }
457
+ if (event.code === 4410) {
458
+ finish(new RelayWebhookConfiguredError(event.reason || "Webhook delivery is now configured for this Agent.", {
459
+ code: 4410,
460
+ body: {
461
+ close_code: 4410,
462
+ reason: event.reason ?? "",
463
+ },
464
+ }));
465
+ return;
466
+ }
467
+ if (event.code !== undefined
468
+ && event.code >= 4400
469
+ && event.code <= 4499
470
+ && event.code !== 4408) {
471
+ finish(new WebSocketStoppedError(`Relay WebSocket closed permanently (${event.code}): ${event.reason ?? "server policy changed"}.`, event.code));
472
+ return;
473
+ }
474
+ if (!ready) {
475
+ finish(new Error(`Relay WebSocket closed before ready (${event.code ?? 1006}): ${event.reason ?? "connection ended"}.`));
476
+ return;
477
+ }
478
+ finish();
479
+ }, finish);
480
+ };
481
+ const onSocketError = () => {
482
+ stopReceiving();
483
+ if (options.signal?.aborted) {
484
+ void chain.then(() => finish(), finish);
485
+ return;
486
+ }
487
+ const error = new Error("Relay WebSocket connection failed.");
488
+ void chain.then(() => finish(error), finish);
489
+ };
490
+ const onAbort = () => {
491
+ stopReceiving();
492
+ try {
493
+ socket.close(1000, "aborted");
494
+ }
495
+ catch {
496
+ void chain.then(() => finish(), finish);
497
+ }
498
+ };
499
+ socket.addEventListener("message", onMessage);
500
+ socket.addEventListener("close", onClose);
501
+ socket.addEventListener("error", onSocketError);
502
+ socket.on?.("unexpected-response", onUnexpectedResponse);
503
+ if (options.signal?.aborted)
504
+ onAbort();
505
+ else
506
+ options.signal?.addEventListener("abort", onAbort, { once: true });
507
+ });
508
+ export const runWebSocket = async (baseURL, agentToken, options) => {
509
+ const Constructor = options.WebSocket
510
+ ?? NodeWebSocket;
511
+ const minimum = options.minReconnectDelayMs ?? 500;
512
+ const maximum = options.maxReconnectDelayMs ?? 30_000;
513
+ if (!Number.isFinite(minimum)
514
+ || !Number.isFinite(maximum)
515
+ || minimum < 0
516
+ || maximum < minimum) {
517
+ throw new RangeError("WebSocket reconnect delays must be finite and maxReconnectDelayMs must be at least minReconnectDelayMs.");
518
+ }
519
+ if (!agentToken.trim()) {
520
+ throw new TypeError("A Relay Agent Token is required for WebSocket delivery.");
521
+ }
522
+ const url = deriveWebSocketURL(baseURL);
523
+ const random = options.random ?? Math.random;
524
+ let attempt = 0;
525
+ while (!options.signal?.aborted) {
526
+ try {
527
+ await runConnection(url, agentToken, options, Constructor, () => {
528
+ attempt = 0;
529
+ });
530
+ }
531
+ catch (error) {
532
+ if (options.signal?.aborted)
533
+ return;
534
+ options.onError?.(error);
535
+ if (error instanceof WebSocketStoppedError
536
+ || error instanceof WebSocketProtocolError
537
+ || error instanceof RelayWebhookConfiguredError)
538
+ throw error;
539
+ attempt += 1;
540
+ }
541
+ if (options.signal?.aborted)
542
+ return;
543
+ const ceiling = Math.min(maximum, minimum * 2 ** Math.max(0, attempt - 1));
544
+ await wait(Math.floor(random() * ceiling), options.signal);
545
+ }
546
+ };
547
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"}