@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.
@@ -0,0 +1,103 @@
1
+ import { i as readSseStream, n as readJsonlStream } from "./streams-BXxF27Hp.js";
2
+ // src/transport/fetch.ts
3
+ var EventStreamHttpError = class extends Error {
4
+ response;
5
+ body;
6
+ constructor(response, body) {
7
+ super(`Event stream request failed with status ${response.status}`);
8
+ this.response = response;
9
+ this.body = body;
10
+ this.name = "EventStreamHttpError";
11
+ }
12
+ };
13
+ async function* fetchEventStream(options) {
14
+ const fetchImpl = options.fetch ?? globalThis.fetch;
15
+ if (fetchImpl === void 0) throw new Error("fetchEventStream requires a fetch implementation.");
16
+ const response = await fetchImpl(options.input, fetchOptions(options));
17
+ if (!response.ok) throw new EventStreamHttpError(response, await response.text());
18
+ options.validateResponse?.(response);
19
+ if (response.body === null) throw new Error("Event stream response does not include a body.");
20
+ const format = options.format === void 0 || options.format === "auto" ? inferEventStreamFormat(response.headers.get("content-type")) : options.format;
21
+ const readOptions = {};
22
+ if (options.onParseError !== void 0) readOptions.onParseError = options.onParseError;
23
+ if (format === "sse") yield* readSseStream(response.body, readOptions);
24
+ else yield* readJsonlStream(response.body, readOptions);
25
+ }
26
+ function fetchOptions(options) {
27
+ const { input: _input, format: _format, fetch: _fetch, validateResponse: _validate, onParseError: _onParseError, ...init } = options;
28
+ return init;
29
+ }
30
+ function inferEventStreamFormat(contentType) {
31
+ return contentType?.toLowerCase().includes("text/event-stream") ? "sse" : "jsonl";
32
+ }
33
+ // src/transport/event-transport.ts
34
+ function createFetchEventTransport(options) {
35
+ return { async *send(transportOptions) {
36
+ const endpoint = typeof options.endpoint === "function" ? options.endpoint(transportOptions) : options.endpoint;
37
+ const headers = mergeHeaders(await resolveHeaders(options.headers, transportOptions), transportOptions.headers);
38
+ const method = options.method ?? "POST";
39
+ const body = await resolveBody(options.body, transportOptions, headers, method);
40
+ const init = {
41
+ ...options.init,
42
+ input: endpoint,
43
+ method,
44
+ headers,
45
+ format: options.format ?? "auto"
46
+ };
47
+ if (body !== void 0) init.body = body;
48
+ if (transportOptions.abortSignal !== void 0) init.signal = transportOptions.abortSignal;
49
+ if (options.fetch !== void 0) init.fetch = options.fetch;
50
+ if (options.validateResponse !== void 0) init.validateResponse = options.validateResponse;
51
+ if (options.onParseError !== void 0) init.onParseError = options.onParseError;
52
+ for await (const event of fetchEventStream(init)) yield options.mapEvent === void 0 ? event : options.mapEvent(event);
53
+ } };
54
+ }
55
+ function createDirectEventTransport(options) {
56
+ return { async *send(context) {
57
+ const iterator = options.handler(context)[Symbol.asyncIterator]();
58
+ let closePromise;
59
+ const close = () => {
60
+ closePromise ??= Promise.resolve(iterator.return?.());
61
+ return closePromise;
62
+ };
63
+ const onAbort = () => {
64
+ close();
65
+ };
66
+ context.abortSignal?.addEventListener("abort", onAbort, { once: true });
67
+ try {
68
+ while (!context.abortSignal?.aborted) {
69
+ const next = await iterator.next();
70
+ if (next.done) break;
71
+ yield next.value;
72
+ }
73
+ } finally {
74
+ context.abortSignal?.removeEventListener("abort", onAbort);
75
+ await close();
76
+ }
77
+ } };
78
+ }
79
+ async function resolveHeaders(headers, context) {
80
+ return typeof headers === "function" ? headers(context) : headers;
81
+ }
82
+ async function resolveBody(body, context, headers, method) {
83
+ if (body !== void 0) return body({
84
+ ...context,
85
+ headers
86
+ });
87
+ if (method.toUpperCase() === "GET" || method.toUpperCase() === "HEAD") return void 0;
88
+ if (!headers.has("content-type")) headers.set("content-type", "application/json");
89
+ return JSON.stringify(context.request);
90
+ }
91
+ function mergeHeaders(...values) {
92
+ const headers = new Headers();
93
+ for (const value of values) {
94
+ if (value === void 0) continue;
95
+ new Headers(value).forEach((headerValue, key) => {
96
+ headers.set(key, headerValue);
97
+ });
98
+ }
99
+ return headers;
100
+ }
101
+ export { fetchEventStream as i, createFetchEventTransport as n, EventStreamHttpError as r, createDirectEventTransport as t };
102
+
103
+ //# sourceMappingURL=event-transport-CcP1zaST.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-transport-CcP1zaST.js","names":[],"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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"}
@@ -0,0 +1,88 @@
1
+ type EventStreamFormat = "jsonl" | "sse";
2
+ type EventTransportSendOptions<TRequest> = {
3
+ request: TRequest;
4
+ abortSignal?: AbortSignal;
5
+ headers?: HeadersInit;
6
+ };
7
+ type EventTransport<TRequest, TEvent> = {
8
+ send(options: EventTransportSendOptions<TRequest>): AsyncIterable<TEvent>;
9
+ };
10
+ /** A malformed JSONL line or SSE data payload that could not be parsed as JSON. */
11
+ declare class EventStreamParseError extends Error {
12
+ readonly format: EventStreamFormat;
13
+ /** The raw JSONL line or joined SSE `data` payload. */
14
+ readonly raw: string;
15
+ /** 1-based physical line number of the malformed JSONL line. */
16
+ readonly line: number | undefined;
17
+ /** SSE event name of the malformed frame. */
18
+ readonly event: string | undefined;
19
+ /** SSE last event ID in effect when the malformed frame was dispatched. */
20
+ readonly lastEventId: string | undefined;
21
+ constructor(options: {
22
+ format: EventStreamFormat;
23
+ raw: string;
24
+ cause: unknown;
25
+ line?: number;
26
+ event?: string;
27
+ lastEventId?: string;
28
+ });
29
+ }
30
+ type EventStreamReadOptions = {
31
+ /**
32
+ * Receives frames whose payload is not valid JSON. Malformed frames are skipped and the
33
+ * stream continues. Throwing from this callback aborts the stream with that error.
34
+ */
35
+ onParseError?: (error: EventStreamParseError) => void;
36
+ /** Throw the parse error instead of skipping malformed frames. */
37
+ strict?: boolean;
38
+ };
39
+ /** A dispatched Server-Sent Event with its parsed JSON payload. */
40
+ type SseFrame<TEvent> = {
41
+ data: TEvent;
42
+ /** Event name from the `event:` field, `"message"` when absent. */
43
+ event: string;
44
+ /** Last event ID set by an `id:` field in this or an earlier frame, `""` when none. */
45
+ lastEventId: string;
46
+ /** Most recent valid `retry:` reconnection time in milliseconds. */
47
+ retry?: number;
48
+ };
49
+ declare function readJsonlStream<TEvent>(stream: ReadableStream<Uint8Array>, options?: EventStreamReadOptions): AsyncIterable<TEvent>;
50
+ declare function readSseStream<TEvent>(stream: ReadableStream<Uint8Array>, options?: EventStreamReadOptions): AsyncIterable<TEvent>;
51
+ declare function readSseFrames<TEvent>(stream: ReadableStream<Uint8Array>, options?: EventStreamReadOptions): AsyncIterable<SseFrame<TEvent>>;
52
+ type FetchEventStreamOptions = Omit<RequestInit, "headers"> & {
53
+ input: string | URL | Request;
54
+ format?: EventStreamFormat | "auto";
55
+ fetch?: typeof fetch;
56
+ headers?: HeadersInit;
57
+ validateResponse?: (response: Response) => void;
58
+ onParseError?: EventStreamReadOptions["onParseError"];
59
+ };
60
+ declare class EventStreamHttpError extends Error {
61
+ readonly response: Response;
62
+ readonly body: string;
63
+ constructor(response: Response, body: string);
64
+ }
65
+ declare function fetchEventStream<TEvent>(options: FetchEventStreamOptions): AsyncIterable<TEvent>;
66
+ type EventTransportContext<TRequest> = EventTransportSendOptions<TRequest>;
67
+ type EventTransportBodyContext<TRequest> = Omit<EventTransportContext<TRequest>, "headers"> & {
68
+ headers: Headers;
69
+ };
70
+ type CreateFetchEventTransportOptions<TRequest, TEvent> = {
71
+ endpoint: string | URL | ((context: EventTransportContext<TRequest>) => string | URL);
72
+ method?: string;
73
+ format?: EventStreamFormat | "auto";
74
+ fetch?: typeof fetch;
75
+ headers?: HeadersInit | ((context: EventTransportContext<TRequest>) => HeadersInit | Promise<HeadersInit>);
76
+ body?: (context: EventTransportBodyContext<TRequest>) => BodyInit | null | undefined | Promise<BodyInit | null | undefined>;
77
+ init?: Omit<RequestInit, "body" | "headers" | "method" | "signal">;
78
+ mapEvent?: (event: unknown) => TEvent;
79
+ validateResponse?: (response: Response) => void;
80
+ /** Receives malformed frames that were skipped instead of aborting the stream. */
81
+ onParseError?: FetchEventStreamOptions["onParseError"];
82
+ };
83
+ declare function createFetchEventTransport<TRequest, TEvent = unknown>(options: CreateFetchEventTransportOptions<TRequest, TEvent>): EventTransport<TRequest, TEvent>;
84
+ declare function createDirectEventTransport<TRequest, TEvent>(options: {
85
+ handler(context: EventTransportContext<TRequest>): AsyncIterable<TEvent>;
86
+ }): EventTransport<TRequest, TEvent>;
87
+ export { FetchEventStreamOptions as a, EventStreamReadOptions as c, readSseFrames as d, readSseStream as f, EventTransportSendOptions as h, EventStreamHttpError as i, SseFrame as l, EventTransport as m, createDirectEventTransport as n, fetchEventStream as o, EventStreamFormat as p, createFetchEventTransport as r, EventStreamParseError as s, CreateFetchEventTransportOptions as t, readJsonlStream as u };
88
+ //# sourceMappingURL=event-transport-rXxwo4BK.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-transport-rXxwo4BK.d.ts","names":[],"sources":["../src/transport/types.ts","../src/transport/streams.ts","../src/transport/fetch.ts","../src/transport/event-transport.ts"],"mappings":"A,KAAY;KAEA,0BAA0B;EACpC,SAAS;EACT,cAAc;EACd,UAAU;;KAGA,eAAe,UAAU;EACnC,KAAK,SAAS,0BAA0B,YAAY,cAAc;;;cCNvD,8BAA8B;WAChC,QAAQ;;WAER;;WAEA;;WAEA;;WAEA;EAEG,YAAA;IACV,QAAQ;IACR;IACA;IACA;IACA;IACA;;;KAcQ;;;;;EAKV,gBAAgB,OAAO;;EAEvB;;;KAIU,SAAS;EACnB,MAAM;;EAEN;;EAEA;;EAEA;;iBAGqB,gBAAgB,QACrC,QAAQ,eAAe,aACvB,UAAS,yBACR,cAAc;iBAWM,cAAc,QACnC,QAAQ,eAAe,aACvB,UAAS,yBACR,cAAc;iBAIM,cAAc,QACnC,QAAQ,eAAe,aACvB,UAAS,yBACR,cAAc,SAAS;KC5Ed,0BAA0B,KAAK;EACzC,gBAAgB,MAAM;EACtB,SAAS;EACT,eAAe;EACf,UAAU;EACV,oBAAoB,UAAU;EAC9B,eAAe;;cAGJ,6BAA6B;WAE7B,UAAU;WACV;EADA,YAAA,UAAU,UACV;;iBAOU,iBAAiB,QACtC,SAAS,0BACR,cAAc;KCrBL,sBAAsB,YAAY,0BAA0B;KAE5D,0BAA0B,YAAY,KAChD,sBAAsB;EAGtB,SAAS;;KAGC,iCAAiC,UAAU;EACrD,mBAAmB,QAAQ,SAAS,sBAAsB,uBAAuB;EACjF;EACA,SAAS;EACT,eAAe;EACf,UACI,gBACE,SAAS,sBAAsB,cAAc,cAAc,QAAQ;EACzE,QACE,SAAS,0BAA0B,cAChC,8BAA8B,QAAQ;EAC3C,OAAO,KAAK;EACZ,YAAY,mBAAmB;EAC/B,oBAAoB,UAAU;;EAE9B,eAAe;;iBAGD,0BAA0B,UAAU,kBAClD,SAAS,iCAAiC,UAAU,UACnD,eAAe,UAAU;iBA+BZ,2BAA2B,UAAU,QAAQ;EAC3D,QAAQ,SAAS,sBAAsB,YAAY,cAAc;IAC/D,eAAe,UAAU"}