@walkeros/cli 0.5.1-next.0 → 0.6.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/CHANGELOG.md +35 -0
- package/README.md +51 -28
- package/dist/__tests__/bundle/bundler-helpers.test.d.ts +2 -0
- package/dist/__tests__/bundle/bundler-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/bundler-helpers.test.js +151 -0
- package/dist/__tests__/bundle/bundler-helpers.test.js.map +1 -0
- package/dist/__tests__/bundle/bundler.test.d.ts +2 -0
- package/dist/__tests__/bundle/bundler.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/bundler.test.js +352 -0
- package/dist/__tests__/bundle/bundler.test.js.map +1 -0
- package/dist/__tests__/bundle/programmatic.test.d.ts +2 -0
- package/dist/__tests__/bundle/programmatic.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/programmatic.test.js +148 -0
- package/dist/__tests__/bundle/programmatic.test.js.map +1 -0
- package/dist/__tests__/cli-e2e.test.d.ts +8 -0
- package/dist/__tests__/cli-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/cli-e2e.test.js +145 -0
- package/dist/__tests__/cli-e2e.test.js.map +1 -0
- package/dist/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +179 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/__tests__/config-loader.test.d.ts +7 -0
- package/dist/__tests__/config-loader.test.d.ts.map +1 -0
- package/dist/__tests__/config-loader.test.js +414 -0
- package/dist/__tests__/config-loader.test.js.map +1 -0
- package/dist/__tests__/core/asset-resolver.test.d.ts +2 -0
- package/dist/__tests__/core/asset-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/core/asset-resolver.test.js +14 -0
- package/dist/__tests__/core/asset-resolver.test.js.map +1 -0
- package/dist/__tests__/core/build-cache.test.d.ts +2 -0
- package/dist/__tests__/core/build-cache.test.d.ts.map +1 -0
- package/dist/__tests__/core/build-cache.test.js +55 -0
- package/dist/__tests__/core/build-cache.test.js.map +1 -0
- package/dist/__tests__/core/cache-utils.test.d.ts +2 -0
- package/dist/__tests__/core/cache-utils.test.d.ts.map +1 -0
- package/dist/__tests__/core/cache-utils.test.js +70 -0
- package/dist/__tests__/core/cache-utils.test.js.map +1 -0
- package/dist/__tests__/core/config.test.d.ts +2 -0
- package/dist/__tests__/core/config.test.d.ts.map +1 -0
- package/dist/__tests__/core/config.test.js +79 -0
- package/dist/__tests__/core/config.test.js.map +1 -0
- package/dist/__tests__/core/logger.test.d.ts +2 -0
- package/dist/__tests__/core/logger.test.d.ts.map +1 -0
- package/dist/__tests__/core/logger.test.js +53 -0
- package/dist/__tests__/core/logger.test.js.map +1 -0
- package/dist/__tests__/integration/bundle-run.integration.test.d.ts +8 -0
- package/dist/__tests__/integration/bundle-run.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bundle-run.integration.test.js +54 -0
- package/dist/__tests__/integration/bundle-run.integration.test.js.map +1 -0
- package/dist/__tests__/push/push.test.d.ts +7 -0
- package/dist/__tests__/push/push.test.d.ts.map +1 -0
- package/dist/__tests__/push/push.test.js +197 -0
- package/dist/__tests__/push/push.test.js.map +1 -0
- package/dist/__tests__/simulate/env-loader.test.d.ts +2 -0
- package/dist/__tests__/simulate/env-loader.test.d.ts.map +1 -0
- package/dist/__tests__/simulate/env-loader.test.js +47 -0
- package/dist/__tests__/simulate/env-loader.test.js.map +1 -0
- package/dist/__tests__/simulate/node-executor.test.d.ts +5 -0
- package/dist/__tests__/simulate/node-executor.test.d.ts.map +1 -0
- package/dist/__tests__/simulate/node-executor.test.js +25 -0
- package/dist/__tests__/simulate/node-executor.test.js.map +1 -0
- package/dist/__tests__/simulate/server-simulate.integration.test.d.ts +5 -0
- package/dist/__tests__/simulate/server-simulate.integration.test.d.ts.map +1 -0
- package/dist/__tests__/simulate/server-simulate.integration.test.js +58 -0
- package/dist/__tests__/simulate/server-simulate.integration.test.js.map +1 -0
- package/dist/__tests__/smoke/production.smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke/production.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke/production.smoke.test.js +65 -0
- package/dist/__tests__/smoke/production.smoke.test.js.map +1 -0
- package/dist/commands/bundle/bundler.d.ts +32 -0
- package/dist/commands/bundle/bundler.d.ts.map +1 -0
- package/dist/commands/bundle/bundler.js +569 -0
- package/dist/commands/bundle/bundler.js.map +1 -0
- package/dist/commands/bundle/index.d.ts +59 -0
- package/dist/commands/bundle/index.d.ts.map +1 -0
- package/dist/commands/bundle/index.js +184 -0
- package/dist/commands/bundle/index.js.map +1 -0
- package/dist/commands/bundle/package-manager.d.ts +8 -0
- package/dist/commands/bundle/package-manager.d.ts.map +1 -0
- package/dist/commands/bundle/package-manager.js +220 -0
- package/dist/commands/bundle/package-manager.js.map +1 -0
- package/dist/commands/bundle/stats.d.ts +23 -0
- package/dist/commands/bundle/stats.d.ts.map +1 -0
- package/dist/commands/bundle/stats.js +52 -0
- package/dist/commands/bundle/stats.js.map +1 -0
- package/dist/commands/cache.d.ts +7 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +68 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/push/index.d.ts +7 -0
- package/dist/commands/push/index.d.ts.map +1 -0
- package/dist/commands/push/index.js +247 -0
- package/dist/commands/push/index.js.map +1 -0
- package/dist/commands/push/types.d.ts +22 -0
- package/dist/commands/push/types.d.ts.map +1 -0
- package/dist/commands/push/types.js +2 -0
- package/dist/commands/push/types.js.map +1 -0
- package/dist/commands/run/__tests__/run.integration.test.d.ts +7 -0
- package/dist/commands/run/__tests__/run.integration.test.d.ts.map +1 -0
- package/dist/commands/run/__tests__/run.integration.test.js +51 -0
- package/dist/commands/run/__tests__/run.integration.test.js.map +1 -0
- package/dist/commands/run/__tests__/validators.test.d.ts +2 -0
- package/dist/commands/run/__tests__/validators.test.d.ts.map +1 -0
- package/dist/commands/run/__tests__/validators.test.js +80 -0
- package/dist/commands/run/__tests__/validators.test.js.map +1 -0
- package/dist/commands/run/execution.d.ts +14 -0
- package/dist/commands/run/execution.d.ts.map +1 -0
- package/dist/commands/run/execution.js +41 -0
- package/dist/commands/run/execution.js.map +1 -0
- package/dist/commands/run/index.d.ts +38 -0
- package/dist/commands/run/index.d.ts.map +1 -0
- package/dist/commands/run/index.js +154 -0
- package/dist/commands/run/index.js.map +1 -0
- package/dist/commands/run/types.d.ts +65 -0
- package/dist/commands/run/types.d.ts.map +1 -0
- package/dist/commands/run/types.js +7 -0
- package/dist/commands/run/types.js.map +1 -0
- package/dist/commands/run/utils.d.ts +29 -0
- package/dist/commands/run/utils.d.ts.map +1 -0
- package/dist/commands/run/utils.js +52 -0
- package/dist/commands/run/utils.js.map +1 -0
- package/dist/commands/run/validators.d.ts +33 -0
- package/dist/commands/run/validators.d.ts.map +1 -0
- package/dist/commands/run/validators.js +58 -0
- package/dist/commands/run/validators.js.map +1 -0
- package/dist/commands/simulate/env-loader.d.ts +19 -0
- package/dist/commands/simulate/env-loader.d.ts.map +1 -0
- package/dist/commands/simulate/env-loader.js +44 -0
- package/dist/commands/simulate/env-loader.js.map +1 -0
- package/dist/commands/simulate/index.d.ts +48 -0
- package/dist/commands/simulate/index.d.ts.map +1 -0
- package/dist/commands/simulate/index.js +113 -0
- package/dist/commands/simulate/index.js.map +1 -0
- package/dist/commands/simulate/jsdom-executor.d.ts +37 -0
- package/dist/commands/simulate/jsdom-executor.d.ts.map +1 -0
- package/dist/commands/simulate/jsdom-executor.js +137 -0
- package/dist/commands/simulate/jsdom-executor.js.map +1 -0
- package/dist/commands/simulate/node-executor.d.ts +28 -0
- package/dist/commands/simulate/node-executor.d.ts.map +1 -0
- package/dist/commands/simulate/node-executor.js +94 -0
- package/dist/commands/simulate/node-executor.js.map +1 -0
- package/dist/commands/simulate/simulator.d.ts +14 -0
- package/dist/commands/simulate/simulator.d.ts.map +1 -0
- package/dist/commands/simulate/simulator.js +163 -0
- package/dist/commands/simulate/simulator.js.map +1 -0
- package/dist/commands/simulate/tracker.d.ts +30 -0
- package/dist/commands/simulate/tracker.d.ts.map +1 -0
- package/dist/commands/simulate/tracker.js +96 -0
- package/dist/commands/simulate/tracker.js.map +1 -0
- package/dist/commands/simulate/types.d.ts +20 -0
- package/dist/commands/simulate/types.d.ts.map +1 -0
- package/dist/commands/simulate/types.js +2 -0
- package/dist/commands/simulate/types.js.map +1 -0
- package/dist/config/build-defaults.d.ts +49 -0
- package/dist/config/build-defaults.d.ts.map +1 -0
- package/dist/config/build-defaults.js +68 -0
- package/dist/config/build-defaults.js.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +15 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +153 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/utils.d.ts +101 -0
- package/dist/config/utils.d.ts.map +1 -0
- package/dist/config/utils.js +235 -0
- package/dist/config/utils.js.map +1 -0
- package/dist/config/validators.d.ts +52 -0
- package/dist/config/validators.d.ts.map +1 -0
- package/dist/config/validators.js +85 -0
- package/dist/config/validators.js.map +1 -0
- package/dist/core/asset-resolver.d.ts +34 -0
- package/dist/core/asset-resolver.d.ts.map +1 -0
- package/dist/core/asset-resolver.js +70 -0
- package/dist/core/asset-resolver.js.map +1 -0
- package/dist/core/build-cache.d.ts +23 -0
- package/dist/core/build-cache.d.ts.map +1 -0
- package/dist/core/build-cache.js +44 -0
- package/dist/core/build-cache.js.map +1 -0
- package/dist/core/cache-utils.d.ts +27 -0
- package/dist/core/cache-utils.d.ts.map +1 -0
- package/dist/core/cache-utils.js +60 -0
- package/dist/core/cache-utils.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/local-packages.d.ts +19 -0
- package/dist/core/local-packages.d.ts.map +1 -0
- package/dist/core/local-packages.js +60 -0
- package/dist/core/local-packages.js.map +1 -0
- package/dist/core/logger.d.ts +30 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +85 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/output.d.ts +30 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +46 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/timer.d.ts +14 -0
- package/dist/core/timer.d.ts.map +1 -0
- package/dist/core/timer.js +29 -0
- package/dist/core/timer.js.map +1 -0
- package/dist/core/tmp.d.ts +27 -0
- package/dist/core/tmp.d.ts.map +1 -0
- package/dist/core/tmp.js +36 -0
- package/dist/core/tmp.js.map +1 -0
- package/dist/core/utils.d.ts +10 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +12 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/index.d.ts +20 -13
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +633 -761
- package/dist/index.js.map +1 -1
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/main.d.ts +2 -0
- package/dist/runtime/main.d.ts.map +1 -0
- package/dist/runtime/main.js +268 -0
- package/dist/runtime/main.js.map +1 -0
- package/dist/runtime/runner.d.ts +20 -0
- package/dist/runtime/runner.d.ts.map +1 -0
- package/dist/runtime/runner.js +72 -0
- package/dist/runtime/runner.js.map +1 -0
- package/dist/runtime/serve.d.ts +19 -0
- package/dist/runtime/serve.d.ts.map +1 -0
- package/dist/runtime/serve.js +97 -0
- package/dist/runtime/serve.js.map +1 -0
- package/dist/schemas/index.d.ts +9 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +9 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/primitives.d.ts +37 -0
- package/dist/schemas/primitives.d.ts.map +1 -0
- package/dist/schemas/primitives.js +43 -0
- package/dist/schemas/primitives.js.map +1 -0
- package/dist/schemas/run.d.ts +23 -0
- package/dist/schemas/run.d.ts.map +1 -0
- package/dist/schemas/run.js +20 -0
- package/dist/schemas/run.js.map +1 -0
- package/dist/types/bundle.d.ts +141 -0
- package/dist/types/bundle.d.ts.map +1 -0
- package/dist/types/bundle.js +10 -0
- package/dist/types/bundle.js.map +1 -0
- package/dist/types/global.d.ts +38 -0
- package/dist/types/global.d.ts.map +1 -0
- package/dist/types/global.js +24 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +27 -0
- package/dist/version.js.map +1 -0
- package/dist/walker.js +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime module - Execute pre-built walkerOS flows and serve bundles
|
|
3
|
+
*
|
|
4
|
+
* This module provides runtime execution capabilities for:
|
|
5
|
+
* - Running pre-built flow bundles (collect mode)
|
|
6
|
+
* - Serving static bundle files (serve mode)
|
|
7
|
+
*/
|
|
8
|
+
export { runFlow, type RuntimeConfig } from './runner';
|
|
9
|
+
export { runServeMode, type ServeConfig } from './serve';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime module - Execute pre-built walkerOS flows and serve bundles
|
|
3
|
+
*
|
|
4
|
+
* This module provides runtime execution capabilities for:
|
|
5
|
+
* - Running pre-built flow bundles (collect mode)
|
|
6
|
+
* - Serving static bundle files (serve mode)
|
|
7
|
+
*/
|
|
8
|
+
export { runFlow } from './runner';
|
|
9
|
+
export { runServeMode } from './serve';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAsB,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/runtime/main.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/runtime/runner.ts
|
|
4
|
+
import { pathToFileURL } from "url";
|
|
5
|
+
import { resolve, dirname } from "path";
|
|
6
|
+
async function runFlow(file, config, logger) {
|
|
7
|
+
logger.info(`Loading flow from ${file}`);
|
|
8
|
+
try {
|
|
9
|
+
const absolutePath = resolve(file);
|
|
10
|
+
const flowDir = dirname(absolutePath);
|
|
11
|
+
process.chdir(flowDir);
|
|
12
|
+
const fileUrl = pathToFileURL(absolutePath).href;
|
|
13
|
+
const module = await import(fileUrl);
|
|
14
|
+
if (!module.default || typeof module.default !== "function") {
|
|
15
|
+
logger.throw(
|
|
16
|
+
`Invalid flow bundle: ${file} must export a default function`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
const result = await module.default(config);
|
|
20
|
+
if (!result || !result.collector) {
|
|
21
|
+
logger.throw(`Invalid flow bundle: ${file} must return { collector }`);
|
|
22
|
+
}
|
|
23
|
+
const { collector } = result;
|
|
24
|
+
logger.info("Flow running");
|
|
25
|
+
if (config?.port) {
|
|
26
|
+
logger.info(`Port: ${config.port}`);
|
|
27
|
+
}
|
|
28
|
+
const shutdown = async (signal) => {
|
|
29
|
+
logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
30
|
+
try {
|
|
31
|
+
if (collector.command) {
|
|
32
|
+
await collector.command("shutdown");
|
|
33
|
+
}
|
|
34
|
+
logger.info("Shutdown complete");
|
|
35
|
+
process.exit(0);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
logger.error(`Error during shutdown: ${message}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
43
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
44
|
+
await new Promise(() => {
|
|
45
|
+
});
|
|
46
|
+
} catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
logger.error(`Failed to run flow: ${message}`);
|
|
49
|
+
if (error instanceof Error && error.stack) {
|
|
50
|
+
logger.debug("Stack trace:", { stack: error.stack });
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/runtime/serve.ts
|
|
57
|
+
import express from "express";
|
|
58
|
+
import { resolve as resolve2 } from "path";
|
|
59
|
+
|
|
60
|
+
// src/version.ts
|
|
61
|
+
import { readFileSync } from "fs";
|
|
62
|
+
import { fileURLToPath } from "url";
|
|
63
|
+
import { dirname as dirname2, join } from "path";
|
|
64
|
+
var versionFilename = fileURLToPath(import.meta.url);
|
|
65
|
+
var versionDirname = dirname2(versionFilename);
|
|
66
|
+
function findPackageJson() {
|
|
67
|
+
const paths = [
|
|
68
|
+
join(versionDirname, "../package.json"),
|
|
69
|
+
// dist/ or src/
|
|
70
|
+
join(versionDirname, "../../package.json")
|
|
71
|
+
// src/core/ (not used, but safe)
|
|
72
|
+
];
|
|
73
|
+
for (const p of paths) {
|
|
74
|
+
try {
|
|
75
|
+
return readFileSync(p, "utf-8");
|
|
76
|
+
} catch {
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return JSON.stringify({ version: "0.0.0" });
|
|
80
|
+
}
|
|
81
|
+
var VERSION = JSON.parse(findPackageJson()).version;
|
|
82
|
+
|
|
83
|
+
// src/runtime/serve.ts
|
|
84
|
+
async function runServeMode(config, logger) {
|
|
85
|
+
const port = process.env.PORT ? parseInt(process.env.PORT, 10) : config?.port || 8080;
|
|
86
|
+
const host = process.env.HOST || config?.host || "0.0.0.0";
|
|
87
|
+
const file = resolve2(process.env.FILE || config?.file || "./dist/walker.js");
|
|
88
|
+
const serveName = process.env.SERVE_NAME || config?.serveName || "walker.js";
|
|
89
|
+
const servePath = process.env.SERVE_PATH || config?.servePath || "";
|
|
90
|
+
const urlPath = servePath ? `/${servePath}/${serveName}` : `/${serveName}`;
|
|
91
|
+
logger.info("Starting single-file server...");
|
|
92
|
+
logger.info(`File: ${file}`);
|
|
93
|
+
logger.info(`URL: http://${host}:${port}${urlPath}`);
|
|
94
|
+
try {
|
|
95
|
+
const app = express();
|
|
96
|
+
app.get("/health", (req, res) => {
|
|
97
|
+
res.json({
|
|
98
|
+
status: "ok",
|
|
99
|
+
version: VERSION,
|
|
100
|
+
timestamp: Date.now(),
|
|
101
|
+
mode: "serve",
|
|
102
|
+
file,
|
|
103
|
+
url: urlPath
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
app.get(urlPath, (req, res) => {
|
|
107
|
+
res.type("application/javascript");
|
|
108
|
+
res.sendFile(file, { dotfiles: "allow" }, (err) => {
|
|
109
|
+
if (err && !res.headersSent) {
|
|
110
|
+
const errCode = err.code;
|
|
111
|
+
const errStatus = err.status || err.statusCode;
|
|
112
|
+
if (errCode !== "ECONNABORTED") {
|
|
113
|
+
logger.error(
|
|
114
|
+
`sendFile error for ${file}: ${err.message} (code: ${errCode}, status: ${errStatus})`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
if (errStatus === 404 || errCode === "ENOENT" || errCode === "EISDIR" || errCode === "ENOTDIR") {
|
|
118
|
+
res.status(404).send("File not found");
|
|
119
|
+
} else if (errCode !== "ECONNABORTED") {
|
|
120
|
+
res.status(500).send("Internal server error");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
const server = app.listen(port, host, () => {
|
|
126
|
+
logger.info(`Server listening on http://${host}:${port}`);
|
|
127
|
+
logger.info(`GET ${urlPath} - Bundle file`);
|
|
128
|
+
logger.info(`GET /health - Health check`);
|
|
129
|
+
});
|
|
130
|
+
const shutdownHandler = (signal) => {
|
|
131
|
+
logger.info(`Received ${signal}, shutting down...`);
|
|
132
|
+
server.close(() => {
|
|
133
|
+
logger.info("Server closed");
|
|
134
|
+
process.exit(0);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
process.on("SIGTERM", () => shutdownHandler("SIGTERM"));
|
|
138
|
+
process.on("SIGINT", () => shutdownHandler("SIGINT"));
|
|
139
|
+
await new Promise(() => {
|
|
140
|
+
});
|
|
141
|
+
} catch (error) {
|
|
142
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
143
|
+
logger.error(`Server failed: ${message}`);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/core/logger.ts
|
|
149
|
+
import chalk from "chalk";
|
|
150
|
+
var BRAND_COLOR = "#01b5e2";
|
|
151
|
+
function createLogger(options = {}) {
|
|
152
|
+
const { verbose = false, silent = false, json = false } = options;
|
|
153
|
+
const shouldLog = !silent && !json;
|
|
154
|
+
const shouldDebug = verbose && !silent && !json;
|
|
155
|
+
return {
|
|
156
|
+
log: (...args) => {
|
|
157
|
+
if (shouldLog) {
|
|
158
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
159
|
+
console.log(message);
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
brand: (...args) => {
|
|
163
|
+
if (shouldLog) {
|
|
164
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
165
|
+
console.log(chalk.hex(BRAND_COLOR)(message));
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
error: (...args) => {
|
|
169
|
+
if (!json) {
|
|
170
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
171
|
+
console.error(chalk.red(message));
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
debug: (...args) => {
|
|
175
|
+
if (shouldDebug) {
|
|
176
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
177
|
+
console.log(` ${message}`);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
json: (data) => {
|
|
181
|
+
if (!silent) {
|
|
182
|
+
console.log(JSON.stringify(data, null, 2));
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
// Backward-compatible methods (all use default terminal color per design)
|
|
186
|
+
info: (...args) => {
|
|
187
|
+
if (shouldLog) {
|
|
188
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
189
|
+
console.log(message);
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
success: (...args) => {
|
|
193
|
+
if (shouldLog) {
|
|
194
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
195
|
+
console.log(message);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
warning: (...args) => {
|
|
199
|
+
if (shouldLog) {
|
|
200
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
201
|
+
console.log(message);
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
warn: (...args) => {
|
|
205
|
+
if (shouldLog) {
|
|
206
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
207
|
+
console.log(message);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
gray: (...args) => {
|
|
211
|
+
if (shouldLog) {
|
|
212
|
+
const message = args.map((arg) => String(arg)).join(" ");
|
|
213
|
+
console.log(message);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// src/runtime/main.ts
|
|
220
|
+
function adaptLogger(cliLogger) {
|
|
221
|
+
return {
|
|
222
|
+
error: (message) => {
|
|
223
|
+
const msg = message instanceof Error ? message.message : message;
|
|
224
|
+
cliLogger.error(msg);
|
|
225
|
+
},
|
|
226
|
+
info: (message) => {
|
|
227
|
+
const msg = message instanceof Error ? message.message : message;
|
|
228
|
+
cliLogger.info(msg);
|
|
229
|
+
},
|
|
230
|
+
debug: (message) => {
|
|
231
|
+
const msg = message instanceof Error ? message.message : message;
|
|
232
|
+
cliLogger.debug(msg);
|
|
233
|
+
},
|
|
234
|
+
throw: (message) => {
|
|
235
|
+
const msg = message instanceof Error ? message.message : message;
|
|
236
|
+
cliLogger.error(msg);
|
|
237
|
+
throw message instanceof Error ? message : new Error(msg);
|
|
238
|
+
},
|
|
239
|
+
scope: (name) => {
|
|
240
|
+
return adaptLogger(cliLogger);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
async function main() {
|
|
245
|
+
const mode = process.env.MODE || "collect";
|
|
246
|
+
const file = process.env.FILE || "/flow/bundle.mjs";
|
|
247
|
+
const port = parseInt(process.env.PORT || "8080", 10);
|
|
248
|
+
const cliLogger = createLogger({ silent: false, verbose: true });
|
|
249
|
+
const logger = adaptLogger(cliLogger);
|
|
250
|
+
cliLogger.log(`Starting walkeros/flow in ${mode} mode`);
|
|
251
|
+
cliLogger.log(`File: ${file}`);
|
|
252
|
+
cliLogger.log(`Port: ${port}`);
|
|
253
|
+
try {
|
|
254
|
+
if (mode === "collect") {
|
|
255
|
+
await runFlow(file, { port }, logger);
|
|
256
|
+
} else if (mode === "serve") {
|
|
257
|
+
await runServeMode({ file, port }, logger);
|
|
258
|
+
} else {
|
|
259
|
+
cliLogger.error(`Unknown mode: ${mode}. Use 'collect' or 'serve'.`);
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
} catch (error) {
|
|
263
|
+
cliLogger.error(`Failed to start: ${error}`);
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
main();
|
|
268
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/runner.ts","../../src/runtime/serve.ts","../../src/version.ts","../../src/core/logger.ts","../../src/runtime/main.ts"],"sourcesContent":["/**\n * Runtime executor for pre-built walkerOS flows\n *\n * This module runs pre-built .mjs flow bundles without any build-time operations.\n * All bundling, package downloading, and code generation happens BEFORE this runs.\n */\n\nimport { pathToFileURL } from 'url';\nimport { resolve, dirname } from 'path';\nimport type { Logger } from '@walkeros/core';\n\nexport interface RuntimeConfig {\n port?: number;\n host?: string;\n}\n\n/**\n * Run a pre-built flow bundle\n *\n * @param file - Absolute path to pre-built .mjs flow file\n * @param config - Optional runtime configuration\n * @param logger - Logger instance for output\n */\nexport async function runFlow(\n file: string,\n config: RuntimeConfig | undefined,\n logger: Logger.Instance,\n): Promise<void> {\n logger.info(`Loading flow from ${file}`);\n\n try {\n const absolutePath = resolve(file);\n const flowDir = dirname(absolutePath);\n\n // Change working directory to flow's directory\n // This ensures relative paths (e.g., ./shared/credentials.json) work\n // consistently in both local and Docker execution modes\n process.chdir(flowDir);\n\n const fileUrl = pathToFileURL(absolutePath).href;\n const module = await import(fileUrl);\n\n if (!module.default || typeof module.default !== 'function') {\n logger.throw(\n `Invalid flow bundle: ${file} must export a default function`,\n );\n }\n\n // Execute the flow's factory function\n const result = await module.default(config);\n\n if (!result || !result.collector) {\n logger.throw(`Invalid flow bundle: ${file} must return { collector }`);\n }\n\n const { collector } = result;\n\n logger.info('Flow running');\n if (config?.port) {\n logger.info(`Port: ${config.port}`);\n }\n\n // Graceful shutdown handler\n const shutdown = async (signal: string) => {\n logger.info(`Received ${signal}, shutting down gracefully...`);\n\n try {\n // Use collector's shutdown command if available\n if (collector.command) {\n await collector.command('shutdown');\n }\n logger.info('Shutdown complete');\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Error during shutdown: ${message}`);\n process.exit(1);\n }\n };\n\n // Register shutdown handlers\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to run flow: ${message}`);\n if (error instanceof Error && error.stack) {\n logger.debug('Stack trace:', { stack: error.stack });\n }\n throw error;\n }\n}\n","/**\n * Serve mode - serve single file (typically generated bundle)\n */\n\nimport express from 'express';\nimport { resolve } from 'path';\nimport type { Logger } from '@walkeros/core';\nimport { VERSION } from '../version';\n\nexport interface ServeConfig {\n port?: number;\n host?: string;\n servePath?: string;\n serveName?: string;\n file?: string;\n}\n\n/**\n * Run serve mode - serve single file (typically generated bundle)\n *\n * @param config - Server configuration\n * @param logger - Logger instance for output\n */\nexport async function runServeMode(\n config: ServeConfig | undefined,\n logger: Logger.Instance,\n): Promise<void> {\n // Port priority: ENV variable > config > default\n const port = process.env.PORT\n ? parseInt(process.env.PORT, 10)\n : config?.port || 8080;\n\n // Host priority: ENV variable > config > default\n const host = process.env.HOST || config?.host || '0.0.0.0';\n\n // File path: ENV variable > config > default (resolve to absolute)\n const file = resolve(process.env.FILE || config?.file || './dist/walker.js');\n\n // Serve name (filename in URL): ENV variable > config > default\n const serveName = process.env.SERVE_NAME || config?.serveName || 'walker.js';\n\n // Serve path (URL directory): ENV variable > config > default (empty = root)\n const servePath = process.env.SERVE_PATH || config?.servePath || '';\n\n // Build full URL path\n const urlPath = servePath ? `/${servePath}/${serveName}` : `/${serveName}`;\n\n logger.info('Starting single-file server...');\n logger.info(`File: ${file}`);\n logger.info(`URL: http://${host}:${port}${urlPath}`);\n\n try {\n const app = express();\n\n // Health check\n app.get('/health', (req, res) => {\n res.json({\n status: 'ok',\n version: VERSION,\n timestamp: Date.now(),\n mode: 'serve',\n file: file,\n url: urlPath,\n });\n });\n\n // Serve single file at custom URL path\n app.get(urlPath, (req, res) => {\n // Set content type before streaming\n res.type('application/javascript');\n\n // Allow dotfiles since file paths may include dotfile directories\n res.sendFile(file, { dotfiles: 'allow' }, (err) => {\n if (err && !res.headersSent) {\n const errCode = (err as NodeJS.ErrnoException).code;\n // Express 5 uses HTTP-style errors with status/statusCode\n const errStatus =\n (err as { status?: number; statusCode?: number }).status ||\n (err as { status?: number; statusCode?: number }).statusCode;\n\n // Log errors (except client disconnections)\n if (errCode !== 'ECONNABORTED') {\n logger.error(\n `sendFile error for ${file}: ${err.message} (code: ${errCode}, status: ${errStatus})`,\n );\n }\n\n // Send appropriate error response (check both Node.js codes and HTTP status)\n if (\n errStatus === 404 ||\n errCode === 'ENOENT' ||\n errCode === 'EISDIR' ||\n errCode === 'ENOTDIR'\n ) {\n res.status(404).send('File not found');\n } else if (errCode !== 'ECONNABORTED') {\n res.status(500).send('Internal server error');\n }\n }\n });\n });\n\n // Start server\n const server = app.listen(port, host, () => {\n logger.info(`Server listening on http://${host}:${port}`);\n logger.info(`GET ${urlPath} - Bundle file`);\n logger.info(`GET /health - Health check`);\n });\n\n // Graceful shutdown\n const shutdownHandler = (signal: string) => {\n logger.info(`Received ${signal}, shutting down...`);\n server.close(() => {\n logger.info('Server closed');\n process.exit(0);\n });\n };\n\n process.on('SIGTERM', () => shutdownHandler('SIGTERM'));\n process.on('SIGINT', () => shutdownHandler('SIGINT'));\n\n // Keep process alive\n await new Promise(() => {});\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`Server failed: ${message}`);\n process.exit(1);\n }\n}\n","import { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst versionFilename = fileURLToPath(import.meta.url);\nconst versionDirname = dirname(versionFilename);\n\n/**\n * Find package.json in parent directories\n * Handles both source (src/) and bundled (dist/) contexts\n */\nfunction findPackageJson(): string {\n const paths = [\n join(versionDirname, '../package.json'), // dist/ or src/\n join(versionDirname, '../../package.json'), // src/core/ (not used, but safe)\n ];\n for (const p of paths) {\n try {\n return readFileSync(p, 'utf-8');\n } catch {\n // Continue to next path\n }\n }\n return JSON.stringify({ version: '0.0.0' });\n}\n\n/** CLI package version */\nexport const VERSION: string = JSON.parse(findPackageJson()).version;\n","/* eslint-disable no-console */\nimport chalk from 'chalk';\nimport type { GlobalOptions } from '../types/global.js';\n\nconst BRAND_COLOR = '#01b5e2';\n\nexport interface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n json?: boolean;\n}\n\nexport interface Logger {\n log: (...args: unknown[]) => void;\n brand: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n json: (data: unknown) => void;\n // Backward-compatible methods (map to default terminal color per design)\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n warning: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n gray: (...args: unknown[]) => void;\n}\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, silent = false, json = false } = options;\n\n const shouldLog = !silent && !json;\n const shouldDebug = verbose && !silent && !json;\n\n return {\n log: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n brand: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(chalk.hex(BRAND_COLOR)(message));\n }\n },\n\n error: (...args: unknown[]) => {\n if (!json) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.error(chalk.red(message));\n }\n },\n\n debug: (...args: unknown[]) => {\n if (shouldDebug) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(` ${message}`);\n }\n },\n\n json: (data: unknown) => {\n if (!silent) {\n console.log(JSON.stringify(data, null, 2));\n }\n },\n\n // Backward-compatible methods (all use default terminal color per design)\n info: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n success: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n warning: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n warn: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n\n gray: (...args: unknown[]) => {\n if (shouldLog) {\n const message = args.map((arg) => String(arg)).join(' ');\n console.log(message);\n }\n },\n };\n}\n\n/**\n * Create logger from command options\n * Factory function that standardizes logger creation across commands\n *\n * @param options - Command options containing verbose, silent, and json flags\n * @returns Configured logger instance\n */\nexport function createCommandLogger(\n options: GlobalOptions & { json?: boolean },\n): Logger {\n return createLogger({\n verbose: options.verbose,\n silent: options.silent ?? false,\n json: options.json,\n });\n}\n","/**\n * Entry point for walkeros/flow Docker container\n * Reads environment variables and starts the appropriate mode\n */\n\nimport { runFlow } from './runner.js';\nimport { runServeMode } from './serve.js';\nimport { createLogger } from '../core/logger.js';\nimport type { Logger } from '@walkeros/core';\n\n/**\n * Adapt CLI logger to core Logger.Instance interface\n */\nfunction adaptLogger(\n cliLogger: ReturnType<typeof createLogger>,\n): Logger.Instance {\n return {\n error: (message: string | Error) => {\n const msg = message instanceof Error ? message.message : message;\n cliLogger.error(msg);\n },\n info: (message: string | Error) => {\n const msg = message instanceof Error ? message.message : message;\n cliLogger.info(msg);\n },\n debug: (message: string | Error) => {\n const msg = message instanceof Error ? message.message : message;\n cliLogger.debug(msg);\n },\n throw: (message: string | Error): never => {\n const msg = message instanceof Error ? message.message : message;\n cliLogger.error(msg);\n throw message instanceof Error ? message : new Error(msg);\n },\n scope: (name: string) => {\n // Simple pass-through for scoped loggers - CLI logger doesn't use scopes\n return adaptLogger(cliLogger);\n },\n };\n}\n\nasync function main() {\n const mode = process.env.MODE || 'collect';\n const file = process.env.FILE || '/flow/bundle.mjs';\n const port = parseInt(process.env.PORT || '8080', 10);\n\n const cliLogger = createLogger({ silent: false, verbose: true });\n const logger = adaptLogger(cliLogger);\n\n cliLogger.log(`Starting walkeros/flow in ${mode} mode`);\n cliLogger.log(`File: ${file}`);\n cliLogger.log(`Port: ${port}`);\n\n try {\n if (mode === 'collect') {\n await runFlow(file, { port }, logger);\n } else if (mode === 'serve') {\n await runServeMode({ file, port }, logger);\n } else {\n cliLogger.error(`Unknown mode: ${mode}. Use 'collect' or 'serve'.`);\n process.exit(1);\n }\n } catch (error) {\n cliLogger.error(`Failed to start: ${error}`);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["resolve","dirname","resolve"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime executor for pre-built walkerOS flows
|
|
3
|
+
*
|
|
4
|
+
* This module runs pre-built .mjs flow bundles without any build-time operations.
|
|
5
|
+
* All bundling, package downloading, and code generation happens BEFORE this runs.
|
|
6
|
+
*/
|
|
7
|
+
import type { Logger } from '@walkeros/core';
|
|
8
|
+
export interface RuntimeConfig {
|
|
9
|
+
port?: number;
|
|
10
|
+
host?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Run a pre-built flow bundle
|
|
14
|
+
*
|
|
15
|
+
* @param file - Absolute path to pre-built .mjs flow file
|
|
16
|
+
* @param config - Optional runtime configuration
|
|
17
|
+
* @param logger - Logger instance for output
|
|
18
|
+
*/
|
|
19
|
+
export declare function runFlow(file: string, config: RuntimeConfig | undefined, logger: Logger.Instance): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runtime/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,CAAC,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime executor for pre-built walkerOS flows
|
|
3
|
+
*
|
|
4
|
+
* This module runs pre-built .mjs flow bundles without any build-time operations.
|
|
5
|
+
* All bundling, package downloading, and code generation happens BEFORE this runs.
|
|
6
|
+
*/
|
|
7
|
+
import { pathToFileURL } from 'url';
|
|
8
|
+
import { resolve, dirname } from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Run a pre-built flow bundle
|
|
11
|
+
*
|
|
12
|
+
* @param file - Absolute path to pre-built .mjs flow file
|
|
13
|
+
* @param config - Optional runtime configuration
|
|
14
|
+
* @param logger - Logger instance for output
|
|
15
|
+
*/
|
|
16
|
+
export async function runFlow(file, config, logger) {
|
|
17
|
+
logger.info(`Loading flow from ${file}`);
|
|
18
|
+
try {
|
|
19
|
+
const absolutePath = resolve(file);
|
|
20
|
+
const flowDir = dirname(absolutePath);
|
|
21
|
+
// Change working directory to flow's directory
|
|
22
|
+
// This ensures relative paths (e.g., ./shared/credentials.json) work
|
|
23
|
+
// consistently in both local and Docker execution modes
|
|
24
|
+
process.chdir(flowDir);
|
|
25
|
+
const fileUrl = pathToFileURL(absolutePath).href;
|
|
26
|
+
const module = await import(fileUrl);
|
|
27
|
+
if (!module.default || typeof module.default !== 'function') {
|
|
28
|
+
logger.throw(`Invalid flow bundle: ${file} must export a default function`);
|
|
29
|
+
}
|
|
30
|
+
// Execute the flow's factory function
|
|
31
|
+
const result = await module.default(config);
|
|
32
|
+
if (!result || !result.collector) {
|
|
33
|
+
logger.throw(`Invalid flow bundle: ${file} must return { collector }`);
|
|
34
|
+
}
|
|
35
|
+
const { collector } = result;
|
|
36
|
+
logger.info('Flow running');
|
|
37
|
+
if (config?.port) {
|
|
38
|
+
logger.info(`Port: ${config.port}`);
|
|
39
|
+
}
|
|
40
|
+
// Graceful shutdown handler
|
|
41
|
+
const shutdown = async (signal) => {
|
|
42
|
+
logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
43
|
+
try {
|
|
44
|
+
// Use collector's shutdown command if available
|
|
45
|
+
if (collector.command) {
|
|
46
|
+
await collector.command('shutdown');
|
|
47
|
+
}
|
|
48
|
+
logger.info('Shutdown complete');
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
53
|
+
logger.error(`Error during shutdown: ${message}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
// Register shutdown handlers
|
|
58
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
59
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
60
|
+
// Keep process alive
|
|
61
|
+
await new Promise(() => { });
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
logger.error(`Failed to run flow: ${message}`);
|
|
66
|
+
if (error instanceof Error && error.stack) {
|
|
67
|
+
logger.debug('Stack trace:', { stack: error.stack });
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runtime/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serve mode - serve single file (typically generated bundle)
|
|
3
|
+
*/
|
|
4
|
+
import type { Logger } from '@walkeros/core';
|
|
5
|
+
export interface ServeConfig {
|
|
6
|
+
port?: number;
|
|
7
|
+
host?: string;
|
|
8
|
+
servePath?: string;
|
|
9
|
+
serveName?: string;
|
|
10
|
+
file?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Run serve mode - serve single file (typically generated bundle)
|
|
14
|
+
*
|
|
15
|
+
* @param config - Server configuration
|
|
16
|
+
* @param logger - Logger instance for output
|
|
17
|
+
*/
|
|
18
|
+
export declare function runServeMode(config: ServeConfig | undefined, logger: Logger.Instance): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/runtime/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,CAAC,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC,CAsGf"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serve mode - serve single file (typically generated bundle)
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import { resolve } from 'path';
|
|
6
|
+
import { VERSION } from '../version';
|
|
7
|
+
/**
|
|
8
|
+
* Run serve mode - serve single file (typically generated bundle)
|
|
9
|
+
*
|
|
10
|
+
* @param config - Server configuration
|
|
11
|
+
* @param logger - Logger instance for output
|
|
12
|
+
*/
|
|
13
|
+
export async function runServeMode(config, logger) {
|
|
14
|
+
// Port priority: ENV variable > config > default
|
|
15
|
+
const port = process.env.PORT
|
|
16
|
+
? parseInt(process.env.PORT, 10)
|
|
17
|
+
: config?.port || 8080;
|
|
18
|
+
// Host priority: ENV variable > config > default
|
|
19
|
+
const host = process.env.HOST || config?.host || '0.0.0.0';
|
|
20
|
+
// File path: ENV variable > config > default (resolve to absolute)
|
|
21
|
+
const file = resolve(process.env.FILE || config?.file || './dist/walker.js');
|
|
22
|
+
// Serve name (filename in URL): ENV variable > config > default
|
|
23
|
+
const serveName = process.env.SERVE_NAME || config?.serveName || 'walker.js';
|
|
24
|
+
// Serve path (URL directory): ENV variable > config > default (empty = root)
|
|
25
|
+
const servePath = process.env.SERVE_PATH || config?.servePath || '';
|
|
26
|
+
// Build full URL path
|
|
27
|
+
const urlPath = servePath ? `/${servePath}/${serveName}` : `/${serveName}`;
|
|
28
|
+
logger.info('Starting single-file server...');
|
|
29
|
+
logger.info(`File: ${file}`);
|
|
30
|
+
logger.info(`URL: http://${host}:${port}${urlPath}`);
|
|
31
|
+
try {
|
|
32
|
+
const app = express();
|
|
33
|
+
// Health check
|
|
34
|
+
app.get('/health', (req, res) => {
|
|
35
|
+
res.json({
|
|
36
|
+
status: 'ok',
|
|
37
|
+
version: VERSION,
|
|
38
|
+
timestamp: Date.now(),
|
|
39
|
+
mode: 'serve',
|
|
40
|
+
file: file,
|
|
41
|
+
url: urlPath,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
// Serve single file at custom URL path
|
|
45
|
+
app.get(urlPath, (req, res) => {
|
|
46
|
+
// Set content type before streaming
|
|
47
|
+
res.type('application/javascript');
|
|
48
|
+
// Allow dotfiles since file paths may include dotfile directories
|
|
49
|
+
res.sendFile(file, { dotfiles: 'allow' }, (err) => {
|
|
50
|
+
if (err && !res.headersSent) {
|
|
51
|
+
const errCode = err.code;
|
|
52
|
+
// Express 5 uses HTTP-style errors with status/statusCode
|
|
53
|
+
const errStatus = err.status ||
|
|
54
|
+
err.statusCode;
|
|
55
|
+
// Log errors (except client disconnections)
|
|
56
|
+
if (errCode !== 'ECONNABORTED') {
|
|
57
|
+
logger.error(`sendFile error for ${file}: ${err.message} (code: ${errCode}, status: ${errStatus})`);
|
|
58
|
+
}
|
|
59
|
+
// Send appropriate error response (check both Node.js codes and HTTP status)
|
|
60
|
+
if (errStatus === 404 ||
|
|
61
|
+
errCode === 'ENOENT' ||
|
|
62
|
+
errCode === 'EISDIR' ||
|
|
63
|
+
errCode === 'ENOTDIR') {
|
|
64
|
+
res.status(404).send('File not found');
|
|
65
|
+
}
|
|
66
|
+
else if (errCode !== 'ECONNABORTED') {
|
|
67
|
+
res.status(500).send('Internal server error');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
// Start server
|
|
73
|
+
const server = app.listen(port, host, () => {
|
|
74
|
+
logger.info(`Server listening on http://${host}:${port}`);
|
|
75
|
+
logger.info(`GET ${urlPath} - Bundle file`);
|
|
76
|
+
logger.info(`GET /health - Health check`);
|
|
77
|
+
});
|
|
78
|
+
// Graceful shutdown
|
|
79
|
+
const shutdownHandler = (signal) => {
|
|
80
|
+
logger.info(`Received ${signal}, shutting down...`);
|
|
81
|
+
server.close(() => {
|
|
82
|
+
logger.info('Server closed');
|
|
83
|
+
process.exit(0);
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
|
|
87
|
+
process.on('SIGINT', () => shutdownHandler('SIGINT'));
|
|
88
|
+
// Keep process alive
|
|
89
|
+
await new Promise(() => { });
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
93
|
+
logger.error(`Server failed: ${message}`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/runtime/serve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAUrC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA+B,EAC/B,MAAuB;IAEvB,iDAAiD;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI;QAC3B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IAEzB,iDAAiD;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;IAE3D,mEAAmE;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,kBAAkB,CAAC,CAAC;IAE7E,gEAAgE;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,EAAE,SAAS,IAAI,WAAW,CAAC;IAE7E,6EAA6E;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;IAEpE,sBAAsB;IACtB,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IAE3E,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QAEtB,eAAe;QACf,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI;gBACV,GAAG,EAAE,OAAO;aACb,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5B,oCAAoC;YACpC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAEnC,kEAAkE;YAClE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAI,GAA6B,CAAC,IAAI,CAAC;oBACpD,0DAA0D;oBAC1D,MAAM,SAAS,GACZ,GAAgD,CAAC,MAAM;wBACvD,GAAgD,CAAC,UAAU,CAAC;oBAE/D,4CAA4C;oBAC5C,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,CACV,sBAAsB,IAAI,KAAK,GAAG,CAAC,OAAO,WAAW,OAAO,aAAa,SAAS,GAAG,CACtF,CAAC;oBACJ,CAAC;oBAED,6EAA6E;oBAC7E,IACE,SAAS,KAAK,GAAG;wBACjB,OAAO,KAAK,QAAQ;wBACpB,OAAO,KAAK,QAAQ;wBACpB,OAAO,KAAK,SAAS,EACrB,CAAC;wBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACzC,CAAC;yBAAM,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;wBACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,gBAAgB,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE;YACzC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,oBAAoB,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtD,qBAAqB;QACrB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Schemas
|
|
3
|
+
*
|
|
4
|
+
* Zod schemas for CLI parameter validation.
|
|
5
|
+
* Follows walkerOS patterns from @walkeros/core.
|
|
6
|
+
*/
|
|
7
|
+
export { RunModeSchema, PortSchema, FilePathSchema, type RunMode, } from './primitives';
|
|
8
|
+
export { RunOptionsSchema, type RunOptions } from './run';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,KAAK,OAAO,GACb,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Schemas
|
|
3
|
+
*
|
|
4
|
+
* Zod schemas for CLI parameter validation.
|
|
5
|
+
* Follows walkerOS patterns from @walkeros/core.
|
|
6
|
+
*/
|
|
7
|
+
export { RunModeSchema, PortSchema, FilePathSchema, } from './primitives';
|
|
8
|
+
export { RunOptionsSchema } from './run';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,GAEf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAmB,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Primitive Schemas
|
|
3
|
+
*
|
|
4
|
+
* Basic Zod schemas for CLI parameter validation.
|
|
5
|
+
* Follows walkerOS patterns from @walkeros/core.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from '@walkeros/core/dev';
|
|
8
|
+
/**
|
|
9
|
+
* Run mode schema.
|
|
10
|
+
*
|
|
11
|
+
* @remarks
|
|
12
|
+
* Validates CLI run mode for the `run` command.
|
|
13
|
+
* - `collect`: Run as event collector
|
|
14
|
+
* - `serve`: Run as HTTP server
|
|
15
|
+
*/
|
|
16
|
+
export declare const RunModeSchema: z.ZodEnum<{
|
|
17
|
+
collect: "collect";
|
|
18
|
+
serve: "serve";
|
|
19
|
+
}>;
|
|
20
|
+
export type RunMode = z.infer<typeof RunModeSchema>;
|
|
21
|
+
/**
|
|
22
|
+
* Port number schema.
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* Validates HTTP server port number.
|
|
26
|
+
* Must be integer between 1-65535.
|
|
27
|
+
*/
|
|
28
|
+
export declare const PortSchema: z.ZodNumber;
|
|
29
|
+
/**
|
|
30
|
+
* File path schema.
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* Basic string validation for file paths.
|
|
34
|
+
* File existence is checked separately (Zod can't check filesystem).
|
|
35
|
+
*/
|
|
36
|
+
export declare const FilePathSchema: z.ZodString;
|
|
37
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/schemas/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;;EAE+B,CAAC;AAE1D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,aAKe,CAAC;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,aAGc,CAAC"}
|