@libp2p/tcp 1.0.4 → 1.0.5

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.
package/README.md CHANGED
@@ -41,7 +41,7 @@
41
41
  import { TCP } from '@libp2p/tcp'
42
42
  import { Multiaddr } from '@multiformats/multiaddr'
43
43
  import pipe from 'it-pipe'
44
- import { collect } from 'streaming-iterables'
44
+ import all from 'it-all'
45
45
 
46
46
  // A simple upgrader that just returns the MultiaddrConnection
47
47
  const upgrader = {
@@ -66,7 +66,7 @@ console.log('listening')
66
66
  const socket = await tcp.dial(addr)
67
67
  const values = await pipe(
68
68
  socket,
69
- collect
69
+ all
70
70
  )
71
71
  console.log(`Value: ${values.toString()}`)
72
72
 
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import net from 'net';
3
- import type { Transport, Upgrader, ListenerOptions, Listener } from '@libp2p/interfaces/transport';
3
+ import type { Transport, Upgrader, ListenerOptions } from '@libp2p/interfaces/transport';
4
4
  import type { Multiaddr } from '@multiformats/multiaddr';
5
5
  /**
6
6
  * @typedef {import('multiaddr').Multiaddr} Multiaddr
@@ -25,7 +25,7 @@ export declare class TCP implements Transport<DialOptions, ListenerOptions> {
25
25
  * anytime a new incoming Connection has been successfully upgraded via
26
26
  * `upgrader.upgradeInbound`.
27
27
  */
28
- createListener(options?: ListenerOptions): Listener;
28
+ createListener(options?: ListenerOptions): import("@libp2p/interfaces/transport").Listener;
29
29
  /**
30
30
  * Takes a list of `Multiaddr`s and returns only valid TCP addresses
31
31
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AASrB,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAClG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAKxD;;;;;;GAMG;AAEH,UAAU,UAAU;IAClB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,GAAI,YAAW,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAEvB,OAAO,EAAE,UAAU;IAU1B,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB;IAe9C,QAAQ,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB;IA+DxD;;;;OAIG;IACH,cAAc,CAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ;IAIxD;;OAEG;IACH,MAAM,CAAE,UAAU,EAAE,SAAS,EAAE;CAWhC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AASrB,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAKxD;;;;;;GAMG;AAEH,UAAU,UAAU;IAClB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,GAAI,YAAW,SAAS,CAAC,WAAW,EAAE,eAAe,CAAC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAEvB,OAAO,EAAE,UAAU;IAU1B,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB;IAe9C,QAAQ,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,GAAE,WAAgB;IA+DxD;;;;OAIG;IACH,cAAc,CAAE,OAAO,GAAE,eAAoB;IAI7C;;OAEG;IACH,MAAM,CAAE,UAAU,EAAE,SAAS,EAAE;CAWhC"}
@@ -1,27 +1,12 @@
1
- /// <reference types="node" />
2
- import net from 'net';
3
- import { EventEmitter } from '@libp2p/interfaces';
4
1
  import type { Connection } from '@libp2p/interfaces/connection';
5
- import type { MultiaddrConnection, Upgrader, Listener, ListenerEvents, ConnectionHandler } from '@libp2p/interfaces/transport';
6
- import type { Multiaddr } from '@multiformats/multiaddr';
2
+ import type { Upgrader, Listener } from '@libp2p/interfaces/transport';
7
3
  interface Context {
8
4
  handler?: (conn: Connection) => void;
9
5
  upgrader: Upgrader;
10
6
  }
11
- declare class TCPListener extends EventEmitter<ListenerEvents> implements Listener {
12
- private peerId?;
13
- private listeningAddr?;
14
- private readonly server;
15
- private connections;
16
- constructor(upgrader: Upgrader, handler?: ConnectionHandler);
17
- getAddrs(): Multiaddr[];
18
- listen(ma: Multiaddr): Promise<void>;
19
- close(): Promise<void>;
20
- trackConn(maConn: MultiaddrConnection, socket: net.Socket): void;
21
- }
22
7
  /**
23
8
  * Create listener
24
9
  */
25
- export declare function createListener(context: Context): TCPListener;
10
+ export declare function createListener(context: Context): Listener;
26
11
  export {};
27
12
  //# sourceMappingURL=listener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AAQrB,OAAO,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAE9H,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAexD,UAAU,OAAO;IACf,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,cAAM,WAAY,SAAQ,YAAY,CAAC,cAAc,CAAE,YAAW,QAAQ;IACxE,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,aAAa,CAAC,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAuB;gBAE7B,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAiE5D,QAAQ;IA2BF,MAAM,CAAE,EAAE,EAAE,SAAS;IAuBrB,KAAK;IAcX,SAAS,CAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM;CAS3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,OAAO,EAAE,OAAO,eAM/C"}
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAuB,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAqB3F,UAAU,OAAO;IACf,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,OAAO,EAAE,OAAO,YAsH/C"}
@@ -16,130 +16,115 @@ async function attemptClose(maConn) {
16
16
  log.error('an error occurred closing the connection', err);
17
17
  }
18
18
  }
