@nifrajs/core 1.13.0 → 2.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 (233) hide show
  1. package/README.md +37 -1
  2. package/dist/assurance.d.ts +11 -2
  3. package/dist/assurance.d.ts.map +1 -1
  4. package/dist/assurance.js +20 -0
  5. package/dist/assurance.js.map +1 -1
  6. package/dist/capabilities.d.ts +54 -2
  7. package/dist/capabilities.d.ts.map +1 -1
  8. package/dist/capabilities.js +240 -5
  9. package/dist/capabilities.js.map +1 -1
  10. package/dist/durable-adapters.d.ts +241 -0
  11. package/dist/durable-adapters.d.ts.map +1 -0
  12. package/dist/durable-adapters.js +697 -0
  13. package/dist/durable-adapters.js.map +1 -0
  14. package/dist/durable-execution.d.ts +349 -0
  15. package/dist/durable-execution.d.ts.map +1 -0
  16. package/dist/durable-execution.js +1173 -0
  17. package/dist/durable-execution.js.map +1 -0
  18. package/dist/effect-ledger.d.ts +9 -0
  19. package/dist/effect-ledger.d.ts.map +1 -0
  20. package/dist/effect-ledger.js +8 -0
  21. package/dist/effect-ledger.js.map +1 -0
  22. package/dist/effect-lifecycle.d.ts +42 -0
  23. package/dist/effect-lifecycle.d.ts.map +1 -0
  24. package/dist/effect-lifecycle.js +66 -0
  25. package/dist/effect-lifecycle.js.map +1 -0
  26. package/dist/effect-scope.d.ts +75 -0
  27. package/dist/effect-scope.d.ts.map +1 -0
  28. package/dist/effect-scope.js +177 -0
  29. package/dist/effect-scope.js.map +1 -0
  30. package/dist/idempotency-plugin.d.ts +13 -0
  31. package/dist/idempotency-plugin.d.ts.map +1 -0
  32. package/dist/idempotency-plugin.js +16 -0
  33. package/dist/idempotency-plugin.js.map +1 -0
  34. package/dist/index.d.ts +6 -35
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +6 -31
  37. package/dist/index.js.map +1 -1
  38. package/dist/internal/capability-runtime.d.ts +62 -1
  39. package/dist/internal/capability-runtime.d.ts.map +1 -1
  40. package/dist/internal/capability-runtime.js +11 -2
  41. package/dist/internal/capability-runtime.js.map +1 -1
  42. package/dist/internal/effect-execution.d.ts +16 -0
  43. package/dist/internal/effect-execution.d.ts.map +1 -0
  44. package/dist/internal/effect-execution.js +50 -0
  45. package/dist/internal/effect-execution.js.map +1 -0
  46. package/dist/internal/safe-equal.d.ts +20 -0
  47. package/dist/internal/safe-equal.d.ts.map +1 -0
  48. package/dist/internal/safe-equal.js +31 -0
  49. package/dist/internal/safe-equal.js.map +1 -0
  50. package/dist/ledger.d.ts +14 -6
  51. package/dist/ledger.d.ts.map +1 -1
  52. package/dist/ledger.js +31 -5
  53. package/dist/ledger.js.map +1 -1
  54. package/dist/mcp.d.ts +7 -0
  55. package/dist/mcp.d.ts.map +1 -0
  56. package/dist/mcp.js +56 -0
  57. package/dist/mcp.js.map +1 -0
  58. package/dist/node-direct.d.ts +5 -0
  59. package/dist/node-direct.d.ts.map +1 -0
  60. package/dist/node-direct.js +27 -0
  61. package/dist/node-direct.js.map +1 -0
  62. package/dist/reconciliation-worker.d.ts +108 -0
  63. package/dist/reconciliation-worker.d.ts.map +1 -0
  64. package/dist/reconciliation-worker.js +239 -0
  65. package/dist/reconciliation-worker.js.map +1 -0
  66. package/dist/reflection.d.ts +5 -0
  67. package/dist/reflection.d.ts.map +1 -1
  68. package/dist/reflection.js +2 -0
  69. package/dist/reflection.js.map +1 -1
  70. package/dist/server/client-ip.d.ts +35 -0
  71. package/dist/server/client-ip.d.ts.map +1 -0
  72. package/dist/server/client-ip.js +42 -0
  73. package/dist/server/client-ip.js.map +1 -0
  74. package/dist/server/context.d.ts +47 -2
  75. package/dist/server/context.d.ts.map +1 -1
  76. package/dist/server/contract.d.ts +14 -4
  77. package/dist/server/contract.d.ts.map +1 -1
  78. package/dist/server/contract.js +8 -2
  79. package/dist/server/contract.js.map +1 -1
  80. package/dist/server/http.d.ts +14 -0
  81. package/dist/server/http.d.ts.map +1 -0
  82. package/dist/server/http.js +45 -0
  83. package/dist/server/http.js.map +1 -0
  84. package/dist/server/idempotency-lane.d.ts +45 -0
  85. package/dist/server/idempotency-lane.d.ts.map +1 -0
  86. package/dist/server/idempotency-lane.js +205 -0
  87. package/dist/server/idempotency-lane.js.map +1 -0
  88. package/dist/server/install.d.ts +21 -0
  89. package/dist/server/install.d.ts.map +1 -0
  90. package/dist/server/install.js +21 -0
  91. package/dist/server/install.js.map +1 -0
  92. package/dist/server/ledger-lane.d.ts +53 -0
  93. package/dist/server/ledger-lane.d.ts.map +1 -0
  94. package/dist/server/ledger-lane.js +82 -0
  95. package/dist/server/ledger-lane.js.map +1 -0
  96. package/dist/server/mcp-hook.d.ts +28 -0
  97. package/dist/server/mcp-hook.d.ts.map +1 -0
  98. package/dist/server/mcp-hook.js +2 -0
  99. package/dist/server/mcp-hook.js.map +1 -0
  100. package/dist/server/node-outcome-hook.d.ts +9 -0
  101. package/dist/server/node-outcome-hook.d.ts.map +1 -0
  102. package/dist/server/node-outcome-hook.js +2 -0
  103. package/dist/server/node-outcome-hook.js.map +1 -0
  104. package/dist/server/node-outcome.d.ts +37 -0
  105. package/dist/server/node-outcome.d.ts.map +1 -0
  106. package/dist/server/node-outcome.js +75 -0
  107. package/dist/server/node-outcome.js.map +1 -0
  108. package/dist/server/plugin.d.ts +78 -0
  109. package/dist/server/plugin.d.ts.map +1 -0
  110. package/dist/server/plugin.js +57 -0
  111. package/dist/server/plugin.js.map +1 -0
  112. package/dist/server/query.d.ts +18 -0
  113. package/dist/server/query.d.ts.map +1 -0
  114. package/dist/server/query.js +102 -0
  115. package/dist/server/query.js.map +1 -0
  116. package/dist/server/registry.d.ts +31 -6
  117. package/dist/server/registry.d.ts.map +1 -1
  118. package/dist/server/request-context.d.ts +51 -0
  119. package/dist/server/request-context.d.ts.map +1 -0
  120. package/dist/server/request-context.js +184 -0
  121. package/dist/server/request-context.js.map +1 -0
  122. package/dist/server/respond.d.ts +17 -0
  123. package/dist/server/respond.d.ts.map +1 -0
  124. package/dist/server/respond.js +81 -0
  125. package/dist/server/respond.js.map +1 -0
  126. package/dist/server/runtime-core.d.ts +36 -0
  127. package/dist/server/runtime-core.d.ts.map +1 -0
  128. package/dist/server/runtime-core.js +51 -0
  129. package/dist/server/runtime-core.js.map +1 -0
  130. package/dist/server/server-types.d.ts +203 -0
  131. package/dist/server/server-types.d.ts.map +1 -0
  132. package/dist/server/server-types.js +2 -0
  133. package/dist/server/server-types.js.map +1 -0
  134. package/dist/server/server.d.ts +119 -345
  135. package/dist/server/server.d.ts.map +1 -1
  136. package/dist/server/server.js +247 -833
  137. package/dist/server/server.js.map +1 -1
  138. package/dist/server/sse-hook.d.ts +10 -0
  139. package/dist/server/sse-hook.d.ts.map +1 -0
  140. package/dist/server/sse-hook.js +2 -0
  141. package/dist/server/sse-hook.js.map +1 -0
  142. package/dist/server/sse.d.ts +7 -23
  143. package/dist/server/sse.d.ts.map +1 -1
  144. package/dist/server/sse.js +18 -0
  145. package/dist/server/sse.js.map +1 -1
  146. package/dist/server/transport-lane.d.ts +28 -0
  147. package/dist/server/transport-lane.d.ts.map +1 -0
  148. package/dist/server/transport-lane.js +106 -0
  149. package/dist/server/transport-lane.js.map +1 -0
  150. package/dist/server/websocket.d.ts +23 -1
  151. package/dist/server/websocket.d.ts.map +1 -1
  152. package/dist/server/websocket.js +10 -1
  153. package/dist/server/websocket.js.map +1 -1
  154. package/dist/server/ws-hook.d.ts +8 -11
  155. package/dist/server/ws-hook.d.ts.map +1 -1
  156. package/dist/server/ws-hook.js +7 -14
  157. package/dist/server/ws-hook.js.map +1 -1
  158. package/dist/server.d.ts +21 -0
  159. package/dist/server.d.ts.map +1 -0
  160. package/dist/server.js +16 -0
  161. package/dist/server.js.map +1 -0
  162. package/dist/transport-codec-rich.d.ts +8 -0
  163. package/dist/transport-codec-rich.d.ts.map +1 -0
  164. package/dist/transport-codec-rich.js +14 -0
  165. package/dist/transport-codec-rich.js.map +1 -0
  166. package/dist/transport-codec.d.ts +31 -0
  167. package/dist/transport-codec.d.ts.map +1 -0
  168. package/dist/transport-codec.js +190 -0
  169. package/dist/transport-codec.js.map +1 -0
  170. package/dist/transport-plugin.d.ts +3 -0
  171. package/dist/transport-plugin.d.ts.map +1 -0
  172. package/dist/transport-plugin.js +3 -0
  173. package/dist/transport-plugin.js.map +1 -0
  174. package/dist/wire.d.ts +58 -0
  175. package/dist/wire.d.ts.map +1 -0
  176. package/dist/wire.js +445 -0
  177. package/dist/wire.js.map +1 -0
  178. package/dist/ws.d.ts +16 -7
  179. package/dist/ws.d.ts.map +1 -1
  180. package/dist/ws.js +25 -10
  181. package/dist/ws.js.map +1 -1
  182. package/package.json +122 -6
  183. package/src/assurance.ts +36 -1
  184. package/src/capabilities.ts +306 -5
  185. package/src/durable-adapters.ts +1039 -0
  186. package/src/durable-execution.ts +1676 -0
  187. package/src/effect-ledger.ts +9 -0
  188. package/src/effect-lifecycle.ts +120 -0
  189. package/src/effect-scope.ts +267 -0
  190. package/src/idempotency-plugin.ts +17 -0
  191. package/src/index.ts +6 -133
  192. package/src/internal/capability-runtime.ts +87 -1
  193. package/src/internal/effect-execution.ts +70 -0
  194. package/src/internal/safe-equal.ts +27 -0
  195. package/src/ledger.ts +45 -11
  196. package/src/mcp.ts +65 -0
  197. package/src/node-direct.ts +37 -0
  198. package/src/reconciliation-worker.ts +372 -0
  199. package/src/reflection.ts +7 -0
  200. package/src/server/client-ip.ts +60 -0
  201. package/src/server/context.ts +50 -2
  202. package/src/server/contract.ts +26 -7
  203. package/src/server/http.ts +58 -0
  204. package/src/server/idempotency-lane.ts +321 -0
  205. package/src/server/install.ts +28 -0
  206. package/src/server/ledger-lane.ts +125 -0
  207. package/src/server/mcp-hook.ts +41 -0
  208. package/src/server/node-outcome-hook.ts +9 -0
  209. package/src/server/node-outcome.ts +112 -0
  210. package/src/server/plugin.ts +92 -0
  211. package/src/server/query.ts +119 -0
  212. package/src/server/registry.ts +36 -6
  213. package/src/server/request-context.ts +271 -0
  214. package/src/server/respond.ts +94 -0
  215. package/src/server/runtime-core.ts +74 -0
  216. package/src/server/server-types.ts +204 -0
  217. package/src/server/server.ts +448 -1314
  218. package/src/server/sse-hook.ts +14 -0
  219. package/src/server/sse.ts +26 -0
  220. package/src/server/transport-lane.ts +141 -0
  221. package/src/server/websocket.ts +35 -1
  222. package/src/server/ws-hook.ts +8 -19
  223. package/src/server.ts +92 -0
  224. package/src/transport-codec-rich.ts +20 -0
  225. package/src/transport-codec.ts +250 -0
  226. package/src/transport-plugin.ts +2 -0
  227. package/src/wire.ts +474 -0
  228. package/src/ws.ts +33 -10
  229. package/dist/invariants.d.ts +0 -70
  230. package/dist/invariants.d.ts.map +0 -1
  231. package/dist/invariants.js +0 -487
  232. package/dist/invariants.js.map +0 -1
  233. package/src/invariants.ts +0 -604
