3
3
const debug = require ( 'debug' )
4
4
const mh = require ( 'multihashes' )
5
5
const pull = require ( 'pull-stream' )
6
- const generate = require ( 'pull-generate' )
6
+ const whilst = require ( 'async/whilst' )
7
+ const setImmediate = require ( 'async/setImmediate' )
8
+ const each = require ( 'async/each' )
9
+ const debounce = require ( 'lodash.debounce' )
7
10
8
11
const log = debug ( 'bitswap:engine' )
9
12
log . error = debug ( 'bitswap:engine:error' )
@@ -26,37 +29,45 @@ module.exports = class Engine {
26
29
this . peerRequestQueue = new PeerRequestQueue ( )
27
30
28
31
this . _running = false
32
+
33
+ this . _outbox = debounce ( this . _outboxExec . bind ( this ) , 100 )
29
34
}
30
35
31
36
_sendBlock ( env , cb ) {
32
37
const msg = new Message ( false )
33
- msg . addBlock ( env . block )
34
-
35
- log ( 'Sending block to %s' , env . peer . toB58String ( ) , env . block . data . toString ( ) )
36
-
37
- this . network . sendMessage ( env . peer , msg , ( err ) => {
38
+ msg . addBlock ( env . block , ( err ) => {
38
39
if ( err ) {
39
- log ( 'sendblock error: %s' , err . message )
40
+ return cb ( err )
40
41
}
41
- cb ( null , 'done' )
42
+
43
+ log ( 'Sending block to %s' , env . peer . toB58String ( ) , env . block . data . toString ( ) )
44
+
45
+ this . network . sendMessage ( env . peer , msg , ( err ) => {
46
+ if ( err ) {
47
+ log ( 'sendblock error: %s' , err . message )
48
+ }
49
+ cb ( null , 'done' )
50
+ } )
42
51
} )
43
52
}
44
53
45
- _outbox ( ) {
46
- if ( ! this . _running ) return
54
+ _outboxExec ( ) {
55
+ let nextTask
56
+ log ( 'outbox' )
47
57
48
- const doIt = ( cb ) => pull (
49
- generate ( null , ( state , cb ) => {
50
- log ( 'generating' , this . _running )
58
+ whilst (
59
+ ( ) => {
51
60
if ( ! this . _running ) {
52
- return cb ( true )
61
+ return
53
62
}
54
63
55
- const nextTask = this . peerRequestQueue . pop ( )
64
+ nextTask = this . peerRequestQueue . pop ( )
65
+ log ( 'check' , this . _running && nextTask )
66
+ return Boolean ( nextTask )
67
+ } ,
68
+ ( next ) => {
69
+ log ( 'generating' )
56
70
log ( 'got task' , nextTask )
57
- if ( ! nextTask ) {
58
- return cb ( true )
59
- }
60
71
61
72
pull (
62
73
this . blockstore . getStream ( nextTask . entry . key ) ,
@@ -65,31 +76,20 @@ module.exports = class Engine {
65
76
const block = blocks [ 0 ]
66
77
if ( err || ! block ) {
67
78
nextTask . done ( )
68
- return cb ( null , false )
79
+ return next ( )
69
80
}
70
81
71
- cb ( null , {
82
+ this . _sendBlock ( {
72
83
peer : nextTask . target ,
73
84
block : block ,
74
- sent : ( ) => {
85
+ sent ( ) {
75
86
nextTask . done ( )
76
87
}
77
- } )
88
+ } , next )
78
89
} )
79
90
)
80
- } ) ,
81
- pull . filter ( Boolean ) ,
82
- pull . asyncMap ( this . _sendBlock . bind ( this ) ) ,
83
- pull . onEnd ( cb )
91
+ }
84
92
)
85
-
86
- if ( ! this . _timer ) {
87
- this . _timer = setTimeout ( ( ) => {
88
- doIt ( ( ) => {
89
- this . _timer = null
90
- } )
91
- } , 50 )
92
- }
93
93
}
94
94
95
95
wantlistForPeer ( peerId ) {
@@ -118,20 +118,25 @@ module.exports = class Engine {
118
118
ledger . wantlist = new Wantlist ( )
119
119
}
120
120
121
- this . _processBlocks ( msg . blocks , ledger )
122
- log ( 'wantlist' , Array . from ( msg . wantlist . values ( ) ) . map ( ( e ) => e . toString ( ) ) )
123
-
124
- pull (
125
- pull . values ( Array . from ( msg . wantlist . values ( ) ) ) ,
126
- pull . asyncMap ( ( entry , cb ) => {
127
- this . _processWantlist ( ledger , peerId , entry , cb )
128
- } ) ,
129
- pull . onEnd ( ( err ) => {
130
- if ( err ) return cb ( err )
131
- this . _outbox ( )
132
- cb ( )
133
- } )
134
- )
121
+ this . _processBlocks ( msg . blocks , ledger , ( err ) => {
122
+ if ( err ) {
123
+ log . error ( `failed to process blocks: ${ err . message } ` )
124
+ }
125
+
126
+ log ( 'wantlist' , Array . from ( msg . wantlist . values ( ) ) . map ( ( e ) => e . toString ( ) ) )
127
+
128
+ pull (
129
+ pull . values ( Array . from ( msg . wantlist . values ( ) ) ) ,
130
+ pull . asyncMap ( ( entry , cb ) => {
131
+ this . _processWantlist ( ledger , peerId , entry , cb )
132
+ } ) ,
133
+ pull . onEnd ( ( err ) => {
134
+ if ( err ) return cb ( err )
135
+ this . _outbox ( )
136
+ cb ( )
137
+ } )
138
+ )
139
+ } )
135
140
}
136
141
137
142
receivedBlock ( key ) {
@@ -173,23 +178,36 @@ module.exports = class Engine {
173
178
}
174
179
}
175
180
176
- _processBlocks ( blocks , ledger ) {
177
- for ( let block of blocks . values ( ) ) {
178
- log ( 'got block %s (%s bytes)' , mh . toB58String ( block . key ) , block . data . length )
179
- ledger . receivedBytes ( block . data . length )
181
+ _processBlocks ( blocks , ledger , callback ) {
182
+ each ( blocks . values ( ) , ( block , cb ) => {
183
+ block . key ( ( err , key ) => {
184
+ if ( err ) {
185
+ return cb ( err )
186
+ }
187
+ log ( 'got block %s (%s bytes)' , mh . toB58String ( key ) , block . data . length )
188
+ ledger . receivedBytes ( block . data . length )
180
189
181
- this . receivedBlock ( block . key )
182
- }
190
+ this . receivedBlock ( key )
191
+ cb ( )
192
+ } )
193
+ } , callback )
183
194
}
184
195
185
196
// Clear up all accounting things after message was sent
186
- messageSent ( peerId , msg ) {
197
+ messageSent ( peerId , msg , callback ) {
187
198
const ledger = this . _findOrCreate ( peerId )
188
- for ( let block of msg . blocks . values ( ) ) {
199
+ each ( msg . blocks . values ( ) , ( block , cb ) => {
189
200
ledger . sentBytes ( block . data . length )
190
- ledger . wantlist . remove ( block . key )
191
- this . peerRequestQueue . remove ( block . key , peerId )
192
- }
201
+ block . key ( ( err , key ) => {
202
+ if ( err ) {
203
+ return cb ( err )
204
+ }
205
+
206
+ ledger . wantlist . remove ( key )
207
+ this . peerRequestQueue . remove ( key , peerId )
208
+ cb ( )
209
+ } )
210
+ } , callback )
193
211
}
194
212
195
213
numBytesSentTo ( peerId ) {
0 commit comments