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.
		
		
		
		
		
			
		
			
				
					102 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					102 lines
				
				2.8 KiB
			| 
								 
											3 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);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  custom: function(source, options) {
							 | 
						||
| 
								 | 
							
								    return directory(source, options);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 |