@hegeldev/hegel 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 (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/binary.d.ts +27 -0
  4. package/dist/binary.d.ts.map +1 -0
  5. package/dist/binary.js +50 -0
  6. package/dist/binary.js.map +1 -0
  7. package/dist/collections.d.ts +114 -0
  8. package/dist/collections.d.ts.map +1 -0
  9. package/dist/collections.js +313 -0
  10. package/dist/collections.js.map +1 -0
  11. package/dist/combinators.d.ts +34 -0
  12. package/dist/combinators.d.ts.map +1 -0
  13. package/dist/combinators.js +152 -0
  14. package/dist/combinators.js.map +1 -0
  15. package/dist/conformance.d.ts +31 -0
  16. package/dist/conformance.d.ts.map +1 -0
  17. package/dist/conformance.js +60 -0
  18. package/dist/conformance.js.map +1 -0
  19. package/dist/connection.d.ts +82 -0
  20. package/dist/connection.d.ts.map +1 -0
  21. package/dist/connection.js +231 -0
  22. package/dist/connection.js.map +1 -0
  23. package/dist/crc32.d.ts +13 -0
  24. package/dist/crc32.d.ts.map +1 -0
  25. package/dist/crc32.js +30 -0
  26. package/dist/crc32.js.map +1 -0
  27. package/dist/derive.d.ts +225 -0
  28. package/dist/derive.d.ts.map +1 -0
  29. package/dist/derive.js +296 -0
  30. package/dist/derive.js.map +1 -0
  31. package/dist/embedded.d.ts +38 -0
  32. package/dist/embedded.d.ts.map +1 -0
  33. package/dist/embedded.js +237 -0
  34. package/dist/embedded.js.map +1 -0
  35. package/dist/floats.d.ts +57 -0
  36. package/dist/floats.d.ts.map +1 -0
  37. package/dist/floats.js +100 -0
  38. package/dist/floats.js.map +1 -0
  39. package/dist/formats.d.ts +62 -0
  40. package/dist/formats.d.ts.map +1 -0
  41. package/dist/formats.js +164 -0
  42. package/dist/formats.js.map +1 -0
  43. package/dist/generator.d.ts +80 -0
  44. package/dist/generator.d.ts.map +1 -0
  45. package/dist/generator.js +128 -0
  46. package/dist/generator.js.map +1 -0
  47. package/dist/generators/collections.d.ts +20 -0
  48. package/dist/generators/collections.d.ts.map +1 -0
  49. package/dist/generators/collections.js +209 -0
  50. package/dist/generators/collections.js.map +1 -0
  51. package/dist/generators/combinators.d.ts +15 -0
  52. package/dist/generators/combinators.d.ts.map +1 -0
  53. package/dist/generators/combinators.js +143 -0
  54. package/dist/generators/combinators.js.map +1 -0
  55. package/dist/generators/compose.d.ts +27 -0
  56. package/dist/generators/compose.d.ts.map +1 -0
  57. package/dist/generators/compose.js +82 -0
  58. package/dist/generators/compose.js.map +1 -0
  59. package/dist/generators/core.d.ts +53 -0
  60. package/dist/generators/core.d.ts.map +1 -0
  61. package/dist/generators/core.js +134 -0
  62. package/dist/generators/core.js.map +1 -0
  63. package/dist/generators/index.d.ts +18 -0
  64. package/dist/generators/index.d.ts.map +1 -0
  65. package/dist/generators/index.js +15 -0
  66. package/dist/generators/index.js.map +1 -0
  67. package/dist/generators/numeric.d.ts +40 -0
  68. package/dist/generators/numeric.d.ts.map +1 -0
  69. package/dist/generators/numeric.js +128 -0
  70. package/dist/generators/numeric.js.map +1 -0
  71. package/dist/generators/primitives.d.ts +138 -0
  72. package/dist/generators/primitives.d.ts.map +1 -0
  73. package/dist/generators/primitives.js +240 -0
  74. package/dist/generators/primitives.js.map +1 -0
  75. package/dist/generators/strings.d.ts +73 -0
  76. package/dist/generators/strings.d.ts.map +1 -0
  77. package/dist/generators/strings.js +215 -0
  78. package/dist/generators/strings.js.map +1 -0
  79. package/dist/generators/tuples.d.ts +11 -0
  80. package/dist/generators/tuples.d.ts.map +1 -0
  81. package/dist/generators/tuples.js +43 -0
  82. package/dist/generators/tuples.js.map +1 -0
  83. package/dist/generators.d.ts +408 -0
  84. package/dist/generators.d.ts.map +1 -0
  85. package/dist/generators.js +898 -0
  86. package/dist/generators.js.map +1 -0
  87. package/dist/index.d.ts +16 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +13 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/install.d.ts +6 -0
  92. package/dist/install.d.ts.map +1 -0
  93. package/dist/install.js +91 -0
  94. package/dist/install.js.map +1 -0
  95. package/dist/integers.d.ts +37 -0
  96. package/dist/integers.d.ts.map +1 -0
  97. package/dist/integers.js +63 -0
  98. package/dist/integers.js.map +1 -0
  99. package/dist/labels.d.ts +21 -0
  100. package/dist/labels.d.ts.map +1 -0
  101. package/dist/labels.js +20 -0
  102. package/dist/labels.js.map +1 -0
  103. package/dist/objects.d.ts +39 -0
  104. package/dist/objects.d.ts.map +1 -0
  105. package/dist/objects.js +98 -0
  106. package/dist/objects.js.map +1 -0
  107. package/dist/primitives.d.ts +14 -0
  108. package/dist/primitives.d.ts.map +1 -0
  109. package/dist/primitives.js +51 -0
  110. package/dist/primitives.js.map +1 -0
  111. package/dist/protocol.d.ts +25 -0
  112. package/dist/protocol.d.ts.map +1 -0
  113. package/dist/protocol.js +77 -0
  114. package/dist/protocol.js.map +1 -0
  115. package/dist/runner.d.ts +115 -0
  116. package/dist/runner.d.ts.map +1 -0
  117. package/dist/runner.js +455 -0
  118. package/dist/runner.js.map +1 -0
  119. package/dist/session.d.ts +19 -0
  120. package/dist/session.d.ts.map +1 -0
  121. package/dist/session.js +157 -0
  122. package/dist/session.js.map +1 -0
  123. package/dist/spans.d.ts +23 -0
  124. package/dist/spans.d.ts.map +1 -0
  125. package/dist/spans.js +51 -0
  126. package/dist/spans.js.map +1 -0
  127. package/dist/strings.d.ts +67 -0
  128. package/dist/strings.d.ts.map +1 -0
  129. package/dist/strings.js +107 -0
  130. package/dist/strings.js.map +1 -0
  131. package/dist/testCase.d.ts +118 -0
  132. package/dist/testCase.d.ts.map +1 -0
  133. package/dist/testCase.js +186 -0
  134. package/dist/testCase.js.map +1 -0
  135. package/dist/uv-install.sh +2226 -0
  136. package/dist/uv.d.ts +20 -0
  137. package/dist/uv.d.ts.map +1 -0
  138. package/dist/uv.js +103 -0
  139. package/dist/uv.js.map +1 -0
  140. package/dist/wtf8.d.ts +16 -0
  141. package/dist/wtf8.d.ts.map +1 -0
  142. package/dist/wtf8.js +52 -0
  143. package/dist/wtf8.js.map +1 -0
  144. package/package.json +60 -0
@@ -0,0 +1,152 @@
1
+ import { generateFromSchema } from "./connection.js";
2
+ import { BaseGenerator } from "./generator.js";
3
+ import { booleans } from "./primitives.js";
4
+ import { integers } from "./integers.js";
5
+ import { LABELS } from "./labels.js";
6
+ import { group } from "./spans.js";
7
+ /**
8
+ * Check if a value is a primitive type that can be represented in sampled_from schema.
9
+ */
10
+ function isPrimitive(value) {
11
+ const type = typeof value;
12
+ return type === "string" || type === "number" || type === "boolean" || value === null;
13
+ }
14
+ /**
15
+ * Generator that samples uniformly from a fixed collection.
16
+ */
17
+ class SampledFromGenerator extends BaseGenerator {
18
+ elements;
19
+ constructor(elements) {
20
+ super();
21
+ this.elements = elements;
22
+ if (elements.length === 0) {
23
+ throw new Error("sampledFrom: cannot sample from empty array");
24
+ }
25
+ }
26
+ generate() {
27
+ const schema = this.schema();
28
+ if (schema) {
29
+ return generateFromSchema(schema);
30
+ }
31
+ // Compositional fallback for non-primitive types
32
+ return group(LABELS.SAMPLED_FROM, () => {
33
+ const index = integers()
34
+ .min(0)
35
+ .max(this.elements.length - 1)
36
+ .generate();
37
+ return this.elements[index];
38
+ });
39
+ }
40
+ schema() {
41
+ // Only use sampled_from schema for primitive types
42
+ if (this.elements.every(isPrimitive)) {
43
+ return { sampled_from: this.elements };
44
+ }
45
+ return null;
46
+ }
47
+ }
48
+ /**
49
+ * Create a generator that samples uniformly from a fixed collection.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const colors = sampledFrom(["red", "green", "blue"]);
54
+ * const color: string = colors.generate();
55
+ * ```
56
+ */
57
+ export function sampledFrom(elements) {
58
+ return new SampledFromGenerator(elements);
59
+ }
60
+ /**
61
+ * Generator that chooses from one of several generators.
62
+ */
63
+ class OneOfGenerator extends BaseGenerator {
64
+ generators;
65
+ constructor(generators) {
66
+ super();
67
+ this.generators = generators;
68
+ if (generators.length === 0) {
69
+ throw new Error("oneOf: no generators provided");
70
+ }
71
+ }
72
+ generate() {
73
+ const schema = this.schema();
74
+ if (schema) {
75
+ return generateFromSchema(schema);
76
+ }
77
+ // Compositional fallback
78
+ return group(LABELS.ONE_OF, () => {
79
+ const index = integers()
80
+ .min(0)
81
+ .max(this.generators.length - 1)
82
+ .generate();
83
+ return this.generators[index].generate();
84
+ });
85
+ }
86
+ schema() {
87
+ const schemas = [];
88
+ for (const gen of this.generators) {
89
+ const s = gen.schema();
90
+ if (!s)
91
+ return null;
92
+ schemas.push(s);
93
+ }
94
+ return { one_of: schemas };
95
+ }
96
+ }
97
+ /**
98
+ * Create a generator that chooses from one of several generators.
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const gen = oneOf(
103
+ * integers().min(0).max(10),
104
+ * integers().min(100).max(110)
105
+ * );
106
+ * ```
107
+ */
108
+ export function oneOf(...generators) {
109
+ return new OneOfGenerator(generators);
110
+ }
111
+ /**
112
+ * Generator for optional values (T | null).
113
+ */
114
+ class OptionalGenerator extends BaseGenerator {
115
+ inner;
116
+ constructor(inner) {
117
+ super();
118
+ this.inner = inner;
119
+ }
120
+ generate() {
121
+ const schema = this.schema();
122
+ if (schema) {
123
+ return generateFromSchema(schema);
124
+ }
125
+ // Compositional fallback
126
+ return group(LABELS.OPTIONAL, () => {
127
+ const isNull = booleans().generate();
128
+ return isNull ? null : this.inner.generate();
129
+ });
130
+ }
131
+ schema() {
132
+ const innerSchema = this.inner.schema();
133
+ if (!innerSchema)
134
+ return null;
135
+ return {
136
+ one_of: [{ type: "null" }, innerSchema],
137
+ };
138
+ }
139
+ }
140
+ /**
141
+ * Create a generator for optional values (T | null).
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * const gen = optional(integers());
146
+ * const value: number | null = gen.generate();
147
+ * ```
148
+ */
149
+ export function optional(inner) {
150
+ return new OptionalGenerator(inner);
151
+ }
152
+ //# sourceMappingURL=combinators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinators.js","sourceRoot":"","sources":["../src/combinators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Conformance testing helpers for Hegel for TypeScript.
3
+ *
4
+ * Provides utilities used by conformance binary scripts to read test
5
+ * configuration from environment variables and write per-test-case metrics
6
+ * to the conformance metrics file.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ /**
11
+ * Return the number of conformance test cases to run.
12
+ *
13
+ * Reads `CONFORMANCE_TEST_CASES` from the environment. Defaults to 50 if
14
+ * the variable is absent, empty, non-numeric, or non-positive.
15
+ *
16
+ * @returns Number of test cases (always ≥ 1).
17
+ */
18
+ export declare function getTestCases(): number;
19
+ /**
20
+ * Append a JSON metrics line to the conformance metrics file.
21
+ *
22
+ * The metrics file path is read from the `CONFORMANCE_METRICS_FILE`
23
+ * environment variable. Panics (throws) if the variable is not set or the
24
+ * file cannot be written.
25
+ *
26
+ * @param metrics - Plain object to serialise as a single JSON line.
27
+ * @throws {Error} If `CONFORMANCE_METRICS_FILE` is not set.
28
+ * @throws {Error} If the file cannot be opened or written.
29
+ */
30
+ export declare function writeMetrics(metrics: Record<string, unknown>): void;
31
+ //# sourceMappingURL=conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAcnE"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Conformance testing helpers for Hegel for TypeScript.
3
+ *
4
+ * Provides utilities used by conformance binary scripts to read test
5
+ * configuration from environment variables and write per-test-case metrics
6
+ * to the conformance metrics file.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import * as fs from "node:fs";
11
+ // ---------------------------------------------------------------------------
12
+ // getTestCases
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * Return the number of conformance test cases to run.
16
+ *
17
+ * Reads `CONFORMANCE_TEST_CASES` from the environment. Defaults to 50 if
18
+ * the variable is absent, empty, non-numeric, or non-positive.
19
+ *
20
+ * @returns Number of test cases (always ≥ 1).
21
+ */
22
+ export function getTestCases() {
23
+ const val = process.env["CONFORMANCE_TEST_CASES"];
24
+ if (!val)
25
+ return 50;
26
+ const n = parseInt(val, 10);
27
+ if (!Number.isFinite(n) || n <= 0)
28
+ return 50;
29
+ return n;
30
+ }
31
+ // ---------------------------------------------------------------------------
32
+ // writeMetrics
33
+ // ---------------------------------------------------------------------------
34
+ /**
35
+ * Append a JSON metrics line to the conformance metrics file.
36
+ *
37
+ * The metrics file path is read from the `CONFORMANCE_METRICS_FILE`
38
+ * environment variable. Panics (throws) if the variable is not set or the
39
+ * file cannot be written.
40
+ *
41
+ * @param metrics - Plain object to serialise as a single JSON line.
42
+ * @throws {Error} If `CONFORMANCE_METRICS_FILE` is not set.
43
+ * @throws {Error} If the file cannot be opened or written.
44
+ */
45
+ export function writeMetrics(metrics) {
46
+ const path = process.env["CONFORMANCE_METRICS_FILE"];
47
+ if (!path) {
48
+ throw new Error("hegel: CONFORMANCE_METRICS_FILE env var not set");
49
+ }
50
+ // JSON.stringify does not escape U+0085 (NEL), U+2028 (LINE SEPARATOR),
51
+ // or U+2029 (PARAGRAPH SEPARATOR). Python's str.splitlines() splits on
52
+ // all three, breaking JSONL parsing. Escape them explicitly.
53
+ const json = JSON.stringify(metrics)
54
+ .replace(/\u0085/g, "\\u0085")
55
+ .replace(/\u2028/g, "\\u2028")
56
+ .replace(/\u2029/g, "\\u2029");
57
+ const line = json + "\n";
58
+ fs.appendFileSync(path, line, "utf8");
59
+ }
60
+ //# sourceMappingURL=conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,wEAAwE;IACxE,uEAAuE;IACvE,6DAA6D;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SACjC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACzB,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Synchronous connection and stream multiplexing over stdio pipes.
3
+ *
4
+ * The Connection reads/writes raw bytes via file descriptors using
5
+ * `fs.readSync`/`fs.writeSync`. The Stream class provides request/reply
6
+ * semantics with CBOR encoding on top.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { type Packet } from "./protocol.js";
11
+ export declare class Connection {
12
+ private readFd;
13
+ private writeFd;
14
+ private nextStreamCounter;
15
+ private streamInboxes;
16
+ private serverExited;
17
+ constructor(readFd: number, writeFd: number);
18
+ markServerExited(): void;
19
+ hasServerExited(): boolean;
20
+ /**
21
+ * Read exactly `n` bytes from the pipe, blocking until available.
22
+ * Handles EAGAIN from non-blocking file descriptors.
23
+ */
24
+ readExact(n: number): Buffer;
25
+ /**
26
+ * Write a packet to the server synchronously.
27
+ */
28
+ sendPacket(packet: Packet): void;
29
+ /**
30
+ * Read packets until one for the given stream arrives.
31
+ * Packets for other streams are buffered in their inboxes.
32
+ */
33
+ readPacketForStream(streamId: number): Packet;
34
+ /**
35
+ * Create a new client-initiated stream (odd ID).
36
+ */
37
+ newStream(): Stream;
38
+ /**
39
+ * Connect to an existing server-allocated stream.
40
+ */
41
+ connectStream(streamId: number): Stream;
42
+ /**
43
+ * Get the control stream (stream ID 0).
44
+ */
45
+ controlStream(): Stream;
46
+ /**
47
+ * Remove buffered packets for a stream.
48
+ */
49
+ unregisterStream(streamId: number): void;
50
+ }
51
+ export declare class Stream {
52
+ readonly streamId: number;
53
+ private connection;
54
+ private nextMessageId;
55
+ private responses;
56
+ private requests;
57
+ private closed;
58
+ constructor(streamId: number, connection: Connection);
59
+ markClosed(): void;
60
+ private checkClosed;
61
+ /**
62
+ * Send a request packet and return the message ID.
63
+ */
64
+ sendRequest(payload: Buffer): number;
65
+ /**
66
+ * Send a reply to an incoming request.
67
+ */
68
+ writeReply(messageId: number, payload: Buffer): void;
69
+ /**
70
+ * Wait for a reply to a previously sent request.
71
+ */
72
+ receiveReply(messageId: number): Buffer;
73
+ /**
74
+ * Wait for an incoming request from the server.
75
+ */
76
+ receiveRequest(): [number, Buffer];
77
+ /**
78
+ * Close this stream gracefully.
79
+ */
80
+ close(): void;
81
+ }
82
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,KAAK,MAAM,EAKZ,MAAM,eAAe,CAAC;AAgBvB,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK3C,gBAAgB,IAAI,IAAI;IAIxB,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACH,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IA2B5B;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKhC;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAyB7C;;OAEG;IACH,SAAS,IAAI,MAAM;IAKnB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIvC;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAGzC;AAMD,qBAAa,MAAM;IACjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAKpD,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAYpC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASpD;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAyBvC;;OAEG;IACH,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAmBlC;;OAEG;IACH,KAAK,IAAI,IAAI;CAWd"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Synchronous connection and stream multiplexing over stdio pipes.
3
+ *
4
+ * The Connection reads/writes raw bytes via file descriptors using
5
+ * `fs.readSync`/`fs.writeSync`. The Stream class provides request/reply
6
+ * semantics with CBOR encoding on top.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import * as fs from "node:fs";
11
+ import { encodePacket, readPacketFrom, CLOSE_STREAM_MESSAGE_ID, CLOSE_STREAM_PAYLOAD, } from "./protocol.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Sleep helper (for EAGAIN retry on non-blocking fds)
14
+ // ---------------------------------------------------------------------------
15
+ const sleepArray = new Int32Array(new SharedArrayBuffer(4));
16
+ function sleepMs(ms) {
17
+ Atomics.wait(sleepArray, 0, 0, ms);
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Connection
21
+ // ---------------------------------------------------------------------------
22
+ export class Connection {
23
+ readFd;
24
+ writeFd;
25
+ nextStreamCounter = 0;
26
+ streamInboxes = new Map();
27
+ serverExited = false;
28
+ constructor(readFd, writeFd) {
29
+ this.readFd = readFd;
30
+ this.writeFd = writeFd;
31
+ }
32
+ markServerExited() {
33
+ this.serverExited = true;
34
+ }
35
+ hasServerExited() {
36
+ return this.serverExited;
37
+ }
38
+ /**
39
+ * Read exactly `n` bytes from the pipe, blocking until available.
40
+ * Handles EAGAIN from non-blocking file descriptors.
41
+ */
42
+ readExact(n) {
43
+ const buf = Buffer.alloc(n);
44
+ let offset = 0;
45
+ while (offset < n) {
46
+ try {
47
+ const bytesRead = fs.readSync(this.readFd, buf, offset, n - offset, null);
48
+ if (bytesRead === 0) {
49
+ this.serverExited = true;
50
+ throw new Error("Connection closed: server process exited");
51
+ }
52
+ offset += bytesRead;
53
+ }
54
+ catch (e) {
55
+ if (e instanceof Error &&
56
+ "code" in e &&
57
+ (e.code === "EAGAIN" ||
58
+ e.code === "EWOULDBLOCK")) {
59
+ sleepMs(1);
60
+ continue;
61
+ }
62
+ throw e;
63
+ }
64
+ }
65
+ return buf;
66
+ }
67
+ /**
68
+ * Write a packet to the server synchronously.
69
+ */
70
+ sendPacket(packet) {
71
+ const data = encodePacket(packet);
72
+ fs.writeSync(this.writeFd, data);
73
+ }
74
+ /**
75
+ * Read packets until one for the given stream arrives.
76
+ * Packets for other streams are buffered in their inboxes.
77
+ */
78
+ readPacketForStream(streamId) {
79
+ // Check inbox first
80
+ const inbox = this.streamInboxes.get(streamId);
81
+ if (inbox && inbox.length > 0) {
82
+ return inbox.shift();
83
+ }
84
+ // Read from pipe until we get a packet for this stream
85
+ while (true) {
86
+ const packet = readPacketFrom((n) => this.readExact(n));
87
+ if (packet.streamId === streamId) {
88
+ return packet;
89
+ }
90
+ // Buffer for other streams
91
+ let otherInbox = this.streamInboxes.get(packet.streamId);
92
+ if (!otherInbox) {
93
+ otherInbox = [];
94
+ this.streamInboxes.set(packet.streamId, otherInbox);
95
+ }
96
+ otherInbox.push(packet);
97
+ }
98
+ }
99
+ /**
100
+ * Create a new client-initiated stream (odd ID).
101
+ */
102
+ newStream() {
103
+ const id = ((this.nextStreamCounter++ << 1) | 1) >>> 0;
104
+ return new Stream(id, this);
105
+ }
106
+ /**
107
+ * Connect to an existing server-allocated stream.
108
+ */
109
+ connectStream(streamId) {
110
+ return new Stream(streamId, this);
111
+ }
112
+ /**
113
+ * Get the control stream (stream ID 0).
114
+ */
115
+ controlStream() {
116
+ return new Stream(0, this);
117
+ }
118
+ /**
119
+ * Remove buffered packets for a stream.
120
+ */
121
+ unregisterStream(streamId) {
122
+ this.streamInboxes.delete(streamId);
123
+ }
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // Stream
127
+ // ---------------------------------------------------------------------------
128
+ export class Stream {
129
+ streamId;
130
+ connection;
131
+ nextMessageId = 1;
132
+ responses = new Map();
133
+ requests = [];
134
+ closed = false;
135
+ constructor(streamId, connection) {
136
+ this.streamId = streamId;
137
+ this.connection = connection;
138
+ }
139
+ markClosed() {
140
+ this.closed = true;
141
+ }
142
+ checkClosed() {
143
+ if (this.closed) {
144
+ throw new Error("Stream is closed");
145
+ }
146
+ }
147
+ /**
148
+ * Send a request packet and return the message ID.
149
+ */
150
+ sendRequest(payload) {
151
+ this.checkClosed();
152
+ const messageId = this.nextMessageId++;
153
+ this.connection.sendPacket({
154
+ streamId: this.streamId,
155
+ messageId,
156
+ isReply: false,
157
+ payload,
158
+ });
159
+ return messageId;
160
+ }
161
+ /**
162
+ * Send a reply to an incoming request.
163
+ */
164
+ writeReply(messageId, payload) {
165
+ this.connection.sendPacket({
166
+ streamId: this.streamId,
167
+ messageId,
168
+ isReply: true,
169
+ payload,
170
+ });
171
+ }
172
+ /**
173
+ * Wait for a reply to a previously sent request.
174
+ */
175
+ receiveReply(messageId) {
176
+ // Check buffered responses first
177
+ const buffered = this.responses.get(messageId);
178
+ if (buffered !== undefined) {
179
+ this.responses.delete(messageId);
180
+ return buffered;
181
+ }
182
+ while (true) {
183
+ this.checkClosed();
184
+ const packet = this.connection.readPacketForStream(this.streamId);
185
+ if (packet.isReply && packet.messageId === messageId) {
186
+ return packet.payload;
187
+ }
188
+ // Buffer for later
189
+ if (packet.isReply) {
190
+ this.responses.set(packet.messageId, packet.payload);
191
+ }
192
+ else {
193
+ this.requests.push(packet);
194
+ }
195
+ }
196
+ }
197
+ /**
198
+ * Wait for an incoming request from the server.
199
+ */
200
+ receiveRequest() {
201
+ if (this.requests.length > 0) {
202
+ const packet = this.requests.shift();
203
+ return [packet.messageId, packet.payload];
204
+ }
205
+ while (true) {
206
+ this.checkClosed();
207
+ const packet = this.connection.readPacketForStream(this.streamId);
208
+ if (!packet.isReply) {
209
+ return [packet.messageId, packet.payload];
210
+ }
211
+ // Buffer reply for later
212
+ this.responses.set(packet.messageId, packet.payload);
213
+ }
214
+ }
215
+ /**
216
+ * Close this stream gracefully.
217
+ */
218
+ close() {
219
+ if (this.closed)
220
+ return;
221
+ this.closed = true;
222
+ this.connection.unregisterStream(this.streamId);
223
+ this.connection.sendPacket({
224
+ streamId: this.streamId,
225
+ messageId: CLOSE_STREAM_MESSAGE_ID,
226
+ isReply: false,
227
+ payload: CLOSE_STREAM_PAYLOAD,
228
+ });
229
+ }
230
+ }
231
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CRC32 (IEEE 802.3 / ISO-HDLC, polynomial 0xEDB88320).
3
+ *
4
+ * Vendored so the library works on Node versions older than 22.2.0.
5
+ */
6
+ /**
7
+ * Compute the CRC32 checksum of a byte buffer.
8
+ *
9
+ * @param data - The bytes to checksum.
10
+ * @returns The CRC32 as an unsigned 32-bit integer.
11
+ */
12
+ export declare function crc32(data: Uint8Array): number;
13
+ //# sourceMappingURL=crc32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.d.ts","sourceRoot":"","sources":["../src/crc32.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAM9C"}
package/dist/crc32.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * CRC32 (IEEE 802.3 / ISO-HDLC, polynomial 0xEDB88320).
3
+ *
4
+ * Vendored so the library works on Node versions older than 22.2.0.
5
+ */
6
+ const CRC_TABLE = (() => {
7
+ const table = new Uint32Array(256);
8
+ for (let i = 0; i < 256; i++) {
9
+ let c = i;
10
+ for (let k = 0; k < 8; k++) {
11
+ c = (c & 1) !== 0 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
12
+ }
13
+ table[i] = c;
14
+ }
15
+ return table;
16
+ })();
17
+ /**
18
+ * Compute the CRC32 checksum of a byte buffer.
19
+ *
20
+ * @param data - The bytes to checksum.
21
+ * @returns The CRC32 as an unsigned 32-bit integer.
22
+ */
23
+ export function crc32(data) {
24
+ let crc = 0xffffffff;
25
+ for (let i = 0; i < data.length; i++) {
26
+ crc = CRC_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);
27
+ }
28
+ return (crc ^ 0xffffffff) >>> 0;
29
+ }
30
+ //# sourceMappingURL=crc32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.js","sourceRoot":"","sources":["../src/crc32.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,SAAS,GAAgB,CAAC,GAAG,EAAE;IACnC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,EAAE,CAAC;AAEL;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,IAAgB;IACpC,IAAI,GAAG,GAAG,UAAU,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,GAAG,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}