| 'use strict'; |
| const common = require('../common'); |
| |
| const { Worker } = require('worker_threads'); |
| const { createHook } = require('async_hooks'); |
| const { deepStrictEqual, strictEqual } = require('assert'); |
| |
| const m = new Map(); |
| createHook({ |
| init(asyncId, type, triggerAsyncId, resource) { |
| if (['WORKER', 'MESSAGEPORT'].includes(type)) { |
| m.set(asyncId, { type, resource }); |
| } |
| }, |
| destroy(asyncId) { |
| m.delete(asyncId); |
| } |
| }).enable(); |
| |
| function getActiveWorkerAndMessagePortTypes() { |
| const activeWorkerAndMessagePortTypes = []; |
| for (const asyncId of m.keys()) { |
| const { type, resource } = m.get(asyncId); |
| // Same logic as https://github.com/mafintosh/why-is-node-running/blob/24fb4c878753390a05d00959e6173d0d3c31fddd/index.js#L31-L32. |
| if (typeof resource.hasRef !== 'function' || resource.hasRef() === true) { |
| activeWorkerAndMessagePortTypes.push(type); |
| } |
| } |
| return activeWorkerAndMessagePortTypes; |
| } |
| |
| const w = new Worker('', { eval: true }); |
| deepStrictEqual(getActiveWorkerAndMessagePortTypes(), ['WORKER']); |
| w.unref(); |
| deepStrictEqual(getActiveWorkerAndMessagePortTypes(), []); |
| w.ref(); |
| deepStrictEqual(getActiveWorkerAndMessagePortTypes(), ['WORKER', 'MESSAGEPORT']); |
| |
| w.on('exit', common.mustCall((exitCode) => { |
| strictEqual(exitCode, 0); |
| deepStrictEqual(getActiveWorkerAndMessagePortTypes(), ['WORKER']); |
| setTimeout(common.mustCall(() => { |
| deepStrictEqual(getActiveWorkerAndMessagePortTypes(), []); |
| }), 0); |
| })); |