@pattern-js/runtime-node 0.2.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/bin/pattern.d.ts +20 -0
  4. package/dist/bin/pattern.d.ts.map +1 -0
  5. package/dist/bin/pattern.js +365 -0
  6. package/dist/bin/pattern.js.map +1 -0
  7. package/dist/cli.d.ts +21 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +75 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/filesystem.d.ts +38 -0
  12. package/dist/filesystem.d.ts.map +1 -0
  13. package/dist/filesystem.js +59 -0
  14. package/dist/filesystem.js.map +1 -0
  15. package/dist/http.d.ts +94 -0
  16. package/dist/http.d.ts.map +1 -0
  17. package/dist/http.js +799 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/index.d.ts +21 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +23 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/load/generator.d.ts +19 -0
  24. package/dist/load/generator.d.ts.map +1 -0
  25. package/dist/load/generator.js +94 -0
  26. package/dist/load/generator.js.map +1 -0
  27. package/dist/load/index.d.ts +43 -0
  28. package/dist/load/index.d.ts.map +1 -0
  29. package/dist/load/index.js +87 -0
  30. package/dist/load/index.js.map +1 -0
  31. package/dist/load/recorder.d.ts +36 -0
  32. package/dist/load/recorder.d.ts.map +1 -0
  33. package/dist/load/recorder.js +106 -0
  34. package/dist/load/recorder.js.map +1 -0
  35. package/dist/load/report.d.ts +28 -0
  36. package/dist/load/report.d.ts.map +1 -0
  37. package/dist/load/report.js +84 -0
  38. package/dist/load/report.js.map +1 -0
  39. package/dist/load/types.d.ts +85 -0
  40. package/dist/load/types.d.ts.map +1 -0
  41. package/dist/load/types.js +51 -0
  42. package/dist/load/types.js.map +1 -0
  43. package/dist/mods.d.ts +23 -0
  44. package/dist/mods.d.ts.map +1 -0
  45. package/dist/mods.js +48 -0
  46. package/dist/mods.js.map +1 -0
  47. package/dist/project.d.ts +94 -0
  48. package/dist/project.d.ts.map +1 -0
  49. package/dist/project.js +168 -0
  50. package/dist/project.js.map +1 -0
  51. package/dist/schedule.d.ts +33 -0
  52. package/dist/schedule.d.ts.map +1 -0
  53. package/dist/schedule.js +132 -0
  54. package/dist/schedule.js.map +1 -0
  55. package/dist/trace/index.d.ts +32 -0
  56. package/dist/trace/index.d.ts.map +1 -0
  57. package/dist/trace/index.js +48 -0
  58. package/dist/trace/index.js.map +1 -0
  59. package/dist/trace/memory.d.ts +83 -0
  60. package/dist/trace/memory.d.ts.map +1 -0
  61. package/dist/trace/memory.js +260 -0
  62. package/dist/trace/memory.js.map +1 -0
  63. package/dist/trace/sqlite.d.ts +80 -0
  64. package/dist/trace/sqlite.d.ts.map +1 -0
  65. package/dist/trace/sqlite.js +344 -0
  66. package/dist/trace/sqlite.js.map +1 -0
  67. package/dist/worker/entry.d.ts +16 -0
  68. package/dist/worker/entry.d.ts.map +1 -0
  69. package/dist/worker/entry.js +135 -0
  70. package/dist/worker/entry.js.map +1 -0
  71. package/dist/worker-pool.d.ts +49 -0
  72. package/dist/worker-pool.d.ts.map +1 -0
  73. package/dist/worker-pool.js +203 -0
  74. package/dist/worker-pool.js.map +1 -0
  75. package/dist/ws-registry.d.ts +39 -0
  76. package/dist/ws-registry.d.ts.map +1 -0
  77. package/dist/ws-registry.js +99 -0
  78. package/dist/ws-registry.js.map +1 -0
  79. package/dist/ws.d.ts +72 -0
  80. package/dist/ws.d.ts.map +1 -0
  81. package/dist/ws.js +236 -0
  82. package/dist/ws.js.map +1 -0
  83. package/package.json +60 -0
