@@ -16,8 +16,10 @@ import (
16
16
"github.com/ark-network/ark/pkg/client-sdk/internal/utils"
17
17
"github.com/sirupsen/logrus"
18
18
"google.golang.org/grpc"
19
+ "google.golang.org/grpc/codes"
19
20
"google.golang.org/grpc/credentials"
20
21
"google.golang.org/grpc/credentials/insecure"
22
+ "google.golang.org/grpc/status"
21
23
)
22
24
23
25
type service struct {
@@ -203,17 +205,12 @@ func (a *grpcClient) SubmitSignedForfeitTxs(
203
205
204
206
func (a * grpcClient ) GetEventStream (
205
207
ctx context.Context , requestID string ,
206
- ) (ch <- chan client.RoundEventChannel , closeFn func (), err error ) {
207
- req := & arkv1.GetEventStreamRequest {}
208
+ ) (<- chan client.RoundEventChannel , func (), error ) {
208
209
ctx , cancel := context .WithCancel (ctx )
209
- defer func () {
210
- if err != nil {
211
- cancel ()
212
- }
213
- }()
214
210
215
- stream , err := a .svc .GetEventStream (ctx , req )
211
+ stream , err := a .svc .GetEventStream (ctx , & arkv1. GetEventStreamRequest {} )
216
212
if err != nil {
213
+ cancel ()
217
214
return nil , nil , err
218
215
}
219
216
@@ -223,28 +220,37 @@ func (a *grpcClient) GetEventStream(
223
220
defer close (eventsCh )
224
221
225
222
for {
226
- select {
227
- case <- stream .Context ().Done ():
228
- return
229
- default :
230
- resp , err := stream .Recv ()
231
- if err != nil {
232
- eventsCh <- client.RoundEventChannel {Err : err }
223
+ resp , err := stream .Recv ()
224
+ if err != nil {
225
+ if err == io .EOF {
226
+ eventsCh <- client.RoundEventChannel {Err : client .ErrConnectionClosedByServer }
233
227
return
234
228
}
235
-
236
- ev , err := event {resp }.toRoundEvent ()
237
- if err != nil {
238
- eventsCh <- client.RoundEventChannel {Err : err }
229
+ if st , ok := status .FromError (err ); ok && st .Code () == codes .Canceled {
239
230
return
240
231
}
232
+ eventsCh <- client.RoundEventChannel {Err : err }
233
+ return
234
+ }
241
235
242
- eventsCh <- client.RoundEventChannel {Event : ev }
236
+ ev , err := event {resp }.toRoundEvent ()
237
+ if err != nil {
238
+ eventsCh <- client.RoundEventChannel {Err : err }
239
+ return
243
240
}
241
+
242
+ eventsCh <- client.RoundEventChannel {Event : ev }
244
243
}
245
244
}()
246
245
247
- return eventsCh , cancel , nil
246
+ closeFn := func () {
247
+ if err := stream .CloseSend (); err != nil {
248
+ logrus .Warnf ("failed to close event stream: %s" , err )
249
+ }
250
+ cancel ()
251
+ }
252
+
253
+ return eventsCh , closeFn , nil
248
254
}
249
255
250
256
func (a * grpcClient ) Ping (
@@ -345,28 +351,36 @@ func (c *grpcClient) Close() {
345
351
func (c * grpcClient ) GetTransactionsStream (
346
352
ctx context.Context ,
347
353
) (<- chan client.TransactionEvent , func (), error ) {
354
+ ctx , cancel := context .WithCancel (ctx )
355
+
348
356
stream , err := c .svc .GetTransactionsStream (ctx , & arkv1.GetTransactionsStreamRequest {})
349
357
if err != nil {
358
+ cancel ()
350
359
return nil , nil , err
351
360
}
352
361
353
- eventCh := make (chan client.TransactionEvent )
362
+ eventsCh := make (chan client.TransactionEvent )
354
363
355
364
go func () {
356
- defer close (eventCh )
365
+ defer close (eventsCh )
366
+
357
367
for {
358
368
resp , err := stream .Recv ()
359
- if err == io .EOF {
360
- return
361
- }
362
369
if err != nil {
363
- eventCh <- client.TransactionEvent {Err : err }
370
+ if err == io .EOF {
371
+ eventsCh <- client.TransactionEvent {Err : client .ErrConnectionClosedByServer }
372
+ return
373
+ }
374
+ if st , ok := status .FromError (err ); ok && st .Code () == codes .Canceled {
375
+ return
376
+ }
377
+ eventsCh <- client.TransactionEvent {Err : err }
364
378
return
365
379
}
366
380
367
381
switch tx := resp .Tx .(type ) {
368
382
case * arkv1.GetTransactionsStreamResponse_Round :
369
- eventCh <- client.TransactionEvent {
383
+ eventsCh <- client.TransactionEvent {
370
384
Round : & client.RoundTransaction {
371
385
Txid : tx .Round .Txid ,
372
386
SpentVtxos : vtxos (tx .Round .SpentVtxos ).toVtxos (),
@@ -376,7 +390,7 @@ func (c *grpcClient) GetTransactionsStream(
376
390
},
377
391
}
378
392
case * arkv1.GetTransactionsStreamResponse_Redeem :
379
- eventCh <- client.TransactionEvent {
393
+ eventsCh <- client.TransactionEvent {
380
394
Redeem : & client.RedeemTransaction {
381
395
Txid : tx .Redeem .Txid ,
382
396
SpentVtxos : vtxos (tx .Redeem .SpentVtxos ).toVtxos (),
@@ -390,11 +404,12 @@ func (c *grpcClient) GetTransactionsStream(
390
404
391
405
closeFn := func () {
392
406
if err := stream .CloseSend (); err != nil {
393
- logrus .Warnf ("failed to close stream: %v" , err )
407
+ logrus .Warnf ("failed to close transaction stream: %v" , err )
394
408
}
409
+ cancel ()
395
410
}
396
411
397
- return eventCh , closeFn , nil
412
+ return eventsCh , closeFn , nil
398
413
}
399
414
400
415
func (a * grpcClient ) SetNostrRecipient (
@@ -421,28 +436,36 @@ func (a *grpcClient) DeleteNostrRecipient(
421
436
func (c * grpcClient ) SubscribeForAddress (
422
437
ctx context.Context , addr string ,
423
438
) (<- chan client.AddressEvent , func (), error ) {
439
+ ctx , cancel := context .WithCancel (ctx )
440
+
424
441
stream , err := c .svc .SubscribeForAddress (ctx , & arkv1.SubscribeForAddressRequest {
425
442
Address : addr ,
426
443
})
427
444
if err != nil {
445
+ cancel ()
428
446
return nil , nil , err
429
447
}
430
448
431
- eventCh := make (chan client.AddressEvent )
449
+ eventsCh := make (chan client.AddressEvent )
432
450
433
451
go func () {
434
- defer close (eventCh )
452
+ defer close (eventsCh )
453
+
435
454
for {
436
455
resp , err := stream .Recv ()
437
- if err == io .EOF {
438
- return
439
- }
440
456
if err != nil {
441
- eventCh <- client.AddressEvent {Err : err }
457
+ if err == io .EOF {
458
+ eventsCh <- client.AddressEvent {Err : client .ErrConnectionClosedByServer }
459
+ return
460
+ }
461
+ if st , ok := status .FromError (err ); ok && st .Code () == codes .Canceled {
462
+ return
463
+ }
464
+ eventsCh <- client.AddressEvent {Err : err }
442
465
return
443
466
}
444
467
445
- eventCh <- client.AddressEvent {
468
+ eventsCh <- client.AddressEvent {
446
469
NewVtxos : vtxos (resp .NewVtxos ).toVtxos (),
447
470
SpentVtxos : vtxos (resp .SpentVtxos ).toVtxos (),
448
471
}
@@ -451,11 +474,12 @@ func (c *grpcClient) SubscribeForAddress(
451
474
452
475
closeFn := func () {
453
476
if err := stream .CloseSend (); err != nil {
454
- logrus .Warnf ("failed to close stream: %v" , err )
477
+ logrus .Warnf ("failed to close address stream: %v" , err )
455
478
}
479
+ cancel ()
456
480
}
457
481
458
- return eventCh , closeFn , nil
482
+ return eventsCh , closeFn , nil
459
483
}
460
484
461
485
func signedVtxosToProto (vtxos []client.SignedVtxoOutpoint ) []* arkv1.SignedVtxoOutpoint {
0 commit comments