spell-runtime 1.2.0 → 1.2.1
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/README.md +31 -0
- package/README.txt +26 -0
- package/dist/api/server.js +14 -1
- package/dist/api/server.js.map +1 -1
- package/dist/bundle/install.js +77 -5
- package/dist/bundle/install.js.map +1 -1
- package/dist/cli/index.js +38 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/license/store.d.ts +12 -0
- package/dist/license/store.js +148 -0
- package/dist/license/store.js.map +1 -0
- package/dist/runner/cast.js +27 -3
- package/dist/runner/cast.js.map +1 -1
- package/dist/runner/dockerRunner.d.ts +1 -1
- package/dist/runner/dockerRunner.js +33 -9
- package/dist/runner/dockerRunner.js.map +1 -1
- package/dist/runner/hostRunner.d.ts +1 -1
- package/dist/runner/hostRunner.js +30 -3
- package/dist/runner/hostRunner.js.map +1 -1
- package/dist/runner/runtimeLimits.d.ts +6 -0
- package/dist/runner/runtimeLimits.js +48 -0
- package/dist/runner/runtimeLimits.js.map +1 -0
- package/dist/steps/httpStep.d.ts +1 -1
- package/dist/steps/httpStep.js +20 -6
- package/dist/steps/httpStep.js.map +1 -1
- package/dist/steps/shellStep.d.ts +5 -1
- package/dist/steps/shellStep.js +33 -7
- package/dist/steps/shellStep.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/util/paths.d.ts +1 -0
- package/dist/util/paths.js +5 -0
- package/dist/util/paths.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toLicenseKey = toLicenseKey;
|
|
7
|
+
exports.licenseFilePath = licenseFilePath;
|
|
8
|
+
exports.upsertLicense = upsertLicense;
|
|
9
|
+
exports.removeLicense = removeLicense;
|
|
10
|
+
exports.listLicenses = listLicenses;
|
|
11
|
+
exports.findFirstUsableLicense = findFirstUsableLicense;
|
|
12
|
+
const promises_1 = require("node:fs/promises");
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
const errors_1 = require("../util/errors");
|
|
15
|
+
const paths_1 = require("../util/paths");
|
|
16
|
+
function toLicenseKey(name) {
|
|
17
|
+
return Buffer.from(name, "utf8").toString("base64url");
|
|
18
|
+
}
|
|
19
|
+
function licenseFilePath(name) {
|
|
20
|
+
return node_path_1.default.join((0, paths_1.licensesRoot)(), `${toLicenseKey(name)}.json`);
|
|
21
|
+
}
|
|
22
|
+
async function upsertLicense(name, token) {
|
|
23
|
+
const normalizedName = normalizeName(name);
|
|
24
|
+
const normalizedToken = normalizeToken(token);
|
|
25
|
+
await (0, promises_1.mkdir)((0, paths_1.licensesRoot)(), { recursive: true });
|
|
26
|
+
const now = new Date().toISOString();
|
|
27
|
+
const existing = await loadLicenseRecord(normalizedName);
|
|
28
|
+
const payload = {
|
|
29
|
+
version: "v1",
|
|
30
|
+
name: normalizedName,
|
|
31
|
+
token: normalizedToken,
|
|
32
|
+
created_at: existing?.created_at ?? now,
|
|
33
|
+
updated_at: now
|
|
34
|
+
};
|
|
35
|
+
const filePath = licenseFilePath(normalizedName);
|
|
36
|
+
await (0, promises_1.writeFile)(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
|
|
37
|
+
}
|
|
38
|
+
async function removeLicense(name) {
|
|
39
|
+
const normalizedName = normalizeName(name);
|
|
40
|
+
const filePath = licenseFilePath(normalizedName);
|
|
41
|
+
const existed = await (0, promises_1.access)(filePath).then(() => true).catch(() => false);
|
|
42
|
+
if (!existed)
|
|
43
|
+
return false;
|
|
44
|
+
await (0, promises_1.rm)(filePath, { force: true });
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
async function listLicenses() {
|
|
48
|
+
const entries = await (0, promises_1.readdir)((0, paths_1.licensesRoot)()).catch(() => []);
|
|
49
|
+
const licenses = [];
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
if (!entry.endsWith(".json"))
|
|
52
|
+
continue;
|
|
53
|
+
const filePath = node_path_1.default.join((0, paths_1.licensesRoot)(), entry);
|
|
54
|
+
let raw;
|
|
55
|
+
try {
|
|
56
|
+
raw = await (0, promises_1.readFile)(filePath, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
let parsed;
|
|
62
|
+
try {
|
|
63
|
+
parsed = JSON.parse(raw);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
69
|
+
continue;
|
|
70
|
+
const obj = parsed;
|
|
71
|
+
if (obj.version !== "v1")
|
|
72
|
+
continue;
|
|
73
|
+
if (typeof obj.name !== "string" || !obj.name.trim())
|
|
74
|
+
continue;
|
|
75
|
+
if (typeof obj.token !== "string")
|
|
76
|
+
continue;
|
|
77
|
+
licenses.push({
|
|
78
|
+
name: obj.name.trim(),
|
|
79
|
+
hasToken: obj.token.trim().length > 0,
|
|
80
|
+
created_at: typeof obj.created_at === "string" ? obj.created_at : undefined,
|
|
81
|
+
updated_at: typeof obj.updated_at === "string" ? obj.updated_at : undefined
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
licenses.sort((a, b) => a.name.localeCompare(b.name));
|
|
85
|
+
return licenses;
|
|
86
|
+
}
|
|
87
|
+
async function findFirstUsableLicense() {
|
|
88
|
+
const licenses = await listLicenses();
|
|
89
|
+
return licenses.find((entry) => entry.hasToken) ?? null;
|
|
90
|
+
}
|
|
91
|
+
async function loadLicenseRecord(name) {
|
|
92
|
+
const filePath = licenseFilePath(name);
|
|
93
|
+
let raw;
|
|
94
|
+
try {
|
|
95
|
+
raw = await (0, promises_1.readFile)(filePath, "utf8");
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
let parsed;
|
|
101
|
+
try {
|
|
102
|
+
parsed = JSON.parse(raw);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
throw new errors_1.SpellError(`failed to parse license file: ${filePath}`);
|
|
106
|
+
}
|
|
107
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
108
|
+
throw new errors_1.SpellError(`license file must be a JSON object: ${filePath}`);
|
|
109
|
+
}
|
|
110
|
+
const obj = parsed;
|
|
111
|
+
const version = readRequiredString(obj, "version");
|
|
112
|
+
if (version !== "v1") {
|
|
113
|
+
throw new errors_1.SpellError(`unsupported license file version: ${version}`);
|
|
114
|
+
}
|
|
115
|
+
const parsedName = readRequiredString(obj, "name");
|
|
116
|
+
if (parsedName !== name) {
|
|
117
|
+
throw new errors_1.SpellError(`license file name mismatch: expected '${name}', got '${parsedName}'`);
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
version: "v1",
|
|
121
|
+
name: parsedName,
|
|
122
|
+
token: readRequiredString(obj, "token"),
|
|
123
|
+
created_at: readRequiredString(obj, "created_at"),
|
|
124
|
+
updated_at: readRequiredString(obj, "updated_at")
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function normalizeName(name) {
|
|
128
|
+
const trimmed = name.trim();
|
|
129
|
+
if (!trimmed) {
|
|
130
|
+
throw new errors_1.SpellError("license name must be non-empty");
|
|
131
|
+
}
|
|
132
|
+
return trimmed;
|
|
133
|
+
}
|
|
134
|
+
function normalizeToken(token) {
|
|
135
|
+
const trimmed = token.trim();
|
|
136
|
+
if (!trimmed) {
|
|
137
|
+
throw new errors_1.SpellError("license token must be non-empty");
|
|
138
|
+
}
|
|
139
|
+
return trimmed;
|
|
140
|
+
}
|
|
141
|
+
function readRequiredString(obj, key) {
|
|
142
|
+
const value = obj[key];
|
|
143
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
144
|
+
throw new errors_1.SpellError(`missing '${key}' string`);
|
|
145
|
+
}
|
|
146
|
+
return value.trim();
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/license/store.ts"],"names":[],"mappings":"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"}
|
package/dist/runner/cast.js
CHANGED
|
@@ -16,6 +16,8 @@ const dockerRunner_1 = require("./dockerRunner");
|
|
|
16
16
|
const summary_1 = require("./summary");
|
|
17
17
|
const verify_1 = require("../signature/verify");
|
|
18
18
|
const trustStore_1 = require("../signature/trustStore");
|
|
19
|
+
const store_2 = require("../license/store");
|
|
20
|
+
const runtimeLimits_1 = require("./runtimeLimits");
|
|
19
21
|
async function castSpell(options) {
|
|
20
22
|
const logger = (0, pino_1.default)({ level: options.verbose ? "debug" : "info" });
|
|
21
23
|
const startedAt = new Date().toISOString();
|
|
@@ -38,6 +40,9 @@ async function castSpell(options) {
|
|
|
38
40
|
runtime: {
|
|
39
41
|
execution: "host",
|
|
40
42
|
platforms: []
|
|
43
|
+
},
|
|
44
|
+
license: {
|
|
45
|
+
licensed: false
|
|
41
46
|
}
|
|
42
47
|
},
|
|
43
48
|
steps: [],
|
|
@@ -46,6 +51,8 @@ async function castSpell(options) {
|
|
|
46
51
|
success: false
|
|
47
52
|
};
|
|
48
53
|
try {
|
|
54
|
+
const runtimeInputMaxBytes = (0, runtimeLimits_1.readRuntimeInputMaxBytes)();
|
|
55
|
+
const runtimeExecutionTimeoutMs = (0, runtimeLimits_1.readRuntimeExecutionTimeoutMs)();
|
|
49
56
|
const loaded = await (0, store_1.resolveInstalledBundle)(options.id, options.version);
|
|
50
57
|
const { manifest, bundlePath } = loaded;
|
|
51
58
|
executionId = (0, executionLog_1.makeExecutionId)(manifest.id, manifest.version);
|
|
@@ -55,13 +62,20 @@ async function castSpell(options) {
|
|
|
55
62
|
log.summary = {
|
|
56
63
|
risk: manifest.risk,
|
|
57
64
|
billing: manifest.billing,
|
|
58
|
-
runtime: manifest.runtime
|
|
65
|
+
runtime: manifest.runtime,
|
|
66
|
+
license: {
|
|
67
|
+
licensed: false
|
|
68
|
+
}
|
|
59
69
|
};
|
|
60
70
|
log.signature = {
|
|
61
71
|
required: options.requireSignature,
|
|
62
72
|
status: "skipped"
|
|
63
73
|
};
|
|
64
74
|
const input = await (0, input_1.buildInput)(options.inputFile, options.paramPairs);
|
|
75
|
+
const inputSizeBytes = Buffer.byteLength(JSON.stringify(input), "utf8");
|
|
76
|
+
if (inputSizeBytes > runtimeInputMaxBytes) {
|
|
77
|
+
throw new errors_1.SpellError(`merged input is ${inputSizeBytes} bytes, exceeds SPELL_RUNTIME_INPUT_MAX_BYTES=${runtimeInputMaxBytes}`);
|
|
78
|
+
}
|
|
65
79
|
log.input = input;
|
|
66
80
|
const schema = await (0, store_1.readSchemaFromManifest)(manifest, bundlePath);
|
|
67
81
|
(0, input_1.validateInputAgainstSchema)(schema, input);
|
|
@@ -96,6 +110,16 @@ async function castSpell(options) {
|
|
|
96
110
|
if (manifest.billing.enabled && !options.allowBilling) {
|
|
97
111
|
throw new errors_1.SpellError("billing enabled requires --allow-billing");
|
|
98
112
|
}
|
|
113
|
+
if (manifest.billing.enabled) {
|
|
114
|
+
const matchedLicense = await (0, store_2.findFirstUsableLicense)();
|
|
115
|
+
if (!matchedLicense) {
|
|
116
|
+
throw new errors_1.SpellError("billing enabled requires license token (spell license add ...)");
|
|
117
|
+
}
|
|
118
|
+
log.summary.license = {
|
|
119
|
+
licensed: true,
|
|
120
|
+
name: matchedLicense.name
|
|
121
|
+
};
|
|
122
|
+
}
|
|
99
123
|
for (const permission of manifest.permissions) {
|
|
100
124
|
const tokenKey = `CONNECTOR_${permission.connector.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_TOKEN`;
|
|
101
125
|
if (!process.env[tokenKey]) {
|
|
@@ -115,7 +139,7 @@ async function castSpell(options) {
|
|
|
115
139
|
}
|
|
116
140
|
if (manifest.runtime.execution === "docker") {
|
|
117
141
|
logger.debug({ id: manifest.id, version: manifest.version }, "starting docker execution");
|
|
118
|
-
const dockerResult = await (0, dockerRunner_1.runDocker)(manifest, bundlePath, input);
|
|
142
|
+
const dockerResult = await (0, dockerRunner_1.runDocker)(manifest, bundlePath, input, runtimeExecutionTimeoutMs);
|
|
119
143
|
log.steps = dockerResult.stepResults;
|
|
120
144
|
log.outputs = dockerResult.outputs;
|
|
121
145
|
log.checks = dockerResult.checks;
|
|
@@ -129,7 +153,7 @@ async function castSpell(options) {
|
|
|
129
153
|
};
|
|
130
154
|
}
|
|
131
155
|
logger.debug({ id: manifest.id, version: manifest.version }, "starting host execution");
|
|
132
|
-
const runResult = await (0, hostRunner_1.runHost)(manifest, bundlePath, input);
|
|
156
|
+
const runResult = await (0, hostRunner_1.runHost)(manifest, bundlePath, input, runtimeExecutionTimeoutMs);
|
|
133
157
|
log.steps = runResult.stepResults;
|
|
134
158
|
log.outputs = runResult.outputs;
|
|
135
159
|
const checkResults = await (0, evaluate_1.evaluateChecks)(manifest.checks, bundlePath, runResult.outputs, true);
|
package/dist/runner/cast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cast.js","sourceRoot":"","sources":["../../src/runner/cast.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"cast.js","sourceRoot":"","sources":["../../src/runner/cast.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,4 +6,4 @@ export interface DockerRunnerResult {
|
|
|
6
6
|
outputs: Record<string, unknown>;
|
|
7
7
|
checks: CheckResult[];
|
|
8
8
|
}
|
|
9
|
-
export declare function runDocker(manifest: SpellBundleManifest, bundlePath: string, input: Record<string, unknown
|
|
9
|
+
export declare function runDocker(manifest: SpellBundleManifest, bundlePath: string, input: Record<string, unknown>, executionTimeoutMs?: number): Promise<DockerRunnerResult>;
|
|
@@ -9,7 +9,8 @@ const node_os_1 = require("node:os");
|
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const node_child_process_1 = require("node:child_process");
|
|
11
11
|
const errors_1 = require("../util/errors");
|
|
12
|
-
|
|
12
|
+
const runtimeLimits_1 = require("./runtimeLimits");
|
|
13
|
+
async function runDocker(manifest, bundlePath, input, executionTimeoutMs) {
|
|
13
14
|
const dockerImage = manifest.runtime.docker_image;
|
|
14
15
|
if (!dockerImage) {
|
|
15
16
|
throw new errors_1.SpellError("runtime.docker_image is required when runtime.execution=docker");
|
|
@@ -19,7 +20,10 @@ async function runDocker(manifest, bundlePath, input) {
|
|
|
19
20
|
await (0, promises_1.writeFile)(inputPath, JSON.stringify(input), "utf8");
|
|
20
21
|
try {
|
|
21
22
|
const args = buildDockerArgs(dockerImage, bundlePath, tempDir, manifest);
|
|
22
|
-
const { code, stdout, stderr } = await runProcess("docker", args, process.cwd());
|
|
23
|
+
const { code, stdout, stderr, timedOut } = await runProcess("docker", args, process.cwd(), executionTimeoutMs);
|
|
24
|
+
if (timedOut && executionTimeoutMs !== undefined) {
|
|
25
|
+
throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs));
|
|
26
|
+
}
|
|
23
27
|
if (code !== 0) {
|
|
24
28
|
throw new errors_1.SpellError(stderr.trim() || `docker exited with code ${code}`);
|
|
25
29
|
}
|
|
@@ -64,7 +68,7 @@ function buildDockerArgs(dockerImage, bundlePath, tempDir, manifest) {
|
|
|
64
68
|
}
|
|
65
69
|
function collectEnvVarsToPass(manifest) {
|
|
66
70
|
const out = [];
|
|
67
|
-
// pass connector tokens
|
|
71
|
+
// pass connector tokens (and fail earlier if missing)
|
|
68
72
|
for (const permission of manifest.permissions) {
|
|
69
73
|
const tokenKey = `CONNECTOR_${permission.connector.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_TOKEN`;
|
|
70
74
|
const value = process.env[tokenKey];
|
|
@@ -72,6 +76,10 @@ function collectEnvVarsToPass(manifest) {
|
|
|
72
76
|
out.push([tokenKey, value]);
|
|
73
77
|
}
|
|
74
78
|
}
|
|
79
|
+
const stepTimeout = process.env.SPELL_RUNTIME_STEP_TIMEOUT_MS;
|
|
80
|
+
if (typeof stepTimeout === "string" && stepTimeout.trim() !== "") {
|
|
81
|
+
out.push(["SPELL_RUNTIME_STEP_TIMEOUT_MS", stepTimeout.trim()]);
|
|
82
|
+
}
|
|
75
83
|
return out;
|
|
76
84
|
}
|
|
77
85
|
function parseRunnerJson(stdout) {
|
|
@@ -98,7 +106,7 @@ function parseRunnerJson(stdout) {
|
|
|
98
106
|
checks: Array.isArray(obj.checks) ? obj.checks : []
|
|
99
107
|
};
|
|
100
108
|
}
|
|
101
|
-
async function runProcess(command, args, cwd) {
|
|
109
|
+
async function runProcess(command, args, cwd, timeoutMs) {
|
|
102
110
|
const child = (0, node_child_process_1.spawn)(command, args, {
|
|
103
111
|
shell: false,
|
|
104
112
|
cwd,
|
|
@@ -112,10 +120,26 @@ async function runProcess(command, args, cwd) {
|
|
|
112
120
|
child.stderr.on("data", (chunk) => {
|
|
113
121
|
stderr += chunk.toString();
|
|
114
122
|
});
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
123
|
+
let timedOut = false;
|
|
124
|
+
let timer;
|
|
125
|
+
if (timeoutMs !== undefined) {
|
|
126
|
+
timer = setTimeout(() => {
|
|
127
|
+
timedOut = true;
|
|
128
|
+
child.kill("SIGKILL");
|
|
129
|
+
}, timeoutMs);
|
|
130
|
+
}
|
|
131
|
+
let code;
|
|
132
|
+
try {
|
|
133
|
+
code = await new Promise((resolve, reject) => {
|
|
134
|
+
child.once("error", reject);
|
|
135
|
+
child.once("close", (exitCode) => resolve(exitCode ?? 1));
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
if (timer) {
|
|
140
|
+
clearTimeout(timer);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { code, stdout, stderr, timedOut };
|
|
120
144
|
}
|
|
121
145
|
//# sourceMappingURL=dockerRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dockerRunner.js","sourceRoot":"","sources":["../../src/runner/dockerRunner.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"dockerRunner.js","sourceRoot":"","sources":["../../src/runner/dockerRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SpellBundleManifest, StepResult } from "../types";
|
|
2
|
-
export declare function runHost(manifest: SpellBundleManifest, bundlePath: string, input: Record<string, unknown
|
|
2
|
+
export declare function runHost(manifest: SpellBundleManifest, bundlePath: string, input: Record<string, unknown>, executionTimeoutMs?: number): Promise<{
|
|
3
3
|
outputs: Record<string, unknown>;
|
|
4
4
|
stepResults: StepResult[];
|
|
5
5
|
}>;
|
|
@@ -10,10 +10,12 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
10
10
|
const errors_1 = require("../util/errors");
|
|
11
11
|
const httpStep_1 = require("../steps/httpStep");
|
|
12
12
|
const shellStep_1 = require("../steps/shellStep");
|
|
13
|
-
|
|
13
|
+
const runtimeLimits_1 = require("./runtimeLimits");
|
|
14
|
+
async function runHost(manifest, bundlePath, input, executionTimeoutMs) {
|
|
14
15
|
const tempDir = await (0, promises_1.mkdtemp)(node_path_1.default.join((0, node_os_1.tmpdir)(), "spell-input-"));
|
|
15
16
|
const inputPath = node_path_1.default.join(tempDir, "input.json");
|
|
16
17
|
await (0, promises_1.writeFile)(inputPath, JSON.stringify(input), "utf8");
|
|
18
|
+
const executionDeadlineMs = executionTimeoutMs !== undefined ? Date.now() + executionTimeoutMs : undefined;
|
|
17
19
|
const env = {
|
|
18
20
|
...process.env,
|
|
19
21
|
INPUT_JSON: inputPath
|
|
@@ -22,14 +24,21 @@ async function runHost(manifest, bundlePath, input) {
|
|
|
22
24
|
const stepResults = [];
|
|
23
25
|
for (const step of manifest.steps) {
|
|
24
26
|
const runPath = node_path_1.default.resolve(bundlePath, step.run);
|
|
27
|
+
const remainingExecutionMs = executionDeadlineMs !== undefined ? executionDeadlineMs - Date.now() : undefined;
|
|
28
|
+
if (remainingExecutionMs !== undefined && remainingExecutionMs <= 0) {
|
|
29
|
+
throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs, step.name));
|
|
30
|
+
}
|
|
25
31
|
if (step.uses === "shell") {
|
|
26
|
-
const result = await (0, shellStep_1.runShellStep)(step, runPath, bundlePath, env
|
|
32
|
+
const result = await (0, shellStep_1.runShellStep)(step, runPath, bundlePath, env, {
|
|
33
|
+
maxDurationMs: remainingExecutionMs,
|
|
34
|
+
executionTimeoutMs
|
|
35
|
+
});
|
|
27
36
|
stepResults.push(result.stepResult);
|
|
28
37
|
outputs[`step.${step.name}.stdout`] = result.stdout;
|
|
29
38
|
continue;
|
|
30
39
|
}
|
|
31
40
|
if (step.uses === "http") {
|
|
32
|
-
const result = await (
|
|
41
|
+
const result = await runHttpStepWithExecutionTimeout(step, runPath, input, env, remainingExecutionMs, executionTimeoutMs);
|
|
33
42
|
stepResults.push(result.stepResult);
|
|
34
43
|
outputs[`step.${step.name}.json`] = result.responseBody;
|
|
35
44
|
continue;
|
|
@@ -38,4 +47,22 @@ async function runHost(manifest, bundlePath, input) {
|
|
|
38
47
|
}
|
|
39
48
|
return { outputs, stepResults };
|
|
40
49
|
}
|
|
50
|
+
async function runHttpStepWithExecutionTimeout(step, runPath, input, env, remainingExecutionMs, executionTimeoutMs) {
|
|
51
|
+
if (remainingExecutionMs === undefined) {
|
|
52
|
+
return (0, httpStep_1.runHttpStep)(step, runPath, input, env);
|
|
53
|
+
}
|
|
54
|
+
if (remainingExecutionMs <= 0) {
|
|
55
|
+
throw new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs, step.name));
|
|
56
|
+
}
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
const timer = setTimeout(() => {
|
|
59
|
+
controller.abort(new errors_1.SpellError((0, runtimeLimits_1.formatExecutionTimeoutMessage)(executionTimeoutMs, step.name)));
|
|
60
|
+
}, remainingExecutionMs);
|
|
61
|
+
try {
|
|
62
|
+
return await (0, httpStep_1.runHttpStep)(step, runPath, input, env, controller.signal);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
clearTimeout(timer);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
41
68
|
//# sourceMappingURL=hostRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostRunner.js","sourceRoot":"","sources":["../../src/runner/hostRunner.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"hostRunner.js","sourceRoot":"","sources":["../../src/runner/hostRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const DEFAULT_RUNTIME_INPUT_MAX_BYTES: number;
|
|
2
|
+
export declare const DEFAULT_RUNTIME_STEP_TIMEOUT_MS = 60000;
|
|
3
|
+
export declare function readRuntimeInputMaxBytes(env?: NodeJS.ProcessEnv): number;
|
|
4
|
+
export declare function readRuntimeStepTimeoutMs(env?: NodeJS.ProcessEnv): number;
|
|
5
|
+
export declare function readRuntimeExecutionTimeoutMs(env?: NodeJS.ProcessEnv): number | undefined;
|
|
6
|
+
export declare function formatExecutionTimeoutMessage(timeoutMs: number, stepName?: string): string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RUNTIME_STEP_TIMEOUT_MS = exports.DEFAULT_RUNTIME_INPUT_MAX_BYTES = void 0;
|
|
4
|
+
exports.readRuntimeInputMaxBytes = readRuntimeInputMaxBytes;
|
|
5
|
+
exports.readRuntimeStepTimeoutMs = readRuntimeStepTimeoutMs;
|
|
6
|
+
exports.readRuntimeExecutionTimeoutMs = readRuntimeExecutionTimeoutMs;
|
|
7
|
+
exports.formatExecutionTimeoutMessage = formatExecutionTimeoutMessage;
|
|
8
|
+
const errors_1 = require("../util/errors");
|
|
9
|
+
exports.DEFAULT_RUNTIME_INPUT_MAX_BYTES = 64 * 1024;
|
|
10
|
+
exports.DEFAULT_RUNTIME_STEP_TIMEOUT_MS = 60_000;
|
|
11
|
+
function readRuntimeInputMaxBytes(env = process.env) {
|
|
12
|
+
return readPositiveIntegerEnv("SPELL_RUNTIME_INPUT_MAX_BYTES", exports.DEFAULT_RUNTIME_INPUT_MAX_BYTES, env);
|
|
13
|
+
}
|
|
14
|
+
function readRuntimeStepTimeoutMs(env = process.env) {
|
|
15
|
+
return readPositiveIntegerEnv("SPELL_RUNTIME_STEP_TIMEOUT_MS", exports.DEFAULT_RUNTIME_STEP_TIMEOUT_MS, env);
|
|
16
|
+
}
|
|
17
|
+
function readRuntimeExecutionTimeoutMs(env = process.env) {
|
|
18
|
+
const raw = env.SPELL_RUNTIME_EXECUTION_TIMEOUT_MS;
|
|
19
|
+
if (raw === undefined || raw.trim() === "") {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const value = Number(raw);
|
|
23
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
24
|
+
throw new errors_1.SpellError("SPELL_RUNTIME_EXECUTION_TIMEOUT_MS must be an integer >= 0");
|
|
25
|
+
}
|
|
26
|
+
if (value === 0) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function formatExecutionTimeoutMessage(timeoutMs, stepName) {
|
|
32
|
+
if (stepName) {
|
|
33
|
+
return `cast execution timed out after ${timeoutMs}ms while running step '${stepName}'`;
|
|
34
|
+
}
|
|
35
|
+
return `cast execution timed out after ${timeoutMs}ms`;
|
|
36
|
+
}
|
|
37
|
+
function readPositiveIntegerEnv(name, fallback, env) {
|
|
38
|
+
const raw = env[name];
|
|
39
|
+
if (raw === undefined || raw.trim() === "") {
|
|
40
|
+
return fallback;
|
|
41
|
+
}
|
|
42
|
+
const value = Number(raw);
|
|
43
|
+
if (!Number.isInteger(value) || value < 1) {
|
|
44
|
+
throw new errors_1.SpellError(`${name} must be an integer >= 1`);
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=runtimeLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeLimits.js","sourceRoot":"","sources":["../../src/runner/runtimeLimits.ts"],"names":[],"mappings":";;;AAKA,4DAEC;AAED,4DAEC;AAED,sEAgBC;AAED,sEAMC;AArCD,2CAA4C;AAE/B,QAAA,+BAA+B,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,QAAA,+BAA+B,GAAG,MAAM,CAAC;AAEtD,SAAgB,wBAAwB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3E,OAAO,sBAAsB,CAAC,+BAA+B,EAAE,uCAA+B,EAAE,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,SAAgB,wBAAwB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3E,OAAO,sBAAsB,CAAC,+BAA+B,EAAE,uCAA+B,EAAE,GAAG,CAAC,CAAC;AACvG,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChF,MAAM,GAAG,GAAG,GAAG,CAAC,kCAAkC,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAU,CAAC,4DAA4D,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,6BAA6B,CAAC,SAAiB,EAAE,QAAiB;IAChF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,kCAAkC,SAAS,0BAA0B,QAAQ,GAAG,CAAC;IAC1F,CAAC;IAED,OAAO,kCAAkC,SAAS,IAAI,CAAC;AACzD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,QAAgB,EAAE,GAAsB;IACpF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAU,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/steps/httpStep.d.ts
CHANGED
|
@@ -4,4 +4,4 @@ export interface HttpStepExecution {
|
|
|
4
4
|
responseBody: unknown;
|
|
5
5
|
status: number;
|
|
6
6
|
}
|
|
7
|
-
export declare function runHttpStep(step: SpellStep, runPath: string, input: Record<string, unknown>, env: NodeJS.ProcessEnv): Promise<HttpStepExecution>;
|
|
7
|
+
export declare function runHttpStep(step: SpellStep, runPath: string, input: Record<string, unknown>, env: NodeJS.ProcessEnv, signal?: AbortSignal): Promise<HttpStepExecution>;
|
package/dist/steps/httpStep.js
CHANGED
|
@@ -5,7 +5,7 @@ const promises_1 = require("node:fs/promises");
|
|
|
5
5
|
const errors_1 = require("../util/errors");
|
|
6
6
|
const http_1 = require("../util/http");
|
|
7
7
|
const template_1 = require("../util/template");
|
|
8
|
-
async function runHttpStep(step, runPath, input, env) {
|
|
8
|
+
async function runHttpStep(step, runPath, input, env, signal) {
|
|
9
9
|
const started = new Date().toISOString();
|
|
10
10
|
const raw = await (0, promises_1.readFile)(runPath, "utf8");
|
|
11
11
|
let parsed;
|
|
@@ -43,11 +43,25 @@ async function runHttpStep(step, runPath, input, env) {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
let response;
|
|
47
|
+
try {
|
|
48
|
+
response = await (0, http_1.fetchHttp)(resolvedUrl, {
|
|
49
|
+
method: resolvedMethod,
|
|
50
|
+
headers,
|
|
51
|
+
body,
|
|
52
|
+
signal
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (signal?.aborted) {
|
|
57
|
+
const reason = signal.reason;
|
|
58
|
+
if (reason instanceof Error) {
|
|
59
|
+
throw reason;
|
|
60
|
+
}
|
|
61
|
+
throw new errors_1.SpellError(`http step '${step.name}' aborted`);
|
|
62
|
+
}
|
|
63
|
+
throw new errors_1.SpellError(`http step '${step.name}' request failed: ${error.message}`);
|
|
64
|
+
}
|
|
51
65
|
const responseText = await response.text();
|
|
52
66
|
let responseBody;
|
|
53
67
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpStep.js","sourceRoot":"","sources":["../../src/steps/httpStep.ts"],"names":[],"mappings":";;AAmBA,
|
|
1
|
+
{"version":3,"file":"httpStep.js","sourceRoot":"","sources":["../../src/steps/httpStep.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,8 @@ export interface ShellStepExecution {
|
|
|
4
4
|
stdout: string;
|
|
5
5
|
stderr: string;
|
|
6
6
|
}
|
|
7
|
-
export
|
|
7
|
+
export interface ShellStepRunOptions {
|
|
8
|
+
maxDurationMs?: number;
|
|
9
|
+
executionTimeoutMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function runShellStep(step: SpellStep, runPath: string, cwd: string, env: NodeJS.ProcessEnv, options?: ShellStepRunOptions): Promise<ShellStepExecution>;
|