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
						
					
					
				| # 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
 |