UNPKG

@sebastianwessel/quickjs

Version:

A typescript package to execute JavaScript and TypeScript code in a WebAssembly QuickJS sandbox

63 lines (62 loc) 2.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createEvalCodeFunction = void 0; const createTimeInterval_js_1 = require("../../createTimeInterval.js"); const getMaxIntervalAmount_js_1 = require("../getMaxIntervalAmount.js"); const getMaxTimeoutAmount_js_1 = require("../getMaxTimeoutAmount.js"); const handleEvalError_js_1 = require("../handleEvalError.js"); const handleToNative_js_1 = require("../handleToNative/handleToNative.js"); const provideTimingFunctions_js_1 = require("../provide/provideTimingFunctions.js"); const createEvalCodeFunction = (input, scope) => { const { ctx, sandboxOptions, transpileFile } = input; return async (code, filename = '/src/index.js', evalOptions) => { const eventLoopinterval = (0, createTimeInterval_js_1.createTimeInterval)(() => ctx.runtime.executePendingJobs(), 0); let timeoutId; const { dispose: disposeTimer } = (0, provideTimingFunctions_js_1.provideTimingFunctions)(ctx, { maxTimeoutCount: (0, getMaxTimeoutAmount_js_1.getMaxTimeoutAmount)(sandboxOptions), maxIntervalCount: (0, getMaxIntervalAmount_js_1.getMaxIntervalAmount)(sandboxOptions), }); const disposeStep = () => { if (timeoutId) { clearTimeout(timeoutId); } eventLoopinterval?.clear(); disposeTimer(); }; try { const jsCode = transpileFile(code); const evalResult = ctx.evalCode(jsCode, filename, { strict: true, strip: false, backtraceBarrier: true, ...evalOptions, type: 'module', }); const handle = scope.manage(ctx.unwrapResult(evalResult)); const native = (0, handleToNative_js_1.handleToNative)(ctx, handle, scope); const result = await Promise.race([ (async () => { const res = await native; return res.default; })(), new Promise((_resolve, reject) => { if (sandboxOptions.executionTimeout) { timeoutId = setTimeout(() => { const err = new Error('The script execution has exceeded the maximum allowed time limit.'); err.name = 'ExecutionTimeout'; reject(err); }, sandboxOptions.executionTimeout); } }), ]); return { ok: true, data: result }; } catch (err) { return (0, handleEvalError_js_1.handleEvalError)(err); } finally { disposeStep(); } }; }; exports.createEvalCodeFunction = createEvalCodeFunction;