19
- class TCPListener extends EventEmitter {
20
- constructor(upgrader, handler) {
21
- super();
22
- this.connections = [];
23
- this.server = net.createServer(socket => {
24
- // Avoid uncaught errors caused by unstable connections
25
- socket.on('error', err => {
26
- log('socket error', err);
19
+ /**
20
+ * Create listener
21
+ */
22
+ export function createListener(context) {
23
+ const { handler, upgrader } = context;
24
+ let peerId;
25
+ let listeningAddr;
26
+ const server = Object.assign(net.createServer(socket => {
27
+ // Avoid uncaught errors caused by unstable connections
28
+ socket.on('error', err => {
29
+ log('socket error', err);
30
+ });
31
+ let maConn;
32
+ try {
33
+ maConn = toMultiaddrConnection(socket, { listeningAddr });
34
+ }
35
+ catch (err) {
36
+ log.error('inbound connection failed', err);
37
+ return;
38
+ }
39
+ log('new inbound connection %s', maConn.remoteAddr);
40
+ try {
41
+ upgrader.upgradeInbound(maConn)
42
+ .then((conn) => {
43
+ log('inbound connection %s upgraded', maConn.remoteAddr);
44
+ trackConn(server, maConn, socket);
45
+ if (handler != null) {
46
+ handler(conn);
47
+ }
48
+ listener.dispatchEvent(new CustomEvent('connection', { detail: conn }));
49
+ })
50
+ .catch(async (err) => {
51
+ log.error('inbound connection failed', err);
52
+ await attemptClose(maConn);
53
+ })
54
+ .catch(err => {
55
+ log.error('closing inbound connection failed', err);
56
+ });
57
+ }
58
+ catch (err) {
59
+ log.error('inbound connection failed', err);
60
+ attemptClose(maConn)
61
+ .catch(err => {
62
+ log.error('closing inbound connection failed', err);
27
63
  });
28
- let maConn;
29
- try {
30
- maConn = toMultiaddrConnection(socket, { listeningAddr: this.listeningAddr });
64
+ }
65
+ }),
66
+ // Keep track of open connections to destroy in case of timeout
67
+ { __connections: [] });
68
+ const listener = Object.assign(new EventEmitter(), {
69
+ getAddrs: () => {
70
+ let addrs = [];
71
+ const address = server.address();
72
+ if (address == null) {
73
+ throw new Error('Listener is not ready yet');
31
74
  }
32
- catch (err) {
33
- log.error('inbound connection failed', err);
34
- return;
75
+ if (typeof address === 'string') {
76
+ throw new Error('Incorrect server address type');
35
77
  }
36
- log('new inbound connection %s', maConn.remoteAddr);
37
- try {
38
- upgrader.upgradeInbound(maConn)
39
- .then((conn) => {
40
- log('inbound connection %s upgraded', maConn.remoteAddr);
41
- this.trackConn(maConn, socket);
42
- if (handler != null) {
43
- handler(conn);
44
- }
45
- this.dispatchEvent(new CustomEvent('connection', {
46
- detail: conn
47
- }));
48
- })
49
- .catch(async (err) => {
50
- log.error('inbound connection failed', err);
51
- await attemptClose(maConn);
52
- })
53
- .catch(err => {
54
- log.error('closing inbound connection failed', err);
55
- });
78
+ // Because TCP will only return the IPv6 version
79
+ // we need to capture from the passed multiaddr
80
+ if (listeningAddr.toString().startsWith('/ip4')) {
81
+ addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port));
56
82
  }
57
- catch (err) {
58
- log.error('inbound connection failed', err);
59
- attemptClose(maConn)
60
- .catch(err => {
61
- log.error('closing inbound connection failed', err);
83
+ else if (address.family === 'IPv6') {
84
+ addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port));
85
+ }
86
+ return addrs.map(ma => peerId != null ? ma.encapsulate(`/p2p/${peerId}`) : ma);
87
+ },
88
+ listen: async (ma) => {
89
+ listeningAddr = ma;
90
+ peerId = ma.getPeerId();
91
+ if (peerId == null) {
92
+ listeningAddr = ma.decapsulateCode(CODE_P2P);
93
+ }
94
+ return await new Promise((resolve, reject) => {
95
+ const options = multiaddrToNetConfig(listeningAddr);
96
+ server.listen(options, (err) => {
97
+ if (err != null) {
98
+ return reject(err);
99
+ }
100
+ log('Listening on %s', server.address());
101
+ resolve();
62
102
  });
103
+ });
104
+ },
105
+ close: async () => {
106
+ if (!server.listening) {
107
+ return;
63
108
  }
64
- });
65
- this.server.on('error', err => {
66
- this.dispatchEvent(new CustomEvent('error', {
67
- detail: err
68
- }));
69
- });
70
- this.server.on('close', () => {
71
- this.dispatchEvent(new CustomEvent('close'));
72
- });
73
- this.server.on('listening', () => {
74
- this.dispatchEvent(new CustomEvent('listening'));
75
- });
76
- }
77
- getAddrs() {
78
- let addrs = [];
79
- const address = this.server.address();
80
- if (address == null) {
81
- throw new Error('Listener is not ready yet');
82
- }
83
- if (typeof address === 'string') {
84
- throw new Error('Incorrect server address type');
85
- }
86
- if (this.listeningAddr == null) {
87
- throw new Error('Listener is not ready yet');
88
- }
89
- // Because TCP will only return the IPv6 version
90
- // we need to capture from the passed multiaddr
91
- if (this.listeningAddr.toString().startsWith('/ip4')) {
92
- addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port));
93
- }
94
- else if (address.family === 'IPv6') {
95
- addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port));
96
- }
97
- return addrs.map(ma => this.peerId != null ? ma.encapsulate(`/p2p/${this.peerId}`) : ma);
98
- }
99
- async listen(ma) {
100
- const peerId = ma.getPeerId();
101
- if (peerId == null) {
102
- ma = ma.decapsulateCode(CODE_P2P);
103
- }
104
- else {
105
- this.peerId = peerId;
106
- }
107
- this.listeningAddr = ma;
108
- return await new Promise((resolve, reject) => {
109
- const options = multiaddrToNetConfig(ma);
110
- this.server.listen(options, (err) => {
111
- if (err != null) {
112
- return reject(err);
113
- }
114
- log('Listening on %s', this.server.address());
115
- resolve();
109
+ await Promise.all([
110
+ server.__connections.map(async (maConn) => await attemptClose(maConn))
111
+ ]);
112
+ await new Promise((resolve, reject) => {
113
+ server.close(err => (err != null) ? reject(err) : resolve());
116
114
  });
117
- });
118
- }
119
- async close() {
120
- if (!this.server.listening) {
121
- return;
122
115
  }
123
- await Promise.all([
124
- this.connections.map(async (maConn) => await attemptClose(maConn))
125
- ]);
126
- await new Promise((resolve, reject) => {
127
- this.server.close(err => (err != null) ? reject(err) : resolve());
128
- });
129
- }
130
- trackConn(maConn, socket) {
131
- this.connections.push(maConn);
132
- const untrackConn = () => {
133
- this.connections = this.connections.filter(c => c !== maConn);
134
- };
135
- socket.once('close', untrackConn);
136
- }
116
+ });
117
+ server
118
+ .on('listening', () => listener.dispatchEvent(new CustomEvent('listening')))
119
+ .on('error', err => listener.dispatchEvent(new CustomEvent('error', { detail: err })))
120
+ .on('close', () => listener.dispatchEvent(new CustomEvent('close')));
121
+ return listener;
137
122
  }
138
- /**
139
- * Create listener
140
- */
141
- export function createListener(context) {
142
- const { handler, upgrader } = context;
143
- return new TCPListener(upgrader, handler);
123
+ function trackConn(server, maConn, socket) {
124
+ server.__connections.push(maConn);
125
+ const untrackConn = () => {
126
+ server.__connections = server.__connections.filter(c => c !== maConn);
127
+ };
128
+ socket.once('close', untrackConn);
144
129
  }
145
130
  //# sourceMappingURL=listener.js.map
@@ -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/tcp",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Node.js implementation of the TCP module that libp2p uses, which implements the interface-connection and interface-transport interfaces",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p-tcp#readme",
@@ -147,9 +147,9 @@
147
147
  "@libp2p/interface-compliance-tests": "^1.1.2",
148
148
  "@libp2p/interfaces": "^1.3.2",
149
149
  "aegir": "^36.1.3",
150
+ "it-all": "^1.0.6",
150
151
  "it-pipe": "^2.0.3",
151
152
  "sinon": "^13.0.0",
152
- "streaming-iterables": "^6.0.0",
153
153
  "uint8arrays": "^3.0.0"
154
154
  }
155
155
  }
package/src/index.ts CHANGED
@@ -7,7 +7,7 @@ import { createListener } from './listener.js'
7
7
  import { multiaddrToNetConfig } from './utils.js'
8
8
  import { AbortError } from 'abortable-iterator'
9
9
  import { CODE_CIRCUIT, CODE_P2P } from './constants.js'
10
- import type { Transport, Upgrader, ListenerOptions, Listener } from '@libp2p/interfaces/transport'
10
+ import type { Transport, Upgrader, ListenerOptions } from '@libp2p/interfaces/transport'
11
11
  import type { Multiaddr } from '@multiformats/multiaddr'
12
12
  import type { Socket } from 'net'
13
13
 
@@ -125,7 +125,7 @@ export class TCP implements Transport<DialOptions, ListenerOptions> {
125
125
  * anytime a new incoming Connection has been successfully upgraded via
126
126
  * `upgrader.upgradeInbound`.
127
127
  */
128
- createListener (options: ListenerOptions = {}): Listener {
128
+ createListener (options: ListenerOptions = {}) {
129
129
  return createListener({ upgrader: this._upgrader, ...options })
130
130
  }
131
131
 
package/src/listener.ts CHANGED
@@ -8,12 +8,16 @@ import {
8
8
  } from './utils.js'
9
9
  import { EventEmitter, CustomEvent } from '@libp2p/interfaces'
10
10
  import type { Connection } from '@libp2p/interfaces/connection'
11
- import type { MultiaddrConnection, Upgrader, Listener, ListenerEvents, ConnectionHandler } from '@libp2p/interfaces/transport'
11
+ import type { MultiaddrConnection, Upgrader, Listener } from '@libp2p/interfaces/transport'
12
12
  import type { Server } from 'net'
13
13
  import type { Multiaddr } from '@multiformats/multiaddr'
14
14
 
15
15
  const log = logger('libp2p:tcp:listener')
16
16
 
17
+ interface ServerWithMultiaddrConnections extends Server {
18
+ __connections: MultiaddrConnection[]
19
+ }
20
+
17
21
  /**
18
22
  * Attempts to close the given maConn. If a failure occurs, it will be logged
19
23
  */
@@ -30,159 +34,135 @@ interface Context {
30
34
  upgrader: Upgrader
31
35
  }
32
36
 
33
- class TCPListener extends EventEmitter<ListenerEvents> implements Listener {
34
- private peerId?: string
35
- private listeningAddr?: Multiaddr
36
- private readonly server: Server
37
- private connections: MultiaddrConnection[]
38
-
39
- constructor (upgrader: Upgrader, handler?: ConnectionHandler) {
40
- super()
41
-
42
- this.connections = []
43
-
44
- this.server = net.createServer(socket => {
45
- // Avoid uncaught errors caused by unstable connections
46
- socket.on('error', err => {
47
- log('socket error', err)
48
- })
37
+ /**
38
+ * Create listener
39
+ */
40
+ export function createListener (context: Context) {
41
+ const {
42
+ handler, upgrader
43
+ } = context
49
44
 
50
- let maConn: MultiaddrConnection
51
- try {
52
- maConn = toMultiaddrConnection(socket, { listeningAddr: this.listeningAddr })
53
- } catch (err) {
54
- log.error('inbound connection failed', err)
55
- return
56
- }
45
+ let peerId: string | null
46
+ let listeningAddr: Multiaddr
57
47
 
58
- log('new inbound connection %s', maConn.remoteAddr)
59
- try {
60
- upgrader.upgradeInbound(maConn)
61
- .then((conn) => {
62
- log('inbound connection %s upgraded', maConn.remoteAddr)
63
-
64
- this.trackConn(maConn, socket)
65
-
66
- if (handler != null) {
67
- handler(conn)
68
- }
69
-
70
- this.dispatchEvent(new CustomEvent('connection', {
71
- detail: conn
72
- }))
73
- })
74
- .catch(async err => {
75
- log.error('inbound connection failed', err)
76
-
77
- await attemptClose(maConn)
78
- })
79
- .catch(err => {
80
- log.error('closing inbound connection failed', err)
81
- })
82
- } catch (err) {
83
- log.error('inbound connection failed', err)
84
-
85
- attemptClose(maConn)
86
- .catch(err => {
87
- log.error('closing inbound connection failed', err)
88
- })
89
- }
90
- })
91
- this.server.on('error', err => {
92
- this.dispatchEvent(new CustomEvent('error', {
93
- detail: err
94
- }))
48
+ const server: ServerWithMultiaddrConnections = Object.assign(net.createServer(socket => {
49
+ // Avoid uncaught errors caused by unstable connections
50
+ socket.on('error', err => {
51
+ log('socket error', err)
95
52
  })
96
- this.server.on('close', () => {
97
- this.dispatchEvent(new CustomEvent('close'))
98
- })
99
- this.server.on('listening', () => {
100
- this.dispatchEvent(new CustomEvent('listening'))
101
- })
102
- }
103
53
 
104
- getAddrs () {
105
- let addrs: Multiaddr[] = []
106
- const address = this.server.address()
107
-
108
- if (address == null) {
109
- throw new Error('Listener is not ready yet')
54
+ let maConn: MultiaddrConnection
55
+ try {
56
+ maConn = toMultiaddrConnection(socket, { listeningAddr })
57
+ } catch (err) {
58
+ log.error('inbound connection failed', err)
59
+ return
110
60
  }
111
61
 
112
- if (typeof address === 'string') {
113
- throw new Error('Incorrect server address type')
62
+ log('new inbound connection %s', maConn.remoteAddr)
63
+ try {
64
+ upgrader.upgradeInbound(maConn)
65
+ .then((conn) => {
66
+ log('inbound connection %s upgraded', maConn.remoteAddr)
67
+ trackConn(server, maConn, socket)
68
+
69
+ if (handler != null) {
70
+ handler(conn)
71
+ }
72
+
73
+ listener.dispatchEvent(new CustomEvent('connection', { detail: conn }))
74
+ })
75
+ .catch(async err => {
76
+ log.error('inbound connection failed', err)
77
+
78
+ await attemptClose(maConn)
79
+ })
80
+ .catch(err => {
81
+ log.error('closing inbound connection failed', err)
82
+ })
83
+ } catch (err) {
84
+ log.error('inbound connection failed', err)
85
+
86
+ attemptClose(maConn)
87
+ .catch(err => {
88
+ log.error('closing inbound connection failed', err)
89
+ })
114
90
  }
91
+ }),
92
+ // Keep track of open connections to destroy in case of timeout
93
+ { __connections: [] })
115
94
 
116
- if (this.listeningAddr == null) {
117
- throw new Error('Listener is not ready yet')
118
- }
95
+ const listener: Listener = Object.assign(new EventEmitter(), {
96
+ getAddrs: () => {
97
+ let addrs: Multiaddr[] = []
98
+ const address = server.address()
119
99
 
120
- // Because TCP will only return the IPv6 version
121
- // we need to capture from the passed multiaddr
122
- if (this.listeningAddr.toString().startsWith('/ip4')) {
123
- addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port))
124
- } else if (address.family === 'IPv6') {
125
- addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port))
126
- }
100
+ if (address == null) {
101
+ throw new Error('Listener is not ready yet')
102
+ }
127
103
 
128
- return addrs.map(ma => this.peerId != null ? ma.encapsulate(`/p2p/${this.peerId}`) : ma)
129
- }
104
+ if (typeof address === 'string') {
105
+ throw new Error('Incorrect server address type')
106
+ }
130
107
 
131
- async listen (ma: Multiaddr) {
132
- const peerId = ma.getPeerId()
108
+ // Because TCP will only return the IPv6 version
109
+ // we need to capture from the passed multiaddr
110
+ if (listeningAddr.toString().startsWith('/ip4')) {
111
+ addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port))
112
+ } else if (address.family === 'IPv6') {
113
+ addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port))
114
+ }
133
115
 
134
- if (peerId == null) {
135
- ma = ma.decapsulateCode(CODE_P2P)
136
- } else {
137
- this.peerId = peerId
138
- }
116
+ return addrs.map(ma => peerId != null ? ma.encapsulate(`/p2p/${peerId}`) : ma)
117
+ },
118
+ listen: async (ma: Multiaddr) => {
119
+ listeningAddr = ma
120
+ peerId = ma.getPeerId()
139
121
 
140
- this.listeningAddr = ma
122
+ if (peerId == null) {
123
+ listeningAddr = ma.decapsulateCode(CODE_P2P)
124
+ }
141
125
 
142
- return await new Promise<void>((resolve, reject) => {
143
- const options = multiaddrToNetConfig(ma)
144
- this.server.listen(options, (err?: any) => {
145
- if (err != null) {
146
- return reject(err)
147
- }
148
- log('Listening on %s', this.server.address())
149
- resolve()
126
+ return await new Promise<void>((resolve, reject) => {
127
+ const options = multiaddrToNetConfig(listeningAddr)
128
+ server.listen(options, (err?: any) => {
129
+ if (err != null) {
130
+ return reject(err)
131
+ }
132
+ log('Listening on %s', server.address())
133
+ resolve()
134
+ })
150
135
  })
151
- })
152
- }
136
+ },
137
+ close: async () => {
138
+ if (!server.listening) {
139
+ return
140
+ }
153
141
 
154
- async close () {
155
- if (!this.server.listening) {
156
- return
142
+ await Promise.all([
143
+ server.__connections.map(async maConn => await attemptClose(maConn))
144
+ ])
145
+
146
+ await new Promise<void>((resolve, reject) => {
147
+ server.close(err => (err != null) ? reject(err) : resolve())
148
+ })
157
149
  }
150
+ })
158
151
 
159
- await Promise.all([
160
- this.connections.map(async maConn => await attemptClose(maConn))
161
- ])
152
+ server
153
+ .on('listening', () => listener.dispatchEvent(new CustomEvent('listening')))
154
+ .on('error', err => listener.dispatchEvent(new CustomEvent('error', { detail: err })))
155
+ .on('close', () => listener.dispatchEvent(new CustomEvent('close')))
162
156
 
163
- await new Promise<void>((resolve, reject) => {
164
- this.server.close(err => (err != null) ? reject(err) : resolve())
165
- })
166
- }
167
-
168
- trackConn (maConn: MultiaddrConnection, socket: net.Socket) {
169
- this.connections.push(maConn)
157
+ return listener
158
+ }
170
159
 
171
- const untrackConn = () => {
172
- this.connections = this.connections.filter(c => c !== maConn)
173
- }
160
+ function trackConn (server: ServerWithMultiaddrConnections, maConn: MultiaddrConnection, socket: net.Socket) {
161
+ server.__connections.push(maConn)
174
162
 
175
- socket.once('close', untrackConn)
163
+ const untrackConn = () => {
164
+ server.__connections = server.__connections.filter(c => c !== maConn)
176
165
  }
177
- }
178
-
179
- /**
180
- * Create listener
181
- */
182
- export function createListener (context: Context) {
183
- const {
184
- handler, upgrader
185
- } = context
186
166
 
187
- return new TCPListener(upgrader, handler)
167
+ socket.once('close', untrackConn)
188
168
  }