Spaces:
Sleeping
Sleeping
File size: 3,313 Bytes
6491ad4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | # 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
})
```
### Post Messages
You can post messages to the worker by emitting a `message` event on the ThreadStream.
```js
const stream = new ThreadStream({
filename: join(__dirname, 'worker.js'),
workerData: {},
})
stream.emit('message', message)
```
On your worker, you can listen for this message using [`worker.parentPort.on('message', cb)`](https://nodejs.org/api/worker_threads.html#event-message).
```js
const { parentPort } = require('worker_threads')
parentPort.on('message', function (message) {
console.log('received:', message)
})
```
## License
MIT
|