@@ -7,7 +7,7 @@ const { getName } = require('multicodec')
7
7
const vd = require ( 'varint-decoder' )
8
8
const multihashing = require ( 'multihashing-async' )
9
9
const { isMapEqual } = require ( '../../utils' )
10
- const { Message } = require ( './message.proto ' )
10
+ const { Message } = require ( './message' )
11
11
const Entry = require ( './entry' )
12
12
13
13
class BitswapMessage {
@@ -22,7 +22,7 @@ class BitswapMessage {
22
22
/** @type {Map<string, import('ipfs-core-types/src/block-service').Block> } */
23
23
this . blocks = new Map ( )
24
24
25
- /** @type {Map<string, import('./message.proto') .BlockPresenceType> } */
25
+ /** @type {Map<string, import('./message').Message .BlockPresenceType> } */
26
26
this . blockPresences = new Map ( )
27
27
this . pendingBytes = 0
28
28
}
@@ -37,7 +37,7 @@ class BitswapMessage {
37
37
*
38
38
* @param {CID } cid
39
39
* @param {number } priority
40
- * @param {import('./message.proto ').WantType } [wantType]
40
+ * @param {import('./message').Message.Wantlist. WantType | null } [wantType]
41
41
* @param {boolean } [cancel]
42
42
* @param {boolean } [sendDontHave]
43
43
* @returns {void }
@@ -123,7 +123,6 @@ class BitswapMessage {
123
123
* @returns {Uint8Array }
124
124
*/
125
125
serializeToBitswap100 ( ) {
126
- /** @type {import('./message.proto').Message100 } */
127
126
const msg = {
128
127
wantlist : {
129
128
entries : Array . from ( this . wantlist . values ( ) ) . map ( ( entry ) => {
@@ -132,17 +131,14 @@ class BitswapMessage {
132
131
priority : Number ( entry . priority ) ,
133
132
cancel : Boolean ( entry . cancel )
134
133
}
135
- } )
134
+ } ) ,
135
+ full : this . full ? true : undefined
136
136
} ,
137
137
blocks : Array . from ( this . blocks . values ( ) )
138
138
. map ( ( block ) => block . data )
139
139
}
140
140
141
- if ( this . full ) {
142
- msg . wantlist . full = true
143
- }
144
-
145
- return Message . encode ( msg )
141
+ return Message . encode ( msg ) . finish ( )
146
142
}
147
143
148
144
/**
@@ -152,7 +148,6 @@ class BitswapMessage {
152
148
* @returns {Uint8Array }
153
149
*/
154
150
serializeToBitswap110 ( ) {
155
- /** @type {import('./message.proto').Message110 } */
156
151
const msg = {
157
152
wantlist : {
158
153
entries : Array . from ( this . wantlist . values ( ) ) . map ( ( entry ) => {
@@ -163,36 +158,38 @@ class BitswapMessage {
163
158
cancel : Boolean ( entry . cancel ) ,
164
159
sendDontHave : Boolean ( entry . sendDontHave )
165
160
}
166
- } )
161
+ } ) ,
162
+ full : this . full ? true : undefined
167
163
} ,
164
+ /** @type {import('./message').Message.BlockPresence[] } */
168
165
blockPresences : [ ] ,
166
+
167
+ /** @type {{ prefix: Uint8Array, data: Uint8Array }[] } */
169
168
payload : [ ] ,
170
169
pendingBytes : this . pendingBytes
171
170
}
172
171
173
- if ( this . full ) {
174
- msg . wantlist . full = true
175
- }
176
-
177
172
this . blocks . forEach ( ( block ) => {
178
- msg . payload . push ( {
179
- prefix : block . cid . prefix ,
180
- data : block . data
181
- } )
173
+ msg . payload . push (
174
+ new Message . Block ( {
175
+ prefix : block . cid . prefix ,
176
+ data : block . data
177
+ } )
178
+ )
182
179
} )
183
180
184
181
for ( const [ cidStr , bpType ] of this . blockPresences ) {
185
- msg . blockPresences . push ( {
182
+ msg . blockPresences . push ( new Message . BlockPresence ( {
186
183
cid : new CID ( cidStr ) . bytes ,
187
184
type : bpType
188
- } )
185
+ } ) )
189
186
}
190
187
191
188
if ( this . pendingBytes > 0 ) {
192
189
msg . pendingBytes = this . pendingBytes
193
190
}
194
191
195
- return Message . encode ( msg )
192
+ return Message . encode ( msg ) . finish ( )
196
193
}
197
194
198
195
/**
@@ -222,27 +219,33 @@ class BitswapMessage {
222
219
}
223
220
224
221
/**
225
- *
226
222
* @param {Uint8Array } raw
227
- * @returns {Promise<BitswapMessage> }
228
223
*/
229
224
BitswapMessage . deserialize = async ( raw ) => {
230
225
const decoded = Message . decode ( raw )
231
226
232
227
const isFull = ( decoded . wantlist && decoded . wantlist . full ) || false
233
228
const msg = new BitswapMessage ( isFull )
234
229
235
- if ( decoded . wantlist ) {
230
+ if ( decoded . wantlist && decoded . wantlist . entries ) {
236
231
decoded . wantlist . entries . forEach ( ( entry ) => {
232
+ if ( ! entry . block ) {
233
+ return
234
+ }
237
235
// note: entry.block is the CID here
238
236
const cid = new CID ( entry . block )
239
- msg . addEntry ( cid , entry . priority , entry . wantType , entry . cancel , entry . sendDontHave )
237
+ msg . addEntry ( cid , entry . priority || 0 , entry . wantType , Boolean ( entry . cancel ) , Boolean ( entry . sendDontHave ) )
240
238
} )
241
239
}
242
240
243
241
if ( decoded . blockPresences ) {
244
242
decoded . blockPresences . forEach ( ( blockPresence ) => {
243
+ if ( ! blockPresence . cid ) {
244
+ return
245
+ }
246
+
245
247
const cid = new CID ( blockPresence . cid )
248
+
246
249
if ( blockPresence . type === BitswapMessage . BlockPresenceType . Have ) {
247
250
msg . addHave ( cid )
248
251
} else {
@@ -297,15 +300,11 @@ BitswapMessage.blockPresenceSize = (cid) => {
297
300
298
301
BitswapMessage . Entry = Entry
299
302
BitswapMessage . WantType = {
300
- /** @type {import('./message.proto').WantBlock } */
301
303
Block : Message . Wantlist . WantType . Block ,
302
- /** @type {import('./message.proto').HaveBlock } */
303
304
Have : Message . Wantlist . WantType . Have
304
305
}
305
306
BitswapMessage . BlockPresenceType = {
306
- /** @type {import('./message.proto').Have } */
307
307
Have : Message . BlockPresenceType . Have ,
308
- /** @type {import('./message.proto').DontHave } */
309
308
DontHave : Message . BlockPresenceType . DontHave
310
309
}
311
310
module . exports = BitswapMessage
0 commit comments