Spaces:
Sleeping
Sleeping
File size: 6,272 Bytes
c2b7eb3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | 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 {};
|