@anvia/server 0.5.16 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +49 -11
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -13,7 +13,9 @@ return createUIStreamResponse(uiEvents, {
|
|
|
13
13
|
## Exports
|
|
14
14
|
|
|
15
15
|
- `createEventStream(events, options)` returns a streaming `Response`.
|
|
16
|
+
- `createEventStream({ resume })` continues a previously started resumable stream.
|
|
16
17
|
- `createUIStreamResponse(events, options)` returns a streaming `Response` for `UIStreamEvent` values.
|
|
18
|
+
- `createUIStreamResponse({ resume })` continues a resumable UI stream.
|
|
17
19
|
- `createJsonlStream(events, options)` returns a JSONL `ReadableStream<Uint8Array>`.
|
|
18
20
|
- `createSseStream(events, options)` returns a Server-Sent Event `ReadableStream<Uint8Array>`.
|
|
19
21
|
- `createResumableStream(events, options)` wraps events in resumable stream envelopes.
|
|
@@ -22,4 +24,4 @@ return createUIStreamResponse(uiEvents, {
|
|
|
22
24
|
|
|
23
25
|
JSONL is the default transport format. Use `format: "sse"` when you need `text/event-stream` compatibility.
|
|
24
26
|
Pass `resumable: { id, store }` to `createEventStream` when clients need to recover streams after
|
|
25
|
-
navigation or reload.
|
|
27
|
+
navigation or reload. Continue those streams with `createEventStream({ resume: { streamId, after, store } })`.
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,19 @@ type CreateEventStreamOptions<TEvent> = {
|
|
|
14
14
|
jsonl?: JsonlStreamOptions<TEvent>;
|
|
15
15
|
sse?: SseStreamOptions<TEvent>;
|
|
16
16
|
};
|
|
17
|
+
type CreateEventStreamResumeOptions<TEvent> = {
|
|
18
|
+
format?: EventStreamFormat;
|
|
19
|
+
headers?: HeadersInit;
|
|
20
|
+
status?: number;
|
|
21
|
+
statusText?: string;
|
|
22
|
+
resume: {
|
|
23
|
+
streamId: string;
|
|
24
|
+
after: number;
|
|
25
|
+
store: ResumableStreamStore<TEvent>;
|
|
26
|
+
};
|
|
27
|
+
jsonl?: JsonlStreamOptions<ResumableStreamEnvelope<TEvent>>;
|
|
28
|
+
sse?: SseStreamOptions<ResumableStreamEnvelope<TEvent>>;
|
|
29
|
+
};
|
|
17
30
|
type JsonlStreamOptions<TEvent> = {
|
|
18
31
|
serialize?: (event: TEvent | EventStreamErrorEvent) => string;
|
|
19
32
|
};
|
|
@@ -87,7 +100,9 @@ interface ResumableStreamStore<TEvent = unknown> {
|
|
|
87
100
|
declare function createJsonlStream<TEvent>(events: AsyncIterable<TEvent>, options?: JsonlStreamOptions<TEvent>): ReadableStream<Uint8Array>;
|
|
88
101
|
|
|
89
102
|
declare function createEventStream<TEvent>(events: AsyncIterable<TEvent>, options?: CreateEventStreamOptions<TEvent>): Response;
|
|
103
|
+
declare function createEventStream<TEvent>(options: CreateEventStreamResumeOptions<TEvent>): Response;
|
|
90
104
|
declare function createUIStreamResponse(events: AsyncIterable<UIStreamEvent>, options?: CreateEventStreamOptions<UIStreamEvent>): Response;
|
|
105
|
+
declare function createUIStreamResponse(options: CreateEventStreamResumeOptions<UIStreamEvent>): Response;
|
|
91
106
|
|
|
92
107
|
declare function createResumableStream<TEvent>(events: AsyncIterable<TEvent>, options: CreateResumableStreamOptions<TEvent>): AsyncIterable<ResumableStreamEnvelope<TEvent>>;
|
|
93
108
|
declare function resumeStreamEvents<TEvent>(options: ResumeStreamEventsOptions<TEvent>): AsyncIterable<ResumableStreamEnvelope<TEvent>>;
|
|
@@ -95,4 +110,4 @@ declare function createMemoryResumableStreamStore<TEvent = unknown>(): Resumable
|
|
|
95
110
|
|
|
96
111
|
declare function createSseStream<TEvent>(events: AsyncIterable<TEvent>, options?: SseStreamOptions<TEvent>): ReadableStream<Uint8Array>;
|
|
97
112
|
|
|
98
|
-
export { type CreateEventStreamOptions, 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 };
|
|
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 };
|
package/dist/index.js
CHANGED
|
@@ -350,7 +350,28 @@ function validateSseEventName(name) {
|
|
|
350
350
|
}
|
|
351
351
|
|
|
352
352
|
// src/response.ts
|
|
353
|
-
function createEventStream(
|
|
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));
|
|
367
|
+
}
|
|
368
|
+
function createUIStreamResponse(eventsOrOptions, options = {}) {
|
|
369
|
+
if (isResumeOptions(eventsOrOptions)) {
|
|
370
|
+
return createEventStream(eventsOrOptions);
|
|
371
|
+
}
|
|
372
|
+
return createEventStream(eventsOrOptions, options);
|
|
373
|
+
}
|
|
374
|
+
function createEventStreamResponse(events, options) {
|
|
354
375
|
const format = options.format ?? "jsonl";
|
|
355
376
|
const headers = new Headers(options.headers);
|
|
356
377
|
if (!headers.has("cache-control")) {
|
|
@@ -362,14 +383,7 @@ function createEventStream(events, options = {}) {
|
|
|
362
383
|
if (!headers.has("x-accel-buffering")) {
|
|
363
384
|
headers.set("x-accel-buffering", "no");
|
|
364
385
|
}
|
|
365
|
-
const
|
|
366
|
-
const body = format === "sse" ? createSseStream(
|
|
367
|
-
eventsForResponse,
|
|
368
|
-
options.sse
|
|
369
|
-
) : createJsonlStream(
|
|
370
|
-
eventsForResponse,
|
|
371
|
-
options.jsonl
|
|
372
|
-
);
|
|
386
|
+
const body = format === "sse" ? createSseStream(events, options.sse) : createJsonlStream(events, options.jsonl);
|
|
373
387
|
if (!headers.has("content-type")) {
|
|
374
388
|
headers.set(
|
|
375
389
|
"content-type",
|
|
@@ -385,8 +399,32 @@ function createEventStream(events, options = {}) {
|
|
|
385
399
|
}
|
|
386
400
|
return new Response(body, responseInit);
|
|
387
401
|
}
|
|
388
|
-
function
|
|
389
|
-
|
|
402
|
+
function copyResponseOptions(options) {
|
|
403
|
+
const next = {};
|
|
404
|
+
if (options.format !== void 0) next.format = options.format;
|
|
405
|
+
if (options.headers !== void 0) next.headers = options.headers;
|
|
406
|
+
if (options.status !== void 0) next.status = options.status;
|
|
407
|
+
if (options.statusText !== void 0) next.statusText = options.statusText;
|
|
408
|
+
if (options.jsonl !== void 0) {
|
|
409
|
+
next.jsonl = options.jsonl;
|
|
410
|
+
}
|
|
411
|
+
if (options.sse !== void 0) {
|
|
412
|
+
next.sse = options.sse;
|
|
413
|
+
}
|
|
414
|
+
return next;
|
|
415
|
+
}
|
|
416
|
+
function isResumeOptions(value) {
|
|
417
|
+
if (typeof value !== "object" || value === null || Symbol.asyncIterator in value) {
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
if (!("resume" in value) || typeof value.resume !== "object" || value.resume === null) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
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
|
+
}
|
|
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";
|
|
390
428
|
}
|
|
391
429
|
export {
|
|
392
430
|
createEventStream,
|
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 } from \"./resumable\";\nimport { createSseStream } from \"./sse\";\nimport type {\n CreateEventStreamOptions,\n JsonlStreamOptions,\n ResumableStreamEnvelope,\n SseStreamOptions,\n} from \"./types\";\n\ntype ResponseStreamEvent<TEvent> = TEvent | ResumableStreamEnvelope<TEvent>;\n\nexport function createEventStream<TEvent>(\n events: AsyncIterable<TEvent>,\n options: CreateEventStreamOptions<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 eventsForResponse: AsyncIterable<ResponseStreamEvent<TEvent>> =\n options.resumable === undefined\n ? (events as AsyncIterable<ResponseStreamEvent<TEvent>>)\n : createResumableStream(events, options.resumable);\n const body =\n format === \"sse\"\n ? createSseStream(\n eventsForResponse,\n options.sse as SseStreamOptions<ResponseStreamEvent<TEvent>> | undefined,\n )\n : createJsonlStream(\n eventsForResponse,\n options.jsonl as JsonlStreamOptions<ResponseStreamEvent<TEvent>> | undefined,\n );\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\nexport function createUIStreamResponse(\n events: AsyncIterable<UIStreamEvent>,\n options: CreateEventStreamOptions<UIStreamEvent> = {},\n): Response {\n return createEventStream(events, options);\n}\n"],"mappings":"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","names":["serializeJson"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Server-side event stream helpers for Anvia applications.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@anvia/core": "0.
|
|
29
|
+
"@anvia/core": "0.21.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^24.9.1",
|