Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit 049f085

Browse files
authored
fix: pass timeout arg to server (#2979)
Refactors how we pass url params to the API, all args are now normalised in one place. If a timeout is passed it is passed on to the server as a url search param. N.b. this does mean that timeouts are set in the client and on the server so it's not always clear which will expire first, though one will expire. We do our best to ensure the errors are the same, though when the API is streaming there's no way to tell if the request completed successfully or if the timeout occurred as the timeout message arrives in http trailers.
1 parent 73d8fbb commit 049f085

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+532
-353
lines changed

packages/interface-ipfs-core/src/dht/find-provs.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,20 @@ module.exports = (common, options) => {
6767
}
6868

6969
const cidV0 = await fakeCid()
70+
const start = Date.now()
71+
let res
7072

71-
await expect(all(nodeA.dht.findProvs(cidV0, options))).to.be.rejected()
73+
try {
74+
res = await all(nodeA.dht.findProvs(cidV0, options))
75+
} catch (err) {
76+
// rejected by http client
77+
expect(err).to.have.property('name', 'TimeoutError')
78+
return
79+
}
80+
81+
// rejected by the server, errors don't work over http - https://github.com/ipfs/js-ipfs/issues/2519
82+
expect(res).to.be.an('array').with.lengthOf(0)
83+
expect(Date.now() - start).to.be.lessThan(100)
7284
})
7385
})
7486
}

