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