'use strict'; const common = require('../common'); const assert = require('assert'); const { promiseHooks } = require('v8'); for (const hook of ['init', 'before', 'after', 'settled']) { assert.throws(() => { promiseHooks.createHook({ [hook]: async function() { } }); }, new RegExp(`The "${hook}Hook" argument must be of type function`)); assert.throws(() => { promiseHooks.createHook({ [hook]: async function*() { } }); }, new RegExp(`The "${hook}Hook" argument must be of type function`)); } let init; let initParent; let before; let after; let settled; const stop = promiseHooks.createHook({ init: common.mustCall((promise, parent) => { init = promise; initParent = parent; }, 3), before: common.mustCall((promise) => { before = promise; }, 2), after: common.mustCall((promise) => { after = promise; }, 1), settled: common.mustCall((promise) => { settled = promise; }, 2) }); // Clears state on each check so only the delta needs to be checked. function assertState(expectedInit, expectedInitParent, expectedBefore, expectedAfter, expectedSettled) { assert.strictEqual(init, expectedInit); assert.strictEqual(initParent, expectedInitParent); assert.strictEqual(before, expectedBefore); assert.strictEqual(after, expectedAfter); assert.strictEqual(settled, expectedSettled); init = undefined; initParent = undefined; before = undefined; after = undefined; settled = undefined; } const parent = Promise.resolve(1); // After calling `Promise.resolve(...)`, the returned promise should have // produced an init event with no parent and a settled event. assertState(parent, undefined, undefined, undefined, parent); const child = parent.then(() => { // When a callback to `promise.then(...)` is called, the promise it resolves // to should have produced a before event to mark the start of this callback. assertState(undefined, undefined, child, undefined, undefined); }); // After calling `promise.then(...)`, the returned promise should have // produced an init event with a parent of the promise the `then(...)` // was called on. assertState(child, parent); const grandChild = child.then(() => { // Since the check for the before event in the `then(...)` call producing the // `child` promise, there should have been both a before event for this // promise but also settled and after events for the `child` promise. assertState(undefined, undefined, grandChild, child, child); stop(); }); // After calling `promise.then(...)`, the returned promise should have // produced an init event with a parent of the promise the `then(...)` // was called on. assertState(grandChild, child);