@amigo-ai/platform-sdk 0.22.0 → 0.24.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.
@@ -77,6 +77,9 @@ export class ConversationsResource extends WorkspaceScopedResource {
77
77
  const result = await this.client.POST('/v1/{workspace_id}/conversations/{conversation_id}/turns', {
78
78
  params: {
79
79
  path: { workspace_id: this.workspaceId, conversation_id: conversationId },
80
+ ...(options?.includeToolCalls !== undefined && {
81
+ query: { include_tool_calls: options.includeToolCalls },
82
+ }),
80
83
  },
81
84
  body: request,
82
85
  headers: { Accept: 'text/event-stream' },
@@ -88,6 +91,36 @@ export class ConversationsResource extends WorkspaceScopedResource {
88
91
  }
89
92
  return result.data;
90
93
  }
94
+ /**
95
+ * Send a message and receive the agent's response as a typed
96
+ * `TurnStreamEvent` async iterable.
97
+ *
98
+ * The bytes-and-parser dance from `createTurnStream` is now hidden inside
99
+ * the SDK — consumers iterate strongly typed events directly. Each yielded
100
+ * value is a member of the `TurnStreamEvent` discriminated union (`token`,
101
+ * `thinking`, `tool_call_started`, `tool_call_completed`, `message`,
102
+ * `done`, `error`), validated as a record with a known `event`
103
+ * discriminator. Unknown / malformed frames are dropped silently — this
104
+ * matches the wire-format-drift behavior of the lower-level
105
+ * `createTurnStream` while keeping the strict `TurnStreamEvent` static
106
+ * contract intact for consumers.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * for await (const event of client.conversations.streamTurn(convId, { message: "Hello" })) {
111
+ * if (event.event === "token") process.stdout.write(event.text);
112
+ * else if (event.event === "done") break;
113
+ * }
114
+ * ```
115
+ */
116
+ async *streamTurn(conversationId, request, options) {
117
+ const byteStream = await this.createTurnStream(conversationId, request, options);
118
+ for await (const frame of parseSSEFrames(byteStream)) {
119
+ const event = parseTurnStreamFrame(frame.event, frame.data);
120
+ if (event)
121
+ yield event;
122
+ }
123
+ }
91
124
  /** Build the real-time text WebSocket URL for browser or custom clients. */
92
125
  textStreamUrl(params) {
93
126
  const url = buildTextStreamUrl({
@@ -292,4 +325,115 @@ function describeInvalidSubprotocolChars(token) {
292
325
  }
293
326
  return [...chars].map((char) => JSON.stringify(char)).join(', ');
294
327
  }
328
+ async function* parseSSEFrames(stream) {
329
+ const reader = stream.getReader();
330
+ const decoder = new TextDecoder();
331
+ let buffer = '';
332
+ function* drain(text) {
333
+ buffer += text;
334
+ // Frames are terminated by a blank line (\n\n or \r\n\r\n).
335
+ while (true) {
336
+ const idx = findFrameTerminator(buffer);
337
+ if (idx === null)
338
+ break;
339
+ const block = buffer.slice(0, idx.terminatorStart);
340
+ buffer = buffer.slice(idx.terminatorEnd);
341
+ const frame = parseSSEBlock(block);
342
+ if (frame)
343
+ yield frame;
344
+ }
345
+ }
346
+ try {
347
+ while (true) {
348
+ const { done, value } = await reader.read();
349
+ if (done)
350
+ break;
351
+ yield* drain(decoder.decode(value, { stream: true }));
352
+ }
353
+ // Flush any partial decode + handle a final frame missing the trailing
354
+ // blank line (defensive — well-behaved servers always terminate).
355
+ yield* drain(decoder.decode());
356
+ if (buffer.trim().length > 0) {
357
+ const frame = parseSSEBlock(buffer);
358
+ if (frame)
359
+ yield frame;
360
+ buffer = '';
361
+ }
362
+ }
363
+ finally {
364
+ reader.releaseLock();
365
+ }
366
+ }
367
+ function findFrameTerminator(s) {
368
+ // Prefer LF-LF; fall back to CRLF-CRLF if the server is using CRLF
369
+ // line endings end-to-end.
370
+ const lf = s.indexOf('\n\n');
371
+ const crlf = s.indexOf('\r\n\r\n');
372
+ if (lf < 0 && crlf < 0)
373
+ return null;
374
+ if (lf < 0)
375
+ return { terminatorStart: crlf, terminatorEnd: crlf + 4 };
376
+ if (crlf < 0)
377
+ return { terminatorStart: lf, terminatorEnd: lf + 2 };
378
+ return lf < crlf
379
+ ? { terminatorStart: lf, terminatorEnd: lf + 2 }
380
+ : { terminatorStart: crlf, terminatorEnd: crlf + 4 };
381
+ }
382
+ function parseSSEBlock(block) {
383
+ let event = '';
384
+ const dataLines = [];
385
+ for (const line of block.split(/\r?\n/)) {
386
+ if (line === '' || line.startsWith(':'))
387
+ continue;
388
+ const colon = line.indexOf(':');
389
+ const field = colon < 0 ? line : line.slice(0, colon);
390
+ let value = colon < 0 ? '' : line.slice(colon + 1);
391
+ if (value.startsWith(' '))
392
+ value = value.slice(1);
393
+ if (field === 'event')
394
+ event = value;
395
+ else if (field === 'data')
396
+ dataLines.push(value);
397
+ // `id`, `retry`, and unknown fields are ignored — we only need the
398
+ // discriminator + payload for the typed event surface.
399
+ }
400
+ if (!event || dataLines.length === 0)
401
+ return null;
402
+ return { event, data: dataLines.join('\n') };
403
+ }
404
+ // ---------------------------------------------------------------------------
405
+ // TurnStreamEvent frame validator
406
+ //
407
+ // Drift-tolerant: an unknown `event` discriminator or a non-object payload
408
+ // is dropped silently (matches the behavior of the lower-level
409
+ // `createTurnStream` plus consumer-side parsing). The strict
410
+ // `TurnStreamEvent` static contract is preserved for downstream callers
411
+ // because we only yield values whose `event` discriminator is one of the
412
+ // known union members.
413
+ // ---------------------------------------------------------------------------
414
+ const KNOWN_TURN_STREAM_EVENTS = new Set([
415
+ 'token',
416
+ 'thinking',
417
+ 'tool_call_started',
418
+ 'tool_call_completed',
419
+ 'message',
420
+ 'done',
421
+ 'error',
422
+ ]);
423
+ function parseTurnStreamFrame(eventName, dataJson) {
424
+ if (!KNOWN_TURN_STREAM_EVENTS.has(eventName))
425
+ return null;
426
+ let payload;
427
+ try {
428
+ payload = JSON.parse(dataJson);
429
+ }
430
+ catch {
431
+ return null;
432
+ }
433
+ if (typeof payload !== 'object' || payload === null || Array.isArray(payload))
434
+ return null;
435
+ // Server omits the discriminator from the JSON body (it lives in the SSE
436
+ // `event:` line). Reattach it so the union member is well-formed.
437
+ return { ...payload, event: eventName };
438
+ }
295
439
  //# sourceMappingURL=conversations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/resources/conversations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/resources/conversations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,452 @@
1
+ /**
2
+ * Real-time workspace event streaming via Server-Sent Events.
3
+ *
4
+ * Subscribes to ``GET /v1/{workspace_id}/events/stream`` and yields typed
5
+ * {@link WorkspaceSSEEvent} values. The platform-api endpoint:
6
+ *
7
+ * - Streams ``text/event-stream`` over HTTP/1.1
8
+ * - Sends ``retry: 3000`` directive as the first frame
9
+ * - Tags every event with ``id: <millisecond-timestamp>`` for replay
10
+ * - Buffers the last 5 minutes of events in Valkey for gapless reconnect
11
+ * - Pops the discriminator (``event_type``) out of the JSON ``data:``
12
+ * payload and into the SSE ``event:`` line — this helper reattaches
13
+ * it before yielding the typed union member
14
+ *
15
+ * Implementation choice: this helper uses the SDK's own fetch transport
16
+ * (with auth + retry middleware applied) rather than the WHATWG
17
+ * ``EventSource`` API or the ``eventsource`` polyfill. The reasons are:
18
+ *
19
+ * 1. ``EventSource`` cannot send ``Authorization`` headers — the polyfill
20
+ * can, but adds a runtime dep and bypasses the SDK's BFF-proxy /
21
+ * custom-fetch / mock-fetch composition.
22
+ * 2. Reusing the existing ``createTurnStream`` pattern keeps a single
23
+ * SSE parser in the SDK and shares the auth middleware that already
24
+ * attaches the bearer token on every request.
25
+ * 3. The SDK ships with two runtime deps (``openapi-fetch`` +
26
+ * ``openapi-typescript-helpers``); adding ``eventsource`` would inflate
27
+ * bundle size for a feature that fetch streaming handles cleanly.
28
+ *
29
+ * The trade-off is that we reimplement the reconnect loop. The platform-api
30
+ * advertises ``retry: 3000`` and we honor that as the initial backoff,
31
+ * doubling with full jitter on each successive failure up to ``maxDelayMs``.
32
+ *
33
+ * @see ConversationsResource.streamTurn for the analogous turn-stream helper.
34
+ */
35
+ import { WorkspaceScopedResource } from './base.js';
36
+ const DEFAULT_INITIAL_DELAY_MS = 3000;
37
+ const DEFAULT_MAX_DELAY_MS = 30000;
38
+ const DEFAULT_MAX_RECONNECTS = 10;
39
+ // Hard ceiling on a single SSE field value to defend against a misbehaving
40
+ // upstream that streams without ever emitting a frame terminator. 1 MiB is
41
+ // far above any legitimate platform event payload (most are <2 KiB).
42
+ const MAX_FRAME_BYTES = 1_048_576;
43
+ /**
44
+ * Real-time event stream resource.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const handle = client.events.subscribeToWorkspace({
49
+ * onEvent: (event) => {
50
+ * switch (event.event_type) {
51
+ * case 'call.started':
52
+ * console.log('Call started:', event.call_sid)
53
+ * break
54
+ * case 'pipeline.error':
55
+ * console.error('Pipeline error:', event)
56
+ * break
57
+ * }
58
+ * },
59
+ * onError: (err) => console.error('Stream error:', err),
60
+ * onReconnect: (attempt) => console.warn(`Reconnect #${attempt}`),
61
+ * })
62
+ *
63
+ * // Later, to stop:
64
+ * handle.unsubscribe()
65
+ * await handle.done
66
+ * ```
67
+ */
68
+ export class EventsResource extends WorkspaceScopedResource {
69
+ constructor(client, workspaceId) {
70
+ super(client, workspaceId);
71
+ }
72
+ /**
73
+ * Subscribe to the workspace event stream.
74
+ *
75
+ * Establishes an SSE connection to ``/v1/{workspace_id}/events/stream``
76
+ * and invokes ``onEvent`` once per typed {@link WorkspaceSSEEvent}.
77
+ * Unrecoverable failures (auth errors, exhausted reconnect budget,
78
+ * caller abort) surface through ``onError``.
79
+ *
80
+ * Reconnection is automatic: on a network drop or 5xx, the helper
81
+ * backs off (initial delay derived from the ``retry:`` directive,
82
+ * default 3s, doubling with full jitter up to ``maxDelayMs``) and
83
+ * resumes with the most recently seen ``Last-Event-ID``. The platform
84
+ * buffers 5 minutes of events for gapless replay.
85
+ *
86
+ * @returns a {@link SubscriptionHandle} for cleanup. Aborting the
87
+ * caller's ``signal`` is equivalent to calling ``unsubscribe()``.
88
+ */
89
+ subscribeToWorkspace(options) {
90
+ const localController = new AbortController();
91
+ const cleanups = [];
92
+ if (options.signal) {
93
+ if (options.signal.aborted) {
94
+ localController.abort(options.signal.reason);
95
+ }
96
+ else {
97
+ const onAbort = () => localController.abort(options.signal?.reason);
98
+ options.signal.addEventListener('abort', onAbort, { once: true });
99
+ cleanups.push(() => options.signal?.removeEventListener('abort', onAbort));
100
+ }
101
+ }
102
+ const done = runSubscription(this.client, this.workspaceId, options, localController.signal).finally(() => {
103
+ for (const cleanup of cleanups)
104
+ cleanup();
105
+ });
106
+ return {
107
+ done,
108
+ unsubscribe: () => localController.abort(),
109
+ };
110
+ }
111
+ }
112
+ async function runSubscription(client, workspaceId, options, signal) {
113
+ let lastEventId = options.lastEventId;
114
+ let attempt = 0;
115
+ let delayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS;
116
+ const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
117
+ const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS;
118
+ let errorReported = false;
119
+ const reportError = (error) => {
120
+ if (errorReported)
121
+ return;
122
+ errorReported = true;
123
+ try {
124
+ options.onError?.(error);
125
+ }
126
+ catch {
127
+ // Consumer-supplied callback raised — swallow to keep teardown clean.
128
+ }
129
+ };
130
+ while (!signal.aborted) {
131
+ if (attempt > 0) {
132
+ try {
133
+ options.onReconnect?.(attempt);
134
+ }
135
+ catch {
136
+ // Consumer-supplied callback raised — swallow to keep teardown clean.
137
+ }
138
+ }
139
+ let outcome;
140
+ try {
141
+ outcome = await runOneConnection({
142
+ client,
143
+ workspaceId,
144
+ lastEventId,
145
+ signal,
146
+ onEvent: options.onEvent,
147
+ onIdAdvance: (id) => {
148
+ lastEventId = id;
149
+ },
150
+ onRetryDirective: (ms) => {
151
+ // Server-sent retry directive resets the backoff floor.
152
+ delayMs = clampDelay(ms, options.initialDelayMs, maxDelayMs);
153
+ },
154
+ });
155
+ }
156
+ catch (err) {
157
+ // runOneConnection surfaces only terminal auth errors via throw;
158
+ // everything else is a StreamOutcome.
159
+ reportError(err instanceof Error ? err : new Error(String(err)));
160
+ return;
161
+ }
162
+ if (signal.aborted || outcome.kind === 'aborted') {
163
+ return;
164
+ }
165
+ if (outcome.kind === 'auth-error') {
166
+ // 401 / 403 — never auto-retry. The token is invalid and the
167
+ // stream cannot succeed without operator intervention.
168
+ reportError(outcome.error);
169
+ return;
170
+ }
171
+ if (attempt >= maxReconnects) {
172
+ reportError(new Error(`SSE subscription exhausted reconnect budget (${maxReconnects}): ${outcome.reason}`));
173
+ return;
174
+ }
175
+ attempt += 1;
176
+ const sleepMs = jitter(delayMs);
177
+ delayMs = Math.min(delayMs * 2, maxDelayMs);
178
+ const slept = await abortableSleep(sleepMs, signal);
179
+ if (!slept)
180
+ return;
181
+ }
182
+ }
183
+ async function runOneConnection(args) {
184
+ const headers = { Accept: 'text/event-stream' };
185
+ if (args.lastEventId !== undefined) {
186
+ headers['Last-Event-ID'] = args.lastEventId;
187
+ }
188
+ let result;
189
+ try {
190
+ result = await args.client.GET('/v1/{workspace_id}/events/stream', {
191
+ params: { path: { workspace_id: args.workspaceId } },
192
+ headers,
193
+ parseAs: 'stream',
194
+ signal: args.signal,
195
+ });
196
+ }
197
+ catch (err) {
198
+ if (args.signal.aborted)
199
+ return { kind: 'aborted' };
200
+ const error = err instanceof Error ? err : new Error(String(err));
201
+ // 4xx (including 401 / 403) are surfaced as thrown AmigoErrors by the
202
+ // SDK error middleware. Distinguish those from transport failures.
203
+ const status = readStatus(error);
204
+ if (status === 401 || status === 403) {
205
+ return { kind: 'auth-error', error };
206
+ }
207
+ return { kind: 'transport-error', reason: error.message };
208
+ }
209
+ if (result.error !== undefined) {
210
+ // openapi-fetch surfaces non-OK responses as `error`. The SDK error
211
+ // middleware should have thrown — fall through defensively.
212
+ return { kind: 'transport-error', reason: `API error: ${safeStringify(result.error)}` };
213
+ }
214
+ const body = result.data;
215
+ if (!(body instanceof ReadableStream)) {
216
+ return { kind: 'transport-error', reason: 'Expected ReadableStream body for SSE' };
217
+ }
218
+ try {
219
+ for await (const frame of parseSSEFrames(body, args.signal)) {
220
+ if (args.signal.aborted)
221
+ return { kind: 'aborted' };
222
+ if (frame.retry !== undefined) {
223
+ args.onRetryDirective(frame.retry);
224
+ }
225
+ if (frame.id !== undefined) {
226
+ args.onIdAdvance(frame.id);
227
+ }
228
+ if (frame.event && frame.data !== undefined) {
229
+ const event = parseWorkspaceFrame(frame.event, frame.data);
230
+ if (event) {
231
+ try {
232
+ args.onEvent(event);
233
+ }
234
+ catch {
235
+ // Consumer threw during onEvent; do not let it kill the
236
+ // subscription. The stream is still healthy.
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ catch (err) {
243
+ if (args.signal.aborted)
244
+ return { kind: 'aborted' };
245
+ const reason = err instanceof Error ? err.message : String(err);
246
+ return { kind: 'transport-error', reason };
247
+ }
248
+ if (args.signal.aborted)
249
+ return { kind: 'aborted' };
250
+ // Reader closed cleanly — server EOF. Treat as recoverable; reconnect
251
+ // with whatever Last-Event-ID we have.
252
+ return { kind: 'transport-error', reason: 'Stream closed by server' };
253
+ }
254
+ /**
255
+ * Parses an SSE byte stream into structured frames.
256
+ *
257
+ * Forks the parser in {@link ConversationsResource.streamTurn} to also
258
+ * surface ``id:`` and ``retry:`` lines that the workspace event stream
259
+ * relies on for gapless reconnect.
260
+ */
261
+ async function* parseSSEFrames(stream, signal) {
262
+ const reader = stream.getReader();
263
+ const decoder = new TextDecoder();
264
+ let buffer = '';
265
+ // When the caller aborts, cancel the reader so any in-flight
266
+ // ``reader.read()`` resolves immediately with ``{done: true}`` (or rejects
267
+ // with ``AbortError``, which we trap in the consumer). Without this, an
268
+ // idle SSE stream keeps the read pending indefinitely after abort.
269
+ let cancelled = false;
270
+ const onAbort = () => {
271
+ if (cancelled)
272
+ return;
273
+ cancelled = true;
274
+ void reader.cancel().catch(() => {
275
+ // Already cancelled or locked elsewhere; safe to ignore.
276
+ });
277
+ };
278
+ let removeAbortHandler;
279
+ if (signal.aborted) {
280
+ onAbort();
281
+ }
282
+ else {
283
+ signal.addEventListener('abort', onAbort, { once: true });
284
+ removeAbortHandler = () => signal.removeEventListener('abort', onAbort);
285
+ }
286
+ function* drain(text) {
287
+ buffer += text;
288
+ if (buffer.length > MAX_FRAME_BYTES) {
289
+ throw new Error(`SSE frame buffer exceeded ${MAX_FRAME_BYTES} bytes without terminator`);
290
+ }
291
+ while (true) {
292
+ const idx = findFrameTerminator(buffer);
293
+ if (idx === null)
294
+ break;
295
+ const block = buffer.slice(0, idx.terminatorStart);
296
+ buffer = buffer.slice(idx.terminatorEnd);
297
+ const frame = parseSSEBlock(block);
298
+ if (frame)
299
+ yield frame;
300
+ }
301
+ }
302
+ try {
303
+ while (true) {
304
+ const { done, value } = await reader.read();
305
+ if (done)
306
+ break;
307
+ yield* drain(decoder.decode(value, { stream: true }));
308
+ }
309
+ yield* drain(decoder.decode());
310
+ if (buffer.trim().length > 0) {
311
+ const frame = parseSSEBlock(buffer);
312
+ if (frame)
313
+ yield frame;
314
+ buffer = '';
315
+ }
316
+ }
317
+ finally {
318
+ removeAbortHandler?.();
319
+ try {
320
+ reader.releaseLock();
321
+ }
322
+ catch {
323
+ // releaseLock can throw if the reader is already detached; ignore.
324
+ }
325
+ }
326
+ }
327
+ function findFrameTerminator(s) {
328
+ const lf = s.indexOf('\n\n');
329
+ const crlf = s.indexOf('\r\n\r\n');
330
+ if (lf < 0 && crlf < 0)
331
+ return null;
332
+ if (lf < 0)
333
+ return { terminatorStart: crlf, terminatorEnd: crlf + 4 };
334
+ if (crlf < 0)
335
+ return { terminatorStart: lf, terminatorEnd: lf + 2 };
336
+ return lf < crlf
337
+ ? { terminatorStart: lf, terminatorEnd: lf + 2 }
338
+ : { terminatorStart: crlf, terminatorEnd: crlf + 4 };
339
+ }
340
+ function parseSSEBlock(block) {
341
+ let event = '';
342
+ let id;
343
+ let retry;
344
+ const dataLines = [];
345
+ for (const line of block.split(/\r?\n/)) {
346
+ if (line === '' || line.startsWith(':'))
347
+ continue;
348
+ const colon = line.indexOf(':');
349
+ const field = colon < 0 ? line : line.slice(0, colon);
350
+ let value = colon < 0 ? '' : line.slice(colon + 1);
351
+ if (value.startsWith(' '))
352
+ value = value.slice(1);
353
+ if (field === 'event') {
354
+ event = value;
355
+ }
356
+ else if (field === 'data') {
357
+ dataLines.push(value);
358
+ }
359
+ else if (field === 'id') {
360
+ id = value;
361
+ }
362
+ else if (field === 'retry') {
363
+ const parsed = Number.parseInt(value, 10);
364
+ if (Number.isFinite(parsed) && parsed >= 0)
365
+ retry = parsed;
366
+ }
367
+ // Unknown fields are ignored per the SSE spec.
368
+ }
369
+ // Surface metadata-only frames (id-only or retry-only) so the reconnect
370
+ // loop can observe ``Last-Event-ID`` advances and server-sent retry hints
371
+ // even on heartbeats / replay-position markers.
372
+ if (!event && dataLines.length === 0 && id === undefined && retry === undefined) {
373
+ return null;
374
+ }
375
+ return {
376
+ event,
377
+ data: dataLines.length > 0 ? dataLines.join('\n') : undefined,
378
+ id,
379
+ retry,
380
+ };
381
+ }
382
+ /**
383
+ * Validate and reattach the discriminator to a frame's JSON payload.
384
+ *
385
+ * The platform-api SSE serializer pops ``event_type`` out of the JSON body
386
+ * (it lives in the SSE ``event:`` line). Reattach it so the resulting
387
+ * value is a well-formed {@link WorkspaceSSEEvent} union member.
388
+ *
389
+ * Drift-tolerant: an unparseable payload, non-object payload, or unknown
390
+ * ``event:`` discriminator is silently dropped (returns ``null``), matching
391
+ * the behavior of the analogous turn-stream parser.
392
+ */
393
+ function parseWorkspaceFrame(eventName, dataJson) {
394
+ let payload;
395
+ try {
396
+ payload = JSON.parse(dataJson);
397
+ }
398
+ catch {
399
+ return null;
400
+ }
401
+ if (typeof payload !== 'object' || payload === null || Array.isArray(payload))
402
+ return null;
403
+ // The discriminator is whatever the server's `event:` line says. We trust
404
+ // the platform-api union: anything outside the generated literal type is
405
+ // dropped at the static-type boundary by the consumer's `switch`.
406
+ return {
407
+ ...payload,
408
+ event_type: eventName,
409
+ };
410
+ }
411
+ function readStatus(error) {
412
+ if (typeof error !== 'object' || error === null)
413
+ return undefined;
414
+ const status = error.statusCode;
415
+ return typeof status === 'number' ? status : undefined;
416
+ }
417
+ function safeStringify(value) {
418
+ try {
419
+ return JSON.stringify(value);
420
+ }
421
+ catch {
422
+ return String(value);
423
+ }
424
+ }
425
+ function jitter(ms) {
426
+ // Full jitter: pick a random delay in [0, ms]. Avoids reconnect stampedes
427
+ // when many clients reconnect simultaneously after a deploy.
428
+ return Math.floor(Math.random() * Math.max(1, ms));
429
+ }
430
+ function clampDelay(ms, floor, ceiling) {
431
+ const lo = floor ?? DEFAULT_INITIAL_DELAY_MS;
432
+ if (!Number.isFinite(ms) || ms <= 0)
433
+ return lo;
434
+ return Math.min(Math.max(ms, lo), ceiling);
435
+ }
436
+ async function abortableSleep(ms, signal) {
437
+ if (signal.aborted)
438
+ return false;
439
+ return new Promise((resolve) => {
440
+ const timer = setTimeout(() => {
441
+ signal.removeEventListener('abort', onAbort);
442
+ resolve(true);
443
+ }, ms);
444
+ const onAbort = () => {
445
+ clearTimeout(timer);
446
+ signal.removeEventListener('abort', onAbort);
447
+ resolve(false);
448
+ };
449
+ signal.addEventListener('abort', onAbort, { once: true });
450
+ });
451
+ }
452
+ //# sourceMappingURL=events.js.map