1'use strict';
2const common = require('../common');
3const assert = require('assert');
4const { MessageChannel, receiveMessageOnPort } = require('worker_threads');
5
6const { port1, port2 } = new MessageChannel();
7
8const message1 = { hello: 'world' };
9const message2 = { foo: 'bar' };
10
11// Make sure receiveMessageOnPort() works in a FIFO way, the same way it does
12// when we’re using events.
13assert.strictEqual(receiveMessageOnPort(port2), undefined);
14port1.postMessage(message1);
15port1.postMessage(message2);
16assert.deepStrictEqual(receiveMessageOnPort(port2), { message: message1 });
17assert.deepStrictEqual(receiveMessageOnPort(port2), { message: message2 });
18assert.strictEqual(receiveMessageOnPort(port2), undefined);
19assert.strictEqual(receiveMessageOnPort(port2), undefined);
20
21// Make sure message handlers aren’t called.
22port2.on('message', common.mustNotCall());
23port1.postMessage(message1);
24assert.deepStrictEqual(receiveMessageOnPort(port2), { message: message1 });
25port1.close();
26
27for (const value of [null, 0, -1, {}, []]) {
28  assert.throws(() => receiveMessageOnPort(value), {
29    name: 'TypeError',
30    code: 'ERR_INVALID_ARG_TYPE',
31    message: 'The "port" argument must be a MessagePort instance'
32  });
33}
34