package/dist/wire.js ADDED
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Rich-type wire codec: round-trips values that plain JSON silently drops or corrupts, across any
3
+ * JSON transport (RPC bodies, loader payloads, WebSocket frames).
4
+ *
5
+ * `JSON.stringify` turns `undefined` into a missing key, `Date` into a lossy string, `NaN`/`Infinity`
6
+ * into `null`, loses `-0`, and throws on `BigInt` - and it has no notion of `Map`, `Set`, `RegExp`,
7
+ * `URL`, `ArrayBuffer`, or typed arrays. It also flattens a shared reference into two copies and throws
8
+ * on a cycle. A typed client that infers `Date` from the server type then receives a `string` at runtime
9
+ * is exactly the drift this framework exists to remove. `encode` maps a value to a JSON-safe structure
10
+ * that `decode` reconstructs exactly - including cycles and preserved reference identity; `stringify` /
11
+ * `parse` are the drop-in `JSON.*` equivalents.
12
+ *
13
+ * The wire form is `{ r, n }`: `r` is the root (an inline value or a `ref`), `n` is a flat table of
14
+ * container/rich nodes addressed by index. Because every object is interned in `n` and referenced by
15
+ * index, a shared object is encoded once (and decodes to a single shared instance), and a cycle is a
16
+ * back-reference rather than infinite recursion. Functions and symbols are rejected, never silently
17
+ * dropped. Decoding validates every tag and index, so a malformed payload throws {@link WireDecodeError}
18
+ * rather than producing a corrupt value.
19
+ *
20
+ * Not covered by design (matches `JSON`): class identity (a class instance decodes to a plain object
21
+ * carrying its own enumerable properties), non-enumerable and symbol keys, and getters (read once).
22
+ */
23
+ /** Discriminator key on a tagged wire node. Never collides with user data: user objects live under a
24
+ * node's `v` field, so their own keys - including one literally named `$w` - are never re-interpreted. */
25
+ const TAG = "$w";
26
+ export const DEFAULT_WIRE_DECODE_LIMITS = Object.freeze({
27
+ maxNodes: 10_000,
28
+ maxDepth: 256,
29
+ maxCollectionEntries: 100_000,
30
+ maxDecodedBytes: 16 * 1024 * 1024,
31
+ });
32
+ /** Thrown by {@link encode} for a value it will not encode (a function or a symbol). */
33
+ export class WireEncodeError extends TypeError {
34
+ constructor(message) {
35
+ super(message);
36
+ this.name = "WireEncodeError";
37
+ }
38
+ }
39
+ /** Thrown by {@link decode} for a wire value carrying an unknown tag, a bad index, or malformed shape. */
40
+ export class WireDecodeError extends TypeError {
41
+ constructor(message) {
42
+ super(message);
43
+ this.name = "WireDecodeError";
44
+ }
45
+ }
46
+ function isRecord(value) {
47
+ return value !== null && typeof value === "object" && !Array.isArray(value);
48
+ }
49
+ function decodeLimit(value, fallback, label) {
50
+ const limit = value ?? fallback;
51
+ if (!Number.isSafeInteger(limit) || limit < 0) {
52
+ throw new RangeError(`wire decode ${label} must be a non-negative safe integer`);
53
+ }
54
+ return limit;
55
+ }
56
+ function utf8ByteLength(value, stopAfter = Number.MAX_SAFE_INTEGER) {
57
+ let bytes = 0;
58
+ for (let index = 0; index < value.length; index++) {
59
+ const code = value.charCodeAt(index);
60
+ if (code < 0x80)
61
+ bytes++;
62
+ else if (code < 0x800)
63
+ bytes += 2;
64
+ else if (code >= 0xd800 && code <= 0xdbff && index + 1 < value.length) {
65
+ const next = value.charCodeAt(index + 1);
66
+ if (next >= 0xdc00 && next <= 0xdfff) {
67
+ bytes += 4;
68
+ index++;
69
+ }
70
+ else
71
+ bytes += 3;
72
+ }
73
+ else
74
+ bytes += 3;
75
+ if (bytes > stopAfter)
76
+ return bytes;
77
+ }
78
+ return bytes;
79
+ }
80
+ /** The typed-array kinds the codec round-trips, by constructor name. */
81
+ const TYPED_ARRAYS = {
82
+ Int8Array,
83
+ Uint8Array,
84
+ Uint8ClampedArray,
85
+ Int16Array,
86
+ Uint16Array,
87
+ Int32Array,
88
+ Uint32Array,
89
+ Float32Array,
90
+ Float64Array,
91
+ BigInt64Array,
92
+ BigUint64Array,
93
+ };
94
+ function defineEnumerableOwn(target, key, value) {
95
+ Object.defineProperty(target, key, {
96
+ value,
97
+ enumerable: true,
98
+ configurable: true,
99
+ writable: true,
100
+ });
101
+ }
102
+ // ─── encode ─────────────────────────────────────────────────────────────────
103
+ /** Encode any supported value into a JSON-safe {@link Wire} form. */
104
+ export function encode(value) {
105
+ const nodes = [];
106
+ const interned = new Map();
107
+ /** Encode a value to its inline wire form, interning objects into `nodes` and returning a `ref`. */
108
+ const inline = (v) => {
109
+ if (v === undefined)
110
+ return { [TAG]: "undef" };
111
+ if (v === null)
112
+ return null;
113
+ switch (typeof v) {
114
+ case "string":
115
+ case "boolean":
116
+ return v;
117
+ case "number":
118
+ if (Object.is(v, -0))
119
+ return { [TAG]: "num", v: "-0" };
120
+ if (Number.isNaN(v))
121
+ return { [TAG]: "num", v: "NaN" };
122
+ if (v === Infinity)
123
+ return { [TAG]: "num", v: "Infinity" };
124
+ if (v === -Infinity)
125
+ return { [TAG]: "num", v: "-Infinity" };
126
+ return v; // a finite, signed-zero-free number is already JSON-safe
127
+ case "bigint":
128
+ return { [TAG]: "bigint", v: v.toString() };
129
+ case "function":
130
+ case "symbol":
131
+ throw new WireEncodeError(`cannot encode a ${typeof v}`);
132
+ }
133
+ const obj = v;
134
+ const existing = interned.get(obj);
135
+ if (existing !== undefined)
136
+ return { [TAG]: "ref", i: existing };
137
+ // Reserve this object's index BEFORE encoding its body, so a self- or mutual-reference inside the
138
+ // body resolves to a `ref` here instead of recursing forever.
139
+ const index = nodes.length;
140
+ interned.set(obj, index);
141
+ nodes.push(0); // placeholder, overwritten below
142
+ nodes[index] = body(v, inline);
143
+ return { [TAG]: "ref", i: index };
144
+ };
145
+ return { r: inline(value), n: nodes };
146
+ }
147
+ /** Encode the interned body of one object into its tagged node. */
148
+ function body(v, inline) {
149
+ if (v instanceof Date) {
150
+ const time = v.getTime();
151
+ return { [TAG]: "date", v: Number.isNaN(time) ? null : v.toISOString() };
152
+ }
153
+ if (v instanceof RegExp)
154
+ return { [TAG]: "regexp", v: [v.source, v.flags] };
155
+ if (v instanceof URL)
156
+ return { [TAG]: "url", v: v.href };
157
+ if (v instanceof ArrayBuffer)
158
+ return { [TAG]: "buf", v: bytesToBase64(new Uint8Array(v)) };
159
+ if (v instanceof DataView) {
160
+ return { [TAG]: "dv", v: bytesToBase64(new Uint8Array(v.buffer, v.byteOffset, v.byteLength)) };
161
+ }
162
+ if (ArrayBuffer.isView(v)) {
163
+ const view = v;
164
+ const kind = view.constructor.name;
165
+ if (!(kind in TYPED_ARRAYS))
166
+ throw new WireEncodeError(`cannot encode typed array ${kind}`);
167
+ return {
168
+ [TAG]: "ta",
169
+ k: kind,
170
+ v: bytesToBase64(new Uint8Array(view.buffer, view.byteOffset, view.byteLength)),
171
+ };
172
+ }
173
+ if (v instanceof Map) {
174
+ return { [TAG]: "map", v: Array.from(v, ([k, val]) => [inline(k), inline(val)]) };
175
+ }
176
+ if (v instanceof Set)
177
+ return { [TAG]: "set", v: Array.from(v, (item) => inline(item)) };
178
+ if (Array.isArray(v))
179
+ return { [TAG]: "arr", v: v.map((item) => inline(item)) };
180
+ const record = v;
181
+ const out = {};
182
+ for (const key of Object.keys(record))
183
+ defineEnumerableOwn(out, key, inline(record[key]));
184
+ return { [TAG]: "obj", v: out };
185
+ }
186
+ // ─── decode ─────────────────────────────────────────────────────────────────
187
+ /** Reconstruct the original value from a {@link Wire} form produced by {@link encode}. */
188
+ export function decode(wire, limits = {}) {
189
+ if (!isRecord(wire) || !Object.hasOwn(wire, "r") || !Array.isArray(wire.n)) {
190
+ throw new WireDecodeError("not a wire value: expected { r, n }");
191
+ }
192
+ const nodes = wire.n;
193
+ const maxNodes = decodeLimit(limits.maxNodes, DEFAULT_WIRE_DECODE_LIMITS.maxNodes, "maxNodes");
194
+ const maxDepth = decodeLimit(limits.maxDepth, DEFAULT_WIRE_DECODE_LIMITS.maxDepth, "maxDepth");
195
+ const maxCollectionEntries = decodeLimit(limits.maxCollectionEntries, DEFAULT_WIRE_DECODE_LIMITS.maxCollectionEntries, "maxCollectionEntries");
196
+ const maxDecodedBytes = decodeLimit(limits.maxDecodedBytes, DEFAULT_WIRE_DECODE_LIMITS.maxDecodedBytes, "maxDecodedBytes");
197
+ if (nodes.length > maxNodes)
198
+ throw new WireDecodeError("wire node limit exceeded");
199
+ const built = new Map();
200
+ let collectionEntries = 0;
201
+ let decodedBytes = 0;
202
+ const enter = (depth) => {
203
+ if (depth > maxDepth)
204
+ throw new WireDecodeError("wire depth limit exceeded");
205
+ };
206
+ const chargeEntries = (count) => {
207
+ collectionEntries += count;
208
+ if (!Number.isSafeInteger(collectionEntries) || collectionEntries > maxCollectionEntries) {
209
+ throw new WireDecodeError("wire collection entry limit exceeded");
210
+ }
211
+ };
212
+ const chargeBytes = (count) => {
213
+ decodedBytes += count;
214
+ if (!Number.isSafeInteger(decodedBytes) || decodedBytes > maxDecodedBytes) {
215
+ throw new WireDecodeError("wire decoded byte limit exceeded");
216
+ }
217
+ };
218
+ const chargeString = (value) => chargeBytes(utf8ByteLength(value, maxDecodedBytes - decodedBytes));
219
+ const inline = (w, depth) => {
220
+ enter(depth);
221
+ if (w === null || typeof w === "boolean")
222
+ return w;
223
+ if (typeof w === "string") {
224
+ chargeString(w);
225
+ return w;
226
+ }
227
+ if (typeof w === "number") {
228
+ if (!Number.isFinite(w) || Object.is(w, -0)) {
229
+ throw new WireDecodeError("malformed wire: non-JSON number inline");
230
+ }
231
+ return w;
232
+ }
233
+ if (!isRecord(w))
234
+ throw new WireDecodeError("malformed wire: invalid inline value");
235
+ const record = w;
236
+ const tag = record[TAG];
237
+ if (typeof tag !== "string")
238
+ throw new WireDecodeError("malformed wire: object without a tag inline");
239
+ switch (tag) {
240
+ case "undef":
241
+ return undefined;
242
+ case "num": {
243
+ const v = record.v;
244
+ if (v === "-0")
245
+ return -0;
246
+ if (v === "NaN")
247
+ return NaN;
248
+ if (v === "Infinity")
249
+ return Infinity;
250
+ if (v === "-Infinity")
251
+ return -Infinity;
252
+ throw new WireDecodeError(`malformed num token: ${String(v)}`);
253
+ }
254
+ case "bigint": {
255
+ if (typeof record.v !== "string" || !/^-?(?:0|[1-9][0-9]*)$/u.test(record.v)) {
256
+ throw new WireDecodeError("malformed bigint token");
257
+ }
258
+ chargeString(record.v);
259
+ return BigInt(record.v);
260
+ }
261
+ case "ref":
262
+ return resolve(record.i, depth);
263
+ default:
264
+ throw new WireDecodeError(`unexpected inline tag: ${tag}`);
265
+ }
266
+ };
267
+ const resolve = (raw, depth) => {
268
+ enter(depth);
269
+ if (typeof raw !== "number" || !Number.isInteger(raw) || raw < 0 || raw >= nodes.length) {
270
+ throw new WireDecodeError(`ref out of range: ${String(raw)}`);
271
+ }
272
+ const index = raw;
273
+ const cached = built.get(index);
274
+ if (cached !== undefined || built.has(index))
275
+ return cached;
276
+ const node = nodes[index];
277
+ if (!isRecord(node))
278
+ throw new WireDecodeError(`malformed node at ${index}`);
279
+ const record = node;
280
+ const tag = record[TAG];
281
+ switch (tag) {
282
+ case "obj": {
283
+ if (!isRecord(record.v))
284
+ throw new WireDecodeError(`malformed obj node at ${index}`);
285
+ const out = {};
286
+ built.set(index, out); // publish the shell first so cycles resolve to it
287
+ const src = record.v;
288
+ const keys = Object.keys(src);
289
+ chargeEntries(keys.length);
290
+ for (const key of keys) {
291
+ chargeString(key);
292
+ defineEnumerableOwn(out, key, inline(src[key], depth + 1));
293
+ }
294
+ return out;
295
+ }
296
+ case "arr": {
297
+ if (!Array.isArray(record.v))
298
+ throw new WireDecodeError(`malformed arr node at ${index}`);
299
+ const out = [];
300
+ built.set(index, out);
301
+ chargeEntries(record.v.length);
302
+ for (const item of record.v)
303
+ out.push(inline(item, depth + 1));
304
+ return out;
305
+ }
306
+ case "map": {
307
+ if (!Array.isArray(record.v))
308
+ throw new WireDecodeError(`malformed map node at ${index}`);
309
+ const out = new Map();
310
+ built.set(index, out);
311
+ chargeEntries(record.v.length);
312
+ for (const entry of record.v) {
313
+ if (!Array.isArray(entry) || entry.length !== 2) {
314
+ throw new WireDecodeError(`malformed map entry at ${index}`);
315
+ }
316
+ out.set(inline(entry[0], depth + 1), inline(entry[1], depth + 1));
317
+ }
318
+ return out;
319
+ }
320
+ case "set": {
321
+ if (!Array.isArray(record.v))
322
+ throw new WireDecodeError(`malformed set node at ${index}`);
323
+ const out = new Set();
324
+ built.set(index, out);
325
+ chargeEntries(record.v.length);
326
+ for (const item of record.v)
327
+ out.add(inline(item, depth + 1));
328
+ return out;
329
+ }
330
+ case "date": {
331
+ if (record.v !== null && typeof record.v !== "string") {
332
+ throw new WireDecodeError(`malformed date node at ${index}`);
333
+ }
334
+ if (record.v !== null)
335
+ chargeString(record.v);
336
+ const out = record.v === null ? new Date(NaN) : new Date(record.v);
337
+ if (record.v !== null && (Number.isNaN(out.getTime()) || out.toISOString() !== record.v)) {
338
+ throw new WireDecodeError(`malformed date node at ${index}`);
339
+ }
340
+ built.set(index, out);
341
+ return out;
342
+ }
343
+ case "regexp": {
344
+ if (!Array.isArray(record.v) ||
345
+ record.v.length !== 2 ||
346
+ typeof record.v[0] !== "string" ||
347
+ typeof record.v[1] !== "string") {
348
+ throw new WireDecodeError(`malformed regexp node at ${index}`);
349
+ }
350
+ chargeString(record.v[0]);
351
+ chargeString(record.v[1]);
352
+ let out;
353
+ try {
354
+ out = new RegExp(record.v[0], record.v[1]);
355
+ }
356
+ catch {
357
+ throw new WireDecodeError(`malformed regexp node at ${index}`);
358
+ }
359
+ built.set(index, out);
360
+ return out;
361
+ }
362
+ case "url": {
363
+ if (typeof record.v !== "string") {
364
+ throw new WireDecodeError(`malformed url node at ${index}`);
365
+ }
366
+ chargeString(record.v);
367
+ let out;
368
+ try {
369
+ out = new URL(record.v);
370
+ }
371
+ catch {
372
+ throw new WireDecodeError(`malformed url node at ${index}`);
373
+ }
374
+ built.set(index, out);
375
+ return out;
376
+ }
377
+ case "buf": {
378
+ const out = base64ToBytes(record.v, index, chargeBytes).buffer;
379
+ built.set(index, out);
380
+ return out;
381
+ }
382
+ case "dv": {
383
+ const out = new DataView(base64ToBytes(record.v, index, chargeBytes).buffer);
384
+ built.set(index, out);
385
+ return out;
386
+ }
387
+ case "ta": {
388
+ const kind = record.k;
389
+ if (typeof kind !== "string" || !(kind in TYPED_ARRAYS)) {
390
+ throw new WireDecodeError(`unknown typed array: ${String(kind)}`);
391
+ }
392
+ const Ctor = TYPED_ARRAYS[kind];
393
+ const bytes = base64ToBytes(record.v, index, chargeBytes);
394
+ if (bytes.byteLength % Ctor.BYTES_PER_ELEMENT !== 0) {
395
+ throw new WireDecodeError(`misaligned bytes for ${kind}`);
396
+ }
397
+ // `base64ToBytes` always allocates a fresh, non-shared ArrayBuffer, so this narrowing is sound.
398
+ const out = new Ctor(bytes.buffer, 0, bytes.byteLength / Ctor.BYTES_PER_ELEMENT);
399
+ built.set(index, out);
400
+ return out;
401
+ }
402
+ default:
403
+ throw new WireDecodeError(`unknown wire tag: ${String(tag)}`);
404
+ }
405
+ };
406
+ return inline(wire.r, 0);
407
+ }
408
+ /** `encode` + `JSON.stringify` in one call - the rich-type equivalent of `JSON.stringify`. */
409
+ export function stringify(value) {
410
+ return JSON.stringify(encode(value));
411
+ }
412
+ /** `JSON.parse` + `decode` in one call - the rich-type equivalent of `JSON.parse`. */
413
+ export function parse(text, limits = {}) {
414
+ return decode(JSON.parse(text), limits);
415
+ }
416
+ // ─── base64 (portable across Bun / browser / Workers / Node / Deno) ───────────
417
+ function bytesToBase64(bytes) {
418
+ let binary = "";
419
+ const CHUNK = 0x8000; // chunk so String.fromCharCode(...) never overflows the call stack
420
+ for (let i = 0; i < bytes.length; i += CHUNK)
421
+ binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
422
+ return btoa(binary);
423
+ }
424
+ function base64ToBytes(base64, index, reserve) {
425
+ if (typeof base64 !== "string" || base64.length % 4 !== 0) {
426
+ throw new WireDecodeError(`malformed base64 at ${index}`);
427
+ }
428
+ const padding = base64.endsWith("==") ? 2 : base64.endsWith("=") ? 1 : 0;
429
+ reserve((base64.length / 4) * 3 - padding);
430
+ if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u.test(base64)) {
431
+ throw new WireDecodeError(`malformed base64 at ${index}`);
432
+ }
433
+ let binary;
434
+ try {
435
+ binary = atob(base64);
436
+ }
437
+ catch {
438
+ throw new WireDecodeError(`malformed base64 at ${index}`);
439
+ }
440
+ const bytes = new Uint8Array(binary.length);
441
+ for (let i = 0; i < binary.length; i++)
442
+ bytes[i] = binary.charCodeAt(i);
443
+ return bytes;
444
+ }
445
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"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"}
package/dist/ws.d.ts CHANGED
@@ -1,19 +1,28 @@
1
1
  /**
2
- * WebSocket runtime for `@nifrajs/core` — import once at your server entry to enable `app.ws()`:
2
+ * The opt-in WebSocket runtime plugin.
3
3
  *
4
- * import "@nifrajs/core/ws"
4
+ * `.use(websocket())` enables `app.ws()`:
5
5
  *
6
- * const app = server().ws("/chat", { message: (ws, data) => ws.send(data) })
6
+ * import { websocket } from "@nifrajs/core/ws"
7
7
  *
8
- * Why a subpath: an app that never uses WebSockets shouldn't ship the WS dispatcher, pub/sub
9
- * registry, and Bun socket plumbing in its server bundle (~1.5 KB gzipped on the minimal-app size
10
- * benchmark). Importing this module registers the runtime with the core server (idempotent);
11
- * calling `app.ws()` without it fails loud at boot with a `WS_RUNTIME_MISSING` error pointing here.
8
+ * const app = server().use(websocket()).ws("/chat", { message: (ws, data) => ws.send(data) })
9
+ *
10
+ * Without it, `app.ws()` throws at registration (fail-closed), so an app that never uses WebSockets
11
+ * never evaluates or bundles the WS dispatcher, pub/sub registry, and Bun socket plumbing (~1.5 KB
12
+ * gzipped on the minimal-app size benchmark). The runtime installs on that server instance only -
13
+ * the same `.use()` install seam as `mcp()` / `streaming()` / `idempotency()`, not a process-global
14
+ * or a side-effect import.
12
15
  *
13
16
  * Serving adapters that wire standard sockets themselves (`@nifrajs/workers`) import
14
17
  * `attachWebSocket` / `TopicRegistry` from here too.
15
18
  */
