event

package
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 9, 2025 License: MIT Imports: 7 Imported by: 2

Documentation

Overview

Package event 包含本地事件总线的抽象,以及 libp2p 子系统可能发出的标准事件。

源代码组织如下:

  • doc.go: 本文件。
  • bus.go: 事件总线的抽象。
  • rest: 事件结构体,按实体合理分类到不同文件中,并遵循以下命名约定: Evt[实体(名词)][事件(动词过去式/动名词)] 使用过去式表示某事已经发生,而动词的动名词形式(-ing) 表示过程正在进行中。示例: EvtConnEstablishing, EvtConnEstablished。

Index

Constants

This section is empty.

Variables

View Source
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 CancelFunc

type CancelFunc = func()

CancelFunc 用于关闭订阅者。

type Emitter

type Emitter interface {
	io.Closer

	// Emit 在事件总线上发出一个事件。
	// 如果订阅该主题的任何通道被阻塞,Emit 的调用也会被阻塞。
	//
	// 使用错误的事件类型调用此函数将导致 panic。
	Emit(evt interface{}) error
}

Emitter 表示在事件总线上发出事件的参与者。

type EmitterOpt

type EmitterOpt = func(interface{}) error

EmitterOpt 表示发射器选项。使用所选实现提供的选项。

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 RawJSON

type RawJSON string

RawJSON 是一个包含原始 JSON 字符串的类型

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 事件中传递地址变更信息。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL