@miao-ai/node 0.1.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 (48) hide show
  1. package/README.md +40 -0
  2. package/dist/LICENSE-APACHE +201 -0
  3. package/dist/LICENSE-MIT +21 -0
  4. package/dist/async-queue.d.ts +10 -0
  5. package/dist/async-queue.d.ts.map +1 -0
  6. package/dist/async-queue.js +62 -0
  7. package/dist/async-queue.js.map +1 -0
  8. package/dist/auth.d.ts +34 -0
  9. package/dist/auth.d.ts.map +1 -0
  10. package/dist/auth.js +49 -0
  11. package/dist/auth.js.map +1 -0
  12. package/dist/binary.d.ts +14 -0
  13. package/dist/binary.d.ts.map +1 -0
  14. package/dist/binary.js +192 -0
  15. package/dist/binary.js.map +1 -0
  16. package/dist/errors.d.ts +17 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +23 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/http-transport.d.ts +46 -0
  21. package/dist/http-transport.d.ts.map +1 -0
  22. package/dist/http-transport.js +286 -0
  23. package/dist/http-transport.js.map +1 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +11 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/miao.d.ts +39 -0
  29. package/dist/miao.d.ts.map +1 -0
  30. package/dist/miao.js +74 -0
  31. package/dist/miao.js.map +1 -0
  32. package/dist/ndjson.d.ts +9 -0
  33. package/dist/ndjson.d.ts.map +1 -0
  34. package/dist/ndjson.js +17 -0
  35. package/dist/ndjson.js.map +1 -0
  36. package/dist/process-transport.d.ts +36 -0
  37. package/dist/process-transport.d.ts.map +1 -0
  38. package/dist/process-transport.js +303 -0
  39. package/dist/process-transport.js.map +1 -0
  40. package/dist/socket-transport.d.ts +31 -0
  41. package/dist/socket-transport.d.ts.map +1 -0
  42. package/dist/socket-transport.js +130 -0
  43. package/dist/socket-transport.js.map +1 -0
  44. package/dist/websocket-transport.d.ts +49 -0
  45. package/dist/websocket-transport.d.ts.map +1 -0
  46. package/dist/websocket-transport.js +217 -0
  47. package/dist/websocket-transport.js.map +1 -0
  48. package/package.json +59 -0
