@@ -135,24 +135,24 @@ func newResponse(requestID graphsync.RequestID,
135
135
}
136
136
}
137
137
138
- func newMessageFromProto (pbm * pb. Message ) (GraphSyncMessage , error ) {
138
+ func ( mh MessageHandler ) newMessageFromProto (pbm pbMessage ) (GraphSyncMessage , error ) {
139
139
requests := make (map [graphsync.RequestID ]GraphSyncRequest , len (pbm .GetRequests ()))
140
- for _ , req := range pbm .Requests {
140
+ for _ , req := range pbm .GetRequests () {
141
141
if req == nil {
142
142
return GraphSyncMessage {}, errors .New ("request is nil" )
143
143
}
144
144
var root cid.Cid
145
145
var err error
146
- if ! req .Cancel && ! req .Update {
147
- root , err = cid .Cast (req .Root )
146
+ if ! req .GetCancel () && ! req .GetUpdate () {
147
+ root , err = cid .Cast (req .GetRoot () )
148
148
if err != nil {
149
149
return GraphSyncMessage {}, err
150
150
}
151
151
}
152
152
153
153
var selector ipld.Node
154
- if ! req .Cancel && ! req .Update {
155
- selector , err = ipldutil .DecodeNode (req .Selector )
154
+ if ! req .GetCancel () && ! req .GetUpdate () {
155
+ selector , err = ipldutil .DecodeNode (req .GetSelector () )
156
156
if err != nil {
157
157
return GraphSyncMessage {}, err
158
158
}
@@ -161,27 +161,27 @@ func newMessageFromProto(pbm *pb.Message) (GraphSyncMessage, error) {
161
161
if exts == nil {
162
162
exts = make (map [string ][]byte )
163
163
}
164
- id , err := graphsync . ParseRequestID ( req .Id )
164
+ id , err := req .GetId ( mh )
165
165
if err != nil {
166
166
return GraphSyncMessage {}, err
167
167
}
168
- requests [id ] = newRequest (id , root , selector , graphsync .Priority (req .Priority ) , req .Cancel , req .Update , exts )
168
+ requests [id ] = newRequest (id , root , selector , graphsync .Priority (req .GetPriority ()) , req .GetCancel () , req .GetUpdate () , exts )
169
169
}
170
170
171
171
responses := make (map [graphsync.RequestID ]GraphSyncResponse , len (pbm .GetResponses ()))
172
- for _ , res := range pbm .Responses {
172
+ for _ , res := range pbm .GetResponses () {
173
173
if res == nil {
174
174
return GraphSyncMessage {}, errors .New ("response is nil" )
175
175
}
176
176
exts := res .GetExtensions ()
177
177
if exts == nil {
178
178
exts = make (map [string ][]byte )
179
179
}
180
- id , err := graphsync . ParseRequestID ( res .Id )
180
+ id , err := res .GetId ( mh )
181
181
if err != nil {
182
182
return GraphSyncMessage {}, err
183
183
}
184
- responses [id ] = newResponse (id , graphsync .ResponseStatusCode (res .Status ), exts )
184
+ responses [id ] = newResponse (id , graphsync .ResponseStatusCode (res .GetStatus () ), exts )
185
185
}
186
186
187
187
blks := make (map [cid.Cid ]blocks.Block , len (pbm .GetData ()))
@@ -249,14 +249,20 @@ func (gsm GraphSyncMessage) Blocks() []blocks.Block {
249
249
return bs
250
250
}
251
251
252
+ type MessageHandler struct {
253
+ fromV1Map map [int32 ]graphsync.RequestID
254
+ toV1Map map [graphsync.RequestID ]int32
255
+ nextIntId int32
256
+ }
257
+
252
258
// FromNet can read a network stream to deserialized a GraphSyncMessage
253
- func FromNet (r io.Reader ) (GraphSyncMessage , error ) {
259
+ func ( mh MessageHandler ) FromNet (r io.Reader ) (GraphSyncMessage , error ) {
254
260
reader := msgio .NewVarintReaderSize (r , network .MessageSizeMax )
255
- return FromMsgReader (reader )
261
+ return mh . FromMsgReader (reader )
256
262
}
257
263
258
264
// FromMsgReader can deserialize a protobuf message into a GraphySyncMessage.
259
- func FromMsgReader (r msgio.Reader ) (GraphSyncMessage , error ) {
265
+ func ( mh MessageHandler ) FromMsgReader (r msgio.Reader ) (GraphSyncMessage , error ) {
260
266
msg , err := r .ReadMsg ()
261
267
if err != nil {
262
268
return GraphSyncMessage {}, err
@@ -269,7 +275,24 @@ func FromMsgReader(r msgio.Reader) (GraphSyncMessage, error) {
269
275
return GraphSyncMessage {}, err
270
276
}
271
277
272
- return newMessageFromProto (& pb )
278
+ return mh .newMessageFromProto (& pbMessageV1_1 {& pb })
279
+ }
280
+
281
+ // FromMsgReaderV1 can deserialize a v1.0.0 protobuf message into a GraphySyncMessage.
282
+ func (mh MessageHandler ) FromMsgReaderV1 (r msgio.Reader ) (GraphSyncMessage , error ) {
283
+ msg , err := r .ReadMsg ()
284
+ if err != nil {
285
+ return GraphSyncMessage {}, err
286
+ }
287
+
288
+ var pb pb.Message_V1_0_0
289
+ err = proto .Unmarshal (msg , & pb )
290
+ r .ReleaseMsg (msg )
291
+ if err != nil {
292
+ return GraphSyncMessage {}, err
293
+ }
294
+
295
+ return mh .newMessageFromProto (& pbMessageV1_0 {& pb })
273
296
}
274
297
275
298
func (gsm GraphSyncMessage ) ToProto () (* pb.Message , error ) {
@@ -315,6 +338,57 @@ func (gsm GraphSyncMessage) ToProto() (*pb.Message, error) {
315
338
return pbm , nil
316
339
}
317
340
341
+ func (gsm GraphSyncMessage ) ToProtoV1 (mh MessageHandler ) (* pb.Message_V1_0_0 , error ) {
342
+ pbm := new (pb.Message_V1_0_0 )
343
+ pbm .Requests = make ([]* pb.Message_V1_0_0_Request , 0 , len (gsm .requests ))
344
+ for _ , request := range gsm .requests {
345
+ var selector []byte
346
+ var err error
347
+ if request .selector != nil {
348
+ selector , err = ipldutil .EncodeNode (request .selector )
349
+ if err != nil {
350
+ return nil , err
351
+ }
352
+ }
353
+ rid , err := bytesIdToInt (mh , request .id .Bytes ())
354
+ if err != nil {
355
+ return nil , err
356
+ }
357
+ pbm .Requests = append (pbm .Requests , & pb.Message_V1_0_0_Request {
358
+ Id : rid ,
359
+ Root : request .root .Bytes (),
360
+ Selector : selector ,
361
+ Priority : int32 (request .priority ),
362
+ Cancel : request .isCancel ,
363
+ Update : request .isUpdate ,
364
+ Extensions : request .extensions ,
365
+ })
366
+ }
367
+
368
+ pbm .Responses = make ([]* pb.Message_V1_0_0_Response , 0 , len (gsm .responses ))
369
+ for _ , response := range gsm .responses {
370
+ rid , err := bytesIdToInt (mh , response .requestID .Bytes ())
371
+ if err != nil {
372
+ return nil , err
373
+ }
374
+ pbm .Responses = append (pbm .Responses , & pb.Message_V1_0_0_Response {
375
+ Id : rid ,
376
+ Status : int32 (response .status ),
377
+ Extensions : response .extensions ,
378
+ })
379
+ }
380
+
381
+ blocks := gsm .Blocks ()
382
+ pbm .Data = make ([]* pb.Message_V1_0_0_Block , 0 , len (blocks ))
383
+ for _ , b := range blocks {
384
+ pbm .Data = append (pbm .Data , & pb.Message_V1_0_0_Block {
385
+ Data : b .RawData (),
386
+ Prefix : b .Cid ().Prefix ().Bytes (),
387
+ })
388
+ }
389
+ return pbm , nil
390
+ }
391
+
318
392
func (gsm GraphSyncMessage ) ToNet (w io.Writer ) error {
319
393
msg , err := gsm .ToProto ()
320
394
if err != nil {
@@ -334,6 +408,25 @@ func (gsm GraphSyncMessage) ToNet(w io.Writer) error {
334
408
return err
335
409
}
336
410
411
+ func (gsm GraphSyncMessage ) ToNetV1 (mh MessageHandler , w io.Writer ) error {
412
+ msg , err := gsm .ToProtoV1 (mh )
413
+ if err != nil {
414
+ return err
415
+ }
416
+ size := proto .Size (msg )
417
+ buf := pool .Get (size + binary .MaxVarintLen64 )
418
+ defer pool .Put (buf )
419
+
420
+ n := binary .PutUvarint (buf , uint64 (size ))
421
+
422
+ out , err := proto.MarshalOptions {}.MarshalAppend (buf [:n ], msg )
423
+ if err != nil {
424
+ return err
425
+ }
426
+ _ , err = w .Write (out )
427
+ return err
428
+ }
429
+
337
430
func (gsm GraphSyncMessage ) Loggable () map [string ]interface {} {
338
431
requests := make ([]string , 0 , len (gsm .requests ))
339
432
for _ , request := range gsm .requests {
0 commit comments