Created
February 11, 2014 18:28
-
-
Save myndzi/8940959 to your computer and use it in GitHub Desktop.
Don't know if useful
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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