@executor-js/runtime-quickjs 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -33,11 +33,11 @@ const engine = createExecutionEngine({
|
|
|
33
33
|
|
|
34
34
|
### Options
|
|
35
35
|
|
|
36
|
-
| Option | Default | Description
|
|
37
|
-
| ------------------- | ---------- |
|
|
38
|
-
| `timeoutMs` | `
|
|
39
|
-
| `memoryLimitBytes` | `64 * 1MB` | Max memory the VM can allocate
|
|
40
|
-
| `maxStackSizeBytes` | `1 * 1MB` | Max call-stack depth
|
|
36
|
+
| Option | Default | Description |
|
|
37
|
+
| ------------------- | ---------- | --------------------------------- |
|
|
38
|
+
| `timeoutMs` | `300_000` | Max wall-clock time per execution |
|
|
39
|
+
| `memoryLimitBytes` | `64 * 1MB` | Max memory the VM can allocate |
|
|
40
|
+
| `maxStackSizeBytes` | `1 * 1MB` | Max call-stack depth |
|
|
41
41
|
|
|
42
42
|
### Swapping the QuickJS build
|
|
43
43
|
|
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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,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;AAsXL,eAAO,MAAM,mBAAmB,GAC9B,UAAS,sBAA2B,KACnC,YAAY,CAAC,qBAAqB,CAGnC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import {
|
|
3
|
-
recoverExecutionBody
|
|
3
|
+
recoverExecutionBody,
|
|
4
|
+
stripTypeScript
|
|
4
5
|
} from "@executor-js/codemode-core";
|
|
5
6
|
import * as Data from "effect/Data";
|
|
6
7
|
import * as Effect from "effect/Effect";
|
|
@@ -16,6 +17,8 @@ var resolveQuickJS = () => preloadedModule ? Promise.resolve(preloadedModule) :
|
|
|
16
17
|
var QuickJsExecutionError = class extends Data.TaggedError("QuickJsExecutionError") {
|
|
17
18
|
};
|
|
18
19
|
var DEFAULT_TIMEOUT_MS = 5 * 6e4;
|
|
20
|
+
var DEFAULT_MEMORY_LIMIT_BYTES = 64 * 1024 * 1024;
|
|
21
|
+
var DEFAULT_MAX_STACK_SIZE_BYTES = 1 * 1024 * 1024;
|
|
19
22
|
var EXECUTION_FILENAME = "executor-quickjs-runtime.js";
|
|
20
23
|
var toError = (cause) => cause instanceof Error ? cause : new Error(String(cause));
|
|
21
24
|
var toErrorMessage = (cause) => {
|
|
@@ -49,7 +52,7 @@ var normalizeExecutionError = (cause, deadlineMs, timeoutMs) => {
|
|
|
49
52
|
return Date.now() >= deadlineMs && looksLikeInterruptedError(message) ? timeoutMessage(timeoutMs) : message;
|
|
50
53
|
};
|
|
51
54
|
var buildExecutionSource = (code) => {
|
|
52
|
-
const body = recoverExecutionBody(code);
|
|
55
|
+
const body = stripTypeScript(recoverExecutionBody(code));
|
|
53
56
|
return [
|
|
54
57
|
'"use strict";',
|
|
55
58
|
"const __invokeTool = __executor_invokeTool;",
|
|
@@ -196,12 +199,8 @@ var evaluateInQuickJs = async (options, code, toolInvoker, runPromise) => {
|
|
|
196
199
|
const QuickJS = await resolveQuickJS();
|
|
197
200
|
const runtime = QuickJS.newRuntime();
|
|
198
201
|
try {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
if (options.maxStackSizeBytes !== void 0) {
|
|
203
|
-
runtime.setMaxStackSize(options.maxStackSizeBytes);
|
|
204
|
-
}
|
|
202
|
+
runtime.setMemoryLimit(options.memoryLimitBytes ?? DEFAULT_MEMORY_LIMIT_BYTES);
|
|
203
|
+
runtime.setMaxStackSize(options.maxStackSizeBytes ?? DEFAULT_MAX_STACK_SIZE_BYTES);
|
|
205
204
|
runtime.setInterruptHandler(shouldInterruptAfterDeadline(deadlineMs));
|
|
206
205
|
const context2 = runtime.newContext();
|
|
207
206
|
try {
|
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-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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n recoverExecutionBody,\n stripTypeScript,\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\n// Large OpenAPI specs can take longer to parse inside QuickJS, so keep the\n// default execution budget at five minutes unless a caller opts into less.\nconst DEFAULT_TIMEOUT_MS = 5 * 60_000;\nconst DEFAULT_MEMORY_LIMIT_BYTES = 64 * 1024 * 1024;\nconst DEFAULT_MAX_STACK_SIZE_BYTES = 1 * 1024 * 1024;\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 // QuickJS evaluates plain JavaScript only; strip any TS type syntax\n // first. A parse failure here throws a SyntaxError which the outer\n // `Effect.tryPromise` maps to `QuickJsExecutionError` with the\n // sucrase-formatted message intact.\n const body = stripTypeScript(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 runtime.setMemoryLimit(options.memoryLimitBytes ?? DEFAULT_MEMORY_LIMIT_BYTES);\n runtime.setMaxStackSize(options.maxStackSizeBytes ?? DEFAULT_MAX_STACK_SIZE_BYTES);\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.2.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,7 +34,7 @@
|
|
|
34
34
|
"typecheck:slow": "bunx tsc --noEmit -p tsconfig.json"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@executor-js/codemode-core": "0.0
|
|
37
|
+
"@executor-js/codemode-core": "0.2.0",
|
|
38
38
|
"effect": "4.0.0-beta.59",
|
|
39
39
|
"quickjs-emscripten": "^0.31.0"
|
|
40
40
|
},
|