@embedpdf/core-js-sandbox 3.0.0-next.13 → 3.0.0-next.15

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/dist/index.cjs CHANGED
@@ -49,7 +49,7 @@ function failedOutput(input, kind, message) {
49
49
  const target = input.event.target ? input.fields.find((field) => {
50
50
  const ref = field.ref;
51
51
  const targetRef = input.event.target;
52
- return ref.kind === "objectNumber" && targetRef.kind === "objectNumber" ? ref.fieldObjectNumber === targetRef.fieldObjectNumber : ref.kind === "fqn" && targetRef.kind === "fqn" ? ref.name === targetRef.name : false;
52
+ return ref.kind === "objectNumber" && targetRef.kind === "objectNumber" ? ref.objectNumber === targetRef.objectNumber : ref.kind === "fqn" && targetRef.kind === "fqn" ? ref.name === targetRef.name : false;
53
53
  }) : void 0;
54
54
  return {
55
55
  event: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["quickJsVariant","DEFAULT_SCRIPT_BUDGET","PRELUDE_SOURCE"],"sources":["../../../../node_modules/.pnpm/@jitl+quickjs-wasmfile-release-sync@0.32.0/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/index.mjs","../src/QuickJsSandbox.ts"],"sourcesContent":["var variant={type:\"sync\",importFFI:()=>import(\"./ffi.mjs\").then(mod=>mod.QuickJSFFI),importModuleLoader:()=>import(\"@jitl/quickjs-wasmfile-release-sync/emscripten-module\").then(mod=>mod.default)},src_default=variant;export{src_default as default};\n//# sourceMappingURL=index.mjs.map","import {\n DEFAULT_SCRIPT_BUDGET,\n PRELUDE_SOURCE,\n type ScriptBudget,\n type ScriptExecutionError,\n type ScriptInput,\n type ScriptOutput,\n type ScriptValue,\n} from '@embedpdf/core-acrojs';\nimport {\n newQuickJSWASMModuleFromVariant,\n type QuickJSContext,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from 'quickjs-emscripten-core';\nimport quickJsVariant from '#quickjs-variant';\n\nimport type { QuickJsSandboxOptions, ScriptSandbox } from './types';\n\nlet sharedModulePromise: Promise<QuickJSWASMModule> | undefined;\n\nfunction getSharedModule(): Promise<QuickJSWASMModule> {\n sharedModulePromise ??= newQuickJSWASMModuleFromVariant(quickJsVariant);\n return sharedModulePromise;\n}\n\nfunction assertBudget(budget: ScriptBudget): ScriptBudget {\n for (const [name, value] of Object.entries(budget)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`ScriptBudget.${name} must be a positive safe integer`);\n }\n }\n return budget;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isScriptValue(value: unknown): value is ScriptValue {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((entry) => typeof entry === 'string'))\n );\n}\n\n/** Validate the untrusted VM boundary, where TypeScript types do not exist. */\nfunction isScriptOutput(value: unknown): value is ScriptOutput {\n if (!isRecord(value) || !isRecord(value.event)) return false;\n const event = value.event;\n const arraysAreRecords = (candidate: unknown): boolean =>\n Array.isArray(candidate) && candidate.every(isRecord);\n if (\n typeof event.rc !== 'boolean' ||\n !isScriptValue(event.value) ||\n typeof event.change !== 'string' ||\n !Number.isSafeInteger(event.selStart) ||\n !Number.isSafeInteger(event.selEnd) ||\n !arraysAreRecords(value.formEffects) ||\n !arraysAreRecords(value.uiEffects) ||\n !arraysAreRecords(value.diagnostics)\n ) {\n return false;\n }\n if (value.error === undefined) return true;\n return (\n isRecord(value.error) &&\n (value.error.kind === 'exception' ||\n value.error.kind === 'budget' ||\n value.error.kind === 'invalid-output') &&\n typeof value.error.message === 'string' &&\n (value.error.stack === undefined || typeof value.error.stack === 'string')\n );\n}\n\nfunction errorMessage(value: unknown): string {\n if (isRecord(value)) {\n const name = typeof value.name === 'string' ? `${value.name}: ` : '';\n if (typeof value.message === 'string') return `${name}${value.message}`;\n }\n return String(value);\n}\n\nfunction isResourceError(error: ScriptExecutionError | undefined): boolean {\n if (!error) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('interrupted') ||\n message.includes('out of memory') ||\n message.includes('stack overflow')\n );\n}\n\nfunction failedOutput(\n input: ScriptInput,\n kind: ScriptExecutionError['kind'],\n message: string,\n): ScriptOutput {\n const target = input.event.target\n ? input.fields.find((field) => {\n const ref = field.ref;\n const targetRef = input.event.target!;\n return ref.kind === 'objectNumber' && targetRef.kind === 'objectNumber'\n ? ref.fieldObjectNumber === targetRef.fieldObjectNumber\n : ref.kind === 'fqn' && targetRef.kind === 'fqn'\n ? ref.name === targetRef.name\n : false;\n })\n : undefined;\n return {\n event: {\n rc: false,\n value: input.event.value ?? target?.value ?? null,\n change: input.event.change ?? '',\n selStart: input.event.selStart ?? 0,\n selEnd: input.event.selEnd ?? 0,\n },\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [],\n error: { kind, message },\n };\n}\n\nexport class QuickJsSandbox implements ScriptSandbox {\n private readonly runtime: QuickJSRuntime;\n private readonly context: QuickJSContext;\n private hasBooted = false;\n private isDisposed = false;\n\n static create(module: QuickJSWASMModule, options: QuickJsSandboxOptions = {}): QuickJsSandbox {\n const runtime = module.newRuntime();\n runtime.setMemoryLimit(DEFAULT_SCRIPT_BUDGET.maxMemoryBytes);\n runtime.setMaxStackSize(DEFAULT_SCRIPT_BUDGET.maxStackBytes);\n const context = runtime.newContext();\n\n try {\n const result = context.evalCode(\n options.preludeSource ?? PRELUDE_SOURCE,\n 'embedpdf-acrojs-prelude.js',\n { type: 'global' },\n );\n if (result.error) {\n const message = errorMessage(context.dump(result.error));\n result.error.dispose();\n throw new Error(`Failed to install the AcroJS prelude: ${message}`);\n }\n result.value.dispose();\n return new QuickJsSandbox(runtime, context);\n } catch (error) {\n context.dispose();\n runtime.dispose();\n throw error;\n }\n }\n\n private constructor(runtime: QuickJSRuntime, context: QuickJSContext) {\n this.runtime = runtime;\n this.context = context;\n }\n\n get disposed(): boolean {\n return this.isDisposed;\n }\n\n boot(\n sources: string[],\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n if (this.hasBooted) throw new Error('The document JavaScript name tree has already booted');\n this.hasBooted = true;\n return this.invoke('__acrojsBoot', sources, input, assertBudget(budget));\n }\n\n run(\n source: string,\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n return this.invoke('__acrojsRun', source, input, assertBudget(budget));\n }\n\n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n this.context.dispose();\n this.runtime.dispose();\n }\n\n private assertActive(): void {\n if (this.isDisposed) throw new Error('The script sandbox has been disposed');\n }\n\n private poison(): void {\n try {\n this.dispose();\n } catch {\n // The instance remains permanently marked disposed even if QuickJS itself\n // reports a teardown assertion after a fatal runtime condition.\n }\n }\n\n private invoke(\n method: '__acrojsBoot' | '__acrojsRun',\n firstArgument: string[] | string,\n input: ScriptInput,\n budget: ScriptBudget,\n ): ScriptOutput {\n this.runtime.setMemoryLimit(budget.maxMemoryBytes);\n this.runtime.setMaxStackSize(budget.maxStackBytes);\n\n const deadline = Date.now() + budget.maxExecutionMs;\n let interrupted = false;\n this.runtime.setInterruptHandler(() => {\n interrupted = Date.now() >= deadline;\n return interrupted;\n });\n\n let dumped: unknown;\n try {\n const call = `globalThis.${method}(${JSON.stringify(firstArgument)},${JSON.stringify(\n input,\n )},${JSON.stringify({ maxEffects: budget.maxEffects })})`;\n const result = this.context.evalCode(call, 'embedpdf-acrojs-event.js', { type: 'global' });\n if (result.error) {\n dumped = this.context.dump(result.error);\n result.error.dispose();\n const kind = interrupted ? 'budget' : 'invalid-output';\n const output = failedOutput(input, kind, errorMessage(dumped));\n this.poison();\n return output;\n }\n dumped = this.context.dump(result.value);\n result.value.dispose();\n } catch (error) {\n const output = failedOutput(\n input,\n interrupted ? 'budget' : 'invalid-output',\n error instanceof Error ? error.message : String(error),\n );\n this.poison();\n return output;\n } finally {\n if (!this.isDisposed) this.runtime.removeInterruptHandler();\n }\n\n if (!isScriptOutput(dumped)) {\n const output = failedOutput(input, 'invalid-output', 'AcroJS returned an invalid output');\n this.poison();\n return output;\n }\n\n if (interrupted || isResourceError(dumped.error)) {\n const output = failedOutput(\n input,\n 'budget',\n interrupted ? 'Script execution exceeded its time budget' : dumped.error!.message,\n );\n this.poison();\n return output;\n }\n\n const outputBytes = new TextEncoder().encode(JSON.stringify(dumped)).byteLength;\n if (outputBytes > budget.maxOutputBytes) {\n const output = failedOutput(\n input,\n 'budget',\n `Script output used ${outputBytes} bytes; limit is ${budget.maxOutputBytes}`,\n );\n this.poison();\n return output;\n }\n\n return dumped;\n }\n}\n\n/** Async because the shared QuickJS WebAssembly module must initialize first. */\nexport async function createQuickJsSandbox(\n options: QuickJsSandboxOptions = {},\n): Promise<ScriptSandbox> {\n return QuickJsSandbox.create(await getSharedModule(), options);\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;AAAA,IAAoM,cAAY;CAAnM,MAAK;CAAO,iBAAA,QAAA,QAAA,CAAA,CAAA,WAAA,QAAc,oBAAA,CAAA,CAAA,CAAoB,MAAK,QAAK,IAAI,UAAU;CAAE,0BAAuB,OAAO,wDAAwD,CAAC,MAAK,QAAK,IAAI,OAAO;AAAqB;;;ACmBtN,IAAI;AAEJ,SAAS,kBAA8C;CACrD,wBAAA,uBAAA,GAAA,wBAAA,gCAAA,CAAwDA,WAAc;CACtE,OAAO;AACT;AAEA,SAAS,aAAa,QAAoC;CACxD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,GAC/C,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAC3C,MAAM,IAAI,WAAW,gBAAgB,KAAK,iCAAiC;CAG/E,OAAO;AACT;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,cAAc,OAAsC;CAC3D,OACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,aAChB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAClD,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,UAAU,OAAO,UAAU,QAAQ;AAE7E;;AAGA,SAAS,eAAe,OAAuC;CAC7D,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,KAAK,GAAG,OAAO;CACvD,MAAM,QAAQ,MAAM;CACpB,MAAM,oBAAoB,cACxB,MAAM,QAAQ,SAAS,KAAK,UAAU,MAAM,QAAQ;CACtD,IACE,OAAO,MAAM,OAAO,aACpB,CAAC,cAAc,MAAM,KAAK,KAC1B,OAAO,MAAM,WAAW,YACxB,CAAC,OAAO,cAAc,MAAM,QAAQ,KACpC,CAAC,OAAO,cAAc,MAAM,MAAM,KAClC,CAAC,iBAAiB,MAAM,WAAW,KACnC,CAAC,iBAAiB,MAAM,SAAS,KACjC,CAAC,iBAAiB,MAAM,WAAW,GAEnC,OAAO;CAET,IAAI,MAAM,UAAU,KAAA,GAAW,OAAO;CACtC,OACE,SAAS,MAAM,KAAK,MACnB,MAAM,MAAM,SAAS,eACpB,MAAM,MAAM,SAAS,YACrB,MAAM,MAAM,SAAS,qBACvB,OAAO,MAAM,MAAM,YAAY,aAC9B,MAAM,MAAM,UAAU,KAAA,KAAa,OAAO,MAAM,MAAM,UAAU;AAErE;AAEA,SAAS,aAAa,OAAwB;CAC5C,IAAI,SAAS,KAAK,GAAG;EACnB,MAAM,OAAO,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,KAAK,MAAM;EAClE,IAAI,OAAO,MAAM,YAAY,UAAU,OAAO,GAAG,OAAO,MAAM;CAChE;CACA,OAAO,OAAO,KAAK;AACrB;AAEA,SAAS,gBAAgB,OAAkD;CACzE,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,UAAU,MAAM,QAAQ,YAAY;CAC1C,OACE,QAAQ,SAAS,aAAa,KAC9B,QAAQ,SAAS,eAAe,KAChC,QAAQ,SAAS,gBAAgB;AAErC;AAEA,SAAS,aACP,OACA,MACA,SACc;CACd,MAAM,SAAS,MAAM,MAAM,SACvB,MAAM,OAAO,MAAM,UAAU;EAC3B,MAAM,MAAM,MAAM;EAClB,MAAM,YAAY,MAAM,MAAM;EAC9B,OAAO,IAAI,SAAS,kBAAkB,UAAU,SAAS,iBACrD,IAAI,sBAAsB,UAAU,oBACpC,IAAI,SAAS,SAAS,UAAU,SAAS,QACvC,IAAI,SAAS,UAAU,OACvB;CACR,CAAC,IACD,KAAA;CACJ,OAAO;EACL,OAAO;GACL,IAAI;GACJ,OAAO,MAAM,MAAM,SAAS,QAAQ,SAAS;GAC7C,QAAQ,MAAM,MAAM,UAAU;GAC9B,UAAU,MAAM,MAAM,YAAY;GAClC,QAAQ,MAAM,MAAM,UAAU;EAChC;EACA,aAAa,CAAC;EACd,cAAc,CAAC;EACf,WAAW,CAAC;EACZ,aAAa,CAAC;EACd,OAAO;GAAE;GAAM;EAAQ;CACzB;AACF;AAEA,IAAa,iBAAb,MAAa,eAAwC;CAMnD,OAAO,OAAO,QAA2B,UAAiC,CAAC,GAAmB;EAC5F,MAAM,UAAU,OAAO,WAAW;EAClC,QAAQ,eAAeC,sBAAAA,sBAAsB,cAAc;EAC3D,QAAQ,gBAAgBA,sBAAAA,sBAAsB,aAAa;EAC3D,MAAM,UAAU,QAAQ,WAAW;EAEnC,IAAI;GACF,MAAM,SAAS,QAAQ,SACrB,QAAQ,iBAAiBC,sBAAAA,gBACzB,8BACA,EAAE,MAAM,SAAS,CACnB;GACA,IAAI,OAAO,OAAO;IAChB,MAAM,UAAU,aAAa,QAAQ,KAAK,OAAO,KAAK,CAAC;IACvD,OAAO,MAAM,QAAQ;IACrB,MAAM,IAAI,MAAM,yCAAyC,SAAS;GACpE;GACA,OAAO,MAAM,QAAQ;GACrB,OAAO,IAAI,eAAe,SAAS,OAAO;EAC5C,SAAS,OAAO;GACd,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,MAAM;EACR;CACF;CAEA,YAAoB,SAAyB,SAAyB;EA7BtE,KAAQ,YAAY;EACpB,KAAQ,aAAa;EA6BnB,KAAK,UAAU;EACf,KAAK,UAAU;CACjB;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAK;CACd;CAEA,KACE,SACA,OACA,SAAuBD,sBAAAA,uBACT;EACd,KAAK,aAAa;EAClB,IAAI,KAAK,WAAW,MAAM,IAAI,MAAM,sDAAsD;EAC1F,KAAK,YAAY;EACjB,OAAO,KAAK,OAAO,gBAAgB,SAAS,OAAO,aAAa,MAAM,CAAC;CACzE;CAEA,IACE,QACA,OACA,SAAuBA,sBAAAA,uBACT;EACd,KAAK,aAAa;EAClB,OAAO,KAAK,OAAO,eAAe,QAAQ,OAAO,aAAa,MAAM,CAAC;CACvE;CAEA,UAAgB;EACd,IAAI,KAAK,YAAY;EACrB,KAAK,aAAa;EAClB,KAAK,QAAQ,QAAQ;EACrB,KAAK,QAAQ,QAAQ;CACvB;CAEA,eAA6B;EAC3B,IAAI,KAAK,YAAY,MAAM,IAAI,MAAM,sCAAsC;CAC7E;CAEA,SAAuB;EACrB,IAAI;GACF,KAAK,QAAQ;EACf,QAAQ,CAGR;CACF;CAEA,OACE,QACA,eACA,OACA,QACc;EACd,KAAK,QAAQ,eAAe,OAAO,cAAc;EACjD,KAAK,QAAQ,gBAAgB,OAAO,aAAa;EAEjD,MAAM,WAAW,KAAK,IAAI,IAAI,OAAO;EACrC,IAAI,cAAc;EAClB,KAAK,QAAQ,0BAA0B;GACrC,cAAc,KAAK,IAAI,KAAK;GAC5B,OAAO;EACT,CAAC;EAED,IAAI;EACJ,IAAI;GACF,MAAM,OAAO,cAAc,OAAO,GAAG,KAAK,UAAU,aAAa,EAAE,GAAG,KAAK,UACzE,KACF,EAAE,GAAG,KAAK,UAAU,EAAE,YAAY,OAAO,WAAW,CAAC,EAAE;GACvD,MAAM,SAAS,KAAK,QAAQ,SAAS,MAAM,4BAA4B,EAAE,MAAM,SAAS,CAAC;GACzF,IAAI,OAAO,OAAO;IAChB,SAAS,KAAK,QAAQ,KAAK,OAAO,KAAK;IACvC,OAAO,MAAM,QAAQ;IAErB,MAAM,SAAS,aAAa,OADf,cAAc,WAAW,kBACG,aAAa,MAAM,CAAC;IAC7D,KAAK,OAAO;IACZ,OAAO;GACT;GACA,SAAS,KAAK,QAAQ,KAAK,OAAO,KAAK;GACvC,OAAO,MAAM,QAAQ;EACvB,SAAS,OAAO;GACd,MAAM,SAAS,aACb,OACA,cAAc,WAAW,kBACzB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;GACA,KAAK,OAAO;GACZ,OAAO;EACT,UAAU;GACR,IAAI,CAAC,KAAK,YAAY,KAAK,QAAQ,uBAAuB;EAC5D;EAEA,IAAI,CAAC,eAAe,MAAM,GAAG;GAC3B,MAAM,SAAS,aAAa,OAAO,kBAAkB,mCAAmC;GACxF,KAAK,OAAO;GACZ,OAAO;EACT;EAEA,IAAI,eAAe,gBAAgB,OAAO,KAAK,GAAG;GAChD,MAAM,SAAS,aACb,OACA,UACA,cAAc,8CAA8C,OAAO,MAAO,OAC5E;GACA,KAAK,OAAO;GACZ,OAAO;EACT;EAEA,MAAM,cAAc,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,UAAU,MAAM,CAAC,CAAC,CAAC;EACrE,IAAI,cAAc,OAAO,gBAAgB;GACvC,MAAM,SAAS,aACb,OACA,UACA,sBAAsB,YAAY,mBAAmB,OAAO,gBAC9D;GACA,KAAK,OAAO;GACZ,OAAO;EACT;EAEA,OAAO;CACT;AACF;;AAGA,eAAsB,qBACpB,UAAiC,CAAC,GACV;CACxB,OAAO,eAAe,OAAO,MAAM,gBAAgB,GAAG,OAAO;AAC/D"}
1
+ {"version":3,"file":"index.cjs","names":["quickJsVariant","DEFAULT_SCRIPT_BUDGET","PRELUDE_SOURCE"],"sources":["../../../../node_modules/.pnpm/@jitl+quickjs-wasmfile-release-sync@0.32.0/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/index.mjs","../src/QuickJsSandbox.ts"],"sourcesContent":["var variant={type:\"sync\",importFFI:()=>import(\"./ffi.mjs\").then(mod=>mod.QuickJSFFI),importModuleLoader:()=>import(\"@jitl/quickjs-wasmfile-release-sync/emscripten-module\").then(mod=>mod.default)},src_default=variant;export{src_default as default};\n//# sourceMappingURL=index.mjs.map","import {\n DEFAULT_SCRIPT_BUDGET,\n PRELUDE_SOURCE,\n type ScriptBudget,\n type ScriptExecutionError,\n type ScriptInput,\n type ScriptOutput,\n type ScriptValue,\n} from '@embedpdf/core-acrojs';\nimport {\n newQuickJSWASMModuleFromVariant,\n type QuickJSContext,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from 'quickjs-emscripten-core';\nimport quickJsVariant from '#quickjs-variant';\n\nimport type { QuickJsSandboxOptions, ScriptSandbox } from './types';\n\nlet sharedModulePromise: Promise<QuickJSWASMModule> | undefined;\n\nfunction getSharedModule(): Promise<QuickJSWASMModule> {\n sharedModulePromise ??= newQuickJSWASMModuleFromVariant(quickJsVariant);\n return sharedModulePromise;\n}\n\nfunction assertBudget(budget: ScriptBudget): ScriptBudget {\n for (const [name, value] of Object.entries(budget)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`ScriptBudget.${name} must be a positive safe integer`);\n }\n }\n return budget;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isScriptValue(value: unknown): value is ScriptValue {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((entry) => typeof entry === 'string'))\n );\n}\n\n/** Validate the untrusted VM boundary, where TypeScript types do not exist. */\nfunction isScriptOutput(value: unknown): value is ScriptOutput {\n if (!isRecord(value) || !isRecord(value.event)) return false;\n const event = value.event;\n const arraysAreRecords = (candidate: unknown): boolean =>\n Array.isArray(candidate) && candidate.every(isRecord);\n if (\n typeof event.rc !== 'boolean' ||\n !isScriptValue(event.value) ||\n typeof event.change !== 'string' ||\n !Number.isSafeInteger(event.selStart) ||\n !Number.isSafeInteger(event.selEnd) ||\n !arraysAreRecords(value.formEffects) ||\n !arraysAreRecords(value.uiEffects) ||\n !arraysAreRecords(value.diagnostics)\n ) {\n return false;\n }\n if (value.error === undefined) return true;\n return (\n isRecord(value.error) &&\n (value.error.kind === 'exception' ||\n value.error.kind === 'budget' ||\n value.error.kind === 'invalid-output') &&\n typeof value.error.message === 'string' &&\n (value.error.stack === undefined || typeof value.error.stack === 'string')\n );\n}\n\nfunction errorMessage(value: unknown): string {\n if (isRecord(value)) {\n const name = typeof value.name === 'string' ? `${value.name}: ` : '';\n if (typeof value.message === 'string') return `${name}${value.message}`;\n }\n return String(value);\n}\n\nfunction isResourceError(error: ScriptExecutionError | undefined): boolean {\n if (!error) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('interrupted') ||\n message.includes('out of memory') ||\n message.includes('stack overflow')\n );\n}\n\nfunction failedOutput(\n input: ScriptInput,\n kind: ScriptExecutionError['kind'],\n message: string,\n): ScriptOutput {\n const target = input.event.target\n ? input.fields.find((field) => {\n const ref = field.ref;\n const targetRef = input.event.target!;\n return ref.kind === 'objectNumber' && targetRef.kind === 'objectNumber'\n ? ref.objectNumber === targetRef.objectNumber\n : ref.kind === 'fqn' && targetRef.kind === 'fqn'\n ? ref.name === targetRef.name\n : false;\n })\n : undefined;\n return {\n event: {\n rc: false,\n value: input.event.value ?? target?.value ?? null,\n change: input.event.change ?? '',\n selStart: input.event.selStart ?? 0,\n selEnd: input.event.selEnd ?? 0,\n },\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [],\n error: { kind, message },\n };\n}\n\nexport class QuickJsSandbox implements ScriptSandbox {\n private readonly runtime: QuickJSRuntime;\n private readonly context: QuickJSContext;\n private hasBooted = false;\n private isDisposed = false;\n\n static create(module: QuickJSWASMModule, options: QuickJsSandboxOptions = {}): QuickJsSandbox {\n const runtime = module.newRuntime();\n runtime.setMemoryLimit(DEFAULT_SCRIPT_BUDGET.maxMemoryBytes);\n runtime.setMaxStackSize(DEFAULT_SCRIPT_BUDGET.maxStackBytes);\n const context = runtime.newContext();\n\n try {\n const result = context.evalCode(\n options.preludeSource ?? PRELUDE_SOURCE,\n 'embedpdf-acrojs-prelude.js',\n { type: 'global' },\n );\n if (result.error) {\n const message = errorMessage(context.dump(result.error));\n result.error.dispose();\n throw new Error(`Failed to install the AcroJS prelude: ${message}`);\n }\n result.value.dispose();\n return new QuickJsSandbox(runtime, context);\n } catch (error) {\n context.dispose();\n runtime.dispose();\n throw error;\n }\n }\n\n private constructor(runtime: QuickJSRuntime, context: QuickJSContext) {\n this.runtime = runtime;\n this.context = context;\n }\n\n get disposed(): boolean {\n return this.isDisposed;\n }\n\n boot(\n sources: string[],\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n if (this.hasBooted) throw new Error('The document JavaScript name tree has already booted');\n this.hasBooted = true;\n return this.invoke('__acrojsBoot', sources, input, assertBudget(budget));\n }\n\n run(\n source: string,\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n return this.invoke('__acrojsRun', source, input, assertBudget(budget));\n }\n\n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n this.context.dispose();\n this.runtime.dispose();\n }\n\n private assertActive(): void {\n if (this.isDisposed) throw new Error('The script sandbox has been disposed');\n }\n\n private poison(): void {\n try {\n this.dispose();\n } catch {\n // The instance remains permanently marked disposed even if QuickJS itself\n // reports a teardown assertion after a fatal runtime condition.\n }\n }\n\n private invoke(\n method: '__acrojsBoot' | '__acrojsRun',\n firstArgument: string[] | string,\n input: ScriptInput,\n budget: ScriptBudget,\n ): ScriptOutput {\n this.runtime.setMemoryLimit(budget.maxMemoryBytes);\n this.runtime.setMaxStackSize(budget.maxStackBytes);\n\n const deadline = Date.now() + budget.maxExecutionMs;\n let interrupted = false;\n this.runtime.setInterruptHandler(() => {\n interrupted = Date.now() >= deadline;\n return interrupted;\n });\n\n let dumped: unknown;\n try {\n const call = `globalThis.${method}(${JSON.stringify(firstArgument)},${JSON.stringify(\n input,\n )},${JSON.stringify({ maxEffects: budget.maxEffects })})`;\n const result = this.context.evalCode(call, 'embedpdf-acrojs-event.js', { type: 'global' });\n if (result.error) {\n dumped = this.context.dump(result.error);\n result.error.dispose();\n const kind = interrupted ? 'budget' : 'invalid-output';\n const output = failedOutput(input, kind, errorMessage(dumped));\n this.poison();\n return output;\n }\n dumped = this.context.dump(result.value);\n result.value.dispose();\n } catch (error) {\n const output = failedOutput(\n input,\n interrupted ? 'budget' : 'invalid-output',\n error instanceof Error ? error.message : String(error),\n );\n this.poison();\n return output;\n } finally {\n if (!this.isDisposed) this.runtime.removeInterruptHandler();\n }\n\n if (!isScriptOutput(dumped)) {\n const output = failedOutput(input, 'invalid-output', 'AcroJS returned an invalid output');\n this.poison();\n return output;\n }\n\n if (interrupted || isResourceError(dumped.error)) {\n const output = failedOutput(\n input,\n 'budget',\n interrupted ? 'Script execution exceeded its time budget' : dumped.error!.message,\n );\n this.poison();\n return output;\n }\n\n const outputBytes = new TextEncoder().encode(JSON.stringify(dumped)).byteLength;\n if (outputBytes > budget.maxOutputBytes) {\n const output = failedOutput(\n input,\n 'budget',\n `Script output used ${outputBytes} bytes; limit is ${budget.maxOutputBytes}`,\n );\n this.poison();\n return output;\n }\n\n return dumped;\n }\n}\n\n/** Async because the shared QuickJS WebAssembly module must initialize first. */\nexport async function createQuickJsSandbox(\n options: QuickJsSandboxOptions = {},\n): Promise<ScriptSandbox> {\n return QuickJsSandbox.create(await getSharedModule(), options);\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
package/dist/index.js CHANGED
@@ -48,7 +48,7 @@ function failedOutput(input, kind, message) {
48
48
  const target = input.event.target ? input.fields.find((field) => {
49
49
  const ref = field.ref;
50
50
  const targetRef = input.event.target;
51
- return ref.kind === "objectNumber" && targetRef.kind === "objectNumber" ? ref.fieldObjectNumber === targetRef.fieldObjectNumber : ref.kind === "fqn" && targetRef.kind === "fqn" ? ref.name === targetRef.name : false;
51
+ return ref.kind === "objectNumber" && targetRef.kind === "objectNumber" ? ref.objectNumber === targetRef.objectNumber : ref.kind === "fqn" && targetRef.kind === "fqn" ? ref.name === targetRef.name : false;
52
52
  }) : void 0;
53
53
  return {
54
54
  event: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["quickJsVariant"],"sources":["../../../../node_modules/.pnpm/@jitl+quickjs-wasmfile-release-sync@0.32.0/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/index.mjs","../src/QuickJsSandbox.ts"],"sourcesContent":["var variant={type:\"sync\",importFFI:()=>import(\"./ffi.mjs\").then(mod=>mod.QuickJSFFI),importModuleLoader:()=>import(\"@jitl/quickjs-wasmfile-release-sync/emscripten-module\").then(mod=>mod.default)},src_default=variant;export{src_default as default};\n//# sourceMappingURL=index.mjs.map","import {\n DEFAULT_SCRIPT_BUDGET,\n PRELUDE_SOURCE,\n type ScriptBudget,\n type ScriptExecutionError,\n type ScriptInput,\n type ScriptOutput,\n type ScriptValue,\n} from '@embedpdf/core-acrojs';\nimport {\n newQuickJSWASMModuleFromVariant,\n type QuickJSContext,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from 'quickjs-emscripten-core';\nimport quickJsVariant from '#quickjs-variant';\n\nimport type { QuickJsSandboxOptions, ScriptSandbox } from './types';\n\nlet sharedModulePromise: Promise<QuickJSWASMModule> | undefined;\n\nfunction getSharedModule(): Promise<QuickJSWASMModule> {\n sharedModulePromise ??= newQuickJSWASMModuleFromVariant(quickJsVariant);\n return sharedModulePromise;\n}\n\nfunction assertBudget(budget: ScriptBudget): ScriptBudget {\n for (const [name, value] of Object.entries(budget)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`ScriptBudget.${name} must be a positive safe integer`);\n }\n }\n return budget;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isScriptValue(value: unknown): value is ScriptValue {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((entry) => typeof entry === 'string'))\n );\n}\n\n/** Validate the untrusted VM boundary, where TypeScript types do not exist. */\nfunction isScriptOutput(value: unknown): value is ScriptOutput {\n if (!isRecord(value) || !isRecord(value.event)) return false;\n const event = value.event;\n const arraysAreRecords = (candidate: unknown): boolean =>\n Array.isArray(candidate) && candidate.every(isRecord);\n if (\n typeof event.rc !== 'boolean' ||\n !isScriptValue(event.value) ||\n typeof event.change !== 'string' ||\n !Number.isSafeInteger(event.selStart) ||\n !Number.isSafeInteger(event.selEnd) ||\n !arraysAreRecords(value.formEffects) ||\n !arraysAreRecords(value.uiEffects) ||\n !arraysAreRecords(value.diagnostics)\n ) {\n return false;\n }\n if (value.error === undefined) return true;\n return (\n isRecord(value.error) &&\n (value.error.kind === 'exception' ||\n value.error.kind === 'budget' ||\n value.error.kind === 'invalid-output') &&\n typeof value.error.message === 'string' &&\n (value.error.stack === undefined || typeof value.error.stack === 'string')\n );\n}\n\nfunction errorMessage(value: unknown): string {\n if (isRecord(value)) {\n const name = typeof value.name === 'string' ? `${value.name}: ` : '';\n if (typeof value.message === 'string') return `${name}${value.message}`;\n }\n return String(value);\n}\n\nfunction isResourceError(error: ScriptExecutionError | undefined): boolean {\n if (!error) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('interrupted') ||\n message.includes('out of memory') ||\n message.includes('stack overflow')\n );\n}\n\nfunction failedOutput(\n input: ScriptInput,\n kind: ScriptExecutionError['kind'],\n message: string,\n): ScriptOutput {\n const target = input.event.target\n ? input.fields.find((field) => {\n const ref = field.ref;\n const targetRef = input.event.target!;\n return ref.kind === 'objectNumber' && targetRef.kind === 'objectNumber'\n ? ref.fieldObjectNumber === targetRef.fieldObjectNumber\n : ref.kind === 'fqn' && targetRef.kind === 'fqn'\n ? ref.name === targetRef.name\n : false;\n })\n : undefined;\n return {\n event: {\n rc: false,\n value: input.event.value ?? target?.value ?? null,\n change: input.event.change ?? '',\n selStart: input.event.selStart ?? 0,\n selEnd: input.event.selEnd ?? 0,\n },\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [],\n error: { kind, message },\n };\n}\n\nexport class QuickJsSandbox implements ScriptSandbox {\n private readonly runtime: QuickJSRuntime;\n private readonly context: QuickJSContext;\n private hasBooted = false;\n private isDisposed = false;\n\n static create(module: QuickJSWASMModule, options: QuickJsSandboxOptions = {}): QuickJsSandbox {\n const runtime = module.newRuntime();\n runtime.setMemoryLimit(DEFAULT_SCRIPT_BUDGET.maxMemoryBytes);\n runtime.setMaxStackSize(DEFAULT_SCRIPT_BUDGET.maxStackBytes);\n const context = runtime.newContext();\n\n try {\n const result = context.evalCode(\n options.preludeSource ?? PRELUDE_SOURCE,\n 'embedpdf-acrojs-prelude.js',\n { type: 'global' },\n );\n if (result.error) {\n const message = errorMessage(context.dump(result.error));\n result.error.dispose();\n throw new Error(`Failed to install the AcroJS prelude: ${message}`);\n }\n result.value.dispose();\n return new QuickJsSandbox(runtime, context);\n } catch (error) {\n context.dispose();\n runtime.dispose();\n throw error;\n }\n }\n\n private constructor(runtime: QuickJSRuntime, context: QuickJSContext) {\n this.runtime = runtime;\n this.context = context;\n }\n\n get disposed(): boolean {\n return this.isDisposed;\n }\n\n boot(\n sources: string[],\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n if (this.hasBooted) throw new Error('The document JavaScript name tree has already booted');\n this.hasBooted = true;\n return this.invoke('__acrojsBoot', sources, input, assertBudget(budget));\n }\n\n run(\n source: string,\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n return this.invoke('__acrojsRun', source, input, assertBudget(budget));\n }\n\n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n this.context.dispose();\n this.runtime.dispose();\n }\n\n private assertActive(): void {\n if (this.isDisposed) throw new Error('The script sandbox has been disposed');\n }\n\n private poison(): void {\n try {\n this.dispose();\n } catch {\n // The instance remains permanently marked disposed even if QuickJS itself\n // reports a teardown assertion after a fatal runtime condition.\n }\n }\n\n private invoke(\n method: '__acrojsBoot' | '__acrojsRun',\n firstArgument: string[] | string,\n input: ScriptInput,\n budget: ScriptBudget,\n ): ScriptOutput {\n this.runtime.setMemoryLimit(budget.maxMemoryBytes);\n this.runtime.setMaxStackSize(budget.maxStackBytes);\n\n const deadline = Date.now() + budget.maxExecutionMs;\n let interrupted = false;\n this.runtime.setInterruptHandler(() => {\n interrupted = Date.now() >= deadline;\n return interrupted;\n });\n\n let dumped: unknown;\n try {\n const call = `globalThis.${method}(${JSON.stringify(firstArgument)},${JSON.stringify(\n input,\n )},${JSON.stringify({ maxEffects: budget.maxEffects })})`;\n const result = this.context.evalCode(call, 'embedpdf-acrojs-event.js', { type: 'global' });\n if (result.error) {\n dumped = this.context.dump(result.error);\n result.error.dispose();\n const kind = interrupted ? 'budget' : 'invalid-output';\n const output = failedOutput(input, kind, errorMessage(dumped));\n this.poison();\n return output;\n }\n dumped = this.context.dump(result.value);\n result.value.dispose();\n } catch (error) {\n const output = failedOutput(\n input,\n interrupted ? 'budget' : 'invalid-output',\n error instanceof Error ? error.message : String(error),\n );\n this.poison();\n return output;\n } finally {\n if (!this.isDisposed) this.runtime.removeInterruptHandler();\n }\n\n if (!isScriptOutput(dumped)) {\n const output = failedOutput(input, 'invalid-output', 'AcroJS returned an invalid output');\n this.poison();\n return output;\n }\n\n if (interrupted || isResourceError(dumped.error)) {\n const output = failedOutput(\n input,\n 'budget',\n interrupted ? 'Script execution exceeded its time budget' : dumped.error!.message,\n );\n this.poison();\n return output;\n }\n\n const outputBytes = new TextEncoder().encode(JSON.stringify(dumped)).byteLength;\n if (outputBytes > budget.maxOutputBytes) {\n const output = failedOutput(\n input,\n 'budget',\n `Script output used ${outputBytes} bytes; limit is ${budget.maxOutputBytes}`,\n );\n this.poison();\n return output;\n }\n\n return dumped;\n }\n}\n\n/** Async because the shared QuickJS WebAssembly module must initialize first. */\nexport async function createQuickJsSandbox(\n options: QuickJsSandboxOptions = {},\n): Promise<ScriptSandbox> {\n return QuickJsSandbox.create(await getSharedModule(), options);\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["quickJsVariant"],"sources":["../../../../node_modules/.pnpm/@jitl+quickjs-wasmfile-release-sync@0.32.0/node_modules/@jitl/quickjs-wasmfile-release-sync/dist/index.mjs","../src/QuickJsSandbox.ts"],"sourcesContent":["var variant={type:\"sync\",importFFI:()=>import(\"./ffi.mjs\").then(mod=>mod.QuickJSFFI),importModuleLoader:()=>import(\"@jitl/quickjs-wasmfile-release-sync/emscripten-module\").then(mod=>mod.default)},src_default=variant;export{src_default as default};\n//# sourceMappingURL=index.mjs.map","import {\n DEFAULT_SCRIPT_BUDGET,\n PRELUDE_SOURCE,\n type ScriptBudget,\n type ScriptExecutionError,\n type ScriptInput,\n type ScriptOutput,\n type ScriptValue,\n} from '@embedpdf/core-acrojs';\nimport {\n newQuickJSWASMModuleFromVariant,\n type QuickJSContext,\n type QuickJSRuntime,\n type QuickJSWASMModule,\n} from 'quickjs-emscripten-core';\nimport quickJsVariant from '#quickjs-variant';\n\nimport type { QuickJsSandboxOptions, ScriptSandbox } from './types';\n\nlet sharedModulePromise: Promise<QuickJSWASMModule> | undefined;\n\nfunction getSharedModule(): Promise<QuickJSWASMModule> {\n sharedModulePromise ??= newQuickJSWASMModuleFromVariant(quickJsVariant);\n return sharedModulePromise;\n}\n\nfunction assertBudget(budget: ScriptBudget): ScriptBudget {\n for (const [name, value] of Object.entries(budget)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`ScriptBudget.${name} must be a positive safe integer`);\n }\n }\n return budget;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isScriptValue(value: unknown): value is ScriptValue {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((entry) => typeof entry === 'string'))\n );\n}\n\n/** Validate the untrusted VM boundary, where TypeScript types do not exist. */\nfunction isScriptOutput(value: unknown): value is ScriptOutput {\n if (!isRecord(value) || !isRecord(value.event)) return false;\n const event = value.event;\n const arraysAreRecords = (candidate: unknown): boolean =>\n Array.isArray(candidate) && candidate.every(isRecord);\n if (\n typeof event.rc !== 'boolean' ||\n !isScriptValue(event.value) ||\n typeof event.change !== 'string' ||\n !Number.isSafeInteger(event.selStart) ||\n !Number.isSafeInteger(event.selEnd) ||\n !arraysAreRecords(value.formEffects) ||\n !arraysAreRecords(value.uiEffects) ||\n !arraysAreRecords(value.diagnostics)\n ) {\n return false;\n }\n if (value.error === undefined) return true;\n return (\n isRecord(value.error) &&\n (value.error.kind === 'exception' ||\n value.error.kind === 'budget' ||\n value.error.kind === 'invalid-output') &&\n typeof value.error.message === 'string' &&\n (value.error.stack === undefined || typeof value.error.stack === 'string')\n );\n}\n\nfunction errorMessage(value: unknown): string {\n if (isRecord(value)) {\n const name = typeof value.name === 'string' ? `${value.name}: ` : '';\n if (typeof value.message === 'string') return `${name}${value.message}`;\n }\n return String(value);\n}\n\nfunction isResourceError(error: ScriptExecutionError | undefined): boolean {\n if (!error) return false;\n const message = error.message.toLowerCase();\n return (\n message.includes('interrupted') ||\n message.includes('out of memory') ||\n message.includes('stack overflow')\n );\n}\n\nfunction failedOutput(\n input: ScriptInput,\n kind: ScriptExecutionError['kind'],\n message: string,\n): ScriptOutput {\n const target = input.event.target\n ? input.fields.find((field) => {\n const ref = field.ref;\n const targetRef = input.event.target!;\n return ref.kind === 'objectNumber' && targetRef.kind === 'objectNumber'\n ? ref.objectNumber === targetRef.objectNumber\n : ref.kind === 'fqn' && targetRef.kind === 'fqn'\n ? ref.name === targetRef.name\n : false;\n })\n : undefined;\n return {\n event: {\n rc: false,\n value: input.event.value ?? target?.value ?? null,\n change: input.event.change ?? '',\n selStart: input.event.selStart ?? 0,\n selEnd: input.event.selEnd ?? 0,\n },\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [],\n error: { kind, message },\n };\n}\n\nexport class QuickJsSandbox implements ScriptSandbox {\n private readonly runtime: QuickJSRuntime;\n private readonly context: QuickJSContext;\n private hasBooted = false;\n private isDisposed = false;\n\n static create(module: QuickJSWASMModule, options: QuickJsSandboxOptions = {}): QuickJsSandbox {\n const runtime = module.newRuntime();\n runtime.setMemoryLimit(DEFAULT_SCRIPT_BUDGET.maxMemoryBytes);\n runtime.setMaxStackSize(DEFAULT_SCRIPT_BUDGET.maxStackBytes);\n const context = runtime.newContext();\n\n try {\n const result = context.evalCode(\n options.preludeSource ?? PRELUDE_SOURCE,\n 'embedpdf-acrojs-prelude.js',\n { type: 'global' },\n );\n if (result.error) {\n const message = errorMessage(context.dump(result.error));\n result.error.dispose();\n throw new Error(`Failed to install the AcroJS prelude: ${message}`);\n }\n result.value.dispose();\n return new QuickJsSandbox(runtime, context);\n } catch (error) {\n context.dispose();\n runtime.dispose();\n throw error;\n }\n }\n\n private constructor(runtime: QuickJSRuntime, context: QuickJSContext) {\n this.runtime = runtime;\n this.context = context;\n }\n\n get disposed(): boolean {\n return this.isDisposed;\n }\n\n boot(\n sources: string[],\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n if (this.hasBooted) throw new Error('The document JavaScript name tree has already booted');\n this.hasBooted = true;\n return this.invoke('__acrojsBoot', sources, input, assertBudget(budget));\n }\n\n run(\n source: string,\n input: ScriptInput,\n budget: ScriptBudget = DEFAULT_SCRIPT_BUDGET,\n ): ScriptOutput {\n this.assertActive();\n return this.invoke('__acrojsRun', source, input, assertBudget(budget));\n }\n\n dispose(): void {\n if (this.isDisposed) return;\n this.isDisposed = true;\n this.context.dispose();\n this.runtime.dispose();\n }\n\n private assertActive(): void {\n if (this.isDisposed) throw new Error('The script sandbox has been disposed');\n }\n\n private poison(): void {\n try {\n this.dispose();\n } catch {\n // The instance remains permanently marked disposed even if QuickJS itself\n // reports a teardown assertion after a fatal runtime condition.\n }\n }\n\n private invoke(\n method: '__acrojsBoot' | '__acrojsRun',\n firstArgument: string[] | string,\n input: ScriptInput,\n budget: ScriptBudget,\n ): ScriptOutput {\n this.runtime.setMemoryLimit(budget.maxMemoryBytes);\n this.runtime.setMaxStackSize(budget.maxStackBytes);\n\n const deadline = Date.now() + budget.maxExecutionMs;\n let interrupted = false;\n this.runtime.setInterruptHandler(() => {\n interrupted = Date.now() >= deadline;\n return interrupted;\n });\n\n let dumped: unknown;\n try {\n const call = `globalThis.${method}(${JSON.stringify(firstArgument)},${JSON.stringify(\n input,\n )},${JSON.stringify({ maxEffects: budget.maxEffects })})`;\n const result = this.context.evalCode(call, 'embedpdf-acrojs-event.js', { type: 'global' });\n if (result.error) {\n dumped = this.context.dump(result.error);\n result.error.dispose();\n const kind = interrupted ? 'budget' : 'invalid-output';\n const output = failedOutput(input, kind, errorMessage(dumped));\n this.poison();\n return output;\n }\n dumped = this.context.dump(result.value);\n result.value.dispose();\n } catch (error) {\n const output = failedOutput(\n input,\n interrupted ? 'budget' : 'invalid-output',\n error instanceof Error ? error.message : String(error),\n );\n this.poison();\n return output;\n } finally {\n if (!this.isDisposed) this.runtime.removeInterruptHandler();\n }\n\n if (!isScriptOutput(dumped)) {\n const output = failedOutput(input, 'invalid-output', 'AcroJS returned an invalid output');\n this.poison();\n return output;\n }\n\n if (interrupted || isResourceError(dumped.error)) {\n const output = failedOutput(\n input,\n 'budget',\n interrupted ? 'Script execution exceeded its time budget' : dumped.error!.message,\n );\n this.poison();\n return output;\n }\n\n const outputBytes = new TextEncoder().encode(JSON.stringify(dumped)).byteLength;\n if (outputBytes > budget.maxOutputBytes) {\n const output = failedOutput(\n input,\n 'budget',\n `Script output used ${outputBytes} bytes; limit is ${budget.maxOutputBytes}`,\n );\n this.poison();\n return output;\n }\n\n return dumped;\n }\n}\n\n/** Async because the shared QuickJS WebAssembly module must initialize first. */\nexport async function createQuickJsSandbox(\n options: QuickJsSandboxOptions = {},\n): Promise<ScriptSandbox> {\n return QuickJsSandbox.create(await getSharedModule(), options);\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/core-js-sandbox",
3
- "version": "3.0.0-next.13",
3
+ "version": "3.0.0-next.15",
4
4
  "private": false,
5
5
  "description": "QuickJS-backed, resource-bounded execution adapter for deterministic Acrobat JavaScript.",
6
6
  "type": "module",
@@ -28,13 +28,13 @@
28
28
  "@jitl/quickjs-singlefile-browser-release-sync": "0.32.0",
29
29
  "@jitl/quickjs-wasmfile-release-sync": "0.32.0",
30
30
  "quickjs-emscripten-core": "0.32.0",
31
- "@embedpdf/core-acrojs": "3.0.0-next.13"
31
+ "@embedpdf/core-acrojs": "3.0.0-next.15"
32
32
  },
33
33
  "devDependencies": {
34
34
  "typescript": "^5.0.0",
35
35
  "vite": "^6.0.0",
36
36
  "vitest": "^2.1.9",
37
- "@embedpdf/engine": "3.0.0-next.13",
37
+ "@embedpdf/engine": "3.0.0-next.15",
38
38
  "@embedpdf/tooling-build": "0.0.0"
39
39
  },
40
40
  "license": "Apache-2.0",