@anvia/server 0.7.6 → 1.0.0-rc.10

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.
package/README.md CHANGED
@@ -1,27 +1,44 @@
1
1
  # @anvia/server
2
2
 
3
- Server-side stream helpers for Anvia applications.
3
+ Server response helpers for the Anvia client protocol and explicitly generic event streams.
4
+
5
+ ## Client protocol responses
6
+
7
+ Adapt native runtime events at the server boundary, then frame them for the client:
4
8
 
5
9
  ```ts
6
- import { createUIStreamResponse } from "@anvia/server";
10
+ import { completionToClientStream, parseClientStreamRequest } from "@anvia/client";
11
+ import { streamCompletion } from "@anvia/core";
12
+ import { createClientStreamResponse } from "@anvia/server";
7
13
 
8
- return createUIStreamResponse(uiEvents, {
9
- format: "jsonl",
14
+ const body = parseClientStreamRequest(await request.json());
15
+ if (body.type !== "messages") throw new Error("This completion endpoint accepts messages only.");
16
+ const events = completionToClientStream({
17
+ events: streamCompletion({ model, messages: body.messages }),
10
18
  });
19
+
20
+ return createClientStreamResponse({ events }); // JSONL by default
11
21
  ```
12
22
 
13
- ## Exports
14
-
15
- - `createEventStream(events, options)` returns a streaming `Response`.
16
- - `createEventStream({ resume })` continues a previously started resumable stream.
17
- - `createUIStreamResponse(events, options)` returns a streaming `Response` for `UIStreamEvent` values.
18
- - `createUIStreamResponse({ resume })` continues a resumable UI stream.
19
- - `createJsonlStream(events, options)` returns a JSONL `ReadableStream<Uint8Array>`.
20
- - `createSseStream(events, options)` returns a Server-Sent Event `ReadableStream<Uint8Array>`.
21
- - `createResumableStream(events, options)` wraps events in resumable stream envelopes.
22
- - `resumeStreamEvents(options)` replays and tails events from a `ResumableStreamStore`.
23
- - `createMemoryResumableStreamStore()` creates a single-process, non-durable resumable stream store.
24
-
25
- JSONL is the default transport format. Use `format: "sse"` when you need `text/event-stream` compatibility.
26
- Pass `resumable: { id, store }` to `createEventStream` when clients need to recover streams after
27
- navigation or reload. Continue those streams with `createEventStream({ resume: { streamId, after, store } })`.
23
+ `createClientStreamResponse({ events, ...options })` always emits `stream_start`, ordered
24
+ `stream_event` frames, and `stream_end`, and sets
25
+ `x-anvia-stream-protocol: anvia.client.v3`. Use `format: "sse"` for SSE framing.
26
+
27
+ For resumable streams, pass `{ resumable: { streamId, store } }` when creating the response and
28
+ call `resumeClientStreamResponse({ streamId, after, store })` for a resume request.
29
+
30
+ ## Generic event responses
31
+
32
+ `createEventStreamResponse({ events, ...options })` and `resumeEventStreamResponse(options)` are
33
+ separate, generic helpers. They serialize the event type supplied by the application and do not
34
+ claim that it is the Anvia client protocol.
35
+
36
+ The lower-level exports are:
37
+
38
+ - `createJsonlStream({ events, ...options })`
39
+ - `createSseStream({ events, ...options })`
40
+ - `createResumableStream({ events, ...options })`
41
+ - `resumeStreamEvents(options)`
42
+ - `createMemoryResumableStreamStore()`
43
+
44
+ There are no compatibility aliases for the removed ambiguous response APIs.
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { UIStreamEvent } from '@anvia/core/ui';
1
+ import { ClientMetadata, ClientDataMap, CLIENT_STREAM_PROTOCOL, ClientStreamEvent, ClientMetadataSchema, ClientDataSchemas, ClientStream } from '@anvia/client';
2
2
 
3
3
  type EventStreamFormat = "jsonl" | "sse";
4
4
  type EventStreamErrorEvent = {
5
5
  type: "error";
6
6
  error: unknown;
7
7
  };
