11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ciconst common = require('../common');
31cb0ef41Sopenharmony_ciconst assert = require('assert');
41cb0ef41Sopenharmony_ciconst { once } = require('events');
51cb0ef41Sopenharmony_ciconst { Worker, MessageChannel } = require('worker_threads');
61cb0ef41Sopenharmony_ci
71cb0ef41Sopenharmony_ci// This is a regression test for the race condition underlying
81cb0ef41Sopenharmony_ci// https://github.com/nodejs/node/issues/22762.
91cb0ef41Sopenharmony_ci// It ensures that all messages send before a MessagePort#close() call are
101cb0ef41Sopenharmony_ci// received. Previously, what could happen was a race condition like this:
111cb0ef41Sopenharmony_ci// - Thread 1 sends message A
121cb0ef41Sopenharmony_ci// - Thread 2 begins receiving/emitting message A
131cb0ef41Sopenharmony_ci// - Thread 1 sends message B
141cb0ef41Sopenharmony_ci// - Thread 1 closes its side of the channel
151cb0ef41Sopenharmony_ci// - Thread 2 finishes receiving/emitting message A
161cb0ef41Sopenharmony_ci// - Thread 2 sees that the port should be closed
171cb0ef41Sopenharmony_ci// - Thread 2 closes the port, discarding message B in the process.
181cb0ef41Sopenharmony_ci
191cb0ef41Sopenharmony_ciasync function test() {
201cb0ef41Sopenharmony_ci  const worker = new Worker(`
211cb0ef41Sopenharmony_ci  require('worker_threads').parentPort.on('message', ({ port }) => {
221cb0ef41Sopenharmony_ci    port.postMessage('firstMessage');
231cb0ef41Sopenharmony_ci    port.postMessage('lastMessage');
241cb0ef41Sopenharmony_ci    port.close();
251cb0ef41Sopenharmony_ci  });
261cb0ef41Sopenharmony_ci  `, { eval: true });
271cb0ef41Sopenharmony_ci
281cb0ef41Sopenharmony_ci  for (let i = 0; i < 10000; i++) {
291cb0ef41Sopenharmony_ci    const { port1, port2 } = new MessageChannel();
301cb0ef41Sopenharmony_ci    worker.postMessage({ port: port2 }, [ port2 ]);
311cb0ef41Sopenharmony_ci    assert.deepStrictEqual(await once(port1, 'message'), ['firstMessage']);
321cb0ef41Sopenharmony_ci    assert.deepStrictEqual(await once(port1, 'message'), ['lastMessage']);
331cb0ef41Sopenharmony_ci  }
341cb0ef41Sopenharmony_ci
351cb0ef41Sopenharmony_ci  await worker.terminate();
361cb0ef41Sopenharmony_ci}
371cb0ef41Sopenharmony_ci
381cb0ef41Sopenharmony_citest().then(common.mustCall());
39