@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.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/bin/pattern.d.ts +20 -0
- package/dist/bin/pattern.d.ts.map +1 -0
- package/dist/bin/pattern.js +365 -0
- package/dist/bin/pattern.js.map +1 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/filesystem.d.ts +38 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +59 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/http.d.ts +94 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +799 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/load/generator.d.ts +19 -0
- package/dist/load/generator.d.ts.map +1 -0
- package/dist/load/generator.js +94 -0
- package/dist/load/generator.js.map +1 -0
- package/dist/load/index.d.ts +43 -0
- package/dist/load/index.d.ts.map +1 -0
- package/dist/load/index.js +87 -0
- package/dist/load/index.js.map +1 -0
- package/dist/load/recorder.d.ts +36 -0
- package/dist/load/recorder.d.ts.map +1 -0
- package/dist/load/recorder.js +106 -0
- package/dist/load/recorder.js.map +1 -0
- package/dist/load/report.d.ts +28 -0
- package/dist/load/report.d.ts.map +1 -0
- package/dist/load/report.js +84 -0
- package/dist/load/report.js.map +1 -0
- package/dist/load/types.d.ts +85 -0
- package/dist/load/types.d.ts.map +1 -0
- package/dist/load/types.js +51 -0
- package/dist/load/types.js.map +1 -0
- package/dist/mods.d.ts +23 -0
- package/dist/mods.d.ts.map +1 -0
- package/dist/mods.js +48 -0
- package/dist/mods.js.map +1 -0
- package/dist/project.d.ts +94 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +168 -0
- package/dist/project.js.map +1 -0
- package/dist/schedule.d.ts +33 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +132 -0
- package/dist/schedule.js.map +1 -0
- package/dist/trace/index.d.ts +32 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +48 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/memory.d.ts +83 -0
- package/dist/trace/memory.d.ts.map +1 -0
- package/dist/trace/memory.js +260 -0
- package/dist/trace/memory.js.map +1 -0
- package/dist/trace/sqlite.d.ts +80 -0
- package/dist/trace/sqlite.d.ts.map +1 -0
- package/dist/trace/sqlite.js +344 -0
- package/dist/trace/sqlite.js.map +1 -0
- package/dist/worker/entry.d.ts +16 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +135 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker-pool.d.ts +49 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +203 -0
- package/dist/worker-pool.js.map +1 -0
- package/dist/ws-registry.d.ts +39 -0
- package/dist/ws-registry.d.ts.map +1 -0
- package/dist/ws-registry.js +99 -0
- package/dist/ws-registry.js.map +1 -0
- package/dist/ws.d.ts +72 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +236 -0
- package/dist/ws.js.map +1 -0
- 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":"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"}
|
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
|
+
}
|