// Flags: --experimental-vm-modules 'use strict'; // https://github.com/nodejs/node/issues/59541 // // Promises created in a context using microtaskMode: "aferEvaluate" (meaning it // has its own microtask queue), when resolved in the surrounding context, will // schedule a task back onto the inner context queue. const common = require('../common'); const vm = require('vm'); const microtaskMode = 'afterEvaluate'; (async () => { const mustNotCall1 = common.mustNotCall(); const mustNotCall2 = common.mustNotCall(); const mustCall1 = common.mustCall(); const inner = {}; const context = vm.createContext({ inner }, { microtaskMode }); const module = new vm.SourceTextModule( 'inner.promise = Promise.resolve();', { context }, ); await module.link(mustNotCall1); await module.evaluate(); // Prior to the fix for Issue 59541, the next statement was never executed. mustCall1(); await inner.promise; // This is expected: the await statement above enqueues a (thenable job) task // onto the inner context microtask queue, but it will not be checkpointed, // therefore we never make progress. mustNotCall2(); })().then(common.mustNotCall()); (async () => { const mustNotCall1 = common.mustNotCall(); const mustCall1 = common.mustCall(); const mustCall2 = common.mustCall(); const mustCall3 = common.mustCall(); const inner = {}; const context = vm.createContext({ inner }, { microtaskMode }); const module = new vm.SourceTextModule( 'inner.promise = Promise.resolve();', { context }, ); await module.link(mustNotCall1); await module.evaluate(); mustCall1(); setImmediate(() => { mustCall2(); // This will checkpoint the inner context microtask queue, and allow the // promise from the inner context to be resolved in the outer context. module.evaluate(); }); await inner.promise; mustCall3(); })().then(common.mustCall());