@libp2p/tcp 4.0.0 → 4.0.2
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/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/listener.d.ts +15 -5
- package/dist/src/listener.d.ts.map +1 -1
- package/dist/src/listener.js +75 -80
- package/dist/src/listener.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +5 -5
- package/src/listener.ts +84 -92
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import net from 'net';
|
|
3
|
-
import { CreateListenerOptions, DialOptions, symbol, Transport } from '@libp2p/interface-transport';
|
|
3
|
+
import { CreateListenerOptions, DialOptions, Listener, symbol, Transport } from '@libp2p/interface-transport';
|
|
4
4
|
import type { AbortOptions, Multiaddr } from '@multiformats/multiaddr';
|
|
5
5
|
import type { Connection } from '@libp2p/interface-connection';
|
|
6
6
|
export interface TCPOptions {
|
|
@@ -42,7 +42,7 @@ export declare class TCP implements Transport {
|
|
|
42
42
|
* anytime a new incoming Connection has been successfully upgraded via
|
|
43
43
|
* `upgrader.upgradeInbound`.
|
|
44
44
|
*/
|
|
45
|
-
createListener(options: TCPCreateListenerOptions):
|
|
45
|
+
createListener(options: TCPCreateListenerOptions): Listener;
|
|
46
46
|
/**
|
|
47
47
|
* Takes a list of `Multiaddr`s and returns only valid TCP addresses
|
|
48
48
|
*/
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AASrB,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AASrB,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC7G,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAI9D,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,8BAA8B,CAAC,EAAE,MAAM,CAAA;IAEvC;;OAEG;IACH,+BAA+B,CAAC,EAAE,MAAM,CAAA;IAExC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW,EAAE,gBAAgB;CAEpE;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB,EAAE,gBAAgB;CAExF;AAED,qBAAa,GAAI,YAAW,SAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;gBAEpB,OAAO,GAAE,UAAe;IAIrC,IAAI,CAAC,MAAM,CAAC,IAAK,IAAI,CAEpB;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAEvB;IAEK,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBlE,QAAQ,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc;IAgEtD;;;;OAIG;IACH,cAAc,CAAE,OAAO,EAAE,wBAAwB,GAAG,QAAQ;IAQ5D;;OAEG;IACH,MAAM,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;CAe9C"}
|
package/dist/src/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import * as mafmt from '@multiformats/mafmt';
|
|
|
3
3
|
import errCode from 'err-code';
|
|
4
4
|
import { logger } from '@libp2p/logger';
|
|
5
5
|
import { toMultiaddrConnection } from './socket-to-conn.js';
|
|
6
|
-
import {
|
|
6
|
+
import { TCPListener } from './listener.js';
|
|
7
7
|
import { multiaddrToNetConfig } from './utils.js';
|
|
8
8
|
import { AbortError } from '@libp2p/interfaces/errors';
|
|
9
9
|
import { CODE_CIRCUIT, CODE_P2P, CODE_UNIX } from './constants.js';
|
|
@@ -92,7 +92,7 @@ export class TCP {
|
|
|
92
92
|
* `upgrader.upgradeInbound`.
|
|
93
93
|
*/
|
|
94
94
|
createListener(options) {
|
|
95
|
-
return
|
|
95
|
+
return new TCPListener({
|
|
96
96
|
...options,
|
|
97
97
|
socketInactivityTimeout: this.opts.inboundSocketInactivityTimeout,
|
|
98
98
|
socketCloseTimeout: this.opts.socketCloseTimeout
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAC5C,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/listener.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { EventEmitter } from '@libp2p/interfaces/events';
|
|
1
2
|
import type { Connection } from '@libp2p/interface-connection';
|
|
2
|
-
import type { Upgrader, Listener } from '@libp2p/interface-transport';
|
|
3
|
+
import type { Upgrader, Listener, ListenerEvents } from '@libp2p/interface-transport';
|
|
4
|
+
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
3
5
|
import type { TCPCreateListenerOptions } from './index.js';
|
|
4
6
|
interface Context extends TCPCreateListenerOptions {
|
|
5
7
|
handler?: (conn: Connection) => void;
|
|
@@ -7,9 +9,17 @@ interface Context extends TCPCreateListenerOptions {
|
|
|
7
9
|
socketInactivityTimeout?: number;
|
|
8
10
|
socketCloseTimeout?: number;
|
|
9
11
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
export declare class TCPListener extends EventEmitter<ListenerEvents> implements Listener {
|
|
13
|
+
private readonly context;
|
|
14
|
+
private readonly server;
|
|
15
|
+
/** Keep track of open connections to destroy in case of timeout */
|
|
16
|
+
private readonly connections;
|
|
17
|
+
private status;
|
|
18
|
+
constructor(context: Context);
|
|
19
|
+
private onSocket;
|
|
20
|
+
getAddrs(): Multiaddr[];
|
|
21
|
+
listen(ma: Multiaddr): Promise<void>;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
14
24
|
export {};
|
|
15
25
|
//# sourceMappingURL=listener.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAe,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACnF,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAe1D,UAAU,OAAQ,SAAQ,wBAAwB;IAChD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,QAAQ,CAAA;IAClB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAID,qBAAa,WAAY,SAAQ,YAAY,CAAC,cAAc,CAAE,YAAW,QAAQ;IAOlE,OAAO,CAAC,QAAQ,CAAC,OAAO;IANrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,OAAO,CAAC,MAAM,CAA6B;gBAEb,OAAO,EAAE,OAAO;IAa9C,OAAO,CAAC,QAAQ;IAqDhB,QAAQ;IAgCF,MAAM,CAAE,EAAE,EAAE,SAAS;IAkBrB,KAAK;CAaZ"}
|
package/dist/src/listener.js
CHANGED
|
@@ -16,15 +16,21 @@ async function attemptClose(maConn) {
|
|
|
16
16
|
log.error('an error occurred closing the connection', err);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
export class TCPListener extends EventEmitter {
|
|
20
|
+
constructor(context) {
|
|
21
|
+
super();
|
|
22
|
+
this.context = context;
|
|
23
|
+
/** Keep track of open connections to destroy in case of timeout */
|
|
24
|
+
this.connections = new Set();
|
|
25
|
+
this.status = { started: false };
|
|
26
|
+
context.keepAlive = context.keepAlive ?? true;
|
|
27
|
+
this.server = net.createServer(context, this.onSocket.bind(this));
|
|
28
|
+
this.server
|
|
29
|
+
.on('listening', () => this.dispatchEvent(new CustomEvent('listening')))
|
|
30
|
+
.on('error', err => this.dispatchEvent(new CustomEvent('error', { detail: err })))
|
|
31
|
+
.on('close', () => this.dispatchEvent(new CustomEvent('close')));
|
|
32
|
+
}
|
|
33
|
+
onSocket(socket) {
|
|
28
34
|
// Avoid uncaught errors caused by unstable connections
|
|
29
35
|
socket.on('error', err => {
|
|
30
36
|
log('socket error', err);
|
|
@@ -32,9 +38,9 @@ export function createListener(context) {
|
|
|
32
38
|
let maConn;
|
|
33
39
|
try {
|
|
34
40
|
maConn = toMultiaddrConnection(socket, {
|
|
35
|
-
listeningAddr,
|
|
36
|
-
socketInactivityTimeout,
|
|
37
|
-
socketCloseTimeout
|
|
41
|
+
listeningAddr: this.status.started ? this.status.listeningAddr : undefined,
|
|
42
|
+
socketInactivityTimeout: this.context.socketInactivityTimeout,
|
|
43
|
+
socketCloseTimeout: this.context.socketCloseTimeout
|
|
38
44
|
});
|
|
39
45
|
}
|
|
40
46
|
catch (err) {
|
|
@@ -43,14 +49,17 @@ export function createListener(context) {
|
|
|
43
49
|
}
|
|
44
50
|
log('new inbound connection %s', maConn.remoteAddr);
|
|
45
51
|
try {
|
|
46
|
-
upgrader.upgradeInbound(maConn)
|
|
52
|
+
this.context.upgrader.upgradeInbound(maConn)
|
|
47
53
|
.then((conn) => {
|
|
48
54
|
log('inbound connection %s upgraded', maConn.remoteAddr);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
this.connections.add(maConn);
|
|
56
|
+
socket.once('close', () => {
|
|
57
|
+
this.connections.delete(maConn);
|
|
58
|
+
});
|
|
59
|
+
if (this.context.handler != null) {
|
|
60
|
+
this.context.handler(conn);
|
|
52
61
|
}
|
|
53
|
-
|
|
62
|
+
this.dispatchEvent(new CustomEvent('connection', { detail: conn }));
|
|
54
63
|
})
|
|
55
64
|
.catch(async (err) => {
|
|
56
65
|
log.error('inbound connection failed', err);
|
|
@@ -67,74 +76,60 @@ export function createListener(context) {
|
|
|
67
76
|
log.error('closing inbound connection failed', err);
|
|
68
77
|
});
|
|
69
78
|
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
else if (address.family === 'IPv6') {
|
|
91
|
-
addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port));
|
|
92
|
-
}
|
|
79
|
+
}
|
|
80
|
+
getAddrs() {
|
|
81
|
+
if (!this.status.started) {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
let addrs = [];
|
|
85
|
+
const address = this.server.address();
|
|
86
|
+
const { listeningAddr, peerId } = this.status;
|
|
87
|
+
if (address == null) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
if (typeof address === 'string') {
|
|
91
|
+
addrs = [listeningAddr];
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
try {
|
|
95
|
+
// Because TCP will only return the IPv6 version
|
|
96
|
+
// we need to capture from the passed multiaddr
|
|
97
|
+
if (listeningAddr.toString().startsWith('/ip4')) {
|
|
98
|
+
addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port));
|
|
93
99
|
}
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
else if (address.family === 'IPv6') {
|
|
101
|
+
addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port));
|
|
96
102
|
}
|
|
97
103
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
listen: async (ma) => {
|
|
101
|
-
listeningAddr = ma;
|
|
102
|
-
peerId = ma.getPeerId();
|
|
103
|
-
if (peerId == null) {
|
|
104
|
-
listeningAddr = ma.decapsulateCode(CODE_P2P);
|
|
105
|
-
}
|
|
106
|
-
return await new Promise((resolve, reject) => {
|
|
107
|
-
const options = multiaddrToNetConfig(listeningAddr);
|
|
108
|
-
server.listen(options, (err) => {
|
|
109
|
-
if (err != null) {
|
|
110
|
-
return reject(err);
|
|
111
|
-
}
|
|
112
|
-
log('Listening on %s', server.address());
|
|
113
|
-
resolve();
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
},
|
|
117
|
-
close: async () => {
|
|
118
|
-
if (!server.listening) {
|
|
119
|
-
return;
|
|
104
|
+
catch (err) {
|
|
105
|
+
log.error('could not turn %s:%s into multiaddr', address.address, address.port, err);
|
|
120
106
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
107
|
+
}
|
|
108
|
+
return addrs.map(ma => peerId != null ? ma.encapsulate(`/p2p/${peerId}`) : ma);
|
|
109
|
+
}
|
|
110
|
+
async listen(ma) {
|
|
111
|
+
const peerId = ma.getPeerId();
|
|
112
|
+
const listeningAddr = peerId == null ? ma.decapsulateCode(CODE_P2P) : ma;
|
|
113
|
+
this.status = { started: true, listeningAddr, peerId };
|
|
114
|
+
return await new Promise((resolve, reject) => {
|
|
115
|
+
const options = multiaddrToNetConfig(listeningAddr);
|
|
116
|
+
this.server.listen(options, (err) => {
|
|
117
|
+
if (err != null) {
|
|
118
|
+
return reject(err);
|
|
119
|
+
}
|
|
120
|
+
log('Listening on %s', this.server.address());
|
|
121
|
+
resolve();
|
|
124
122
|
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async close() {
|
|
126
|
+
if (!this.server.listening) {
|
|
127
|
+
return;
|
|
125
128
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
return listener;
|
|
132
|
-
}
|
|
133
|
-
function trackConn(server, maConn, socket) {
|
|
134
|
-
server.__connections.push(maConn);
|
|
135
|
-
const untrackConn = () => {
|
|
136
|
-
server.__connections = server.__connections.filter(c => c !== maConn);
|
|
137
|
-
};
|
|
138
|
-
socket.once('close', untrackConn);
|
|
129
|
+
await Promise.all(Array.from(this.connections.values()).map(async (maConn) => await attemptClose(maConn)));
|
|
130
|
+
await new Promise((resolve, reject) => {
|
|
131
|
+
this.server.close(err => (err != null) ? reject(err) : resolve());
|
|
132
|
+
});
|
|
133
|
+
}
|
|
139
134
|
}
|
|
140
135
|
//# sourceMappingURL=listener.js.map
|
package/dist/src/listener.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EACL,aAAa,EACb,oBAAoB,EACrB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;
|
|
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": "4.0.
|
|
3
|
+
"version": "4.0.2",
|
|
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",
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"stream-to-it": "^0.2.2"
|
|
149
149
|
},
|
|
150
150
|
"devDependencies": {
|
|
151
|
-
"@libp2p/interface-mocks": "^
|
|
151
|
+
"@libp2p/interface-mocks": "^6.0.0",
|
|
152
152
|
"@libp2p/interface-transport-compliance-tests": "^2.0.6",
|
|
153
153
|
"aegir": "^37.5.3",
|
|
154
154
|
"it-all": "^1.0.6",
|
package/src/index.ts
CHANGED
|
@@ -3,11 +3,11 @@ import * as mafmt from '@multiformats/mafmt'
|
|
|
3
3
|
import errCode from 'err-code'
|
|
4
4
|
import { logger } from '@libp2p/logger'
|
|
5
5
|
import { toMultiaddrConnection } from './socket-to-conn.js'
|
|
6
|
-
import {
|
|
6
|
+
import { TCPListener } from './listener.js'
|
|
7
7
|
import { multiaddrToNetConfig } from './utils.js'
|
|
8
8
|
import { AbortError } from '@libp2p/interfaces/errors'
|
|
9
9
|
import { CODE_CIRCUIT, CODE_P2P, CODE_UNIX } from './constants.js'
|
|
10
|
-
import { CreateListenerOptions, DialOptions, symbol, Transport } from '@libp2p/interface-transport'
|
|
10
|
+
import { CreateListenerOptions, DialOptions, Listener, symbol, Transport } from '@libp2p/interface-transport'
|
|
11
11
|
import type { AbortOptions, Multiaddr } from '@multiformats/multiaddr'
|
|
12
12
|
import type { Socket, IpcSocketConnectOpts, TcpSocketConnectOpts } from 'net'
|
|
13
13
|
import type { Connection } from '@libp2p/interface-connection'
|
|
@@ -155,8 +155,8 @@ export class TCP implements Transport {
|
|
|
155
155
|
* anytime a new incoming Connection has been successfully upgraded via
|
|
156
156
|
* `upgrader.upgradeInbound`.
|
|
157
157
|
*/
|
|
158
|
-
createListener (options: TCPCreateListenerOptions) {
|
|
159
|
-
return
|
|
158
|
+
createListener (options: TCPCreateListenerOptions): Listener {
|
|
159
|
+
return new TCPListener({
|
|
160
160
|
...options,
|
|
161
161
|
socketInactivityTimeout: this.opts.inboundSocketInactivityTimeout,
|
|
162
162
|
socketCloseTimeout: this.opts.socketCloseTimeout
|
|
@@ -166,7 +166,7 @@ export class TCP implements Transport {
|
|
|
166
166
|
/**
|
|
167
167
|
* Takes a list of `Multiaddr`s and returns only valid TCP addresses
|
|
168
168
|
*/
|
|
169
|
-
filter (multiaddrs: Multiaddr[]) {
|
|
169
|
+
filter (multiaddrs: Multiaddr[]): Multiaddr[] {
|
|
170
170
|
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
|
|
171
171
|
|
|
172
172
|
return multiaddrs.filter(ma => {
|
package/src/listener.ts
CHANGED
|
@@ -8,17 +8,12 @@ import {
|
|
|
8
8
|
} from './utils.js'
|
|
9
9
|
import { EventEmitter, CustomEvent } from '@libp2p/interfaces/events'
|
|
10
10
|
import type { MultiaddrConnection, Connection } from '@libp2p/interface-connection'
|
|
11
|
-
import type { Upgrader, Listener } from '@libp2p/interface-transport'
|
|
12
|
-
import type { Server } from 'net'
|
|
11
|
+
import type { Upgrader, Listener, ListenerEvents } from '@libp2p/interface-transport'
|
|
13
12
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
14
13
|
import type { TCPCreateListenerOptions } from './index.js'
|
|
15
14
|
|
|
16
15
|
const log = logger('libp2p:tcp:listener')
|
|
17
16
|
|
|
18
|
-
interface ServerWithMultiaddrConnections extends Server {
|
|
19
|
-
__connections: MultiaddrConnection[]
|
|
20
|
-
}
|
|
21
|
-
|
|
22
17
|
/**
|
|
23
18
|
* Attempts to close the given maConn. If a failure occurs, it will be logged
|
|
24
19
|
*/
|
|
@@ -37,20 +32,29 @@ interface Context extends TCPCreateListenerOptions {
|
|
|
37
32
|
socketCloseTimeout?: number
|
|
38
33
|
}
|
|
39
34
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
} = context
|
|
35
|
+
type Status = {started: false} | {started: true, listeningAddr: Multiaddr, peerId: string | null }
|
|
36
|
+
|
|
37
|
+
export class TCPListener extends EventEmitter<ListenerEvents> implements Listener {
|
|
38
|
+
private readonly server: net.Server
|
|
39
|
+
/** Keep track of open connections to destroy in case of timeout */
|
|
40
|
+
private readonly connections = new Set<MultiaddrConnection>()
|
|
47
41
|
|
|
48
|
-
|
|
42
|
+
private status: Status = { started: false }
|
|
49
43
|
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
constructor (private readonly context: Context) {
|
|
45
|
+
super()
|
|
46
|
+
|
|
47
|
+
context.keepAlive = context.keepAlive ?? true
|
|
48
|
+
|
|
49
|
+
this.server = net.createServer(context, this.onSocket.bind(this))
|
|
50
|
+
|
|
51
|
+
this.server
|
|
52
|
+
.on('listening', () => this.dispatchEvent(new CustomEvent('listening')))
|
|
53
|
+
.on('error', err => this.dispatchEvent(new CustomEvent<Error>('error', { detail: err })))
|
|
54
|
+
.on('close', () => this.dispatchEvent(new CustomEvent('close')))
|
|
55
|
+
}
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
private onSocket (socket: net.Socket) {
|
|
54
58
|
// Avoid uncaught errors caused by unstable connections
|
|
55
59
|
socket.on('error', err => {
|
|
56
60
|
log('socket error', err)
|
|
@@ -59,9 +63,9 @@ export function createListener (context: Context) {
|
|
|
59
63
|
let maConn: MultiaddrConnection
|
|
60
64
|
try {
|
|
61
65
|
maConn = toMultiaddrConnection(socket, {
|
|
62
|
-
listeningAddr,
|
|
63
|
-
socketInactivityTimeout,
|
|
64
|
-
socketCloseTimeout
|
|
66
|
+
listeningAddr: this.status.started ? this.status.listeningAddr : undefined,
|
|
67
|
+
socketInactivityTimeout: this.context.socketInactivityTimeout,
|
|
68
|
+
socketCloseTimeout: this.context.socketCloseTimeout
|
|
65
69
|
})
|
|
66
70
|
} catch (err) {
|
|
67
71
|
log.error('inbound connection failed', err)
|
|
@@ -70,16 +74,20 @@ export function createListener (context: Context) {
|
|
|
70
74
|
|
|
71
75
|
log('new inbound connection %s', maConn.remoteAddr)
|
|
72
76
|
try {
|
|
73
|
-
upgrader.upgradeInbound(maConn)
|
|
77
|
+
this.context.upgrader.upgradeInbound(maConn)
|
|
74
78
|
.then((conn) => {
|
|
75
79
|
log('inbound connection %s upgraded', maConn.remoteAddr)
|
|
76
|
-
|
|
80
|
+
this.connections.add(maConn)
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
socket.once('close', () => {
|
|
83
|
+
this.connections.delete(maConn)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
if (this.context.handler != null) {
|
|
87
|
+
this.context.handler(conn)
|
|
80
88
|
}
|
|
81
89
|
|
|
82
|
-
|
|
90
|
+
this.dispatchEvent(new CustomEvent<Connection>('connection', { detail: conn }))
|
|
83
91
|
})
|
|
84
92
|
.catch(async err => {
|
|
85
93
|
log.error('inbound connection failed', err)
|
|
@@ -97,85 +105,69 @@ export function createListener (context: Context) {
|
|
|
97
105
|
log.error('closing inbound connection failed', err)
|
|
98
106
|
})
|
|
99
107
|
}
|
|
100
|
-
}
|
|
101
|
-
// Keep track of open connections to destroy in case of timeout
|
|
102
|
-
{ __connections: [] })
|
|
108
|
+
}
|
|
103
109
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
getAddrs () {
|
|
111
|
+
if (!this.status.started) {
|
|
112
|
+
return []
|
|
113
|
+
}
|
|
108
114
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
115
|
+
let addrs: Multiaddr[] = []
|
|
116
|
+
const address = this.server.address()
|
|
117
|
+
const { listeningAddr, peerId } = this.status
|
|
112
118
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
119
|
+
if (address == null) {
|
|
120
|
+
return []
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (typeof address === 'string') {
|
|
124
|
+
addrs = [listeningAddr]
|
|
125
|
+
} else {
|
|
126
|
+
try {
|
|
127
|
+
// Because TCP will only return the IPv6 version
|
|
128
|
+
// we need to capture from the passed multiaddr
|
|
129
|
+
if (listeningAddr.toString().startsWith('/ip4')) {
|
|
130
|
+
addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port))
|
|
131
|
+
} else if (address.family === 'IPv6') {
|
|
132
|
+
addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port))
|
|
126
133
|
}
|
|
134
|
+
} catch (err) {
|
|
135
|
+
log.error('could not turn %s:%s into multiaddr', address.address, address.port, err)
|
|
127
136
|
}
|
|
137
|
+
}
|
|
128
138
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
listen: async (ma: Multiaddr) => {
|
|
132
|
-
listeningAddr = ma
|
|
133
|
-
peerId = ma.getPeerId()
|
|
134
|
-
|
|
135
|
-
if (peerId == null) {
|
|
136
|
-
listeningAddr = ma.decapsulateCode(CODE_P2P)
|
|
137
|
-
}
|
|
139
|
+
return addrs.map(ma => peerId != null ? ma.encapsulate(`/p2p/${peerId}`) : ma)
|
|
140
|
+
}
|
|
138
141
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (err != null) {
|
|
143
|
-
return reject(err)
|
|
144
|
-
}
|
|
145
|
-
log('Listening on %s', server.address())
|
|
146
|
-
resolve()
|
|
147
|
-
})
|
|
148
|
-
})
|
|
149
|
-
},
|
|
150
|
-
close: async () => {
|
|
151
|
-
if (!server.listening) {
|
|
152
|
-
return
|
|
153
|
-
}
|
|
142
|
+
async listen (ma: Multiaddr) {
|
|
143
|
+
const peerId = ma.getPeerId()
|
|
144
|
+
const listeningAddr = peerId == null ? ma.decapsulateCode(CODE_P2P) : ma
|
|
154
145
|
|
|
155
|
-
|
|
156
|
-
server.__connections.map(async maConn => await attemptClose(maConn))
|
|
157
|
-
)
|
|
146
|
+
this.status = { started: true, listeningAddr, peerId }
|
|
158
147
|
|
|
159
|
-
|
|
160
|
-
|
|
148
|
+
return await new Promise<void>((resolve, reject) => {
|
|
149
|
+
const options = multiaddrToNetConfig(listeningAddr)
|
|
150
|
+
this.server.listen(options, (err?: any) => {
|
|
151
|
+
if (err != null) {
|
|
152
|
+
return reject(err)
|
|
153
|
+
}
|
|
154
|
+
log('Listening on %s', this.server.address())
|
|
155
|
+
resolve()
|
|
161
156
|
})
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
server
|
|
166
|
-
.on('listening', () => listener.dispatchEvent(new CustomEvent('listening')))
|
|
167
|
-
.on('error', err => listener.dispatchEvent(new CustomEvent<Error>('error', { detail: err })))
|
|
168
|
-
.on('close', () => listener.dispatchEvent(new CustomEvent('close')))
|
|
157
|
+
})
|
|
158
|
+
}
|
|
169
159
|
|
|
170
|
-
|
|
171
|
-
|
|
160
|
+
async close () {
|
|
161
|
+
if (!this.server.listening) {
|
|
162
|
+
return
|
|
163
|
+
}
|
|
172
164
|
|
|
173
|
-
|
|
174
|
-
|
|
165
|
+
await Promise.all(
|
|
166
|
+
Array.from(this.connections.values()).map(async maConn => await attemptClose(maConn))
|
|
167
|
+
)
|
|
175
168
|
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
await new Promise<void>((resolve, reject) => {
|
|
170
|
+
this.server.close(err => (err != null) ? reject(err) : resolve())
|
|
171
|
+
})
|
|
178
172
|
}
|
|
179
|
-
|
|
180
|
-
socket.once('close', untrackConn)
|
|
181
173
|
}
|