From 8caeee8221e78c2412d8aeb9a7db7cc43abfdf1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Petruni=C4=87?= Date: Tue, 17 Jan 2023 17:45:58 +0100 Subject: [PATCH] feat: safe dispatch event (#319) Adds a type-safe `safeDispatchEvent` method to the `EventEmitter` interface that allows type checking of dispatched events. resolves #317 Co-authored-by: Alex Potsides --- packages/interface-mocks/src/connection-manager.ts | 10 +++++----- packages/interface-mocks/src/peer-discovery.ts | 6 +++--- packages/interfaces/src/events.ts | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/interface-mocks/src/connection-manager.ts b/packages/interface-mocks/src/connection-manager.ts index 3768b49e0..5b2beadae 100644 --- a/packages/interface-mocks/src/connection-manager.ts +++ b/packages/interface-mocks/src/connection-manager.ts @@ -1,4 +1,4 @@ -import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events' +import { EventEmitter } from '@libp2p/interfaces/events' import type { Startable } from '@libp2p/interfaces/startable' import type { Connection } from '@libp2p/interface-connection' import type { PeerId } from '@libp2p/interface-peer-id' @@ -99,9 +99,9 @@ class MockConnectionManager extends EventEmitter implem this.connections.push(aToB) ;(componentsB.connectionManager as MockConnectionManager).connections.push(bToA) - this.components.connectionManager?.dispatchEvent(new CustomEvent('peer:connect', { + this.components.connectionManager?.safeDispatchEvent('peer:connect', { detail: aToB - })) + }) for (const protocol of this.components.registrar.getProtocols()) { for (const topology of this.components.registrar.getTopologies(protocol)) { @@ -109,9 +109,9 @@ class MockConnectionManager extends EventEmitter implem } } - componentsB.connectionManager?.dispatchEvent(new CustomEvent('peer:connect', { + componentsB.connectionManager?.safeDispatchEvent('peer:connect', { detail: bToA - })) + }) for (const protocol of componentsB.registrar.getProtocols()) { for (const topology of componentsB.registrar.getTopologies(protocol)) { diff --git a/packages/interface-mocks/src/peer-discovery.ts b/packages/interface-mocks/src/peer-discovery.ts index dd751478b..ff812786e 100644 --- a/packages/interface-mocks/src/peer-discovery.ts +++ b/packages/interface-mocks/src/peer-discovery.ts @@ -1,6 +1,6 @@ import { multiaddr } from '@multiformats/multiaddr' import * as PeerIdFactory from '@libp2p/peer-id-factory' -import { EventEmitter, CustomEvent } from '@libp2p/interfaces/events' +import { EventEmitter } from '@libp2p/interfaces/events' import type { PeerDiscovery, PeerDiscoveryEvents } from '@libp2p/interface-peer-discovery' import type { PeerInfo } from '@libp2p/interface-peer-info' import { symbol } from '@libp2p/interface-peer-discovery' @@ -52,13 +52,13 @@ export class MockDiscovery extends EventEmitter implements PeerIdFactory.createEd25519PeerId() .then(peerId => { this._timer = setTimeout(() => { - this.dispatchEvent(new CustomEvent('peer', { + this.safeDispatchEvent('peer', { detail: { id: peerId, multiaddrs: [multiaddr('/ip4/127.0.0.1/tcp/8000')], protocols: [] } - })) + }) }, this.options.discoveryDelay ?? 1000) }) .catch(() => {}) diff --git a/packages/interfaces/src/events.ts b/packages/interfaces/src/events.ts index a1b2e2a35..d63726288 100644 --- a/packages/interfaces/src/events.ts +++ b/packages/interfaces/src/events.ts @@ -74,6 +74,10 @@ export class EventEmitter extends EventTa return result } + + safeDispatchEvent(type: keyof EventMap, detail: CustomEventInit): boolean { + return this.dispatchEvent(new CustomEvent(type as string, detail)) + } } /**