packages/ipfs-http-client/src/add.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ module.exports = configure((api) => {
1111
const progressFn = options.progress
1212

1313
const res = await api.post('add', {
14-
searchParams: toUrlSearchParams(null, {
15-
...options,
14+
searchParams: toUrlSearchParams({
1615
'stream-channels': true,
16+
...options,
1717
progress: Boolean(progressFn)
1818
}),
1919
timeout: options.timeout,

packages/ipfs-http-client/src/bitswap/stat.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
const { BigNumber } = require('bignumber.js')
44
const CID = require('cids')
55
const configure = require('../lib/configure')
6+
const toUrlSearchParams = require('../lib/to-url-search-params')
67

78
module.exports = configure(api => {
89
return async (options = {}) => {
910
const res = await api.post('bitswap/stat', {
10-
searchParams: options,
11+
searchParams: toUrlSearchParams(options),
1112
timeout: options.timeout,
1213
signal: options.signal
1314
})

packages/ipfs-http-client/src/bitswap/unwant.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
const CID = require('cids')
44
const configure = require('../lib/configure')
5+
const toUrlSearchParams = require('../lib/to-url-search-params')
56

67
module.exports = configure(api => {
78
return async (cid, options = {}) => {
8-
options.arg = typeof cid === 'string' ? cid : new CID(cid).toString()
9-
109
const res = await api.post('bitswap/unwant', {
1110
timeout: options.timeout,
1211
signal: options.signal,
13-
searchParams: options
12+
searchParams: toUrlSearchParams({
13+
arg: typeof cid === 'string' ? cid : new CID(cid).toString(),
14+
...options
15+
})
1416
})
1517

1618
return res.json()

packages/ipfs-http-client/src/bitswap/wantlist.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const CID = require('cids')
44
const configure = require('../lib/configure')
5+
const toUrlSearchParams = require('../lib/to-url-search-params')
56

67
module.exports = configure(api => {
78
return async (peer, options = {}) => {
@@ -12,7 +13,7 @@ module.exports = configure(api => {
1213
const res = await (await api.post('bitswap/wantlist', {
1314
timeout: options.timeout,
1415
signal: options.signal,
15-
searchParams: options
16+
searchParams: toUrlSearchParams(options)
1617
})).json()
1718

1819
return (res.Keys || []).map(k => new CID(k['/']))

packages/ipfs-http-client/src/block/get.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@ const Block = require('ipfs-block')
44
const CID = require('cids')
55
const { Buffer } = require('buffer')
66
const configure = require('../lib/configure')
7+
const toUrlSearchParams = require('../lib/to-url-search-params')
78

89
module.exports = configure(api => {
910
return async (cid, options = {}) => {
1011
cid = new CID(cid)
11-
options.arg = cid.toString()
1212

13-
const rsp = await api.post('block/get', {
13+
const res = await api.post('block/get', {
1414
timeout: options.timeout,
1515
signal: options.signal,
16-
searchParams: options
16+
searchParams: toUrlSearchParams({
17+
arg: cid.toString(),
18+
...options
19+
})
1720
})
1821

19-
return new Block(Buffer.from(await rsp.arrayBuffer()), cid)
22+
return new Block(Buffer.from(await res.arrayBuffer()), cid)
2023
}
2124
})

packages/ipfs-http-client/src/block/put.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const CID = require('cids')
55
const multihash = require('multihashes')
66
const multipartRequest = require('../lib/multipart-request')
77
const configure = require('../lib/configure')
8+
const toUrlSearchParams = require('../lib/to-url-search-params')
89

910
module.exports = configure(api => {
1011
async function put (data, options = {}) {
@@ -36,7 +37,7 @@ module.exports = configure(api => {
3637
const response = await api.post('block/put', {
3738
timeout: options.timeout,
3839
signal: options.signal,
39-
searchParams: options,
40+
searchParams: toUrlSearchParams(options),
4041
...(
4142
await multipartRequest(data)
4243
)

packages/ipfs-http-client/src/block/rm.js

+6-15
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,23 @@
11
'use strict'
22

33
const CID = require('cids')
4-
const merge = require('merge-options')
54
const configure = require('../lib/configure')
5+
const toUrlSearchParams = require('../lib/to-url-search-params')
66

77
module.exports = configure(api => {
88
return async function * rm (cid, options = {}) {
99
if (!Array.isArray(cid)) {
1010
cid = [cid]
1111
}
1212

13-
options = merge(
14-
options,
15-
{
16-
'stream-channels': true
17-
}
18-
)
19-
20-
const searchParams = new URLSearchParams(options)
21-
22-
cid.forEach(cid => {
23-
searchParams.append('arg', new CID(cid).toString())
24-
})
25-
2613
const res = await api.post('block/rm', {
2714
timeout: options.timeout,
2815
signal: options.signal,
29-
searchParams: searchParams
16+
searchParams: toUrlSearchParams({
17+
arg: cid.map(cid => new CID(cid).toString()),
18+
'stream-channels': true,
19+
...options
20+
})
3021
})
3122

3223
for await (const removed of res.ndjson()) {

packages/ipfs-http-client/src/block/stat.js

+8-6
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@
22

33
const CID = require('cids')
44
const configure = require('../lib/configure')
5+
const toUrlSearchParams = require('../lib/to-url-search-params')
56

67
module.exports = configure(api => {
78
return async (cid, options = {}) => {
8-
options.arg = (new CID(cid)).toString()
9-
10-
const response = await api.post('block/stat', {
9+
const res = await api.post('block/stat', {
1110
timeout: options.timeout,
1211
signal: options.signal,
13-
searchParams: options
12+
searchParams: toUrlSearchParams({
13+
arg: new CID(cid).toString(),
14+
...options
15+
})
1416
})
15-
const res = await response.json()
17+
const data = await res.json()
1618

17-
return { cid: new CID(res.Key), size: res.Size }
19+
return { cid: new CID(data.Key), size: data.Size }
1820
}
1921
})

packages/ipfs-http-client/src/bootstrap/add.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const Multiaddr = require('multiaddr')
44
const configure = require('../lib/configure')
5+
const toUrlSearchParams = require('../lib/to-url-search-params')
56

67
module.exports = configure(api => {
78
return async (addr, options = {}) => {
@@ -10,12 +11,13 @@ module.exports = configure(api => {
1011
addr = null
1112
}
1213

13-
options.arg = addr
14-
1514
const res = await api.post('bootstrap/add', {
1615
timeout: options.timeout,
1716
signal: options.signal,
18-
searchParams: options
17+
searchParams: toUrlSearchParams({
18+
arg: addr,
19+
...options
20+
})
1921
})
2022

2123
return res.json()

packages/ipfs-http-client/src/bootstrap/list.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
'use strict'
22

33
const configure = require('../lib/configure')
4+
const toUrlSearchParams = require('../lib/to-url-search-params')
45

56
module.exports = configure(api => {
67
return async (options = {}) => {
78
const res = await api.post('bootstrap/list', {
89
timeout: options.timeout,
910
signal: options.signal,
10-
searchParams: options
11+
searchParams: toUrlSearchParams(options)
1112
})
1213

1314
return res.json()

packages/ipfs-http-client/src/bootstrap/rm.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const Multiaddr = require('multiaddr')
44
const configure = require('../lib/configure')
5+
const toUrlSearchParams = require('../lib/to-url-search-params')
56

67
module.exports = configure(api => {
78
return async (addr, options = {}) => {
@@ -10,12 +11,13 @@ module.exports = configure(api => {
1011
addr = null
1112
}
1213

13-
options.arg = addr
14-
1514
const res = await api.post('bootstrap/rm', {
1615
timeout: options.timeout,
1716
signal: options.signal,
18-
searchParams: options
17+
searchParams: toUrlSearchParams({
18+
arg: addr,
19+
...options
20+
})
1921
})
2022

2123
return res.json()

packages/ipfs-http-client/src/cat.js

+5-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
'use strict'
22

33
const CID = require('cids')
4-
const merge = require('merge-options')
54
const configure = require('./lib/configure')
5+
const toUrlSearchParams = require('./lib/to-url-search-params')
66

77
module.exports = configure(api => {
88
return async function * cat (path, options = {}) {
9-
options = merge(
10-
options,
11-
{
12-
arg: typeof path === 'string' ? path : new CID(path).toString()
13-
}
14-
)
15-
169
const res = await api.post('cat', {
1710
timeout: options.timeout,
1811
signal: options.signal,
19-
searchParams: options
12+
searchParams: toUrlSearchParams({
13+
arg: typeof path === 'string' ? path : new CID(path).toString(),
14+
...options
15+
})
2016
})
2117

2218
yield * res.iterator()

packages/ipfs-http-client/src/commands.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
'use strict'
22

33
const configure = require('./lib/configure')
4+
const toUrlSearchParams = require('./lib/to-url-search-params')
45

56
module.exports = configure(api => {
67
return async (options = {}) => {
78
const res = await api.post('commands', {
89
timeout: options.timeout,
910
signal: options.signal,
10-
searchParams: options
11+
searchParams: toUrlSearchParams(options)
1112
})
1213

1314
return res.json()

packages/ipfs-http-client/src/config/get.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22

33
const configure = require('../lib/configure')
4+
const toUrlSearchParams = require('../lib/to-url-search-params')
45

56
module.exports = configure(api => {
67
return async (key, options = {}) => {
@@ -10,12 +11,15 @@ module.exports = configure(api => {
1011
}
1112

1213
const url = key ? 'config' : 'config/show'
13-
const rsp = await api.post(url, {
14+
const res = await api.post(url, {
1415
timeout: options.timeout,
1516
signal: options.signal,
16-
searchParams: { arg: key }
17+
searchParams: toUrlSearchParams({
18+
arg: key,
19+
...options
20+
})
1721
})
18-
const data = await rsp.json()
22+
const data = await res.json()
1923

2024
return key ? data.Value : data
2125
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
'use strict'
22

33
const configure = require('../../lib/configure')
4+
const toUrlSearchParams = require('../../lib/to-url-search-params')
45

56
module.exports = configure(api => {
67
return async (profile, options = {}) => {
7-
options.arg = profile
8-
const response = await api.post('config/profile/apply', {
8+
const res = await api.post('config/profile/apply', {
99
timeout: options.timeout,
1010
signal: options.signal,
11-
searchParams: options
11+
searchParams: toUrlSearchParams({
12+
arg: profile,
13+
...options
14+
})
1215
})
13-
const res = await response.json()
16+
const data = await res.json()
1417

1518
return {
16-
original: res.OldCfg, updated: res.NewCfg
19+
original: data.OldCfg, updated: data.NewCfg
1720
}
1821
}
1922
})

packages/ipfs-http-client/src/config/profiles/list.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
const toCamel = require('../../lib/object-to-camel')
44
const configure = require('../../lib/configure')
5+
const toUrlSearchParams = require('../../lib/to-url-search-params')
56

67
module.exports = configure(api => {
78
return async (options = {}) => {
89
const res = await api.post('config/profile/list', {
910
timeout: options.timeout,
1011
signal: options.signal,
11-
searchParams: options
12+
searchParams: toUrlSearchParams(options)
1213
})
1314

1415
const data = await res.json()

packages/ipfs-http-client/src/config/replace.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
const { Buffer } = require('buffer')
44
const multipartRequest = require('../lib/multipart-request')
55
const configure = require('../lib/configure')
6+
const toUrlSearchParams = require('../lib/to-url-search-params')
67

78
module.exports = configure(api => {
89
return async (config, options = {}) => {
910
const res = await api.post('config/replace', {
1011
timeout: options.timeout,
1112
signal: options.signal,
12-
searchParams: options,
13+
searchParams: toUrlSearchParams(options),
1314
...(
1415
await multipartRequest(Buffer.from(JSON.stringify(config)))
1516
)

0 commit comments

Comments
 (0)