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.
		
		
		
		
		
			
		
			
				
					139 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					139 lines
				
				4.4 KiB
			| 
											3 years ago
										 | # combined-stream
 | ||
|  | 
 | ||
|  | A stream that emits multiple other streams one after another. | ||
|  | 
 | ||
|  | **NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`. | ||
|  | 
 | ||
|  | - [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module. | ||
|  | 
 | ||
|  | - [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another. | ||
|  | 
 | ||
|  | ## Installation
 | ||
|  | 
 | ||
|  | ``` bash | ||
|  | npm install combined-stream | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Usage
 | ||
|  | 
 | ||
|  | Here is a simple example that shows how you can use combined-stream to combine | ||
|  | two files into one: | ||
|  | 
 | ||
|  | ``` javascript | ||
|  | var CombinedStream = require('combined-stream'); | ||
|  | var fs = require('fs'); | ||
|  | 
 | ||
|  | var combinedStream = CombinedStream.create(); | ||
|  | combinedStream.append(fs.createReadStream('file1.txt')); | ||
|  | combinedStream.append(fs.createReadStream('file2.txt')); | ||
|  | 
 | ||
|  | combinedStream.pipe(fs.createWriteStream('combined.txt')); | ||
|  | ``` | ||
|  | 
 | ||
|  | While the example above works great, it will pause all source streams until | ||
|  | they are needed. If you don't want that to happen, you can set `pauseStreams` | ||
|  | to `false`: | ||
|  | 
 | ||
|  | ``` javascript | ||
|  | var CombinedStream = require('combined-stream'); | ||
|  | var fs = require('fs'); | ||
|  | 
 | ||
|  | var combinedStream = CombinedStream.create({pauseStreams: false}); | ||
|  | combinedStream.append(fs.createReadStream('file1.txt')); | ||
|  | combinedStream.append(fs.createReadStream('file2.txt')); | ||
|  | 
 | ||
|  | combinedStream.pipe(fs.createWriteStream('combined.txt')); | ||
|  | ``` | ||
|  | 
 | ||
|  | However, what if you don't have all the source streams yet, or you don't want | ||
|  | to allocate the resources (file descriptors, memory, etc.) for them right away? | ||
|  | Well, in that case you can simply provide a callback that supplies the stream | ||
|  | by calling a `next()` function: | ||
|  | 
 | ||
|  | ``` javascript | ||
|  | var CombinedStream = require('combined-stream'); | ||
|  | var fs = require('fs'); | ||
|  | 
 | ||
|  | var combinedStream = CombinedStream.create(); | ||
|  | combinedStream.append(function(next) { | ||
|  |   next(fs.createReadStream('file1.txt')); | ||
|  | }); | ||
|  | combinedStream.append(function(next) { | ||
|  |   next(fs.createReadStream('file2.txt')); | ||
|  | }); | ||
|  | 
 | ||
|  | combinedStream.pipe(fs.createWriteStream('combined.txt')); | ||
|  | ``` | ||
|  | 
 | ||
|  | ## API
 | ||
|  | 
 | ||
|  | ### CombinedStream.create([options])
 | ||
|  | 
 | ||
|  | Returns a new combined stream object. Available options are: | ||
|  | 
 | ||
|  | * `maxDataSize` | ||
|  | * `pauseStreams` | ||
|  | 
 | ||
|  | The effect of those options is described below. | ||
|  | 
 | ||
|  | ### combinedStream.pauseStreams = `true`
 | ||
|  | 
 | ||
|  | Whether to apply back pressure to the underlaying streams. If set to `false`, | ||
|  | the underlaying streams will never be paused. If set to `true`, the | ||
|  | underlaying streams will be paused right after being appended, as well as when | ||
|  | `delayedStream.pipe()` wants to throttle. | ||
|  | 
 | ||
|  | ### combinedStream.maxDataSize = `2 * 1024 * 1024`
 | ||
|  | 
 | ||
|  | The maximum amount of bytes (or characters) to buffer for all source streams. | ||
|  | If this value is exceeded, `combinedStream` emits an `'error'` event. | ||
|  | 
 | ||
|  | ### combinedStream.dataSize = `0`
 | ||
|  | 
 | ||
|  | The amount of bytes (or characters) currently buffered by `combinedStream`. | ||
|  | 
 | ||
|  | ### combinedStream.append(stream)
 | ||
|  | 
 | ||
|  | Appends the given `stream` to the combinedStream object. If `pauseStreams` is | ||
|  | set to `true, this stream will also be paused right away. | ||
|  | 
 | ||
|  | `streams` can also be a function that takes one parameter called `next`. `next` | ||
|  | is a function that must be invoked in order to provide the `next` stream, see | ||
|  | example above. | ||
|  | 
 | ||
|  | Regardless of how the `stream` is appended, combined-stream always attaches an | ||
|  | `'error'` listener to it, so you don't have to do that manually. | ||
|  | 
 | ||
|  | Special case: `stream` can also be a String or Buffer. | ||
|  | 
 | ||
|  | ### combinedStream.write(data)
 | ||
|  | 
 | ||
|  | You should not call this, `combinedStream` takes care of piping the appended | ||
|  | streams into itself for you. | ||
|  | 
 | ||
|  | ### combinedStream.resume()
 | ||
|  | 
 | ||
|  | Causes `combinedStream` to start drain the streams it manages. The function is | ||
|  | idempotent, and also emits a `'resume'` event each time which usually goes to | ||
|  | the stream that is currently being drained. | ||
|  | 
 | ||
|  | ### combinedStream.pause();
 | ||
|  | 
 | ||
|  | If `combinedStream.pauseStreams` is set to `false`, this does nothing. | ||
|  | Otherwise a `'pause'` event is emitted, this goes to the stream that is | ||
|  | currently being drained, so you can use it to apply back pressure. | ||
|  | 
 | ||
|  | ### combinedStream.end();
 | ||
|  | 
 | ||
|  | Sets `combinedStream.writable` to false, emits an `'end'` event, and removes | ||
|  | all streams from the queue. | ||
|  | 
 | ||
|  | ### combinedStream.destroy();
 | ||
|  | 
 | ||
|  | Same as `combinedStream.end()`, except it emits a `'close'` event instead of | ||
|  | `'end'`. | ||
|  | 
 | ||
|  | ## License
 | ||
|  | 
 | ||
|  | combined-stream is licensed under the MIT license. |