19
+ import type { IdentityPlugin } from "./server/plugin.js";
16
20
  import { attachWebSocket, TopicRegistry, wrapWebSocketMessageValidation } from "./server/websocket.js";
21
+ /**
22
+ * Enable WebSocket routes on a server: `.use(websocket())` turns on `app.ws()`. Applying it twice is
23
+ * a no-op (named plugin dedupe).
24
+ */
25
+ export declare function websocket(): IdentityPlugin;
17
26
  export type { NifraWebSocket, StandardWebSocket, WebSocketContext, WebSocketData, WebSocketHandler, WebSocketUpgradeOutcome, } from "./server/websocket.js";
18
27
  export { attachWebSocket, TopicRegistry, wrapWebSocketMessageValidation };
19
28
  //# sourceMappingURL=ws.d.ts.map
package/dist/ws.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,eAAe,EACf,aAAa,EACb,8BAA8B,EAC/B,MAAM,uBAAuB,CAAA;AAW9B,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,8BAA8B,EAAE,CAAA"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,EACL,eAAe,EACf,aAAa,EACb,8BAA8B,EAC/B,MAAM,uBAAuB,CAAA;AAgB9B;;;GAGG;AACH,wBAAgB,SAAS,IAAI,cAAc,CAM1C;AAED,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,8BAA8B,EAAE,CAAA"}
package/dist/ws.js CHANGED
@@ -1,26 +1,41 @@
1
1
  /**
2
- * WebSocket runtime for `@nifrajs/core` — import once at your server entry to enable `app.ws()`:
2
+ * The opt-in WebSocket runtime plugin.
3
3
  *
4
- * import "@nifrajs/core/ws"
4
+ * `.use(websocket())` enables `app.ws()`:
5
5
  *
6
- * const app = server().ws("/chat", { message: (ws, data) => ws.send(data) })
6
+ * import { websocket } from "@nifrajs/core/ws"
7
7
  *
8
- * Why a subpath: an app that never uses WebSockets shouldn't ship the WS dispatcher, pub/sub
9
- * registry, and Bun socket plumbing in its server bundle (~1.5 KB gzipped on the minimal-app size
10
- * benchmark). Importing this module registers the runtime with the core server (idempotent);
11
- * calling `app.ws()` without it fails loud at boot with a `WS_RUNTIME_MISSING` error pointing here.
8
+ * const app = server().use(websocket()).ws("/chat", { message: (ws, data) => ws.send(data) })
9
+ *
10
+ * Without it, `app.ws()` throws at registration (fail-closed), so an app that never uses WebSockets
11
+ * never evaluates or bundles the WS dispatcher, pub/sub registry, and Bun socket plumbing (~1.5 KB
12
+ * gzipped on the minimal-app size benchmark). The runtime installs on that server instance only -
13
+ * the same `.use()` install seam as `mcp()` / `streaming()` / `idempotency()`, not a process-global
14
+ * or a side-effect import.
12
15
  *
13
16
  * Serving adapters that wire standard sockets themselves (`@nifrajs/workers`) import
14
17
  * `attachWebSocket` / `TopicRegistry` from here too.
15
18
  */
19
+ import { INSTALL_WS } from "./server/install.js";
16
20
  import { attachWebSocket, TopicRegistry, wrapWebSocketMessageValidation, } from "./server/websocket.js";
17
21
  import { createBunWsHandlers } from "./server/ws-bun.js";
18
- import { setWsRuntime } from "./server/ws-hook.js";
19
- setWsRuntime({
22
+ const WS_RUNTIME = {
20
23
  wrapHandler: wrapWebSocketMessageValidation,
21
24
  createTopics: () => new TopicRegistry(),
22
25
  bunHandlers: createBunWsHandlers,
23
26
  attach: attachWebSocket,
24
- });
27
+ };
28
+ /**
29
+ * Enable WebSocket routes on a server: `.use(websocket())` turns on `app.ws()`. Applying it twice is
30
+ * a no-op (named plugin dedupe).
31
+ */
32
+ export function websocket() {
33
+ const apply = (app) => {
34
+ ;
35
+ app[INSTALL_WS](WS_RUNTIME);
36
+ return app;
37
+ };
38
+ return Object.assign(apply, { pluginName: "nifra:websocket" });
39
+ }
25
40
  export { attachWebSocket, TopicRegistry, wrapWebSocketMessageValidation };
26
41
  //# sourceMappingURL=ws.js.map
package/dist/ws.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,eAAe,EACf,aAAa,EACb,8BAA8B,GAC/B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,YAAY,CAAC;IACX,WAAW,EAAE,8BAA8B;IAC3C,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACvC,WAAW,EAAE,mBAAmB;IAChC,MAAM,EAAE,eAAe;CACxB,CAAC,CAAA;AAUF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,8BAA8B,EAAE,CAAA"}
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGhD,OAAO,EACL,eAAe,EACf,aAAa,EACb,8BAA8B,GAC/B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAGxD,MAAM,UAAU,GAAc;IAC5B,WAAW,EAAE,8BAA8B;IAC3C,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACvC,WAAW,EAAE,mBAAmB;IAChC,MAAM,EAAE,eAAe;CACxB,CAAA;AAOD;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,CAAsB,GAAM,EAAK,EAAE;QAC/C,CAAC;QAAC,GAAgC,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAA;QAC1D,OAAO,GAAG,CAAA;IACZ,CAAC,CAAA;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAmB,CAAA;AAClF,CAAC;AAUD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,8BAA8B,EAAE,CAAA"}