@libp2p/tcp 1.0.3 → 1.0.4
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 +17 -2
- package/dist/src/listener.d.ts.map +1 -1
- package/dist/src/listener.js +119 -104
- package/dist/src/listener.js.map +1 -1
- package/dist/src/socket-to-conn.js +2 -2
- package/dist/src/socket-to-conn.js.map +1 -1
- package/package.json +6 -8
- package/src/index.ts +4 -4
- package/src/listener.ts +136 -118
- package/src/socket-to-conn.ts +2 -2
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import net from 'net';
|
|
3
|
-
import type { Transport, Upgrader, ListenerOptions } from '@libp2p/interfaces/transport';
|
|
3
|
+
import type { Transport, Upgrader, ListenerOptions, Listener } 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):
|
|
28
|
+
createListener(options?: ListenerOptions): Listener;
|
|
29
29
|
/**
|
|
30
30
|
* Takes a list of `Multiaddr`s and returns only valid TCP addresses
|
|
31
31
|
*/
|
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,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;
|
|
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"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import net from 'net';
|
|
2
2
|
import * as mafmt from '@multiformats/mafmt';
|
|
3
3
|
import errCode from 'err-code';
|
|
4
|
-
import
|
|
4
|
+
import { logger } from '@libp2p/logger';
|
|
5
5
|
import { toMultiaddrConnection } from './socket-to-conn.js';
|
|
6
6
|
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
|
-
const log =
|
|
10
|
+
const log = logger('libp2p:tcp');
|
|
11
11
|
export class TCP {
|
|
12
12
|
constructor(options) {
|
|
13
13
|
const { upgrader } = options;
|
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,
|
|
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,12 +1,27 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import net from 'net';
|
|
3
|
+
import { EventEmitter } from '@libp2p/interfaces';
|
|
1
4
|
import type { Connection } from '@libp2p/interfaces/connection';
|
|
2
|
-
import type { Upgrader, Listener } from '@libp2p/interfaces/transport';
|
|
5
|
+
import type { MultiaddrConnection, Upgrader, Listener, ListenerEvents, ConnectionHandler } from '@libp2p/interfaces/transport';
|
|
6
|
+
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
3
7
|
interface Context {
|
|
4
8
|
handler?: (conn: Connection) => void;
|
|
5
9
|
upgrader: Upgrader;
|
|
6
10
|
}
|
|
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
|
+
}
|
|
7
22
|
/**
|
|
8
23
|
* Create listener
|
|
9
24
|
*/
|
|
10
|
-
export declare function createListener(context: Context):
|
|
25
|
+
export declare function createListener(context: Context): TCPListener;
|
|
11
26
|
export {};
|
|
12
27
|
//# 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":";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"}
|
package/dist/src/listener.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import net from 'net';
|
|
2
|
-
import {
|
|
3
|
-
import debug from 'debug';
|
|
2
|
+
import { logger } from '@libp2p/logger';
|
|
4
3
|
import { toMultiaddrConnection } from './socket-to-conn.js';
|
|
5
4
|
import { CODE_P2P } from './constants.js';
|
|
6
5
|
import { getMultiaddrs, multiaddrToNetConfig } from './utils.js';
|
|
7
|
-
|
|
6
|
+
import { EventEmitter, CustomEvent } from '@libp2p/interfaces';
|
|
7
|
+
const log = logger('libp2p:tcp:listener');
|
|
8
8
|
/**
|
|
9
9
|
* Attempts to close the given maConn. If a failure occurs, it will be logged
|
|
10
10
|
*/
|
|
@@ -16,115 +16,130 @@ 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
|
-
// 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.emit('connection', 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);
|
|
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);
|
|
63
27
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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');
|
|
74
|
-
}
|
|
75
|
-
if (typeof address === 'string') {
|
|
76
|
-
throw new Error('Incorrect server address type');
|
|
77
|
-
}
|
|
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));
|
|
28
|
+
let maConn;
|
|
29
|
+
try {
|
|
30
|
+
maConn = toMultiaddrConnection(socket, { listeningAddr: this.listeningAddr });
|
|
82
31
|
}
|
|
83
|
-
|
|
84
|
-
|
|
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);
|
|
32
|
+
catch (err) {
|
|
33
|
+
log.error('inbound connection failed', err);
|
|
34
|
+
return;
|
|
93
35
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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);
|
|
99
44
|
}
|
|
100
|
-
|
|
101
|
-
|
|
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
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
log.error('inbound connection failed', err);
|
|
59
|
+
attemptClose(maConn)
|
|
60
|
+
.catch(err => {
|
|
61
|
+
log.error('closing inbound connection failed', err);
|
|
102
62
|
});
|
|
103
|
-
});
|
|
104
|
-
},
|
|
105
|
-
close: async () => {
|
|
106
|
-
if (!server.listening) {
|
|
107
|
-
return;
|
|
108
63
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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();
|
|
114
116
|
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async close() {
|
|
120
|
+
if (!this.server.listening) {
|
|
121
|
+
return;
|
|
115
122
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
+
}
|
|
122
137
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
};
|
|
128
|
-
|
|
138
|
+
/**
|
|
139
|
+
* Create listener
|
|
140
|
+
*/
|
|
141
|
+
export function createListener(context) {
|
|
142
|
+
const { handler, upgrader } = context;
|
|
143
|
+
return new TCPListener(upgrader, handler);
|
|
129
144
|
}
|
|
130
145
|
//# 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,
|
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../src/listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { abortableSource } from 'abortable-iterator';
|
|
2
|
-
import
|
|
2
|
+
import { logger } from '@libp2p/logger';
|
|
3
3
|
// @ts-expect-error no types
|
|
4
4
|
import toIterable from 'stream-to-it';
|
|
5
5
|
import { ipPortToMultiaddr as toMultiaddr } from '@libp2p/utils/ip-port-to-multiaddr';
|
|
6
6
|
import { CLOSE_TIMEOUT } from './constants.js';
|
|
7
|
-
const log =
|
|
7
|
+
const log = logger('libp2p:tcp:socket');
|
|
8
8
|
/**
|
|
9
9
|
* Convert a socket into a MultiaddrConnection
|
|
10
10
|
* https://github.com/libp2p/interface-transport#multiaddrconnection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-to-conn.js","sourceRoot":"","sources":["../../src/socket-to-conn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"socket-to-conn.js","sourceRoot":"","sources":["../../src/socket-to-conn.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.
|
|
3
|
+
"version": "1.0.4",
|
|
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",
|
|
@@ -129,25 +129,23 @@
|
|
|
129
129
|
"dep-check": "aegir dep-check dist/src/**/*.js dist/test/**/*.js",
|
|
130
130
|
"build": "tsc",
|
|
131
131
|
"pretest": "npm run build",
|
|
132
|
-
"test": "aegir test -f ./dist/test",
|
|
132
|
+
"test": "aegir test -f ./dist/test/*.js -f ./dist/test/**/*.js",
|
|
133
133
|
"test:node": "npm run test -- -t node --cov",
|
|
134
134
|
"test:electron-main": "npm run test -- -t electron-main",
|
|
135
135
|
"release": "semantic-release"
|
|
136
136
|
},
|
|
137
137
|
"dependencies": {
|
|
138
|
-
"@libp2p/
|
|
138
|
+
"@libp2p/logger": "^1.0.2",
|
|
139
|
+
"@libp2p/utils": "^1.0.6",
|
|
139
140
|
"@multiformats/mafmt": "^11.0.0",
|
|
140
141
|
"@multiformats/multiaddr": "^10.1.1",
|
|
141
142
|
"abortable-iterator": "^4.0.2",
|
|
142
|
-
"debug": "^4.3.1",
|
|
143
143
|
"err-code": "^3.0.1",
|
|
144
144
|
"stream-to-it": "^0.2.2"
|
|
145
145
|
},
|
|
146
146
|
"devDependencies": {
|
|
147
|
-
"@libp2p/interface-compliance-tests": "^1.
|
|
148
|
-
"@libp2p/interfaces": "^1.
|
|
149
|
-
"@types/debug": "^4.1.5",
|
|
150
|
-
"@types/mocha": "^9.0.0",
|
|
147
|
+
"@libp2p/interface-compliance-tests": "^1.1.2",
|
|
148
|
+
"@libp2p/interfaces": "^1.3.2",
|
|
151
149
|
"aegir": "^36.1.3",
|
|
152
150
|
"it-pipe": "^2.0.3",
|
|
153
151
|
"sinon": "^13.0.0",
|
package/src/index.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import net from 'net'
|
|
2
2
|
import * as mafmt from '@multiformats/mafmt'
|
|
3
3
|
import errCode from 'err-code'
|
|
4
|
-
import
|
|
4
|
+
import { logger } from '@libp2p/logger'
|
|
5
5
|
import { toMultiaddrConnection } from './socket-to-conn.js'
|
|
6
6
|
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 } from '@libp2p/interfaces/transport'
|
|
10
|
+
import type { Transport, Upgrader, ListenerOptions, Listener } from '@libp2p/interfaces/transport'
|
|
11
11
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
12
12
|
import type { Socket } from 'net'
|
|
13
13
|
|
|
14
|
-
const log =
|
|
14
|
+
const log = logger('libp2p:tcp')
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* @typedef {import('multiaddr').Multiaddr} Multiaddr
|
|
@@ -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 = {}) {
|
|
128
|
+
createListener (options: ListenerOptions = {}): Listener {
|
|
129
129
|
return createListener({ upgrader: this._upgrader, ...options })
|
|
130
130
|
}
|
|
131
131
|
|
package/src/listener.ts
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
import net from 'net'
|
|
2
|
-
import {
|
|
3
|
-
import debug from 'debug'
|
|
2
|
+
import { logger } from '@libp2p/logger'
|
|
4
3
|
import { toMultiaddrConnection } from './socket-to-conn.js'
|
|
5
4
|
import { CODE_P2P } from './constants.js'
|
|
6
5
|
import {
|
|
7
6
|
getMultiaddrs,
|
|
8
7
|
multiaddrToNetConfig
|
|
9
8
|
} from './utils.js'
|
|
9
|
+
import { EventEmitter, CustomEvent } from '@libp2p/interfaces'
|
|
10
10
|
import type { Connection } from '@libp2p/interfaces/connection'
|
|
11
|
-
import type { MultiaddrConnection, Upgrader, Listener } from '@libp2p/interfaces/transport'
|
|
11
|
+
import type { MultiaddrConnection, Upgrader, Listener, ListenerEvents, ConnectionHandler } from '@libp2p/interfaces/transport'
|
|
12
12
|
import type { Server } from 'net'
|
|
13
13
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
14
14
|
|
|
15
|
-
const log =
|
|
16
|
-
debug('libp2p:tcp:listener'),
|
|
17
|
-
{ error: debug('libp2p:tcp:listener:error') })
|
|
18
|
-
|
|
19
|
-
interface ServerWithMultiaddrConnections extends Server {
|
|
20
|
-
__connections: MultiaddrConnection[]
|
|
21
|
-
}
|
|
15
|
+
const log = logger('libp2p:tcp:listener')
|
|
22
16
|
|
|
23
17
|
/**
|
|
24
18
|
* Attempts to close the given maConn. If a failure occurs, it will be logged
|
|
@@ -36,135 +30,159 @@ interface Context {
|
|
|
36
30
|
upgrader: Upgrader
|
|
37
31
|
}
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
+
})
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
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
|
+
}
|
|
49
57
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
+
}))
|
|
54
95
|
})
|
|
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
|
+
}
|
|
55
103
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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')
|
|
62
110
|
}
|
|
63
111
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
upgrader.upgradeInbound(maConn)
|
|
67
|
-
.then((conn) => {
|
|
68
|
-
log('inbound connection %s upgraded', maConn.remoteAddr)
|
|
69
|
-
trackConn(server, maConn, socket)
|
|
70
|
-
|
|
71
|
-
if (handler != null) {
|
|
72
|
-
handler(conn)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
listener.emit('connection', conn)
|
|
76
|
-
})
|
|
77
|
-
.catch(async err => {
|
|
78
|
-
log.error('inbound connection failed', err)
|
|
79
|
-
|
|
80
|
-
await attemptClose(maConn)
|
|
81
|
-
})
|
|
82
|
-
.catch(err => {
|
|
83
|
-
log.error('closing inbound connection failed', err)
|
|
84
|
-
})
|
|
85
|
-
} catch (err) {
|
|
86
|
-
log.error('inbound connection failed', err)
|
|
87
|
-
|
|
88
|
-
attemptClose(maConn)
|
|
89
|
-
.catch(err => {
|
|
90
|
-
log.error('closing inbound connection failed', err)
|
|
91
|
-
})
|
|
112
|
+
if (typeof address === 'string') {
|
|
113
|
+
throw new Error('Incorrect server address type')
|
|
92
114
|
}
|
|
93
|
-
}),
|
|
94
|
-
// Keep track of open connections to destroy in case of timeout
|
|
95
|
-
{ __connections: [] })
|
|
96
115
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const address = server.address()
|
|
116
|
+
if (this.listeningAddr == null) {
|
|
117
|
+
throw new Error('Listener is not ready yet')
|
|
118
|
+
}
|
|
101
119
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
+
}
|
|
105
127
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
128
|
+
return addrs.map(ma => this.peerId != null ? ma.encapsulate(`/p2p/${this.peerId}`) : ma)
|
|
129
|
+
}
|
|
109
130
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (listeningAddr.toString().startsWith('/ip4')) {
|
|
113
|
-
addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port))
|
|
114
|
-
} else if (address.family === 'IPv6') {
|
|
115
|
-
addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port))
|
|
116
|
-
}
|
|
131
|
+
async listen (ma: Multiaddr) {
|
|
132
|
+
const peerId = ma.getPeerId()
|
|
117
133
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
134
|
+
if (peerId == null) {
|
|
135
|
+
ma = ma.decapsulateCode(CODE_P2P)
|
|
136
|
+
} else {
|
|
137
|
+
this.peerId = peerId
|
|
138
|
+
}
|
|
123
139
|
|
|
124
|
-
|
|
125
|
-
listeningAddr = ma.decapsulateCode(CODE_P2P)
|
|
126
|
-
}
|
|
140
|
+
this.listeningAddr = ma
|
|
127
141
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
})
|
|
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()
|
|
137
150
|
})
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (!server.listening) {
|
|
141
|
-
return
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
await Promise.all([
|
|
145
|
-
server.__connections.map(async maConn => await attemptClose(maConn))
|
|
146
|
-
])
|
|
151
|
+
})
|
|
152
|
+
}
|
|
147
153
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
154
|
+
async close () {
|
|
155
|
+
if (!this.server.listening) {
|
|
156
|
+
return
|
|
151
157
|
}
|
|
152
|
-
})
|
|
153
158
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
.on('close', () => listener.emit('close'))
|
|
159
|
+
await Promise.all([
|
|
160
|
+
this.connections.map(async maConn => await attemptClose(maConn))
|
|
161
|
+
])
|
|
158
162
|
|
|
159
|
-
|
|
160
|
-
|
|
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)
|
|
161
170
|
|
|
162
|
-
|
|
163
|
-
|
|
171
|
+
const untrackConn = () => {
|
|
172
|
+
this.connections = this.connections.filter(c => c !== maConn)
|
|
173
|
+
}
|
|
164
174
|
|
|
165
|
-
|
|
166
|
-
server.__connections = server.__connections.filter(c => c !== maConn)
|
|
175
|
+
socket.once('close', untrackConn)
|
|
167
176
|
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Create listener
|
|
181
|
+
*/
|
|
182
|
+
export function createListener (context: Context) {
|
|
183
|
+
const {
|
|
184
|
+
handler, upgrader
|
|
185
|
+
} = context
|
|
168
186
|
|
|
169
|
-
|
|
187
|
+
return new TCPListener(upgrader, handler)
|
|
170
188
|
}
|
package/src/socket-to-conn.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { abortableSource } from 'abortable-iterator'
|
|
2
|
-
import
|
|
2
|
+
import { logger } from '@libp2p/logger'
|
|
3
3
|
// @ts-expect-error no types
|
|
4
4
|
import toIterable from 'stream-to-it'
|
|
5
5
|
import { ipPortToMultiaddr as toMultiaddr } from '@libp2p/utils/ip-port-to-multiaddr'
|
|
@@ -8,7 +8,7 @@ import type { Socket } from 'net'
|
|
|
8
8
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
9
9
|
import type { MultiaddrConnection } from '@libp2p/interfaces/transport'
|
|
10
10
|
|
|
11
|
-
const log =
|
|
11
|
+
const log = logger('libp2p:tcp:socket')
|
|
12
12
|
|
|
13
13
|
interface ToConnectionOptions {
|
|
14
14
|
listeningAddr?: Multiaddr
|