1'use strict';
2const common = require('../common');
3
4const { MessageChannel } = require('worker_threads');
5const { createHook } = require('async_hooks');
6const { strictEqual } = require('assert');
7
8const handles = [];
9
10createHook({
11  init(asyncId, type, triggerAsyncId, resource) {
12    if (type === 'MESSAGEPORT') {
13      handles.push(resource);
14    }
15  }
16}).enable();
17
18const { port1, port2 } = new MessageChannel();
19strictEqual(handles[0], port1);
20strictEqual(handles[1], port2);
21
22strictEqual(handles[0].hasRef(), false);
23strictEqual(handles[1].hasRef(), false);
24
25port1.unref();
26strictEqual(handles[0].hasRef(), false);
27
28port1.ref();
29strictEqual(handles[0].hasRef(), true);
30
31port1.unref();
32strictEqual(handles[0].hasRef(), false);
33
34port1.on('message', () => {});
35strictEqual(handles[0].hasRef(), true);
36
37port2.unref();
38strictEqual(handles[1].hasRef(), false);
39
40port2.ref();
41strictEqual(handles[1].hasRef(), true);
42
43port2.unref();
44strictEqual(handles[1].hasRef(), false);
45
46port2.on('message', () => {});
47strictEqual(handles[0].hasRef(), true);
48
49port1.on('close', common.mustCall(() => {
50  strictEqual(handles[0].hasRef(), false);
51  strictEqual(handles[1].hasRef(), false);
52}));
53
54port2.close();
55
56strictEqual(handles[0].hasRef(), true);
57strictEqual(handles[1].hasRef(), true);
58