@@ -54,7 +54,14 @@ export class PeerFetch {
54
54
and simultaneously increment the ticket counter.
55
55
*/
56
56
_drawNewTicket ( ) {
57
- return this . _nextAvailableTicket ++
57
+ const nextAvailable = this . _nextAvailableTicket
58
+ this . _nextAvailableTicket ++
59
+ const nextInLine = this . _nextTicketInLine
60
+ console . assert (
61
+ nextInLine <= nextAvailable ,
62
+ { nextInLine, nextAvailable }
63
+ )
64
+ return nextAvailable
58
65
}
59
66
60
67
/**
@@ -70,6 +77,12 @@ export class PeerFetch {
70
77
// remove entry from pending request map
71
78
this . _requestMap . delete ( ticket )
72
79
this . _nextTicketInLine ++
80
+ const nextInLine = this . _nextTicketInLine
81
+ const nextAvailable = this . _nextAvailableTicket
82
+ console . assert (
83
+ nextInLine <= nextAvailable ,
84
+ { nextInLine, nextAvailable }
85
+ )
73
86
}
74
87
75
88
_configureDataConnection ( ) {
@@ -114,9 +127,11 @@ export class PeerFetch {
114
127
}
115
128
} )
116
129
this . _dataConnection . on ( 'open' , function ( ) {
130
+ console . debug ( 'Peer connection is now open.' )
117
131
peerFetch . _schedulePing ( )
118
132
} )
119
133
this . _dataConnection . on ( 'close' , function ( ) {
134
+ console . debug ( 'Peer connection is now closed.' )
120
135
peerFetch . _stopPing ( )
121
136
} )
122
137
}
@@ -147,12 +162,13 @@ export class PeerFetch {
147
162
148
163
_enqueueRequest ( request ) {
149
164
const ticket = this . _drawNewTicket ( )
150
- console . debug ( this . _requestMap )
165
+ const requestMap = this . _requestMap
166
+ console . debug ( '_enqueueRequest: ' , { requestMap } )
151
167
this . _requestMap . set ( ticket , { request } )
152
168
if ( this . _requestMap . size === 1 ) {
153
169
// there are no other pending requests
154
170
// let's send this one on the wire
155
- this . _sendNextRequest ( ticket )
171
+ this . _sendNextRequest ( )
156
172
}
157
173
return ticket
158
174
}
@@ -167,8 +183,18 @@ export class PeerFetch {
167
183
and responses in parallel over the same data connection or
168
184
even a pool of connections.
169
185
*/
170
- _sendNextRequest ( ticket ) {
171
- const { request } = this . _requestMap . get ( ticket )
186
+ _sendNextRequest ( ) {
187
+ const ticket = this . _nextTicketInLine
188
+ let { request, requestSent } = this . _requestMap . get ( ticket )
189
+ if ( requestSent ) {
190
+ // A request was sent and is waiting its response.
191
+ // Wait for the full respones before sending another request.
192
+ return
193
+ } else {
194
+ requestSent = true
195
+ this . _requestMap . set ( ticket , { request, requestSent } )
196
+ }
197
+ console . assert ( request != null , { ticket, request } )
172
198
const jsonRequest = JSON . stringify ( request )
173
199
const requestMap = this . _requestMap
174
200
console . debug ( 'Sending request to remote peer' ,
@@ -181,19 +207,18 @@ export class PeerFetch {
181
207
}
182
208
183
209
_processNextTicketInLine ( ) {
184
- const ticket = this . _nextTicketInLine
185
210
// check if there is a pending ticket
186
211
// and process it
187
212
if ( this . _pendingRequests ( ) ) {
188
- this . _sendNextRequest ( ticket )
213
+ this . _sendNextRequest ( )
189
214
}
190
215
}
191
216
192
217
/**
193
218
* Check if there are any pending requests waiting in line.
194
219
*/
195
220
_pendingRequests ( ) {
196
- if ( this . _nextTicketInLine < this . _nextAvailableTicket ) {
221
+ if ( this . _requestMap . size > 0 ) {
197
222
return true
198
223
}
199
224
}
0 commit comments