You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.7 KiB
115 lines
2.7 KiB
3 years ago
|
# thread-stream
|
||
|
[](https://www.npmjs.com/package/thread-stream)
|
||
|
[](https://github.com/pinojs/thread-stream/actions)
|
||
|
[](https://standardjs.com/)
|
||
|
|
||
|
A streaming way to send data to a Node.js Worker Thread.
|
||
|
|
||
|
## install
|
||
|
|
||
|
```sh
|
||
|
npm i thread-stream
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
```js
|
||
|
'use strict'
|
||
|
|
||
|
const ThreadStream = require('thread-stream')
|
||
|
const { join } = require('path')
|
||
|
|
||
|
const stream = new ThreadStream({
|
||
|
filename: join(__dirname, 'worker.js'),
|
||
|
workerData: { dest },
|
||
|
workerOpts: {}, // Other options to be passed to Worker
|
||
|
sync: false, // default
|
||
|
})
|
||
|
|
||
|
stream.write('hello')
|
||
|
|
||
|
// Asynchronous flushing
|
||
|
stream.flush(function () {
|
||
|
stream.write(' ')
|
||
|
stream.write('world')
|
||
|
|
||
|
// Synchronous flushing
|
||
|
stream.flushSync()
|
||
|
stream.end()
|
||
|
})
|
||
|
```
|
||
|
|
||
|
In `worker.js`:
|
||
|
|
||
|
```js
|
||
|
'use strict'
|
||
|
|
||
|
const fs = require('fs')
|
||
|
const { once } = require('events')
|
||
|
|
||
|
async function run (opts) {
|
||
|
const stream = fs.createWriteStream(opts.dest)
|
||
|
await once(stream, 'open')
|
||
|
return stream
|
||
|
}
|
||
|
|
||
|
module.exports = run
|
||
|
```
|
||
|
|
||
|
Make sure that the stream emits `'close'` when the stream completes.
|
||
|
This can usually be achieved by passing the [`autoDestroy: true`](https://nodejs.org/api/stream.html#stream_new_stream_writable_options)
|
||
|
flag your stream classes.
|
||
|
|
||
|
The underlining worker is automatically closed if the stream is garbage collected.
|
||
|
|
||
|
|
||
|
### External modules
|
||
|
|
||
|
You may use this module within compatible external modules, that exports the `worker.js` interface.
|
||
|
|
||
|
```js
|
||
|
const ThreadStream = require('thread-stream')
|
||
|
|
||
|
const modulePath = require.resolve('pino-elasticsearch')
|
||
|
|
||
|
const stream = new ThreadStream({
|
||
|
filename: modulePath,
|
||
|
workerData: { node: 'http://localhost:9200' }
|
||
|
})
|
||
|
|
||
|
stream.write('log to elasticsearch!')
|
||
|
stream.flushSync()
|
||
|
stream.end()
|
||
|
```
|
||
|
|
||
|
This module works with `yarn` in PnP (plug'n play) mode too!
|
||
|
|
||
|
### Emit events
|
||
|
|
||
|
You can emit events on the ThreadStream from your worker using [`worker.parentPort.postMessage()`](https://nodejs.org/api/worker_threads.html#workerparentport).
|
||
|
The message (JSON object) must have the following data structure:
|
||
|
|
||
|
```js
|
||
|
parentPort.postMessage({
|
||
|
code: 'EVENT',
|
||
|
name: 'eventName',
|
||
|
args: ['list', 'of', 'args', 123, new Error('Boom')]
|
||
|
})
|
||
|
```
|
||
|
|
||
|
On your ThreadStream, you can add a listener function for this event name:
|
||
|
|
||
|
```js
|
||
|
const stream = new ThreadStream({
|
||
|
filename: join(__dirname, 'worker.js'),
|
||
|
workerData: {},
|
||
|
})
|
||
|
stream.on('eventName', function (a, b, c, n, err) {
|
||
|
console.log('received:', a, b, c, n, err) // received: list of args 123 Error: Boom
|
||
|
})
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
MIT
|