var fs = require('graceful-fs'); var Promise = require('bluebird'); var directory = require('./directory'); var Stream = require('stream'); // Backwards compatibility for node versions < 8 if (!Stream.Writable || !Stream.Writable.prototype.destroy) Stream = require('readable-stream'); module.exports = { buffer: function(buffer, options) { var source = { stream: function(offset, length) { var stream = Stream.PassThrough(); stream.end(buffer.slice(offset, length)); return stream; }, size: function() { return Promise.resolve(buffer.length); } }; return directory(source, options); }, file: function(filename, options) { var source = { stream: function(offset,length) { return fs.createReadStream(filename,{start: offset, end: length && offset+length}); }, size: function() { return new Promise(function(resolve,reject) { fs.stat(filename,function(err,d) { if (err) reject(err); else resolve(d.size); }); }); } }; return directory(source, options); }, url: function(request, params, options) { if (typeof params === 'string') params = {url: params}; if (!params.url) throw 'URL missing'; params.headers = params.headers || {}; var source = { stream : function(offset,length) { var options = Object.create(params); options.headers = Object.create(params.headers); options.headers.range = 'bytes='+offset+'-' + (length ? length : ''); return request(options); }, size: function() { return new Promise(function(resolve,reject) { var req = request(params); req.on('response',function(d) { req.abort(); if (!d.headers['content-length']) reject(new Error('Missing content length header')); else resolve(d.headers['content-length']); }).on('error',reject); }); } }; return directory(source, options); }, s3 : function(client,params, options) { var source = { size: function() { return new Promise(function(resolve,reject) { client.headObject(params, function(err,d) { if (err) reject(err); else resolve(d.ContentLength); }); }); }, stream: function(offset,length) { var d = {}; for (var key in params) d[key] = params[key]; d.Range = 'bytes='+offset+'-' + (length ? length : ''); return client.getObject(d).createReadStream(); } }; return directory(source, options); } };