1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const { promiseHooks } = require('v8'); 5 6assert.throws(() => { 7 promiseHooks.onSettled(async function() { }); 8}, /The "settledHook" argument must be of type function/); 9 10assert.throws(() => { 11 promiseHooks.onSettled(async function*() { }); 12}, /The "settledHook" argument must be of type function/); 13 14let seen; 15 16const stop = promiseHooks.onSettled(common.mustCall((promise) => { 17 seen = promise; 18}, 4)); 19 20// Constructor resolve triggers hook 21const promise = new Promise((resolve, reject) => { 22 assert.strictEqual(seen, undefined); 23 setImmediate(() => { 24 resolve(); 25 assert.strictEqual(seen, promise); 26 seen = undefined; 27 28 constructorReject(); 29 }); 30}); 31 32// Constructor reject triggers hook 33function constructorReject() { 34 const promise = new Promise((resolve, reject) => { 35 assert.strictEqual(seen, undefined); 36 setImmediate(() => { 37 reject(); 38 assert.strictEqual(seen, promise); 39 seen = undefined; 40 41 simpleResolveReject(); 42 }); 43 }); 44 promise.catch(() => {}); 45} 46 47// Sync resolve/reject helpers trigger hook 48function simpleResolveReject() { 49 const resolved = Promise.resolve(); 50 assert.strictEqual(seen, resolved); 51 seen = undefined; 52 53 const rejected = Promise.reject(); 54 assert.strictEqual(seen, rejected); 55 seen = undefined; 56 57 stop(); 58 rejected.catch(() => {}); 59} 60