index.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. var fs = require('graceful-fs');
  2. var Promise = require('bluebird');
  3. var directory = require('./directory');
  4. var Stream = require('stream');
  5. // Backwards compatibility for node versions < 8
  6. if (!Stream.Writable || !Stream.Writable.prototype.destroy)
  7. Stream = require('readable-stream');
  8. module.exports = {
  9. buffer: function(buffer, options) {
  10. var source = {
  11. stream: function(offset, length) {
  12. var stream = Stream.PassThrough();
  13. stream.end(buffer.slice(offset, length));
  14. return stream;
  15. },
  16. size: function() {
  17. return Promise.resolve(buffer.length);
  18. }
  19. };
  20. return directory(source, options);
  21. },
  22. file: function(filename, options) {
  23. var source = {
  24. stream: function(offset,length) {
  25. return fs.createReadStream(filename,{start: offset, end: length && offset+length});
  26. },
  27. size: function() {
  28. return new Promise(function(resolve,reject) {
  29. fs.stat(filename,function(err,d) {
  30. if (err)
  31. reject(err);
  32. else
  33. resolve(d.size);
  34. });
  35. });
  36. }
  37. };
  38. return directory(source, options);
  39. },
  40. url: function(request, params, options) {
  41. if (typeof params === 'string')
  42. params = {url: params};
  43. if (!params.url)
  44. throw 'URL missing';
  45. params.headers = params.headers || {};
  46. var source = {
  47. stream : function(offset,length) {
  48. var options = Object.create(params);
  49. options.headers = Object.create(params.headers);
  50. options.headers.range = 'bytes='+offset+'-' + (length ? length : '');
  51. return request(options);
  52. },
  53. size: function() {
  54. return new Promise(function(resolve,reject) {
  55. var req = request(params);
  56. req.on('response',function(d) {
  57. req.abort();
  58. if (!d.headers['content-length'])
  59. reject(new Error('Missing content length header'));
  60. else
  61. resolve(d.headers['content-length']);
  62. }).on('error',reject);
  63. });
  64. }
  65. };
  66. return directory(source, options);
  67. },
  68. s3 : function(client,params, options) {
  69. var source = {
  70. size: function() {
  71. return new Promise(function(resolve,reject) {
  72. client.headObject(params, function(err,d) {
  73. if (err)
  74. reject(err);
  75. else
  76. resolve(d.ContentLength);
  77. });
  78. });
  79. },
  80. stream: function(offset,length) {
  81. var d = {};
  82. for (var key in params)
  83. d[key] = params[key];
  84. d.Range = 'bytes='+offset+'-' + (length ? length : '');
  85. return client.getObject(d).createReadStream();
  86. }
  87. };
  88. return directory(source, options);
  89. },
  90. custom: function(source, options) {
  91. return directory(source, options);
  92. }
  93. };