Skip to content

Commit 50442d7

Browse files
authored
refactor: move setMaxListeners to @libp2p/interface (#2154)
- Discussed in #2138 - Move `setMaxListeners` handling into a single wrapped function exported from `@libp2p/interface/events` - Instead of setting `"browser": {"events": false}` as was discussed in #2138, an actual file is given. Without doing this, an annoying warning is produced in this package and every consumer package in the monorepo!
1 parent 6958136 commit 50442d7

File tree

16 files changed

+47
-90
lines changed

16 files changed

+47
-90
lines changed

packages/interface/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
"!dist/test",
4040
"!**/*.tsbuildinfo"
4141
],
42+
"browser": {
43+
"events": "./dist/src/events.browser.js"
44+
},
4245
"exports": {
4346
".": {
4447
"types": "./dist/src/index.d.ts",
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/** Noop for browser compatibility */
2+
export function setMaxListeners (): void {}

packages/interface/src/events.ts

+11
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { setMaxListeners as nodeSetMaxListeners } from 'events'
2+
13
export interface EventCallback<EventType> { (evt: EventType): void }
24
export interface EventObject<EventType> { handleEvent: EventCallback<EventType> }
35
export type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>
@@ -117,3 +119,12 @@ export const CustomEvent = globalThis.CustomEvent ?? CustomEventPolyfill
117119

118120
// TODO: remove this in v1
119121
export { TypedEventEmitter as EventEmitter }
122+
123+
// create a setMaxListeners that doesn't break browser usage
124+
export const setMaxListeners: typeof nodeSetMaxListeners = (n, ...eventTargets) => {
125+
try {
126+
nodeSetMaxListeners(n, ...eventTargets)
127+
} catch {
128+
// swallow error, gulp
129+
}
130+
}

packages/kad-dht/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"test:chrome-webworker": "aegir test -t webworker",
5050
"test:firefox": "aegir test -t browser -- --browser firefox",
5151
"test:firefox-webworker": "aegir test -t webworker -- --browser firefox",
52-
"dep-check": "aegir dep-check -i events"
52+
"dep-check": "aegir dep-check"
5353
},
5454
"dependencies": {
5555
"@libp2p/crypto": "^2.0.6",
@@ -63,7 +63,6 @@
6363
"abortable-iterator": "^5.0.1",
6464
"any-signal": "^4.1.1",
6565
"datastore-core": "^9.0.1",
66-
"events": "^3.3.0",
6766
"hashlru": "^2.3.0",
6867
"interface-datastore": "^8.2.0",
6968
"it-all": "^3.0.2",

packages/kad-dht/src/query-self.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { setMaxListeners } from 'events'
1+
import { setMaxListeners } from '@libp2p/interface/events'
22
import { logger, type Logger } from '@libp2p/logger'
33
import { anySignal } from 'any-signal'
44
import length from 'it-length'
@@ -110,11 +110,7 @@ export class QuerySelf implements Startable {
110110
const signal = anySignal([this.controller.signal, AbortSignal.timeout(this.queryTimeout)])
111111

112112
// this controller will get used for lots of dial attempts so make sure we don't cause warnings to be logged
113-
try {
114-
if (setMaxListeners != null) {
115-
setMaxListeners(Infinity, signal)
116-
}
117-
} catch {} // fails on node < 15.4
113+
setMaxListeners(Infinity, signal)
118114

119115
try {
120116
if (this.routingTable.size === 0) {

packages/kad-dht/src/query/manager.ts

+4-17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { setMaxListeners } from 'events'
21
import { AbortError } from '@libp2p/interface/errors'
3-
import { TypedEventEmitter, CustomEvent } from '@libp2p/interface/events'
2+
import { TypedEventEmitter, CustomEvent, setMaxListeners } from '@libp2p/interface/events'
43
import { logger } from '@libp2p/logger'
54
import { PeerSet } from '@libp2p/peer-collections'
65
import { anySignal } from 'any-signal'
@@ -75,11 +74,7 @@ export class QueryManager implements Startable {
7574
// allow us to stop queries on shut down
7675
this.shutDownController = new AbortController()
7776
// make sure we don't make a lot of noise in the logs
78-
try {
79-
if (setMaxListeners != null) {
80-
setMaxListeners(Infinity, this.shutDownController.signal)
81-
}
82-
} catch {} // fails on node < 15.4
77+
setMaxListeners(Infinity, this.shutDownController.signal)
8378
}
8479

8580
isStarted (): boolean {
@@ -122,22 +117,14 @@ export class QueryManager implements Startable {
122117

123118
// this signal will get listened to for network requests, etc
124119
// so make sure we don't make a lot of noise in the logs
125-
try {
126-
if (setMaxListeners != null) {
127-
setMaxListeners(Infinity, options.signal)
128-
}
129-
} catch {} // fails on node < 15.4
120+
setMaxListeners(Infinity, options.signal)
130121
}
131122

132123
const signal = anySignal([this.shutDownController.signal, options.signal])
133124

134125
// this signal will get listened to for every invocation of queryFunc
135126
// so make sure we don't make a lot of noise in the logs
136-
try {
137-
if (setMaxListeners != null) {
138-
setMaxListeners(Infinity, signal)
139-
}
140-
} catch {} // fails on node < 15.4
127+
setMaxListeners(Infinity, signal)
141128

142129
const log = logger(`libp2p:kad-dht:${this.lan ? 'lan' : 'wan'}:query:` + uint8ArrayToString(key, 'base58btc'))
143130

packages/libp2p/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
"scripts": {
101101
"clean": "aegir clean",
102102
"lint": "aegir lint",
103-
"dep-check": "aegir dep-check -i events",
103+
"dep-check": "aegir dep-check",
104104
"prepublishOnly": "node scripts/update-version.js && npm run build",
105105
"build": "aegir build",
106106
"generate": "run-s generate:proto:*",
@@ -139,7 +139,6 @@
139139
"any-signal": "^4.1.1",
140140
"datastore-core": "^9.0.1",
141141
"delay": "^6.0.0",
142-
"events": "^3.3.0",
143142
"interface-datastore": "^8.2.0",
144143
"it-all": "^3.0.2",
145144
"it-drain": "^3.0.2",

packages/libp2p/src/autonat/index.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
* ```
2020
*/
2121

22-
import { setMaxListeners } from 'events'
2322
import { CodeError } from '@libp2p/interface/errors'
23+
import { setMaxListeners } from '@libp2p/interface/events'
2424
import { logger } from '@libp2p/logger'
2525
import { peerIdFromBytes } from '@libp2p/peer-id'
2626
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
@@ -164,10 +164,7 @@ class DefaultAutoNATService implements Startable {
164164

165165
// this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
166166
// appearing in the console
167-
try {
168-
// fails on node < 15.4
169-
setMaxListeners?.(Infinity, signal)
170-
} catch {}
167+
setMaxListeners(Infinity, signal)
171168

172169
const ourHosts = this.components.addressManager.getAddresses()
173170
.map(ma => ma.toOptions().host)
@@ -432,10 +429,7 @@ class DefaultAutoNATService implements Startable {
432429

433430
// this controller may be used while dialing lots of peers so prevent MaxListenersExceededWarning
434431
// appearing in the console
435-
try {
436-
// fails on node < 15.4
437-
setMaxListeners?.(Infinity, signal)
438-
} catch {}
432+
setMaxListeners(Infinity, signal)
439433

440434
const self = this
441435

packages/libp2p/src/circuit-relay/server/index.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { setMaxListeners } from 'events'
2-
import { TypedEventEmitter } from '@libp2p/interface/events'
1+
import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface/events'
32
import { logger } from '@libp2p/logger'
43
import { peerIdFromBytes } from '@libp2p/peer-id'
54
import { RecordEnvelope } from '@libp2p/peer-record'
@@ -134,10 +133,7 @@ class CircuitRelayServer extends TypedEventEmitter<RelayServerEvents> implements
134133
this.maxOutboundHopStreams = init.maxOutboundHopStreams
135134
this.maxOutboundStopStreams = init.maxOutboundStopStreams ?? defaults.maxOutboundStopStreams
136135

137-
try {
138-
// fails on node < 15.4
139-
setMaxListeners?.(Infinity, this.shutdownController.signal)
140-
} catch { }
136+
setMaxListeners(Infinity, this.shutdownController.signal)
141137

142138
if (init.advertise != null && init.advertise !== false) {
143139
this.advertService = new AdvertService(components, init.advertise === true ? undefined : init.advertise)

packages/libp2p/src/connection-manager/dial-queue.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { setMaxListeners } from 'events'
21
import { AbortError, CodeError } from '@libp2p/interface/errors'
2+
import { setMaxListeners } from '@libp2p/interface/events'
33
import { logger } from '@libp2p/logger'
44
import { defaultAddressSort } from '@libp2p/utils/address-sort'
55
import { type Multiaddr, type Resolver, resolvers } from '@multiformats/multiaddr'
@@ -96,10 +96,7 @@ export class DialQueue {
9696
this.transportManager = components.transportManager
9797
this.shutDownController = new AbortController()
9898

99-
try {
100-
// This emitter gets listened to a lot
101-
setMaxListeners?.(Infinity, this.shutDownController.signal)
102-
} catch {}
99+
setMaxListeners(Infinity, this.shutDownController.signal)
103100

104101
this.pendingDialCount = components.metrics?.registerMetric('libp2p_dialler_pending_dials')
105102
this.inProgressDialCount = components.metrics?.registerMetric('libp2p_dialler_in_progress_dials')

packages/libp2p/src/connection-manager/utils.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { setMaxListeners } from 'events'
1+
import { setMaxListeners } from '@libp2p/interface/events'
22
import { logger } from '@libp2p/logger'
33
import { type AbortOptions, multiaddr, type Multiaddr } from '@multiformats/multiaddr'
44
import { type ClearableSignal, anySignal } from 'any-signal'
@@ -55,21 +55,15 @@ export function combineSignals (...signals: Array<AbortSignal | undefined>): Cle
5555

5656
for (const sig of signals) {
5757
if (sig != null) {
58-
try {
59-
// fails on node < 15.4
60-
setMaxListeners?.(Infinity, sig)
61-
} catch { }
58+
setMaxListeners(Infinity, sig)
6259
sigs.push(sig)
6360
}
6461
}
6562

6663
// let any signal abort the dial
6764
const signal = anySignal(sigs)
6865

69-
try {
70-
// fails on node < 15.4
71-
setMaxListeners?.(Infinity, signal)
72-
} catch {}
66+
setMaxListeners(Infinity, signal)
7367

7468
return signal
7569
}

packages/libp2p/src/connection/index.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { setMaxListeners } from 'events'
21
import { symbol } from '@libp2p/interface/connection'
32
import { CodeError } from '@libp2p/interface/errors'
3+
import { setMaxListeners } from '@libp2p/interface/events'
44
import { logger } from '@libp2p/logger'
55
import type { AbortOptions } from '@libp2p/interface'
66
import type { Direction, Connection, Stream, ConnectionTimeline, ConnectionStatus, NewStreamOptions } from '@libp2p/interface/connection'
@@ -152,10 +152,7 @@ export class ConnectionImpl implements Connection {
152152

153153
options.signal = options?.signal ?? AbortSignal.timeout(CLOSE_TIMEOUT)
154154

155-
try {
156-
// fails on node < 15.4
157-
setMaxListeners?.(Infinity, options.signal)
158-
} catch { }
155+
setMaxListeners(Infinity, options.signal)
159156

160157
try {
161158
log.trace('closing all streams')

packages/libp2p/src/fetch/index.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { setMaxListeners } from 'events'
21
import { CodeError } from '@libp2p/interface/errors'
2+
import { setMaxListeners } from '@libp2p/interface/events'
33
import { logger } from '@libp2p/logger'
44
import first from 'it-first'
55
import * as lp from 'it-length-prefixed'
@@ -146,10 +146,7 @@ class DefaultFetchService implements Startable, FetchService {
146146
log('using default timeout of %d ms', this.init.timeout)
147147
signal = AbortSignal.timeout(this.init.timeout ?? DEFAULT_TIMEOUT)
148148

149-
try {
150-
// fails on node < 15.4
151-
setMaxListeners?.(Infinity, signal)
152-
} catch {}
149+
setMaxListeners(Infinity, signal)
153150
}
154151

155152
try {

packages/libp2p/src/identify/identify.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { setMaxListeners } from 'events'
21
import { CodeError } from '@libp2p/interface/errors'
2+
import { setMaxListeners } from '@libp2p/interface/events'
33
import { logger } from '@libp2p/logger'
44
import { peerIdFromKeys } from '@libp2p/peer-id'
55
import { RecordEnvelope, PeerRecord } from '@libp2p/peer-record'
@@ -187,10 +187,7 @@ export class DefaultIdentifyService implements Startable, IdentifyService {
187187

188188
const signal = AbortSignal.timeout(this.timeout)
189189

190-
try {
191-
// fails on node < 15.4
192-
setMaxListeners?.(Infinity, signal)
193-
} catch {}
190+
setMaxListeners(Infinity, signal)
194191

195192
try {
196193
stream = await connection.newStream([this.identifyPushProtocolStr], {
@@ -345,10 +342,7 @@ export class DefaultIdentifyService implements Startable, IdentifyService {
345342

346343
const signal = AbortSignal.timeout(this.timeout)
347344

348-
try {
349-
// fails on node < 15.4
350-
setMaxListeners?.(Infinity, signal)
351-
} catch {}
345+
setMaxListeners(Infinity, signal)
352346

353347
try {
354348
const publicKey = this.peerId.publicKey ?? new Uint8Array(0)

packages/libp2p/src/libp2p.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { setMaxListeners } from 'events'
21
import { unmarshalPublicKey } from '@libp2p/crypto/keys'
32
import { type ContentRouting, contentRouting } from '@libp2p/interface/content-routing'
43
import { CodeError } from '@libp2p/interface/errors'
5-
import { TypedEventEmitter, CustomEvent } from '@libp2p/interface/events'
4+
import { TypedEventEmitter, CustomEvent, setMaxListeners } from '@libp2p/interface/events'
65
import { peerDiscovery } from '@libp2p/interface/peer-discovery'
76
import { type PeerRouting, peerRouting } from '@libp2p/interface/peer-routing'
87
import { DefaultKeyChain } from '@libp2p/keychain'
@@ -70,10 +69,8 @@ export class Libp2pNode<T extends ServiceMap = Record<string, unknown>> extends
7069
return internalResult || externalResult
7170
}
7271

73-
try {
74-
// This emitter gets listened to a lot
75-
setMaxListeners?.(Infinity, events)
76-
} catch {}
72+
// This emitter gets listened to a lot
73+
setMaxListeners(Infinity, events)
7774

7875
this.#started = false
7976
this.peerId = init.peerId

packages/libp2p/src/upgrader.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { setMaxListeners } from 'events'
21
import { CodeError } from '@libp2p/interface/errors'
2+
import { setMaxListeners } from '@libp2p/interface/events'
33
import { logger } from '@libp2p/logger'
44
import * as mss from '@libp2p/multistream-select'
55
import { peerIdFromString } from '@libp2p/peer-id'
@@ -170,10 +170,7 @@ export class DefaultUpgrader implements Upgrader {
170170

171171
signal.addEventListener('abort', onAbort, { once: true })
172172

173-
try {
174-
// fails on node < 15.4
175-
setMaxListeners?.(Infinity, signal)
176-
} catch { }
173+
setMaxListeners(Infinity, signal)
177174

178175
try {
179176
if ((await this.components.connectionGater.denyInboundConnection?.(maConn)) === true) {
@@ -444,10 +441,7 @@ export class DefaultUpgrader implements Upgrader {
444441

445442
options.signal = AbortSignal.timeout(30000)
446443

447-
try {
448-
// fails on node < 15.4
449-
setMaxListeners?.(Infinity, options.signal)
450-
} catch { }
444+
setMaxListeners(Infinity, options.signal)
451445
}
452446

453447
const { stream, protocol } = await mss.select(muxedStream, protocols, options)

0 commit comments

Comments
 (0)