@beignet/core 0.0.52 → 0.0.54

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 (48) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +116 -2
  3. package/dist/broadcasting/client.d.ts +38 -0
  4. package/dist/broadcasting/client.d.ts.map +1 -0
  5. package/dist/broadcasting/client.js +519 -0
  6. package/dist/broadcasting/client.js.map +1 -0
  7. package/dist/broadcasting/index.d.ts +43 -0
  8. package/dist/broadcasting/index.d.ts.map +1 -0
  9. package/dist/broadcasting/index.js +87 -0
  10. package/dist/broadcasting/index.js.map +1 -0
  11. package/dist/broadcasting/server.d.ts +83 -0
  12. package/dist/broadcasting/server.d.ts.map +1 -0
  13. package/dist/broadcasting/server.js +213 -0
  14. package/dist/broadcasting/server.js.map +1 -0
  15. package/dist/encryption/index.d.ts +40 -0
  16. package/dist/encryption/index.d.ts.map +1 -0
  17. package/dist/encryption/index.js +134 -0
  18. package/dist/encryption/index.js.map +1 -0
  19. package/dist/notifications/index.d.ts +14 -0
  20. package/dist/notifications/index.d.ts.map +1 -1
  21. package/dist/notifications/index.js +17 -0
  22. package/dist/notifications/index.js.map +1 -1
  23. package/dist/ports/redaction.d.ts +1 -1
  24. package/dist/ports/redaction.d.ts.map +1 -1
  25. package/dist/ports/redaction.js +3 -0
  26. package/dist/ports/redaction.js.map +1 -1
  27. package/dist/server/request-executor.d.ts.map +1 -1
  28. package/dist/server/request-executor.js +13 -0
  29. package/dist/server/request-executor.js.map +1 -1
  30. package/dist/server/server.d.ts +4 -2
  31. package/dist/server/server.d.ts.map +1 -1
  32. package/dist/server/server.js +1 -1
  33. package/dist/server/server.js.map +1 -1
  34. package/dist/server/use-case-route.d.ts +82 -17
  35. package/dist/server/use-case-route.d.ts.map +1 -1
  36. package/dist/server/use-case-route.js +40 -4
  37. package/dist/server/use-case-route.js.map +1 -1
  38. package/package.json +17 -1
  39. package/skills/app-architecture/SKILL.md +48 -1
  40. package/src/broadcasting/client.ts +714 -0
  41. package/src/broadcasting/index.ts +173 -0
  42. package/src/broadcasting/server.ts +352 -0
  43. package/src/encryption/index.ts +198 -0
  44. package/src/notifications/index.ts +32 -0
  45. package/src/ports/redaction.ts +3 -0
  46. package/src/server/request-executor.ts +19 -0
  47. package/src/server/server.ts +8 -3
  48. package/src/server/use-case-route.ts +234 -27
