| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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);
- },
- custom: function(source, options) {
- return directory(source, options);
- }
- };
|