@@ -0,0 +1,36 @@
1
+ import { type MiaoTransport } from "@miao-ai/client";
2
+ import { type RuntimeDescriptor, type RuntimeFrame, type RuntimeProfile } from "@miao-ai/protocol";
3
+ import { type RuntimeBinaryResolverOptions } from "./binary.js";
4
+ export interface ProcessTransportOptions extends RuntimeBinaryResolverOptions {
5
+ profile?: RuntimeProfile;
6
+ /** Runtime state directory passed as --miao-dir. */
7
+ dataDir?: string;
8
+ /** Passed by environment for Runtime builds that support workspace selection. */
9
+ workspaceRoot?: string;
10
+ env?: NodeJS.ProcessEnv;
11
+ /** Secrets are injected only through the child environment and are always redacted from stderr. */
12
+ secrets?: Readonly<Record<string, string | undefined>>;
13
+ onStderr?: (line: string) => void;
14
+ startupTimeoutMs?: number;
15
+ shutdownTimeoutMs?: number;
16
+ maxLineBytes?: number;
17
+ maxStderrLineBytes?: number;
18
+ frameBufferSize?: number;
19
+ expectedPlatformVersion?: string | ((platformVersion: string) => boolean);
20
+ skipDescriptorCheck?: boolean;
21
+ /** Non-secret arguments inserted before miao-runtime arguments (useful for executable wrappers). */
22
+ binaryArguments?: readonly string[];
23
+ }
24
+ /** A strict NDJSON transport backed by a managed miao-runtime child process. */
25
+ export declare class ProcessTransport implements MiaoTransport {
26
+ #private;
27
+ constructor(options?: ProcessTransportOptions);
28
+ get descriptor(): RuntimeDescriptor | undefined;
29
+ get pid(): number | undefined;
30
+ connect(): Promise<void>;
31
+ send(frame: RuntimeFrame): Promise<void>;
32
+ frames(): AsyncIterable<RuntimeFrame>;
33
+ close(): Promise<void>;
34
+ kill(): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=process-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-transport.d.ts","sourceRoot":"","sources":["../src/process-transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAwB,KAAK,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAOtF,MAAM,WAAW,uBAAwB,SAAQ,4BAA4B;IAC3E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,mGAAmG;IACnG,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAC1E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oGAAoG;IACpG,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAgJD,gFAAgF;AAChF,qBAAa,gBAAiB,YAAW,aAAa;;gBAYxC,OAAO,GAAE,uBAA4B;IAOjD,IAAI,UAAU,IAAI,iBAAiB,GAAG,SAAS,CAE9C;IAED,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCxB,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C,MAAM,IAAI,aAAa,CAAC,YAAY,CAAC;IAI/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA+D5B"}
@@ -0,0 +1,303 @@
1
+ import { spawn } from "node:child_process";
2
+ import { once } from "node:events";
3
+ import { resolve } from "node:path";
4
+ import { RuntimeExitedError, RuntimeSpawnError } from "@miao-ai/client";
5
+ import { RUNTIME_PROTOCOL_VERSION, } from "@miao-ai/protocol";
6
+ import { AsyncQueue } from "./async-queue.js";
7
+ import { resolveRuntimeBinary } from "./binary.js";
8
+ import { NodeTransportError, RuntimeDescriptorMismatchError, } from "./errors.js";
9
+ import { encodeFrameLine, StrictFrameDecoder } from "./ndjson.js";
10
+ function waitForChildExit(child, timeoutMs) {
11
+ if (child.exitCode !== null || child.signalCode !== null)
12
+ return Promise.resolve(true);
13
+ return new Promise((resolveWait) => {
14
+ const onExit = () => {
15
+ clearTimeout(timer);
16
+ resolveWait(true);
17
+ };
18
+ const timer = setTimeout(() => {
19
+ child.removeListener("exit", onExit);
20
+ resolveWait(false);
21
+ }, timeoutMs);
22
+ child.once("exit", onExit);
23
+ });
24
+ }
25
+ function environment(options) {
26
+ const env = { ...process.env };
27
+ for (const [name, value] of Object.entries(options.env ?? {})) {
28
+ if (value === undefined)
29
+ delete env[name];
30
+ else
31
+ env[name] = value;
32
+ }
33
+ for (const [name, value] of Object.entries(options.secrets ?? {})) {
34
+ if (value === undefined)
35
+ delete env[name];
36
+ else
37
+ env[name] = value;
38
+ }
39
+ env.MIAO_RUNTIME_PROFILE = options.profile ?? "stable";
40
+ if (options.workspaceRoot)
41
+ env.MIAO_WORKSPACE_ROOT = resolve(options.workspaceRoot);
42
+ return env;
43
+ }
44
+ function redactor(options) {
45
+ const values = new Set();
46
+ for (const [name, value] of [
47
+ ...Object.entries(options.secrets ?? {}),
48
+ ...Object.entries(options.env ?? {}),
49
+ ]) {
50
+ if (value && /(secret|token|password|api.?key|credential)/i.test(name))
51
+ values.add(value);
52
+ }
53
+ const ordered = [...values].sort((left, right) => right.length - left.length);
54
+ return (value) => ordered.reduce((text, secret) => text.split(secret).join("[REDACTED]"), value);
55
+ }
56
+ function binaryArguments(options) {
57
+ const args = [...(options.binaryArguments ?? [])];
58
+ const secrets = Object.values(options.secrets ?? {}).filter((value) => Boolean(value));
59
+ if (args.some((argument) => secrets.some((secret) => argument.includes(secret)))) {
60
+ throw new RuntimeSpawnError("refusing to place a configured secret in Runtime process arguments");
61
+ }
62
+ return args;
63
+ }
64
+ function assertDescriptor(value, options) {
65
+ if (!value || typeof value !== "object") {
66
+ throw new RuntimeDescriptorMismatchError("Miao Runtime describe output is not an object");
67
+ }
68
+ const descriptor = value;
69
+ if (descriptor.protocolVersion !== RUNTIME_PROTOCOL_VERSION) {
70
+ throw new RuntimeDescriptorMismatchError(`Miao Runtime protocol ${String(descriptor.protocolVersion)} is incompatible with ${RUNTIME_PROTOCOL_VERSION}`);
71
+ }
72
+ const profile = options.profile ?? "stable";
73
+ if (descriptor.profile !== profile) {
74
+ throw new RuntimeDescriptorMismatchError(`Miao Runtime profile ${String(descriptor.profile)} does not match requested profile ${profile}`);
75
+ }
76
+ if (typeof descriptor.platformVersion !== "string" || descriptor.platformVersion.length === 0) {
77
+ throw new RuntimeDescriptorMismatchError("Miao Runtime descriptor has no platform version");
78
+ }
79
+ const expectation = options.expectedPlatformVersion;
80
+ const compatible = expectation === undefined ||
81
+ (typeof expectation === "string"
82
+ ? descriptor.platformVersion === expectation
83
+ : expectation(descriptor.platformVersion));
84
+ if (!compatible) {
85
+ throw new RuntimeDescriptorMismatchError(`Miao Runtime platform version ${descriptor.platformVersion} is not accepted by this host`);
86
+ }
87
+ }
88
+ async function inspectRuntime(binaryPath, options) {
89
+ const dataDir = resolve(options.dataDir ?? ".miao");
90
+ const child = spawn(binaryPath, [...binaryArguments(options), "--miao-dir", dataDir, "describe", "--json"], {
91
+ cwd: options.cwd,
92
+ env: environment(options),
93
+ stdio: ["ignore", "pipe", "pipe"],
94
+ windowsHide: true,
95
+ shell: false,
96
+ });
97
+ const redact = redactor(options);
98
+ let stdout = "";
99
+ let stderr = "";
100
+ child.stdout.setEncoding("utf8");
101
+ child.stderr.setEncoding("utf8");
102
+ child.stdout.on("data", (chunk) => {
103
+ stdout += chunk;
104
+ if (stdout.length > 1024 * 1024)
105
+ child.kill("SIGKILL");
106
+ });
107
+ child.stderr.on("data", (chunk) => {
108
+ stderr += redact(chunk);
109
+ if (stderr.length > 64 * 1024)
110
+ stderr = stderr.slice(-64 * 1024);
111
+ });
112
+ const timeout = setTimeout(() => child.kill("SIGKILL"), options.startupTimeoutMs ?? 10_000);
113
+ let result;
114
+ try {
115
+ result = (await once(child, "exit"));
116
+ }
117
+ catch (error) {
118
+ throw new RuntimeSpawnError("failed to inspect the Miao Runtime binary", { cause: error });
119
+ }
120
+ finally {
121
+ clearTimeout(timeout);
122
+ }
123
+ if (result[0] !== 0) {
124
+ throw new RuntimeSpawnError(`Miao Runtime describe failed (code=${result[0] ?? "none"}, signal=${result[1] ?? "none"})${stderr.trim() ? `: ${stderr.trim()}` : ""}`);
125
+ }
126
+ let descriptor;
127
+ try {
128
+ descriptor = JSON.parse(stdout.trim());
129
+ }
130
+ catch (error) {
131
+ throw new RuntimeDescriptorMismatchError("Miao Runtime describe returned invalid JSON", { cause: error });
132
+ }
133
+ assertDescriptor(descriptor, options);
134
+ return { descriptor, stderr };
135
+ }
136
+ /** A strict NDJSON transport backed by a managed miao-runtime child process. */
137
+ export class ProcessTransport {
138
+ #options;
139
+ #frames;
140
+ #maxStderrLineBytes;
141
+ #child;
142
+ #decoder;
143
+ #connected = false;
144
+ #closing = false;
145
+ #exitListener;
146
+ #descriptor;
147
+ #stderrRemainder = "";
148
+ constructor(options = {}) {
149
+ this.#options = options;
150
+ this.#frames = new AsyncQueue(options.frameBufferSize ?? 256);
151
+ this.#decoder = new StrictFrameDecoder(options.maxLineBytes);
152
+ this.#maxStderrLineBytes = positive(options.maxStderrLineBytes ?? 64 * 1024, "maxStderrLineBytes");
153
+ }
154
+ get descriptor() {
155
+ return this.#descriptor;
156
+ }
157
+ get pid() {
158
+ return this.#child?.pid;
159
+ }
160
+ async connect() {
161
+ if (this.#connected)
162
+ return;
163
+ if (this.#closing)
164
+ throw new NodeTransportError("cannot reconnect a closed ProcessTransport");
165
+ const binaryPath = await resolveRuntimeBinary(this.#options);
166
+ if (!this.#options.skipDescriptorCheck) {
167
+ this.#descriptor = (await inspectRuntime(binaryPath, this.#options)).descriptor;
168
+ }
169
+ const dataDir = resolve(this.#options.dataDir ?? ".miao");
170
+ const child = spawn(binaryPath, [...binaryArguments(this.#options), "--miao-dir", dataDir, "serve"], {
171
+ cwd: this.#options.cwd,
172
+ env: environment(this.#options),
173
+ stdio: ["pipe", "pipe", "pipe"],
174
+ windowsHide: true,
175
+ shell: false,
176
+ });
177
+ this.#child = child;
178
+ child.stdout.on("data", (chunk) => this.#receiveStdout(chunk));
179
+ child.stderr.setEncoding("utf8");
180
+ child.stderr.on("data", (chunk) => this.#receiveStderr(chunk));
181
+ child.once("exit", (code, signal) => this.#onExit(code, signal));
182
+ const spawned = new Promise((resolveSpawn, rejectSpawn) => {
183
+ child.once("spawn", resolveSpawn);
184
+ child.once("error", rejectSpawn);
185
+ });
186
+ const timeout = setTimeout(() => child.kill("SIGKILL"), this.#options.startupTimeoutMs ?? 10_000);
187
+ try {
188
+ await spawned;
189
+ }
190
+ catch (error) {
191
+ this.#child = undefined;
192
+ throw new RuntimeSpawnError("failed to start the Miao Runtime process", { cause: error });
193
+ }
194
+ finally {
195
+ clearTimeout(timeout);
196
+ }
197
+ this.#connected = true;
198
+ this.#exitListener = () => child.kill("SIGTERM");
199
+ process.once("exit", this.#exitListener);
200
+ }
201
+ async send(frame) {
202
+ const child = this.#child;
203
+ if (!this.#connected || !child || !child.stdin.writable) {
204
+ throw new NodeTransportError("Miao Runtime process is not connected");
205
+ }
206
+ const line = encodeFrameLine(frame);
207
+ if (!child.stdin.write(line, "utf8"))
208
+ await once(child.stdin, "drain");
209
+ }
210
+ frames() {
211
+ return this.#frames;
212
+ }
213
+ async close() {
214
+ if (this.#closing)
215
+ return;
216
+ this.#closing = true;
217
+ const child = this.#child;
218
+ if (!child) {
219
+ this.#frames.close();
220
+ return;
221
+ }
222
+ child.stdin.end();
223
+ const graceful = await waitForChildExit(child, this.#options.shutdownTimeoutMs ?? 5_000);
224
+ if (!graceful && child.exitCode === null) {
225
+ child.kill("SIGTERM");
226
+ const terminated = await waitForChildExit(child, 1_000);
227
+ if (!terminated && child.exitCode === null)
228
+ child.kill("SIGKILL");
229
+ }
230
+ this.#frames.close();
231
+ }
232
+ async kill() {
233
+ if (this.#closing)
234
+ return;
235
+ this.#closing = true;
236
+ const child = this.#child;
237
+ if (child && child.exitCode === null) {
238
+ child.kill("SIGKILL");
239
+ await once(child, "exit").catch(() => undefined);
240
+ }
241
+ this.#frames.close();
242
+ }
243
+ #receiveStdout(chunk) {
244
+ try {
245
+ for (const frame of this.#decoder.push(chunk))
246
+ this.#frames.push(frame);
247
+ }
248
+ catch (error) {
249
+ this.#frames.fail(new NodeTransportError("invalid data on Runtime protocol stdout", { cause: error }));
250
+ this.#child?.kill("SIGKILL");
251
+ }
252
+ }
253
+ #receiveStderr(chunk) {
254
+ const redact = redactor(this.#options);
255
+ const text = this.#stderrRemainder + chunk;
256
+ const lines = text.split(/\r?\n/);
257
+ this.#stderrRemainder = lines.pop() ?? "";
258
+ for (const line of lines)
259
+ this.#emitStderr(redact(line));
260
+ if (Buffer.byteLength(this.#stderrRemainder, "utf8") > this.#maxStderrLineBytes) {
261
+ this.#stderrRemainder = "";
262
+ this.#emitStderr(`[stderr line exceeded ${this.#maxStderrLineBytes} bytes and was discarded]`);
263
+ }
264
+ }
265
+ #emitStderr(line) {
266
+ if (this.#options.onStderr)
267
+ this.#options.onStderr(line);
268
+ else
269
+ process.stderr.write(`[miao-runtime] ${line}\n`);
270
+ }
271
+ #onExit(code, signal) {
272
+ const wasClosing = this.#closing;
273
+ this.#connected = false;
274
+ this.#child = undefined;
275
+ if (this.#exitListener)
276
+ process.removeListener("exit", this.#exitListener);
277
+ this.#exitListener = undefined;
278
+ if (this.#stderrRemainder) {
279
+ this.#emitStderr(redactor(this.#options)(this.#stderrRemainder));
280
+ this.#stderrRemainder = "";
281
+ }
282
+ try {
283
+ for (const frame of this.#decoder.finish())
284
+ this.#frames.push(frame);
285
+ }
286
+ catch (error) {
287
+ if (!wasClosing)
288
+ this.#frames.fail(new NodeTransportError("truncated Runtime protocol stdout", { cause: error }));
289
+ return;
290
+ }
291
+ if (wasClosing)
292
+ this.#frames.close();
293
+ else {
294
+ this.#frames.fail(new RuntimeExitedError(`Miao Runtime exited unexpectedly (code=${code ?? "none"}, signal=${signal ?? "none"})`, { code: "runtime_exited", retryable: true, details: { exitCode: code, signal } }));
295
+ }
296
+ }
297
+ }
298
+ function positive(value, name) {
299
+ if (!Number.isSafeInteger(value) || value < 1)
300
+ throw new RangeError(`${name} must be a positive safe integer`);
301
+ return value;
302
+ }
303
+ //# sourceMappingURL=process-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-transport.js","sourceRoot":"","sources":["../src/process-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { MiaoTransport } from "@miao-ai/client";
2
+ import type { RuntimeFrame } from "@miao-ai/protocol";
3
+ export type SocketEndpoint = {
4
+ path: string;
5
+ host?: never;
6
+ port?: never;
7
+ } | {
8
+ path?: never;
9
+ host?: string;
10
+ port: number;
11
+ };
12
+ export interface SocketTransportOptions {
13
+ endpoint?: SocketEndpoint;
14
+ socketPath?: string;
15
+ host?: string;
16
+ port?: number;
17
+ connectTimeoutMs?: number;
18
+ closeTimeoutMs?: number;
19
+ maxLineBytes?: number;
20
+ frameBufferSize?: number;
21
+ }
22
+ /** Runtime Protocol NDJSON over a Unix socket, Windows named pipe, or TCP socket. */
23
+ export declare class SocketTransport implements MiaoTransport {
24
+ #private;
25
+ constructor(options: SocketTransportOptions);
26
+ connect(): Promise<void>;
27
+ send(frame: RuntimeFrame): Promise<void>;
28
+ frames(): AsyncIterable<RuntimeFrame>;
29
+ close(): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=socket-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-transport.d.ts","sourceRoot":"","sources":["../src/socket-transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GAC5C;IAAE,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0BD,qFAAqF;AACrF,qBAAa,eAAgB,YAAW,aAAa;;gBAQvC,OAAO,EAAE,sBAAsB;IAMrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BxB,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,MAAM,IAAI,aAAa,CAAC,YAAY,CAAC;IAI/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA2C7B"}
@@ -0,0 +1,130 @@
1
+ import { createConnection } from "node:net";
2
+ import { once } from "node:events";
3
+ import { AsyncQueue } from "./async-queue.js";
4
+ import { NodeTransportError } from "./errors.js";
5
+ import { encodeFrameLine, StrictFrameDecoder } from "./ndjson.js";
6
+ function endpoint(options) {
7
+ if (options.endpoint)
8
+ return options.endpoint;
9
+ if (options.socketPath)
10
+ return { path: options.socketPath };
11
+ if (options.port !== undefined) {
12
+ return { ...(options.host === undefined ? {} : { host: options.host }), port: options.port };
13
+ }
14
+ throw new TypeError("SocketTransport requires socketPath, endpoint, or port");
15
+ }
16
+ function waitForSocketClose(socket, timeoutMs) {
17
+ if (socket.closed || socket.destroyed)
18
+ return Promise.resolve(true);
19
+ return new Promise((resolveWait) => {
20
+ const onClose = () => {
21
+ clearTimeout(timer);
22
+ resolveWait(true);
23
+ };
24
+ const timer = setTimeout(() => {
25
+ socket.removeListener("close", onClose);
26
+ resolveWait(false);
27
+ }, timeoutMs);
28
+ socket.once("close", onClose);
29
+ });
30
+ }
31
+ /** Runtime Protocol NDJSON over a Unix socket, Windows named pipe, or TCP socket. */
32
+ export class SocketTransport {
33
+ #options;
34
+ #frames;
35
+ #decoder;
36
+ #socket;
37
+ #connected = false;
38
+ #closing = false;
39
+ constructor(options) {
40
+ this.#options = options;
41
+ this.#frames = new AsyncQueue(options.frameBufferSize ?? 256);
42
+ this.#decoder = new StrictFrameDecoder(options.maxLineBytes);
43
+ }
44
+ async connect() {
45
+ if (this.#connected)
46
+ return;
47
+ if (this.#closing)
48
+ throw new NodeTransportError("cannot reconnect a closed SocketTransport");
49
+ const target = endpoint(this.#options);
50
+ const socket = "path" in target && target.path
51
+ ? createConnection(target.path)
52
+ : createConnection({ host: target.host, port: target.port });
53
+ this.#socket = socket;
54
+ socket.on("data", (chunk) => this.#receive(chunk));
55
+ socket.once("end", () => this.#finishInput());
56
+ socket.once("close", (hadError) => this.#onClose(hadError));
57
+ const connected = new Promise((resolveConnect, rejectConnect) => {
58
+ socket.once("connect", resolveConnect);
59
+ socket.once("error", rejectConnect);
60
+ });
61
+ const timeout = setTimeout(() => socket.destroy(new NodeTransportError("timed out connecting to Miao Runtime socket")), this.#options.connectTimeoutMs ?? 10_000);
62
+ try {
63
+ await connected;
64
+ this.#connected = true;
65
+ }
66
+ catch (error) {
67
+ socket.destroy();
68
+ throw new NodeTransportError("failed to connect to Miao Runtime socket", { cause: error });
69
+ }
70
+ finally {
71
+ clearTimeout(timeout);
72
+ }
73
+ }
74
+ async send(frame) {
75
+ const socket = this.#socket;
76
+ if (!this.#connected || !socket?.writable) {
77
+ throw new NodeTransportError("Miao Runtime socket is not connected");
78
+ }
79
+ if (!socket.write(encodeFrameLine(frame), "utf8"))
80
+ await once(socket, "drain");
81
+ }
82
+ frames() {
83
+ return this.#frames;
84
+ }
85
+ async close() {
86
+ if (this.#closing)
87
+ return;
88
+ this.#closing = true;
89
+ const socket = this.#socket;
90
+ if (!socket) {
91
+ this.#frames.close();
92
+ return;
93
+ }
94
+ socket.end();
95
+ const graceful = await waitForSocketClose(socket, this.#options.closeTimeoutMs ?? 2_000);
96
+ if (!graceful && !socket.destroyed)
97
+ socket.destroy();
98
+ this.#frames.close();
99
+ }
100
+ #receive(chunk) {
101
+ try {
102
+ for (const frame of this.#decoder.push(chunk))
103
+ this.#frames.push(frame);
104
+ }
105
+ catch (error) {
106
+ this.#frames.fail(new NodeTransportError("invalid data on Runtime socket", { cause: error }));
107
+ this.#socket?.destroy();
108
+ }
109
+ }
110
+ #finishInput() {
111
+ try {
112
+ for (const frame of this.#decoder.finish())
113
+ this.#frames.push(frame);
114
+ }
115
+ catch (error) {
116
+ if (!this.#closing)
117
+ this.#frames.fail(new NodeTransportError("truncated Runtime socket frame", { cause: error }));
118
+ }
119
+ }
120
+ #onClose(hadError) {
121
+ this.#connected = false;
122
+ this.#socket = undefined;
123
+ if (this.#closing)
124
+ this.#frames.close();
125
+ else {
126
+ this.#frames.fail(new NodeTransportError(hadError ? "Miao Runtime socket disconnected after an error" : "Miao Runtime socket disconnected"));
127
+ }
128
+ }
129
+ }
130
+ //# sourceMappingURL=socket-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-transport.js","sourceRoot":"","sources":["../src/socket-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { MiaoTransport } from "@miao-ai/client";
2
+ import { type RuntimeFrame } from "@miao-ai/protocol";
3
+ import { type AuthenticationOptions, type ReconnectOptions } from "./auth.js";
4
+ export interface WebSocketEventLike {
5
+ data?: unknown;
6
+ code?: number;
7
+ reason?: string;
8
+ error?: unknown;
9
+ }
10
+ export interface WebSocketLike {
11
+ readonly readyState: number;
12
+ send(data: string): void;
13
+ close(code?: number, reason?: string): void;
14
+ addEventListener(type: "open" | "message" | "error" | "close", listener: (event: WebSocketEventLike) => void): void;
15
+ removeEventListener?(type: "open" | "message" | "error" | "close", listener: (event: WebSocketEventLike) => void): void;
16
+ }
17
+ export interface WebSocketFactoryOptions {
18
+ headers: Readonly<Record<string, string>>;
19
+ protocols?: string | readonly string[];
20
+ }
21
+ export type WebSocketFactory = (url: string, options: WebSocketFactoryOptions) => WebSocketLike | Promise<WebSocketLike>;
22
+ export interface RemoteResumeContext {
23
+ attempt: number;
24
+ /** Highest delivered sequence for every Runtime subscription. */
25
+ subscriptions: ReadonlyMap<string, number>;
26
+ }
27
+ export interface WebSocketTransportOptions {
28
+ url: string;
29
+ authentication?: AuthenticationOptions;
30
+ protocols?: string | readonly string[];
31
+ webSocketFactory?: WebSocketFactory;
32
+ reconnect?: ReconnectOptions;
33
+ /** Frames returned here are sent after a reconnect, enabling explicit event resume. */
34
+ resumeFrames?: (context: RemoteResumeContext) => readonly RuntimeFrame[] | Promise<readonly RuntimeFrame[]>;
35
+ onReconnect?: (context: RemoteResumeContext) => void | Promise<void>;
36
+ frameBufferSize?: number;
37
+ connectTimeoutMs?: number;
38
+ maxFrameBytes?: number;
39
+ }
40
+ /** Runtime Protocol over WebSocket with bounded reconnect and explicit resume hooks. */
41
+ export declare class WebSocketTransport implements MiaoTransport {
42
+ #private;
43
+ constructor(options: WebSocketTransportOptions);
44
+ connect(): Promise<void>;
45
+ send(frame: RuntimeFrame): Promise<void>;
46
+ frames(): AsyncIterable<RuntimeFrame>;
47
+ close(): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=websocket-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-transport.d.ts","sourceRoot":"","sources":["../src/websocket-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9F,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;IACpH,mBAAmB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;CACzH;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,uBAAuB,KAC7B,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACvC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,uFAAuF;IACvF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;IAC5G,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2CD,wFAAwF;AACxF,qBAAa,kBAAmB,YAAW,aAAa;;gBAc1C,OAAO,EAAE,yBAAyB;IASxC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBxB,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,MAAM,IAAI,aAAa,CAAC,YAAY,CAAC;IAI/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA0G7B"}