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
							 |