@microsandbox/control-client 0.7.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 (62) hide show
  1. package/README.md +115 -0
  2. package/dist/attempt.d.ts +19 -0
  3. package/dist/attempt.d.ts.map +1 -0
  4. package/dist/attempt.js +79 -0
  5. package/dist/attempt.js.map +1 -0
  6. package/dist/client.d.ts +9 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +11 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/connection.d.ts +32 -0
  11. package/dist/connection.d.ts.map +1 -0
  12. package/dist/connection.js +103 -0
  13. package/dist/connection.js.map +1 -0
  14. package/dist/dialer.d.ts +16 -0
  15. package/dist/dialer.d.ts.map +1 -0
  16. package/dist/dialer.js +2 -0
  17. package/dist/dialer.js.map +1 -0
  18. package/dist/error.d.ts +13 -0
  19. package/dist/error.d.ts.map +1 -0
  20. package/dist/error.js +23 -0
  21. package/dist/error.js.map +1 -0
  22. package/dist/index.d.ts +15 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +13 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/json-client.d.ts +15 -0
  27. package/dist/json-client.d.ts.map +1 -0
  28. package/dist/json-client.js +22 -0
  29. package/dist/json-client.js.map +1 -0
  30. package/dist/json-reply.d.ts +18 -0
  31. package/dist/json-reply.d.ts.map +1 -0
  32. package/dist/json-reply.js +63 -0
  33. package/dist/json-reply.js.map +1 -0
  34. package/dist/json-session.d.ts +23 -0
  35. package/dist/json-session.d.ts.map +1 -0
  36. package/dist/json-session.js +128 -0
  37. package/dist/json-session.js.map +1 -0
  38. package/dist/json-value.d.ts +18 -0
  39. package/dist/json-value.d.ts.map +1 -0
  40. package/dist/json-value.js +138 -0
  41. package/dist/json-value.js.map +1 -0
  42. package/dist/legacy-request.d.ts +26 -0
  43. package/dist/legacy-request.d.ts.map +1 -0
  44. package/dist/legacy-request.js +77 -0
  45. package/dist/legacy-request.js.map +1 -0
  46. package/dist/node.d.ts +13 -0
  47. package/dist/node.d.ts.map +1 -0
  48. package/dist/node.js +19 -0
  49. package/dist/node.js.map +1 -0
  50. package/dist/protocol.d.ts +13 -0
  51. package/dist/protocol.d.ts.map +1 -0
  52. package/dist/protocol.js +65 -0
  53. package/dist/protocol.js.map +1 -0
  54. package/dist/records.d.ts +100 -0
  55. package/dist/records.d.ts.map +1 -0
  56. package/dist/records.js +110 -0
  57. package/dist/records.js.map +1 -0
  58. package/dist/request.d.ts +50 -0
  59. package/dist/request.d.ts.map +1 -0
  60. package/dist/request.js +86 -0
  61. package/dist/request.js.map +1 -0
  62. package/package.json +26 -0
