@lumenflow/runtime 3.0.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.
@@ -0,0 +1,112 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { createServer } from 'node:net';
4
+ import { chmod, mkdir, rm } from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { z } from 'zod';
7
+ export const DaemonRequestSchema = z.object({
8
+ id: z.string().min(1),
9
+ method: z.string().min(1),
10
+ params: z.unknown(),
11
+ });
12
+ export class UnixSocketServer {
13
+ socketPath;
14
+ handler;
15
+ server;
16
+ constructor(options) {
17
+ this.socketPath = path.resolve(options.socketPath);
18
+ this.handler = options.handler;
19
+ this.server = null;
20
+ }
21
+ async start() {
22
+ await mkdir(path.dirname(this.socketPath), { recursive: true });
23
+ await rm(this.socketPath, { force: true });
24
+ this.server = createServer((socket) => {
25
+ this.attachConnection(socket);
26
+ });
27
+ await new Promise((resolve, reject) => {
28
+ if (!this.server) {
29
+ reject(new Error('Unix socket server was not created.'));
30
+ return;
31
+ }
32
+ this.server.once('error', reject);
33
+ this.server.listen(this.socketPath, () => {
34
+ this.server?.off('error', reject);
35
+ resolve();
36
+ });
37
+ });
38
+ await chmod(this.socketPath, 0o600);
39
+ }
40
+ async stop() {
41
+ const activeServer = this.server;
42
+ this.server = null;
43
+ if (activeServer) {
44
+ await new Promise((resolve, reject) => {
45
+ activeServer.close((error) => {
46
+ if (error) {
47
+ reject(error);
48
+ return;
49
+ }
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ await rm(this.socketPath, { force: true });
55
+ }
56
+ isRunning() {
57
+ return this.server !== null;
58
+ }
59
+ attachConnection(socket) {
60
+ let buffer = '';
61
+ socket.on('data', (chunk) => {
62
+ buffer += chunk.toString('utf8');
63
+ const lines = buffer.split('\n');
64
+ buffer = lines.pop() ?? '';
65
+ for (const line of lines) {
66
+ const trimmed = line.trim();
67
+ if (!trimmed) {
68
+ continue;
69
+ }
70
+ this.processLine(trimmed, socket).catch(() => {
71
+ socket.write(`${JSON.stringify({
72
+ id: 'unknown',
73
+ ok: false,
74
+ error: 'Failed to process daemon request.',
75
+ })}\n`);
76
+ });
77
+ }
78
+ });
79
+ }
80
+ async processLine(line, socket) {
81
+ let parsedRequestJson;
82
+ try {
83
+ parsedRequestJson = JSON.parse(line);
84
+ }
85
+ catch {
86
+ socket.write(`${JSON.stringify({
87
+ id: 'unknown',
88
+ ok: false,
89
+ error: 'Invalid JSON payload.',
90
+ })}\n`);
91
+ return;
92
+ }
93
+ const parsedRequest = DaemonRequestSchema.safeParse(parsedRequestJson);
94
+ if (!parsedRequest.success) {
95
+ const requestId = parsedRequestJson &&
96
+ typeof parsedRequestJson === 'object' &&
97
+ 'id' in parsedRequestJson &&
98
+ typeof parsedRequestJson.id === 'string'
99
+ ? (parsedRequestJson.id ?? 'unknown')
100
+ : 'unknown';
101
+ socket.write(`${JSON.stringify({
102
+ id: requestId,
103
+ ok: false,
104
+ error: `Invalid daemon request: ${parsedRequest.error.issues[0]?.message ?? parsedRequest.error.message}`,
105
+ })}\n`);
106
+ return;
107
+ }
108
+ const response = await this.handler(parsedRequest.data);
109
+ socket.write(`${JSON.stringify(response)}\n`);
110
+ }
111
+ }
112
+ //# sourceMappingURL=unix-socket-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unix-socket-server.js","sourceRoot":"","sources":["../../src/transport/unix-socket-server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@lumenflow/runtime",
3
+ "version": "3.0.0",
4
+ "description": "Runtime daemon, scheduler, sessions, and IPC transport for LumenFlow",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "LICENSE",
11
+ "README.md"
12
+ ],
13
+ "engines": {
14
+ "node": ">=22"
15
+ },
16
+ "dependencies": {
17
+ "zod": "^4.3.6"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "build:dist": "tsc -p tsconfig.build.json",
22
+ "pack:dist": "pnpm pack",
23
+ "clean": "rm -rf dist *.tgz",
24
+ "test": "vitest run",
25
+ "lint": "eslint src __tests__ --quiet --rule no-console:off --rule @typescript-eslint/no-unused-vars:off",
26
+ "typecheck": "tsc --noEmit"
27
+ }
28
+ }