|
1 | 1 | 'use strict' |
2 | 2 |
|
3 | | -const isStream = require('is-stream') |
4 | 3 | const promisify = require('promisify-es6') |
5 | | -const ProgressStream = require('../utils/progress-stream') |
6 | | -const converter = require('../utils/converter') |
| 4 | +const ConcatStream = require('concat-stream') |
| 5 | +const once = require('once') |
| 6 | +const isStream = require('is-stream') |
| 7 | +const SendFilesStream = require('../utils/send-files-stream') |
7 | 8 |
|
8 | 9 | module.exports = (send) => { |
9 | | - return promisify((files, opts, callback) => { |
10 | | - if (typeof opts === 'function') { |
11 | | - callback = opts |
12 | | - opts = {} |
13 | | - } |
| 10 | + const createAddStream = SendFilesStream(send, 'add') |
14 | 11 |
|
15 | | - opts = opts || {} |
16 | | - |
17 | | - const ok = Buffer.isBuffer(files) || |
18 | | - isStream.readable(files) || |
19 | | - Array.isArray(files) |
20 | | - |
21 | | - if (!ok) { |
22 | | - return callback(new Error('"files" must be a buffer, readable stream, or array of objects')) |
| 12 | + return promisify((_files, options, _callback) => { |
| 13 | + if (typeof options === 'function') { |
| 14 | + _callback = options |
| 15 | + options = null |
23 | 16 | } |
24 | 17 |
|
25 | | - const qs = {} |
| 18 | + const callback = once(_callback) |
26 | 19 |
|
27 | | - if (opts['cid-version'] != null) { |
28 | | - qs['cid-version'] = opts['cid-version'] |
29 | | - } else if (opts.cidVersion != null) { |
30 | | - qs['cid-version'] = opts.cidVersion |
| 20 | + if (!options) { |
| 21 | + options = {} |
31 | 22 | } |
32 | 23 |
|
33 | | - if (opts['raw-leaves'] != null) { |
34 | | - qs['raw-leaves'] = opts['raw-leaves'] |
35 | | - } else if (opts.rawLeaves != null) { |
36 | | - qs['raw-leaves'] = opts.rawLeaves |
37 | | - } |
| 24 | + const ok = Buffer.isBuffer(_files) || |
| 25 | + isStream.readable(_files) || |
| 26 | + Array.isArray(_files) |
38 | 27 |
|
39 | | - if (opts.hash != null) { |
40 | | - qs.hash = opts.hash |
41 | | - } else if (opts.hashAlg != null) { |
42 | | - qs.hash = opts.hashAlg |
| 28 | + if (!ok) { |
| 29 | + return callback(new Error('"files" must be a buffer, readable stream, or array of objects')) |
43 | 30 | } |
44 | 31 |
|
45 | | - const request = { path: 'add', files: files, qs: qs, progress: opts.progress } |
| 32 | + const files = [].concat(_files) |
| 33 | + |
| 34 | + const stream = createAddStream(options) |
| 35 | + const concat = ConcatStream((result) => callback(null, result)) |
| 36 | + stream.once('error', callback) |
| 37 | + stream.pipe(concat) |
46 | 38 |
|
47 | | - send.andTransform(request, (response, cb) => { |
48 | | - converter(ProgressStream.fromStream(opts.progress, response), cb) |
49 | | - }, callback) |
| 39 | + files.forEach((file) => stream.write(file)) |
| 40 | + stream.end() |
50 | 41 | }) |
51 | 42 | } |
0 commit comments