@beeos-ai/bma-sdk 1.0.1 → 2.0.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.
Files changed (79) hide show
  1. package/README.md +65 -132
  2. package/dist/beta.d.ts +55 -0
  3. package/dist/beta.js +69 -0
  4. package/dist/beta.js.map +1 -0
  5. package/dist/client.d.ts +32 -0
  6. package/dist/client.js +50 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/errors.d.ts +6 -75
  9. package/dist/errors.js +11 -105
  10. package/dist/errors.js.map +1 -1
  11. package/dist/extensions.d.ts +80 -0
  12. package/dist/extensions.js +24 -0
  13. package/dist/extensions.js.map +1 -0
  14. package/dist/generated/extensions-resources.d.ts +271 -0
  15. package/dist/generated/extensions-resources.js +255 -0
  16. package/dist/generated/extensions-resources.js.map +1 -0
  17. package/dist/generated/extensions.d.ts +3727 -0
  18. package/dist/generated/{rest.js → extensions.js} +1 -1
  19. package/dist/generated/extensions.js.map +1 -0
  20. package/dist/idempotency.d.ts +4 -0
  21. package/dist/idempotency.js +7 -0
  22. package/dist/idempotency.js.map +1 -0
  23. package/dist/index.d.ts +9 -55
  24. package/dist/index.js +9 -57
  25. package/dist/index.js.map +1 -1
  26. package/dist/internal.d.ts +9 -0
  27. package/dist/internal.js +32 -0
  28. package/dist/internal.js.map +1 -0
  29. package/dist/resume.d.ts +22 -0
  30. package/dist/resume.js +122 -0
  31. package/dist/resume.js.map +1 -0
  32. package/dist/version.d.ts +1 -1
  33. package/dist/version.js +3 -3
  34. package/dist/version.js.map +1 -1
  35. package/package.json +6 -12
  36. package/dist/core.d.ts +0 -105
  37. package/dist/core.js +0 -406
  38. package/dist/core.js.map +0 -1
  39. package/dist/facade-extensions.d.ts +0 -27
  40. package/dist/facade-extensions.js +0 -47
  41. package/dist/facade-extensions.js.map +0 -1
  42. package/dist/generated/facade-extensions-operations.d.ts +0 -133
  43. package/dist/generated/facade-extensions-operations.js +0 -11
  44. package/dist/generated/facade-extensions-operations.js.map +0 -1
  45. package/dist/generated/facade-extensions-resources.d.ts +0 -34
  46. package/dist/generated/facade-extensions-resources.js +0 -47
  47. package/dist/generated/facade-extensions-resources.js.map +0 -1
  48. package/dist/generated/facade-extensions-types.d.ts +0 -14
  49. package/dist/generated/facade-extensions-types.js +0 -2
  50. package/dist/generated/facade-extensions-types.js.map +0 -1
  51. package/dist/generated/facade-extensions.d.ts +0 -507
  52. package/dist/generated/facade-extensions.js +0 -6
  53. package/dist/generated/facade-extensions.js.map +0 -1
  54. package/dist/generated/rest-operations.d.ts +0 -4079
  55. package/dist/generated/rest-operations.js +0 -234
  56. package/dist/generated/rest-operations.js.map +0 -1
  57. package/dist/generated/rest-resources.d.ts +0 -666
  58. package/dist/generated/rest-resources.js +0 -1124
  59. package/dist/generated/rest-resources.js.map +0 -1
  60. package/dist/generated/rest-types.d.ts +0 -572
  61. package/dist/generated/rest-types.js +0 -2
  62. package/dist/generated/rest-types.js.map +0 -1
  63. package/dist/generated/rest.d.ts +0 -18519
  64. package/dist/generated/rest.js.map +0 -1
  65. package/dist/lib/artifacts.d.ts +0 -14
  66. package/dist/lib/artifacts.js +0 -56
  67. package/dist/lib/artifacts.js.map +0 -1
  68. package/dist/lib/tool-runner.d.ts +0 -99
  69. package/dist/lib/tool-runner.js +0 -140
  70. package/dist/lib/tool-runner.js.map +0 -1
  71. package/dist/pagination.d.ts +0 -31
  72. package/dist/pagination.js +0 -66
  73. package/dist/pagination.js.map +0 -1
  74. package/dist/resource.d.ts +0 -8
  75. package/dist/resource.js +0 -9
  76. package/dist/resource.js.map +0 -1
  77. package/dist/streaming.d.ts +0 -27
  78. package/dist/streaming.js +0 -89
  79. package/dist/streaming.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/generated/rest.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,14 +0,0 @@