@@ -0,0 +1,519 @@
1
+ import { BroadcastValidationError, broadcastLimits, channelKey, parseChannelEvent, parseChannelParams, } from "./index.js";
2
+ /** Safe connection/protocol failure; application callback errors are reported separately. */
3
+ export class BroadcastClientError extends Error {
4
+ retryable;
5
+ status;
6
+ constructor(message, retryable, status) {
7
+ super(message);
8
+ this.retryable = retryable;
9
+ this.status = status;
10
+ this.name = "BroadcastClientError";
11
+ }
12
+ }
13
+ function retryDelay(failures, minimum = 0) {
14
+ const ceiling = Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5));
15
+ return Math.max(minimum, Math.round(ceiling * (0.5 + Math.random() * 0.5)));
16
+ }
17
+ function responseRetryDelay(response) {
18
+ const value = response.headers.get("retry-after");
19
+ if (!value)
20
+ return 0;
21
+ const seconds = Number(value);
22
+ const delay = Number.isFinite(seconds)
23
+ ? seconds * 1_000
24
+ : Date.parse(value) - Date.now();
25
+ return Number.isFinite(delay) ? Math.max(0, delay) : 0;
26
+ }
27
+ /** Stop waiting even if an application schema/header callback ignores cancellation. */
28
+ async function abortable(work, signal) {
29
+ let cancel = () => { };
30
+ try {
31
+ return await Promise.race([
32
+ work,
33
+ new Promise((_, reject) => {
34
+ cancel = () => reject(new BroadcastClientError("Broadcast operation interrupted", true));
35
+ if (signal.aborted)
36
+ cancel();
37
+ else
38
+ signal.addEventListener("abort", cancel, { once: true });
39
+ }),
40
+ ]);
41
+ }
42
+ finally {
43
+ signal.removeEventListener("abort", cancel);
44
+ }
45
+ }
46
+ /** One multiplexed streaming Fetch connection per instance. Create an instance per app auth session. */
47
+ export function createBroadcastClient(options) {
48
+ const fetcher = options.fetch ?? globalThis.fetch;
49
+ const clientId = crypto.randomUUID();
50
+ const entries = new Map();
51
+ const observers = new Set();
52
+ let nextId = 0;
53
+ let closed = false;
54
+ let generation = 0;
55
+ let controller;
56
+ let retryTimer;
57
+ let restartQueued = false;
58
+ let attempted = false;
59
+ function status(entry) {
60
+ if (closed)
61
+ return "closed";
62
+ if (entry?.blocked)
63
+ return "blocked";
64
+ if (entry?.ready)
65
+ return "connected";
66
+ if (!entry && [...entries.values()].some((value) => value.ready))
67
+ return "connected";
68
+ if (!entry &&
69
+ entries.size > 0 &&
70
+ [...entries.values()].every((value) => value.blocked))
71
+ return "blocked";
72
+ return attempted ? "reconnecting" : "connecting";
73
+ }
74
+ function report(observer, error) {
75
+ if (!observer.active)
76
+ return;
77
+ try {
78
+ observer.onError?.(error);
79
+ }
80
+ catch {
81
+ /* Error reporting cannot change transport state. */
82
+ }
83
+ }
84
+ function invoke(observer, callback) {
85
+ if (!observer.active)
86
+ return;
87
+ try {
88
+ void Promise.resolve(callback()).catch((error) => report(observer, error));
89
+ }
90
+ catch (error) {
91
+ report(observer, error);
92
+ }
93
+ }
94
+ function notify(entry) {
95
+ for (const observer of entry.observers)
96
+ invoke(observer, () => observer.onStatusChange?.(status(entry)));
97
+ }
98
+ function fail(entry, error, minimum = 0) {
99
+ entry.ready = false;
100
+ entry.blocked = !error.retryable;
101
+ if (error.retryable)
102
+ entry.nextAttemptAt = Date.now() + retryDelay(entry.failures++, minimum);
103
+ notify(entry);
104
+ for (const observer of entry.observers)
105
+ report(observer, error);
106
+ }
107
+ function clearRetry() {
108
+ if (retryTimer !== undefined)
109
+ clearTimeout(retryTimer);
110
+ retryTimer = undefined;
111
+ }
112
+ function scheduleRetry() {
113
+ clearRetry();
114
+ const waiting = [...entries.values()].filter((entry) => !entry.blocked && !entry.ready && entry.nextAttemptAt > 0);
115
+ if (!waiting.length || closed)
116
+ return;
117
+ const delay = Math.max(0, Math.min(...waiting.map((entry) => entry.nextAttemptAt)) - Date.now());
118
+ // Long Retry-After values retain their deadline across timer chunks and subscription changes.
119
+ retryTimer = setTimeout(() => {
120
+ if (waiting.some((entry) => !entry.blocked && entry.nextAttemptAt <= Date.now()))
121
+ restart();
122
+ else
123
+ scheduleRetry();
124
+ }, Math.min(delay, 2_147_483_647));
125
+ }
126
+ function restart() {
127
+ if (closed)
128
+ return;
129
+ generation++;
130
+ controller?.abort();
131
+ controller = undefined;
132
+ clearRetry();
133
+ for (const entry of entries.values()) {
134
+ entry.ready = false;
135
+ notify(entry);
136
+ }
137
+ if (restartQueued)
138
+ return;
139
+ restartQueued = true;
140
+ queueMicrotask(() => {
141
+ restartQueued = false;
142
+ if (!closed)
143
+ void connect(generation);
144
+ });
145
+ }
146
+ async function connect(current) {
147
+ const included = [...entries.values()].filter((entry) => !entry.blocked && entry.nextAttemptAt <= Date.now());
148
+ if (!included.length) {
149
+ scheduleRetry();
150
+ return;
151
+ }
152
+ for (const entry of included)
153
+ entry.nextAttemptAt = 0;
154
+ // Joining channels must not cancel deadlines for subscriptions still waiting to retry.
155
+ scheduleRetry();
156
+ attempted = true;
157
+ const abort = new AbortController();
158
+ controller = abort;
159
+ const live = () => !closed && current === generation && !abort.signal.aborted;
160
+ let reader;
161
+ let timer;
162
+ let lifetime;
163
+ let readiness;
164
+ const arm = (ms) => {
165
+ if (timer !== undefined)
166
+ clearTimeout(timer);
167
+ timer = setTimeout(() => abort.abort(), ms);
168
+ };
169
+ let terminal = false;
170
+ let reading = false;
171
+ try {
172
+ arm(broadcastLimits.readyTimeoutMs);
173
+ const url = new URL(options.url, typeof location === "undefined" ? "http://localhost" : location.href);
174
+ if (url.username ||
175
+ url.password ||
176
+ !["http:", "https:"].includes(url.protocol))
177
+ throw new BroadcastClientError("Invalid broadcast endpoint URL", false);
178
+ url.searchParams.set("subscriptions", JSON.stringify({
179
+ version: 1,
180
+ channels: included.map((entry) => ({
181
+ id: entry.id,
182
+ name: entry.channel.name,
183
+ params: entry.params,
184
+ })),
185
+ }));
186
+ if (new TextEncoder().encode(url.search).byteLength >
187
+ broadcastLimits.requestBytes)
188
+ throw new BroadcastClientError("Broadcast subscriptions exceed the request size limit", false);
189
+ const headers = new Headers(typeof options.headers === "function"
190
+ ? await abortable(Promise.resolve().then(options.headers), abort.signal)
191
+ : options.headers);
192
+ if (!live())
193
+ return;
194
+ headers.set("Accept", "text/event-stream");
195
+ headers.set("X-Beignet-Broadcast-Client", clientId);
196
+ headers.delete("Last-Event-ID");
197
+ const fetching = fetcher(url, {
198
+ method: "GET",
199
+ headers,
200
+ credentials: options.credentials ?? "same-origin",
201
+ cache: "no-store",
202
+ redirect: "error",
203
+ signal: abort.signal,
204
+ });
205
+ void fetching.then((response) => {
206
+ if (!live())
207
+ void response.body?.cancel().catch(() => undefined);
208
+ }, () => undefined);
209
+ const response = await abortable(fetching, abort.signal);
210
+ if (!live())
211
+ return;
212
+ if (!response.ok) {
213
+ terminal = true;
214
+ const retryable = response.status === 429 || response.status >= 500;
215
+ for (const entry of included)
216
+ fail(entry, new BroadcastClientError("Broadcast connection was rejected", retryable, response.status), responseRetryDelay(response));
217
+ void response.body?.cancel().catch(() => undefined);
218
+ return;
219
+ }
220
+ if (response.headers.get("content-type")?.split(";", 1)[0]?.trim() !==
221
+ "text/event-stream" ||
222
+ !response.body)
223
+ throw new BroadcastClientError("Invalid broadcast response", false);
224
+ reader = response.body.getReader();
225
+ reading = true;
226
+ arm(broadcastLimits.heartbeatMs * 2 + 5_000);
227
+ lifetime = setTimeout(() => abort.abort(), broadcastLimits.maxLifetimeMs);
228
+ readiness = setTimeout(() => {
229
+ for (const entry of included)
230
+ if (!entry.ready &&
231
+ !entry.blocked &&
232
+ entry.nextAttemptAt <= Date.now())
233
+ fail(entry, new BroadcastClientError("Broadcast readiness timed out", true));
234
+ restart();
235
+ }, broadcastLimits.readyTimeoutMs);
236
+ const byId = new Map(included.map((entry) => [entry.id, entry]));
237
+ const decoder = new TextDecoder("utf-8", { fatal: true });
238
+ let buffer = "";
239
+ let data = [];
240
+ let eventName = "";
241
+ let frameBytes = 0;
242
+ async function line(value) {
243
+ if (!value) {
244
+ if (data.length) {
245
+ if (eventName !== "broadcast")
246
+ throw new BroadcastClientError("Unknown broadcast frame", false);
247
+ const frame = JSON.parse(data.join("\n"));
248
+ if (!frame || typeof frame !== "object")
249
+ throw new BroadcastClientError("Invalid broadcast frame", false);
250
+ const message = frame;
251
+ const entry = typeof message.id === "string" ? byId.get(message.id) : undefined;
252
+ if (!entry || typeof message.type !== "string")
253
+ throw new BroadcastClientError("Invalid broadcast subscription frame", false);
254
+ if (entry.blocked || entry.nextAttemptAt > Date.now()) {
255
+ data = [];
256
+ eventName = "";
257
+ frameBytes = 0;
258
+ return;
259
+ }
260
+ if (message.type === "ready") {
261
+ if (entry.ready)
262
+ throw new BroadcastClientError("Duplicate broadcast readiness", false);
263
+ entry.ready = true;
264
+ entry.failures = 0;
265
+ entry.nextAttemptAt = 0;
266
+ notify(entry);
267
+ for (const observer of entry.observers)
268
+ invoke(observer, observer.onSync);
269
+ }
270
+ else if (message.type === "event") {
271
+ if (!entry.ready || typeof message.event !== "string")
272
+ throw new BroadcastClientError("Event before broadcast readiness", false);
273
+ const event = await abortable(parseChannelEvent(entry.channel, {
274
+ event: message.event,
275
+ data: message.data,
276
+ }), abort.signal);
277
+ if (live())
278
+ for (const observer of entry.observers)
279
+ invoke(observer, () => observer.onEvent(event));
280
+ }
281
+ else if (message.type === "rejected" ||
282
+ message.type === "unavailable") {
283
+ if (typeof message.status !== "number" ||
284
+ !Number.isInteger(message.status) ||
285
+ message.status < 400 ||
286
+ message.status > 599)
287
+ throw new BroadcastClientError("Invalid broadcast failure", false);
288
+ const retryable = message.type === "unavailable";
289
+ if (retryable !== (message.status === 429 || message.status >= 500))
290
+ throw new BroadcastClientError("Invalid broadcast failure classification", false);
291
+ const retryAfter = message.retryAfterMs;
292
+ if (retryAfter !== undefined &&
293
+ (typeof retryAfter !== "number" ||
294
+ !Number.isFinite(retryAfter) ||
295
+ retryAfter < 0))
296
+ throw new BroadcastClientError("Invalid broadcast retry delay", false);
297
+ fail(entry, new BroadcastClientError("Broadcast subscription is unavailable", retryable, message.status), typeof retryAfter === "number" ? retryAfter : 0);
298
+ scheduleRetry();
299
+ }
300
+ else
301
+ throw new BroadcastClientError("Unknown broadcast control frame", false);
302
+ if (included.every((entry) => entry.ready ||
303
+ entry.blocked ||
304
+ entry.nextAttemptAt > Date.now())) {
305
+ if (readiness !== undefined)
306
+ clearTimeout(readiness);
307
+ readiness = undefined;
308
+ }
309
+ if (included.every((entry) => entry.blocked || entry.nextAttemptAt > Date.now())) {
310
+ terminal = true;
311
+ abort.abort();
312
+ }
313
+ }
314
+ data = [];
315
+ eventName = "";
316
+ frameBytes = 0;
317
+ return;
318
+ }
319
+ frameBytes += new TextEncoder().encode(value).byteLength;
320
+ if (frameBytes >
321
+ broadcastLimits.payloadBytes + broadcastLimits.requestBytes)
322
+ throw new BroadcastClientError("Broadcast frame exceeds the size limit", false);
323
+ if (value.startsWith(":"))
324
+ return;
325
+ const colon = value.indexOf(":");
326
+ const field = colon < 0 ? value : value.slice(0, colon);
327
+ const content = colon < 0 ? "" : value.slice(colon + 1).replace(/^ /, "");
328
+ if (field === "data")
329
+ data.push(content);
330
+ else if (field === "event")
331
+ eventName = content;
332
+ else if (field === "id" || field === "retry")
333
+ throw new BroadcastClientError("Broadcast replay fields are not supported", false);
334
+ }
335
+ while (live()) {
336
+ const chunk = await abortable(reader.read(), abort.signal);
337
+ if (!live() || chunk.done)
338
+ break;
339
+ arm(broadcastLimits.heartbeatMs * 2 + 5_000);
340
+ if (chunk.value.byteLength > broadcastLimits.bufferedBytes)
341
+ throw new BroadcastClientError("Broadcast stream exceeds the buffer limit", false);
342
+ try {
343
+ buffer += decoder.decode(chunk.value, { stream: true });
344
+ }
345
+ catch {
346
+ throw new BroadcastClientError("Invalid broadcast text encoding", false);
347
+ }
348
+ if (new TextEncoder().encode(buffer).byteLength >
349
+ broadcastLimits.bufferedBytes)
350
+ throw new BroadcastClientError("Broadcast stream exceeds the buffer limit", false);
351
+ for (;;) {
352
+ const match = /\r\n|\r|\n/.exec(buffer);
353
+ if (!match)
354
+ break;
355
+ if (match[0] === "\r" && match.index === buffer.length - 1)
356
+ break;
357
+ const value = buffer.slice(0, match.index);
358
+ buffer = buffer.slice(match.index + match[0].length);
359
+ await line(value);
360
+ if (!live())
361
+ break;
362
+ }
363
+ }
364
+ }
365
+ catch (error) {
366
+ if (current === generation &&
367
+ !closed &&
368
+ error instanceof BroadcastClientError &&
369
+ !error.retryable) {
370
+ terminal = true;
371
+ for (const entry of included)
372
+ fail(entry, error);
373
+ }
374
+ else if (current === generation &&
375
+ !closed &&
376
+ (error instanceof BroadcastValidationError ||
377
+ (reading && !abort.signal.aborted && error instanceof SyntaxError))) {
378
+ terminal = true;
379
+ for (const entry of included)
380
+ fail(entry, new BroadcastClientError("Invalid broadcast payload", false));
381
+ }
382
+ }
383
+ finally {
384
+ if (timer !== undefined)
385
+ clearTimeout(timer);
386
+ if (lifetime !== undefined)
387
+ clearTimeout(lifetime);
388
+ if (readiness !== undefined)
389
+ clearTimeout(readiness);
390
+ abort.abort();
391
+ void reader?.cancel().catch(() => undefined);
392
+ if (current === generation && !closed) {
393
+ controller = undefined;
394
+ if (!terminal)
395
+ for (const entry of included) {
396
+ if (!entry.blocked && entry.nextAttemptAt <= Date.now())
397
+ fail(entry, new BroadcastClientError("Broadcast connection interrupted", true));
398
+ }
399
+ scheduleRetry();
400
+ }
401
+ }
402
+ }
403
+ function wake() {
404
+ if (typeof document !== "undefined" &&
405
+ document.visibilityState === "hidden")
406
+ return;
407
+ restart();
408
+ }
409
+ if (typeof window !== "undefined")
410
+ window.addEventListener("online", wake);
411
+ if (typeof document !== "undefined")
412
+ document.addEventListener("visibilitychange", wake);
413
+ return {
414
+ subscribe(channel, subscriptionOptions) {
415
+ if (closed)
416
+ throw new BroadcastClientError("Broadcast client is closed", false);
417
+ let entry;
418
+ let invalid = false;
419
+ const observer = {
420
+ ...subscriptionOptions,
421
+ active: true,
422
+ validation: new AbortController(),
423
+ onEvent: (event) => subscriptionOptions.onEvent(event),
424
+ };
425
+ observers.add(observer);
426
+ const validationTimeout = setTimeout(() => observer.validation.abort(), broadcastLimits.readyTimeoutMs);
427
+ void abortable(parseChannelParams(channel, subscriptionOptions.params), observer.validation.signal)
428
+ .then((params) => {
429
+ if (!observer.active || closed)
430
+ return;
431
+ const key = channelKey(channel.name, params);
432
+ entry = entries.get(key);
433
+ if (!entry) {
434
+ if (entries.size >= broadcastLimits.subscriptions)
435
+ throw new BroadcastClientError("Broadcast client supports at most 20 distinct subscriptions", false);
436
+ entry = {
437
+ id: String(++nextId),
438
+ key,
439
+ channel,
440
+ params,
441
+ observers: new Set(),
442
+ blocked: false,
443
+ ready: false,
444
+ failures: 0,
445
+ nextAttemptAt: 0,
446
+ };
447
+ entries.set(key, entry);
448
+ entry.observers.add(observer);
449
+ restart();
450
+ }
451
+ else {
452
+ if (entry.channel !== channel)
453
+ throw new BroadcastClientError(`Conflicting definitions for channel ${channel.name}`, false);
454
+ entry.observers.add(observer);
455
+ invoke(observer, () => observer.onStatusChange?.(status(entry)));
456
+ if (entry.ready)
457
+ invoke(observer, observer.onSync);
458
+ }
459
+ })
460
+ .catch((error) => {
461
+ invalid = true;
462
+ report(observer, error);
463
+ invoke(observer, () => observer.onStatusChange?.("blocked"));
464
+ })
465
+ .finally(() => clearTimeout(validationTimeout));
466
+ return {
467
+ getStatus: () => !observer.active || closed
468
+ ? "closed"
469
+ : invalid
470
+ ? "blocked"
471
+ : status(entry),
472
+ unsubscribe() {
473
+ if (!observer.active)
474
+ return;
475
+ observer.active = false;
476
+ observer.validation.abort();
477
+ observers.delete(observer);
478
+ entry?.observers.delete(observer);
479
+ if (entry &&
480
+ !entry.observers.size &&
481
+ entries.get(entry.key) === entry) {
482
+ entries.delete(entry.key);
483
+ restart();
484
+ }
485
+ },
486
+ };
487
+ },
488
+ getRequestHeaders: () => ({ "X-Beignet-Broadcast-Client": clientId }),
489
+ getStatus: () => status(),
490
+ resume() {
491
+ for (const entry of entries.values()) {
492
+ entry.blocked = false;
493
+ entry.nextAttemptAt = 0;
494
+ entry.failures = 0;
495
+ }
496
+ restart();
497
+ },
498
+ close() {
499
+ if (closed)
500
+ return;
501
+ closed = true;
502
+ generation++;
503
+ controller?.abort();
504
+ clearRetry();
505
+ if (typeof window !== "undefined")
506
+ window.removeEventListener("online", wake);
507
+ if (typeof document !== "undefined")
508
+ document.removeEventListener("visibilitychange", wake);
509
+ for (const observer of observers) {
510
+ invoke(observer, () => observer.onStatusChange?.("closed"));
511
+ observer.active = false;
512
+ observer.validation.abort();
513
+ }
514
+ observers.clear();
515
+ entries.clear();
516
+ },
517
+ };
518
+ }
519
+ //# 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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"}
@@ -0,0 +1,43 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ /** Browser-visible channel contract. Authorization belongs in a server binding. */
3
+ export interface ChannelDefinition<Name extends string = string, Params extends StandardSchemaV1<unknown, Record<string, string>> = StandardSchemaV1<unknown, Record<string, string>>, Events extends Record<string, StandardSchemaV1> = Record<string, StandardSchemaV1>> {
4
+ readonly kind: "channel";
5
+ readonly name: Name;
6
+ readonly params: Params;
7
+ readonly events: Events;
8
+ }
9
+ export type InferChannelParams<C extends ChannelDefinition> = StandardSchemaV1.InferOutput<C["params"]>;
10
+ export type InferChannelEvent<C extends ChannelDefinition> = {
11
+ [Event in keyof C["events"] & string]: {
12
+ event: Event;
13
+ data: StandardSchemaV1.InferOutput<C["events"][Event]>;
14
+ };
15
+ }[keyof C["events"] & string];
16
+ /** Fixed protocol limits shared by clients, endpoints, and providers. */
17
+ export declare const broadcastLimits: Readonly<{
18
+ subscriptions: 20;
19
+ requestBytes: 8192;
20
+ payloadBytes: 65536;
21
+ bufferedBytes: 1048576;
22
+ maxLifetimeMs: 60000;
23
+ heartbeatMs: 25000;
24
+ readyTimeoutMs: 10000;
25
+ }>;
26
+ /** Invalid channel configuration or untrusted protocol input. */
27
+ export declare class BroadcastValidationError extends Error {
28
+ constructor(message: string);
29
+ }
30
+ export declare function defineChannel<const Name extends string, Params extends StandardSchemaV1<unknown, Record<string, string>>, const Events extends Record<string, StandardSchemaV1>>(name: Name, options: {
31
+ params: Params;
32
+ events: Events;
33
+ }): ChannelDefinition<Name, Params, Events>;
34
+ /** Provider and transport boundary validation. Uses parsed, canonical parameters. */
35
+ export declare function parseChannelParams<C extends ChannelDefinition>(channel: C, input: unknown): Promise<InferChannelParams<C>>;
36
+ /** Provider and browser boundary validation. Event names select their schema. */
37
+ export declare function parseChannelEvent<C extends ChannelDefinition>(channel: C, input: {
38
+ event: string;
39
+ data: unknown;
40
+ }): Promise<InferChannelEvent<C>>;
41
+ /** Collision-free identity independent of parameter property order. Parse parameters first. */
42
+ export declare function channelKey(channel: string, params: Readonly<Record<string, string>>): string;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/broadcasting/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,mFAAmF;AACnF,MAAM,WAAW,iBAAiB,CAChC,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,gBAAgB,CAC7B,OAAO,EACP,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACrD,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM,CACtD,MAAM,EACN,gBAAgB,CACjB;IAED,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,iBAAiB,IACxD,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5C,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,IAAI;KAC1D,KAAK,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;KACxD;CACF,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC;AAE9B,yEAAyE;AACzE,eAAO,MAAM,eAAe;;;;;;;;EAQ1B,CAAC;AAEH,iEAAiE;AACjE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAID,wBAAgB,aAAa,CAC3B,KAAK,CAAC,IAAI,SAAS,MAAM,EACzB,MAAM,SAAS,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAChE,KAAK,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAErD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAezC;AA+BD,qFAAqF;AACrF,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,iBAAiB,EAClE,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAyBhC;AAED,iFAAiF;AACjF,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,EACjE,OAAO,EAAE,CAAC,EACV,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAmB/B;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,MAAM,CAKR"}