8
- type CreateEventStreamOptions<TEvent> = {
8
+ type CreateEventStreamResponseOptions<TEvent> = {
9
9
  format?: EventStreamFormat;
10
10
  headers?: HeadersInit;
11
11
  status?: number;
@@ -14,16 +14,14 @@ type CreateEventStreamOptions<TEvent> = {
14
14
  jsonl?: JsonlStreamOptions<TEvent>;
15
15
  sse?: SseStreamOptions<TEvent>;
16
16
  };
17
- type CreateEventStreamResumeOptions<TEvent> = {
17
+ type ResumeEventStreamResponseOptions<TEvent> = {
18
18
  format?: EventStreamFormat;
19
19
  headers?: HeadersInit;
20
20
  status?: number;
21
21
  statusText?: string;
22
- resume: {
23
- streamId: string;
24
- after: number;
25
- store: ResumableStreamStore<TEvent>;
26
- };
22
+ streamId: string;
23
+ after: number;
24
+ store: ResumableStreamStore<TEvent>;
27
25
  jsonl?: JsonlStreamOptions<ResumableStreamEnvelope<TEvent>>;
28
26
  sse?: SseStreamOptions<ResumableStreamEnvelope<TEvent>>;
29
27
  };
@@ -97,17 +95,54 @@ interface ResumableStreamStore<TEvent = unknown> {
97
95
  close(input: ResumableStreamCloseInput): Promise<ResumableStreamState>;
98
96
  }
99
97
 
100
- declare function createJsonlStream<TEvent>(events: AsyncIterable<TEvent>, options?: JsonlStreamOptions<TEvent>): ReadableStream<Uint8Array>;
98
+ type ClientResponseOptions<Metadata extends ClientMetadata, Data extends ClientDataMap> = {
99
+ format?: EventStreamFormat;
100
+ headers?: HeadersInit;
101
+ status?: number;
102
+ statusText?: string;
103
+ metadataSchema?: ClientMetadataSchema<Metadata>;
104
+ dataSchemas?: ClientDataSchemas<Data>;
105
+ sse?: {
106
+ retry?: number;
107
+ };
108
+ };
109
+ type ClientResumableEvent<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = {
110
+ protocol: typeof CLIENT_STREAM_PROTOCOL;
111
+ event: ClientStreamEvent<Metadata, Data>;
112
+ };
113
+ type CreateClientStreamResponseOptions<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = ClientResponseOptions<Metadata, Data> & {
114
+ events: ClientStream<Metadata, Data>;
115
+ streamId?: string;
116
+ resumable?: {
117
+ streamId: string;
118
+ store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>;
119
+ };
120
+ };
121
+ type ResumeClientStreamResponseOptions<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = ClientResponseOptions<Metadata, Data> & {
122
+ streamId: string;
123
+ after: number;
124
+ store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>;
125
+ };
126
+ declare function createClientStreamResponse<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap>(options: CreateClientStreamResponseOptions<Metadata, Data>): Response;
127
+ declare function resumeClientStreamResponse<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap>(options: ResumeClientStreamResponseOptions<Metadata, Data>): Response;
128
+
129
+ declare function createJsonlStream<TEvent>(options: JsonlStreamOptions<TEvent> & {
130
+ events: AsyncIterable<TEvent>;
131
+ }): ReadableStream<Uint8Array>;
101
132
 
102
- declare function createEventStream<TEvent>(events: AsyncIterable<TEvent>, options?: CreateEventStreamOptions<TEvent>): Response;
103
- declare function createEventStream<TEvent>(options: CreateEventStreamResumeOptions<TEvent>): Response;
104
- declare function createUIStreamResponse(events: AsyncIterable<UIStreamEvent>, options?: CreateEventStreamOptions<UIStreamEvent>): Response;
105
- declare function createUIStreamResponse(options: CreateEventStreamResumeOptions<UIStreamEvent>): Response;
133
+ declare function createEventStreamResponse<TEvent>(options: CreateEventStreamResponseOptions<TEvent> & {
134
+ events: AsyncIterable<TEvent>;
135
+ }): Response;
136
+ declare function resumeEventStreamResponse<TEvent>(options: ResumeEventStreamResponseOptions<TEvent>): Response;
106
137
 
107
- declare function createResumableStream<TEvent>(events: AsyncIterable<TEvent>, options: CreateResumableStreamOptions<TEvent>): AsyncIterable<ResumableStreamEnvelope<TEvent>>;
138
+ declare function createResumableStream<TEvent>(options: CreateResumableStreamOptions<TEvent> & {
139
+ events: AsyncIterable<TEvent>;
140
+ }): AsyncIterable<ResumableStreamEnvelope<TEvent>>;
108
141
  declare function resumeStreamEvents<TEvent>(options: ResumeStreamEventsOptions<TEvent>): AsyncIterable<ResumableStreamEnvelope<TEvent>>;
109
142
  declare function createMemoryResumableStreamStore<TEvent = unknown>(): ResumableStreamStore<TEvent>;
110
143
 
111
- declare function createSseStream<TEvent>(events: AsyncIterable<TEvent>, options?: SseStreamOptions<TEvent>): ReadableStream<Uint8Array>;
144
+ declare function createSseStream<TEvent>(options: SseStreamOptions<TEvent> & {
145
+ events: AsyncIterable<TEvent>;
146
+ }): ReadableStream<Uint8Array>;
112
147
 
113
- export { type CreateEventStreamOptions, type CreateEventStreamResumeOptions, type CreateResumableStreamOptions, type EventStreamErrorEvent, type EventStreamFormat, type JsonlStreamOptions, type ResumableStreamAppendInput, type ResumableStreamCloseInput, type ResumableStreamEnvelope, type ResumableStreamFinalStatus, type ResumableStreamOpenInput, type ResumableStreamRecord, type ResumableStreamState, type ResumableStreamStatus, type ResumableStreamStatusInput, type ResumableStreamStore, type ResumableStreamSubscribeInput, type ResumeStreamEventsOptions, type SseStreamOptions, createEventStream, createJsonlStream, createMemoryResumableStreamStore, createResumableStream, createSseStream, createUIStreamResponse, resumeStreamEvents };
148
+ export { type ClientResumableEvent, type CreateClientStreamResponseOptions, type CreateEventStreamResponseOptions, type CreateResumableStreamOptions, type EventStreamErrorEvent, type EventStreamFormat, type JsonlStreamOptions, type ResumableStreamAppendInput, type ResumableStreamCloseInput, type ResumableStreamEnvelope, type ResumableStreamFinalStatus, type ResumableStreamOpenInput, type ResumableStreamRecord, type ResumableStreamState, type ResumableStreamStatus, type ResumableStreamStatusInput, type ResumableStreamStore, type ResumableStreamSubscribeInput, type ResumeClientStreamResponseOptions, type ResumeEventStreamResponseOptions, type ResumeStreamEventsOptions, type SseStreamOptions, createClientStreamResponse, createEventStreamResponse, createJsonlStream, createMemoryResumableStreamStore, createResumableStream, createSseStream, resumeClientStreamResponse, resumeEventStreamResponse, resumeStreamEvents };
package/dist/index.js CHANGED
@@ -1,3 +1,11 @@
1
+ // src/client-response.ts
2
+ import {
3
+ CLIENT_STREAM_PROTOCOL,
4
+ ClientProtocolError,
5
+ createClientId,
6
+ parseClientStreamEvent
7
+ } from "@anvia/client";
8
+
1
9
  // src/errors.ts
2
10
  function errorEvent(error) {
3
11
  return {
@@ -16,9 +24,9 @@ function serializeError(error) {
16
24
  }
17
25
 
18
26
  // src/jsonl.ts
19
- function createJsonlStream(events, options = {}) {
27
+ function createJsonlStream(options) {
20
28
  const encoder = new TextEncoder();
21
- const iterator = events[Symbol.asyncIterator]();
29
+ const iterator = options.events[Symbol.asyncIterator]();
22
30
  const serialize = options.serialize ?? serializeJson;
23
31
  return new ReadableStream({
24
32
  async pull(controller) {
@@ -46,7 +54,7 @@ function serializeJson(value) {
46
54
  }
47
55
 
48
56
  // src/resumable.ts
49
- function createResumableStream(events, options) {
57
+ function createResumableStream(options) {
50
58
  const streamId = options.id;
51
59
  let openPromise;
52
60
  function start() {
@@ -54,7 +62,7 @@ function createResumableStream(events, options) {
54
62
  return openPromise;
55
63
  }
56
64
  openPromise = options.store.open({ streamId }).then(() => void 0);
57
- void drainResumableStream(events, options, openPromise);
65
+ void drainResumableStream(options.events, options, openPromise);
58
66
  return openPromise;
59
67
  }
60
68
  return {
@@ -279,10 +287,10 @@ function createAsyncQueue() {
279
287
  }
280
288
 
281
289
  // src/sse.ts
282
- function createSseStream(events, options = {}) {
290
+ function createSseStream(options) {
283
291
  validateSseOptions(options);
284
292
  const encoder = new TextEncoder();
285
- const iterator = events[Symbol.asyncIterator]();
293
+ const iterator = options.events[Symbol.asyncIterator]();
286
294
  const serialize = options.serialize ?? serializeJson2;
287
295
  return new ReadableStream({
288
296
  start(controller) {
@@ -350,28 +358,24 @@ function validateSseEventName(name) {
350
358
  }
351
359
 
352
360
  // src/response.ts
353
- function createEventStream(eventsOrOptions, options = {}) {
354
- if (isResumeOptions(eventsOrOptions)) {
355
- const resume = eventsOrOptions.resume;
356
- return createEventStreamResponse(
357
- resumeStreamEvents({
358
- id: resume.streamId,
359
- after: resume.after,
360
- store: resume.store
361
- }),
362
- copyResponseOptions(eventsOrOptions)
363
- );
364
- }
365
- const eventsForResponse = options.resumable === void 0 ? eventsOrOptions : createResumableStream(eventsOrOptions, options.resumable);
366
- return createEventStreamResponse(eventsForResponse, copyResponseOptions(options));
361
+ function createEventStreamResponse(options) {
362
+ const eventsForResponse = options.resumable === void 0 ? options.events : createResumableStream({ events: options.events, ...options.resumable });
363
+ return encodeEventStreamResponse({
364
+ events: eventsForResponse,
365
+ ...copyResponseOptions(options)
366
+ });
367
367
  }
368
- function createUIStreamResponse(eventsOrOptions, options = {}) {
369
- if (isResumeOptions(eventsOrOptions)) {
370
- return createEventStream(eventsOrOptions);
371
- }
372
- return createEventStream(eventsOrOptions, options);
368
+ function resumeEventStreamResponse(options) {
369
+ return encodeEventStreamResponse({
370
+ events: resumeStreamEvents({
371
+ id: options.streamId,
372
+ after: options.after,
373
+ store: options.store
374
+ }),
375
+ ...copyResponseOptions(options)
376
+ });
373
377
  }
374
- function createEventStreamResponse(events, options) {
378
+ function encodeEventStreamResponse(options) {
375
379
  const format = options.format ?? "jsonl";
376
380
  const headers = new Headers(options.headers);
377
381
  if (!headers.has("cache-control")) {
@@ -383,7 +387,7 @@ function createEventStreamResponse(events, options) {
383
387
  if (!headers.has("x-accel-buffering")) {
384
388
  headers.set("x-accel-buffering", "no");
385
389
  }
386
- const body = format === "sse" ? createSseStream(events, options.sse) : createJsonlStream(events, options.jsonl);
390
+ const body = format === "sse" ? createSseStream({ events: options.events, ...options.sse }) : createJsonlStream({ events: options.events, ...options.jsonl });
387
391
  if (!headers.has("content-type")) {
388
392
  headers.set(
389
393
  "content-type",
@@ -413,26 +417,206 @@ function copyResponseOptions(options) {
413
417
  }
414
418
  return next;
415
419
  }
416
- function isResumeOptions(value) {
417
- if (typeof value !== "object" || value === null || Symbol.asyncIterator in value) {
418
- return false;
420
+
421
+ // src/client-response.ts
422
+ function createClientStreamResponse(options) {
423
+ const frames = options.resumable === void 0 ? frameClientStream(
424
+ options.events,
425
+ options.streamId ?? createClientId("stream"),
426
+ options.metadataSchema,
427
+ options.dataSchemas
428
+ ) : frameResumableClientStream(
429
+ options.events,
430
+ options.resumable.streamId,
431
+ options.resumable.store,
432
+ options.metadataSchema,
433
+ options.dataSchemas
434
+ );
435
+ return clientResponse(frames, options);
436
+ }
437
+ function resumeClientStreamResponse(options) {
438
+ return clientResponse(
439
+ resumeClientFrames(
440
+ options.streamId,
441
+ options.after,
442
+ options.store,
443
+ options.metadataSchema,
444
+ options.dataSchemas
445
+ ),
446
+ options
447
+ );
448
+ }
449
+ function frameClientStream(events, streamId, metadataSchema, dataSchemas) {
450
+ return propagateCancellation(events, (source) => ({
451
+ async *[Symbol.asyncIterator]() {
452
+ yield {
453
+ type: "stream_start",
454
+ protocol: CLIENT_STREAM_PROTOCOL,
455
+ streamId,
456
+ eventId: 0,
457
+ resumable: false
458
+ };
459
+ let eventId = 0;
460
+ let status = "completed";
461
+ try {
462
+ for await (const value of source) {
463
+ const event = parseEvent(value, metadataSchema, dataSchemas);
464
+ eventId += 1;
465
+ yield {
466
+ type: "stream_event",
467
+ streamId,
468
+ eventId,
469
+ event
470
+ };
471
+ }
472
+ } catch {
473
+ status = "error";
474
+ }
475
+ yield { type: "stream_end", streamId, eventId, status };
476
+ }
477
+ }));
478
+ }
479
+ function frameResumableClientStream(events, streamId, store, metadataSchema, dataSchemas) {
480
+ let open;
481
+ function start() {
482
+ if (open !== void 0) return open;
483
+ open = store.open({ streamId }).then(() => void 0);
484
+ void drainClientStream(events, streamId, store, metadataSchema, dataSchemas, open);
485
+ return open;
486
+ }
487
+ return {
488
+ async *[Symbol.asyncIterator]() {
489
+ try {
490
+ await start();
491
+ } catch {
492
+ yield startFrame(streamId, true);
493
+ yield endFrame(streamId, 0, "error");
494
+ return;
495
+ }
496
+ yield* resumeClientFrames(streamId, 0, store, metadataSchema, dataSchemas);
497
+ }
498
+ };
499
+ }
500
+ async function drainClientStream(events, streamId, store, metadataSchema, dataSchemas, open) {
501
+ try {
502
+ await open;
503
+ for await (const value of events) {
504
+ await store.append({
505
+ streamId,
506
+ event: {
507
+ protocol: CLIENT_STREAM_PROTOCOL,
508
+ event: parseEvent(value, metadataSchema, dataSchemas)
509
+ }
510
+ });
511
+ }
512
+ await store.close({ streamId, status: "completed" });
513
+ } catch {
514
+ try {
515
+ await store.close({ streamId, status: "error" });
516
+ } catch {
517
+ }
518
+ }
519
+ }
520
+ async function* resumeClientFrames(streamId, after, store, metadataSchema, dataSchemas) {
521
+ yield startFrame(streamId, true);
522
+ let eventId = after;
523
+ let invalid = false;
524
+ try {
525
+ for await (const record of store.subscribe({ streamId, after })) {
526
+ const event = parseResumableEvent(record.event, metadataSchema, dataSchemas);
527
+ eventId = record.eventId;
528
+ yield { type: "stream_event", streamId, eventId, event };
529
+ }
530
+ } catch {
531
+ invalid = true;
419
532
  }
420
- if (!("resume" in value) || typeof value.resume !== "object" || value.resume === null) {
421
- return false;
533
+ try {
534
+ const state = await store.status({ streamId });
535
+ const status = invalid || state.status === "running" ? "error" : state.status;
536
+ yield endFrame(streamId, Math.max(eventId, state.lastEventId), status);
537
+ } catch {
538
+ yield endFrame(streamId, eventId, "error");
422
539
  }
423
- const resume = value.resume;
424
- return typeof resume.streamId === "string" && typeof resume.after === "number" && Number.isFinite(resume.after) && resume.after >= 0 && isResumableStreamStore(resume.store);
425
540
  }
426
- function isResumableStreamStore(value) {
427
- return typeof value === "object" && value !== null && "subscribe" in value && typeof value.subscribe === "function" && "status" in value && typeof value.status === "function";
541
+ function parseResumableEvent(value, metadataSchema, dataSchemas) {
542
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
543
+ throw new ClientProtocolError("Invalid client resumable record.", value);
544
+ }
545
+ const record = value;
546
+ if (record.protocol === "anvia.client.v1") {
547
+ throw new ClientProtocolError("Client resumable protocol v1 is not supported.", value);
548
+ }
549
+ if (record.protocol !== CLIENT_STREAM_PROTOCOL || !("event" in record)) {
550
+ throw new ClientProtocolError(
551
+ "Client resumable records must use the current client protocol.",
552
+ value
553
+ );
554
+ }
555
+ return parseEvent(record.event, metadataSchema, dataSchemas);
556
+ }
557
+ function parseEvent(value, metadataSchema, dataSchemas) {
558
+ const options = {};
559
+ if (metadataSchema !== void 0) options.metadataSchema = metadataSchema;
560
+ if (dataSchemas !== void 0) options.dataSchemas = dataSchemas;
561
+ return parseClientStreamEvent(value, options);
562
+ }
563
+ function startFrame(streamId, resumable) {
564
+ return {
565
+ type: "stream_start",
566
+ protocol: CLIENT_STREAM_PROTOCOL,
567
+ streamId,
568
+ eventId: 0,
569
+ resumable
570
+ };
571
+ }
572
+ function endFrame(streamId, eventId, status) {
573
+ return { type: "stream_end", streamId, eventId, status };
574
+ }
575
+ function clientResponse(frames, options) {
576
+ const headers = new Headers(options.headers);
577
+ headers.set("x-anvia-stream-protocol", CLIENT_STREAM_PROTOCOL);
578
+ const responseOptions = {
579
+ events: frames,
580
+ headers
581
+ };
582
+ if (options.format !== void 0) responseOptions.format = options.format;
583
+ if (options.status !== void 0) responseOptions.status = options.status;
584
+ if (options.statusText !== void 0) responseOptions.statusText = options.statusText;
585
+ if (options.sse !== void 0) responseOptions.sse = options.sse;
586
+ return encodeEventStreamResponse(responseOptions);
587
+ }
588
+ function propagateCancellation(source, transform) {
589
+ return {
590
+ [Symbol.asyncIterator]() {
591
+ const sourceIterator = source[Symbol.asyncIterator]();
592
+ const sharedSource = {
593
+ [Symbol.asyncIterator]: () => sourceIterator
594
+ };
595
+ const outputIterator = transform(sharedSource)[Symbol.asyncIterator]();
596
+ let returned = false;
597
+ return {
598
+ next: () => outputIterator.next(),
599
+ async return() {
600
+ if (returned) return { done: true, value: void 0 };
601
+ returned = true;
602
+ const sourceReturn = sourceIterator.return?.();
603
+ const outputReturn = outputIterator.return?.();
604
+ await Promise.all([sourceReturn, outputReturn]);
605
+ return { done: true, value: void 0 };
606
+ }
607
+ };
608
+ }
609
+ };
428
610
  }
429
611
  export {
430
- createEventStream,
612
+ createClientStreamResponse,
613
+ createEventStreamResponse,
431
614
  createJsonlStream,
432
615
  createMemoryResumableStreamStore,
433
616
  createResumableStream,
434
617
  createSseStream,
435
- createUIStreamResponse,
618
+ resumeClientStreamResponse,
619
+ resumeEventStreamResponse,
436
620
  resumeStreamEvents
437
621
  };
438
622
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/jsonl.ts","../src/resumable.ts","../src/sse.ts","../src/response.ts"],"sourcesContent":["import type { EventStreamErrorEvent } from \"./types\";\n\nexport function errorEvent(error: unknown): EventStreamErrorEvent {\n return {\n type: \"error\",\n error: serializeError(error),\n };\n}\n\nfunction serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n\n return error;\n}\n","import { errorEvent } from \"./errors\";\nimport type { JsonlStreamOptions } from \"./types\";\n\nexport function createJsonlStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options: JsonlStreamOptions<TEvent> = {},\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n const iterator = events[Symbol.asyncIterator]();\n const serialize = options.serialize ?? serializeJson;\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const next = await iterator.next();\n if (next.done === true) {\n controller.close();\n return;\n }\n\n controller.enqueue(encoder.encode(`${serialize(next.value)}\\n`));\n } catch (error) {\n controller.enqueue(encoder.encode(`${serialize(errorEvent(error))}\\n`));\n controller.close();\n }\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction serializeJson(value: unknown): string {\n return JSON.stringify(value);\n}\n","import { errorEvent } from \"./errors\";\nimport type {\n CreateResumableStreamOptions,\n ResumableStreamEnvelope,\n ResumableStreamRecord,\n ResumableStreamState,\n ResumableStreamStatus,\n ResumableStreamStore,\n ResumableStreamSubscribeInput,\n ResumeStreamEventsOptions,\n} from \"./types\";\n\ntype Subscriber<TEvent> = {\n after: number;\n queue: AsyncQueue<ResumableStreamRecord<TEvent>>;\n};\n\ntype MemoryStream<TEvent> = {\n records: ResumableStreamRecord<TEvent>[];\n status: ResumableStreamStatus;\n subscribers: Set<Subscriber<TEvent>>;\n};\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n enqueue(value: T): void;\n close(): void;\n throw(error: unknown): void;\n};\n\nexport function createResumableStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options: CreateResumableStreamOptions<TEvent>,\n): AsyncIterable<ResumableStreamEnvelope<TEvent>> {\n const streamId = options.id;\n let openPromise: Promise<void> | undefined;\n\n function start(): Promise<void> {\n if (openPromise !== undefined) {\n return openPromise;\n }\n\n openPromise = options.store.open({ streamId }).then(() => undefined);\n void drainResumableStream(events, options, openPromise);\n return openPromise;\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n await start();\n yield* resumeStreamEvents({ id: streamId, store: options.store });\n },\n };\n}\n\nexport async function* resumeStreamEvents<TEvent>(\n options: ResumeStreamEventsOptions<TEvent>,\n): AsyncIterable<ResumableStreamEnvelope<TEvent>> {\n const streamId = options.id;\n yield { type: \"stream_start\", streamId, eventId: 0 };\n\n const subscribeInput: ResumableStreamSubscribeInput = { streamId };\n if (options.after !== undefined) {\n subscribeInput.after = options.after;\n }\n for await (const record of options.store.subscribe(subscribeInput)) {\n yield recordToEnvelope(record);\n }\n\n const state = await options.store.status({ streamId });\n yield stateToEndEnvelope<TEvent>(streamId, state);\n}\n\nexport function createMemoryResumableStreamStore<TEvent = unknown>(): ResumableStreamStore<TEvent> {\n const streams = new Map<string, MemoryStream<TEvent>>();\n\n function state(stream: MemoryStream<TEvent> | undefined): ResumableStreamState {\n if (stream === undefined) {\n return { status: \"missing\", lastEventId: 0 };\n }\n return {\n status: stream.status,\n lastEventId: stream.records.at(-1)?.eventId ?? 0,\n };\n }\n\n return {\n async open(input) {\n const existing = streams.get(input.streamId);\n if (existing !== undefined) {\n closeSubscribers(existing);\n }\n\n const stream: MemoryStream<TEvent> = {\n records: [],\n status: \"running\",\n subscribers: new Set(),\n };\n streams.set(input.streamId, stream);\n return state(stream);\n },\n\n async append(input) {\n const stream = streams.get(input.streamId);\n if (stream === undefined) {\n throw new Error(`Resumable stream \"${input.streamId}\" is not open`);\n }\n if (stream.status !== \"running\") {\n throw new Error(`Resumable stream \"${input.streamId}\" is already ${stream.status}`);\n }\n\n const record: ResumableStreamRecord<TEvent> = {\n streamId: input.streamId,\n eventId: stream.records.length + 1,\n event: input.event,\n createdAt: new Date(),\n };\n stream.records.push(record);\n\n for (const subscriber of stream.subscribers) {\n if (record.eventId > subscriber.after) {\n subscriber.queue.enqueue(record);\n }\n }\n\n return record;\n },\n\n subscribe(input) {\n const after = input.after ?? 0;\n return {\n [Symbol.asyncIterator](): AsyncIterator<ResumableStreamRecord<TEvent>> {\n const stream = streams.get(input.streamId);\n const queue = createAsyncQueue<ResumableStreamRecord<TEvent>>();\n if (stream === undefined) {\n queue.close();\n return queue[Symbol.asyncIterator]();\n }\n\n for (const record of stream.records) {\n if (record.eventId > after) {\n queue.enqueue(record);\n }\n }\n\n if (stream.status !== \"running\") {\n queue.close();\n return queue[Symbol.asyncIterator]();\n }\n\n const subscriber: Subscriber<TEvent> = { after, queue };\n stream.subscribers.add(subscriber);\n const iterator = queue[Symbol.asyncIterator]();\n\n return {\n next: () => iterator.next(),\n async return() {\n stream.subscribers.delete(subscriber);\n queue.close();\n return { value: undefined, done: true };\n },\n };\n },\n };\n },\n\n async status(input) {\n return state(streams.get(input.streamId));\n },\n\n async close(input) {\n const stream = streams.get(input.streamId);\n if (stream === undefined) {\n return { status: input.status, lastEventId: 0 };\n }\n stream.status = input.status;\n closeSubscribers(stream);\n return state(stream);\n },\n };\n}\n\nasync function drainResumableStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options: CreateResumableStreamOptions<TEvent>,\n openPromise: Promise<void>,\n): Promise<void> {\n const streamId = options.id;\n try {\n await openPromise;\n for await (const event of events) {\n await options.store.append({ streamId, event });\n }\n await options.store.close({ streamId, status: \"completed\" });\n } catch (error) {\n const event = errorEvent(error);\n try {\n await options.store.append({ streamId, event });\n } catch {\n // The response iterator reports store-open failures; avoid a background rejection.\n }\n try {\n await options.store.close({ streamId, status: \"error\" });\n } catch {\n // The store may not have opened.\n }\n }\n}\n\nfunction recordToEnvelope<TEvent>(\n record: ResumableStreamRecord<TEvent>,\n): ResumableStreamEnvelope<TEvent> {\n return {\n type: \"stream_event\",\n streamId: record.streamId,\n eventId: record.eventId,\n event: record.event,\n };\n}\n\nfunction stateToEndEnvelope<TEvent>(\n streamId: string,\n state: ResumableStreamState,\n): ResumableStreamEnvelope<TEvent> {\n return {\n type: \"stream_end\",\n streamId,\n eventId: state.lastEventId,\n status: state.status,\n };\n}\n\nfunction closeSubscribers<TEvent>(stream: MemoryStream<TEvent>): void {\n for (const subscriber of stream.subscribers) {\n subscriber.queue.close();\n }\n stream.subscribers.clear();\n}\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n function flush(): void {\n while (waiters.length > 0 && values.length > 0) {\n const waiter = waiters.shift();\n const value = values.shift() as T;\n waiter?.resolve({ value, done: false });\n }\n\n if (values.length > 0 || waiters.length === 0 || !closed) {\n return;\n }\n\n while (waiters.length > 0) {\n const waiter = waiters.shift();\n if (waiter === undefined) {\n continue;\n }\n if (error !== undefined) {\n waiter.reject(error);\n } else {\n waiter.resolve({ value: undefined, done: true });\n }\n }\n }\n\n return {\n enqueue(value) {\n if (closed) {\n return;\n }\n values.push(value);\n flush();\n },\n close() {\n closed = true;\n flush();\n },\n throw(thrown) {\n closed = true;\n error = thrown;\n flush();\n },\n [Symbol.asyncIterator]() {\n return {\n next() {\n if (values.length > 0) {\n const value = values.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (error !== undefined) {\n return Promise.reject(error);\n }\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n };\n },\n };\n}\n","import { errorEvent } from \"./errors\";\nimport type { EventStreamErrorEvent, SseStreamOptions } from \"./types\";\n\nexport function createSseStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options: SseStreamOptions<TEvent> = {},\n): ReadableStream<Uint8Array> {\n validateSseOptions(options);\n const encoder = new TextEncoder();\n const iterator = events[Symbol.asyncIterator]();\n const serialize = options.serialize ?? serializeJson;\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n if (options.retry !== undefined) {\n controller.enqueue(encoder.encode(`retry: ${options.retry}\\n\\n`));\n }\n },\n async pull(controller) {\n try {\n const next = await iterator.next();\n if (next.done === true) {\n controller.close();\n return;\n }\n\n controller.enqueue(\n encoder.encode(formatSseEvent(next.value, serialize, options.eventName)),\n );\n } catch (error) {\n const event = errorEvent(error);\n controller.enqueue(encoder.encode(formatSseEvent(event, serialize, options.eventName)));\n controller.close();\n }\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction formatSseEvent<TEvent>(\n event: TEvent | EventStreamErrorEvent,\n serialize: (event: TEvent | EventStreamErrorEvent) => string,\n eventName: SseStreamOptions<TEvent>[\"eventName\"],\n): string {\n const name = typeof eventName === \"function\" ? eventName(event) : eventName;\n const lines: string[] = [];\n\n if (name !== undefined && name.length > 0) {\n validateSseEventName(name);\n lines.push(`event: ${name}`);\n }\n\n for (const line of serialize(event).split(/\\r?\\n/)) {\n lines.push(`data: ${line}`);\n }\n\n lines.push(\"\", \"\");\n return lines.join(\"\\n\");\n}\n\nfunction serializeJson(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction validateSseOptions<TEvent>(options: SseStreamOptions<TEvent>): void {\n if (options.retry !== undefined && !isValidRetry(options.retry)) {\n throw new TypeError(\"SSE retry must be a finite non-negative integer\");\n }\n if (typeof options.eventName === \"string\") {\n validateSseEventName(options.eventName);\n }\n}\n\nfunction isValidRetry(value: number): boolean {\n return Number.isFinite(value) && Number.isInteger(value) && value >= 0;\n}\n\nfunction validateSseEventName(name: string): void {\n for (const character of name) {\n const code = character.charCodeAt(0);\n if (code === 0 || code === 10 || code === 13) {\n throw new TypeError(\"SSE event names must not contain null bytes or line breaks\");\n }\n }\n}\n","import type { UIStreamEvent } from \"@anvia/core/ui\";\nimport { createJsonlStream } from \"./jsonl\";\nimport { createResumableStream, resumeStreamEvents } from \"./resumable\";\nimport { createSseStream } from \"./sse\";\nimport type {\n CreateEventStreamOptions,\n CreateEventStreamResumeOptions,\n EventStreamFormat,\n JsonlStreamOptions,\n ResumableStreamEnvelope,\n ResumableStreamStore,\n SseStreamOptions,\n} from \"./types\";\n\ntype ResponseStreamEvent<TEvent> = TEvent | ResumableStreamEnvelope<TEvent>;\n\ntype EventStreamResponseOptions<TEvent> = {\n format?: EventStreamFormat;\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n jsonl?: JsonlStreamOptions<ResponseStreamEvent<TEvent>>;\n sse?: SseStreamOptions<ResponseStreamEvent<TEvent>>;\n};\n\nexport function createEventStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options?: CreateEventStreamOptions<TEvent>,\n): Response;\nexport function createEventStream<TEvent>(\n options: CreateEventStreamResumeOptions<TEvent>,\n): Response;\nexport function createEventStream<TEvent>(\n eventsOrOptions: AsyncIterable<TEvent> | CreateEventStreamResumeOptions<TEvent>,\n options: CreateEventStreamOptions<TEvent> = {},\n): Response {\n if (isResumeOptions(eventsOrOptions)) {\n const resume = eventsOrOptions.resume;\n return createEventStreamResponse(\n resumeStreamEvents({\n id: resume.streamId,\n after: resume.after,\n store: resume.store,\n }),\n copyResponseOptions(eventsOrOptions),\n );\n }\n\n const eventsForResponse: AsyncIterable<ResponseStreamEvent<TEvent>> =\n options.resumable === undefined\n ? (eventsOrOptions as AsyncIterable<ResponseStreamEvent<TEvent>>)\n : createResumableStream(eventsOrOptions, options.resumable);\n\n return createEventStreamResponse(eventsForResponse, copyResponseOptions(options));\n}\n\nexport function createUIStreamResponse(\n events: AsyncIterable<UIStreamEvent>,\n options?: CreateEventStreamOptions<UIStreamEvent>,\n): Response;\nexport function createUIStreamResponse(\n options: CreateEventStreamResumeOptions<UIStreamEvent>,\n): Response;\nexport function createUIStreamResponse(\n eventsOrOptions: AsyncIterable<UIStreamEvent> | CreateEventStreamResumeOptions<UIStreamEvent>,\n options: CreateEventStreamOptions<UIStreamEvent> = {},\n): Response {\n if (isResumeOptions(eventsOrOptions)) {\n return createEventStream(eventsOrOptions);\n }\n\n return createEventStream(eventsOrOptions, options);\n}\n\nfunction createEventStreamResponse<TEvent>(\n events: AsyncIterable<ResponseStreamEvent<TEvent>>,\n options: EventStreamResponseOptions<TEvent>,\n): Response {\n const format = options.format ?? \"jsonl\";\n const headers = new Headers(options.headers);\n\n if (!headers.has(\"cache-control\")) {\n headers.set(\"cache-control\", \"no-cache, no-transform\");\n }\n if (!headers.has(\"connection\")) {\n headers.set(\"connection\", \"keep-alive\");\n }\n if (!headers.has(\"x-accel-buffering\")) {\n headers.set(\"x-accel-buffering\", \"no\");\n }\n\n const body =\n format === \"sse\"\n ? createSseStream(events, options.sse)\n : createJsonlStream(events, options.jsonl);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\n \"content-type\",\n format === \"sse\" ? \"text/event-stream; charset=utf-8\" : \"application/x-ndjson; charset=utf-8\",\n );\n }\n\n const responseInit: ResponseInit = { headers };\n if (options.status !== undefined) {\n responseInit.status = options.status;\n }\n if (options.statusText !== undefined) {\n responseInit.statusText = options.statusText;\n }\n\n return new Response(body, responseInit);\n}\n\nfunction copyResponseOptions<TEvent>(options: {\n format?: EventStreamFormat;\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n jsonl?: unknown;\n sse?: unknown;\n}): EventStreamResponseOptions<TEvent> {\n const next: EventStreamResponseOptions<TEvent> = {};\n if (options.format !== undefined) next.format = options.format;\n if (options.headers !== undefined) next.headers = options.headers;\n if (options.status !== undefined) next.status = options.status;\n if (options.statusText !== undefined) next.statusText = options.statusText;\n if (options.jsonl !== undefined) {\n next.jsonl = options.jsonl as JsonlStreamOptions<ResponseStreamEvent<TEvent>>;\n }\n if (options.sse !== undefined) {\n next.sse = options.sse as SseStreamOptions<ResponseStreamEvent<TEvent>>;\n }\n return next;\n}\n\nfunction isResumeOptions<TEvent>(\n value: AsyncIterable<TEvent> | CreateEventStreamResumeOptions<TEvent>,\n): value is CreateEventStreamResumeOptions<TEvent> {\n if (typeof value !== \"object\" || value === null || Symbol.asyncIterator in value) {\n return false;\n }\n if (!(\"resume\" in value) || typeof value.resume !== \"object\" || value.resume === null) {\n return false;\n }\n\n const resume = value.resume as {\n streamId?: unknown;\n after?: unknown;\n store?: unknown;\n };\n return (\n typeof resume.streamId === \"string\" &&\n typeof resume.after === \"number\" &&\n Number.isFinite(resume.after) &&\n resume.after >= 0 &&\n isResumableStreamStore(resume.store)\n );\n}\n\nfunction isResumableStreamStore(value: unknown): value is ResumableStreamStore {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"subscribe\" in value &&\n typeof value.subscribe === \"function\" &&\n \"status\" in value &&\n typeof value.status === \"function\"\n );\n}\n"],"mappings":"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","names":["serializeJson"]}
1
+ {"version":3,"sources":["../src/client-response.ts","../src/errors.ts","../src/jsonl.ts","../src/resumable.ts","../src/sse.ts","../src/response.ts"],"sourcesContent":["import {\n CLIENT_STREAM_PROTOCOL,\n type ClientDataMap,\n type ClientDataSchemas,\n type ClientMetadata,\n type ClientMetadataSchema,\n ClientProtocolError,\n type ClientStream,\n type ClientStreamEvent,\n type ClientStreamFrame,\n createClientId,\n parseClientStreamEvent,\n} from \"@anvia/client\";\nimport { encodeEventStreamResponse } from \"./response\";\nimport type { EventStreamFormat, ResumableStreamStore } from \"./types\";\n\ntype ClientResponseOptions<Metadata extends ClientMetadata, Data extends ClientDataMap> = {\n format?: EventStreamFormat;\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n metadataSchema?: ClientMetadataSchema<Metadata>;\n dataSchemas?: ClientDataSchemas<Data>;\n sse?: { retry?: number };\n};\n\nexport type ClientResumableEvent<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n> = {\n protocol: typeof CLIENT_STREAM_PROTOCOL;\n event: ClientStreamEvent<Metadata, Data>;\n};\n\nexport type CreateClientStreamResponseOptions<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n> = ClientResponseOptions<Metadata, Data> & {\n events: ClientStream<Metadata, Data>;\n streamId?: string;\n resumable?: {\n streamId: string;\n store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>;\n };\n};\n\nexport type ResumeClientStreamResponseOptions<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n> = ClientResponseOptions<Metadata, Data> & {\n streamId: string;\n after: number;\n store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>;\n};\n\nexport function createClientStreamResponse<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n>(options: CreateClientStreamResponseOptions<Metadata, Data>): Response {\n const frames =\n options.resumable === undefined\n ? frameClientStream(\n options.events,\n options.streamId ?? createClientId(\"stream\"),\n options.metadataSchema,\n options.dataSchemas,\n )\n : frameResumableClientStream(\n options.events,\n options.resumable.streamId,\n options.resumable.store,\n options.metadataSchema,\n options.dataSchemas,\n );\n return clientResponse(frames, options);\n}\n\nexport function resumeClientStreamResponse<\n Metadata extends ClientMetadata = ClientMetadata,\n Data extends ClientDataMap = ClientDataMap,\n>(options: ResumeClientStreamResponseOptions<Metadata, Data>): Response {\n return clientResponse(\n resumeClientFrames(\n options.streamId,\n options.after,\n options.store,\n options.metadataSchema,\n options.dataSchemas,\n ),\n options,\n );\n}\n\nfunction frameClientStream<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n events: ClientStream<Metadata, Data>,\n streamId: string,\n metadataSchema: ClientMetadataSchema<Metadata> | undefined,\n dataSchemas: ClientDataSchemas<Data> | undefined,\n): AsyncIterable<ClientStreamFrame<Metadata, Data>> {\n return propagateCancellation(events, (source) => ({\n async *[Symbol.asyncIterator]() {\n yield {\n type: \"stream_start\",\n protocol: CLIENT_STREAM_PROTOCOL,\n streamId,\n eventId: 0,\n resumable: false,\n } satisfies ClientStreamFrame<Metadata, Data>;\n let eventId = 0;\n let status: \"completed\" | \"error\" = \"completed\";\n try {\n for await (const value of source) {\n const event = parseEvent(value, metadataSchema, dataSchemas);\n eventId += 1;\n yield {\n type: \"stream_event\",\n streamId,\n eventId,\n event,\n } satisfies ClientStreamFrame<Metadata, Data>;\n }\n } catch {\n status = \"error\";\n }\n yield { type: \"stream_end\", streamId, eventId, status } satisfies ClientStreamFrame<\n Metadata,\n Data\n >;\n },\n }));\n}\n\nfunction frameResumableClientStream<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n events: ClientStream<Metadata, Data>,\n streamId: string,\n store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>,\n metadataSchema: ClientMetadataSchema<Metadata> | undefined,\n dataSchemas: ClientDataSchemas<Data> | undefined,\n): AsyncIterable<ClientStreamFrame<Metadata, Data>> {\n let open: Promise<void> | undefined;\n function start(): Promise<void> {\n if (open !== undefined) return open;\n open = store.open({ streamId }).then(() => undefined);\n void drainClientStream(events, streamId, store, metadataSchema, dataSchemas, open);\n return open;\n }\n return {\n async *[Symbol.asyncIterator]() {\n try {\n await start();\n } catch {\n yield startFrame<Metadata, Data>(streamId, true);\n yield endFrame<Metadata, Data>(streamId, 0, \"error\");\n return;\n }\n yield* resumeClientFrames(streamId, 0, store, metadataSchema, dataSchemas);\n },\n };\n}\n\nasync function drainClientStream<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n events: ClientStream<Metadata, Data>,\n streamId: string,\n store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>,\n metadataSchema: ClientMetadataSchema<Metadata> | undefined,\n dataSchemas: ClientDataSchemas<Data> | undefined,\n open: Promise<void>,\n): Promise<void> {\n try {\n await open;\n for await (const value of events) {\n await store.append({\n streamId,\n event: {\n protocol: CLIENT_STREAM_PROTOCOL,\n event: parseEvent(value, metadataSchema, dataSchemas),\n },\n });\n }\n await store.close({ streamId, status: \"completed\" });\n } catch {\n try {\n await store.close({ streamId, status: \"error\" });\n } catch {\n // A failed store open has no stream to close.\n }\n }\n}\n\nasync function* resumeClientFrames<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n streamId: string,\n after: number,\n store: ResumableStreamStore<ClientResumableEvent<Metadata, Data>>,\n metadataSchema: ClientMetadataSchema<Metadata> | undefined,\n dataSchemas: ClientDataSchemas<Data> | undefined,\n): AsyncIterable<ClientStreamFrame<Metadata, Data>> {\n yield startFrame<Metadata, Data>(streamId, true);\n let eventId = after;\n let invalid = false;\n try {\n for await (const record of store.subscribe({ streamId, after })) {\n const event = parseResumableEvent(record.event, metadataSchema, dataSchemas);\n eventId = record.eventId;\n yield { type: \"stream_event\", streamId, eventId, event };\n }\n } catch {\n invalid = true;\n }\n\n try {\n const state = await store.status({ streamId });\n const status = invalid || state.status === \"running\" ? \"error\" : state.status;\n yield endFrame<Metadata, Data>(streamId, Math.max(eventId, state.lastEventId), status);\n } catch {\n yield endFrame<Metadata, Data>(streamId, eventId, \"error\");\n }\n}\n\nfunction parseResumableEvent<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n value: unknown,\n metadataSchema: ClientMetadataSchema<Metadata> | undefined,\n dataSchemas: ClientDataSchemas<Data> | undefined,\n): ClientStreamEvent<Metadata, Data> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new ClientProtocolError(\"Invalid client resumable record.\", value);\n }\n const record = value as { protocol?: unknown; event?: unknown };\n if (record.protocol === \"anvia.client.v1\") {\n throw new ClientProtocolError(\"Client resumable protocol v1 is not supported.\", value);\n }\n if (record.protocol !== CLIENT_STREAM_PROTOCOL || !(\"event\" in record)) {\n throw new ClientProtocolError(\n \"Client resumable records must use the current client protocol.\",\n value,\n );\n }\n return parseEvent(record.event, metadataSchema, dataSchemas);\n}\n\nfunction parseEvent<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n value: unknown,\n metadataSchema: ClientMetadataSchema<Metadata> | undefined,\n dataSchemas: ClientDataSchemas<Data> | undefined,\n): ClientStreamEvent<Metadata, Data> {\n const options: Parameters<typeof parseClientStreamEvent<Metadata, Data>>[1] = {};\n if (metadataSchema !== undefined) options.metadataSchema = metadataSchema;\n if (dataSchemas !== undefined) options.dataSchemas = dataSchemas;\n return parseClientStreamEvent<Metadata, Data>(value, options);\n}\n\nfunction startFrame<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n streamId: string,\n resumable: boolean,\n): ClientStreamFrame<Metadata, Data> {\n return {\n type: \"stream_start\",\n protocol: CLIENT_STREAM_PROTOCOL,\n streamId,\n eventId: 0,\n resumable,\n };\n}\n\nfunction endFrame<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n streamId: string,\n eventId: number,\n status: \"completed\" | \"error\" | \"missing\",\n): ClientStreamFrame<Metadata, Data> {\n return { type: \"stream_end\", streamId, eventId, status };\n}\n\nfunction clientResponse<Metadata extends ClientMetadata, Data extends ClientDataMap>(\n frames: AsyncIterable<ClientStreamFrame<Metadata, Data>>,\n options: ClientResponseOptions<Metadata, Data>,\n): Response {\n const headers = new Headers(options.headers);\n headers.set(\"x-anvia-stream-protocol\", CLIENT_STREAM_PROTOCOL);\n const responseOptions: Parameters<typeof encodeEventStreamResponse>[0] = {\n events: frames,\n headers,\n };\n if (options.format !== undefined) responseOptions.format = options.format;\n if (options.status !== undefined) responseOptions.status = options.status;\n if (options.statusText !== undefined) responseOptions.statusText = options.statusText;\n if (options.sse !== undefined) responseOptions.sse = options.sse;\n return encodeEventStreamResponse(responseOptions);\n}\n\nfunction propagateCancellation<TSource, TOutput>(\n source: AsyncIterable<TSource>,\n transform: (source: AsyncIterable<TSource>) => AsyncIterable<TOutput>,\n): AsyncIterable<TOutput> {\n return {\n [Symbol.asyncIterator](): AsyncIterator<TOutput> {\n const sourceIterator = source[Symbol.asyncIterator]();\n const sharedSource: AsyncIterable<TSource> = {\n [Symbol.asyncIterator]: () => sourceIterator,\n };\n const outputIterator = transform(sharedSource)[Symbol.asyncIterator]();\n let returned = false;\n\n return {\n next: () => outputIterator.next(),\n async return(): Promise<IteratorResult<TOutput>> {\n if (returned) return { done: true, value: undefined };\n returned = true;\n const sourceReturn = sourceIterator.return?.();\n const outputReturn = outputIterator.return?.();\n await Promise.all([sourceReturn, outputReturn]);\n return { done: true, value: undefined };\n },\n };\n },\n };\n}\n","import type { EventStreamErrorEvent } from \"./types\";\n\nexport function errorEvent(error: unknown): EventStreamErrorEvent {\n return {\n type: \"error\",\n error: serializeError(error),\n };\n}\n\nfunction serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n };\n }\n\n return error;\n}\n","import { errorEvent } from \"./errors\";\nimport type { JsonlStreamOptions } from \"./types\";\n\nexport function createJsonlStream<TEvent>(\n options: JsonlStreamOptions<TEvent> & { events: AsyncIterable<TEvent> },\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n const iterator = options.events[Symbol.asyncIterator]();\n const serialize = options.serialize ?? serializeJson;\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const next = await iterator.next();\n if (next.done === true) {\n controller.close();\n return;\n }\n\n controller.enqueue(encoder.encode(`${serialize(next.value)}\\n`));\n } catch (error) {\n controller.enqueue(encoder.encode(`${serialize(errorEvent(error))}\\n`));\n controller.close();\n }\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction serializeJson(value: unknown): string {\n return JSON.stringify(value);\n}\n","import { errorEvent } from \"./errors\";\nimport type {\n CreateResumableStreamOptions,\n ResumableStreamEnvelope,\n ResumableStreamRecord,\n ResumableStreamState,\n ResumableStreamStatus,\n ResumableStreamStore,\n ResumableStreamSubscribeInput,\n ResumeStreamEventsOptions,\n} from \"./types\";\n\ntype Subscriber<TEvent> = {\n after: number;\n queue: AsyncQueue<ResumableStreamRecord<TEvent>>;\n};\n\ntype MemoryStream<TEvent> = {\n records: ResumableStreamRecord<TEvent>[];\n status: ResumableStreamStatus;\n subscribers: Set<Subscriber<TEvent>>;\n};\n\ntype AsyncQueue<T> = AsyncIterable<T> & {\n enqueue(value: T): void;\n close(): void;\n throw(error: unknown): void;\n};\n\nexport function createResumableStream<TEvent>(\n options: CreateResumableStreamOptions<TEvent> & { events: AsyncIterable<TEvent> },\n): AsyncIterable<ResumableStreamEnvelope<TEvent>> {\n const streamId = options.id;\n let openPromise: Promise<void> | undefined;\n\n function start(): Promise<void> {\n if (openPromise !== undefined) {\n return openPromise;\n }\n\n openPromise = options.store.open({ streamId }).then(() => undefined);\n void drainResumableStream(options.events, options, openPromise);\n return openPromise;\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n await start();\n yield* resumeStreamEvents({ id: streamId, store: options.store });\n },\n };\n}\n\nexport async function* resumeStreamEvents<TEvent>(\n options: ResumeStreamEventsOptions<TEvent>,\n): AsyncIterable<ResumableStreamEnvelope<TEvent>> {\n const streamId = options.id;\n yield { type: \"stream_start\", streamId, eventId: 0 };\n\n const subscribeInput: ResumableStreamSubscribeInput = { streamId };\n if (options.after !== undefined) {\n subscribeInput.after = options.after;\n }\n for await (const record of options.store.subscribe(subscribeInput)) {\n yield recordToEnvelope(record);\n }\n\n const state = await options.store.status({ streamId });\n yield stateToEndEnvelope<TEvent>(streamId, state);\n}\n\nexport function createMemoryResumableStreamStore<TEvent = unknown>(): ResumableStreamStore<TEvent> {\n const streams = new Map<string, MemoryStream<TEvent>>();\n\n function state(stream: MemoryStream<TEvent> | undefined): ResumableStreamState {\n if (stream === undefined) {\n return { status: \"missing\", lastEventId: 0 };\n }\n return {\n status: stream.status,\n lastEventId: stream.records.at(-1)?.eventId ?? 0,\n };\n }\n\n return {\n async open(input) {\n const existing = streams.get(input.streamId);\n if (existing !== undefined) {\n closeSubscribers(existing);\n }\n\n const stream: MemoryStream<TEvent> = {\n records: [],\n status: \"running\",\n subscribers: new Set(),\n };\n streams.set(input.streamId, stream);\n return state(stream);\n },\n\n async append(input) {\n const stream = streams.get(input.streamId);\n if (stream === undefined) {\n throw new Error(`Resumable stream \"${input.streamId}\" is not open`);\n }\n if (stream.status !== \"running\") {\n throw new Error(`Resumable stream \"${input.streamId}\" is already ${stream.status}`);\n }\n\n const record: ResumableStreamRecord<TEvent> = {\n streamId: input.streamId,\n eventId: stream.records.length + 1,\n event: input.event,\n createdAt: new Date(),\n };\n stream.records.push(record);\n\n for (const subscriber of stream.subscribers) {\n if (record.eventId > subscriber.after) {\n subscriber.queue.enqueue(record);\n }\n }\n\n return record;\n },\n\n subscribe(input) {\n const after = input.after ?? 0;\n return {\n [Symbol.asyncIterator](): AsyncIterator<ResumableStreamRecord<TEvent>> {\n const stream = streams.get(input.streamId);\n const queue = createAsyncQueue<ResumableStreamRecord<TEvent>>();\n if (stream === undefined) {\n queue.close();\n return queue[Symbol.asyncIterator]();\n }\n\n for (const record of stream.records) {\n if (record.eventId > after) {\n queue.enqueue(record);\n }\n }\n\n if (stream.status !== \"running\") {\n queue.close();\n return queue[Symbol.asyncIterator]();\n }\n\n const subscriber: Subscriber<TEvent> = { after, queue };\n stream.subscribers.add(subscriber);\n const iterator = queue[Symbol.asyncIterator]();\n\n return {\n next: () => iterator.next(),\n async return() {\n stream.subscribers.delete(subscriber);\n queue.close();\n return { value: undefined, done: true };\n },\n };\n },\n };\n },\n\n async status(input) {\n return state(streams.get(input.streamId));\n },\n\n async close(input) {\n const stream = streams.get(input.streamId);\n if (stream === undefined) {\n return { status: input.status, lastEventId: 0 };\n }\n stream.status = input.status;\n closeSubscribers(stream);\n return state(stream);\n },\n };\n}\n\nasync function drainResumableStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options: CreateResumableStreamOptions<TEvent>,\n openPromise: Promise<void>,\n): Promise<void> {\n const streamId = options.id;\n try {\n await openPromise;\n for await (const event of events) {\n await options.store.append({ streamId, event });\n }\n await options.store.close({ streamId, status: \"completed\" });\n } catch (error) {\n const event = errorEvent(error);\n try {\n await options.store.append({ streamId, event });\n } catch {\n // The response iterator reports store-open failures; avoid a background rejection.\n }\n try {\n await options.store.close({ streamId, status: \"error\" });\n } catch {\n // The store may not have opened.\n }\n }\n}\n\nfunction recordToEnvelope<TEvent>(\n record: ResumableStreamRecord<TEvent>,\n): ResumableStreamEnvelope<TEvent> {\n return {\n type: \"stream_event\",\n streamId: record.streamId,\n eventId: record.eventId,\n event: record.event,\n };\n}\n\nfunction stateToEndEnvelope<TEvent>(\n streamId: string,\n state: ResumableStreamState,\n): ResumableStreamEnvelope<TEvent> {\n return {\n type: \"stream_end\",\n streamId,\n eventId: state.lastEventId,\n status: state.status,\n };\n}\n\nfunction closeSubscribers<TEvent>(stream: MemoryStream<TEvent>): void {\n for (const subscriber of stream.subscribers) {\n subscriber.queue.close();\n }\n stream.subscribers.clear();\n}\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n }> = [];\n let closed = false;\n let error: unknown;\n\n function flush(): void {\n while (waiters.length > 0 && values.length > 0) {\n const waiter = waiters.shift();\n const value = values.shift() as T;\n waiter?.resolve({ value, done: false });\n }\n\n if (values.length > 0 || waiters.length === 0 || !closed) {\n return;\n }\n\n while (waiters.length > 0) {\n const waiter = waiters.shift();\n if (waiter === undefined) {\n continue;\n }\n if (error !== undefined) {\n waiter.reject(error);\n } else {\n waiter.resolve({ value: undefined, done: true });\n }\n }\n }\n\n return {\n enqueue(value) {\n if (closed) {\n return;\n }\n values.push(value);\n flush();\n },\n close() {\n closed = true;\n flush();\n },\n throw(thrown) {\n closed = true;\n error = thrown;\n flush();\n },\n [Symbol.asyncIterator]() {\n return {\n next() {\n if (values.length > 0) {\n const value = values.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (error !== undefined) {\n return Promise.reject(error);\n }\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n };\n },\n };\n}\n","import { errorEvent } from \"./errors\";\nimport type { EventStreamErrorEvent, SseStreamOptions } from \"./types\";\n\nexport function createSseStream<TEvent>(\n options: SseStreamOptions<TEvent> & { events: AsyncIterable<TEvent> },\n): ReadableStream<Uint8Array> {\n validateSseOptions(options);\n const encoder = new TextEncoder();\n const iterator = options.events[Symbol.asyncIterator]();\n const serialize = options.serialize ?? serializeJson;\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n if (options.retry !== undefined) {\n controller.enqueue(encoder.encode(`retry: ${options.retry}\\n\\n`));\n }\n },\n async pull(controller) {\n try {\n const next = await iterator.next();\n if (next.done === true) {\n controller.close();\n return;\n }\n\n controller.enqueue(\n encoder.encode(formatSseEvent(next.value, serialize, options.eventName)),\n );\n } catch (error) {\n const event = errorEvent(error);\n controller.enqueue(encoder.encode(formatSseEvent(event, serialize, options.eventName)));\n controller.close();\n }\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction formatSseEvent<TEvent>(\n event: TEvent | EventStreamErrorEvent,\n serialize: (event: TEvent | EventStreamErrorEvent) => string,\n eventName: SseStreamOptions<TEvent>[\"eventName\"],\n): string {\n const name = typeof eventName === \"function\" ? eventName(event) : eventName;\n const lines: string[] = [];\n\n if (name !== undefined && name.length > 0) {\n validateSseEventName(name);\n lines.push(`event: ${name}`);\n }\n\n for (const line of serialize(event).split(/\\r?\\n/)) {\n lines.push(`data: ${line}`);\n }\n\n lines.push(\"\", \"\");\n return lines.join(\"\\n\");\n}\n\nfunction serializeJson(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction validateSseOptions<TEvent>(options: SseStreamOptions<TEvent>): void {\n if (options.retry !== undefined && !isValidRetry(options.retry)) {\n throw new TypeError(\"SSE retry must be a finite non-negative integer\");\n }\n if (typeof options.eventName === \"string\") {\n validateSseEventName(options.eventName);\n }\n}\n\nfunction isValidRetry(value: number): boolean {\n return Number.isFinite(value) && Number.isInteger(value) && value >= 0;\n}\n\nfunction validateSseEventName(name: string): void {\n for (const character of name) {\n const code = character.charCodeAt(0);\n if (code === 0 || code === 10 || code === 13) {\n throw new TypeError(\"SSE event names must not contain null bytes or line breaks\");\n }\n }\n}\n","import { createJsonlStream } from \"./jsonl\";\nimport { createResumableStream, resumeStreamEvents } from \"./resumable\";\nimport { createSseStream } from \"./sse\";\nimport type {\n CreateEventStreamResponseOptions,\n EventStreamFormat,\n JsonlStreamOptions,\n ResumableStreamEnvelope,\n ResumeEventStreamResponseOptions,\n SseStreamOptions,\n} from \"./types\";\n\ntype ResponseStreamEvent<TEvent> = TEvent | ResumableStreamEnvelope<TEvent>;\n\ntype EventStreamResponseOptions<TEvent> = {\n format?: EventStreamFormat;\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n jsonl?: JsonlStreamOptions<ResponseStreamEvent<TEvent>>;\n sse?: SseStreamOptions<ResponseStreamEvent<TEvent>>;\n};\n\nexport function createEventStreamResponse<TEvent>(\n options: CreateEventStreamResponseOptions<TEvent> & { events: AsyncIterable<TEvent> },\n): Response {\n const eventsForResponse: AsyncIterable<ResponseStreamEvent<TEvent>> =\n options.resumable === undefined\n ? (options.events as AsyncIterable<ResponseStreamEvent<TEvent>>)\n : createResumableStream({ events: options.events, ...options.resumable });\n\n return encodeEventStreamResponse({\n events: eventsForResponse,\n ...copyResponseOptions(options),\n });\n}\n\nexport function resumeEventStreamResponse<TEvent>(\n options: ResumeEventStreamResponseOptions<TEvent>,\n): Response {\n return encodeEventStreamResponse({\n events: resumeStreamEvents({\n id: options.streamId,\n after: options.after,\n store: options.store,\n }),\n ...copyResponseOptions(options),\n });\n}\n\nexport function encodeEventStreamResponse<TEvent>(\n options: EventStreamResponseOptions<TEvent> & {\n events: AsyncIterable<ResponseStreamEvent<TEvent>>;\n },\n): Response {\n const format = options.format ?? \"jsonl\";\n const headers = new Headers(options.headers);\n\n if (!headers.has(\"cache-control\")) {\n headers.set(\"cache-control\", \"no-cache, no-transform\");\n }\n if (!headers.has(\"connection\")) {\n headers.set(\"connection\", \"keep-alive\");\n }\n if (!headers.has(\"x-accel-buffering\")) {\n headers.set(\"x-accel-buffering\", \"no\");\n }\n\n const body =\n format === \"sse\"\n ? createSseStream({ events: options.events, ...options.sse })\n : createJsonlStream({ events: options.events, ...options.jsonl });\n\n if (!headers.has(\"content-type\")) {\n headers.set(\n \"content-type\",\n format === \"sse\" ? \"text/event-stream; charset=utf-8\" : \"application/x-ndjson; charset=utf-8\",\n );\n }\n\n const responseInit: ResponseInit = { headers };\n if (options.status !== undefined) {\n responseInit.status = options.status;\n }\n if (options.statusText !== undefined) {\n responseInit.statusText = options.statusText;\n }\n\n return new Response(body, responseInit);\n}\n\nfunction copyResponseOptions<TEvent>(options: {\n format?: EventStreamFormat;\n headers?: HeadersInit;\n status?: number;\n statusText?: string;\n jsonl?: unknown;\n sse?: unknown;\n}): EventStreamResponseOptions<TEvent> {\n const next: EventStreamResponseOptions<TEvent> = {};\n if (options.format !== undefined) next.format = options.format;\n if (options.headers !== undefined) next.headers = options.headers;\n if (options.status !== undefined) next.status = options.status;\n if (options.statusText !== undefined) next.statusText = options.statusText;\n if (options.jsonl !== undefined) {\n next.jsonl = options.jsonl as JsonlStreamOptions<ResponseStreamEvent<TEvent>>;\n }\n if (options.sse !== undefined) {\n next.sse = options.sse as SseStreamOptions<ResponseStreamEvent<TEvent>>;\n }\n return next;\n}\n"],"mappings":"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","names":["serializeJson"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@anvia/server",
3
- "version": "0.7.6",
4
- "description": "Server-side event stream helpers for Anvia applications.",
3
+ "version": "1.0.0-rc.10",
4
+ "description": "Server-side client protocol and generic event stream responses for Anvia.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
7
7
  "license": "MIT",
@@ -31,10 +31,10 @@
31
31
  "tsup": "^8.5.0",
32
32
  "typescript": "^5.9.3",
33
33
  "vitest": "^4.0.8",
34
- "@anvia/core": "0.26.0"
34
+ "@anvia/client": "1.0.0-rc.10"
35
35
  },
36
36
  "peerDependencies": {
37
- "@anvia/core": ">=0.25.0 <1.0.0"
37
+ "@anvia/client": "1.0.0-rc.10"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",