github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/runtime/event_listener.go (about)

     1  package runtime
     2  
     3  import "fmt"
     4  
     5  type EmptyListener struct{}
     6  
     7  func (l EmptyListener) Send(_ Event, msg Msg) Msg {
     8  	return msg
     9  }
    10  
    11  type Event struct {
    12  	Type            EventType
    13  	MessageSent     *EventMessageSent
    14  	MessagePending  *EventMessagePending
    15  	MessageReceived *EventMessageReceived
    16  }
    17  
    18  func (e Event) String() string {
    19  	var s string
    20  	switch e.Type {
    21  	case MessageSentEvent:
    22  		s = e.MessageSent.String()
    23  	case MessagePendingEvent:
    24  		s = e.MessagePending.String()
    25  	case MessageReceivedEvent:
    26  		s = e.MessageReceived.String()
    27  	}
    28  
    29  	return fmt.Sprintf("%v: %v", e.Type.String(), s)
    30  }
    31  
    32  type EventMessageSent struct {
    33  	SenderPortAddr    PortAddr
    34  	ReceiverPortAddrs map[PortAddr]struct{} // We use map to work with breakpoints
    35  }
    36  
    37  func (e EventMessageSent) String() string {
    38  	if len(e.ReceiverPortAddrs) == 1 {
    39  		for singleReceiver := range e.ReceiverPortAddrs {
    40  			return fmt.Sprintf("%v -> %v", e.SenderPortAddr, singleReceiver)
    41  		}
    42  	}
    43  
    44  	i := 0
    45  	receiversStr := "[ "
    46  	for receiver := range e.ReceiverPortAddrs {
    47  		receiversStr += receiver.String()
    48  		if i != len(e.ReceiverPortAddrs)-1 {
    49  			receiversStr += ", "
    50  		}
    51  		i++
    52  	}
    53  	receiversStr += " ]"
    54  
    55  	return fmt.Sprintf("%v -> %v", e.SenderPortAddr, receiversStr)
    56  }
    57  
    58  // EventMessagePending describes event when message has reached receiver but not yet passed inside.
    59  // It's usefull only for interception and modifying message for specific receiver.
    60  type EventMessagePending struct {
    61  	Meta             ConnectionMeta // We can use sender from here and receivers just as a handy metadata
    62  	ReceiverPortAddr PortAddr       // So what we really need is sender and receiver port addrs
    63  }
    64  
    65  func (e EventMessagePending) String() string {
    66  	return fmt.Sprintf("%v -> %v", e.Meta.SenderPortAddr, e.ReceiverPortAddr)
    67  }
    68  
    69  type EventMessageReceived struct {
    70  	Meta             ConnectionMeta // Same as with pending event
    71  	ReceiverPortAddr PortAddr
    72  }
    73  
    74  func (e EventMessageReceived) String() string {
    75  	return fmt.Sprintf("%v -> %v", e.Meta.SenderPortAddr, e.ReceiverPortAddr)
    76  }
    77  
    78  type EventType uint8
    79  
    80  const (
    81  	MessageSentEvent     EventType = 1 // Message is sent from sender to its receivers
    82  	MessagePendingEvent  EventType = 2 // Message has reached receiver but not yet passed inside
    83  	MessageReceivedEvent EventType = 3 // Message is passed inside receiver
    84  )
    85  
    86  func (e EventType) String() string {
    87  	switch e {
    88  	case MessageSentEvent:
    89  		return "sent"
    90  	case MessagePendingEvent:
    91  		return "pending"
    92  	case MessageReceivedEvent:
    93  		return "received"
    94  	}
    95  	panic("unknown_event_type")
    96  }
    97  
    98  type EventListener interface {
    99  	Send(event Event, msg Msg) Msg
   100  }