github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/p2p/simulations/events.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:41</date>
    10  //</624450106829049856>
    11  
    12  
    13  package simulations
    14  
    15  import (
    16  	"fmt"
    17  	"time"
    18  )
    19  
    20  //EventType是模拟网络发出的事件类型
    21  type EventType string
    22  
    23  const (
    24  //EventTypeNode是当节点为
    25  //创建、启动或停止
    26  	EventTypeNode EventType = "node"
    27  
    28  //EventTypeConn是连接时发出的事件类型
    29  //在两个节点之间建立或删除
    30  	EventTypeConn EventType = "conn"
    31  
    32  //eventtypmsg是p2p消息时发出的事件类型。
    33  //在两个节点之间发送
    34  	EventTypeMsg EventType = "msg"
    35  )
    36  
    37  //事件是模拟网络发出的事件
    38  type Event struct {
    39  //类型是事件的类型
    40  	Type EventType `json:"type"`
    41  
    42  //时间是事件发生的时间
    43  	Time time.Time `json:"time"`
    44  
    45  //控件指示事件是否是受控件的结果
    46  //网络中的操作
    47  	Control bool `json:"control"`
    48  
    49  //如果类型为EventTypeNode,则设置节点
    50  	Node *Node `json:"node,omitempty"`
    51  
    52  //如果类型为eventtypconn,则设置conn
    53  	Conn *Conn `json:"conn,omitempty"`
    54  
    55  //如果类型为eventtypmsg,则设置msg。
    56  	Msg *Msg `json:"msg,omitempty"`
    57  
    58  //可选提供数据(当前仅用于模拟前端)
    59  	Data interface{} `json:"data"`
    60  }
    61  
    62  //NewEvent为给定对象创建一个新事件,该事件应为
    63  //节点、连接或消息。
    64  //
    65  //复制对象以便事件表示对象的状态
    66  //调用NewEvent时。
    67  func NewEvent(v interface{}) *Event {
    68  	event := &Event{Time: time.Now()}
    69  	switch v := v.(type) {
    70  	case *Node:
    71  		event.Type = EventTypeNode
    72  		node := *v
    73  		event.Node = &node
    74  	case *Conn:
    75  		event.Type = EventTypeConn
    76  		conn := *v
    77  		event.Conn = &conn
    78  	case *Msg:
    79  		event.Type = EventTypeMsg
    80  		msg := *v
    81  		event.Msg = &msg
    82  	default:
    83  		panic(fmt.Sprintf("invalid event type: %T", v))
    84  	}
    85  	return event
    86  }
    87  
    88  //ControlEvent创建新的控件事件
    89  func ControlEvent(v interface{}) *Event {
    90  	event := NewEvent(v)
    91  	event.Control = true
    92  	return event
    93  }
    94  
    95  //字符串返回事件的字符串表示形式
    96  func (e *Event) String() string {
    97  	switch e.Type {
    98  	case EventTypeNode:
    99  		return fmt.Sprintf("<node-event> id: %s up: %t", e.Node.ID().TerminalString(), e.Node.Up)
   100  	case EventTypeConn:
   101  		return fmt.Sprintf("<conn-event> nodes: %s->%s up: %t", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up)
   102  	case EventTypeMsg:
   103  		return fmt.Sprintf("<msg-event> nodes: %s->%s proto: %s, code: %d, received: %t", e.Msg.One.TerminalString(), e.Msg.Other.TerminalString(), e.Msg.Protocol, e.Msg.Code, e.Msg.Received)
   104  	default:
   105  		return ""
   106  	}
   107  }
   108