diff options
Diffstat (limited to 'node_modules/unique-stream')
-rw-r--r-- | node_modules/unique-stream/.npmignore | 3 | ||||
-rw-r--r-- | node_modules/unique-stream/.travis.yml | 3 | ||||
-rw-r--r-- | node_modules/unique-stream/LICENSE | 20 | ||||
-rw-r--r-- | node_modules/unique-stream/README.md | 89 | ||||
-rw-r--r-- | node_modules/unique-stream/index.js | 54 | ||||
-rw-r--r-- | node_modules/unique-stream/package.json | 89 | ||||
-rw-r--r-- | node_modules/unique-stream/test/index.js | 109 |
7 files changed, 367 insertions, 0 deletions
diff --git a/node_modules/unique-stream/.npmignore b/node_modules/unique-stream/.npmignore new file mode 100644 index 000000000..444303937 --- /dev/null +++ b/node_modules/unique-stream/.npmignore @@ -0,0 +1,3 @@ +*.swp +.DS_Store +node_modules/ diff --git a/node_modules/unique-stream/.travis.yml b/node_modules/unique-stream/.travis.yml new file mode 100644 index 000000000..6e5919de3 --- /dev/null +++ b/node_modules/unique-stream/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "0.10" diff --git a/node_modules/unique-stream/LICENSE b/node_modules/unique-stream/LICENSE new file mode 100644 index 000000000..cd2225ad8 --- /dev/null +++ b/node_modules/unique-stream/LICENSE @@ -0,0 +1,20 @@ +Copyright 2014 Eugene Ware + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/unique-stream/README.md b/node_modules/unique-stream/README.md new file mode 100644 index 000000000..f19b20a37 --- /dev/null +++ b/node_modules/unique-stream/README.md @@ -0,0 +1,89 @@ +# unique-stream + +node.js through stream that emits a unique stream of objects based on criteria + +[![build status](https://secure.travis-ci.org/eugeneware/unique-stream.png)](http://travis-ci.org/eugeneware/unique-stream) + +## Installation + +Install via npm: + +``` +$ npm install unique-stream +``` + +## Examples + +### Dedupe a ReadStream based on JSON.stringify: + +``` js +var unique = require('unique-stream') + , Stream = require('stream'); + +// return a stream of 3 identical objects +function makeStreamOfObjects() { + var s = new Stream; + s.readable = true; + var count = 3; + for (var i = 0; i < 3; i++) { + setImmediate(function () { + s.emit('data', { name: 'Bob', number: 123 }); + --count && end(); + }); + } + + function end() { + s.emit('end'); + } + + return s; +} + +// Will only print out one object as the rest are dupes. (Uses JSON.stringify) +makeStreamOfObjects() + .pipe(unique()) + .on('data', console.log); + +``` + +### Dedupe a ReadStream based on an object property: + +``` js +// Use name as the key field to dedupe on. Will only print one object +makeStreamOfObjects() + .pipe(unique('name')) + .on('data', console.log); +``` + +### Dedupe a ReadStream based on a custom function: + +``` js +// Use a custom function to dedupe on. Use the 'number' field. Will only print one object. +makeStreamOfObjects() + .pipe(function (data) { + return data.number; + }) + .on('data', console.log); +``` + +## Dedupe multiple streams + +The reason I wrote this was to dedupe multiple object streams: + +``` js +var aggregator = unique(); + +// Stream 1 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 2 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 3 +makeStreamOfObjects() + .pipe(aggregator); + +aggregator.on('data', console.log); +``` diff --git a/node_modules/unique-stream/index.js b/node_modules/unique-stream/index.js new file mode 100644 index 000000000..0c13168e5 --- /dev/null +++ b/node_modules/unique-stream/index.js @@ -0,0 +1,54 @@ +var Stream = require('stream'); + +function prop(propName) { + return function (data) { + return data[propName]; + }; +} + +module.exports = unique; +function unique(propName) { + var keyfn = JSON.stringify; + if (typeof propName === 'string') { + keyfn = prop(propName); + } else if (typeof propName === 'function') { + keyfn = propName; + } + var seen = {}; + var s = new Stream(); + s.readable = true; + s.writable = true; + var pipes = 0; + + s.write = function (data) { + var key = keyfn(data); + if (seen[key] === undefined) { + seen[key] = true; + s.emit('data', data); + } + }; + + var ended = 0; + s.end = function (data) { + if (arguments.length) s.write(data); + ended++; + if (ended === pipes || pipes === 0) { + s.writable = false; + s.emit('end'); + } + }; + + s.destroy = function (data) { + s.writable = false; + }; + + s.on('pipe', function () { + pipes++; + }); + + s.on('unpipe', function () { + pipes--; + }); + + return s; +} diff --git a/node_modules/unique-stream/package.json b/node_modules/unique-stream/package.json new file mode 100644 index 000000000..540b29983 --- /dev/null +++ b/node_modules/unique-stream/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + { + "raw": "unique-stream@^1.0.0", + "scope": null, + "escapedName": "unique-stream", + "name": "unique-stream", + "rawSpec": "^1.0.0", + "spec": ">=1.0.0 <2.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/glob-stream" + ] + ], + "_from": "unique-stream@>=1.0.0 <2.0.0", + "_id": "unique-stream@1.0.0", + "_inCache": true, + "_location": "/unique-stream", + "_npmUser": { + "name": "eugeneware", + "email": "eugene@noblesamurai.com" + }, + "_npmVersion": "1.4.3", + "_phantomChildren": {}, + "_requested": { + "raw": "unique-stream@^1.0.0", + "scope": null, + "escapedName": "unique-stream", + "name": "unique-stream", + "rawSpec": "^1.0.0", + "spec": ">=1.0.0 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/glob-stream" + ], + "_resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "_shasum": "d59a4a75427447d9aa6c91e70263f8d26a4b104b", + "_shrinkwrap": null, + "_spec": "unique-stream@^1.0.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/glob-stream", + "author": { + "name": "Eugene Ware", + "email": "eugene@noblesamurai.com" + }, + "bugs": { + "url": "https://github.com/eugeneware/unique-stream/issues" + }, + "dependencies": {}, + "description": "node.js through stream that emits a unique stream of objects based on criteria", + "devDependencies": { + "after": "~0.8.1", + "chai": "~1.7.2", + "mocha": "^1.18.2" + }, + "directories": {}, + "dist": { + "shasum": "d59a4a75427447d9aa6c91e70263f8d26a4b104b", + "tarball": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz" + }, + "homepage": "https://github.com/eugeneware/unique-stream", + "keywords": [ + "unique", + "stream", + "unique-stream", + "streaming", + "streams" + ], + "license": "BSD", + "main": "index.js", + "maintainers": [ + { + "name": "eugeneware", + "email": "eugene@noblesamurai.com" + } + ], + "name": "unique-stream", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/eugeneware/unique-stream.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "1.0.0" +} diff --git a/node_modules/unique-stream/test/index.js b/node_modules/unique-stream/test/index.js new file mode 100644 index 000000000..fca02b7e1 --- /dev/null +++ b/node_modules/unique-stream/test/index.js @@ -0,0 +1,109 @@ +var expect = require('chai').expect + , unique = require('..') + , Stream = require('stream') + , after = require('after') + , setImmediate = global.setImmediate || process.nextTick; + +describe('unique stream', function() { + + function makeStream(type) { + var s = new Stream(); + s.readable = true; + + var n = 10; + var next = after(n, function () { + setImmediate(function () { + s.emit('end'); + }); + }); + + for (var i = 0; i < n; i++) { + var o = { + type: type, + name: 'name ' + i, + number: i * 10 + }; + + (function (o) { + setImmediate(function () { + s.emit('data', o); + next(); + }); + })(o); + } + return s; + } + + it('should be able to uniqueify objects based on JSON data', function(done) { + var aggregator = unique(); + makeStream('a') + .pipe(aggregator); + makeStream('a') + .pipe(aggregator); + + var n = 0; + aggregator + .on('data', function () { + n++; + }) + .on('end', function () { + expect(n).to.equal(10); + done(); + }); + }); + + it('should be able to uniqueify objects based on a property', function(done) { + var aggregator = unique('number'); + makeStream('a') + .pipe(aggregator); + makeStream('b') + .pipe(aggregator); + + var n = 0; + aggregator + .on('data', function () { + n++; + }) + .on('end', function () { + expect(n).to.equal(10); + done(); + }); + }); + + it('should be able to uniqueify objects based on a function', function(done) { + var aggregator = unique(function (data) { + return data.name; + }); + + makeStream('a') + .pipe(aggregator); + makeStream('b') + .pipe(aggregator); + + var n = 0; + aggregator + .on('data', function () { + n++; + }) + .on('end', function () { + expect(n).to.equal(10); + done(); + }); + }); + + it('should be able to handle uniqueness when not piped', function(done) { + var stream = unique(); + var count = 0; + stream.on('data', function (data) { + expect(data).to.equal('hello'); + count++; + }); + stream.on('end', function() { + expect(count).to.equal(1); + done(); + }); + stream.write('hello'); + stream.write('hello'); + stream.end(); + }); +}); |