Skip to content
This repository was archived by the owner on Jun 26, 2023. It is now read-only.

Commit 221fb6a

Browse files
authored
fix: remove node event emitters (#161)
Replaces the node `EventEmitter` with the pure-js `EventTarget` class. All events are now instances of [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event). For typing [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) can be used which gives us a typed `.detail` field. Tediously `EventTarget` itself [doesn't support typed events](microsoft/TypeScript#28357) (yet?) and node.js [doesn't support](nodejs/node#40678) `CustomEvent` globally so bit of trickery was required but hopefully this can be removed in future: ```js import { EventEmitter, CustomEvent } from '@libp2p/interfaces' interface EventMap { 'foo': CustomEvent<number> } class MyEmitter extends EventEmitter<EventMap> { // ... other code here } const emitter = new MyEmitter() emitter.addEventListener('foo', (evt) => { const n = evt.detail // n is a 'number' }) ```
1 parent b952052 commit 221fb6a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+645
-365
lines changed

packages/libp2p-connection/package.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,10 @@
142142
},
143143
"scripts": {
144144
"lint": "aegir lint",
145-
"dep-check": "aegir dep-check dist/src/**/*.js",
145+
"dep-check": "aegir dep-check dist/src/**/*.js dist/test/**/*.js",
146146
"build": "tsc",
147147
"pretest": "npm run build",
148-
"test": "aegir test -f ./dist/test/**/*.js",
148+
"test": "aegir test -f ./dist/test/*.js -f ./dist/test/**/*.js",
149149
"test:chrome": "npm run test -- -t browser",
150150
"test:chrome-webworker": "npm run test -- -t webworker",
151151
"test:firefox": "npm run test -- -t browser -- --browser firefox",
@@ -161,6 +161,7 @@
161161
"devDependencies": {
162162
"@libp2p/interface-compliance-tests": "^1.0.0",
163163
"@libp2p/peer-id-factory": "^1.0.0",
164-
"aegir": "^36.1.3"
164+
"aegir": "^36.1.3",
165+
"it-pair": "^2.0.2"
165166
}
166167
}

packages/libp2p-interface-compliance-tests/package.json

+10-2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@
9696
"import": "./dist/src/utils/mock-connection-gater.js",
9797
"types": "./dist/src/utils/mock-connection-gater.d.ts"
9898
},
99+
"./utils/mock-connection-manager": {
100+
"import": "./dist/src/utils/mock-connection-manager.js",
101+
"types": "./dist/src/utils/mock-connection-manager.d.ts"
102+
},
99103
"./utils/mock-multiaddr-connection": {
100104
"import": "./dist/src/utils/mock-multiaddr-connection.js",
101105
"types": "./dist/src/utils/mock-multiaddr-connection.d.ts"
@@ -108,6 +112,10 @@
108112
"import": "./dist/src/utils/mock-peer-store.js",
109113
"types": "./dist/src/utils/mock-peer-store.d.ts"
110114
},
115+
"./utils/mock-registrar": {
116+
"import": "./dist/src/utils/mock-registrar.js",
117+
"types": "./dist/src/utils/mock-registrar.d.ts"
118+
},
111119
"./utils/mock-upgrader": {
112120
"import": "./dist/src/utils/mock-upgrader.js",
113121
"types": "./dist/src/utils/mock-upgrader.d.ts"
@@ -206,10 +214,10 @@
206214
},
207215
"scripts": {
208216
"lint": "aegir lint",
209-
"dep-check": "aegir dep-check dist/src/**/*.js",
217+
"dep-check": "aegir dep-check dist/src/**/*.js dist/test/**/*.js",
210218
"build": "tsc",
211219
"pretest": "npm run build",
212-
"test": "aegir test -f ./dist/test/**/*.js",
220+
"test": "aegir test -f ./dist/test/*.js -f ./dist/test/**/*.js",
213221
"test:chrome": "npm run test -- -t browser",
214222
"test:chrome-webworker": "npm run test -- -t webworker",
215223
"test:firefox": "npm run test -- -t browser -- --browser firefox",

packages/libp2p-interface-compliance-tests/src/peer-discovery/index.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ export default (common: TestSetup<PeerDiscovery & Startable>) => {
1616

1717
afterEach('ensure discovery was stopped', async () => {
1818
await discovery.stop()
19-
20-
discovery.removeAllListeners()
21-
2219
await common.teardown()
2320
})
2421

@@ -44,7 +41,8 @@ export default (common: TestSetup<PeerDiscovery & Startable>) => {
4441
const defer = pDefer()
4542
await discovery.start()
4643

47-
discovery.on('peer', ({ id, multiaddrs }) => {
44+
discovery.addEventListener('peer', (evt) => {
45+
const { id, multiaddrs } = evt.detail
4846
expect(id).to.exist()
4947
expect(id).to.have.property('type').that.is.oneOf(['RSA', 'Ed25519', 'secp256k1'])
5048
expect(multiaddrs).to.exist()
@@ -58,7 +56,7 @@ export default (common: TestSetup<PeerDiscovery & Startable>) => {
5856
})
5957

6058
it('should not receive a peer event before start', async () => {
61-
discovery.on('peer', () => {
59+
discovery.addEventListener('peer', () => {
6260
throw new Error('should not receive a peer event before start')
6361
})
6462

@@ -70,14 +68,14 @@ export default (common: TestSetup<PeerDiscovery & Startable>) => {
7068

7169
await discovery.start()
7270

73-
discovery.on('peer', () => {
71+
discovery.addEventListener('peer', () => {
7472
deferStart.resolve()
7573
})
7674

7775
await deferStart.promise
7876
await discovery.stop()
7977

80-
discovery.on('peer', () => {
78+
discovery.addEventListener('peer', () => {
8179
throw new Error('should not receive a peer event after stop')
8280
})
8381

packages/libp2p-interface-compliance-tests/src/pubsub/api.ts

+10-11
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import pDefer from 'p-defer'
44
import pWaitFor from 'p-wait-for'
55
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
66
import type { TestSetup } from '../index.js'
7-
import type { PubSub, Message } from '@libp2p/interfaces/pubsub'
8-
import type { Startable } from '@libp2p/interfaces'
7+
import type { PubSub } from '@libp2p/interfaces/pubsub'
8+
import type { EventMap } from './index.js'
99

1010
const topic = 'foo'
1111
const data = uint8ArrayFromString('bar')
1212

13-
export default (common: TestSetup<PubSub & Startable>) => {
13+
export default (common: TestSetup<PubSub<EventMap>>) => {
1414
describe('pubsub api', () => {
15-
let pubsub: PubSub & Startable
15+
let pubsub: PubSub<EventMap>
1616

1717
// Create pubsub router
1818
beforeEach(async () => {
@@ -51,7 +51,7 @@ export default (common: TestSetup<PubSub & Startable>) => {
5151

5252
await pubsub.start()
5353
pubsub.subscribe(topic)
54-
pubsub.on('topic', handler)
54+
pubsub.addEventListener('topic', handler)
5555

5656
await pWaitFor(() => {
5757
const topics = pubsub.getTopics()
@@ -71,15 +71,14 @@ export default (common: TestSetup<PubSub & Startable>) => {
7171
it('can subscribe and publish correctly', async () => {
7272
const defer = pDefer()
7373

74-
const handler = (msg: Message) => {
75-
expect(msg).to.not.eql(undefined)
76-
defer.resolve()
77-
}
78-
7974
await pubsub.start()
8075

8176
pubsub.subscribe(topic)
82-
pubsub.on(topic, handler)
77+
pubsub.addEventListener(topic, (evt) => {
78+
const msg = evt.detail
79+
expect(msg).to.not.eql(undefined)
80+
defer.resolve()
81+
})
8382
await pubsub.publish(topic, data)
8483
await defer.promise
8584

packages/libp2p-interface-compliance-tests/src/pubsub/connection-handlers.ts

+22-13
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
77
import { expectSet } from './utils.js'
88
import type { TestSetup } from '../index.js'
99
import type { PubSub, Message } from '@libp2p/interfaces/pubsub'
10-
import type { Startable } from '@libp2p/interfaces'
10+
import type { EventMap } from './index.js'
1111

12-
export default (common: TestSetup<PubSub & Startable>) => {
12+
export default (common: TestSetup<PubSub<EventMap>>) => {
1313
describe('pubsub connection handlers', () => {
14-
let psA: PubSub & Startable
15-
let psB: PubSub & Startable
14+
let psA: PubSub<EventMap>
15+
let psB: PubSub<EventMap>
1616

1717
describe('nodes send state on connection', () => {
1818
// Create pubsub nodes and connect them
@@ -48,8 +48,12 @@ export default (common: TestSetup<PubSub & Startable>) => {
4848
await Promise.all([
4949
// @ts-expect-error protected fields
5050
psA._libp2p.dial(psB.peerId),
51-
new Promise((resolve) => psA.once('pubsub:subscription-change', resolve)),
52-
new Promise((resolve) => psB.once('pubsub:subscription-change', resolve))
51+
new Promise((resolve) => psA.addEventListener('pubsub:subscription-change', resolve, {
52+
once: true
53+
})),
54+
new Promise((resolve) => psB.addEventListener('pubsub:subscription-change', resolve, {
55+
once: true
56+
}))
5357
])
5458

5559
expect(psA.peers.size).to.equal(1)
@@ -103,7 +107,8 @@ export default (common: TestSetup<PubSub & Startable>) => {
103107
let subscribedTopics = psA.getTopics()
104108
expect(subscribedTopics).to.not.include(topic)
105109

106-
psA.on(topic, (msg) => {
110+
psA.addEventListener(topic, (evt) => {
111+
const msg = evt.detail
107112
expect(msg.data).to.equalBytes(data)
108113
defer.resolve()
109114
})
@@ -174,7 +179,8 @@ export default (common: TestSetup<PubSub & Startable>) => {
174179
let subscribedTopics = psA.getTopics()
175180
expect(subscribedTopics).to.not.include(topic)
176181

177-
psA.on(topic, (msg) => {
182+
psA.addEventListener(topic, (evt) => {
183+
const msg = evt.detail
178184
expect(msg.data).to.equalBytes(data)
179185
defer.resolve()
180186
})
@@ -228,7 +234,8 @@ export default (common: TestSetup<PubSub & Startable>) => {
228234
let subscribedTopics = psA.getTopics()
229235
expect(subscribedTopics).to.not.include(topic)
230236

231-
psA.on(topic, (msg) => {
237+
psA.addEventListener(topic, (evt) => {
238+
const msg = evt.detail
232239
expect(msg.data).to.equalBytes(data)
233240
counter++
234241
counter === 1 ? defer1.resolve() : defer2.resolve()
@@ -285,7 +292,8 @@ export default (common: TestSetup<PubSub & Startable>) => {
285292
let bReceivedFirstMessageFromA = false
286293
let bReceivedSecondMessageFromA = false
287294

288-
const handlerSpyA = (message: Message) => {
295+
const handlerSpyA = (evt: CustomEvent<Message>) => {
296+
const message = evt.detail
289297
const data = uint8ArrayToString(message.data)
290298

291299
if (data === 'message-from-b-1') {
@@ -296,7 +304,8 @@ export default (common: TestSetup<PubSub & Startable>) => {
296304
aReceivedSecondMessageFromB = true
297305
}
298306
}
299-
const handlerSpyB = (message: Message) => {
307+
const handlerSpyB = (evt: CustomEvent<Message>) => {
308+
const message = evt.detail
300309
const data = uint8ArrayToString(message.data)
301310

302311
if (data === 'message-from-a-1') {
@@ -310,8 +319,8 @@ export default (common: TestSetup<PubSub & Startable>) => {
310319

311320
const topic = 'reconnect-channel'
312321

313-
psA.on(topic, handlerSpyA)
314-
psB.on(topic, handlerSpyB)
322+
psA.addEventListener(topic, handlerSpyA)
323+
psB.addEventListener(topic, handlerSpyB)
315324
psA.subscribe(topic)
316325
psB.subscribe(topic)
317326

packages/libp2p-interface-compliance-tests/src/pubsub/emit-self.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import sinon from 'sinon'
33
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
44
import type { TestSetup } from '../index.js'
55
import type { PubSub, PubsubOptions } from '@libp2p/interfaces/pubsub'
6-
import type { Startable } from '@libp2p/interfaces'
6+
import type { EventMap } from './index.js'
77

88
const topic = 'foo'
99
const data = uint8ArrayFromString('bar')
1010
const shouldNotHappen = () => expect.fail()
1111

12-
export default (common: TestSetup<PubSub & Startable, Partial<PubsubOptions>>) => {
12+
export default (common: TestSetup<PubSub<EventMap>, Partial<PubsubOptions>>) => {
1313
describe('emit self', () => {
14-
let pubsub: PubSub & Startable
14+
let pubsub: PubSub<EventMap>
1515

1616
describe('enabled', () => {
1717
before(async () => {
@@ -30,7 +30,9 @@ export default (common: TestSetup<PubSub & Startable, Partial<PubsubOptions>>) =
3030
})
3131

3232
it('should emit to self on publish', async () => {
33-
const promise = new Promise((resolve) => pubsub.once(topic, resolve))
33+
const promise = new Promise((resolve) => pubsub.addEventListener(topic, resolve, {
34+
once: true
35+
}))
3436

3537
void pubsub.publish(topic, data)
3638

@@ -55,7 +57,9 @@ export default (common: TestSetup<PubSub & Startable, Partial<PubsubOptions>>) =
5557
})
5658

5759
it('should not emit to self on publish', async () => {
58-
pubsub.once(topic, () => shouldNotHappen)
60+
pubsub.addEventListener(topic, () => shouldNotHappen, {
61+
once: true
62+
})
5963

6064
void pubsub.publish(topic, data)
6165

packages/libp2p-interface-compliance-tests/src/pubsub/index.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,17 @@ import connectionHandlersTest from './connection-handlers.js'
55
import twoNodesTest from './two-nodes.js'
66
import multipleNodesTest from './multiple-nodes.js'
77
import type { TestSetup } from '../index.js'
8-
import type { PubSub } from '@libp2p/interfaces/pubsub'
9-
import type { Startable } from '@libp2p/interfaces'
8+
import type { PubSub, Message, PubsubEvents } from '@libp2p/interfaces/pubsub'
109

11-
export default (common: TestSetup<PubSub & Startable>) => {
10+
export interface EventMap extends PubsubEvents {
11+
'topic': CustomEvent<Message>
12+
'foo': CustomEvent<Message>
13+
'test-topic': CustomEvent<Message>
14+
'reconnect-channel': CustomEvent<Message>
15+
'Z': CustomEvent<Message>
16+
}
17+
18+
export default (common: TestSetup<PubSub<EventMap>>) => {
1219
describe('interface-pubsub compliance tests', () => {
1320
apiTest(common)
1421
emitSelfTest(common)

packages/libp2p-interface-compliance-tests/src/pubsub/messages.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import * as utils from '@libp2p/pubsub/utils'
66
import { PeerStreams } from '@libp2p/pubsub/peer-streams'
77
import type { TestSetup } from '../index.js'
88
import type { PubSub } from '@libp2p/interfaces/pubsub'
9-
import type { Startable } from '@libp2p/interfaces'
9+
import type { EventMap } from './index.js'
1010

1111
const topic = 'foo'
1212
const data = uint8ArrayFromString('bar')
1313

14-
export default (common: TestSetup<PubSub & Startable>) => {
14+
export default (common: TestSetup<PubSub<EventMap>>) => {
1515
describe('messages', () => {
16-
let pubsub: PubSub & Startable
16+
let pubsub: PubSub<EventMap>
1717

1818
// Create pubsub router
1919
beforeEach(async () => {

0 commit comments

Comments
 (0)