Skip to content

Commit 5e0c5ff

Browse files
committed
feat: use ipfs provider
1 parent 2cbc1e9 commit 5e0c5ff

File tree

7 files changed

+115
-26
lines changed

7 files changed

+115
-26
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"dependencies": {
6969
"async": "^2.6.1",
7070
"bignumber.js": "^8.0.1",
71+
"callbackify": "^1.1.0",
7172
"cids": "~0.7.0",
7273
"debug": "^4.1.0",
7374
"ipfs-block": "~0.8.0",

src/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ const statsKeys = [
3737
*
3838
* @param {Libp2p} libp2p
3939
* @param {Blockstore} blockstore
40+
* @param {Provider} provider
41+
* @param {object} options
4042
*/
4143
class Bitswap {
42-
constructor (libp2p, blockstore, options) {
44+
constructor (libp2p, blockstore, provider, options) {
4345
this._libp2p = libp2p
4446
this._log = logger(this.peerInfo.id)
4547

@@ -53,7 +55,7 @@ class Bitswap {
5355
})
5456

5557
// the network delivers messages
56-
this.network = new Network(libp2p, this, {}, this._stats)
58+
this.network = new Network(libp2p, this, {}, this._stats, provider)
5759

5860
// local database
5961
this.blockstore = blockstore

src/network.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const pull = require('pull-stream')
55
const waterfall = require('async/waterfall')
66
const each = require('async/each')
77
const nextTick = require('async/nextTick')
8+
const callbackify = require('callbackify')
89

910
const Message = require('./types/message')
1011
const CONSTANTS = require('./constants')
@@ -14,11 +15,12 @@ const BITSWAP100 = '/ipfs/bitswap/1.0.0'
1415
const BITSWAP110 = '/ipfs/bitswap/1.1.0'
1516

1617
class Network {
17-
constructor (libp2p, bitswap, options, stats) {
18+
constructor (libp2p, bitswap, options, stats, provider) {
1819
this._log = logger(libp2p.peerInfo.id, 'network')
1920
options = options || {}
2021
this.libp2p = libp2p
2122
this.bitswap = bitswap
23+
this.provider = provider
2224
this.b100Only = options.b100Only || false
2325

2426
this._stats = stats
@@ -98,10 +100,14 @@ class Network {
98100
}
99101

100102
findProviders (cid, maxProviders, callback) {
101-
this.libp2p.contentRouting.findProviders(cid, {
102-
maxTimeout: CONSTANTS.providerRequestTimeout,
103-
maxNumProviders: maxProviders
104-
}, callback)
103+
const findProviders = callbackify((cid, maxProviders) => {
104+
return this.provider.findProviders(cid, {
105+
maxTimeout: CONSTANTS.providerRequestTimeout,
106+
maxNumProviders: maxProviders
107+
})
108+
})
109+
110+
findProviders(cid, maxProviders, callback)
105111
}
106112

107113
findAndConnect (cid, callback) {
@@ -115,7 +121,9 @@ class Network {
115121
}
116122

117123
provide (cid, callback) {
118-
this.libp2p.contentRouting.provide(cid, callback)
124+
const provide = callbackify((cid) => this.provider.provide(cid))
125+
126+
provide(cid, callback)
119127
}
120128

121129
// Connect to the given peer

test/bitswap-mock-internals.js

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const Bitswap = require('../src')
1919
const createTempRepo = require('./utils/create-temp-repo-nodejs')
2020
const mockNetwork = require('./utils/mocks').mockNetwork
2121
const applyNetwork = require('./utils/mocks').applyNetwork
22+
const Provider = require('./utils/mocks').mockProvider
2223
const mockLibp2pNode = require('./utils/mocks').mockLibp2pNode
2324
const storeHasBlocks = require('./utils/store-has-blocks')
2425
const makeBlock = require('./utils/make-block')
@@ -55,7 +56,10 @@ describe('bitswap with mocks', function () {
5556

5657
describe('receive message', () => {
5758
it('simple block message', (done) => {
58-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
59+
const libp2pNode = mockLibp2pNode()
60+
const provider = new Provider(libp2pNode)
61+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
62+
5963
bs.start((err) => {
6064
expect(err).to.not.exist()
6165

@@ -92,7 +96,10 @@ describe('bitswap with mocks', function () {
9296
})
9397

9498
it('simple want message', (done) => {
95-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
99+
const libp2pNode = mockLibp2pNode()
100+
const provider = new Provider(libp2pNode)
101+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
102+
96103
bs.start((err) => {
97104
expect(err).to.not.exist()
98105
const other = ids[1]
@@ -119,7 +126,9 @@ describe('bitswap with mocks', function () {
119126

120127
it('multi peer', function (done) {
121128
this.timeout(80 * 1000)
122-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
129+
const libp2pNode = mockLibp2pNode()
130+
const provider = new Provider(libp2pNode)
131+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
123132

124133
let others
125134
let blocks
@@ -165,7 +174,10 @@ describe('bitswap with mocks', function () {
165174
})
166175

167176
it('ignore unwanted blocks', (done) => {
168-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
177+
const libp2pNode = mockLibp2pNode()
178+
const provider = new Provider(libp2pNode)
179+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
180+
169181
bs.start((err) => {
170182
expect(err).to.not.exist()
171183

@@ -213,7 +225,10 @@ describe('bitswap with mocks', function () {
213225

214226
describe('get', () => {
215227
it('fails on requesting empty block', (done) => {
216-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
228+
const libp2pNode = mockLibp2pNode()
229+
const provider = new Provider(libp2pNode)
230+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
231+
217232
bs.get(null, (err, res) => {
218233
expect(err).to.exist()
219234
expect(err.message).to.equal('Not a valid cid')
@@ -226,7 +241,9 @@ describe('bitswap with mocks', function () {
226241

227242
repo.blocks.put(block, (err) => {
228243
expect(err).to.not.exist()
229-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
244+
const libp2pNode = mockLibp2pNode()
245+
const provider = new Provider(libp2pNode)
246+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
230247

231248
bs.get(block.cid, (err, res) => {
232249
expect(err).to.not.exist()
@@ -244,7 +261,9 @@ describe('bitswap with mocks', function () {
244261
repo.blocks.putMany([b1, b2, b3], (err) => {
245262
expect(err).to.not.exist()
246263

247-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
264+
const libp2pNode = mockLibp2pNode()
265+
const provider = new Provider(libp2pNode)
266+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
248267

249268
bs.getMany([b1.cid, b2.cid, b3.cid], (err, res) => {
250269
expect(err).to.not.exist()
@@ -262,7 +281,9 @@ describe('bitswap with mocks', function () {
262281
repo.blocks.putMany([b1, b2, b3], (err) => {
263282
expect(err).to.not.exist()
264283

265-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
284+
const libp2pNode = mockLibp2pNode()
285+
const provider = new Provider(libp2pNode)
286+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
266287

267288
map([b1.cid, b2.cid, b3.cid], (cid, cb) => bs.get(cid, cb), (err, res) => {
268289
expect(err).to.not.exist()
@@ -275,7 +296,9 @@ describe('bitswap with mocks', function () {
275296
it('block is added locally afterwards', (done) => {
276297
const finish = orderedFinish(2, done)
277298
const block = blocks[9]
278-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
299+
const libp2pNode = mockLibp2pNode()
300+
const provider = new Provider(libp2pNode)
301+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
279302
const net = mockNetwork()
280303

281304
bs.network = net
@@ -359,7 +382,9 @@ describe('bitswap with mocks', function () {
359382
setImmediate(() => callback())
360383
}
361384
}
362-
bs1 = new Bitswap(mockLibp2pNode(), repo.blocks)
385+
const libp2pNode = mockLibp2pNode()
386+
const provider = new Provider(libp2pNode)
387+
bs1 = new Bitswap(libp2pNode, repo.blocks, provider)
363388
applyNetwork(bs1, n1)
364389

365390
bs1.start((err) => {
@@ -371,7 +396,9 @@ describe('bitswap with mocks', function () {
371396
(cb) => createTempRepo(cb),
372397
(repo, cb) => {
373398
repo2 = repo
374-
bs2 = new Bitswap(mockLibp2pNode(), repo2.blocks)
399+
const libp2pNode2 = mockLibp2pNode()
400+
const provider2 = new Provider(libp2pNode)
401+
bs2 = new Bitswap(libp2pNode2, repo2.blocks, provider2)
375402
applyNetwork(bs2, n2)
376403
bs2.start((err) => {
377404
expect(err).to.not.exist()
@@ -397,7 +424,9 @@ describe('bitswap with mocks', function () {
397424
it('double get', (done) => {
398425
const block = blocks[11]
399426

400-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
427+
const libp2pNode = mockLibp2pNode()
428+
const provider = new Provider(libp2pNode)
429+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
401430

402431
parallel(
403432
[
@@ -420,7 +449,10 @@ describe('bitswap with mocks', function () {
420449

421450
describe('unwant', () => {
422451
it('removes blocks that are wanted multiple times', (done) => {
423-
const bs = new Bitswap(mockLibp2pNode(), repo.blocks)
452+
const libp2pNode = mockLibp2pNode()
453+
const provider = new Provider(libp2pNode)
454+
const bs = new Bitswap(libp2pNode, repo.blocks, provider)
455+
424456
bs.start((err) => {
425457
expect(err).to.not.exist()
426458
const b = blocks[12]

test/bitswap-stats.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const Message = require('../src/types/message')
1515
const Bitswap = require('../src')
1616

1717
const createTempRepo = require('./utils/create-temp-repo-nodejs')
18+
const Provider = require('./utils/mocks').mockProvider
1819
const createLibp2pNode = require('./utils/create-libp2p-node')
1920
const makeBlock = require('./utils/make-block')
2021
const countToFinish = require('./utils/helpers').countToFinish
@@ -81,11 +82,14 @@ describe('bitswap stats', () => {
8182
})
8283

8384
before(() => {
84-
bitswaps = nodes.map((node, i) =>
85-
new Bitswap(libp2pNodes[i], repos[i].blocks, {
85+
bitswaps = nodes.map((node, i) => {
86+
const provider = new Provider(libp2pNodes[i])
87+
88+
return new Bitswap(libp2pNodes[i], repos[i].blocks, provider, {
8689
statsEnabled: true,
8790
statsComputeThrottleTimeout: 500 // fast update interval for tests
88-
}))
91+
})
92+
})
8993
bs = bitswaps[0]
9094
bs.wm.wantBlocks(blocks.map(b => b.cid))
9195
})

test/bitswap.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const Bitswap = require('../src')
1616
const createTempRepo = require('./utils/create-temp-repo-nodejs')
1717
const createLibp2pNode = require('./utils/create-libp2p-node')
1818
const makeBlock = require('./utils/make-block')
19+
const Provider = require('./utils/mocks').mockProvider
1920
const orderedFinish = require('./utils/helpers').orderedFinish
2021

2122
// Creates a repo + libp2pNode + Bitswap with or without DHT
@@ -28,7 +29,8 @@ function createThing (dht, callback) {
2829
}, (err, node) => cb(err, repo, node))
2930
},
3031
(repo, libp2pNode, cb) => {
31-
const bitswap = new Bitswap(libp2pNode, repo.blocks)
32+
const provider = new Provider(libp2pNode)
33+
const bitswap = new Bitswap(libp2pNode, repo.blocks, provider)
3234
bitswap.start((err) => cb(err, repo, libp2pNode, bitswap))
3335
}
3436
], (err, repo, libp2pNode, bitswap) => {

test/utils/mocks.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const parallel = require('async/parallel')
77
const setImmediate = require('async/setImmediate')
88
const series = require('async/series')
99
const _ = require('lodash')
10+
const CID = require('cids')
1011
const PeerId = require('peer-id')
1112
const PeerInfo = require('peer-info')
1213
const PeerBook = require('peer-book')
@@ -17,6 +18,43 @@ const EventEmitter = require('events')
1718

1819
const Bitswap = require('../../src')
1920

21+
/*
22+
* Create a mock provider
23+
*/
24+
25+
class Provider {
26+
constructor (libp2p) {
27+
this._contentRouting = libp2p.contentRouting
28+
}
29+
30+
/**
31+
* Announce block to the network and add and entry to the tracker
32+
* Takes a cid and makes an attempt to announce it to the network
33+
* @param {CID} cid
34+
*/
35+
async provide (cid) {
36+
if (!CID.isCID(cid)) {
37+
throw errCode('invalid CID to provide', 'ERR_INVALID_CID')
38+
}
39+
40+
await promisify((callback) => {
41+
this._contentRouting.provide(cid, callback)
42+
})()
43+
}
44+
45+
async findProviders (cid, options) { // eslint-disable-line require-await
46+
if (!CID.isCID(cid)) {
47+
throw errCode('invalid CID to find', 'ERR_INVALID_CID')
48+
}
49+
50+
return promisify((callback) => {
51+
this._contentRouting.findProviders(cid, options, callback)
52+
})()
53+
}
54+
}
55+
56+
exports.mockProvider = Provider
57+
2058
/*
2159
* Create a mock libp2p node
2260
*/
@@ -206,7 +244,9 @@ exports.genBitswapNetwork = (n, callback) => {
206244
// create every BitSwap
207245
function createBitswaps () {
208246
netArray.forEach((net) => {
209-
net.bitswap = new Bitswap(net.libp2p, net.repo.blocks, net.peerBook)
247+
const provider = new Provider(net.libp2p)
248+
249+
net.bitswap = new Bitswap(net.libp2p, net.repo.blocks, provider, net.peerBook)
210250
})
211251
establishLinks()
212252
}

0 commit comments

Comments
 (0)