Skip to content

Instantly share code, notes, and snippets.

@myndzi
Created February 11, 2014 18:28
Show Gist options
  • Save myndzi/8940959 to your computer and use it in GitHub Desktop.
Save myndzi/8940959 to your computer and use it in GitHub Desktop.
Don't know if useful
'use strict';
var Promise = require('bluebird');
module.exports = getStreamData;
// return ascii character value from two ascii character values in hex representation
function fromHex(b1, b2) {
b1 -= 48; if (b1 > 9) { b1 -= 7; } // A -> 10
b2 -= 48; if (b2 > 9) { b2 -= 7; }
return b1 * 16 + b2;
};
function getStreamData(stream) {
var buffers = [ ], deferred = Promise.defer();
stream.on('data', function (chunk) {
buffers.push(chunk);
});
stream.on('error', function (err) {
deferred.reject(err);
});
stream.on('end', function () {
// lazy evaluation
buffers.__defineGetter__('buffer', function () {
var buf = Buffer.concat(buffers);
Object.defineProperty(buffers, 'buffer', {
value: buf
});
return buf;
});
buffers.__defineGetter__('fromQueryString', function () {
var buf = buffers.buffer, iskey = true,
key = [], val = [], obj = { },
i = 0, j = 0, x = buf.length;
while (i < x) {
switch(buf[i]) {
case 38: // &
iskey = true;
obj[(new Buffer(key)).toString()] = (new Buffer(val)).toString();
key.length = val.length = 0;
break;
case 61: // =
iskey = false;
break;
case 37: // %
i++;
(iskey ? key : val).push(fromHex(buf[i++], buf[i]));
break;
default:
(iskey ? key : val).push(buf[i]);
break;
}
i++;
}
obj[(new Buffer(key)).toString()] = (new Buffer(val)).toString();
Object.defineProperty(buffers, 'object', { value: obj });
buffers.__defineGetter__('string', function () {
var str = JSON.stringify(obj);
Object.defineProperty(buffers, 'string', {
value: str
});
return str;
});
buffers.__defineGetter__('buffer', function () {
var buf = new Buffer(buffers.string);
Object.defineProperty(buffers, 'buffer', {
value: buf
});
return buf;
});
return obj;
});
buffers.__defineGetter__('string', function (encoding) {
var str = buffers.buffer.toString(encoding);
Object.defineProperty(buffers, 'string', {
value: str
});
return str;
});
buffers.__defineGetter__
buffers.__defineGetter__('object', function () {
var obj;
try { obj = JSON.parse(buffers.string); }
catch (e) { obj = new Error(e); }
Object.defineProperty(buffers, 'object', {
value: obj
});
return obj;
});
deferred.resolve(buffers);
});
return deferred.promise;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment