1'use strict'; 2require('../common'); 3const assert = require('assert'); 4const async_hooks = require('async_hooks'); 5 6// Regression test for: 7// - https://github.com/nodejs/node/issues/38814 8// - https://github.com/nodejs/node/issues/38815 9 10const layers = new Map(); 11 12// Only init to start context-based promise hook 13async_hooks.createHook({ 14 init(asyncId, type) { 15 layers.set(asyncId, { 16 type, 17 init: true, 18 before: false, 19 after: false, 20 promiseResolve: false 21 }); 22 }, 23 before(asyncId) { 24 if (layers.has(asyncId)) { 25 layers.get(asyncId).before = true; 26 } 27 }, 28 after(asyncId) { 29 if (layers.has(asyncId)) { 30 layers.get(asyncId).after = true; 31 } 32 }, 33 promiseResolve(asyncId) { 34 if (layers.has(asyncId)) { 35 layers.get(asyncId).promiseResolve = true; 36 } 37 } 38}).enable(); 39 40// With destroy, this should switch to native 41// and disable context - based promise hook 42async_hooks.createHook({ 43 init() { }, 44 destroy() { } 45}).enable(); 46 47async function main() { 48 return Promise.resolve(); 49} 50 51main(); 52 53process.on('exit', () => { 54 assert.deepStrictEqual(Array.from(layers.values()), [ 55 { 56 type: 'PROMISE', 57 init: true, 58 before: true, 59 after: true, 60 promiseResolve: true 61 }, 62 { 63 type: 'PROMISE', 64 init: true, 65 before: false, 66 after: false, 67 promiseResolve: true 68 }, 69 { 70 type: 'PROMISE', 71 init: true, 72 before: true, 73 after: true, 74 promiseResolve: true 75 }, 76 ]); 77}); 78