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  }