1
- import type { RequestOptions } from "../core.js";
2
- import type { Artifact } from "../generated/rest-types.js";
3
- import { APIResource } from "../resource.js";
4
- export interface DownloadArtifactOptions extends RequestOptions {
5
- /** Explicit product limit; artifacts larger than this are refused. */
6
- maxBytes: number;
7
- }
8
- export declare class ArtifactsBase extends APIResource {
9
- /**
10
- * Downloads artifact content and verifies its size and sha256 digest. The
11
- * whole body is buffered, bounded by maxBytes.
12
- */
13
- downloadVerified(artifact: Artifact, options: DownloadArtifactOptions): Promise<Uint8Array<ArrayBuffer>>;
14
- }
@@ -1,56 +0,0 @@
1
- import { BmaError } from "../errors.js";
2
- import { OP } from "../generated/rest-operations.js";
3
- import { APIResource } from "../resource.js";
4
- export class ArtifactsBase extends APIResource {
5
- /**
6
- * Downloads artifact content and verifies its size and sha256 digest. The
7
- * whole body is buffered, bounded by maxBytes.
8
- */
9
- async downloadVerified(artifact, options) {
10
- const { maxBytes, ...request } = options;
11
- const size = artifact.size_bytes;
12
- if (!(maxBytes > 0))
13
- throw new BmaError("bma: maxBytes is required");
14
- if (size === undefined || size < 0 || size > maxBytes) {
15
- throw new BmaError("bma: artifact size is missing or exceeds maxBytes");
16
- }
17
- const digest = artifact.digest ?? "";
18
- if (!/^sha256:[0-9a-f]{64}$/.test(digest))
19
- throw new BmaError("bma: artifact digest must be sha256:<hex>");
20
- const response = await this._client._request(OP.getArtifactContent, { agentID: artifact.agent_id, artifactID: artifact.id }, { org_id: artifact.org_id, project_id: artifact.project_id }, request);
21
- const bytes = await readAtMost(response, size + 1);
22
- if (bytes.byteLength !== size)
23
- throw new BmaError(`bma: artifact size = ${bytes.byteLength}, want ${size}`);
24
- const hash = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
25
- const actual = Array.from(hash, (b) => b.toString(16).padStart(2, "0")).join("");
26
- if (`sha256:${actual}` !== digest)
27
- throw new BmaError("bma: artifact digest mismatch");
28
- return bytes;
29
- }
30
- }
31
- async function readAtMost(response, limit) {
32
- const reader = response.body?.getReader();
33
- if (!reader)
34
- return new Uint8Array();
35
- const chunks = [];
36
- let total = 0;
37
- for (;;) {
38
- const { done, value } = await reader.read();
39
- if (done)
40
- break;
41
- chunks.push(value);
42
- total += value.byteLength;
43
- if (total >= limit) {
44
- await reader.cancel();
45
- break;
46
- }
47
- }
48
- const out = new Uint8Array(total);
49
- let offset = 0;
50
- for (const chunk of chunks) {
51
- out.set(chunk, offset);
52
- offset += chunk.byteLength;
53
- }
54
- return out;
55
- }
56
- //# sourceMappingURL=artifacts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- import type { RequestOptions } from "../core.js";
2
- import type { AgentConfigDefinitionTool, SubmitToolResultContentBlock, ToolCall } from "../generated/rest-types.js";
3
- import { APIResource } from "../resource.js";
4
- /** The Standard Schema v1 interface (https://standardschema.dev), as published. */
5
- export interface StandardSchemaV1<Input = unknown, Output = Input> {
6
- readonly "~standard": {
7
- readonly version: 1;
8
- readonly vendor: string;
9
- readonly validate: (value: unknown) => StandardResult<Output> | Promise<StandardResult<Output>>;
10
- readonly types?: {
11
- readonly input: Input;
12
- readonly output: Output;
13
- } | undefined;
14
- /** Standard JSON Schema (zod >= 4.2, valibot via toStandardJsonSchema). */
15
- readonly jsonSchema?: {
16
- readonly input: (options: {
17
- target: string;
18
- }) => Record<string, unknown>;
19
- };
20
- };
21
- }
22
- type StandardResult<Output> = {
23
- readonly value: Output;
24
- readonly issues?: undefined;
25
- } | {
26
- readonly issues: ReadonlyArray<{
27
- readonly message: string;
28
- readonly path?: ReadonlyArray<PropertyKey | {
29
- key: PropertyKey;
30
- }>;
31
- }>;
32
- };
33
- type InferOutput<S extends StandardSchemaV1> = NonNullable<S["~standard"]["types"]>["output"];
34
- /** What a tool returns: text, or result content blocks. */
35
- export type ToolOutput = string | SubmitToolResultContentBlock[];
36
- /** Throw from `run` to report a failed call with this content to the model. */
37
- export declare class ToolError extends Error {
38
- readonly content: ToolOutput;
39
- constructor(content: ToolOutput);
40
- }
41
- export interface ToolRunContext {
42
- toolCall: ToolCall;
43
- signal: AbortSignal;
44
- }
45
- export interface RunnableTool<Input = unknown> {
46
- readonly name: string;
47
- /** Agent config entry for `tools.<name>`. */
48
- readonly definition: AgentConfigDefinitionTool & {
49
- type: "custom";
50
- description: string;
51
- };
52
- parse(input: unknown): Promise<Input>;
53
- run(input: Input, context: ToolRunContext): ToolOutput | Promise<ToolOutput>;
54
- }
55
- /**
56
- * Defines a custom tool from a Standard Schema (zod, valibot, arktype). The
57
- * input is validated before `run` sees it; the JSON Schema for the agent
58
- * config comes from the schema's Standard JSON Schema or `jsonSchema`.
59
- */
60
- export declare function defineTool<S extends StandardSchemaV1>(options: {
61
- name: string;
62
- description: string;
63
- inputSchema: S;
64
- /** JSON Schema of the input; derived from `inputSchema` when omitted. */
65
- jsonSchema?: Record<string, unknown>;
66
- run: (input: InferOutput<S>, context: ToolRunContext) => ToolOutput | Promise<ToolOutput>;
67
- }): RunnableTool<InferOutput<S>>;
68
- export interface ToolRunnerParams {
69
- /** Only calls made in this session (calls of subagents are always handled). */
70
- session_id?: string;
71
- tools: RunnableTool<any>[];
72
- org_id?: string;
73
- project_id?: string;
74
- /**
75
- * Event stream reconnects in a row that receive no data before the runner
76
- * fails; unlimited by default (with backoff up to 8 s), so a runner rides
77
- * out deployments. Independent of `maxRetries`, which bounds each request.
78
- */
79
- max_reconnects?: number;
80
- }
81
- /** A running tool consumer. */
82
- export interface ToolRunner {
83
- /** Resolves when the runner stops; rejects with the error that stopped it. */
84
- done(): Promise<void>;
85
- /** Stops listening and waits for running tools to finish. */
86
- stop(): Promise<void>;
87
- }
88
- export declare class ToolCallsBase extends APIResource {
89
- /**
90
- * Runs custom tools for an agent: every `ready` custom call (of the agent
91
- * and its subagents) whose name matches a tool is parsed, run, and its
92
- * result submitted. Ready calls are listed on every (re)connection of the
93
- * event stream, so calls that became ready while disconnected are not lost.
94
- * A 409 on submit (another consumer answered the call first) counts as
95
- * handled. `done()` rejects only with the error that stopped the runner.
96
- */
97
- runner(agentId: string, params: ToolRunnerParams, options?: RequestOptions): ToolRunner;
98
- }
99
- export {};
@@ -1,140 +0,0 @@
1
- import { BmaError, ConflictError } from "../errors.js";
2
- import { OP } from "../generated/rest-operations.js";
3
- import { APIResource } from "../resource.js";
4
- /** Throw from `run` to report a failed call with this content to the model. */
5
- export class ToolError extends Error {
6
- content;
7
- constructor(content) {
8
- super(typeof content === "string" ? content : "tool error");
9
- this.name = "ToolError";
10
- this.content = content;
11
- }
12
- }
13
- /**
14
- * Defines a custom tool from a Standard Schema (zod, valibot, arktype). The
15
- * input is validated before `run` sees it; the JSON Schema for the agent
16
- * config comes from the schema's Standard JSON Schema or `jsonSchema`.
17
- */
18
- export function defineTool(options) {
19
- const std = options.inputSchema["~standard"];
20
- const schema = options.jsonSchema ?? std.jsonSchema?.input({ target: "draft-2020-12" });
21
- if (!schema) {
22
- throw new BmaError(`bma: cannot derive a JSON Schema from this ${std.vendor} schema; pass jsonSchema or use a library implementing Standard JSON Schema (zod >= 4.2)`);
23
- }
24
- if (schema.type !== "object")
25
- throw new BmaError(`bma: input schema of tool ${options.name} must be an object`);
26
- return {
27
- name: options.name,
28
- definition: {
29
- type: "custom",
30
- description: options.description,
31
- input_schema: schema,
32
- },
33
- async parse(input) {
34
- const result = await std.validate(input);
35
- if (result.issues) {
36
- const detail = result.issues
37
- .slice(0, 5)
38
- .map((i) => {
39
- const path = (i.path ?? []).map((p) => String(typeof p === "object" ? p.key : p)).join(".");
40
- return path ? `${path}: ${i.message}` : i.message;
41
- })
42
- .join("; ");
43
- throw new ToolError(`invalid input for ${options.name}: ${detail}`);
44
- }
45
- return result.value;
46
- },
47
- run: options.run,
48
- };
49
- }
50
- export class ToolCallsBase extends APIResource {
51
- /**
52
- * Runs custom tools for an agent: every `ready` custom call (of the agent
53
- * and its subagents) whose name matches a tool is parsed, run, and its
54
- * result submitted. Ready calls are listed on every (re)connection of the
55
- * event stream, so calls that became ready while disconnected are not lost.
56
- * A 409 on submit (another consumer answered the call first) counts as
57
- * handled. `done()` rejects only with the error that stopped the runner.
58
- */
59
- runner(agentId, params, options) {
60
- const tools = new Map(params.tools.map((t) => [t.name, t]));
61
- if (tools.size !== params.tools.length)
62
- throw new BmaError("bma: tool names must be unique");
63
- const scope = { org_id: params.org_id, project_id: params.project_id };
64
- const controller = new AbortController();
65
- options?.signal?.addEventListener("abort", () => controller.abort(), { once: true });
66
- // Calls being run or submitted; a call leaves the set once its result is
67
- // stored, after which the server no longer reports it as ready.
68
- const inFlight = new Set();
69
- const running = new Set();
70
- let failure;
71
- const fail = (error) => {
72
- failure ??= error;
73
- controller.abort();
74
- };
75
- const handle = (call) => {
76
- const tool = tools.get(call.name);
77
- if (call.type !== "custom" || call.state !== "ready" || !tool || inFlight.has(call.id))
78
- return;
79
- if (params.session_id && call.agent_id === agentId && call.session_id !== params.session_id)
80
- return;
81
- inFlight.add(call.id);
82
- const task = (async () => {
83
- let outcome = "succeeded";
84
- let output;
85
- try {
86
- output = await tool.run(await tool.parse(call.input), { toolCall: call, signal: controller.signal });
87
- }
88
- catch (error) {
89
- outcome = "failed";
90
- output = error instanceof ToolError ? error.content : error instanceof Error ? error.message : String(error);
91
- }
92
- const content_blocks = typeof output === "string" ? [{ type: "text", text: output }] : output;
93
- try {
94
- await this._client._request(OP.submitToolCallResult, { agentID: call.agent_id, toolCallID: call.id }, { ...scope, outcome, content_blocks }, { ...options, signal: undefined });
95
- }
96
- catch (error) {
97
- if (!(error instanceof ConflictError))
98
- throw error;
99
- }
100
- finally {
101
- inFlight.delete(call.id);
102
- }
103
- })().catch(fail);
104
- running.add(task);
105
- void task.finally(() => running.delete(task));
106
- };
107
- const sweep = async () => {
108
- const pages = this._client._page(OP.listToolCalls, { agentID: agentId }, { ...scope, state: "ready", type: "custom", include_subagents: true }, { ...options, signal: controller.signal });
109
- for await (const call of pages)
110
- handle(call);
111
- };
112
- const stream = this._client._stream(OP.streamEvents, { agentID: agentId }, { ...scope, ...(params.session_id ? { session_id: params.session_id } : {}) }, { ...options, signal: controller.signal }, { onOpen: () => void sweep().catch(fail), maxReconnects: params.max_reconnects ?? Number.POSITIVE_INFINITY });
113
- const finished = (async () => {
114
- try {
115
- for await (const event of stream) {
116
- if (event.event !== "tool_call_update" || event.data.state !== "ready")
117
- continue;
118
- const { tool_call } = await this._client._request(OP.getToolCall, { agentID: event.data.agent_id ?? agentId, toolCallID: event.data.tool_call_id }, scope, { ...options, signal: controller.signal });
119
- handle(tool_call);
120
- }
121
- }
122
- catch (error) {
123
- if (!controller.signal.aborted)
124
- fail(error);
125
- }
126
- while (running.size > 0)
127
- await Promise.allSettled([...running]);
128
- if (failure !== undefined)
129
- throw failure;
130
- })();
131
- return {
132
- done: () => finished,
133
- stop: async () => {
134
- controller.abort();
135
- await finished;
136
- },
137
- };
138
- }
139
- }
140
- //# sourceMappingURL=tool-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-runner.js","sourceRoot":"","sources":["../../src/lib/tool-runner.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- /** Response body of a paginated operation. */
2
- export interface CursorPageBody {
3
- data: unknown[];
4
- }
5
- export type PageItem<R extends CursorPageBody> = R["data"][number];
6
- export interface PageMethods<R extends CursorPageBody> {
7
- hasNextPage(): boolean;
8
- /** Fetches the next page; throws when there is none. */
9
- getNextPage(): Promise<Page<R>>;
10
- /** This page and every following page. */
11
- iterPages(): AsyncGenerator<Page<R>>;
12
- /** Every item of this page and every following page. */
13
- [Symbol.asyncIterator](): AsyncGenerator<PageItem<R>>;
14
- }
15
- /** One page: the response body plus navigation helpers. */
16
- export type Page<R extends CursorPageBody> = R & PageMethods<R>;
17
- type Cursor = string | number;
18
- type FetchPage<R> = (cursor: Cursor | undefined) => Promise<R>;
19
- type NextCursor = (body: CursorPageBody) => Cursor | undefined;
20
- /** `await` for the first page, `for await` for every item. */
21
- export declare class PagePromise<R extends CursorPageBody> implements Promise<Page<R>>, AsyncIterable<PageItem<R>> {
22
- #private;
23
- readonly [Symbol.toStringTag] = "PagePromise";
24
- /** @internal */
25
- constructor(fetchPage: FetchPage<R>, nextCursor: NextCursor);
26
- then<A = Page<R>, B = never>(onfulfilled?: ((value: Page<R>) => A | PromiseLike<A>) | null, onrejected?: ((reason: unknown) => B | PromiseLike<B>) | null): Promise<A | B>;
27
- catch<B = never>(onrejected?: ((reason: unknown) => B | PromiseLike<B>) | null): Promise<Page<R> | B>;
28
- finally(onfinally?: (() => void) | null): Promise<Page<R>>;
29
- [Symbol.asyncIterator](): AsyncGenerator<PageItem<R>>;
30
- }
31
- export {};
@@ -1,66 +0,0 @@
1
- // Pagination. Mirrors the Stainless PagePromise of @anthropic-ai/sdk and
2
- // openai: `await` resolves to the first page, `for await` walks every item
3
- // across pages. Applies to every list whose response is
4
- // `{ data: [...], next_<param> }` for a query parameter <param>: `cursor`,
5
- // `page`, `before_id`/`after_id`, `before_sequence`/`after_sequence` (as the
6
- // Anthropic Page supports before_id/after_id).
7
- import { BmaError } from "./errors.js";
8
- function makePage(body, fetchPage, nextCursor) {
9
- const methods = {
10
- hasNextPage: () => nextCursor(body) !== undefined,
11
- getNextPage: async () => {
12
- const next = nextCursor(body);
13
- if (next === undefined)
14
- throw new BmaError("bma: no next page; check hasNextPage() first");
15
- return makePage(await fetchPage(next), fetchPage, nextCursor);
16
- },
17
- iterPages: async function* () {
18
- let page = makePage(body, fetchPage, nextCursor);
19
- yield page;
20
- while (page.hasNextPage()) {
21
- page = await page.getNextPage();
22
- yield page;
23
- }
24
- },
25
- [Symbol.asyncIterator]: async function* () {
26
- for await (const page of methods.iterPages())
27
- yield* page.data;
28
- },
29
- };
30
- // Methods are non-enumerable so JSON.stringify(page) is the wire body.
31
- const page = Object.create(null);
32
- Object.assign(page, body);
33
- for (const [key, value] of [...Object.entries(methods), [Symbol.asyncIterator, methods[Symbol.asyncIterator]]]) {
34
- Object.defineProperty(page, key, { value, enumerable: false });
35
- }
36
- return page;
37
- }
38
- /** `await` for the first page, `for await` for every item. */
39
- export class PagePromise {
40
- [Symbol.toStringTag] = "PagePromise";
41
- #first;
42
- #fetchPage;
43
- #nextCursor;
44
- /** @internal */
45
- constructor(fetchPage, nextCursor) {
46
- this.#fetchPage = fetchPage;
47
- this.#nextCursor = nextCursor;
48
- }
49
- #page() {
50
- this.#first ??= this.#fetchPage(undefined).then((body) => makePage(body, this.#fetchPage, this.#nextCursor));
51
- return this.#first;
52
- }
53
- then(onfulfilled, onrejected) {
54
- return this.#page().then(onfulfilled, onrejected);
55
- }
56
- catch(onrejected) {
57
- return this.#page().catch(onrejected);
58
- }
59
- finally(onfinally) {
60
- return this.#page().finally(onfinally);
61
- }
62
- async *[Symbol.asyncIterator]() {
63
- yield* await this.#page();
64
- }
65
- }
66
- //# sourceMappingURL=pagination.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { ClientCore } from "./core.js";
2
- export type { ClientCore };
3
- /** Base class of every generated resource. */
4
- export declare class APIResource {
5
- /** @internal */
6
- protected readonly _client: ClientCore;
7
- constructor(client: ClientCore);
8
- }
package/dist/resource.js DELETED
@@ -1,9 +0,0 @@
1
- /** Base class of every generated resource. */
2
- export class APIResource {
3
- /** @internal */
4
- _client;
5
- constructor(client) {
6
- this._client = client;
7
- }
8
- }
9
- //# sourceMappingURL=resource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAIA,8CAA8C;AAC9C,MAAM,OAAO,WAAW;IACtB,gBAAgB;IACG,OAAO,CAAa;IAEvC,YAAY,MAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;CACF"}
@@ -1,27 +0,0 @@
1
- /**
2
- * A typed event stream. Iterate it once with `for await`; `abort()` closes it.
3
- * Like EventSource, the stream does not end when the server closes the
4
- * connection: it reconnects from the last durable frame until the reconnect
5
- * budget is spent, then throws.
6
- */
7
- export declare class Stream<T> implements AsyncIterable<T> {
8
- #private;
9
- readonly controller: AbortController;
10
- /** @internal */
11
- constructor(iterate: (signal: AbortSignal) => AsyncGenerator<T>, controller: AbortController);
12
- [Symbol.asyncIterator](): AsyncGenerator<T>;
13
- /** Closes the connection; a pending iteration ends with APIUserAbortError. */
14
- abort(): void;
15
- }
16
- /** @internal One raw SSE frame. */
17
- export interface RawSSEFrame {
18
- event: string;
19
- id?: string;
20
- data: string;
21
- }
22
- /**
23
- * @internal Minimal text/event-stream parser (WHATWG HTML §9.2.6 field rules).
24
- * A frame not terminated by a blank line when the body ends is discarded, as
25
- * the spec requires. `onLine` runs for every line, comments included.
26
- */
27
- export declare function parseSSE(body: ReadableStream<Uint8Array>, onLine?: () => void): AsyncGenerator<RawSSEFrame>;
package/dist/streaming.js DELETED
@@ -1,89 +0,0 @@
1
- // Server-sent event streams.
2
- import { BmaError } from "./errors.js";
3
- /**
4
- * A typed event stream. Iterate it once with `for await`; `abort()` closes it.
5
- * Like EventSource, the stream does not end when the server closes the
6
- * connection: it reconnects from the last durable frame until the reconnect
7
- * budget is spent, then throws.
8
- */
9
- export class Stream {
10
- controller;
11
- #iterate;
12
- #used = false;
13
- /** @internal */
14
- constructor(iterate, controller) {
15
- this.#iterate = iterate;
16
- this.controller = controller;
17
- }
18
- [Symbol.asyncIterator]() {
19
- if (this.#used)
20
- throw new BmaError("bma: a Stream can be iterated only once");
21
- this.#used = true;
22
- return this.#iterate(this.controller.signal);
23
- }
24
- /** Closes the connection; a pending iteration ends with APIUserAbortError. */
25
- abort() {
26
- this.controller.abort();
27
- }
28
- }
29
- /**
30
- * @internal Minimal text/event-stream parser (WHATWG HTML §9.2.6 field rules).
31
- * A frame not terminated by a blank line when the body ends is discarded, as
32
- * the spec requires. `onLine` runs for every line, comments included.
33
- */
34
- export async function* parseSSE(body, onLine) {
35
- const decoder = new TextDecoder();
36
- let buffer = "";
37
- let event = "";
38
- let id;
39
- let data = [];
40
- const dispatch = () => {
41
- const frame = data.length > 0 ? { event: event || "message", id, data: data.join("\n") } : undefined;
42
- event = "";
43
- id = undefined;
44
- data = [];
45
- return frame;
46
- };
47
- const reader = body.getReader();
48
- try {
49
- for (;;) {
50
- const { done, value } = await reader.read();
51
- buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
52
- let newline;
53
- while ((newline = buffer.search(/\r\n|\r|\n/)) >= 0) {
54
- // A trailing \r may be the first half of a \r\n split across chunks.
55
- if (!done && newline === buffer.length - 1 && buffer.endsWith("\r"))
56
- break;
57
- const line = buffer.slice(0, newline);
58
- buffer = buffer.slice(newline + (buffer.startsWith("\r\n", newline) ? 2 : 1));
59
- onLine?.();
60
- if (line === "") {
61
- const frame = dispatch();
62
- if (frame)
63
- yield frame;
64
- continue;
65
- }
66
- if (line.startsWith(":"))
67
- continue;
68
- const colon = line.indexOf(":");
69
- const name = colon < 0 ? line : line.slice(0, colon);
70
- let value = colon < 0 ? "" : line.slice(colon + 1);
71
- if (value.startsWith(" "))
72
- value = value.slice(1);
73
- if (name === "event")
74
- event = value;
75
- else if (name === "id")
76
- id = value;
77
- else if (name === "data")
78
- data.push(value);
79
- }
80
- if (done)
81
- return; // an unterminated frame is discarded
82
- }
83
- }
84
- finally {
85
- await reader.cancel().catch(() => undefined);
86
- reader.releaseLock();
87
- }
88
- }
89
- //# sourceMappingURL=streaming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}