diff --git a/lib/args.js b/lib/args.js index 489da20..91ee2ed 100644 --- a/lib/args.js +++ b/lib/args.js @@ -4,6 +4,7 @@ var argsToArray = require('./utils').argsToArray; var isUtil = require('./utils').isUtil; +var isReadableStream = require('./utils').isReadableStream; var tmp = require('tmp'); var fs = require('fs'); /** @@ -95,12 +96,16 @@ module.exports = function (proto) { this._append.push(arg[j]); } else if (Buffer.isBuffer(arg[j])) { appendBuffer(this, arg[j]); + } else if (isReadableStream(arg)) { + appendStream(this, arg[j]); } } break; case 'object': if (Buffer.isBuffer(arg)) { appendBuffer(this, arg); + } else if (isReadableStream(arg)) { + appendStream(this, arg); } break; } @@ -120,6 +125,31 @@ module.exports = function (proto) { return true; } + + function appendStream(self, stream) { + var tmpFileName = tmp.tmpNameSync(); + + self._append.push(tmpFileName); + + var file = fs.createWriteStream(tmpFileName); + + self.preprocessor(function (callback) { + var finished = false; + + function ended(err) { + if (!finished) { + finished = true; + callback(err); + } + } + + file.on('finish', ended); + + stream.pipe(file); + }); + + return true; + } return this; } diff --git a/lib/utils.js b/lib/utils.js index 871add4..ef3df27 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,3 +1,4 @@ +var stream = require('stream'); /** * Escape the given shell `arg`. @@ -40,4 +41,12 @@ exports.isUtil = function (v) { break; } return ty; +} + +var isStream = exports.isStream = function isStream(obj) { + return obj instanceof stream.Stream; +} + +exports.isReadableStream = function isReadableStream(obj) { + return isStream(obj) && typeof obj._read == 'function' && typeof obj._readableState == 'object'; } \ No newline at end of file diff --git a/test/appendStream.js b/test/appendStream.js new file mode 100644 index 0000000..7eb2d21 --- /dev/null +++ b/test/appendStream.js @@ -0,0 +1,78 @@ +var assert = require('assert') + , fs = require('fs') + , paths = require('path') + ; + +module.exports = function (_, dir, finish, gm) { + var out = paths.resolve(dir + '/appendBuffer.jpg'); + + try { + require('fs').unlinkSync(out); + } catch (_) {} + + var buffer = fs.createReadStream(dir + '/original.jpg'); + var buffer2 = fs.createReadStream(dir + '/original.jpg'); + + var m = gm(dir + '/lost.png') + .append(dir + '/original.jpg') + .append(buffer, buffer2) + .append() + .background('#222') + + var args = m.args(); + assert.equal('convert', args[0]); + assert.equal('-background',args[1]); + assert.equal('#222',args[2]); + assert.ok(/examples\/imgs\/lost\.png$/.test(args[3])); + assert.ok(/examples\/imgs\/original\.jpg$/,args[4]); + assert.equal('-append',args[7]); + assert.equal('-',args[8]); + + if (!gm.integration) { + return horizontal(dir, finish, gm); + } + + + m.write(out, function (err) { + if (err) return finish(err); + gm(out).size(function (err, size) { + if (err) return finish(err); + assert.equal(460, size.width); + assert.equal(590, size.height); + + horizontal(dir, finish, gm); + }) + }); +} + +function horizontal (dir, finish, gm) { + var out = paths.resolve(dir + '/appendBufferHorizontal.jpg'); + + var buffer = fs.createReadStream(dir + '/lost.png'); + + var m = gm(dir + '/original.jpg') + .append(buffer, true); + + var args = m.args(); + assert.equal('convert', args[0]); + assert.ok(/examples\/imgs\/original\.jpg$/.test(args[1])); + assert.equal('+append',args[3]); + assert.equal('-',args[4]); + + if (!gm.integration) { + return finish(); + } + + m + .write(out, function (err) { + if (err) return finish(err); + gm(out).size(function (err, size) { + if (err) return finish(err); + assert.equal(697, size.width); + assert.equal(155, size.height); + + finish(); + }) + }); + +}