Hello everyone,
I have been writing and publishing tools and modules this year without advertising much any of them. Most of them are related in some way to what I do at work and all of them have been published as to be as general purpose as possible.
Since publishing is always funnier with real life feedback, I decided to make a list of the stuff I've been working on.
Here is a list of things I've published and might be useful to you :
stream-stream
> A stream of streams in order to concatenate the contents of several streams
var ss = require('stream-stream');
var fs = require('fs');
var files = ['a.txt', 'b.txt', 'c.txt'];
var stream = ss();
files.forEach(function(f) {
stream.write(fs.createReadStream(f));
});
stream.end();
stream.pipe(process.stdout);
stream-write-read
> Write to a file, read when it's done
var WriteRead = require('stream-write-read');
var cache = WriteRead('/my/cache/folder/file');
cache.createReadable().pipe(destination);
source.pipe(cache);
stream-sink
> Collect all data piped to this stream when it ends
Useful for testing purposes
var sink = require('stream-sink');
readable.pipe(sink()).on('data', function(data) {
// YAY!
});
stream-blackhole
> A silly writable stream eating all data
Useful when you need to consume a readable stream but don't care about its data
var blackhole = require('stream-blackhole');
process.stdin.pipe(blackhole());
duplex-maker
> Create a duplex stream from a writable and a readable
var writable = fs.createWriteStream('/to/write');
var readable = fs.createReadStream('/to/read');
var duplex = DuplexMaker(writable, readable);
ka-ching
> Caching framework for streams
ka-ching is one of these larger projects that all of the others come from. It can do many things and is mostly functional. It still needs some polishing and battle testing though.
var kaChing = require('ka-ching')('/path/to/cache/dir');
var request = require('request');
kaChing('my-cached-resource-id', function () {
return request('http://google.com/');
}).pipe(destination);
cache-depend
> Utility functions to detect when you should invalidate your cached data
var onDate = require('cache-depend')
.date('2015-06-23 12:36:00')
onDate.on('change', function (changeinfo) {
changeinfo.changeId
changeinfo.startedAt
changeinfo.endedAt
// Same here
})
var onOthers = require('cache-depend')
.others(onEtag, onDate) // any number of arguments
onOthers.on('change', function (changeinfo) {
changeinfo.changeId // is the same as the one emitted by the first to change
changeinfo.changed // reference to the changing dependency
})
stream-json-stringify
> JSON.stringify, streaming, non-blocking
Still has some inconsistencies with the behaviour of JSON.stringify in some edge cases but this is being worked on
var stringify = require('stream-json-stringify');
stringify(myBigObject).pipe(process.stdout);
object-iterator
> a module to walk through an object with an iterator
var oi = require('object-iterator');
var source = [8, {one: 1, yes: true}, null];
var next = oi(source);
var v;
while(v = next()) {
console.log(v.type);
}
// array
// number
// object
// number
// boolean
// end-object
// null
// end-array
url-assembler
> assemble URLs from route-like templates (/path/:param)
http-measuring-client
> Like the http module, except with stats
Drop-in replacement for http/https modules. Can also monkey-patch the native modules if necessary
var http = require('http-measuring-client').create();
http.get('http://google.com', function (response) {
// `response` is your plain old response object
});
http.on('stat', function (parsedUri, stats) {
// `parseUri` is parsed with url.parse();
stats.totalTime; // -> total time taken for request
})
disect
> Bisection helper for javascript
disect([10, 20, 30], function(element, index) {
return element > 11;
})
// returns 20
crossroad
> Semantically-versionned service discovery
This one is my latest work in progress and is therefore not yet functional, but is evolving very quickly
the main design principles are
- one sidekick process running per host (agent)
- gossip between agents to synchronise running services
- HTTP is the communication protocol
- The client is your regular HTTP client
- Proactive and Reactive consumption from clients
GET /services/my-web-service/~1.0.1
Host: localhost:5555
Accept: application/json
-> 200 OK
-> Content-Type: application/json
->
-> {
-> "type": "my-web-service",
-> "uuid": "my-web-service-bd80ddff76e8ae5",
-> "version": "1.0.3",
-> "location": {
-> "host": "172.50.60.22",
-> "port": 8080
-> }
-> }