github.com/0chain/gosdk@v1.17.11/zcnbridge/transaction/callback.go (about) 1 package transaction 2 3 import ( 4 "context" 5 6 "github.com/0chain/gosdk/zcnbridge/errors" 7 "github.com/0chain/gosdk/zcncore" 8 ) 9 10 var ( 11 // Ensure callback implements interface. 12 _ zcncore.TransactionCallback = (*callback)(nil) 13 ) 14 15 type ( 16 // TransactionCallbackAwaitable extends zcncore.TransactionCallback with synchronization methods 17 TransactionCallbackAwaitable interface { 18 zcncore.TransactionCallback 19 20 WaitCompleteCall(ctx context.Context) error 21 WaitVerifyCall(ctx context.Context) error 22 } 23 24 // callback implements zcncore.TransactionCallback interface. 25 callback struct { 26 // waitCh represents channel for making callback.OnTransactionComplete, 27 // callback.OnVerifyComplete and callBack.OnAuthComplete operations async. 28 waitCh chan interface{} 29 err error 30 } 31 ) 32 33 func NewStatus() TransactionCallbackAwaitable { 34 return &callback{ 35 waitCh: make(chan interface{}), 36 } 37 } 38 39 // OnTransactionComplete implements zcncore.TransactionCallback interface. 40 func (cb *callback) OnTransactionComplete(zcnTxn *zcncore.Transaction, status int) { 41 if status != zcncore.StatusSuccess { 42 msg := "status is not success: " + TxnStatus(status).String() + "; err: " + zcnTxn.GetTransactionError() 43 cb.err = errors.New("on_transaction_complete", msg) 44 } 45 46 cb.sendCall() 47 } 48 49 // OnVerifyComplete implements zcncore.TransactionCallback interface. 50 func (cb *callback) OnVerifyComplete(zcnTxn *zcncore.Transaction, status int) { 51 if status != zcncore.StatusSuccess { 52 msg := "status is not success: " + TxnStatus(status).String() + "; err: " + zcnTxn.GetVerifyError() 53 cb.err = errors.New("on_transaction_verify", msg) 54 } 55 56 cb.sendCall() 57 } 58 59 // OnAuthComplete implements zcncore.TransactionCallback interface. 60 func (cb *callback) OnAuthComplete(_ *zcncore.Transaction, status int) { 61 if status != zcncore.StatusSuccess { 62 msg := "status is not success: " + TxnStatus(status).String() 63 cb.err = errors.New("on_transaction_verify", msg) 64 } 65 66 cb.sendCall() 67 } 68 69 func (cb *callback) WaitCompleteCall(ctx context.Context) error { 70 select { 71 case <-ctx.Done(): 72 return errors.New("completing_transaction", "completing transaction context deadline exceeded") 73 case <-cb.waitCh: 74 return cb.err 75 } 76 } 77 78 func (cb *callback) WaitVerifyCall(ctx context.Context) error { 79 select { 80 case <-ctx.Done(): 81 return errors.New("verifying_transaction", "verifying transaction context deadline exceeded") 82 case <-cb.waitCh: 83 return cb.err 84 } 85 } 86 87 func (cb *callback) sendCall() { 88 cb.waitCh <- true 89 }