You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.7 KiB
98 lines
2.7 KiB
4 years ago
|
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);
|
||
|
}
|
||
|
};
|