@anvia/client 1.6.0 → 1.8.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 +20 -0
- package/dist/durable-chat.d.ts +53 -0
- package/dist/durable-chat.d.ts.map +1 -0
- package/dist/durable-chat.js +965 -0
- package/dist/durable-chat.js.map +1 -0
- package/dist/durable.d.ts +76 -65
- package/dist/durable.d.ts.map +1 -0
- package/dist/durable.js +228 -253
- package/dist/durable.js.map +1 -1
- package/dist/event-transport-CcP1zaST.js +103 -0
- package/dist/event-transport-CcP1zaST.js.map +1 -0
- package/dist/event-transport-rXxwo4BK.d.ts +88 -0
- package/dist/event-transport-rXxwo4BK.d.ts.map +1 -0
- package/dist/index.d.ts +62 -419
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1966 -2396
- package/dist/index.js.map +1 -1
- package/dist/streams-BXxF27Hp.js +156 -0
- package/dist/streams-BXxF27Hp.js.map +1 -0
- package/dist/transport/index.d.ts +2 -91
- package/dist/transport/index.js +3 -23
- package/dist/types-Bt4tUcST.d.ts +348 -0
- package/dist/types-Bt4tUcST.d.ts.map +1 -0
- package/dist/types-CqJxMo_1.js +466 -0
- package/dist/types-CqJxMo_1.js.map +1 -0
- package/package.json +11 -7
- package/dist/chunk-PD72KNCV.js +0 -150
- package/dist/chunk-PD72KNCV.js.map +0 -1
- package/dist/chunk-RK5U6WVJ.js +0 -127
- package/dist/chunk-RK5U6WVJ.js.map +0 -1
- package/dist/transport/index.js.map +0 -1
package/dist/chunk-PD72KNCV.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
// src/transport/streams.ts
|
|
2
|
-
var EventStreamParseError = class extends Error {
|
|
3
|
-
format;
|
|
4
|
-
/** The raw JSONL line or joined SSE `data` payload. */
|
|
5
|
-
raw;
|
|
6
|
-
/** 1-based physical line number of the malformed JSONL line. */
|
|
7
|
-
line;
|
|
8
|
-
/** SSE event name of the malformed frame. */
|
|
9
|
-
event;
|
|
10
|
-
/** SSE last event ID in effect when the malformed frame was dispatched. */
|
|
11
|
-
lastEventId;
|
|
12
|
-
constructor(options) {
|
|
13
|
-
super(`Malformed ${options.format === "sse" ? "SSE" : "JSONL"} frame: invalid JSON.`, {
|
|
14
|
-
cause: options.cause
|
|
15
|
-
});
|
|
16
|
-
this.name = "EventStreamParseError";
|
|
17
|
-
this.format = options.format;
|
|
18
|
-
this.raw = options.raw;
|
|
19
|
-
this.line = options.line;
|
|
20
|
-
this.event = options.event;
|
|
21
|
-
this.lastEventId = options.lastEventId;
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
async function* readJsonlStream(stream, options = {}) {
|
|
25
|
-
let lineNumber = 0;
|
|
26
|
-
for await (const line of readLines(stream)) {
|
|
27
|
-
lineNumber += 1;
|
|
28
|
-
const raw = line.trim();
|
|
29
|
-
if (raw.length === 0) continue;
|
|
30
|
-
const parsed = parseJson(raw, options, () => ({ format: "jsonl", raw, line: lineNumber }));
|
|
31
|
-
if (parsed.ok) yield parsed.value;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async function* readSseStream(stream, options = {}) {
|
|
35
|
-
for await (const frame of readSseFrames(stream, options)) yield frame.data;
|
|
36
|
-
}
|
|
37
|
-
async function* readSseFrames(stream, options = {}) {
|
|
38
|
-
let data = [];
|
|
39
|
-
let event = "";
|
|
40
|
-
let lastEventId = "";
|
|
41
|
-
let retry;
|
|
42
|
-
function dispatch() {
|
|
43
|
-
const raw = data.join("\n");
|
|
44
|
-
const name = event === "" ? "message" : event;
|
|
45
|
-
const hasData = data.length > 0;
|
|
46
|
-
data = [];
|
|
47
|
-
event = "";
|
|
48
|
-
if (!hasData || raw.trim().length === 0) return void 0;
|
|
49
|
-
const parsed = parseJson(raw, options, () => ({
|
|
50
|
-
format: "sse",
|
|
51
|
-
raw,
|
|
52
|
-
event: name,
|
|
53
|
-
lastEventId
|
|
54
|
-
}));
|
|
55
|
-
if (!parsed.ok) return void 0;
|
|
56
|
-
const frame2 = { data: parsed.value, event: name, lastEventId };
|
|
57
|
-
if (retry !== void 0) frame2.retry = retry;
|
|
58
|
-
return frame2;
|
|
59
|
-
}
|
|
60
|
-
for await (const line of readLines(stream)) {
|
|
61
|
-
if (line === "") {
|
|
62
|
-
const frame2 = dispatch();
|
|
63
|
-
if (frame2 !== void 0) yield frame2;
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
if (line.startsWith(":")) continue;
|
|
67
|
-
const separator = line.indexOf(":");
|
|
68
|
-
const field = separator === -1 ? line : line.slice(0, separator);
|
|
69
|
-
let value = separator === -1 ? "" : line.slice(separator + 1);
|
|
70
|
-
if (value.startsWith(" ")) value = value.slice(1);
|
|
71
|
-
if (field === "data") {
|
|
72
|
-
data.push(value);
|
|
73
|
-
} else if (field === "event") {
|
|
74
|
-
event = value;
|
|
75
|
-
} else if (field === "id") {
|
|
76
|
-
if (!value.includes("\0")) lastEventId = value;
|
|
77
|
-
} else if (field === "retry") {
|
|
78
|
-
if (/^\d+$/.test(value)) retry = Number(value);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const frame = dispatch();
|
|
82
|
-
if (frame !== void 0) yield frame;
|
|
83
|
-
}
|
|
84
|
-
async function* readLines(stream) {
|
|
85
|
-
const reader = stream.getReader();
|
|
86
|
-
const decoder = new TextDecoder();
|
|
87
|
-
let buffer = "";
|
|
88
|
-
let skipLeadingLf = false;
|
|
89
|
-
let completed = false;
|
|
90
|
-
function* split(text) {
|
|
91
|
-
let chunk = text;
|
|
92
|
-
if (skipLeadingLf && chunk.length > 0) {
|
|
93
|
-
skipLeadingLf = false;
|
|
94
|
-
if (chunk.startsWith("\n")) chunk = chunk.slice(1);
|
|
95
|
-
}
|
|
96
|
-
let start = 0;
|
|
97
|
-
let index = buffer.length;
|
|
98
|
-
buffer += chunk;
|
|
99
|
-
for (; index < buffer.length; index += 1) {
|
|
100
|
-
const char = buffer.charCodeAt(index);
|
|
101
|
-
if (char !== 10 && char !== 13) continue;
|
|
102
|
-
yield buffer.slice(start, index);
|
|
103
|
-
if (char === 13) {
|
|
104
|
-
if (index + 1 === buffer.length) skipLeadingLf = true;
|
|
105
|
-
else if (buffer.charCodeAt(index + 1) === 10) index += 1;
|
|
106
|
-
}
|
|
107
|
-
start = index + 1;
|
|
108
|
-
}
|
|
109
|
-
buffer = buffer.slice(start);
|
|
110
|
-
}
|
|
111
|
-
try {
|
|
112
|
-
while (true) {
|
|
113
|
-
const next = await reader.read();
|
|
114
|
-
if (next.done) {
|
|
115
|
-
completed = true;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
yield* split(decoder.decode(next.value, { stream: true }));
|
|
119
|
-
}
|
|
120
|
-
yield* split(decoder.decode());
|
|
121
|
-
if (buffer.length > 0) yield buffer;
|
|
122
|
-
} finally {
|
|
123
|
-
if (!completed) await cancelReader(reader);
|
|
124
|
-
reader.releaseLock();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
function parseJson(raw, options, details) {
|
|
128
|
-
try {
|
|
129
|
-
return { ok: true, value: JSON.parse(raw) };
|
|
130
|
-
} catch (cause) {
|
|
131
|
-
const error = new EventStreamParseError({ ...details(), cause });
|
|
132
|
-
options.onParseError?.(error);
|
|
133
|
-
if (options.strict === true) throw error;
|
|
134
|
-
return { ok: false };
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
async function cancelReader(reader) {
|
|
138
|
-
try {
|
|
139
|
-
await reader.cancel();
|
|
140
|
-
} catch {
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export {
|
|
145
|
-
EventStreamParseError,
|
|
146
|
-
readJsonlStream,
|
|
147
|
-
readSseStream,
|
|
148
|
-
readSseFrames
|
|
149
|
-
};
|
|
150
|
-
//# sourceMappingURL=chunk-PD72KNCV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transport/streams.ts"],"sourcesContent":["import type { EventStreamFormat } from \"./types\";\n\n/** A malformed JSONL line or SSE data payload that could not be parsed as JSON. */\nexport class EventStreamParseError extends Error {\n readonly format: EventStreamFormat;\n /** The raw JSONL line or joined SSE `data` payload. */\n readonly raw: string;\n /** 1-based physical line number of the malformed JSONL line. */\n readonly line: number | undefined;\n /** SSE event name of the malformed frame. */\n readonly event: string | undefined;\n /** SSE last event ID in effect when the malformed frame was dispatched. */\n readonly lastEventId: string | undefined;\n\n constructor(options: {\n format: EventStreamFormat;\n raw: string;\n cause: unknown;\n line?: number;\n event?: string;\n lastEventId?: string;\n }) {\n super(`Malformed ${options.format === \"sse\" ? \"SSE\" : \"JSONL\"} frame: invalid JSON.`, {\n cause: options.cause,\n });\n this.name = \"EventStreamParseError\";\n this.format = options.format;\n this.raw = options.raw;\n this.line = options.line;\n this.event = options.event;\n this.lastEventId = options.lastEventId;\n }\n}\n\nexport type EventStreamReadOptions = {\n /**\n * Receives frames whose payload is not valid JSON. Malformed frames are skipped and the\n * stream continues. Throwing from this callback aborts the stream with that error.\n */\n onParseError?: (error: EventStreamParseError) => void;\n /** Throw the parse error instead of skipping malformed frames. */\n strict?: boolean;\n};\n\n/** A dispatched Server-Sent Event with its parsed JSON payload. */\nexport type SseFrame<TEvent> = {\n data: TEvent;\n /** Event name from the `event:` field, `\"message\"` when absent. */\n event: string;\n /** Last event ID set by an `id:` field in this or an earlier frame, `\"\"` when none. */\n lastEventId: string;\n /** Most recent valid `retry:` reconnection time in milliseconds. */\n retry?: number;\n};\n\nexport async function* readJsonlStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n options: EventStreamReadOptions = {},\n): AsyncIterable<TEvent> {\n let lineNumber = 0;\n for await (const line of readLines(stream)) {\n lineNumber += 1;\n const raw = line.trim();\n if (raw.length === 0) continue;\n const parsed = parseJson(raw, options, () => ({ format: \"jsonl\", raw, line: lineNumber }));\n if (parsed.ok) yield parsed.value as TEvent;\n }\n}\n\nexport async function* readSseStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n options: EventStreamReadOptions = {},\n): AsyncIterable<TEvent> {\n for await (const frame of readSseFrames<TEvent>(stream, options)) yield frame.data;\n}\n\nexport async function* readSseFrames<TEvent>(\n stream: ReadableStream<Uint8Array>,\n options: EventStreamReadOptions = {},\n): AsyncIterable<SseFrame<TEvent>> {\n let data: string[] = [];\n let event = \"\";\n let lastEventId = \"\";\n let retry: number | undefined;\n\n function dispatch(): SseFrame<TEvent> | undefined {\n const raw = data.join(\"\\n\");\n const name = event === \"\" ? \"message\" : event;\n const hasData = data.length > 0;\n data = [];\n event = \"\";\n // Whitespace-only payloads (for example `data:` heartbeats) carry no JSON event.\n if (!hasData || raw.trim().length === 0) return undefined;\n const parsed = parseJson(raw, options, () => ({\n format: \"sse\",\n raw,\n event: name,\n lastEventId,\n }));\n if (!parsed.ok) return undefined;\n const frame: SseFrame<TEvent> = { data: parsed.value as TEvent, event: name, lastEventId };\n if (retry !== undefined) frame.retry = retry;\n return frame;\n }\n\n for await (const line of readLines(stream)) {\n if (line === \"\") {\n const frame = dispatch();\n if (frame !== undefined) yield frame;\n continue;\n }\n if (line.startsWith(\":\")) continue;\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n let value = separator === -1 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n if (field === \"data\") {\n data.push(value);\n } else if (field === \"event\") {\n event = value;\n } else if (field === \"id\") {\n if (!value.includes(\"\\0\")) lastEventId = value;\n } else if (field === \"retry\") {\n if (/^\\d+$/.test(value)) retry = Number(value);\n }\n }\n // Leniently dispatch a final event that was not followed by a blank line.\n const frame = dispatch();\n if (frame !== undefined) yield frame;\n}\n\n/** Splits a byte stream into lines terminated by CRLF, LF, or a bare CR. */\nasync function* readLines(stream: ReadableStream<Uint8Array>): AsyncIterable<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let skipLeadingLf = false;\n let completed = false;\n\n function* split(text: string): Iterable<string> {\n let chunk = text;\n if (skipLeadingLf && chunk.length > 0) {\n skipLeadingLf = false;\n if (chunk.startsWith(\"\\n\")) chunk = chunk.slice(1);\n }\n let start = 0;\n let index = buffer.length;\n buffer += chunk;\n for (; index < buffer.length; index += 1) {\n const char = buffer.charCodeAt(index);\n if (char !== 10 && char !== 13) continue;\n yield buffer.slice(start, index);\n if (char === 13) {\n if (index + 1 === buffer.length) skipLeadingLf = true;\n else if (buffer.charCodeAt(index + 1) === 10) index += 1;\n }\n start = index + 1;\n }\n buffer = buffer.slice(start);\n }\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done) {\n completed = true;\n break;\n }\n yield* split(decoder.decode(next.value, { stream: true }));\n }\n yield* split(decoder.decode());\n if (buffer.length > 0) yield buffer;\n } finally {\n if (!completed) await cancelReader(reader);\n reader.releaseLock();\n }\n}\n\nfunction parseJson(\n raw: string,\n options: EventStreamReadOptions,\n details: () => Omit<ConstructorParameters<typeof EventStreamParseError>[0], \"cause\">,\n): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch (cause) {\n const error = new EventStreamParseError({ ...details(), cause });\n options.onParseError?.(error);\n if (options.strict === true) throw error;\n return { ok: false };\n }\n}\n\nasync function cancelReader(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<void> {\n try {\n await reader.cancel();\n } catch {\n // The request may already have been aborted by its owner.\n }\n}\n"],"mappings":"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","names":["frame"]}
|
package/dist/chunk-RK5U6WVJ.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
readJsonlStream,
|
|
3
|
-
readSseStream
|
|
4
|
-
} from "./chunk-PD72KNCV.js";
|
|
5
|
-
|
|
6
|
-
// src/transport/fetch.ts
|
|
7
|
-
var EventStreamHttpError = class extends Error {
|
|
8
|
-
constructor(response, body) {
|
|
9
|
-
super(`Event stream request failed with status ${response.status}`);
|
|
10
|
-
this.response = response;
|
|
11
|
-
this.body = body;
|
|
12
|
-
this.name = "EventStreamHttpError";
|
|
13
|
-
}
|
|
14
|
-
response;
|
|
15
|
-
body;
|
|
16
|
-
};
|
|
17
|
-
async function* fetchEventStream(options) {
|
|
18
|
-
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
19
|
-
if (fetchImpl === void 0) throw new Error("fetchEventStream requires a fetch implementation.");
|
|
20
|
-
const response = await fetchImpl(options.input, fetchOptions(options));
|
|
21
|
-
if (!response.ok) throw new EventStreamHttpError(response, await response.text());
|
|
22
|
-
options.validateResponse?.(response);
|
|
23
|
-
if (response.body === null) throw new Error("Event stream response does not include a body.");
|
|
24
|
-
const format = options.format === void 0 || options.format === "auto" ? inferEventStreamFormat(response.headers.get("content-type")) : options.format;
|
|
25
|
-
const readOptions = {};
|
|
26
|
-
if (options.onParseError !== void 0) readOptions.onParseError = options.onParseError;
|
|
27
|
-
if (format === "sse") {
|
|
28
|
-
yield* readSseStream(response.body, readOptions);
|
|
29
|
-
} else {
|
|
30
|
-
yield* readJsonlStream(response.body, readOptions);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function fetchOptions(options) {
|
|
34
|
-
const {
|
|
35
|
-
input: _input,
|
|
36
|
-
format: _format,
|
|
37
|
-
fetch: _fetch,
|
|
38
|
-
validateResponse: _validate,
|
|
39
|
-
onParseError: _onParseError,
|
|
40
|
-
...init
|
|
41
|
-
} = options;
|
|
42
|
-
return init;
|
|
43
|
-
}
|
|
44
|
-
function inferEventStreamFormat(contentType) {
|
|
45
|
-
return contentType?.toLowerCase().includes("text/event-stream") ? "sse" : "jsonl";
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// src/transport/event-transport.ts
|
|
49
|
-
function createFetchEventTransport(options) {
|
|
50
|
-
return {
|
|
51
|
-
async *send(transportOptions) {
|
|
52
|
-
const endpoint = typeof options.endpoint === "function" ? options.endpoint(transportOptions) : options.endpoint;
|
|
53
|
-
const requestHeaders = await resolveHeaders(options.headers, transportOptions);
|
|
54
|
-
const headers = mergeHeaders(requestHeaders, transportOptions.headers);
|
|
55
|
-
const method = options.method ?? "POST";
|
|
56
|
-
const body = await resolveBody(options.body, transportOptions, headers, method);
|
|
57
|
-
const init = {
|
|
58
|
-
...options.init,
|
|
59
|
-
input: endpoint,
|
|
60
|
-
method,
|
|
61
|
-
headers,
|
|
62
|
-
format: options.format ?? "auto"
|
|
63
|
-
};
|
|
64
|
-
if (body !== void 0) init.body = body;
|
|
65
|
-
if (transportOptions.abortSignal !== void 0) init.signal = transportOptions.abortSignal;
|
|
66
|
-
if (options.fetch !== void 0) init.fetch = options.fetch;
|
|
67
|
-
if (options.validateResponse !== void 0) init.validateResponse = options.validateResponse;
|
|
68
|
-
if (options.onParseError !== void 0) init.onParseError = options.onParseError;
|
|
69
|
-
for await (const event of fetchEventStream(init)) {
|
|
70
|
-
yield options.mapEvent === void 0 ? event : options.mapEvent(event);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
function createDirectEventTransport(options) {
|
|
76
|
-
return {
|
|
77
|
-
async *send(context) {
|
|
78
|
-
const iterator = options.handler(context)[Symbol.asyncIterator]();
|
|
79
|
-
let closePromise;
|
|
80
|
-
const close = () => {
|
|
81
|
-
closePromise ??= Promise.resolve(iterator.return?.());
|
|
82
|
-
return closePromise;
|
|
83
|
-
};
|
|
84
|
-
const onAbort = () => {
|
|
85
|
-
void close();
|
|
86
|
-
};
|
|
87
|
-
context.abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
88
|
-
try {
|
|
89
|
-
while (!context.abortSignal?.aborted) {
|
|
90
|
-
const next = await iterator.next();
|
|
91
|
-
if (next.done) break;
|
|
92
|
-
yield next.value;
|
|
93
|
-
}
|
|
94
|
-
} finally {
|
|
95
|
-
context.abortSignal?.removeEventListener("abort", onAbort);
|
|
96
|
-
await close();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
async function resolveHeaders(headers, context) {
|
|
102
|
-
return typeof headers === "function" ? headers(context) : headers;
|
|
103
|
-
}
|
|
104
|
-
async function resolveBody(body, context, headers, method) {
|
|
105
|
-
if (body !== void 0) return body({ ...context, headers });
|
|
106
|
-
if (method.toUpperCase() === "GET" || method.toUpperCase() === "HEAD") return void 0;
|
|
107
|
-
if (!headers.has("content-type")) headers.set("content-type", "application/json");
|
|
108
|
-
return JSON.stringify(context.request);
|
|
109
|
-
}
|
|
110
|
-
function mergeHeaders(...values) {
|
|
111
|
-
const headers = new Headers();
|
|
112
|
-
for (const value of values) {
|
|
113
|
-
if (value === void 0) continue;
|
|
114
|
-
new Headers(value).forEach((headerValue, key) => {
|
|
115
|
-
headers.set(key, headerValue);
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
return headers;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export {
|
|
122
|
-
EventStreamHttpError,
|
|
123
|
-
fetchEventStream,
|
|
124
|
-
createFetchEventTransport,
|
|
125
|
-
createDirectEventTransport
|
|
126
|
-
};
|
|
127
|
-
//# sourceMappingURL=chunk-RK5U6WVJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transport/fetch.ts","../src/transport/event-transport.ts"],"sourcesContent":["import { type EventStreamReadOptions, readJsonlStream, readSseStream } from \"./streams\";\nimport type { EventStreamFormat } from \"./types\";\n\nexport type FetchEventStreamOptions = Omit<RequestInit, \"headers\"> & {\n input: string | URL | Request;\n format?: EventStreamFormat | \"auto\";\n fetch?: typeof fetch;\n headers?: HeadersInit;\n validateResponse?: (response: Response) => void;\n onParseError?: EventStreamReadOptions[\"onParseError\"];\n};\n\nexport class EventStreamHttpError extends Error {\n constructor(\n readonly response: Response,\n readonly body: string,\n ) {\n super(`Event stream request failed with status ${response.status}`);\n this.name = \"EventStreamHttpError\";\n }\n}\n\nexport async function* fetchEventStream<TEvent>(\n options: FetchEventStreamOptions,\n): AsyncIterable<TEvent> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) throw new Error(\"fetchEventStream requires a fetch implementation.\");\n\n const response = await fetchImpl(options.input, fetchOptions(options));\n if (!response.ok) throw new EventStreamHttpError(response, await response.text());\n options.validateResponse?.(response);\n if (response.body === null) throw new Error(\"Event stream response does not include a body.\");\n\n const format =\n options.format === undefined || options.format === \"auto\"\n ? inferEventStreamFormat(response.headers.get(\"content-type\"))\n : options.format;\n const readOptions: EventStreamReadOptions = {};\n if (options.onParseError !== undefined) readOptions.onParseError = options.onParseError;\n if (format === \"sse\") {\n yield* readSseStream<TEvent>(response.body, readOptions);\n } else {\n yield* readJsonlStream<TEvent>(response.body, readOptions);\n }\n}\n\nfunction fetchOptions(options: FetchEventStreamOptions): RequestInit {\n const {\n input: _input,\n format: _format,\n fetch: _fetch,\n validateResponse: _validate,\n onParseError: _onParseError,\n ...init\n } = options;\n return init;\n}\n\nfunction inferEventStreamFormat(contentType: string | null): EventStreamFormat {\n return contentType?.toLowerCase().includes(\"text/event-stream\") ? \"sse\" : \"jsonl\";\n}\n","import { type FetchEventStreamOptions, fetchEventStream } from \"./fetch\";\nimport type { EventStreamFormat, EventTransport, EventTransportSendOptions } from \"./types\";\n\nexport type EventTransportContext<TRequest> = EventTransportSendOptions<TRequest>;\n\nexport type EventTransportBodyContext<TRequest> = Omit<\n EventTransportContext<TRequest>,\n \"headers\"\n> & {\n headers: Headers;\n};\n\nexport type CreateFetchEventTransportOptions<TRequest, TEvent> = {\n endpoint: string | URL | ((context: EventTransportContext<TRequest>) => string | URL);\n method?: string;\n format?: EventStreamFormat | \"auto\";\n fetch?: typeof fetch;\n headers?:\n | HeadersInit\n | ((context: EventTransportContext<TRequest>) => HeadersInit | Promise<HeadersInit>);\n body?: (\n context: EventTransportBodyContext<TRequest>,\n ) => BodyInit | null | undefined | Promise<BodyInit | null | undefined>;\n init?: Omit<RequestInit, \"body\" | \"headers\" | \"method\" | \"signal\">;\n mapEvent?: (event: unknown) => TEvent;\n validateResponse?: (response: Response) => void;\n /** Receives malformed frames that were skipped instead of aborting the stream. */\n onParseError?: FetchEventStreamOptions[\"onParseError\"];\n};\n\nexport function createFetchEventTransport<TRequest, TEvent = unknown>(\n options: CreateFetchEventTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(transportOptions) {\n const endpoint =\n typeof options.endpoint === \"function\"\n ? options.endpoint(transportOptions)\n : options.endpoint;\n const requestHeaders = await resolveHeaders(options.headers, transportOptions);\n const headers = mergeHeaders(requestHeaders, transportOptions.headers);\n const method = options.method ?? \"POST\";\n const body = await resolveBody(options.body, transportOptions, headers, method);\n const init: FetchEventStreamOptions = {\n ...options.init,\n input: endpoint,\n method,\n headers,\n format: options.format ?? \"auto\",\n };\n if (body !== undefined) init.body = body;\n if (transportOptions.abortSignal !== undefined) init.signal = transportOptions.abortSignal;\n if (options.fetch !== undefined) init.fetch = options.fetch;\n if (options.validateResponse !== undefined) init.validateResponse = options.validateResponse;\n if (options.onParseError !== undefined) init.onParseError = options.onParseError;\n\n for await (const event of fetchEventStream<unknown>(init)) {\n yield options.mapEvent === undefined ? (event as TEvent) : options.mapEvent(event);\n }\n },\n };\n}\n\nexport function createDirectEventTransport<TRequest, TEvent>(options: {\n handler(context: EventTransportContext<TRequest>): AsyncIterable<TEvent>;\n}): EventTransport<TRequest, TEvent> {\n return {\n async *send(context) {\n const iterator = options.handler(context)[Symbol.asyncIterator]();\n let closePromise: Promise<unknown> | undefined;\n const close = () => {\n closePromise ??= Promise.resolve(iterator.return?.());\n return closePromise;\n };\n const onAbort = () => {\n void close();\n };\n context.abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n while (!context.abortSignal?.aborted) {\n const next = await iterator.next();\n if (next.done) break;\n yield next.value;\n }\n } finally {\n context.abortSignal?.removeEventListener(\"abort\", onAbort);\n await close();\n }\n },\n };\n}\n\nasync function resolveHeaders<TRequest>(\n headers: CreateFetchEventTransportOptions<TRequest, unknown>[\"headers\"],\n context: EventTransportContext<TRequest>,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(context) : headers;\n}\n\nasync function resolveBody<TRequest>(\n body: CreateFetchEventTransportOptions<TRequest, unknown>[\"body\"],\n context: EventTransportContext<TRequest>,\n headers: Headers,\n method: string,\n): Promise<BodyInit | null | undefined> {\n if (body !== undefined) return body({ ...context, headers });\n if (method.toUpperCase() === \"GET\" || method.toUpperCase() === \"HEAD\") return undefined;\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return JSON.stringify(context.request);\n}\n\nfunction mergeHeaders(...values: Array<HeadersInit | undefined>): Headers {\n const headers = new Headers();\n for (const value of values) {\n if (value === undefined) continue;\n new Headers(value).forEach((headerValue, key) => {\n headers.set(key, headerValue);\n });\n }\n return headers;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|