@beignet/core 0.0.53 → 0.0.55

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.
@@ -0,0 +1,599 @@
1
+ import { createProviderInstrumentation, } from "../providers/instrumentation.js";
2
+ import { BroadcastValidationError, broadcastLimits, channelKey, parseChannelEvent, parseChannelParams, } from "./index.js";
3
+ /** Safe connection/protocol failure; application callback errors are reported separately. */
4
+ export class BroadcastClientError extends Error {
5
+ retryable;
6
+ status;
7
+ constructor(message, retryable, status) {
8
+ super(message);
9
+ this.retryable = retryable;
10
+ this.status = status;
11
+ this.name = "BroadcastClientError";
12
+ }
13
+ }
14
+ function retryDelay(failures, minimum = 0) {
15
+ const ceiling = Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5));
16
+ return Math.max(minimum, Math.round(ceiling * (0.5 + Math.random() * 0.5)));
17
+ }
18
+ function responseRetryDelay(response) {
19
+ const value = response.headers.get("retry-after");
20
+ if (!value)
21
+ return 0;
22
+ const seconds = Number(value);
23
+ const delay = Number.isFinite(seconds)
24
+ ? seconds * 1_000
25
+ : Date.parse(value) - Date.now();
26
+ return Number.isFinite(delay) ? Math.max(0, delay) : 0;
27
+ }
28
+ /** Stop waiting even if an application schema/header callback ignores cancellation. */
29
+ async function abortable(work, signal) {
30
+ let cancel = () => { };
31
+ try {
32
+ return await Promise.race([
33
+ work,
34
+ new Promise((_, reject) => {
35
+ cancel = () => reject(new BroadcastClientError("Broadcast operation interrupted", true));
36
+ if (signal.aborted)
37
+ cancel();
38
+ else
39
+ signal.addEventListener("abort", cancel, { once: true });
40
+ }),
41
+ ]);
42
+ }
43
+ finally {
44
+ signal.removeEventListener("abort", cancel);
45
+ }
46
+ }
47
+ /** One multiplexed streaming Fetch connection per instance. Create an instance per app auth session. */
48
+ export function createBroadcastClient(options) {
49
+ const fetcher = options.fetch ?? globalThis.fetch;
50
+ const instrumentation = createProviderInstrumentation(options.instrumentation, {
51
+ providerName: "broadcast-client",
52
+ watcher: "broadcast",
53
+ });
54
+ let connectionInfo = Object.freeze({
55
+ reason: "initial",
56
+ });
57
+ let retryReason = "unknown";
58
+ const clientId = crypto.randomUUID();
59
+ const entries = new Map();
60
+ const observers = new Set();
61
+ let nextId = 0;
62
+ let closed = false;
63
+ let generation = 0;
64
+ let interruptConnection;
65
+ let retryTimer;
66
+ let restartQueued = false;
67
+ let attempted = false;
68
+ function status(entry) {
69
+ if (closed)
70
+ return "closed";
71
+ if (entry?.blocked)
72
+ return "blocked";
73
+ if (entry?.ready)
74
+ return "connected";
75
+ if (!entry && [...entries.values()].some((value) => value.ready))
76
+ return "connected";
77
+ if (!entry &&
78
+ entries.size > 0 &&
79
+ [...entries.values()].every((value) => value.blocked))
80
+ return "blocked";
81
+ return attempted ? "reconnecting" : "connecting";
82
+ }
83
+ function report(observer, error) {
84
+ if (!observer.active)
85
+ return;
86
+ try {
87
+ observer.onError?.(error);
88
+ }
89
+ catch {
90
+ /* Error reporting cannot change transport state. */
91
+ }
92
+ }
93
+ function invoke(observer, callback) {
94
+ if (!observer.active)
95
+ return;
96
+ try {
97
+ void Promise.resolve(callback()).catch((error) => report(observer, error));
98
+ }
99
+ catch (error) {
100
+ report(observer, error);
101
+ }
102
+ }
103
+ function notify(entry, info = connectionInfo) {
104
+ entry.connectionInfo = info;
105
+ for (const observer of entry.observers)
106
+ invoke(observer, () => observer.onStatusChange?.(status(entry), info));
107
+ }
108
+ function fail(entry, error, minimum = 0, info = Object.freeze({ reason: "interruption" })) {
109
+ retryReason = info.reason;
110
+ entry.ready = false;
111
+ entry.blocked = !error.retryable;
112
+ if (error.retryable)
113
+ entry.nextAttemptAt = Date.now() + retryDelay(entry.failures++, minimum);
114
+ notify(entry, info);
115
+ if (info.reason !== "planned-renewal")
116
+ for (const observer of entry.observers)
117
+ report(observer, error);
118
+ }
119
+ function clearRetry() {
120
+ if (retryTimer !== undefined)
121
+ clearTimeout(retryTimer);
122
+ retryTimer = undefined;
123
+ }
124
+ function scheduleRetry() {
125
+ clearRetry();
126
+ const waiting = [...entries.values()].filter((entry) => !entry.blocked && !entry.ready && entry.nextAttemptAt > 0);
127
+ if (!waiting.length || closed)
128
+ return;
129
+ const delay = Math.max(0, Math.min(...waiting.map((entry) => entry.nextAttemptAt)) - Date.now());
130
+ // Long Retry-After values retain their deadline across timer chunks and subscription changes.
131
+ retryTimer = setTimeout(() => {
132
+ if (waiting.some((entry) => !entry.blocked && entry.nextAttemptAt <= Date.now()))
133
+ restart(retryReason);
134
+ else
135
+ scheduleRetry();
136
+ }, Math.min(delay, 2_147_483_647));
137
+ }
138
+ function restart(reason = "unknown") {
139
+ if (closed)
140
+ return;
141
+ connectionInfo = Object.freeze({ reason: attempted ? reason : "initial" });
142
+ generation++;
143
+ interruptConnection?.(connectionInfo.reason);
144
+ interruptConnection = undefined;
145
+ clearRetry();
146
+ for (const entry of entries.values()) {
147
+ entry.ready = false;
148
+ notify(entry);
149
+ }
150
+ if (restartQueued)
151
+ return;
152
+ restartQueued = true;
153
+ queueMicrotask(() => {
154
+ restartQueued = false;
155
+ if (!closed)
156
+ void connect(generation);
157
+ });
158
+ }
159
+ async function connect(current) {
160
+ const included = [...entries.values()].filter((entry) => !entry.blocked && entry.nextAttemptAt <= Date.now());
161
+ if (!included.length) {
162
+ scheduleRetry();
163
+ return;
164
+ }
165
+ for (const entry of included)
166
+ entry.nextAttemptAt = 0;
167
+ // Joining channels must not cancel deadlines for subscriptions still waiting to retry.
168
+ scheduleRetry();
169
+ attempted = true;
170
+ const info = connectionInfo;
171
+ let endReason = "unknown";
172
+ instrumentation.custom({
173
+ name: "broadcast.connecting",
174
+ details: { reason: info.reason, subscriptions: included.length },
175
+ });
176
+ const abort = new AbortController();
177
+ interruptConnection = (reason) => {
178
+ endReason = reason;
179
+ abort.abort();
180
+ };
181
+ const live = () => !closed && current === generation && !abort.signal.aborted;
182
+ let reader;
183
+ let timer;
184
+ let lifetime;
185
+ let readiness;
186
+ const arm = (ms) => {
187
+ if (timer !== undefined)
188
+ clearTimeout(timer);
189
+ timer = setTimeout(() => {
190
+ endReason = "interruption";
191
+ abort.abort();
192
+ }, ms);
193
+ };
194
+ let terminal = false;
195
+ let reading = false;
196
+ try {
197
+ arm(broadcastLimits.readyTimeoutMs);
198
+ const url = new URL(options.url, typeof location === "undefined" ? "http://localhost" : location.href);
199
+ if (url.username ||
200
+ url.password ||
201
+ !["http:", "https:"].includes(url.protocol))
202
+ throw new BroadcastClientError("Invalid broadcast endpoint URL", false);
203
+ url.searchParams.set("subscriptions", JSON.stringify({
204
+ version: 1,
205
+ channels: included.map((entry) => ({
206
+ id: entry.id,
207
+ name: entry.channel.name,
208
+ params: entry.params,
209
+ })),
210
+ }));
211
+ if (new TextEncoder().encode(url.search).byteLength >
212
+ broadcastLimits.requestBytes)
213
+ throw new BroadcastClientError("Broadcast subscriptions exceed the request size limit", false);
214
+ const headers = new Headers(typeof options.headers === "function"
215
+ ? await abortable(Promise.resolve().then(options.headers), abort.signal)
216
+ : options.headers);
217
+ if (!live())
218
+ return;
219
+ headers.set("Accept", "text/event-stream");
220
+ headers.set("X-Beignet-Broadcast-Client", clientId);
221
+ headers.delete("Last-Event-ID");
222
+ const fetching = fetcher(url, {
223
+ method: "GET",
224
+ headers,
225
+ credentials: options.credentials ?? "same-origin",
226
+ cache: "no-store",
227
+ redirect: "error",
228
+ signal: abort.signal,
229
+ });
230
+ void fetching.then((response) => {
231
+ if (!live())
232
+ void response.body?.cancel().catch(() => undefined);
233
+ }, () => undefined);
234
+ const response = await abortable(fetching, abort.signal);
235
+ if (!live())
236
+ return;
237
+ if (!response.ok) {
238
+ endReason = "interruption";
239
+ terminal = true;
240
+ const retryable = response.status === 429 || response.status >= 500;
241
+ for (const entry of included)
242
+ fail(entry, new BroadcastClientError("Broadcast connection was rejected", retryable, response.status), responseRetryDelay(response));
243
+ void response.body?.cancel().catch(() => undefined);
244
+ return;
245
+ }
246
+ if (response.headers.get("content-type")?.split(";", 1)[0]?.trim() !==
247
+ "text/event-stream" ||
248
+ !response.body)
249
+ throw new BroadcastClientError("Invalid broadcast response", false);
250
+ reader = response.body.getReader();
251
+ reading = true;
252
+ arm(broadcastLimits.heartbeatMs * 2 + 5_000);
253
+ const connectedAt = performance.now();
254
+ let receivedReadiness = false;
255
+ readiness = setTimeout(() => {
256
+ endReason = "interruption";
257
+ for (const entry of included)
258
+ if (!entry.ready &&
259
+ !entry.blocked &&
260
+ entry.nextAttemptAt <= Date.now())
261
+ fail(entry, new BroadcastClientError("Broadcast readiness timed out", true));
262
+ restart("interruption");
263
+ }, broadcastLimits.readyTimeoutMs);
264
+ const byId = new Map(included.map((entry) => [entry.id, entry]));
265
+ const decoder = new TextDecoder("utf-8", { fatal: true });
266
+ let buffer = "";
267
+ let data = [];
268
+ let eventName = "";
269
+ let frameBytes = 0;
270
+ let renewalAnnounced = false;
271
+ async function line(value) {
272
+ if (!value) {
273
+ if (data.length) {
274
+ renewalAnnounced = false;
275
+ if (eventName !== "broadcast")
276
+ throw new BroadcastClientError("Unknown broadcast frame", false);
277
+ const frame = JSON.parse(data.join("\n"));
278
+ if (!frame || typeof frame !== "object")
279
+ throw new BroadcastClientError("Invalid broadcast frame", false);
280
+ const message = frame;
281
+ if (message.type === "renewal") {
282
+ if (Object.keys(message).length !== 1)
283
+ throw new BroadcastClientError("Invalid broadcast renewal", false);
284
+ renewalAnnounced = true;
285
+ data = [];
286
+ eventName = "";
287
+ frameBytes = 0;
288
+ return;
289
+ }
290
+ const entry = typeof message.id === "string" ? byId.get(message.id) : undefined;
291
+ if (!entry || typeof message.type !== "string")
292
+ throw new BroadcastClientError("Invalid broadcast subscription frame", false);
293
+ if (entry.blocked || entry.nextAttemptAt > Date.now()) {
294
+ data = [];
295
+ eventName = "";
296
+ frameBytes = 0;
297
+ return;
298
+ }
299
+ if (message.type === "ready") {
300
+ if (entry.ready)
301
+ throw new BroadcastClientError("Duplicate broadcast readiness", false);
302
+ const advertisedLifetime = message.maxLifetimeMs;
303
+ if (typeof advertisedLifetime !== "number" ||
304
+ !Number.isSafeInteger(advertisedLifetime) ||
305
+ advertisedLifetime < 1 ||
306
+ advertisedLifetime > broadcastLimits.maxLifetimeMs)
307
+ throw new BroadcastClientError("Invalid broadcast connection lifetime", false);
308
+ // Only the first readiness can configure this connection's deadline.
309
+ // Count from response arrival, never from a subscription or heartbeat.
310
+ if (!receivedReadiness) {
311
+ lifetime = setTimeout(() => {
312
+ endReason = "interruption";
313
+ abort.abort();
314
+ }, Math.max(0, advertisedLifetime +
315
+ broadcastLimits.lifetimeGraceMs -
316
+ (performance.now() - connectedAt)));
317
+ }
318
+ receivedReadiness = true;
319
+ entry.ready = true;
320
+ entry.failures = 0;
321
+ entry.nextAttemptAt = 0;
322
+ notify(entry, info);
323
+ instrumentation.custom({
324
+ name: "broadcast.ready",
325
+ details: { reason: info.reason },
326
+ });
327
+ for (const observer of entry.observers)
328
+ invoke(observer, () => observer.onSync(info));
329
+ }
330
+ else if (message.type === "event") {
331
+ if (!entry.ready || typeof message.event !== "string")
332
+ throw new BroadcastClientError("Event before broadcast readiness", false);
333
+ const event = await abortable(parseChannelEvent(entry.channel, {
334
+ event: message.event,
335
+ data: message.data,
336
+ }), abort.signal);
337
+ if (live())
338
+ for (const observer of entry.observers)
339
+ invoke(observer, () => observer.onEvent(event));
340
+ }
341
+ else if (message.type === "rejected" ||
342
+ message.type === "unavailable") {
343
+ if (typeof message.status !== "number" ||
344
+ !Number.isInteger(message.status) ||
345
+ message.status < 400 ||
346
+ message.status > 599)
347
+ throw new BroadcastClientError("Invalid broadcast failure", false);
348
+ const retryable = message.type === "unavailable";
349
+ if (retryable !== (message.status === 429 || message.status >= 500))
350
+ throw new BroadcastClientError("Invalid broadcast failure classification", false);
351
+ const retryAfter = message.retryAfterMs;
352
+ if (retryAfter !== undefined &&
353
+ (typeof retryAfter !== "number" ||
354
+ !Number.isFinite(retryAfter) ||
355
+ retryAfter < 0))
356
+ throw new BroadcastClientError("Invalid broadcast retry delay", false);
357
+ endReason = "interruption";
358
+ fail(entry, new BroadcastClientError("Broadcast subscription is unavailable", retryable, message.status), typeof retryAfter === "number" ? retryAfter : 0);
359
+ scheduleRetry();
360
+ }
361
+ else
362
+ throw new BroadcastClientError("Unknown broadcast control frame", false);
363
+ if (included.every((entry) => entry.ready ||
364
+ entry.blocked ||
365
+ entry.nextAttemptAt > Date.now())) {
366
+ if (readiness !== undefined)
367
+ clearTimeout(readiness);
368
+ readiness = undefined;
369
+ }
370
+ if (included.every((entry) => entry.blocked || entry.nextAttemptAt > Date.now())) {
371
+ terminal = true;
372
+ abort.abort();
373
+ }
374
+ }
375
+ data = [];
376
+ eventName = "";
377
+ frameBytes = 0;
378
+ return;
379
+ }
380
+ // Renewal is terminal: subsequent traffic makes the eventual EOF unexplained.
381
+ renewalAnnounced = false;
382
+ frameBytes += new TextEncoder().encode(value).byteLength;
383
+ if (frameBytes >
384
+ broadcastLimits.payloadBytes + broadcastLimits.requestBytes)
385
+ throw new BroadcastClientError("Broadcast frame exceeds the size limit", false);
386
+ if (value.startsWith(":"))
387
+ return;
388
+ const colon = value.indexOf(":");
389
+ const field = colon < 0 ? value : value.slice(0, colon);
390
+ const content = colon < 0 ? "" : value.slice(colon + 1).replace(/^ /, "");
391
+ if (field === "data")
392
+ data.push(content);
393
+ else if (field === "event")
394
+ eventName = content;
395
+ else if (field === "id" || field === "retry")
396
+ throw new BroadcastClientError("Broadcast replay fields are not supported", false);
397
+ }
398
+ while (live()) {
399
+ const chunk = await abortable(reader.read(), abort.signal);
400
+ if (!live())
401
+ break;
402
+ if (chunk.done) {
403
+ endReason =
404
+ renewalAnnounced && !buffer && frameBytes === 0
405
+ ? "planned-renewal"
406
+ : "unknown";
407
+ break;
408
+ }
409
+ arm(broadcastLimits.heartbeatMs * 2 + 5_000);
410
+ if (chunk.value.byteLength > broadcastLimits.bufferedBytes)
411
+ throw new BroadcastClientError("Broadcast stream exceeds the buffer limit", false);
412
+ try {
413
+ buffer += decoder.decode(chunk.value, { stream: true });
414
+ }
415
+ catch {
416
+ throw new BroadcastClientError("Invalid broadcast text encoding", false);
417
+ }
418
+ if (new TextEncoder().encode(buffer).byteLength >
419
+ broadcastLimits.bufferedBytes)
420
+ throw new BroadcastClientError("Broadcast stream exceeds the buffer limit", false);
421
+ for (;;) {
422
+ const match = /\r\n|\r|\n/.exec(buffer);
423
+ if (!match)
424
+ break;
425
+ if (match[0] === "\r" && match.index === buffer.length - 1)
426
+ break;
427
+ const value = buffer.slice(0, match.index);
428
+ buffer = buffer.slice(match.index + match[0].length);
429
+ await line(value);
430
+ if (!live())
431
+ break;
432
+ }
433
+ }
434
+ }
435
+ catch (error) {
436
+ if (current === generation && !closed)
437
+ endReason = "interruption";
438
+ if (current === generation &&
439
+ !closed &&
440
+ error instanceof BroadcastClientError &&
441
+ !error.retryable) {
442
+ terminal = true;
443
+ for (const entry of included)
444
+ fail(entry, error);
445
+ }
446
+ else if (current === generation &&
447
+ !closed &&
448
+ (error instanceof BroadcastValidationError ||
449
+ (reading && !abort.signal.aborted && error instanceof SyntaxError))) {
450
+ terminal = true;
451
+ for (const entry of included)
452
+ fail(entry, new BroadcastClientError("Invalid broadcast payload", false));
453
+ }
454
+ }
455
+ finally {
456
+ if (timer !== undefined)
457
+ clearTimeout(timer);
458
+ if (lifetime !== undefined)
459
+ clearTimeout(lifetime);
460
+ if (readiness !== undefined)
461
+ clearTimeout(readiness);
462
+ abort.abort();
463
+ void reader?.cancel().catch(() => undefined);
464
+ const ended = Object.freeze({ reason: endReason });
465
+ instrumentation.custom({
466
+ name: "broadcast.closed",
467
+ details: { reason: ended.reason },
468
+ });
469
+ if (current === generation && !closed) {
470
+ retryReason = endReason;
471
+ interruptConnection = undefined;
472
+ if (!terminal)
473
+ for (const entry of included) {
474
+ if (!entry.blocked && entry.nextAttemptAt <= Date.now())
475
+ fail(entry, new BroadcastClientError(endReason === "planned-renewal"
476
+ ? "Broadcast connection renewed"
477
+ : "Broadcast connection interrupted", true), 0, ended);
478
+ }
479
+ scheduleRetry();
480
+ }
481
+ }
482
+ }
483
+ function wake() {
484
+ if (typeof document !== "undefined" &&
485
+ document.visibilityState === "hidden")
486
+ return;
487
+ restart();
488
+ }
489
+ if (typeof window !== "undefined")
490
+ window.addEventListener("online", wake);
491
+ if (typeof document !== "undefined")
492
+ document.addEventListener("visibilitychange", wake);
493
+ return {
494
+ subscribe(channel, subscriptionOptions) {
495
+ if (closed)
496
+ throw new BroadcastClientError("Broadcast client is closed", false);
497
+ let entry;
498
+ let invalid = false;
499
+ const observer = {
500
+ ...subscriptionOptions,
501
+ active: true,
502
+ validation: new AbortController(),
503
+ onEvent: (event) => subscriptionOptions.onEvent(event),
504
+ };
505
+ observers.add(observer);
506
+ const validationTimeout = setTimeout(() => observer.validation.abort(), broadcastLimits.readyTimeoutMs);
507
+ void abortable(parseChannelParams(channel, subscriptionOptions.params), observer.validation.signal)
508
+ .then((params) => {
509
+ if (!observer.active || closed)
510
+ return;
511
+ const key = channelKey(channel.name, params);
512
+ entry = entries.get(key);
513
+ if (!entry) {
514
+ if (entries.size >= broadcastLimits.subscriptions)
515
+ throw new BroadcastClientError("Broadcast client supports at most 20 distinct subscriptions", false);
516
+ entry = {
517
+ id: String(++nextId),
518
+ key,
519
+ channel,
520
+ params,
521
+ observers: new Set(),
522
+ blocked: false,
523
+ ready: false,
524
+ failures: 0,
525
+ nextAttemptAt: 0,
526
+ };
527
+ entries.set(key, entry);
528
+ entry.observers.add(observer);
529
+ restart("subscription-change");
530
+ }
531
+ else {
532
+ if (entry.channel !== channel)
533
+ throw new BroadcastClientError(`Conflicting definitions for channel ${channel.name}`, false);
534
+ entry.observers.add(observer);
535
+ invoke(observer, () => observer.onStatusChange?.(status(entry), entry?.connectionInfo ?? connectionInfo));
536
+ if (entry.ready)
537
+ invoke(observer, () => observer.onSync(entry?.connectionInfo ?? connectionInfo));
538
+ }
539
+ })
540
+ .catch((error) => {
541
+ invalid = true;
542
+ report(observer, error);
543
+ invoke(observer, () => observer.onStatusChange?.("blocked", connectionInfo));
544
+ })
545
+ .finally(() => clearTimeout(validationTimeout));
546
+ return {
547
+ getStatus: () => !observer.active || closed
548
+ ? "closed"
549
+ : invalid
550
+ ? "blocked"
551
+ : status(entry),
552
+ unsubscribe() {
553
+ if (!observer.active)
554
+ return;
555
+ observer.active = false;
556
+ observer.validation.abort();
557
+ observers.delete(observer);
558
+ entry?.observers.delete(observer);
559
+ if (entry &&
560
+ !entry.observers.size &&
561
+ entries.get(entry.key) === entry) {
562
+ entries.delete(entry.key);
563
+ restart("subscription-change");
564
+ }
565
+ },
566
+ };
567
+ },
568
+ getRequestHeaders: () => ({ "X-Beignet-Broadcast-Client": clientId }),
569
+ getStatus: () => status(),
570
+ resume() {
571
+ for (const entry of entries.values()) {
572
+ entry.blocked = false;
573
+ entry.nextAttemptAt = 0;
574
+ entry.failures = 0;
575
+ }
576
+ restart();
577
+ },
578
+ close() {
579
+ if (closed)
580
+ return;
581
+ closed = true;
582
+ generation++;
583
+ interruptConnection?.("unknown");
584
+ clearRetry();
585
+ if (typeof window !== "undefined")
586
+ window.removeEventListener("online", wake);
587
+ if (typeof document !== "undefined")
588
+ document.removeEventListener("visibilitychange", wake);
589
+ for (const observer of observers) {
590
+ invoke(observer, () => observer.onStatusChange?.("closed", Object.freeze({ reason: "unknown" })));
591
+ observer.active = false;
592
+ observer.validation.abort();
593
+ }
594
+ observers.clear();
595
+ entries.clear();
596
+ },
597
+ };
598
+ }
599
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/broadcasting/client.ts"],"names":[],"mappings":"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"}