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
						
					
					
				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);
 | 
						|
  }
 | 
						|
};
 |