| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.QuickJSAsyncContext = void 0; |
| const context_1 = require("./context"); |
| const debug_1 = require("./debug"); |
| const types_1 = require("./types"); |
| /** |
| * Asyncified version of [[QuickJSContext]]. |
| * |
| * *Asyncify* allows normally synchronous code to wait for asynchronous Promises |
| * or callbacks. The asyncified version of QuickJSContext can wait for async |
| * host functions as though they were synchronous. |
| */ |
| class QuickJSAsyncContext extends context_1.QuickJSContext { |
| /** |
| * Asyncified version of [[evalCode]]. |
| */ |
| async evalCodeAsync(code, filename = "eval.js", |
| /** See [[EvalFlags]] for number semantics */ |
| options) { |
| const detectModule = (options === undefined ? 1 : 0); |
| const flags = (0, types_1.evalOptionsToFlags)(options); |
| let resultPtr = 0; |
| try { |
| resultPtr = await this.memory |
| .newHeapCharPointer(code) |
| .consume((charHandle) => this.ffi.QTS_Eval_MaybeAsync(this.ctx.value, charHandle.value, filename, detectModule, flags)); |
| } |
| catch (error) { |
| (0, debug_1.debugLog)("QTS_Eval_MaybeAsync threw", error); |
| throw error; |
| } |
| const errorPtr = this.ffi.QTS_ResolveException(this.ctx.value, resultPtr); |
| if (errorPtr) { |
| this.ffi.QTS_FreeValuePointer(this.ctx.value, resultPtr); |
| return { error: this.memory.heapValueHandle(errorPtr) }; |
| } |
| return { value: this.memory.heapValueHandle(resultPtr) }; |
| } |
| /** |
| * Similar to [[newFunction]]. |
| * Convert an async host Javascript function into a synchronous QuickJS function value. |
| * |
| * Whenever QuickJS calls this function, the VM's stack will be unwound while |
| * waiting the async function to complete, and then restored when the returned |
| * promise resolves. |
| * |
| * Asyncified functions must never call other asyncified functions or |
| * `import`, even indirectly, because the stack cannot be unwound twice. |
| * |
| * See [Emscripten's docs on Asyncify](https://emscripten.org/docs/porting/asyncify.html). |
| */ |
| newAsyncifiedFunction(name, fn) { |
| return this.newFunction(name, fn); |
| } |
| } |
| exports.QuickJSAsyncContext = QuickJSAsyncContext; |
| //# sourceMappingURL=context-asyncify.js.map |