@@ -0,0 +1,63 @@
1
+ import { ClientError } from "@microsandbox/protocol-client";
2
+ import { ControlClientError } from "./error.js";
3
+ import { jsonObject, jsonUint, parseJson } from "./json-value.js";
4
+ /** Actual legacy bytes and an inspectable lossless object; no fabricated frame. */
5
+ export class JsonReply {
6
+ #raw;
7
+ #value;
8
+ constructor(raw) {
9
+ this.#raw = raw.slice();
10
+ this.#value = jsonObject(parseJson(this.#raw));
11
+ }
12
+ get raw() { return this.#raw; }
13
+ get value() { return this.#value; }
14
+ [Symbol.for("nodejs.util.inspect.custom")]() { return "JsonReply { bytes: " + this.#raw.length + " }"; }
15
+ /** Only a valid affirmative capabilities reply is evidence of a legacy peer. */
16
+ discoveryMode() {
17
+ if (this.value.get("ok") !== true || (this.value.has("error") && this.value.get("error") !== null))
18
+ throw new ClientError("invalid_data");
19
+ jsonCapabilities(this.value.get("capabilities"));
20
+ if (!this.value.has("control_protocols"))
21
+ return "json";
22
+ const protocols = this.value.get("control_protocols");
23
+ if (!Array.isArray(protocols) || protocols.some(name => typeof name !== "string"))
24
+ throw new ClientError("invalid_data");
25
+ if (protocols.includes("cbor"))
26
+ return "cbor";
27
+ if (protocols.includes("json"))
28
+ return "json";
29
+ throw new ClientError("unsupported_operation");
30
+ }
31
+ /** Only checked helpers turn ok:false into an error; progress stays unknown. */
32
+ checked(decode) {
33
+ if (this.value.get("ok") === false)
34
+ throw new ControlClientError("legacy_remote", this);
35
+ if (this.value.get("ok") !== true)
36
+ throw new ControlClientError("invalid_json_response", this);
37
+ try {
38
+ return decode(this.value);
39
+ }
40
+ catch {
41
+ throw new ControlClientError("invalid_json_response", this);
42
+ }
43
+ }
44
+ }
45
+ export function jsonCapabilities(value) {
46
+ const fields = jsonObject(value);
47
+ const boolean = (name) => {
48
+ const field = fields.get(name);
49
+ if (typeof field !== "boolean")
50
+ throw new ClientError("invalid_data");
51
+ return field;
52
+ };
53
+ return { ...(fields.has("root_disk_grow") ? { root_disk_grow: boolean("root_disk_grow") } : {}), cpu_resize: boolean("cpu_resize"), memory_resize: boolean("memory_resize"), secrets_update: boolean("secrets_update") };
54
+ }
55
+ export function jsonMemory(value) {
56
+ const fields = jsonObject(value), uint = (name) => jsonUint(fields.get(name), 64);
57
+ return { boot_mib: uint("boot_mib"), target_mib: uint("target_mib"), current_mib: uint("current_mib"), max_mib: uint("max_mib") };
58
+ }
59
+ export function jsonCpu(value) {
60
+ const fields = jsonObject(value), uint = (name) => Number(jsonUint(fields.get(name), 32));
61
+ return { possible: uint("possible"), requested_online: uint("requested_online"), actual_online: uint("actual_online"), enforced: uint("enforced") };
62
+ }
63
+ //# sourceMappingURL=json-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-reply.js","sourceRoot":"","sources":["../src/json-reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type ConnectOptions, type RequestOptions } from "@microsandbox/protocol-client";
2
+ import { ControlAttempt } from "./attempt.js";
3
+ import type { ControlDialer } from "./dialer.js";
4
+ import { JsonReply, type ControlMode } from "./json-reply.js";
5
+ import { type LegacyControlRequest } from "./legacy-request.js";
6
+ import { type Capabilities } from "./records.js";
7
+ /** Shared internal owner used by the explicit adapter and automatic connection. */
8
+ export declare class JsonSession {
9
+ #private;
10
+ readonly dialer: ControlDialer;
11
+ readonly rediscover: boolean;
12
+ readonly options: ConnectOptions;
13
+ constructor(dialer: ControlDialer, options: ConnectOptions, rediscover: boolean);
14
+ isClosed(): boolean;
15
+ close(): Promise<void>;
16
+ discover(attempt: ControlAttempt): Promise<{
17
+ mode: ControlMode;
18
+ capabilities: Capabilities;
19
+ }>;
20
+ operation(request: LegacyControlRequest, options?: RequestOptions): Promise<JsonReply>;
21
+ private exchange;
22
+ }
23
+ //# sourceMappingURL=json-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-session.d.ts","sourceRoot":"","sources":["../src/json-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACzI,OAAO,EAAkB,cAAc,EAAiC,MAAM,cAAc,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAoB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAwD,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvG,mFAAmF;AACnF,qBAAa,WAAW;;IAIV,QAAQ,CAAC,MAAM,EAAE,aAAa;IAA2B,QAAQ,CAAC,UAAU,EAAE,OAAO;IADjG,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;gBACZ,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAW,UAAU,EAAE,OAAO;IAIjG,QAAQ,IAAI,OAAO;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAE,CAAC;IAK7F,SAAS,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,CAAC;YAyBlF,QAAQ;CAyCvB"}
@@ -0,0 +1,128 @@
1
+ import { ClientError, defaultLimits } from "@microsandbox/protocol-client";
2
+ import { closeTransport, ControlAttempt, controlError, validateTimeout } from "./attempt.js";
3
+ import { ControlClientError } from "./error.js";
4
+ import { JsonReply, jsonCapabilities } from "./json-reply.js";
5
+ import { encodeJsonRequest } from "./legacy-request.js";
6
+ import { DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_SETUP_TIMEOUT_MS } from "./records.js";
7
+ /** Shared internal owner used by the explicit adapter and automatic connection. */
8
+ export class JsonSession {
9
+ dialer;
10
+ rediscover;
11
+ #closed = new AbortController();
12
+ #transports = new Set();
13
+ options;
14
+ constructor(dialer, options, rediscover) {
15
+ this.dialer = dialer;
16
+ this.rediscover = rediscover;
17
+ this.options = { ...options, limits: defaultLimits(options.limits) };
18
+ validateTimeout(options.setupTimeoutMs ?? DEFAULT_SETUP_TIMEOUT_MS);
19
+ }
20
+ isClosed() { return this.#closed.signal.aborted; }
21
+ async close() {
22
+ this.#closed.abort(new ClientError("closed"));
23
+ await Promise.all([...this.#transports].map(closeTransport));
24
+ }
25
+ async discover(attempt) {
26
+ const reply = await this.exchange(encodeJsonRequest({ op: "capabilities" }), attempt, attempt, 64 * 1024);
27
+ const mode = reply.discoveryMode();
28
+ return { mode, capabilities: jsonCapabilities(reply.value.get("capabilities")) };
29
+ }
30
+ async operation(request, options = {}) {
31
+ // Validate and serialize before discovery so unsupported/invalid native
32
+ // requests cannot cause network I/O. Legacy batches have no framed-size cap.
33
+ const line = encodeJsonRequest(request);
34
+ const attempt = new ControlAttempt(options.requestTimeoutMs ?? this.options.limits?.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS, [options.signal, this.#closed.signal]);
35
+ let setup;
36
+ try {
37
+ setup = new ControlAttempt(Math.min(attempt.remaining(), this.options.setupTimeoutMs ?? DEFAULT_SETUP_TIMEOUT_MS), [attempt.signal]);
38
+ if (this.rediscover && !this.dialer.verifier) {
39
+ let mode;
40
+ try {
41
+ mode = (await this.discover(setup)).mode;
42
+ }
43
+ catch (error) {
44
+ // Discovery is read-only. Its lost reply says nothing about admission
45
+ // of the prepared mutation, which has not been written.
46
+ const failure = controlError(error);
47
+ throw failure instanceof ClientError ? failure.withDelivery("not_sent") : failure;
48
+ }
49
+ if (mode !== "json")
50
+ throw new ControlClientError("runtime_changed");
51
+ }
52
+ return await this.exchange(line, attempt, setup);
53
+ }
54
+ catch (error) {
55
+ await this.close();
56
+ throw controlError(error);
57
+ }
58
+ finally {
59
+ line.fill(0);
60
+ setup?.dispose();
61
+ attempt.dispose();
62
+ }
63
+ }
64
+ async exchange(line, attempt, setup, maxReply) {
65
+ let transport, admitted = false;
66
+ const chunks = [];
67
+ try {
68
+ if (this.isClosed())
69
+ throw new ClientError("closed");
70
+ transport = await setup.connect(this.dialer.connector);
71
+ this.#transports.add(transport);
72
+ if (this.dialer.verifier)
73
+ await setup.run(() => this.dialer.verifier.verifySession(setup.context));
74
+ attempt.check();
75
+ setup.check();
76
+ if (this.isClosed())
77
+ throw new ClientError("closed");
78
+ const owned = transport;
79
+ await attempt.run(() => {
80
+ admitted = true; // A rejected/partial write may already have reached the peer.
81
+ return owned.write(line);
82
+ });
83
+ let total = 0;
84
+ for (;;) {
85
+ const chunk = await attempt.run(() => owned.read(8192));
86
+ if (chunk === null) {
87
+ if (total === 0)
88
+ throw new ClientError("peer_closed");
89
+ break; // The historical protocol also permits a nonempty EOF delimiter.
90
+ }
91
+ if (chunk.length === 0 || chunk.length > 8192)
92
+ throw new ClientError("invalid_data");
93
+ const newline = chunk.indexOf(10), count = newline < 0 ? chunk.length : newline + 1;
94
+ total += count;
95
+ if (maxReply !== undefined && total > maxReply)
96
+ throw new ClientError("invalid_data");
97
+ chunks.push(chunk.slice(0, count));
98
+ if (newline >= 0)
99
+ break;
100
+ }
101
+ const raw = new Uint8Array(total);
102
+ let offset = 0;
103
+ for (const chunk of chunks) {
104
+ raw.set(chunk, offset);
105
+ offset += chunk.length;
106
+ }
107
+ try {
108
+ return new JsonReply(raw);
109
+ }
110
+ finally {
111
+ raw.fill(0);
112
+ }
113
+ }
114
+ catch (error) {
115
+ const failure = controlError(error);
116
+ throw failure instanceof ClientError ? failure.withDelivery(admitted ? "unknown" : "not_sent") : failure;
117
+ }
118
+ finally {
119
+ for (const chunk of chunks)
120
+ chunk.fill(0);
121
+ if (transport) {
122
+ this.#transports.delete(transport);
123
+ await closeTransport(transport);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=json-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-session.js","sourceRoot":"","sources":["../src/json-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Original JSON number token. Unknown fields need not fit any JavaScript number. */
2
+ export declare class JsonNumber {
3
+ #private;
4
+ constructor(token: string);
5
+ get token(): string;
6
+ /** Integer wire fields reject negative zero, fractions, exponents, and overflow. */
7
+ asUint(bits: 32 | 64): bigint;
8
+ }
9
+ export type JsonObject = ReadonlyMap<string, JsonValue>;
10
+ export type JsonValue = null | boolean | string | JsonNumber | readonly JsonValue[] | JsonObject;
11
+ /**
12
+ * Parse number tokens before any Number conversion. Objects are maps so unknown
13
+ * keys, including "__proto__", cannot alter prototypes or erase duplicates.
14
+ */
15
+ export declare function parseJson(bytes: Uint8Array): JsonValue;
16
+ export declare function jsonObject(value: JsonValue | undefined): JsonObject;
17
+ export declare function jsonUint(value: JsonValue | undefined, bits: 32 | 64): bigint;
18
+ //# sourceMappingURL=json-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-value.d.ts","sourceRoot":"","sources":["../src/json-value.ts"],"names":[],"mappings":"AAEA,qFAAqF;AACrF,qBAAa,UAAU;;gBAET,KAAK,EAAE,MAAM;IAIzB,IAAI,KAAK,IAAI,MAAM,CAAwB;IAC3C,oFAAoF;IACpF,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM;CAO9B;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACxD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,SAAS,EAAE,GAAG,UAAU,CAAC;AAEjG;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAgEtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAGnE;AACD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,CAG5E"}
@@ -0,0 +1,138 @@
1
+ import { ClientError } from "@microsandbox/protocol-client";
2
+ /** Original JSON number token. Unknown fields need not fit any JavaScript number. */
3
+ export class JsonNumber {
4
+ #token;
5
+ constructor(token) {
6
+ if (!/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/.test(token))
7
+ throw invalid();
8
+ this.#token = token;
9
+ }
10
+ get token() { return this.#token; }
11
+ /** Integer wire fields reject negative zero, fractions, exponents, and overflow. */
12
+ asUint(bits) {
13
+ if (!/^(?:0|[1-9]\d*)$/.test(this.#token) || this.#token.length > 20)
14
+ throw invalid();
15
+ const value = BigInt(this.#token);
16
+ if (value >= (1n << BigInt(bits)))
17
+ throw invalid();
18
+ return value;
19
+ }
20
+ [Symbol.for("nodejs.util.inspect.custom")]() { return "JsonNumber { … }"; }
21
+ }
22
+ /**
23
+ * Parse number tokens before any Number conversion. Objects are maps so unknown
24
+ * keys, including "__proto__", cannot alter prototypes or erase duplicates.
25
+ */
26
+ export function parseJson(bytes) {
27
+ let source;
28
+ try {
29
+ source = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes)
30
+ .replace(/^\p{White_Space}+|\p{White_Space}+$/gu, "");
31
+ }
32
+ catch {
33
+ throw invalid();
34
+ }
35
+ let offset = 0;
36
+ const space = () => { while (offset < source.length && /[ \t\r\n]/.test(source[offset]))
37
+ offset++; };
38
+ const string = () => {
39
+ if (source[offset] !== '"')
40
+ throw invalid();
41
+ const start = offset++;
42
+ for (;;) {
43
+ if (offset >= source.length)
44
+ throw invalid();
45
+ const char = source[offset++];
46
+ if (char === "\\") {
47
+ offset++;
48
+ continue;
49
+ }
50
+ if (char !== '"')
51
+ continue;
52
+ let value;
53
+ // JSON.parse is used only for a string token, never for numeric data or
54
+ // objects. Its escape validation cannot collapse duplicate object keys.
55
+ try {
56
+ value = JSON.parse(source.slice(start, offset));
57
+ }
58
+ catch {
59
+ throw invalid();
60
+ }
61
+ for (let index = 0; index < value.length; index++) {
62
+ const unit = value.charCodeAt(index);
63
+ if (unit >= 0xd800 && unit <= 0xdbff) {
64
+ const low = value.charCodeAt(++index);
65
+ if (!(low >= 0xdc00 && low <= 0xdfff))
66
+ throw invalid();
67
+ }
68
+ else if (unit >= 0xdc00 && unit <= 0xdfff)
69
+ throw invalid();
70
+ }
71
+ return value;
72
+ }
73
+ };
74
+ const value = (depth) => {
75
+ if (depth > 128)
76
+ throw invalid();
77
+ space();
78
+ const char = source[offset];
79
+ if (char === '"')
80
+ return string();
81
+ if (char === "{" || char === "[") {
82
+ offset++;
83
+ space();
84
+ const object = char === "{", end = object ? "}" : "]";
85
+ const fields = new Map(), values = [];
86
+ if (source[offset] === end) {
87
+ offset++;
88
+ return object ? fields : values;
89
+ }
90
+ for (;;) {
91
+ if (object) {
92
+ space();
93
+ const key = string();
94
+ space();
95
+ if (source[offset++] !== ":" || fields.has(key))
96
+ throw invalid();
97
+ fields.set(key, value(depth + 1));
98
+ }
99
+ else
100
+ values.push(value(depth + 1));
101
+ space();
102
+ const next = source[offset++];
103
+ if (next === end)
104
+ return object ? fields : values;
105
+ if (next !== ",")
106
+ throw invalid();
107
+ }
108
+ }
109
+ for (const [token, result] of [["true", true], ["false", false], ["null", null]]) {
110
+ if (source.startsWith(token, offset)) {
111
+ offset += token.length;
112
+ return result;
113
+ }
114
+ }
115
+ const number = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/.exec(source.slice(offset))?.[0];
116
+ if (!number)
117
+ throw invalid();
118
+ offset += number.length;
119
+ return new JsonNumber(number);
120
+ };
121
+ const parsed = value(0);
122
+ space();
123
+ if (offset !== source.length)
124
+ throw invalid();
125
+ return parsed;
126
+ }
127
+ export function jsonObject(value) {
128
+ if (!(value instanceof Map))
129
+ throw invalid();
130
+ return value;
131
+ }
132
+ export function jsonUint(value, bits) {
133
+ if (!(value instanceof JsonNumber))
134
+ throw invalid();
135
+ return value.asUint(bits);
136
+ }
137
+ function invalid() { return new ClientError("invalid_data"); }
138
+ //# sourceMappingURL=json-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-value.js","sourceRoot":"","sources":["../src/json-value.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type OutboundMessage, type Request } from "@microsandbox/protocol-client";
2
+ import type { JsonReply } from "./json-reply.js";
3
+ import { type SecretChange } from "./records.js";
4
+ /** Existing JSON operation spellings, independent of the CBOR envelope. */
5
+ export type LegacyControlRequest = {
6
+ op: "capabilities" | "memory_state" | "cpu_state";
7
+ } | {
8
+ op: "memory_target";
9
+ total_mib: bigint;
10
+ } | {
11
+ op: "cpu_target";
12
+ online: number;
13
+ } | {
14
+ op: "secrets_update";
15
+ changes: readonly SecretChange[];
16
+ };
17
+ /** Prepared operations can decode either actual response representation. */
18
+ export interface CheckedControlRequest<T> extends Request<T> {
19
+ jsonRequest(): LegacyControlRequest;
20
+ decodeJson(reply: JsonReply): T;
21
+ }
22
+ export declare function nativeJsonRequest(message: OutboundMessage): LegacyControlRequest;
23
+ /** Validate and snapshot without passing a large legacy batch through CBOR. */
24
+ export declare function snapshotChanges(value: unknown): readonly SecretChange[];
25
+ export declare function encodeJsonRequest(request: LegacyControlRequest): Uint8Array;
26
+ //# sourceMappingURL=legacy-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-request.d.ts","sourceRoot":"","sources":["../src/legacy-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAEhG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,2EAA2E;AAC3E,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,cAAc,GAAG,cAAc,GAAG,WAAW,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,CAAC;AAE/D,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAC1D,WAAW,IAAI,oBAAoB,CAAC;IACpC,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC;CACjC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,oBAAoB,CAYhF;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,YAAY,EAAE,CAcvE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAY3E"}
@@ -0,0 +1,77 @@
1
+ import { ClientError } from "@microsandbox/protocol-client";
2
+ import { ControlClientError } from "./error.js";
3
+ import { checkedUint } from "./records.js";
4
+ export function nativeJsonRequest(message) {
5
+ if (message.kind !== "typed")
6
+ throw new ControlClientError("unsupported_mode");
7
+ const fields = record(message.payload);
8
+ switch (message.type) {
9
+ case "control.capabilities": return { op: "capabilities" };
10
+ case "control.memory.state": return { op: "memory_state" };
11
+ case "control.cpu.state": return { op: "cpu_state" };
12
+ case "control.memory.target": return { op: "memory_target", total_mib: uint(fields.total_mib, 64) };
13
+ case "control.cpu.target": return { op: "cpu_target", online: Number(uint(fields.online, 32)) };
14
+ case "control.secrets.update": return { op: "secrets_update", changes: snapshotChanges(fields.changes) };
15
+ default: throw new ControlClientError("unsupported_mode");
16
+ }
17
+ }
18
+ /** Validate and snapshot without passing a large legacy batch through CBOR. */
19
+ export function snapshotChanges(value) {
20
+ if (!Array.isArray(value))
21
+ throw new ClientError("invalid_data");
22
+ checkedUint(value.length, 32);
23
+ return value.map(value => {
24
+ const fields = record(value), name = text(fields.name);
25
+ switch (fields.change) {
26
+ case "rotate": return { change: "rotate", name, value: text(fields.value) };
27
+ case "remove": return { change: "remove", name };
28
+ case "set_allowed_hosts":
29
+ if (!Array.isArray(fields.hosts))
30
+ throw new ClientError("invalid_data");
31
+ return { change: "set_allowed_hosts", name, hosts: fields.hosts.map(text) };
32
+ default: throw new ClientError("invalid_data");
33
+ }
34
+ });
35
+ }
36
+ export function encodeJsonRequest(request) {
37
+ let line;
38
+ // Bigint memory targets are decimal JSON integer tokens, never quoted strings
39
+ // or rounded Numbers. Other fields are validated before JSON serialization.
40
+ switch (request.op) {
41
+ case "capabilities":
42
+ case "memory_state":
43
+ case "cpu_state":
44
+ line = JSON.stringify({ op: request.op });
45
+ break;
46
+ case "memory_target":
47
+ line = '{"op":"memory_target","total_mib":' + uint(request.total_mib, 64).toString() + "}";
48
+ break;
49
+ case "cpu_target":
50
+ line = JSON.stringify({ op: request.op, online: Number(uint(request.online, 32)) });
51
+ break;
52
+ case "secrets_update":
53
+ line = JSON.stringify({ op: request.op, changes: snapshotChanges(request.changes) });
54
+ break;
55
+ default: throw new ClientError("invalid_data");
56
+ }
57
+ return new TextEncoder().encode(line + "\n");
58
+ }
59
+ function record(value) {
60
+ if (value === null || typeof value !== "object" || Array.isArray(value))
61
+ throw new ClientError("invalid_data");
62
+ return value;
63
+ }
64
+ function text(value) {
65
+ if (typeof value !== "string")
66
+ throw new ClientError("invalid_data");
67
+ // Reject isolated surrogates instead of sending strings Rust cannot decode.
68
+ if (/[\uD800-\uDFFF]/u.test(value))
69
+ throw new ClientError("invalid_data");
70
+ return value;
71
+ }
72
+ function uint(value, bits) {
73
+ if (typeof value !== "number" && typeof value !== "bigint")
74
+ throw new ClientError("invalid_data");
75
+ return checkedUint(value, bits);
76
+ }
77
+ //# sourceMappingURL=legacy-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-request.js","sourceRoot":"","sources":["../src/legacy-request.ts"],"names":[],"mappings":"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"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { ConnectOptions } from "@microsandbox/protocol-client";
2
+ import { ControlClient } from "./client.js";
3
+ import { ControlConnection } from "./connection.js";
4
+ import { JsonControlClient } from "./json-client.js";
5
+ export * from "./index.js";
6
+ export { LocalConnector } from "@microsandbox/protocol-client/node";
7
+ /** Explicit framed hello on an existing Unix socket or Windows pipe path. */
8
+ export declare function connectFramedControl(path: string, options?: ConnectOptions): Promise<ControlClient>;
9
+ /** Discover on the existing Unix socket or Windows pipe, then reuse that session. */
10
+ export declare function connectControl(path: string, options?: ConnectOptions): Promise<ControlConnection>;
11
+ /** Explicit legacy adapter; no connection is opened until an operation runs. */
12
+ export declare function jsonControl(path: string, options?: ConnectOptions): JsonControlClient;
13
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAEnG;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAEjG;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAErF"}
package/dist/node.js ADDED
@@ -0,0 +1,19 @@
1
+ import { LocalConnector } from "@microsandbox/protocol-client/node";
2
+ import { ControlClient } from "./client.js";
3
+ import { ControlConnection } from "./connection.js";
4
+ import { JsonControlClient } from "./json-client.js";
5
+ export * from "./index.js";
6
+ export { LocalConnector } from "@microsandbox/protocol-client/node";
7
+ /** Explicit framed hello on an existing Unix socket or Windows pipe path. */
8
+ export function connectFramedControl(path, options) {
9
+ return ControlClient.connectConnector(new LocalConnector(path), options);
10
+ }
11
+ /** Discover on the existing Unix socket or Windows pipe, then reuse that session. */
12
+ export function connectControl(path, options) {
13
+ return ControlConnection.connectConnector(new LocalConnector(path), options);
14
+ }
15
+ /** Explicit legacy adapter; no connection is opened until an operation runs. */
16
+ export function jsonControl(path, options) {
17
+ return JsonControlClient.fromConnector(new LocalConnector(path), options);
18
+ }
19
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,6EAA6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,OAAwB;IACzE,OAAO,aAAa,CAAC,gBAAgB,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAwB;IACnE,OAAO,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAwB;IAChE,OAAO,iBAAiB,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type ByteTransport, type EstablishContext, type Established, type InboundFrame, type Protocol, type SendMetadata } from "@microsandbox/protocol-client";
2
+ import { type ControlWelcome } from "./records.js";
3
+ /** Setup metadata retains the original welcome envelope and all unknown fields. */
4
+ export type ControlReady = {
5
+ welcome: ControlWelcome;
6
+ frame: InboundFrame;
7
+ };
8
+ /** Explicit framed setup; discovery and JSON adaptation belong outside this engine. */
9
+ export declare class ControlProtocol implements Protocol<ControlReady> {
10
+ establish(transport: ByteTransport, context: EstablishContext): Promise<Established<ControlReady>>;
11
+ prepare(ready: ControlReady, wireName: string): SendMetadata;
12
+ }
13
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAC7F,KAAK,YAAY,EAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAG6B,KAAK,cAAc,EACtD,MAAM,cAAc,CAAC;AAEtB,mFAAmF;AACnF,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAE5E,uFAAuF;AACvF,qBAAa,eAAgB,YAAW,QAAQ,CAAC,YAAY,CAAC;IACtD,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IA2BxG,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY;CAI7D"}