Documentation
¶
Overview ¶
Package event 包含本地事件总线的抽象,以及 libp2p 子系统可能发出的标准事件。
源代码组织如下:
- doc.go: 本文件。
- bus.go: 事件总线的抽象。
- rest: 事件结构体,按实体合理分类到不同文件中,并遵循以下命名约定: Evt[实体(名词)][事件(动词过去式/动名词)] 使用过去式表示某事已经发生,而动词的动名词形式(-ing) 表示过程正在进行中。示例: EvtConnEstablishing, EvtConnEstablished。
Index ¶
- Variables
- type AddrAction
- type Bus
- type CancelFunc
- type Emitter
- type EmitterOpt
- type EvtLocalAddressesUpdated
- type EvtLocalProtocolsUpdated
- type EvtLocalReachabilityChanged
- type EvtNATDeviceTypeChanged
- type EvtPeerConnectednessChanged
- type EvtPeerIdentificationCompleted
- type EvtPeerIdentificationFailed
- type EvtPeerProtocolsUpdated
- type GenericDHTEvent
- type RawJSON
- type Subscription
- type SubscriptionOpt
- type UpdatedAddress
Constants ¶
This section is empty.
Variables ¶
var WildcardSubscription = new(wildcardSubscriptionType)
WildcardSubscription 是用于订阅事件总线上发出的所有事件的类型。
Functions ¶
This section is empty.
Types ¶
type AddrAction ¶
type AddrAction int
AddrAction 表示对主机监听地址执行的操作。 它用于在 EvtLocalAddressesUpdated 事件中为地址变更提供上下文。
const ( // Unknown 表示事件生产者无法确定地址处于当前状态的原因。 Unknown AddrAction = iota // Added 表示该地址是新的,在事件之前不存在。 Added // Maintained 表示该地址在当前和之前的状态之间没有改变。 Maintained // Removed 表示该地址已从主机中移除。 Removed )
type Bus ¶
type Bus interface {
// Subscribe 创建一个新的订阅。
//
// eventType 可以是指向单个事件类型的指针,也可以是指向多个事件类型的指针切片,
// 以便一次性订阅多个事件类型(在单个订阅和通道下)。
//
// 未能及时消费通道可能导致发布者阻塞。
//
// 如果你想订阅总线上发出的所有事件,请使用 `WildcardSubscription` 作为 `eventType`:
//
// eventbus.Subscribe(WildcardSubscription)
//
// 简单示例
//
// sub, err := eventbus.Subscribe(new(EventType))
// defer sub.Close()
// for e := range sub.Out() {
// event := e.(EventType) // 保证安全
// [...]
// }
//
// 多类型示例
//
// sub, err := eventbus.Subscribe([]interface{}{new(EventA), new(EventB)})
// defer sub.Close()
// for e := range sub.Out() {
// select e.(type):
// case EventA:
// [...]
// case EventB:
// [...]
// }
// }
Subscribe(eventType interface{}, opts ...SubscriptionOpt) (Subscription, error)
// Emitter 创建一个新的事件发射器。
//
// eventType 接受类型化的 nil 指针,并使用类型信息进行连接。
//
// 示例:
// em, err := eventbus.Emitter(new(EventT))
// defer em.Close() // 使用完发射器后必须调用此函数
// em.Emit(EventT{})
Emitter(eventType interface{}, opts ...EmitterOpt) (Emitter, error)
// GetAllEventTypes 返回此总线知道的所有事件类型(具有发射器和订阅者)。
// 它会忽略 WildcardSubscription。
//
// 调用者可以保证此函数只返回值类型;
// 不会返回指针类型。
GetAllEventTypes() []reflect.Type
}
Bus 是一个基于类型的事件传递系统的接口。
type Emitter ¶
type Emitter interface {
io.Closer
// Emit 在事件总线上发出一个事件。
// 如果订阅该主题的任何通道被阻塞,Emit 的调用也会被阻塞。
//
// 使用错误的事件类型调用此函数将导致 panic。
Emit(evt interface{}) error
}
Emitter 表示在事件总线上发出事件的参与者。
type EvtLocalAddressesUpdated ¶
type EvtLocalAddressesUpdated struct {
// Diffs 表示此事件是否包含主机先前地址集的差异。
Diffs bool
// Current 包含主机的所有当前监听地址。
// 如果 Diffs == true,则每个 UpdatedAddress 的 Action 字段将告诉你一个地址是被 Added,还是从先前状态 Maintained。
Current []UpdatedAddress
// Removed 包含从主机中移除的地址。
// 此字段仅在 Diffs == true 时设置。
Removed []UpdatedAddress
// SignedPeerRecord 包含我们自己更新后的 peer.PeerRecord,列出了 Current 中枚举的地址。
// 它被包装在 record.Envelope 中并由主机的私钥签名。
SignedPeerRecord *record.Envelope
}
EvtLocalAddressesUpdated 应在本地主机的监听地址集发生变化时发出。 这可能由多种原因引起。例如,我们可能打开了新的中继连接、通过 UPnP 建立了新的 NAT 映射,或被其他对等节点告知了我们的观察地址。
EvtLocalAddressesUpdated 包含当前监听地址的快照,也可能包含当前状态和之前状态之间的差异。 如果事件生产者能够创建差异,则 Diffs 字段将为 true,事件消费者可以检查每个 UpdatedAddress 的 Action 字段以查看每个地址是如何被修改的。
例如,Action 将告诉你 Current 列表中的地址是被事件生产者 Added,还是未经更改而被 Maintained。 从主机中移除的地址将具有 Removed 的 AddrAction,并将出现在 Removed 列表中。
如果事件生产者无法生成差异,则 Diffs 字段将为 false,Removed 列表将始终为空,并且 Current 列表中每个 UpdatedAddress 的 Action 将为 Unknown。
除了上述内容外,EvtLocalAddressesUpdated 还包含当前监听地址集的更新后的 peer.PeerRecord,它被包装在 record.Envelope 中并由主机的私钥签名。 该记录可以以安全和认证的方式与其他对等节点共享,以告知它们我们认为可拨号的地址。
type EvtLocalProtocolsUpdated ¶
type EvtLocalProtocolsUpdated struct {
// Added 列举了本地添加的协议。
Added []protocol.ID
// Removed 列举了本地移除的协议。
Removed []protocol.ID
}
EvtLocalProtocolsUpdated 应在本地主机添加或移除流处理器时发出。 对于使用匹配谓词(host.SetStreamHandlerMatch())附加的处理器,此事件中仅包含协议ID。
type EvtLocalReachabilityChanged ¶
type EvtLocalReachabilityChanged struct {
Reachability network.Reachability
}
EvtLocalReachabilityChanged 是一个事件结构体,当本地节点的可达性状态发生变化时会发出此事件。
此事件通常由 AutoNAT 子系统发出。
type EvtNATDeviceTypeChanged ¶
type EvtNATDeviceTypeChanged struct {
// TransportProtocol 是已确定 NAT 设备类型的传输协议。
TransportProtocol network.NATTransportProtocol
// NatDeviceType 表示该传输协议的 NAT 设备类型。
// 目前可以是 `Cone NAT` 或 `Symmetric NAT`。
// 请参阅 `network.NATDeviceType` 枚举的详细文档,以更好地理解这些类型的含义以及它们如何影响连接性和打洞。
NatDeviceType network.NATDeviceType
}
EvtNATDeviceTypeChanged 是一个事件结构体,当传输协议的 NAT 设备类型发生变化时会发出此事件。
注意: 此事件仅在 AutoNAT 可达性为 Private 时才有意义。 此事件的消费者还应该同时消费 `EvtLocalReachabilityChanged` 事件,并且仅在 `EvtLocalReachabilityChanged` 的可达性为 Private 时才解释此事件。
type EvtPeerConnectednessChanged ¶
type EvtPeerConnectednessChanged struct {
// Peer 是连接状态发生变化的远程对等节点。
Peer peer.ID
// Connectedness 是新的连接状态。
Connectedness network.Connectedness
}
EvtPeerConnectednessChanged 应在每次与给定对等节点的"连接状态"发生变化时发出。具体来说,在以下情况下会发出此事件:
- Connectedness = Connected: 每当我们从与对等节点没有连接过渡到至少有一个连接时。
- Connectedness = NotConnected: 每当我们从与对等节点至少有一个连接过渡到没有连接时。
未来可能会添加其他连接状态。此列表不应被视为详尽无遗。
需要注意:
- 可以与给定对等节点建立多个连接。
- libp2p 和网络都是异步的。
这意味着以下所有情况都是可能的:
连接断开并重新建立:
- 对等节点 A 观察到从 Connected -> NotConnected -> Connected 的转换
- 对等节点 B 观察到从 Connected -> NotConnected -> Connected 的转换
解释: 两个对等节点都观察到连接断开。这是"理想"情况。
连接断开并重新建立:
- 对等节点 A 观察到从 Connected -> NotConnected -> Connected 的转换。
- 对等节点 B 没有观察到转换。
解释: 对等节点 A 重新建立了断开的连接。 对等节点 B 在观察到旧连接断开之前就观察到新连接形成。
连接断开:
- 对等节点 A 没有观察到转换。
- 对等节点 B 没有观察到转换。
解释: 原本有两个连接,其中一个断开了。 这个连接可能正在被使用,但两个对等节点都不会观察到"连接状态"的变化。 对等节点应始终确保重试网络请求。
type EvtPeerIdentificationCompleted ¶
type EvtPeerIdentificationCompleted struct {
// Peer 是身份识别成功的对等节点的ID。
Peer peer.ID
// Conn 是我们识别的连接。
Conn network.Conn
// ListenAddrs 是对等节点正在监听的地址列表。
ListenAddrs []multiaddr.Multiaddr
// Protocols 是对等节点在此连接上公布的协议列表。
Protocols []protocol.ID
// SignedPeerRecord 是对等节点提供的已签名对等记录。可能为nil。
SignedPeerRecord *record.Envelope
// AgentVersion 类似于浏览器中的UserAgent字符串,或者BitTorrent中的客户端版本,
// 包含客户端名称和客户端信息。
AgentVersion string
// ProtocolVersion 是identify消息中的协议版本字段。
ProtocolVersion string
// ObservedAddr 是对等节点观察到的我方连接地址。
// 这未经验证,对等节点可能在此返回任何内容。
ObservedAddr multiaddr.Multiaddr
}
EvtPeerIdentificationCompleted 在对等节点的初始身份识别完成时发出。
type EvtPeerIdentificationFailed ¶
type EvtPeerIdentificationFailed struct {
// Peer 是身份识别失败的对等节点的ID。
Peer peer.ID
// Reason 是身份识别失败的原因。
Reason error
}
EvtPeerIdentificationFailed 在对等节点的初始身份识别失败时发出。
type EvtPeerProtocolsUpdated ¶
type EvtPeerProtocolsUpdated struct {
// Peer 是协议发生更新的对等节点。
Peer peer.ID
// Added 列举了该对等节点添加的协议。
Added []protocol.ID
// Removed 列举了该对等节点移除的协议。
Removed []protocol.ID
}
EvtPeerProtocolsUpdated 应在我们连接的对等节点添加或移除其协议栈中的协议时发出。
type GenericDHTEvent ¶
type GenericDHTEvent struct {
// Type 是发生的 DHT 事件的类型
Type string
// Raw 是事件载荷的原始 JSON 表示
Raw RawJSON
}
GenericDHTEvent 是一个通过携带原始 JSON 来封装实际 DHT 事件的类型
上下文: DHT 事件系统目前比较特殊且有点混乱,所以在我们统一/清理它之前,这个事件用于过渡。 它应该只用于信息展示目的。
实验性: 当 DHT 事件类型被提升到核心层,且 DHT 事件系统与事件总线统一后,这个类型可能会被移除。
type Subscription ¶
type Subscription interface {
io.Closer
// Out 返回用于消费事件的通道。
Out() <-chan interface{}
// Name 返回订阅的名称
Name() string
}
Subscription 表示对一个或多个事件类型的订阅。
type SubscriptionOpt ¶
type SubscriptionOpt = func(interface{}) error
SubscriptionOpt 表示订阅者选项。使用所选实现提供的选项。
type UpdatedAddress ¶
type UpdatedAddress struct {
// Address 包含被更新的地址。
Address ma.Multiaddr
// Action 表示在事件期间对地址采取的操作。如果事件生产者无法生成差异,则可能为 Unknown。
Action AddrAction
}
UpdatedAddress 用于在 EvtLocalAddressesUpdated 事件中传递地址变更信息。