Skip to content
This repository was archived by the owner on Mar 10, 2020. It is now read-only.

Commit 0e85b16

Browse files
committed
feat: avoid doing multiple RPC requests for files.add, fixes #522
1 parent 76358e9 commit 0e85b16

File tree

6 files changed

+33
-51
lines changed

6 files changed

+33
-51
lines changed

src/files/add.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const isStream = require('is-stream')
44
const promisify = require('promisify-es6')
5-
const DAGNodeStream = require('../utils/dagnode-stream')
5+
const converter = require('../utils/converter')
66

77
module.exports = (send) => {
88
return promisify((files, opts, callback) => {
@@ -23,8 +23,6 @@ module.exports = (send) => {
2323

2424
const request = { path: 'add', files: files, qs: opts }
2525

26-
// Transform the response stream to DAGNode values
27-
const transform = (res, callback) => DAGNodeStream.streamToValue(send, res, callback)
28-
send.andTransform(request, transform, callback)
26+
send.andTransform(request, converter, callback)
2927
})
3028
}

src/util/fs-add.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const isNode = require('detect-node')
44
const promisify = require('promisify-es6')
5-
const DAGNodeStream = require('../utils/dagnode-stream')
5+
const converter = require('../utils/converter')
66
const moduleConfig = require('../utils/module-config')
77

88
module.exports = (arg) => {
@@ -31,14 +31,7 @@ module.exports = (arg) => {
3131
return callback(new Error('"path" must be a string'))
3232
}
3333

34-
const request = {
35-
path: 'add',
36-
qs: opts,
37-
files: path
38-
}
39-
40-
// Transform the response stream to DAGNode values
41-
const transform = (res, callback) => DAGNodeStream.streamToValue(send, res, callback)
42-
send.andTransform(request, transform, callback)
34+
const request = { path: 'add', files: path, qs: opts }
35+
send.andTransform(request, converter, callback)
4336
})
4437
}

src/util/url-add.js

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const promisify = require('promisify-es6')
44
const once = require('once')
55
const parseUrl = require('url').parse
66
const request = require('../utils/request')
7-
const DAGNodeStream = require('../utils/dagnode-stream')
7+
const converter = require('../utils/converter')
88
const moduleConfig = require('../utils/module-config')
99

1010
module.exports = (arg) => {
@@ -25,12 +25,12 @@ module.exports = (arg) => {
2525
opts = {}
2626
}
2727

28+
callback = once(callback)
29+
2830
if (!validUrl(url)) {
2931
return callback(new Error('"url" param must be an http(s) url'))
3032
}
3133

32-
callback = once(callback)
33-
3434
requestWithRedirect(url, opts, send, callback)
3535
})
3636
}
@@ -52,14 +52,9 @@ const requestWithRedirect = (url, opts, send, callback) => {
5252
}
5353
requestWithRedirect(redirection, opts, send, callback)
5454
} else {
55-
const params = {
56-
path: 'add',
57-
qs: opts,
58-
files: res
59-
}
60-
// Transform the response stream to DAGNode values
61-
const transform = (res, callback) => DAGNodeStream.streamToValue(send, res, callback)
62-
send.andTransform(params, transform, callback)
55+
const request = { path: 'add', files: res, qs: opts }
56+
57+
send.andTransform(request, converter, callback)
6358
}
6459
}).end()
6560
}
File renamed without changes.

src/utils/dagnode-stream.js renamed to src/utils/converter.js

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
const pump = require('pump')
44
const TransformStream = require('readable-stream').Transform
55
const streamToValue = require('./stream-to-value')
6-
const getDagNode = require('./get-dagnode')
76

87
/*
98
Transforms a stream of {Name, Hash} objects to include size
109
of the DAG object.
1110
12-
Usage: inputStream.pipe(DAGNodeStream({ send: send }))
11+
Usage: inputStream.pipe(new Converter())
1312
1413
Input object format:
1514
{
1615
Name: '/path/to/file/foo.txt',
1716
Hash: 'Qma4hjFTnCasJ8PVp3mZbZK5g2vGDT4LByLJ7m8ciyRFZP'
17+
Size: '20'
1818
}
1919
2020
Output object format:
@@ -24,38 +24,34 @@ const getDagNode = require('./get-dagnode')
2424
size: 20
2525
}
2626
*/
27-
class DAGNodeStream extends TransformStream {
27+
class ConverterStream extends TransformStream {
2828
constructor (options) {
2929
const opts = Object.assign(options || {}, { objectMode: true })
3030
super(opts)
31-
this._send = opts.send
3231
}
3332

34-
static streamToValue (send, inputStream, callback) {
35-
const outputStream = pump(inputStream, new DAGNodeStream({ send: send }), (err) => {
36-
if (err) {
37-
callback(err)
38-
}
33+
_transform (obj, enc, callback) {
34+
this.push({
35+
path: obj.Name,
36+
hash: obj.Hash,
37+
size: parseInt(obj.Size, 10)
3938
})
40-
streamToValue(outputStream, callback)
39+
40+
callback(null)
4141
}
42+
}
4243

43-
_transform (obj, enc, callback) {
44-
getDagNode(this._send, obj.Hash, (err, node) => {
44+
function converter (inputStream, callback) {
45+
const outputStream = pump(
46+
inputStream,
47+
new ConverterStream(),
48+
(err) => {
4549
if (err) {
46-
return callback(err)
47-
}
48-
49-
const result = {
50-
path: obj.Name,
51-
hash: obj.Hash,
52-
size: node.size
50+
callback(err)
5351
}
54-
55-
this.push(result)
56-
callback(null)
5752
})
58-
}
53+
54+
streamToValue(outputStream, callback)
5955
}
6056

61-
module.exports = DAGNodeStream
57+
module.exports = converter

src/utils/stream-to-value.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ const concat = require('concat-stream')
66
/*
77
Concatenate a stream to a single value.
88
*/
9-
function streamToValue (res, callback) {
9+
function streamToValue (response, callback) {
1010
pump(
11-
res,
11+
response,
1212
concat((data) => callback(null, data)),
1313
(err) => {
1414
if (err) {

0 commit comments

Comments
 (0)