def settleCommitIncoming(self, msg): #TODO: receive token, and check it! log.log("Payer: received settleCommit -> committed") self.state = self.states.committed return self.__removeTimeouts() + \ [ messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ]
def haveNoRouteOutgoing(self, transactionID, isPayerSide): self.state = self.states.cancelled return self.__removeTimeouts() + \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Cancel() ), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ]
def msg_receipt(self, msg): log.log("PayerLink: Received payment receipt") self.amount = msg.amount self.receipt = msg.receipt self.transactionID = msg.transactionID self.meetingPointID = msg.meetingPoints[ 0] #TODO: more intelligent choice self.state = self.states.hasReceipt return [ messages.SetEvent(event=messages.SetEvent.events.receiptReceived) ]
def msg_timeout(self, msg): if self.state == self.states.initial and msg.state == self.states.initial: #Receipt time-out log.log("Payer: receipt time-out -> cancelled") self.state = self.states.cancelled return self.__removeTimeouts() + \ [ messages.SetEvent(event=messages.SetEvent.events.receiptReceived) ] elif self.state == self.states.receivedRequestCommit and msg.state == self.states.receivedRequestCommit: #settleCommit time-out: assume settled anyway, since we've received the commit token log.log("Payer: settleCommit time-out -> committed") self.state = self.states.committed return self.__removeTimeouts() + \ [ messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ] log.log("Payer: time-out of state %s no longer applicable: we are now in state %s" % \ (msg.state, self.state)) return []
def msg_cancel(self, msg): log.log("Payer: Cancel received") if self.state not in (self.states.confirmed, self.states.hasPayerRoute): raise Exception( "msg_cancel should not be called in state %s" % \ self.state ) self.state = self.states.cancelled return self.__removeTimeouts() + \ [ messages.CancelRoute(transactionID=self.transactionID, isPayerSide=True), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ]
def settleRollbackOutgoing(self, msg): if self.state != self.states.locked: raise Exception( "settleRollbackOutgoing should not be called in state %s" % \ self.state ) log.log("Payer: received settleRollback -> cancelled") self.state = self.states.cancelled return self.__removeTimeouts() + \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Cancel() ), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ]
def msg_confirm(self, msg): log.log("PayerLink: Received confirm: %s" % str(msg.agreement)) if self.state != self.states.hasReceipt: raise Exception( "msg_confirm should not be called in state %s" % \ self.state ) ret = [] if msg.agreement: self.state = self.states.confirmed ret = \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Confirm(meetingPointID=self.meetingPointID) ), messages.MakeRoute( #This will start the transaction routing ID=messages.payerLocalID, routingContext=self.routingContext, amount=self.amount, transactionID=self.transactionID, startTime=None, #Will be received from the payee side endTime=None, #Will be received from the payee side meetingPointID=self.meetingPointID, isPayerSide=True ) ] else: self.state = self.states.cancelled ret = self.__removeTimeouts() + \ [ messages.OutboundMessage(localID = messages.payerLocalID, message = \ messages.Cancel() ), messages.SetEvent(event=messages.SetEvent.events.paymentFinished) ] return ret