Skip to content

Instantly share code, notes, and snippets.

@rclark
Created October 10, 2014 04:44
Show Gist options
  • Save rclark/0a0d40dfd11b52e05030 to your computer and use it in GitHub Desktop.
Save rclark/0a0d40dfd11b52e05030 to your computer and use it in GitHub Desktop.
var AWS = require('aws-sdk');
var ReadableStream = AWS.util.nodeRequire('stream').Readable;
function bufferToStream(buffer) {
if (!AWS.util.Buffer.isBuffer(buffer)) buffer = new AWS.util.Buffer(buffer);
var readable = new ReadableStream();
var pos = 0;
readable._read = function(size) {
if (pos >= buffer.length) return readable.push(null);
var end = pos + size;
if (end > buffer.length) end = buffer.length;
readable.push(buffer.slice(pos, end));
pos = end;
};
return readable;
}
function bufferToStreamHighWater(buffer) {
if (!AWS.util.Buffer.isBuffer(buffer)) buffer = new AWS.util.Buffer(buffer);
var readable = new ReadableStream({ highWaterMark: 5 * Math.pow(1024, 2) });
var pos = 0;
readable._read = function(size) {
if (pos >= buffer.length) return readable.push(null);
var end = pos + size;
if (end > buffer.length) end = buffer.length;
readable.push(buffer.slice(pos, end));
pos = end;
};
return readable;
}
function bufferToStreamImmediate(buffer) {
if (!AWS.util.Buffer.isBuffer(buffer)) buffer = new AWS.util.Buffer(buffer);
var readable = new ReadableStream();
var pos = 0;
readable._read = function(size) {
if (pos >= buffer.length) return readable.push(null);
var end = pos + size;
if (end > buffer.length) end = buffer.length;
setImmediate(function() {
readable.push(buffer.slice(pos, end));
pos = end;
});
};
return readable;
}
var ten = new Buffer(10 * Math.pow(1024, 2));
var twenty = new Buffer(20 * Math.pow(1024, 2));
// Works: small enough
// bufferToStream(ten).pipe(process.stdout);
// Fails: too big
// bufferToStream(twenty).pipe(process.stdout);
// Works: highWaterMark
// bufferToStreamHighWater(twenty).pipe(process.stdout);
// Works: setImmediate
// bufferToStreamImmediate(twenty).pipe(process.stdout);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment