@libp2p/websockets 9.0.13-bc90b4fd5 → 9.0.13-d19974d93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,105 +1,270 @@
1
- import os from 'os';
2
- import { TypedEventEmitter } from '@libp2p/interface';
1
+ import http from 'node:http';
2
+ import https from 'node:https';
3
+ import net from 'node:net';
4
+ import os from 'node:os';
5
+ import { TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
3
6
  import { ipPortToMultiaddr as toMultiaddr } from '@libp2p/utils/ip-port-to-multiaddr';
4
- import { multiaddr, protocols } from '@multiformats/multiaddr';
5
- import { createServer } from 'it-ws/server';
7
+ import { isLinkLocalIp } from '@libp2p/utils/link-local-ip';
8
+ import { multiaddr } from '@multiformats/multiaddr';
9
+ import { WebSockets, WebSocketsSecure } from '@multiformats/multiaddr-matcher';
10
+ import duplex from 'it-ws/duplex';
11
+ import { pEvent } from 'p-event';
12
+ import * as ws from 'ws';
6
13
  import { socketToMaConn } from './socket-to-conn.js';
7
- class WebSocketListener extends TypedEventEmitter {
8
- connections;
9
- listeningMultiaddr;
10
- server;
14
+ export class WebSocketListener extends TypedEventEmitter {
11
15
  log;
16
+ logger;
17
+ server;
18
+ wsServer;
12
19
  metrics;
20
+ sockets;
21
+ upgrader;
22
+ inboundConnectionUpgradeTimeout;
23
+ httpOptions;
24
+ httpsOptions;
25
+ http;
26
+ https;
13
27
  addr;
28
+ listeningMultiaddr;
14
29
  constructor(components, init) {
15
30
  super();
16
31
  this.log = components.logger.forComponent('libp2p:websockets:listener');
17
- const metrics = components.metrics;
18
- // Keep track of open connections to destroy when the listener is closed
19
- this.connections = new Set();
20
- const self = this; // eslint-disable-line @typescript-eslint/no-this-alias
21
- this.addr = 'unknown';
22
- this.server = createServer({
23
- ...init,
24
- onConnection: (stream) => {
25
- const maConn = socketToMaConn(stream, toMultiaddr(stream.remoteAddress ?? '', stream.remotePort ?? 0), {
26
- logger: components.logger,
27
- metrics: this.metrics?.events,
28
- metricPrefix: `${this.addr} `
29
- });
30
- this.log('new inbound connection %s', maConn.remoteAddr);
31
- this.connections.add(stream);
32
- stream.socket.on('close', function () {
33
- self.connections.delete(stream);
34
- });
35
- init.upgrader.upgradeInbound(maConn)
36
- .catch(async (err) => {
37
- this.log.error('inbound connection failed to upgrade', err);
38
- this.metrics?.errors.increment({ [`${this.addr} inbound_upgrade`]: true });
39
- try {
40
- maConn.abort(err);
41
- }
42
- catch (err) {
43
- this.log.error('inbound connection failed to close after upgrade failed - %e', err);
44
- this.metrics?.errors.increment({ [`${this.addr} inbound_closing_failed`]: true });
45
- }
46
- });
47
- }
32
+ this.logger = components.logger;
33
+ this.upgrader = init.upgrader;
34
+ this.httpOptions = init.http;
35
+ this.httpsOptions = init.https ?? init.http;
36
+ this.inboundConnectionUpgradeTimeout = init.inboundConnectionUpgradeTimeout ?? 5000;
37
+ this.sockets = new Set();
38
+ this.wsServer = new ws.WebSocketServer({
39
+ noServer: true
48
40
  });
49
- this.server.on('listening', () => {
50
- if (metrics != null) {
51
- const { host, port } = this.listeningMultiaddr?.toOptions() ?? {};
52
- this.addr = `${host}:${port}`;
53
- metrics.registerMetricGroup('libp2p_websockets_inbound_connections_total', {
54
- label: 'address',
55
- help: 'Current active connections in WebSocket listener',
56
- calculate: () => {
57
- return {
58
- [this.addr]: this.connections.size
59
- };
60
- }
61
- });
62
- this.metrics = {
63
- status: metrics?.registerMetricGroup('libp2p_websockets_listener_status_info', {
64
- label: 'address',
65
- help: 'Current status of the WebSocket listener socket'
66
- }),
67
- errors: metrics?.registerMetricGroup('libp2p_websockets_listener_errors_total', {
68
- label: 'address',
69
- help: 'Total count of WebSocket listener errors by type'
70
- }),
71
- events: metrics?.registerMetricGroup('libp2p_websockets_listener_events_total', {
72
- label: 'address',
73
- help: 'Total count of WebSocket listener events by type'
74
- })
41
+ this.wsServer.addListener('connection', this.onWsServerConnection.bind(this));
42
+ components.metrics?.registerMetricGroup('libp2p_websockets_inbound_connections_total', {
43
+ label: 'address',
44
+ help: 'Current active connections in WebSocket listener',
45
+ calculate: () => {
46
+ if (this.addr == null) {
47
+ return {};
48
+ }
49
+ return {
50
+ [this.addr]: this.sockets.size
75
51
  };
76
52
  }
77
- this.dispatchEvent(new CustomEvent('listening'));
78
53
  });
79
- this.server.on('error', (err) => {
80
- this.metrics?.errors.increment({ [`${this.addr} listen_error`]: true });
81
- this.dispatchEvent(new CustomEvent('error', {
82
- detail: err
83
- }));
54
+ this.metrics = {
55
+ status: components.metrics?.registerMetricGroup('libp2p_websockets_listener_status_info', {
56
+ label: 'address',
57
+ help: 'Current status of the WebSocket listener socket'
58
+ }),
59
+ errors: components.metrics?.registerMetricGroup('libp2p_websockets_listener_errors_total', {
60
+ label: 'address',
61
+ help: 'Total count of WebSocket listener errors by type'
62
+ }),
63
+ events: components.metrics?.registerMetricGroup('libp2p_websockets_listener_events_total', {
64
+ label: 'address',
65
+ help: 'Total count of WebSocket listener events by type'
66
+ })
67
+ };
68
+ this.server = net.createServer({
69
+ pauseOnConnect: true
70
+ }, (socket) => {
71
+ this.onSocketConnection(socket)
72
+ .catch(err => {
73
+ this.log.error('error handling socket - %e', err);
74
+ socket.destroy();
75
+ });
84
76
  });
85
- this.server.on('close', () => {
86
- this.dispatchEvent(new CustomEvent('close'));
77
+ components.events.addEventListener('certificate:provision', this.onCertificateProvision.bind(this));
78
+ components.events.addEventListener('certificate:renew', this.onCertificateRenew.bind(this));
79
+ }
80
+ async onSocketConnection(socket) {
81
+ this.metrics.events?.increment({ [`${this.addr} connection`]: true });
82
+ let buffer = socket.read(1);
83
+ if (buffer == null) {
84
+ await pEvent(socket, 'readable');
85
+ buffer = socket.read(1);
86
+ }
87
+ // determine if this is an HTTP(s) request
88
+ const byte = buffer[0];
89
+ let server = this.http;
90
+ // https://github.com/mscdex/httpolyglot/blob/1c6c4af65f4cf95a32c918d0fdcc532e0c095740/lib/index.js#L92
91
+ if (byte < 32 || byte >= 127) {
92
+ server = this.https;
93
+ }
94
+ if (server == null) {
95
+ this.log.error('no appropriate listener configured for byte %d', byte);
96
+ socket.destroy();
97
+ return;
98
+ }
99
+ // store the socket so we can close it when the listener closes
100
+ this.sockets.add(socket);
101
+ socket.on('close', () => {
102
+ this.metrics.events?.increment({ [`${this.addr} close`]: true });
103
+ this.sockets.delete(socket);
104
+ });
105
+ socket.on('error', (err) => {
106
+ this.log.error('socket error - %e', err);
107
+ this.metrics.events?.increment({ [`${this.addr} error`]: true });
108
+ socket.destroy();
109
+ });
110
+ socket.once('timeout', () => {
111
+ this.metrics.events?.increment({ [`${this.addr} timeout`]: true });
87
112
  });
113
+ socket.once('end', () => {
114
+ this.metrics.events?.increment({ [`${this.addr} end`]: true });
115
+ });
116
+ // re-queue first data chunk
117
+ socket.unshift(buffer);
118
+ // hand the socket off to the appropriate server
119
+ server.emit('connection', socket);
88
120
  }
89
- async close() {
90
- await Promise.all(Array.from(this.connections).map(async (maConn) => { await maConn.close(); }));
91
- if (this.server.address() == null) {
92
- // not listening, close will throw an error
121
+ onWsServerConnection(socket, req) {
122
+ let addr;
123
+ try {
124
+ addr = this.server.address();
125
+ if (typeof addr === 'string') {
126
+ throw new Error('Cannot listen on unix sockets');
127
+ }
128
+ if (addr == null) {
129
+ throw new Error('Server was closing or not running');
130
+ }
131
+ }
132
+ catch (err) {
133
+ this.log.error('error obtaining remote socket address - %e', err);
134
+ req.destroy(err);
135
+ socket.close();
93
136
  return;
94
137
  }
95
- await this.server.close();
138
+ const stream = {
139
+ ...duplex(socket, {
140
+ remoteAddress: req.socket.remoteAddress ?? '0.0.0.0',
141
+ remotePort: req.socket.remotePort ?? 0
142
+ }),
143
+ localAddress: addr.address,
144
+ localPort: addr.port
145
+ };
146
+ let maConn;
147
+ try {
148
+ maConn = socketToMaConn(stream, toMultiaddr(stream.remoteAddress ?? '', stream.remotePort ?? 0), {
149
+ logger: this.logger,
150
+ metrics: this.metrics?.events,
151
+ metricPrefix: `${this.addr} `
152
+ });
153
+ }
154
+ catch (err) {
155
+ this.log.error('inbound connection failed', err);
156
+ this.metrics.errors?.increment({ [`${this.addr} inbound_to_connection`]: true });
157
+ socket.close();
158
+ return;
159
+ }
160
+ this.log('new inbound connection %s', maConn.remoteAddr);
161
+ const signal = AbortSignal.timeout(this.inboundConnectionUpgradeTimeout);
162
+ setMaxListeners(Infinity, signal);
163
+ this.upgrader.upgradeInbound(maConn, {
164
+ signal
165
+ })
166
+ .catch(async (err) => {
167
+ this.log.error('inbound connection failed to upgrade - %e', err);
168
+ this.metrics.errors?.increment({ [`${this.addr} inbound_upgrade`]: true });
169
+ await maConn.close()
170
+ .catch(err => {
171
+ this.log.error('inbound connection failed to close after upgrade failed', err);
172
+ this.metrics.errors?.increment({ [`${this.addr} inbound_closing_failed`]: true });
173
+ });
174
+ });
175
+ }
176
+ onUpgrade(req, socket, head) {
177
+ this.wsServer.handleUpgrade(req, socket, head, this.onWsServerConnection.bind(this));
178
+ }
179
+ onTLSClientError(err, socket) {
180
+ this.log.error('TLS client error - %e', err);
181
+ socket.destroy();
96
182
  }
97
183
  async listen(ma) {
184
+ if (WebSockets.exactMatch(ma)) {
185
+ this.http = http.createServer(this.httpOptions ?? {}, this.httpRequestHandler.bind(this));
186
+ this.http.addListener('upgrade', this.onUpgrade.bind(this));
187
+ }
188
+ else if (WebSocketsSecure.exactMatch(ma)) {
189
+ this.https = https.createServer(this.httpsOptions ?? {}, this.httpRequestHandler.bind(this));
190
+ this.https.addListener('upgrade', this.onUpgrade.bind(this));
191
+ this.https.addListener('tlsClientError', this.onTLSClientError.bind(this));
192
+ }
98
193
  this.listeningMultiaddr = ma;
99
- await this.server.listen(ma.toOptions());
194
+ const { host, port } = ma.toOptions();
195
+ this.addr = `${host}:${port}`;
196
+ this.server.listen(port, host);
197
+ await new Promise((resolve, reject) => {
198
+ const onListening = () => {
199
+ removeListeners();
200
+ resolve();
201
+ };
202
+ const onError = (err) => {
203
+ this.metrics.errors?.increment({ [`${this.addr} listen_error`]: true });
204
+ removeListeners();
205
+ reject(err);
206
+ };
207
+ const onDrop = () => {
208
+ this.metrics.events?.increment({ [`${this.addr} drop`]: true });
209
+ };
210
+ const removeListeners = () => {
211
+ this.server.removeListener('listening', onListening);
212
+ this.server.removeListener('error', onError);
213
+ this.server.removeListener('drop', onDrop);
214
+ };
215
+ this.server.addListener('listening', onListening);
216
+ this.server.addListener('error', onError);
217
+ this.server.addListener('drop', onDrop);
218
+ });
219
+ this.safeDispatchEvent('listening');
220
+ }
221
+ onCertificateProvision(event) {
222
+ if (this.https != null) {
223
+ this.log('auto-tls certificate found but already listening on https');
224
+ return;
225
+ }
226
+ this.log('auto-tls certificate found, starting https server');
227
+ this.https = https.createServer({
228
+ ...this.httpsOptions,
229
+ ...event.detail
230
+ }, this.httpRequestHandler.bind(this));
231
+ this.https.addListener('upgrade', this.onUpgrade.bind(this));
232
+ this.https.addListener('tlsClientError', this.onTLSClientError.bind(this));
233
+ this.safeDispatchEvent('listening');
234
+ }
235
+ onCertificateRenew(event) {
236
+ // stop accepting new connections
237
+ this.https?.close();
238
+ this.log('auto-tls certificate renewed, restarting https server');
239
+ this.https = https.createServer({
240
+ ...this.httpsOptions,
241
+ ...event.detail
242
+ }, this.httpRequestHandler.bind(this));
243
+ this.https.addListener('upgrade', this.onUpgrade.bind(this));
244
+ this.https.addListener('tlsClientError', this.onTLSClientError.bind(this));
245
+ }
246
+ async close() {
247
+ this.server.close();
248
+ this.http?.close();
249
+ this.https?.close();
250
+ this.wsServer.close();
251
+ // close all connections, must be done after closing the server to prevent
252
+ // race conditions where a new connection is accepted while we are closing
253
+ // the existing ones
254
+ this.http?.closeAllConnections();
255
+ this.https?.closeAllConnections();
256
+ [...this.sockets].forEach(socket => {
257
+ socket.destroy();
258
+ });
259
+ await Promise.all([
260
+ pEvent(this.server, 'close'),
261
+ this.http == null ? null : pEvent(this.http, 'close'),
262
+ this.https == null ? null : pEvent(this.https, 'close'),
263
+ pEvent(this.wsServer, 'close')
264
+ ]);
265
+ this.safeDispatchEvent('close');
100
266
  }
101
267
  getAddrs() {
102
- const multiaddrs = [];
103
268
  const address = this.server.address();
104
269
  if (address == null) {
105
270
  throw new Error('Listener is not ready yet');
@@ -110,35 +275,67 @@ class WebSocketListener extends TypedEventEmitter {
110
275
  if (this.listeningMultiaddr == null) {
111
276
  throw new Error('Listener is not ready yet');
112
277
  }
113
- const ipfsId = this.listeningMultiaddr.getPeerId();
114
- const protos = this.listeningMultiaddr.protos();
115
- // Because TCP will only return the IPv6 version
116
- // we need to capture from the passed multiaddr
117
- if (protos.some(proto => proto.code === protocols('ip4').code)) {
118
- const wsProto = protos.some(proto => proto.code === protocols('ws').code) ? '/ws' : '/wss';
119
- let m = this.listeningMultiaddr.decapsulate('tcp');
120
- m = m.encapsulate(`/tcp/${address.port}${wsProto}`);
121
- if (ipfsId != null) {
122
- m = m.encapsulate(`/p2p/${ipfsId}`);
123
- }
124
- if (m.toString().includes('0.0.0.0')) {
125
- const netInterfaces = os.networkInterfaces();
126
- Object.values(netInterfaces).forEach(niInfos => {
278
+ const options = this.listeningMultiaddr.toOptions();
279
+ const multiaddrs = [];
280
+ if (options.family === 4) {
281
+ if (options.host === '0.0.0.0') {
282
+ Object.values(os.networkInterfaces()).forEach(niInfos => {
127
283
  if (niInfos == null) {
128
284
  return;
129
285
  }
130
286
  niInfos.forEach(ni => {
131
287
  if (ni.family === 'IPv4') {
132
- multiaddrs.push(multiaddr(m.toString().replace('0.0.0.0', ni.address)));
288
+ multiaddrs.push(multiaddr(`/ip${options.family}/${ni.address}/${options.transport}/${address.port}`));
133
289
  }
134
290
  });
135
291
  });
136
292
  }
137
293
  else {
138
- multiaddrs.push(m);
294
+ multiaddrs.push(multiaddr(`/ip${options.family}/${options.host}/${options.transport}/${address.port}`));
139
295
  }
140
296
  }
141
- return multiaddrs;
297
+ else if (options.family === 6) {
298
+ if (options.host === '::') {
299
+ Object.values(os.networkInterfaces()).forEach(niInfos => {
300
+ if (niInfos == null) {
301
+ return;
302
+ }
303
+ for (const ni of niInfos) {
304
+ if (ni.family !== 'IPv6') {
305
+ continue;
306
+ }
307
+ if (isLinkLocalIp(ni.address)) {
308
+ continue;
309
+ }
310
+ multiaddrs.push(multiaddr(`/ip${options.family}/${ni.address}/${options.transport}/${address.port}`));
311
+ }
312
+ });
313
+ }
314
+ else {
315
+ multiaddrs.push(multiaddr(`/ip${options.family}/${options.host}/${options.transport}/${address.port}`));
316
+ }
317
+ }
318
+ const insecureMultiaddrs = [];
319
+ if (this.http != null) {
320
+ multiaddrs.forEach(ma => {
321
+ insecureMultiaddrs.push(ma.encapsulate('/ws'));
322
+ });
323
+ }
324
+ const secureMultiaddrs = [];
325
+ if (this.https != null) {
326
+ multiaddrs.forEach(ma => {
327
+ secureMultiaddrs.push(ma.encapsulate('/tls/ws'));
328
+ });
329
+ }
330
+ return [
331
+ ...insecureMultiaddrs,
332
+ ...secureMultiaddrs
333
+ ];
334
+ }
335
+ httpRequestHandler(req, res) {
336
+ res.writeHead(400);
337
+ res.write('Only WebSocket connections are supported');
338
+ res.end();
142
339
  }
143
340
  }
144
341
  export function createListener(components, init) {
@@ -1 +1 @@
1
- {"version":3,"file":"listener.js","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listener.js","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/websockets",
3
- "version": "9.0.13-bc90b4fd5",
3
+ "version": "9.0.13-d19974d93",
4
4
  "description": "JavaScript implementation of the WebSockets module that libp2p uses and that implements the interface-transport spec",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/transport-websockets#readme",
@@ -74,21 +74,22 @@
74
74
  "test:electron-main": "aegir test -t electron-main -f ./dist/test/node.js --cov"
75
75
  },
76
76
  "dependencies": {
77
- "@libp2p/interface": "2.2.1-bc90b4fd5",
78
- "@libp2p/utils": "6.2.1-bc90b4fd5",
79
- "@multiformats/multiaddr": "^12.2.3",
80
- "@multiformats/multiaddr-matcher": "^1.4.0",
81
- "@multiformats/multiaddr-to-uri": "^10.0.1",
82
- "@types/ws": "^8.5.10",
83
- "it-ws": "^6.1.1",
77
+ "@libp2p/interface": "2.2.1-d19974d93",
78
+ "@libp2p/utils": "6.2.1-d19974d93",
79
+ "@multiformats/multiaddr": "^12.3.3",
80
+ "@multiformats/multiaddr-matcher": "^1.6.0",
81
+ "@multiformats/multiaddr-to-uri": "^11.0.0",
82
+ "@types/ws": "^8.5.13",
83
+ "it-ws": "^6.1.5",
84
84
  "p-defer": "^4.0.1",
85
- "progress-events": "^1.0.0",
86
- "race-signal": "^1.0.2",
87
- "ws": "^8.17.0"
85
+ "p-event": "^6.0.1",
86
+ "progress-events": "^1.0.1",
87
+ "race-signal": "^1.1.0",
88
+ "ws": "^8.18.0"
88
89
  },
89
90
  "devDependencies": {
90
- "@libp2p/logger": "5.1.4-bc90b4fd5",
91
- "aegir": "^44.0.1",
91
+ "@libp2p/logger": "5.1.4-d19974d93",
92
+ "aegir": "^45.0.5",
92
93
  "is-loopback-addr": "^2.0.2",
93
94
  "p-wait-for": "^5.0.2",
94
95
  "sinon": "^19.0.2",
package/src/index.ts CHANGED
@@ -32,10 +32,11 @@ import { raceSignal } from 'race-signal'
32
32
  import * as filters from './filters.js'
33
33
  import { createListener } from './listener.js'
34
34
  import { socketToMaConn } from './socket-to-conn.js'
35
- import type { Transport, MultiaddrFilter, CreateListenerOptions, DialTransportOptions, Listener, AbortOptions, ComponentLogger, Logger, Connection, OutboundConnectionUpgradeEvents, Metrics, CounterGroup } from '@libp2p/interface'
35
+ import type { Transport, MultiaddrFilter, CreateListenerOptions, DialTransportOptions, Listener, AbortOptions, ComponentLogger, Logger, Connection, OutboundConnectionUpgradeEvents, Metrics, CounterGroup, TypedEventTarget, Libp2pEvents } from '@libp2p/interface'
36
36
  import type { Multiaddr } from '@multiformats/multiaddr'
37
- import type { Server } from 'http'
38
37
  import type { DuplexWebSocket } from 'it-ws/duplex'
38
+ import type http from 'node:http'
39
+ import type https from 'node:https'
39
40
  import type { ProgressEvent } from 'progress-events'
40
41
  import type { ClientOptions } from 'ws'
41
42
 
@@ -44,12 +45,34 @@ export interface WebSocketsInit extends AbortOptions, WebSocketOptions {
44
45
  * @deprecated Use a ConnectionGater instead
45
46
  */
46
47
  filter?: MultiaddrFilter
48
+
49
+ /**
50
+ * Options used to create WebSockets
51
+ */
47
52
  websocket?: ClientOptions
48
- server?: Server
53
+
54
+ /**
55
+ * Options used to create the HTTP server
56
+ */
57
+ http?: http.ServerOptions
58
+
59
+ /**
60
+ * Options used to create the HTTPs server. `options.http` will be used if
61
+ * unspecified.
62
+ */
63
+ https?: https.ServerOptions
64
+
65
+ /**
66
+ * Inbound connections must complete their upgrade within this many ms
67
+ *
68
+ * @default 5000
69
+ */
70
+ inboundConnectionUpgradeTimeout?: number
49
71
  }
50
72
 
51
73
  export interface WebSocketsComponents {
52
74
  logger: ComponentLogger
75
+ events: TypedEventTarget<Libp2pEvents>
53
76
  metrics?: Metrics
54
77
  }
55
78
 
@@ -63,12 +86,12 @@ export type WebSocketsDialEvents =
63
86
 
64
87
  class WebSockets implements Transport<WebSocketsDialEvents> {
65
88
  private readonly log: Logger
66
- private readonly init?: WebSocketsInit
89
+ private readonly init: WebSocketsInit
67
90
  private readonly logger: ComponentLogger
68
91
  private readonly metrics?: WebSocketsMetrics
69
92
  private readonly components: WebSocketsComponents
70
93
 
71
- constructor (components: WebSocketsComponents, init?: WebSocketsInit) {
94
+ constructor (components: WebSocketsComponents, init: WebSocketsInit = {}) {
72
95
  this.log = components.logger.forComponent('libp2p:websockets')
73
96
  this.logger = components.logger
74
97
  this.components = components
@@ -148,13 +171,14 @@ class WebSockets implements Transport<WebSocketsDialEvents> {
148
171
  }
149
172
 
150
173
  /**
151
- * Creates a Websockets listener. The provided `handler` function will be called
174
+ * Creates a WebSockets listener. The provided `handler` function will be called
152
175
  * anytime a new incoming Connection has been successfully upgraded via
153
176
  * `upgrader.upgradeInbound`
154
177
  */
155
178
  createListener (options: CreateListenerOptions): Listener {
156
179
  return createListener({
157
180
  logger: this.logger,
181
+ events: this.components.events,
158
182
  metrics: this.components.metrics
159
183
  }, {
160
184
  ...this.init,
@@ -163,7 +187,7 @@ class WebSockets implements Transport<WebSocketsDialEvents> {
163
187
  }
164
188
 
165
189
  /**
166
- * Takes a list of `Multiaddr`s and returns only valid Websockets addresses.
190
+ * Takes a list of `Multiaddr`s and returns only valid WebSockets addresses.
167
191
  * By default, in a browser environment only DNS+WSS multiaddr is accepted,
168
192
  * while in a Node.js environment DNS+{WS, WSS} multiaddrs are accepted.
169
193
  */