1.0.0: Initial release
parent
9dabbe3b12
commit
ac9f516a79
@ -0,0 +1 @@
|
||||
/node_modules/
|
@ -0,0 +1,52 @@
|
||||
# through2-buffer
|
||||
|
||||
A simple `through2` stream that buffers up a certain amount of data before passing anything through.
|
||||
|
||||
This module generates a simple Transform stream that you can use in any (non-object-mode) pipeline, and that will only do a single thing: buffer up a stream to a certain amount. It's useful for eg. audio/video streams, where you want to have a 'headstart' to prevent underruns if your encoding process stalls for a moment.
|
||||
|
||||
The `through2-buffer` will start out in __buffering mode__, and keep collecting incoming chunks of data until it hits the configured buffer size. At that moment, it switches to __flowing mode__, outputs the chunks it has collected, and pass through everything that comes afterwards.
|
||||
|
||||
Once the stream is in flowing mode, it will *never* go back to buffering mode; this is to prevent hiccups in the source stream from causing delayed hiccups in the output. You should make sure that your initial buffer is large enough to cover *all* the hiccups that you will encounter throughout the life of the stream.
|
||||
|
||||
## License
|
||||
|
||||
[WTFPL](http://www.wtfpl.net/txt/copying/) or [CC0](https://creativecommons.org/publicdomain/zero/1.0/), whichever you prefer. A donation and/or attribution are appreciated, but not required.
|
||||
|
||||
## Donate
|
||||
|
||||
My income consists largely of donations for my projects. If this module is useful to you, consider [making a donation](http://cryto.net/~joepie91/donate.html)!
|
||||
|
||||
You can donate using Bitcoin, PayPal, Flattr, cash-in-mail, SEPA transfers, and pretty much anything else.
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests welcome. Please make sure your modifications are in line with the overall code style, and ensure that you're editing the files in `src/`, not those in `lib/`.
|
||||
|
||||
Build tool of choice is `gulp`; simply run `gulp` while developing, and it will watch for changes.
|
||||
|
||||
Be aware that by making a pull request, you agree to release your modifications under the licenses stated above.
|
||||
|
||||
## Usage
|
||||
|
||||
__Please be careful not to require the module as `Buffer` or `buffer`! That would cause confusion with the built-in `Buffer` type in Node.js.__
|
||||
|
||||
The following example would keep reading data from `/dev/urandom` (and converting it to hexadecimal representation), and buffer 5 MiB of it. After that it will switch into flowing mode and pass everything through to the terminal, *including* the originally buffered data.
|
||||
|
||||
```javascript
|
||||
'use strict';
|
||||
|
||||
const through2Buffer = require("through2-buffer");
|
||||
const fs = require("fs");
|
||||
|
||||
fs.createReadStream("/dev/urandom", "hex")
|
||||
.pipe(streamBuffer(5 * 1024 * 1024)) /* 5 MiB buffer size */
|
||||
.pipe(process.stdout);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### through2Buffer(bufferSize)
|
||||
|
||||
Creates and returns a new `through2-buffer` stream. Like all Node.js streams, this stream is __single-use__.
|
||||
|
||||
* __bufferSize__: The amount of bytes to buffer before switching into flowing mode.
|
@ -0,0 +1,18 @@
|
||||
var gulp = require("gulp");
|
||||
var presetES2015 = require("@joepie91/gulp-preset-es2015");
|
||||
|
||||
var source = ["src/**/*.js"]
|
||||
|
||||
gulp.task('babel', function() {
|
||||
return gulp.src(source)
|
||||
.pipe(presetES2015({
|
||||
basePath: __dirname
|
||||
}))
|
||||
.pipe(gulp.dest("lib/"));
|
||||
});
|
||||
|
||||
gulp.task("watch", function () {
|
||||
gulp.watch(source, ["babel"]);
|
||||
});
|
||||
|
||||
gulp.task("default", ["babel", "watch"]);
|
@ -0,0 +1,3 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = require("./lib");
|
@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "through2-buffer",
|
||||
"version": "1.0.0",
|
||||
"description": "A simple through2 stream that buffers up a certain amount of data before passing anything through",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://git.cryto.net/joepie91/node-through2-buffer.git"
|
||||
},
|
||||
"keywords": [
|
||||
"through2",
|
||||
"streams",
|
||||
"buffering"
|
||||
],
|
||||
"author": "Sven Slootweg",
|
||||
"license": "WTFPL",
|
||||
"dependencies": {
|
||||
"bl": "^1.1.2",
|
||||
"debug": "^2.2.0",
|
||||
"through2": "^2.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@joepie91/gulp-preset-es2015": "^1.0.1",
|
||||
"babel-preset-es2015": "^6.6.0",
|
||||
"gulp": "^3.9.1"
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
|
||||
const bl = require("bl");
|
||||
const through2 = require("through2");
|
||||
const debug = require("debug")("through2-buffer");
|
||||
|
||||
module.exports = function(bufferSize) {
|
||||
let buff = bl();
|
||||
let flowing = false;
|
||||
|
||||
return through2(function(chunk, encoding, cb) {
|
||||
if (flowing) {
|
||||
this.push(chunk);
|
||||
} else {
|
||||
debug(`Buffering chunk of size ${chunk.length}`);
|
||||
buff.append(chunk);
|
||||
debug(`Buffer length now ${buff.length}`);
|
||||
|
||||
if (buff.length >= bufferSize) {
|
||||
debug("Buffer limit reached; setting to flowing mode");
|
||||
flowing = true;
|
||||
this.push(buff.read(buff.length));
|
||||
}
|
||||
}
|
||||
|
||||
cb();
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue