123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import { QuickJSContext } from "./context";
- import { EitherModule } from "./emscripten-types";
- import { JSContextPointer, JSRuntimePointer } from "./types-ffi";
- import { Disposable, Lifetime, Scope } from "./lifetime";
- import { ModuleMemory } from "./memory";
- import { QuickJSModuleCallbacks } from "./module";
- import { ContextOptions, EitherFFI, JSModuleLoader, JSModuleNormalizer, QuickJSHandle } from "./types";
- import { SuccessOrFail } from "./vm-interface";
- /**
- * Callback called regularly while the VM executes code.
- * Determines if a VM's execution should be interrupted.
- *
- * @returns `true` to interrupt JS execution inside the VM.
- * @returns `false` or `undefined` to continue JS execution inside the VM.
- */
- export type InterruptHandler = (runtime: QuickJSRuntime) => boolean | undefined;
- /**
- * Used as an optional for the results of executing pendingJobs.
- * On success, `value` contains the number of async jobs executed
- * by the runtime.
- * @source
- */
- export type ExecutePendingJobsResult = SuccessOrFail<
- /** Number of jobs successfully executed. */
- number,
- /** The error that occurred. */
- QuickJSHandle & {
- /** The context where the error occurred. */
- context: QuickJSContext;
- }>;
- /**
- * A runtime represents a Javascript runtime corresponding to an object heap.
- * Several runtimes can exist at the same time but they cannot exchange objects.
- * Inside a given runtime, no multi-threading is supported.
- *
- * You can think of separate runtimes like different domains in a browser, and
- * the contexts within a runtime like the different windows open to the same
- * domain.
- *
- * Create a runtime via {@link QuickJSWASMModule.newRuntime}.
- *
- * You should create separate runtime instances for untrusted code from
- * different sources for isolation. However, stronger isolation is also
- * available (at the cost of memory usage), by creating separate WebAssembly
- * modules to further isolate untrusted code.
- * See {@link newQuickJSWASMModule}.
- *
- * Implement memory and CPU constraints with [[setInterruptHandler]]
- * (called regularly while the interpreter runs), [[setMemoryLimit]], and
- * [[setMaxStackSize]].
- * Use [[computeMemoryUsage]] or [[dumpMemoryUsage]] to guide memory limit
- * tuning.
- *
- * Configure ES module loading with [[setModuleLoader]].
- */
- export declare class QuickJSRuntime implements Disposable {
- /**
- * If this runtime was created as as part of a context, points to the context
- * associated with the runtime.
- *
- * If this runtime was created stand-alone, this may or may not contain a context.
- * A context here may be allocated if one is needed by the runtime, eg for [[computeMemoryUsage]].
- */
- context: QuickJSContext | undefined;
- /** @private */
- protected module: EitherModule;
- /** @private */
- protected memory: ModuleMemory;
- /** @private */
- protected ffi: EitherFFI;
- /** @private */
- protected rt: Lifetime<JSRuntimePointer>;
- /** @private */
- protected callbacks: QuickJSModuleCallbacks;
- /** @private */
- protected scope: Scope;
- /** @private */
- protected contextMap: Map<JSContextPointer, QuickJSContext>;
- /** @private */
- protected moduleLoader: JSModuleLoader | undefined;
- /** @private */
- protected moduleNormalizer: JSModuleNormalizer | undefined;
- /** @private */
- constructor(args: {
- module: EitherModule;
- ffi: EitherFFI;
- rt: Lifetime<JSRuntimePointer>;
- callbacks: QuickJSModuleCallbacks;
- ownedLifetimes?: Disposable[];
- });
- get alive(): boolean;
- dispose(): void;
- newContext(options?: ContextOptions): QuickJSContext;
- /**
- * Set the loader for EcmaScript modules requested by any context in this
- * runtime.
- *
- * The loader can be removed with [[removeModuleLoader]].
- */
- setModuleLoader(moduleLoader: JSModuleLoader, moduleNormalizer?: JSModuleNormalizer): void;
- /**
- * Remove the the loader set by [[setModuleLoader]]. This disables module loading.
- */
- removeModuleLoader(): void;
- /**
- * In QuickJS, promises and async functions create pendingJobs. These do not execute
- * immediately and need to be run by calling [[executePendingJobs]].
- *
- * @return true if there is at least one pendingJob queued up.
- */
- hasPendingJob(): boolean;
- private interruptHandler;
- /**
- * Set a callback which is regularly called by the QuickJS engine when it is
- * executing code. This callback can be used to implement an execution
- * timeout.
- *
- * The interrupt handler can be removed with [[removeInterruptHandler]].
- */
- setInterruptHandler(cb: InterruptHandler): void;
- /**
- * Remove the interrupt handler, if any.
- * See [[setInterruptHandler]].
- */
- removeInterruptHandler(): void;
- /**
- * Execute pendingJobs on the runtime until `maxJobsToExecute` jobs are
- * executed (default all pendingJobs), the queue is exhausted, or the runtime
- * encounters an exception.
- *
- * In QuickJS, promises and async functions *inside the runtime* create
- * pendingJobs. These do not execute immediately and need to triggered to run.
- *
- * @param maxJobsToExecute - When negative, run all pending jobs. Otherwise execute
- * at most `maxJobsToExecute` before returning.
- *
- * @return On success, the number of executed jobs. On error, the exception
- * that stopped execution, and the context it occurred in. Note that
- * executePendingJobs will not normally return errors thrown inside async
- * functions or rejected promises. Those errors are available by calling
- * [[resolvePromise]] on the promise handle returned by the async function.
- */
- executePendingJobs(maxJobsToExecute?: number | void): ExecutePendingJobsResult;
- /**
- * Set the max memory this runtime can allocate.
- * To remove the limit, set to `-1`.
- */
- setMemoryLimit(limitBytes: number): void;
- /**
- * Compute memory usage for this runtime. Returns the result as a handle to a
- * JSValue object. Use [[QuickJSContext.dump]] to convert to a native object.
- * Calling this method will allocate more memory inside the runtime. The information
- * is accurate as of just before the call to `computeMemoryUsage`.
- * For a human-digestible representation, see [[dumpMemoryUsage]].
- */
- computeMemoryUsage(): QuickJSHandle;
- /**
- * @returns a human-readable description of memory usage in this runtime.
- * For programmatic access to this information, see [[computeMemoryUsage]].
- */
- dumpMemoryUsage(): string;
- /**
- * Set the max stack size for this runtime, in bytes.
- * To remove the limit, set to `0`.
- */
- setMaxStackSize(stackSize: number): void;
- /**
- * Assert that `handle` is owned by this runtime.
- * @throws QuickJSWrongOwner if owned by a different runtime.
- */
- assertOwned(handle: QuickJSHandle): void;
- private getSystemContext;
- private cToHostCallbacks;
- }
|