Skip to content
Snippets Groups Projects
Messages.py 1.35 KiB
Newer Older
Abe Zukor's avatar
Abe Zukor committed

azukor2's avatar
azukor2 committed
from __future__ import annotations
Abe Zukor's avatar
Abe Zukor committed
from dataclasses import dataclass
from Transaction import Transaction
azukor2's avatar
azukor2 committed
from typing import TYPE_CHECKING
from uuid import uuid4

if TYPE_CHECKING:
    from TransactionDeliverer import TransactionDeliverer
Abe Zukor's avatar
Abe Zukor committed

@dataclass
class Message:
azukor2's avatar
azukor2 committed
    message_id: str
Abe Zukor's avatar
Abe Zukor committed
    sender: str
    receiver: str

azukor2's avatar
azukor2 committed
    # Returns if the message needs to be rebroadcast
    # for reliable multicast.
    # This is TRUE only if receiving a multicasted message,
    # not a unicasted message
azukor2's avatar
azukor2 committed
    def receive_action(self):
        raise NotImplementedError("This is an abstract method that should never be called")

Abe Zukor's avatar
Abe Zukor committed
@dataclass
class TransactionMessage(Message):
    transaction: Transaction
azukor2's avatar
azukor2 committed
    transaction_ID: str
Abe Zukor's avatar
Abe Zukor committed
    deliverable: bool = False
azukor2's avatar
azukor2 committed
    
azukor2's avatar
azukor2 committed
    def receive_action(self, td: TransactionDeliverer) -> bool:
azukor2's avatar
azukor2 committed
        td.process_transaction_message(self)
azukor2's avatar
azukor2 committed
        return True
azukor2's avatar
azukor2 committed

Abe Zukor's avatar
Abe Zukor committed
@dataclass
class ProposedPriorityMessage(Message):
    transaction_ID: str
    proposed_priority: int
azukor2's avatar
azukor2 committed

azukor2's avatar
azukor2 committed
    def receive_action(self, td: TransactionDeliverer) -> bool:
azukor2's avatar
azukor2 committed
        td.process_proposed_priority_message(self)
azukor2's avatar
azukor2 committed
        return False
azukor2's avatar
azukor2 committed
    
Abe Zukor's avatar
Abe Zukor committed

@dataclass
class AgreedPriorityMessage(Message):
    transaction_ID: str
azukor2's avatar
azukor2 committed
    agreed_priority: int
Jeffrey Zhang's avatar
Jeffrey Zhang committed
    proposer: str
azukor2's avatar
azukor2 committed

azukor2's avatar
azukor2 committed
    def receive_action(self, td: TransactionDeliverer) -> bool:
azukor2's avatar
azukor2 committed
        td.process_agreed_priority_message(self)
azukor2's avatar
azukor2 committed
        return True
azukor2's avatar
azukor2 committed