123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- 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 {};
|