@executor-js/runtime-quickjs 0.0.1 → 0.1.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/README.md +12 -13
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# @executor/runtime-quickjs
|
|
1
|
+
# @executor-js/runtime-quickjs
|
|
2
2
|
|
|
3
|
-
[QuickJS](https://github.com/justjake/quickjs-emscripten) sandbox runtime for `@executor/execution`. Runs untrusted TypeScript/JavaScript in a WASM-backed interpreter with configurable timeout, memory limit, and stack size — safe enough to execute LLM-generated code that calls your registered tools.
|
|
3
|
+
[QuickJS](https://github.com/justjake/quickjs-emscripten) sandbox runtime for `@executor-js/execution`. Runs untrusted TypeScript/JavaScript in a WASM-backed interpreter with configurable timeout, memory limit, and stack size — safe enough to execute LLM-generated code that calls your registered tools.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
7
|
```sh
|
|
8
|
-
bun add @executor/execution @executor/runtime-quickjs
|
|
8
|
+
bun add @executor-js/execution @executor-js/runtime-quickjs
|
|
9
9
|
# or
|
|
10
|
-
npm install @executor/execution @executor/runtime-quickjs
|
|
10
|
+
npm install @executor-js/execution @executor-js/runtime-quickjs
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Usage
|
|
@@ -15,11 +15,11 @@ npm install @executor/execution @executor/runtime-quickjs
|
|
|
15
15
|
Pass a `makeQuickJsExecutor()` as the `codeExecutor` when building the execution engine:
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
-
import { createExecutor } from "@executor/sdk";
|
|
19
|
-
import { createExecutionEngine } from "@executor/execution";
|
|
20
|
-
import { makeQuickJsExecutor } from "@executor/runtime-quickjs";
|
|
18
|
+
import { createExecutor } from "@executor-js/sdk";
|
|
19
|
+
import { createExecutionEngine } from "@executor-js/execution";
|
|
20
|
+
import { makeQuickJsExecutor } from "@executor-js/runtime-quickjs";
|
|
21
21
|
|
|
22
|
-
const executor = await createExecutor({
|
|
22
|
+
const executor = await createExecutor({ onElicitation: "accept-all" });
|
|
23
23
|
|
|
24
24
|
const engine = createExecutionEngine({
|
|
25
25
|
executor,
|
|
@@ -42,14 +42,13 @@ const engine = createExecutionEngine({
|
|
|
42
42
|
### Swapping the QuickJS build
|
|
43
43
|
|
|
44
44
|
```ts
|
|
45
|
-
import { setQuickJSModule } from "@executor/runtime-quickjs";
|
|
46
|
-
import {
|
|
47
|
-
import variant from "@jitl/quickjs-ng-wasmfile-release-sync";
|
|
45
|
+
import { setQuickJSModule } from "@executor-js/runtime-quickjs";
|
|
46
|
+
import { newQuickJSWASMModule } from "quickjs-emscripten";
|
|
48
47
|
|
|
49
|
-
setQuickJSModule(await
|
|
48
|
+
setQuickJSModule(await newQuickJSWASMModule());
|
|
50
49
|
```
|
|
51
50
|
|
|
52
|
-
Use this when you want a different WASM variant (e.g. debug builds, QuickJS-NG) than the default bundled one.
|
|
51
|
+
Use this when you want a different WASM variant (e.g. debug builds, QuickJS-NG) than the default bundled one. `newQuickJSWASMModule()` defaults to the release-sync variant; pass a different `@jitl/quickjs-*` variant to swap it.
|
|
53
52
|
|
|
54
53
|
## Status
|
|
55
54
|
|
package/dist/index.d.ts
CHANGED
|
@@ -6,5 +6,13 @@ export type QuickJsExecutorOptions = {
|
|
|
6
6
|
maxStackSizeBytes?: number;
|
|
7
7
|
};
|
|
8
8
|
export declare const setQuickJSModule: (mod: QuickJSWASMModule) => void;
|
|
9
|
-
|
|
9
|
+
declare const QuickJsExecutionError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
10
|
+
readonly _tag: "QuickJsExecutionError";
|
|
11
|
+
} & Readonly<A>;
|
|
12
|
+
declare class QuickJsExecutionError extends QuickJsExecutionError_base<{
|
|
13
|
+
readonly message: string;
|
|
14
|
+
}> {
|
|
15
|
+
}
|
|
16
|
+
export declare const makeQuickJsExecutor: (options?: QuickJsExecutorOptions) => CodeExecutor<QuickJsExecutionError>;
|
|
17
|
+
export {};
|
|
10
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAKF,eAAO,MAAM,gBAAgB,GAAI,KAAK,iBAAiB,SAEtD,CAAC;;;;AAKF,cAAM,qBAAsB,SAAQ,2BAA0C;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAmXL,eAAO,MAAM,mBAAmB,GAC9B,UAAS,sBAA2B,KACnC,YAAY,CAAC,qBAAqB,CAGnC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,14 +20,14 @@ var EXECUTION_FILENAME = "executor-quickjs-runtime.js";
|
|
|
20
20
|
var toError = (cause) => cause instanceof Error ? cause : new Error(String(cause));
|
|
21
21
|
var toErrorMessage = (cause) => {
|
|
22
22
|
if (typeof cause === "object" && cause !== null) {
|
|
23
|
-
const stack = "stack" in cause && typeof cause.stack === "string" ? cause.stack : void 0;
|
|
24
23
|
const message = "message" in cause && typeof cause.message === "string" ? cause.message : void 0;
|
|
25
|
-
if (stack) {
|
|
26
|
-
return stack;
|
|
27
|
-
}
|
|
28
24
|
if (message) {
|
|
29
25
|
return message;
|
|
30
26
|
}
|
|
27
|
+
const stack = "stack" in cause && typeof cause.stack === "string" ? cause.stack : void 0;
|
|
28
|
+
if (stack) {
|
|
29
|
+
return stack;
|
|
30
|
+
}
|
|
31
31
|
}
|
|
32
32
|
const error = toError(cause);
|
|
33
33
|
return error.stack ?? error.message;
|
|
@@ -96,34 +96,34 @@ var buildExecutionSource = (code) => {
|
|
|
96
96
|
"})()"
|
|
97
97
|
].join("\n");
|
|
98
98
|
};
|
|
99
|
-
var readPropDump = (
|
|
100
|
-
const prop =
|
|
99
|
+
var readPropDump = (context2, handle, key) => {
|
|
100
|
+
const prop = context2.getProp(handle, key);
|
|
101
101
|
try {
|
|
102
|
-
return
|
|
102
|
+
return context2.dump(prop);
|
|
103
103
|
} finally {
|
|
104
104
|
prop.dispose();
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
|
-
var readResultState = (
|
|
108
|
-
settled: readPropDump(
|
|
109
|
-
value: readPropDump(
|
|
110
|
-
error: readPropDump(
|
|
107
|
+
var readResultState = (context2, handle) => ({
|
|
108
|
+
settled: readPropDump(context2, handle, "settled") === true,
|
|
109
|
+
value: readPropDump(context2, handle, "v"),
|
|
110
|
+
error: readPropDump(context2, handle, "e")
|
|
111
111
|
});
|
|
112
|
-
var createLogBridge = (
|
|
113
|
-
const level =
|
|
114
|
-
const line =
|
|
112
|
+
var createLogBridge = (context2, logs) => context2.newFunction("__executor_log", (levelHandle, lineHandle) => {
|
|
113
|
+
const level = context2.getString(levelHandle);
|
|
114
|
+
const line = context2.getString(lineHandle);
|
|
115
115
|
logs.push(`[${level}] ${line}`);
|
|
116
|
-
return
|
|
116
|
+
return context2.undefined;
|
|
117
117
|
});
|
|
118
|
-
var createToolBridge = (
|
|
119
|
-
const path =
|
|
120
|
-
const args = argsHandle === void 0 ||
|
|
121
|
-
const deferred =
|
|
118
|
+
var createToolBridge = (context2, toolInvoker, pendingDeferreds, runPromise) => context2.newFunction("__executor_invokeTool", (pathHandle, argsHandle) => {
|
|
119
|
+
const path = context2.getString(pathHandle);
|
|
120
|
+
const args = argsHandle === void 0 || context2.typeof(argsHandle) === "undefined" ? void 0 : context2.dump(argsHandle);
|
|
121
|
+
const deferred = context2.newPromise();
|
|
122
122
|
pendingDeferreds.add(deferred);
|
|
123
123
|
deferred.settled.finally(() => {
|
|
124
124
|
pendingDeferreds.delete(deferred);
|
|
125
125
|
});
|
|
126
|
-
void
|
|
126
|
+
void runPromise(toolInvoker.invoke({ path, args })).then(
|
|
127
127
|
(value) => {
|
|
128
128
|
if (!deferred.alive) {
|
|
129
129
|
return;
|
|
@@ -133,7 +133,7 @@ var createToolBridge = (context, toolInvoker, pendingDeferreds) => context.newFu
|
|
|
133
133
|
deferred.resolve();
|
|
134
134
|
return;
|
|
135
135
|
}
|
|
136
|
-
const valueHandle =
|
|
136
|
+
const valueHandle = context2.newString(serialized);
|
|
137
137
|
deferred.resolve(valueHandle);
|
|
138
138
|
valueHandle.dispose();
|
|
139
139
|
},
|
|
@@ -141,21 +141,21 @@ var createToolBridge = (context, toolInvoker, pendingDeferreds) => context.newFu
|
|
|
141
141
|
if (!deferred.alive) {
|
|
142
142
|
return;
|
|
143
143
|
}
|
|
144
|
-
const errorHandle =
|
|
144
|
+
const errorHandle = context2.newError(toErrorMessage(cause));
|
|
145
145
|
deferred.reject(errorHandle);
|
|
146
146
|
errorHandle.dispose();
|
|
147
147
|
}
|
|
148
148
|
);
|
|
149
149
|
return deferred.handle;
|
|
150
150
|
});
|
|
151
|
-
var drainJobs = (
|
|
151
|
+
var drainJobs = (context2, runtime, deadlineMs, timeoutMs) => {
|
|
152
152
|
while (runtime.hasPendingJob()) {
|
|
153
153
|
if (Date.now() >= deadlineMs) {
|
|
154
154
|
throw new Error(timeoutMessage(timeoutMs));
|
|
155
155
|
}
|
|
156
156
|
const pending = runtime.executePendingJobs();
|
|
157
157
|
if (pending.error) {
|
|
158
|
-
const error =
|
|
158
|
+
const error = context2.dump(pending.error);
|
|
159
159
|
pending.error.dispose();
|
|
160
160
|
throw toError(error);
|
|
161
161
|
}
|
|
@@ -180,15 +180,15 @@ var waitForDeferreds = async (pendingDeferreds, deadlineMs, timeoutMs) => {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
};
|
|
183
|
-
var drainAsync = async (
|
|
184
|
-
drainJobs(
|
|
183
|
+
var drainAsync = async (context2, runtime, pendingDeferreds, deadlineMs, timeoutMs) => {
|
|
184
|
+
drainJobs(context2, runtime, deadlineMs, timeoutMs);
|
|
185
185
|
while (pendingDeferreds.size > 0) {
|
|
186
186
|
await waitForDeferreds(pendingDeferreds, deadlineMs, timeoutMs);
|
|
187
|
-
drainJobs(
|
|
187
|
+
drainJobs(context2, runtime, deadlineMs, timeoutMs);
|
|
188
188
|
}
|
|
189
|
-
drainJobs(
|
|
189
|
+
drainJobs(context2, runtime, deadlineMs, timeoutMs);
|
|
190
190
|
};
|
|
191
|
-
var evaluateInQuickJs = async (options, code, toolInvoker) => {
|
|
191
|
+
var evaluateInQuickJs = async (options, code, toolInvoker, runPromise) => {
|
|
192
192
|
const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
193
193
|
const deadlineMs = Date.now() + timeoutMs;
|
|
194
194
|
const logs = [];
|
|
@@ -203,17 +203,17 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
|
|
|
203
203
|
runtime.setMaxStackSize(options.maxStackSizeBytes);
|
|
204
204
|
}
|
|
205
205
|
runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));
|
|
206
|
-
const
|
|
206
|
+
const context2 = runtime.newContext();
|
|
207
207
|
try {
|
|
208
|
-
const logBridge = createLogBridge(
|
|
209
|
-
|
|
208
|
+
const logBridge = createLogBridge(context2, logs);
|
|
209
|
+
context2.setProp(context2.global, "__executor_log", logBridge);
|
|
210
210
|
logBridge.dispose();
|
|
211
|
-
const toolBridge = createToolBridge(
|
|
212
|
-
|
|
211
|
+
const toolBridge = createToolBridge(context2, toolInvoker, pendingDeferreds, runPromise);
|
|
212
|
+
context2.setProp(context2.global, "__executor_invokeTool", toolBridge);
|
|
213
213
|
toolBridge.dispose();
|
|
214
|
-
const evaluated =
|
|
214
|
+
const evaluated = context2.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);
|
|
215
215
|
if (evaluated.error) {
|
|
216
|
-
const error =
|
|
216
|
+
const error = context2.dump(evaluated.error);
|
|
217
217
|
evaluated.error.dispose();
|
|
218
218
|
return {
|
|
219
219
|
result: null,
|
|
@@ -221,13 +221,13 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
|
|
|
221
221
|
logs
|
|
222
222
|
};
|
|
223
223
|
}
|
|
224
|
-
|
|
224
|
+
context2.setProp(context2.global, "__executor_result", evaluated.value);
|
|
225
225
|
evaluated.value.dispose();
|
|
226
|
-
const stateResult =
|
|
226
|
+
const stateResult = context2.evalCode(
|
|
227
227
|
"(function(p){ var s = { v: void 0, e: void 0, settled: false }; var formatError = function(e){ if (e && typeof e === 'object') { var message = typeof e.message === 'string' ? e.message : ''; var stack = typeof e.stack === 'string' ? e.stack : ''; if (message && stack) { return stack.indexOf(message) === -1 ? message + '\\n' + stack : stack; } if (message) return message; if (stack) return stack; } return String(e); }; p.then(function(v){ s.v = v; s.settled = true; }, function(e){ s.e = formatError(e); s.settled = true; }); return s; })(__executor_result)"
|
|
228
228
|
);
|
|
229
229
|
if (stateResult.error) {
|
|
230
|
-
const error =
|
|
230
|
+
const error = context2.dump(stateResult.error);
|
|
231
231
|
stateResult.error.dispose();
|
|
232
232
|
return {
|
|
233
233
|
result: null,
|
|
@@ -237,8 +237,8 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
|
|
|
237
237
|
}
|
|
238
238
|
const stateHandle = stateResult.value;
|
|
239
239
|
try {
|
|
240
|
-
await drainAsync(
|
|
241
|
-
const state = readResultState(
|
|
240
|
+
await drainAsync(context2, runtime, pendingDeferreds, deadlineMs, timeoutMs);
|
|
241
|
+
const state = readResultState(context2, stateHandle);
|
|
242
242
|
if (!state.settled) {
|
|
243
243
|
return {
|
|
244
244
|
result: null,
|
|
@@ -267,7 +267,7 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
|
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
pendingDeferreds.clear();
|
|
270
|
-
|
|
270
|
+
context2.dispose();
|
|
271
271
|
}
|
|
272
272
|
} catch (cause) {
|
|
273
273
|
return {
|
|
@@ -279,10 +279,18 @@ var evaluateInQuickJs = async (options, code, toolInvoker) => {
|
|
|
279
279
|
runtime.dispose();
|
|
280
280
|
}
|
|
281
281
|
};
|
|
282
|
-
var runInQuickJs = (options, code, toolInvoker) => Effect.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
282
|
+
var runInQuickJs = (options, code, toolInvoker) => Effect.gen(function* () {
|
|
283
|
+
const context2 = yield* Effect.context();
|
|
284
|
+
const runPromise = Effect.runPromiseWith(context2);
|
|
285
|
+
return yield* Effect.tryPromise({
|
|
286
|
+
try: () => evaluateInQuickJs(options, code, toolInvoker, runPromise),
|
|
287
|
+
catch: (cause) => new QuickJsExecutionError({ message: String(cause) })
|
|
288
|
+
});
|
|
289
|
+
}).pipe(
|
|
290
|
+
Effect.withSpan("executor.code.exec.quickjs", {
|
|
291
|
+
attributes: { "executor.runtime": "quickjs" }
|
|
292
|
+
})
|
|
293
|
+
);
|
|
286
294
|
var makeQuickJsExecutor = (options = {}) => ({
|
|
287
295
|
execute: (code, toolInvoker) => runInQuickJs(options, code, toolInvoker)
|
|
288
296
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n recoverExecutionBody,\n type CodeExecutor,\n type ExecuteResult,\n type SandboxToolInvoker,\n} from \"@executor/codemode-core\";\nimport * as Data from \"effect/Data\";\nimport * as Effect from \"effect/Effect\";\nimport {\n getQuickJS,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSDeferredPromise,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nexport type QuickJsExecutorOptions = {\n timeoutMs?: number;\n memoryLimitBytes?: number;\n maxStackSizeBytes?: number;\n};\n\n// Allow pre-loading a QuickJS module (e.g. with custom WASM bytes for compiled binaries)\nlet preloadedModule: QuickJSWASMModule | null = null;\n\nexport const setQuickJSModule = (mod: QuickJSWASMModule) => {\n preloadedModule = mod;\n};\n\nconst resolveQuickJS = (): Promise<QuickJSWASMModule> =>\n preloadedModule ? Promise.resolve(preloadedModule) : getQuickJS();\n\nclass QuickJsExecutionError extends Data.TaggedError(\"QuickJsExecutionError\")<{\n readonly message: string;\n}> {}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60_000;\nconst EXECUTION_FILENAME = \"executor-quickjs-runtime.js\";\n\nconst toError = (cause: unknown): Error =>\n cause instanceof Error ? cause : new Error(String(cause));\n\nconst toErrorMessage = (cause: unknown): string => {\n if (typeof cause === \"object\" && cause !== null) {\n const stack = \"stack\" in cause && typeof cause.stack === \"string\" ? cause.stack : undefined;\n const message =\n \"message\" in cause && typeof cause.message === \"string\" ? cause.message : undefined;\n\n if (stack) {\n return stack;\n }\n\n if (message) {\n return message;\n }\n }\n\n const error = toError(cause);\n return error.stack ?? error.message;\n};\n\nconst serializeJson = (value: unknown, label: string): string | undefined => {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n\n try {\n return JSON.stringify(value);\n } catch (cause) {\n throw new Error(`${label} is not JSON serializable: ${toError(cause).message}`);\n }\n};\n\nconst looksLikeInterruptedError = (message: string): boolean => /\\binterrupted\\b/i.test(message);\n\nconst timeoutMessage = (timeoutMs: number): string =>\n `QuickJS execution timed out after ${timeoutMs}ms`;\n\nconst normalizeExecutionError = (cause: unknown, deadlineMs: number, timeoutMs: number): string => {\n const message = toErrorMessage(cause);\n return Date.now() >= deadlineMs && looksLikeInterruptedError(message)\n ? timeoutMessage(timeoutMs)\n : message;\n};\n\nconst buildExecutionSource = (code: string): string => {\n const body = recoverExecutionBody(code);\n\n return [\n '\"use strict\";',\n \"const __invokeTool = __executor_invokeTool;\",\n \"const __log = __executor_log;\",\n \"try { delete globalThis.__executor_invokeTool; } catch {}\",\n \"try { delete globalThis.__executor_log; } catch {}\",\n \"const __formatLogArg = (value) => {\",\n \" if (typeof value === 'string') return value;\",\n \" try {\",\n \" return JSON.stringify(value);\",\n \" } catch {\",\n \" return String(value);\",\n \" }\",\n \"};\",\n \"const __formatLogLine = (args) => args.map(__formatLogArg).join(' ');\",\n \"const __makeToolsProxy = (path = []) => new Proxy(() => undefined, {\",\n \" get(_target, prop) {\",\n \" if (prop === 'then' || typeof prop === 'symbol') {\",\n \" return undefined;\",\n \" }\",\n \" return __makeToolsProxy([...path, String(prop)]);\",\n \" },\",\n \" apply(_target, _thisArg, args) {\",\n \" const toolPath = path.join('.');\",\n \" if (!toolPath) {\",\n \" throw new Error('Tool path missing in invocation');\",\n \" }\",\n \" return Promise.resolve(__invokeTool(toolPath, args[0])).then((raw) => raw === undefined ? undefined : JSON.parse(raw));\",\n \" },\",\n \"});\",\n \"const tools = __makeToolsProxy();\",\n \"const console = {\",\n \" log: (...args) => __log('log', __formatLogLine(args)),\",\n \" warn: (...args) => __log('warn', __formatLogLine(args)),\",\n \" error: (...args) => __log('error', __formatLogLine(args)),\",\n \" info: (...args) => __log('info', __formatLogLine(args)),\",\n \" debug: (...args) => __log('debug', __formatLogLine(args)),\",\n \"};\",\n \"const fetch = (..._args) => {\",\n \" throw new Error('fetch is disabled in QuickJS executor');\",\n \"};\",\n \"(async () => {\",\n body,\n \"})()\",\n ].join(\"\\n\");\n};\n\nconst readPropDump = (context: QuickJSContext, handle: QuickJSHandle, key: string): unknown => {\n const prop = context.getProp(handle, key);\n try {\n return context.dump(prop);\n } finally {\n prop.dispose();\n }\n};\n\nconst readResultState = (\n context: QuickJSContext,\n handle: QuickJSHandle,\n): {\n settled: boolean;\n value: unknown;\n error: unknown;\n} => ({\n settled: readPropDump(context, handle, \"settled\") === true,\n value: readPropDump(context, handle, \"v\"),\n error: readPropDump(context, handle, \"e\"),\n});\n\nconst createLogBridge = (context: QuickJSContext, logs: string[]): QuickJSHandle =>\n context.newFunction(\"__executor_log\", (levelHandle, lineHandle) => {\n const level = context.getString(levelHandle);\n const line = context.getString(lineHandle);\n logs.push(`[${level}] ${line}`);\n return context.undefined;\n });\n\nconst createToolBridge = (\n context: QuickJSContext,\n toolInvoker: SandboxToolInvoker,\n pendingDeferreds: Set<QuickJSDeferredPromise>,\n): QuickJSHandle =>\n context.newFunction(\"__executor_invokeTool\", (pathHandle, argsHandle) => {\n const path = context.getString(pathHandle);\n const args =\n argsHandle === undefined || context.typeof(argsHandle) === \"undefined\"\n ? undefined\n : context.dump(argsHandle);\n const deferred = context.newPromise();\n pendingDeferreds.add(deferred);\n deferred.settled.finally(() => {\n pendingDeferreds.delete(deferred);\n });\n\n void Effect.runPromise(toolInvoker.invoke({ path, args })).then(\n (value) => {\n if (!deferred.alive) {\n return;\n }\n\n const serialized = serializeJson(value, `Tool result for ${path}`);\n if (typeof serialized === \"undefined\") {\n deferred.resolve();\n return;\n }\n\n const valueHandle = context.newString(serialized);\n deferred.resolve(valueHandle);\n valueHandle.dispose();\n },\n (cause) => {\n if (!deferred.alive) {\n return;\n }\n\n const errorHandle = context.newError(toErrorMessage(cause));\n deferred.reject(errorHandle);\n errorHandle.dispose();\n },\n );\n\n return deferred.handle;\n });\n\nconst drainJobs = (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n deadlineMs: number,\n timeoutMs: number,\n): void => {\n while (runtime.hasPendingJob()) {\n if (Date.now() >= deadlineMs) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n const pending = runtime.executePendingJobs();\n if (pending.error) {\n const error = context.dump(pending.error);\n pending.error.dispose();\n throw toError(error);\n }\n }\n};\n\nconst waitForDeferreds = async (\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.race([...pendingDeferreds].map((deferred) => deferred.settled)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(timeoutMessage(timeoutMs))), remainingMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n};\n\nconst drainAsync = async (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n\n while (pendingDeferreds.size > 0) {\n await waitForDeferreds(pendingDeferreds, deadlineMs, timeoutMs);\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n }\n\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n};\n\nconst evaluateInQuickJs = async (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n): Promise<ExecuteResult> => {\n const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n const deadlineMs = Date.now() + timeoutMs;\n const logs: string[] = [];\n const pendingDeferreds = new Set<QuickJSDeferredPromise>();\n const QuickJS = await resolveQuickJS();\n const runtime = QuickJS.newRuntime();\n\n try {\n if (options.memoryLimitBytes !== undefined) {\n runtime.setMemoryLimit(options.memoryLimitBytes);\n }\n\n if (options.maxStackSizeBytes !== undefined) {\n runtime.setMaxStackSize(options.maxStackSizeBytes);\n }\n\n runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));\n\n const context = runtime.newContext();\n try {\n const logBridge = createLogBridge(context, logs);\n context.setProp(context.global, \"__executor_log\", logBridge);\n logBridge.dispose();\n\n const toolBridge = createToolBridge(context, toolInvoker, pendingDeferreds);\n context.setProp(context.global, \"__executor_invokeTool\", toolBridge);\n toolBridge.dispose();\n\n const evaluated = context.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);\n if (evaluated.error) {\n const error = context.dump(evaluated.error);\n evaluated.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n context.setProp(context.global, \"__executor_result\", evaluated.value);\n evaluated.value.dispose();\n\n const stateResult = context.evalCode(\n \"(function(p){ var s = { v: void 0, e: void 0, settled: false }; var formatError = function(e){ if (e && typeof e === 'object') { var message = typeof e.message === 'string' ? e.message : ''; var stack = typeof e.stack === 'string' ? e.stack : ''; if (message && stack) { return stack.indexOf(message) === -1 ? message + '\\\\n' + stack : stack; } if (message) return message; if (stack) return stack; } return String(e); }; p.then(function(v){ s.v = v; s.settled = true; }, function(e){ s.e = formatError(e); s.settled = true; }); return s; })(__executor_result)\",\n );\n if (stateResult.error) {\n const error = context.dump(stateResult.error);\n stateResult.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n const stateHandle = stateResult.value;\n try {\n await drainAsync(context, runtime, pendingDeferreds, deadlineMs, timeoutMs);\n const state = readResultState(context, stateHandle);\n if (!state.settled) {\n return {\n result: null,\n error: timeoutMessage(timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n if (typeof state.error !== \"undefined\") {\n return {\n result: null,\n error: normalizeExecutionError(state.error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n return {\n result: state.value,\n logs,\n } satisfies ExecuteResult;\n } finally {\n stateHandle.dispose();\n }\n } finally {\n for (const deferred of pendingDeferreds) {\n if (deferred.alive) {\n deferred.dispose();\n }\n }\n\n pendingDeferreds.clear();\n context.dispose();\n }\n } catch (cause) {\n return {\n result: null,\n error: normalizeExecutionError(cause, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n } finally {\n runtime.dispose();\n }\n};\n\nconst runInQuickJs = (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n): Effect.Effect<ExecuteResult, QuickJsExecutionError> =>\n Effect.tryPromise({\n try: () => evaluateInQuickJs(options, code, toolInvoker),\n catch: (cause) => new QuickJsExecutionError({ message: String(cause) }),\n });\n\nexport const makeQuickJsExecutor = (options: QuickJsExecutorOptions = {}): CodeExecutor => ({\n execute: (code: string, toolInvoker: SandboxToolInvoker) =>\n runInQuickJs(options, code, toolInvoker),\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n recoverExecutionBody,\n type CodeExecutor,\n type ExecuteResult,\n type SandboxToolInvoker,\n} from \"@executor-js/codemode-core\";\nimport * as Data from \"effect/Data\";\nimport * as Effect from \"effect/Effect\";\nimport {\n getQuickJS,\n shouldInterruptAfterDeadline,\n type QuickJSContext,\n type QuickJSDeferredPromise,\n type QuickJSHandle,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from \"quickjs-emscripten\";\n\nexport type QuickJsExecutorOptions = {\n timeoutMs?: number;\n memoryLimitBytes?: number;\n maxStackSizeBytes?: number;\n};\n\n// Allow pre-loading a QuickJS module (e.g. with custom WASM bytes for compiled binaries)\nlet preloadedModule: QuickJSWASMModule | null = null;\n\nexport const setQuickJSModule = (mod: QuickJSWASMModule) => {\n preloadedModule = mod;\n};\n\nconst resolveQuickJS = (): Promise<QuickJSWASMModule> =>\n preloadedModule ? Promise.resolve(preloadedModule) : getQuickJS();\n\nclass QuickJsExecutionError extends Data.TaggedError(\"QuickJsExecutionError\")<{\n readonly message: string;\n}> {}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60_000;\nconst EXECUTION_FILENAME = \"executor-quickjs-runtime.js\";\n\nconst toError = (cause: unknown): Error =>\n cause instanceof Error ? cause : new Error(String(cause));\n\nconst toErrorMessage = (cause: unknown): string => {\n if (typeof cause === \"object\" && cause !== null) {\n const message =\n \"message\" in cause && typeof cause.message === \"string\" ? cause.message : undefined;\n\n if (message) {\n return message;\n }\n\n const stack = \"stack\" in cause && typeof cause.stack === \"string\" ? cause.stack : undefined;\n\n if (stack) {\n return stack;\n }\n }\n\n const error = toError(cause);\n return error.stack ?? error.message;\n};\n\nconst serializeJson = (value: unknown, label: string): string | undefined => {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n\n try {\n return JSON.stringify(value);\n } catch (cause) {\n throw new Error(`${label} is not JSON serializable: ${toError(cause).message}`);\n }\n};\n\nconst looksLikeInterruptedError = (message: string): boolean => /\\binterrupted\\b/i.test(message);\n\nconst timeoutMessage = (timeoutMs: number): string =>\n `QuickJS execution timed out after ${timeoutMs}ms`;\n\nconst normalizeExecutionError = (cause: unknown, deadlineMs: number, timeoutMs: number): string => {\n const message = toErrorMessage(cause);\n return Date.now() >= deadlineMs && looksLikeInterruptedError(message)\n ? timeoutMessage(timeoutMs)\n : message;\n};\n\nconst buildExecutionSource = (code: string): string => {\n const body = recoverExecutionBody(code);\n\n return [\n '\"use strict\";',\n \"const __invokeTool = __executor_invokeTool;\",\n \"const __log = __executor_log;\",\n \"try { delete globalThis.__executor_invokeTool; } catch {}\",\n \"try { delete globalThis.__executor_log; } catch {}\",\n \"const __formatLogArg = (value) => {\",\n \" if (typeof value === 'string') return value;\",\n \" try {\",\n \" return JSON.stringify(value);\",\n \" } catch {\",\n \" return String(value);\",\n \" }\",\n \"};\",\n \"const __formatLogLine = (args) => args.map(__formatLogArg).join(' ');\",\n \"const __makeToolsProxy = (path = []) => new Proxy(() => undefined, {\",\n \" get(_target, prop) {\",\n \" if (prop === 'then' || typeof prop === 'symbol') {\",\n \" return undefined;\",\n \" }\",\n \" return __makeToolsProxy([...path, String(prop)]);\",\n \" },\",\n \" apply(_target, _thisArg, args) {\",\n \" const toolPath = path.join('.');\",\n \" if (!toolPath) {\",\n \" throw new Error('Tool path missing in invocation');\",\n \" }\",\n \" return Promise.resolve(__invokeTool(toolPath, args[0])).then((raw) => raw === undefined ? undefined : JSON.parse(raw));\",\n \" },\",\n \"});\",\n \"const tools = __makeToolsProxy();\",\n \"const console = {\",\n \" log: (...args) => __log('log', __formatLogLine(args)),\",\n \" warn: (...args) => __log('warn', __formatLogLine(args)),\",\n \" error: (...args) => __log('error', __formatLogLine(args)),\",\n \" info: (...args) => __log('info', __formatLogLine(args)),\",\n \" debug: (...args) => __log('debug', __formatLogLine(args)),\",\n \"};\",\n \"const fetch = (..._args) => {\",\n \" throw new Error('fetch is disabled in QuickJS executor');\",\n \"};\",\n \"(async () => {\",\n body,\n \"})()\",\n ].join(\"\\n\");\n};\n\nconst readPropDump = (context: QuickJSContext, handle: QuickJSHandle, key: string): unknown => {\n const prop = context.getProp(handle, key);\n try {\n return context.dump(prop);\n } finally {\n prop.dispose();\n }\n};\n\nconst readResultState = (\n context: QuickJSContext,\n handle: QuickJSHandle,\n): {\n settled: boolean;\n value: unknown;\n error: unknown;\n} => ({\n settled: readPropDump(context, handle, \"settled\") === true,\n value: readPropDump(context, handle, \"v\"),\n error: readPropDump(context, handle, \"e\"),\n});\n\nconst createLogBridge = (context: QuickJSContext, logs: string[]): QuickJSHandle =>\n context.newFunction(\"__executor_log\", (levelHandle, lineHandle) => {\n const level = context.getString(levelHandle);\n const line = context.getString(lineHandle);\n logs.push(`[${level}] ${line}`);\n return context.undefined;\n });\n\ntype RunPromise = <A, E>(effect: Effect.Effect<A, E>) => Promise<A>;\n\nconst createToolBridge = (\n context: QuickJSContext,\n toolInvoker: SandboxToolInvoker,\n pendingDeferreds: Set<QuickJSDeferredPromise>,\n runPromise: RunPromise,\n): QuickJSHandle =>\n context.newFunction(\"__executor_invokeTool\", (pathHandle, argsHandle) => {\n const path = context.getString(pathHandle);\n const args =\n argsHandle === undefined || context.typeof(argsHandle) === \"undefined\"\n ? undefined\n : context.dump(argsHandle);\n const deferred = context.newPromise();\n pendingDeferreds.add(deferred);\n deferred.settled.finally(() => {\n pendingDeferreds.delete(deferred);\n });\n\n void runPromise(toolInvoker.invoke({ path, args })).then(\n (value) => {\n if (!deferred.alive) {\n return;\n }\n\n const serialized = serializeJson(value, `Tool result for ${path}`);\n if (typeof serialized === \"undefined\") {\n deferred.resolve();\n return;\n }\n\n const valueHandle = context.newString(serialized);\n deferred.resolve(valueHandle);\n valueHandle.dispose();\n },\n (cause) => {\n if (!deferred.alive) {\n return;\n }\n\n const errorHandle = context.newError(toErrorMessage(cause));\n deferred.reject(errorHandle);\n errorHandle.dispose();\n },\n );\n\n return deferred.handle;\n });\n\nconst drainJobs = (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n deadlineMs: number,\n timeoutMs: number,\n): void => {\n while (runtime.hasPendingJob()) {\n if (Date.now() >= deadlineMs) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n const pending = runtime.executePendingJobs();\n if (pending.error) {\n const error = context.dump(pending.error);\n pending.error.dispose();\n throw toError(error);\n }\n }\n};\n\nconst waitForDeferreds = async (\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) {\n throw new Error(timeoutMessage(timeoutMs));\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.race([...pendingDeferreds].map((deferred) => deferred.settled)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(timeoutMessage(timeoutMs))), remainingMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n};\n\nconst drainAsync = async (\n context: QuickJSContext,\n runtime: QuickJSRuntime,\n pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>,\n deadlineMs: number,\n timeoutMs: number,\n): Promise<void> => {\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n\n while (pendingDeferreds.size > 0) {\n await waitForDeferreds(pendingDeferreds, deadlineMs, timeoutMs);\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n }\n\n drainJobs(context, runtime, deadlineMs, timeoutMs);\n};\n\nconst evaluateInQuickJs = async (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n runPromise: RunPromise,\n): Promise<ExecuteResult> => {\n const timeoutMs = Math.max(100, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n const deadlineMs = Date.now() + timeoutMs;\n const logs: string[] = [];\n const pendingDeferreds = new Set<QuickJSDeferredPromise>();\n const QuickJS = await resolveQuickJS();\n const runtime = QuickJS.newRuntime();\n\n try {\n if (options.memoryLimitBytes !== undefined) {\n runtime.setMemoryLimit(options.memoryLimitBytes);\n }\n\n if (options.maxStackSizeBytes !== undefined) {\n runtime.setMaxStackSize(options.maxStackSizeBytes);\n }\n\n runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));\n\n const context = runtime.newContext();\n try {\n const logBridge = createLogBridge(context, logs);\n context.setProp(context.global, \"__executor_log\", logBridge);\n logBridge.dispose();\n\n const toolBridge = createToolBridge(context, toolInvoker, pendingDeferreds, runPromise);\n context.setProp(context.global, \"__executor_invokeTool\", toolBridge);\n toolBridge.dispose();\n\n const evaluated = context.evalCode(buildExecutionSource(code), EXECUTION_FILENAME);\n if (evaluated.error) {\n const error = context.dump(evaluated.error);\n evaluated.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n context.setProp(context.global, \"__executor_result\", evaluated.value);\n evaluated.value.dispose();\n\n const stateResult = context.evalCode(\n \"(function(p){ var s = { v: void 0, e: void 0, settled: false }; var formatError = function(e){ if (e && typeof e === 'object') { var message = typeof e.message === 'string' ? e.message : ''; var stack = typeof e.stack === 'string' ? e.stack : ''; if (message && stack) { return stack.indexOf(message) === -1 ? message + '\\\\n' + stack : stack; } if (message) return message; if (stack) return stack; } return String(e); }; p.then(function(v){ s.v = v; s.settled = true; }, function(e){ s.e = formatError(e); s.settled = true; }); return s; })(__executor_result)\",\n );\n if (stateResult.error) {\n const error = context.dump(stateResult.error);\n stateResult.error.dispose();\n return {\n result: null,\n error: normalizeExecutionError(error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n const stateHandle = stateResult.value;\n try {\n await drainAsync(context, runtime, pendingDeferreds, deadlineMs, timeoutMs);\n const state = readResultState(context, stateHandle);\n if (!state.settled) {\n return {\n result: null,\n error: timeoutMessage(timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n if (typeof state.error !== \"undefined\") {\n return {\n result: null,\n error: normalizeExecutionError(state.error, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n }\n\n return {\n result: state.value,\n logs,\n } satisfies ExecuteResult;\n } finally {\n stateHandle.dispose();\n }\n } finally {\n for (const deferred of pendingDeferreds) {\n if (deferred.alive) {\n deferred.dispose();\n }\n }\n\n pendingDeferreds.clear();\n context.dispose();\n }\n } catch (cause) {\n return {\n result: null,\n error: normalizeExecutionError(cause, deadlineMs, timeoutMs),\n logs,\n } satisfies ExecuteResult;\n } finally {\n runtime.dispose();\n }\n};\n\nconst runInQuickJs = (\n options: QuickJsExecutorOptions,\n code: string,\n toolInvoker: SandboxToolInvoker,\n): Effect.Effect<ExecuteResult, QuickJsExecutionError> =>\n Effect.gen(function* () {\n const context = yield* Effect.context<never>();\n const runPromise = Effect.runPromiseWith(context);\n return yield* Effect.tryPromise({\n try: () => evaluateInQuickJs(options, code, toolInvoker, runPromise),\n catch: (cause) => new QuickJsExecutionError({ message: String(cause) }),\n });\n }).pipe(\n Effect.withSpan(\"executor.code.exec.quickjs\", {\n attributes: { \"executor.runtime\": \"quickjs\" },\n }),\n );\n\nexport const makeQuickJsExecutor = (\n options: QuickJsExecutorOptions = {},\n): CodeExecutor<QuickJsExecutionError> => ({\n execute: (code: string, toolInvoker: SandboxToolInvoker) =>\n runInQuickJs(options, code, toolInvoker),\n});\n"],"mappings":"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","names":["context"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@executor-js/runtime-quickjs",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/runtime-quickjs",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/RhysSullivan/executor/issues"
|
|
@@ -34,16 +34,16 @@
|
|
|
34
34
|
"typecheck:slow": "bunx tsc --noEmit -p tsconfig.json"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@executor-js/codemode-core": "0.0
|
|
38
|
-
"effect": "
|
|
37
|
+
"@executor-js/codemode-core": "0.1.0",
|
|
38
|
+
"effect": "4.0.0-beta.59",
|
|
39
39
|
"quickjs-emscripten": "^0.31.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@effect/vitest": "
|
|
42
|
+
"@effect/vitest": "4.0.0-beta.59",
|
|
43
43
|
"@types/node": "^24.3.1",
|
|
44
44
|
"bun-types": "^1.2.22",
|
|
45
45
|
"tsup": "^8.5.0",
|
|
46
46
|
"typescript": "^5.9.3",
|
|
47
|
-
"vitest": "^4.1.
|
|
47
|
+
"vitest": "^4.1.5"
|
|
48
48
|
}
|
|
49
49
|
}
|