import path from 'path' import execa from 'execa' import pDefer from 'p-defer' import { toString as uint8ArrayToString } from 'uint8arrays/to-string' import { fileURLToPath } from 'url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) function startProcess(name) { return execa('node', [path.join(__dirname, name)], { cwd: path.resolve(__dirname), all: true }) } export async function test () { const listenerReady = pDefer() const messageReceived = pDefer() // Step 1 process process.stdout.write('node listener.js\n') const listenerProc = startProcess('src/listener.js') listenerProc.all.on('data', async (data) => { process.stdout.write(data) const s = uint8ArrayToString(data) if (s.includes('Listener ready, listening on:')) { listenerReady.resolve() } }) await listenerReady.promise process.stdout.write('==================================================================\n') // Step 2 process process.stdout.write('node dialer.js\n') const dialerProc = startProcess('src/dialer.js') dialerProc.all.on('data', async (data) => { process.stdout.write(data) const s = uint8ArrayToString(data) if (s.includes('received echo:')) { messageReceived.resolve() } }) await messageReceived.promise process.stdout.write('echo message received\n') listenerProc.kill() dialerProc.kill() await Promise.all([ listenerProc, dialerProc ]).catch((err) => { if (err.signal !== 'SIGTERM') { throw err } }) }