56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
const { test } = require('tap')
|
|
const ThreadStream = require('../index')
|
|
const { join } = require('path')
|
|
|
|
function retryUntilTimeout (fn, timeout) {
|
|
const start = Date.now()
|
|
return new Promise((resolve, reject) => {
|
|
async function run () {
|
|
if (fn()) {
|
|
resolve()
|
|
return
|
|
}
|
|
|
|
if (Date.now() - start >= timeout) {
|
|
reject(new Error('timeout'))
|
|
return
|
|
}
|
|
setTimeout(run, 10)
|
|
}
|
|
|
|
run()
|
|
})
|
|
}
|
|
|
|
test('emit warning when the worker gracefully exit without the stream ended', async function (t) {
|
|
const expectedWarning = 'ThreadStream: process exited before destination stream was drained. this may indicate that the destination stream try to write to a another missing stream'
|
|
const stream = new ThreadStream({
|
|
filename: join(__dirname, 'to-next.js')
|
|
})
|
|
stream.unref()
|
|
|
|
let streamWarning
|
|
function saveWarning (e) {
|
|
if (e.message === expectedWarning) {
|
|
streamWarning = e
|
|
}
|
|
}
|
|
process.on('warning', saveWarning)
|
|
|
|
const data = 'hello'.repeat(10)
|
|
for (let i = 0; i < 1000; i++) {
|
|
if (streamWarning?.message === expectedWarning) {
|
|
break
|
|
}
|
|
stream.write(data)
|
|
await new Promise((resolve) => {
|
|
setTimeout(resolve, 1)
|
|
})
|
|
}
|
|
|
|
process.off('warning', saveWarning)
|
|
t.equal(streamWarning?.message, expectedWarning)
|
|
|
|
await retryUntilTimeout(() => stream.worker.exited === true, 3000)
|
|
})
|