Skip to content

Commit

Permalink
feat: add event bus
Browse files Browse the repository at this point in the history
Adds an event emitter as a libp2p component that will echo every
emitted event on the main libp2p object.

Fixes #1574
  • Loading branch information
achingbrain committed Apr 16, 2023
1 parent 102d4c2 commit 098c17a
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
18 changes: 18 additions & 0 deletions src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ import type { PubSub } from '@libp2p/interface-pubsub'
import type { DualDHT } from '@libp2p/interface-dht'
import type { ConnectionManager } from '@libp2p/interface-connection-manager'
import type { ConnectionGater } from '@libp2p/interface-connection-gater'
import type { Libp2pEvents } from '@libp2p/interface-libp2p'
import type { EventEmitter } from '@libp2p/interfaces/events'

export interface Components {
peerId: PeerId
events: EventEmitter<Libp2pEvents>
addressManager: AddressManager
peerStore: PeerStore
upgrader: Upgrader
Expand All @@ -35,6 +38,7 @@ export interface Components {

export interface ComponentsInit {
peerId?: PeerId
events?: EventEmitter<Libp2pEvents>
addressManager?: AddressManager
peerStore?: PeerStore
upgrader?: Upgrader
Expand All @@ -53,6 +57,7 @@ export interface ComponentsInit {

export class DefaultComponents implements Components, Startable {
private _peerId?: PeerId
private _events?: EventEmitter<Libp2pEvents>
private _addressManager?: AddressManager
private _peerStore?: PeerStore
private _upgrader?: Upgrader
Expand All @@ -71,6 +76,7 @@ export class DefaultComponents implements Components, Startable {

constructor (init: ComponentsInit = {}) {
this._peerId = init.peerId
this._events = init.events
this._addressManager = init.addressManager
this._peerStore = init.peerStore
this._upgrader = init.upgrader
Expand Down Expand Up @@ -163,6 +169,18 @@ export class DefaultComponents implements Components, Startable {
this._peerId = peerId
}

get events (): EventEmitter<Libp2pEvents> {
if (this._events == null) {
throw new CodeError('events not set', 'ERR_SERVICE_MISSING')
}

return this._events
}

set events (events: EventEmitter<Libp2pEvents>) {
this._events = events
}

get addressManager (): AddressManager {
if (this._addressManager == null) {
throw new CodeError('addressManager not set', 'ERR_SERVICE_MISSING')
Expand Down
14 changes: 14 additions & 0 deletions src/libp2p.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,24 @@ export class Libp2pNode extends EventEmitter<Libp2pEvents> implements Libp2p {
constructor (init: Libp2pInit) {
super()

// event bus - components can listen to this emitter to be notified of system events
// and also cause them to be emitted
const events = new EventEmitter<Libp2pEvents>()
const originalDispatch = events.dispatchEvent.bind(events)
events.dispatchEvent = (evt: any) => {
const internalResult = originalDispatch(evt)
const externalResult = this.dispatchEvent(
new CustomEvent(evt.type, { detail: evt.detail })
)

return internalResult || externalResult
}

this.started = false
this.peerId = init.peerId
const components = this.components = new DefaultComponents({
peerId: init.peerId,
events,
datastore: init.datastore ?? new MemoryDatastore(),
connectionGater: {
denyDialPeer: async () => await Promise.resolve(false),
Expand Down
4 changes: 4 additions & 0 deletions src/transport-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import type { Startable } from '@libp2p/interfaces/startable'
import { trackedMap } from '@libp2p/tracked-map'
import type { Metrics } from '@libp2p/interface-metrics'
import type { AddressManager } from '@libp2p/interface-address-manager'
import type { Libp2pEvents } from '@libp2p/interface-libp2p'

const log = logger('libp2p:transports')

Expand All @@ -22,6 +23,7 @@ export interface DefaultTransportManagerComponents {
metrics?: Metrics
addressManager: AddressManager
upgrader: Upgrader
events: EventEmitter<Libp2pEvents>
}

export class DefaultTransportManager extends EventEmitter<TransportManagerEvents> implements TransportManager, Startable {
Expand Down Expand Up @@ -237,6 +239,8 @@ export class DefaultTransportManager extends EventEmitter<TransportManagerEvents
}
log(`libp2p in dial mode only: ${message}`)
}

this.components.events.safeDispatchEvent('multiaddrs:change', { detail: this.getAddrs() })
}

/**
Expand Down

0 comments on commit 098c17a

Please sign in to comment.