package/dist/ws.js ADDED
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @pattern-js/runtime-node — WebSocket host (§7, §9).
3
+ *
4
+ * Node has no built-in WS *server*, so this host uses `ws` on the HTTP upgrade
5
+ * (an adapter-level dependency; core stays clean). It fires a run **per inbound
6
+ * message** through `boundary.ws.message`, plus optional `boundary.ws.open` /
7
+ * `boundary.ws.close` lifecycle workflows, and sends `boundary.ws.send` results
8
+ * back on the originating connection.
9
+ *
10
+ * Auth (§9) happens **at upgrade time**: the provider chain resolves a principal
11
+ * from the upgrade request's headers (same cookie the HTTP host sees), every
12
+ * bound trigger's `requireAuth` is enforced *before* the socket is accepted
13
+ * (raw 401 + destroy on failure), and the principal is fixed to the connection
14
+ * for its lifetime — open/message/close runs all execute as it and see it on
15
+ * their `user` port. Authenticated connections auto-join the `user:{id}` and
16
+ * `session:{sessionId}` rooms, so "message all of this user's devices" is a
17
+ * broadcast and session revocation is a `closeRoom`.
18
+ */
19
+ import { WebSocketServer } from "ws";
20
+ import { jsonSchemaToZod, principalToUser, } from "@pattern-js/core";
21
+ import { NodeConnectionRegistry } from "./ws-registry.js";
22
+ const WS_TRIGGER_OPS = ["boundary.ws.open", "boundary.ws.message", "boundary.ws.close"];
23
+ export class WsHost {
24
+ engine;
25
+ opts;
26
+ wss;
27
+ connections;
28
+ constructor(engine, opts, connections) {
29
+ this.engine = engine;
30
+ this.opts = opts;
31
+ // Reuse the engine's connection registry if it is a node one, so `core.ws.*`
32
+ // ops mid-run reach the same sockets as the host.
33
+ this.connections =
34
+ connections ??
35
+ (engine.connections instanceof NodeConnectionRegistry
36
+ ? engine.connections
37
+ : new NodeConnectionRegistry());
38
+ this.wss = new WebSocketServer({ noServer: true });
39
+ }
40
+ /** Attach to an HTTP server's upgrade event. */
41
+ attach(server) {
42
+ server.on("upgrade", (req, socket, head) => {
43
+ if (this.opts.path) {
44
+ const url = new URL(req.url ?? "/", "http://localhost");
45
+ if (url.pathname !== this.opts.path) {
46
+ socket.destroy();
47
+ return;
48
+ }
49
+ }
50
+ // Auth is async; the upgrade listener tolerates a detached promise.
51
+ void (async () => {
52
+ const principal = await this.authenticate(req);
53
+ const denied = this.deniedReason(principal);
54
+ if (denied) {
55
+ // Reject BEFORE the WS handshake: the socket never becomes a connection.
56
+ socket.write("HTTP/1.1 401 Unauthorized\r\n" +
57
+ "Connection: close\r\n" +
58
+ `Content-Length: ${Buffer.byteLength(denied)}\r\n` +
59
+ "Content-Type: text/plain\r\n\r\n" +
60
+ denied);
61
+ socket.destroy();
62
+ return;
63
+ }
64
+ this.wss.handleUpgrade(req, socket, head, (ws) => this.onConnection(ws, principal));
65
+ })().catch(() => socket.destroy());
66
+ });
67
+ return this;
68
+ }
69
+ /** Resolve a principal from the upgrade request via the provider chain (§9). */
70
+ async authenticate(req) {
71
+ const headers = new Headers();
72
+ for (const [k, v] of Object.entries(req.headers)) {
73
+ if (typeof v === "string")
74
+ headers.set(k, v);
75
+ else if (Array.isArray(v))
76
+ headers.set(k, v.join(", "));
77
+ }
78
+ return this.engine.authenticate({ headers, raw: req });
79
+ }
80
+ /**
81
+ * Enforce every bound trigger's `requireAuth` (§9). One socket serves all
82
+ * three lifecycle triggers, so the connection must satisfy the union of
83
+ * their requirements — a protected message handler protects the upgrade.
84
+ */
85
+ deniedReason(principal) {
86
+ for (const op of WS_TRIGGER_OPS) {
87
+ for (const r of this.resolved(op)) {
88
+ const cfg = r.workflow.nodes.find((n) => n.id === r.trigger)?.config;
89
+ if (!cfg?.requireAuth)
90
+ continue;
91
+ const auth = this.engine.authorize(principal, cfg.requireAuth);
92
+ if (!auth.ok)
93
+ return `Unauthorized: ${auth.reason}`;
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ /** Explicit binding (when configured) or auto mode is on for this host. */
99
+ get auto() {
100
+ return !this.opts.onMessage && !this.opts.onOpen && !this.opts.onClose;
101
+ }
102
+ /**
103
+ * Bindings to enforce/fire for a trigger op. Explicit options win; auto mode
104
+ * resolves LIVE from the workflow registry (workflows deployed from the
105
+ * admin bind without a restart, mirroring HttpHost's declarative routing).
106
+ * Auth enforces ALL matching workflows' requirements; firing uses the first
107
+ * (one socket, no path dispatch — multi-handler WS is an explicit-options
108
+ * setup).
109
+ */
110
+ resolved(opType) {
111
+ const explicit = opType === "boundary.ws.open"
112
+ ? this.opts.onOpen
113
+ : opType === "boundary.ws.message"
114
+ ? this.opts.onMessage
115
+ : this.opts.onClose;
116
+ if (explicit) {
117
+ const r = this.resolve(explicit, opType);
118
+ return r ? [r] : [];
119
+ }
120
+ if (!this.auto)
121
+ return [];
122
+ const out = [];
123
+ for (const workflow of this.engine.workflows.list()) {
124
+ const node = workflow.nodes.find((n) => n.op === opType);
125
+ if (node)
126
+ out.push({ workflow, trigger: node.id });
127
+ }
128
+ return out;
129
+ }
130
+ bindingFor(opType) {
131
+ const r = this.resolved(opType)[0];
132
+ return r ? { workflow: r.workflow, trigger: r.trigger } : undefined;
133
+ }
134
+ onConnection(ws, principal) {
135
+ const ref = this.connections.add(ws, undefined, principal);
136
+ // Identity rooms (§9): broadcast to all of a user's devices via `user:{id}`;
137
+ // revoking a session closes its sockets via `session:{sessionId}`.
138
+ if (principal.kind === "user") {
139
+ void this.connections.join(ref, `user:${principal.id}`);
140
+ const sid = principal.claims?.sessionId;
141
+ if (typeof sid === "string")
142
+ void this.connections.join(ref, `session:${sid}`);
143
+ }
144
+ const user = principalToUser(principal);
145
+ // Fire-and-forget MUST swallow into a log — an unhandled rejection here
146
+ // would take the whole process down under plain `node`.
147
+ const logFail = (err) => console.error("[pattern] ws workflow failed:", err);
148
+ const onOpen = this.bindingFor("boundary.ws.open");
149
+ if (onOpen) {
150
+ void this.fire(onOpen, "boundary.ws.open", { connection: ref, user }, principal).catch(logFail);
151
+ }
152
+ ws.on("message", (data, isBinary) => {
153
+ const message = isBinary ? new Uint8Array(data) : tryJson(data.toString());
154
+ const onMessage = this.bindingFor("boundary.ws.message");
155
+ if (onMessage) {
156
+ void this.fireAndSend(onMessage, ref, { message, connection: ref, user }, principal).catch(logFail);
157
+ }
158
+ });
159
+ ws.on("close", (code, reason) => {
160
+ const onClose = this.bindingFor("boundary.ws.close");
161
+ if (onClose) {
162
+ void this.fire(onClose, "boundary.ws.close", { connection: ref, user, code, reason: reason.toString() }, principal).catch(logFail);
163
+ }
164
+ this.connections.remove(ref.id);
165
+ });
166
+ }
167
+ resolve(binding, defaultOp) {
168
+ const workflow = typeof binding.workflow === "string" ? this.engine.workflows.get(binding.workflow) : binding.workflow;
169
+ if (!workflow)
170
+ return undefined;
171
+ const trigger = binding.trigger ?? workflow.nodes.find((n) => n.op === defaultOp)?.id;
172
+ if (!trigger)
173
+ return undefined;
174
+ return { workflow, trigger };
175
+ }
176
+ async fire(binding, defaultOp, input, principal) {
177
+ const r = this.resolve(binding, defaultOp);
178
+ if (!r)
179
+ return undefined;
180
+ return this.engine.runFrom(r.workflow, r.trigger, input, principal);
181
+ }
182
+ async fireAndSend(binding, ref, input, principal) {
183
+ const r = this.resolve(binding, "boundary.ws.message");
184
+ if (!r)
185
+ return;
186
+ // Declarative message validation (§7): the trigger's `message` schema
187
+ // (often wired in from a `core.schema.define` node) gates the run — an
188
+ // invalid message gets an error reply instead of executing the graph.
189
+ const trigger = r.workflow.nodes.find((n) => n.id === r.trigger);
190
+ const schema = trigger?.config?.message;
191
+ if (schema) {
192
+ const parsed = jsonSchemaToZod(schema).safeParse(input.message);
193
+ if (!parsed.success) {
194
+ await this.connections.send(ref, {
195
+ error: "invalid message",
196
+ issues: parsed.error.issues.map((i) => ({ path: i.path.join("."), message: i.message })),
197
+ });
198
+ return;
199
+ }
200
+ input = { ...input, message: parsed.data };
201
+ }
202
+ const result = await this.engine.runFrom(r.workflow, r.trigger, input, principal);
203
+ if (result.status !== "ok")
204
+ return;
205
+ const payload = firstOutgate(result, r.workflow, "boundary.ws.send");
206
+ if (!payload)
207
+ return;
208
+ if (payload.stream instanceof ReadableStream) {
209
+ await this.connections.sendStream(ref, payload.stream);
210
+ }
211
+ else if (payload.message !== undefined) {
212
+ await this.connections.send(ref, payload.message);
213
+ }
214
+ }
215
+ }
216
+ function tryJson(s) {
217
+ try {
218
+ return JSON.parse(s);
219
+ }
220
+ catch {
221
+ return s;
222
+ }
223
+ }
224
+ function firstOutgate(result, workflow, opType) {
225
+ for (const [nodeId, payload] of Object.entries(result.outputs)) {
226
+ const node = workflow.nodes.find((n) => n.id === nodeId);
227
+ if (node?.op === opType)
228
+ return payload;
229
+ }
230
+ return undefined;
231
+ }
232
+ /** Create a WS host (attach it to an HTTP server with `.attach(server)`). */
233
+ export function createWsHost(engine, opts, connections) {
234
+ return new WsHost(engine, opts, connections);
235
+ }
236
+ //# sourceMappingURL=ws.js.map
package/dist/ws.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,eAAe,EAAkB,MAAM,IAAI,CAAC;AACrD,OAAO,EACL,eAAe,EACf,eAAe,GAMhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAkB1D,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,CAAU,CAAC;AAEjG,MAAM,OAAO,MAAM;IAKE;IACA;IALV,GAAG,CAAkB;IACrB,WAAW,CAAyB;IAE7C,YACmB,MAAc,EACd,IAAmB,EACpC,WAAoC;QAFnB,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAe;QAGpC,6EAA6E;QAC7E,kDAAkD;QAClD,IAAI,CAAC,WAAW;YACd,WAAW;gBACX,CAAC,MAAM,CAAC,WAAW,YAAY,sBAAsB;oBACnD,CAAC,CAAE,MAAM,CAAC,WAAsC;oBAChD,CAAC,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,gDAAgD;IAChD,MAAM,CAAC,MAAc;QACnB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACzC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;gBACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACpC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;YACH,CAAC;YACD,oEAAoE;YACpE,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,MAAM,EAAE,CAAC;oBACX,yEAAyE;oBACzE,MAAM,CAAC,KAAK,CACV,+BAA+B;wBAC7B,uBAAuB;wBACvB,mBAAmB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM;wBAClD,kCAAkC;wBAClC,MAAM,CACT,CAAC;oBACF,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;YACtF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IACxE,KAAK,CAAC,YAAY,CAAC,GAAoB;QAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACxC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,SAAoB;QACvC,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,MAEjD,CAAC;gBACd,IAAI,CAAC,GAAG,EAAE,WAAW;oBAAE,SAAS;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC/D,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,OAAO,iBAAiB,IAAI,CAAC,MAAM,EAAE,CAAC;YACtD,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2EAA2E;IAC3E,IAAY,IAAI;QACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACzE,CAAC;IAED;;;;;;;OAOG;IACK,QAAQ,CAAC,MAAc;QAC7B,MAAM,QAAQ,GACZ,MAAM,KAAK,kBAAkB;YAC3B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YAClB,CAAC,CAAC,MAAM,KAAK,qBAAqB;gBAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;gBACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAmD,EAAE,CAAC;QAC/D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;YACzD,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,UAAU,CAAC,MAAc;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IAEO,YAAY,CAAC,EAAa,EAAE,SAAoB;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAE3D,6EAA6E;QAC7E,mEAAmE;QACnE,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC;YACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,wEAAwE;QACxE,wDAAwD;QACxD,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClG,CAAC;QAED,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACrD,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,IAAI,CAAC,IAAI,CACZ,OAAO,EACP,mBAAmB,EACnB,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,EAC1D,SAAS,CACV,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO,CAAC,OAAkB,EAAE,SAAiB;QACnD,MAAM,QAAQ,GACZ,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxG,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC;QACtF,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,IAAI,CAChB,OAAkB,EAClB,SAAiB,EACjB,KAA8B,EAC9B,SAAoB;QAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAAkB,EAClB,GAAmB,EACnB,KAA8B,EAC9B,SAAoB;QAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC;YAAE,OAAO;QAEf,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAI,OAAO,EAAE,MAA4D,EAAE,OAAO,CAAC;QAC/F,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,eAAe,CAAC,MAAe,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC/B,KAAK,EAAE,iBAAiB;oBACxB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;iBACzF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAClF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACnC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,OAAO,CAAC,MAAM,YAAY,cAAc,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,MAAiB,EACjB,QAAkB,EAClB,MAAc;IAEd,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACzD,IAAI,IAAI,EAAE,EAAE,KAAK,MAAM;YAAE,OAAO,OAAc,CAAC;IACjD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAmB,EAAE,WAAoC;IACpG,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@pattern-js/runtime-node",
3
+ "version": "0.2.0",
4
+ "description": "Pattern runtime adapter for Node — HTTP/WS host, worker-thread pool, connection registry, sqlite trace sink.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "pattern",
9
+ "workflow",
10
+ "node",
11
+ "runtime",
12
+ "http",
13
+ "websocket"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./worker": {
21
+ "types": "./dist/worker/entry.d.ts",
22
+ "import": "./dist/worker/entry.js"
23
+ }
24
+ },
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "bin": {
28
+ "pattern": "./dist/bin/pattern.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "dependencies": {
35
+ "@flystorage/file-storage": "^1.2.2",
36
+ "@flystorage/local-fs": "^1.2.0",
37
+ "@flystorage/in-memory": "^1.1.0",
38
+ "zod": "^4.0.0",
39
+ "ws": "^8.18.0",
40
+ "@pattern-js/core": "0.2.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/ws": "^8.5.12",
44
+ "@types/node": "^22.0.0",
45
+ "typescript": "^5.6.0"
46
+ },
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/makkr-studio/pattern.git",
50
+ "directory": "packages/runtime-node"
51
+ },
52
+ "homepage": "https://github.com/makkr-studio/pattern#readme",
53
+ "bugs": "https://github.com/makkr-studio/pattern/issues",
54
+ "author": "Makkr Studio (https://github.com/makkr-studio)",
55
+ "scripts": {
56
+ "build": "tsc -p tsconfig.json",
57
+ "typecheck": "tsc -p tsconfig.json --noEmit",
58
+ "dev": "tsc -p tsconfig.json --watch"
59
+ }
60
+ }