import { QuickJSContext } from "./context"; import { Asyncify, AsyncifySleepResult, EitherModule, EmscriptenModuleCallbacks } from "./emscripten-types"; import { JSContextPointer, JSRuntimePointer } from "./types-ffi"; import { InterruptHandler, QuickJSRuntime } from "./runtime"; import { ContextOptions, EitherFFI, JSModuleLoader, RuntimeOptions, RuntimeOptionsBase } from "./types"; type EmscriptenCallback<BaseArgs extends any[], Result> = (...args: [Asyncify | undefined, ...BaseArgs]) => Result | AsyncifySleepResult<Result>; type MaybeAsyncEmscriptenCallback<T extends EmscriptenCallback<any, any>> = T extends EmscriptenCallback<infer Args, infer Result> ? (...args: Args) => Result | Promise<Result> : never; type MaybeAsyncEmscriptenCallbacks = { [K in keyof EmscriptenModuleCallbacks]: MaybeAsyncEmscriptenCallback<EmscriptenModuleCallbacks[K]>; }; /** * @private */ export interface ContextCallbacks { callFunction: MaybeAsyncEmscriptenCallbacks["callFunction"]; } /** * @private */ export interface RuntimeCallbacks { shouldInterrupt: MaybeAsyncEmscriptenCallbacks["shouldInterrupt"]; loadModuleSource: MaybeAsyncEmscriptenCallbacks["loadModuleSource"]; normalizeModule: MaybeAsyncEmscriptenCallbacks["normalizeModule"]; } /** * Options for [[QuickJSWASMModule.evalCode]]. */ export interface ModuleEvalOptions { /** * Interrupt evaluation if `shouldInterrupt` returns `true`. * See [[shouldInterruptAfterDeadline]]. */ shouldInterrupt?: InterruptHandler; /** * Memory limit, in bytes, of WebAssembly heap memory used by the QuickJS VM. */ memoryLimitBytes?: number; /** * Stack size limit for this vm, in bytes * To remove the limit, set to `0`. */ maxStackSizeBytes?: number; /** * Module loader for any `import` statements or expressions. */ moduleLoader?: JSModuleLoader; } /** * We use static functions per module to dispatch runtime or context calls from * C to the host. This class manages the indirection from a specific runtime or * context pointer to the appropriate callback handler. * * @private */ export declare class QuickJSModuleCallbacks { private module; private contextCallbacks; private runtimeCallbacks; constructor(module: EitherModule); setRuntimeCallbacks(rt: JSRuntimePointer, callbacks: RuntimeCallbacks): void; deleteRuntime(rt: JSRuntimePointer): void; setContextCallbacks(ctx: JSContextPointer, callbacks: ContextCallbacks): void; deleteContext(ctx: JSContextPointer): void; private suspendedCount; private suspended; private handleAsyncify; private cToHostCallbacks; } /** * Process RuntimeOptions and apply them to a QuickJSRuntime. * @private */ export declare function applyBaseRuntimeOptions(runtime: QuickJSRuntime, options: RuntimeOptionsBase): void; /** * Process ModuleEvalOptions and apply them to a QuickJSRuntime. * @private */ export declare function applyModuleEvalRuntimeOptions<T extends QuickJSRuntime>(runtime: T, options: ModuleEvalOptions): void; /** * This class presents a Javascript interface to QuickJS, a Javascript interpreter * that supports EcmaScript 2020 (ES2020). * * It wraps a single WebAssembly module containing the QuickJS library and * associated helper C code. WebAssembly modules are completely isolated from * each other by the host's WebAssembly runtime. Separate WebAssembly modules * have the most isolation guarantees possible with this library. * * The simplest way to start running code is {@link evalCode}. This shortcut * method will evaluate Javascript safely and return the result as a native * Javascript value. * * For more control over the execution environment, or to interact with values * inside QuickJS, create a context with {@link newContext} or a runtime with * {@link newRuntime}. */ export declare class QuickJSWASMModule { /** @private */ protected ffi: EitherFFI; /** @private */ protected callbacks: QuickJSModuleCallbacks; /** @private */ protected module: EitherModule; /** @private */ constructor(module: EitherModule, ffi: EitherFFI); /** * Create a runtime. * Use the runtime to set limits on CPU and memory usage and configure module * loading for one or more [[QuickJSContext]]s inside the runtime. */ newRuntime(options?: RuntimeOptions): QuickJSRuntime; /** * A simplified API to create a new [[QuickJSRuntime]] and a * [[QuickJSContext]] inside that runtime at the same time. The runtime will * be disposed when the context is disposed. */ newContext(options?: ContextOptions): QuickJSContext; /** * One-off evaluate code without needing to create a [[QuickJSRuntime]] or * [[QuickJSContext]] explicitly. * * To protect against infinite loops, use the `shouldInterrupt` option. The * [[shouldInterruptAfterDeadline]] function will create a time-based deadline. * * If you need more control over how the code executes, create a * [[QuickJSRuntime]] (with [[newRuntime]]) or a [[QuickJSContext]] (with * [[newContext]] or [[QuickJSRuntime.newContext]]), and use its * [[QuickJSContext.evalCode]] method. * * Asynchronous callbacks may not run during the first call to `evalCode`. If * you need to work with async code inside QuickJS, create a runtime and use * [[QuickJSRuntime.executePendingJobs]]. * * @returns The result is coerced to a native Javascript value using JSON * serialization, so properties and values unsupported by JSON will be dropped. * * @throws If `code` throws during evaluation, the exception will be * converted into a native Javascript value and thrown. * * @throws if `options.shouldInterrupt` interrupted execution, will throw a Error * with name `"InternalError"` and message `"interrupted"`. */ evalCode(code: string, options?: ModuleEvalOptions): unknown; /** * Get a low-level interface to the QuickJS functions in this WebAssembly * module. * @experimental * @unstable No warranty is provided with this API. It could change at any time. * @private */ getFFI(): EitherFFI; } export {};