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