@libp2p/tcp 5.0.1 → 6.0.0
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 +9 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/listener.d.ts +8 -0
- package/dist/src/listener.d.ts.map +1 -1
- package/dist/src/listener.js +58 -8
- package/dist/src/listener.js.map +1 -1
- package/dist/src/socket-to-conn.d.ts +3 -1
- package/dist/src/socket-to-conn.d.ts.map +1 -1
- package/dist/src/socket-to-conn.js +4 -1
- package/dist/src/socket-to-conn.js.map +1 -1
- package/package.json +2 -1
- package/src/index.ts +38 -6
- package/src/listener.ts +71 -9
- package/src/socket-to-conn.ts +7 -2
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CreateListenerOptions, DialOptions, Transport } from '@libp2p/interface-transport';
|
|
2
2
|
import type { AbortOptions } from '@multiformats/multiaddr';
|
|
3
|
+
import type { CounterGroup, Metrics } from '@libp2p/interface-metrics';
|
|
3
4
|
export interface TCPOptions {
|
|
4
5
|
/**
|
|
5
6
|
* An optional number in ms that is used as an inactivity timeout after which the socket will be closed
|
|
@@ -32,5 +33,12 @@ export interface TCPDialOptions extends DialOptions, TCPSocketOptions {
|
|
|
32
33
|
}
|
|
33
34
|
export interface TCPCreateListenerOptions extends CreateListenerOptions, TCPSocketOptions {
|
|
34
35
|
}
|
|
35
|
-
export
|
|
36
|
+
export interface TCPComponents {
|
|
37
|
+
metrics?: Metrics;
|
|
38
|
+
}
|
|
39
|
+
export interface TCPMetrics {
|
|
40
|
+
dialerEvents: CounterGroup;
|
|
41
|
+
listenerEvents: CounterGroup;
|
|
42
|
+
}
|
|
43
|
+
export declare function tcp(init?: TCPOptions): (components?: TCPComponents) => Transport;
|
|
36
44
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAoB,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC7G,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAoB,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC7G,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,yBAAyB,CAAA;AAGtE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAItE,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;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;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,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,YAAY,CAAA;IAC1B,cAAc,EAAE,YAAY,CAAA;CAC7B;AA+JD,wBAAgB,GAAG,CAAE,IAAI,GAAE,UAAe,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,KAAK,SAAS,CAIrF"}
|
package/dist/src/index.js
CHANGED
|
@@ -10,8 +10,21 @@ import { CODE_CIRCUIT, CODE_P2P, CODE_UNIX } from './constants.js';
|
|
|
10
10
|
import { symbol } from '@libp2p/interface-transport';
|
|
11
11
|
const log = logger('libp2p:tcp');
|
|
12
12
|
class TCP {
|
|
13
|
-
constructor(options = {}) {
|
|
13
|
+
constructor(components, options = {}) {
|
|
14
14
|
this.opts = options;
|
|
15
|
+
this.components = components;
|
|
16
|
+
if (components.metrics != null) {
|
|
17
|
+
this.metrics = {
|
|
18
|
+
dialerEvents: components.metrics.registerCounterGroup('libp2p_tcp_dialer_errors_total', {
|
|
19
|
+
label: 'event',
|
|
20
|
+
help: 'Total count of TCP dialer errors by error type'
|
|
21
|
+
}),
|
|
22
|
+
listenerEvents: components.metrics.registerCounterGroup('libp2p_tcp_listener_errors_total', {
|
|
23
|
+
label: 'event',
|
|
24
|
+
help: 'Total count of TCP listener errors by error type'
|
|
25
|
+
})
|
|
26
|
+
};
|
|
27
|
+
}
|
|
15
28
|
}
|
|
16
29
|
get [symbol]() {
|
|
17
30
|
return true;
|
|
@@ -30,7 +43,8 @@ class TCP {
|
|
|
30
43
|
remoteAddr: ma,
|
|
31
44
|
signal: options.signal,
|
|
32
45
|
socketInactivityTimeout: this.opts.outboundSocketInactivityTimeout,
|
|
33
|
-
socketCloseTimeout: this.opts.socketCloseTimeout
|
|
46
|
+
socketCloseTimeout: this.opts.socketCloseTimeout,
|
|
47
|
+
metrics: this.metrics?.dialerEvents
|
|
34
48
|
});
|
|
35
49
|
log('new outbound connection %s', maConn.remoteAddr);
|
|
36
50
|
const conn = await options.upgrader.upgradeOutbound(maConn);
|
|
@@ -49,20 +63,24 @@ class TCP {
|
|
|
49
63
|
const rawSocket = net.connect(cOpts);
|
|
50
64
|
const onError = (err) => {
|
|
51
65
|
err.message = `connection error ${cOptsStr}: ${err.message}`;
|
|
66
|
+
this.metrics?.dialerEvents.increment({ error: true });
|
|
52
67
|
done(err);
|
|
53
68
|
};
|
|
54
69
|
const onTimeout = () => {
|
|
55
70
|
log('connection timeout %s', cOptsStr);
|
|
71
|
+
this.metrics?.dialerEvents.increment({ timeout: true });
|
|
56
72
|
const err = errCode(new Error(`connection timeout after ${Date.now() - start}ms`), 'ERR_CONNECT_TIMEOUT');
|
|
57
73
|
// Note: this will result in onError() being called
|
|
58
74
|
rawSocket.emit('error', err);
|
|
59
75
|
};
|
|
60
76
|
const onConnect = () => {
|
|
61
77
|
log('connection opened %j', cOpts);
|
|
78
|
+
this.metrics?.dialerEvents.increment({ connect: true });
|
|
62
79
|
done();
|
|
63
80
|
};
|
|
64
81
|
const onAbort = () => {
|
|
65
82
|
log('connection aborted %j', cOpts);
|
|
83
|
+
this.metrics?.dialerEvents.increment({ abort: true });
|
|
66
84
|
rawSocket.destroy();
|
|
67
85
|
done(new AbortError());
|
|
68
86
|
};
|
|
@@ -96,7 +114,8 @@ class TCP {
|
|
|
96
114
|
...options,
|
|
97
115
|
maxConnections: this.opts.maxConnections,
|
|
98
116
|
socketInactivityTimeout: this.opts.inboundSocketInactivityTimeout,
|
|
99
|
-
socketCloseTimeout: this.opts.socketCloseTimeout
|
|
117
|
+
socketCloseTimeout: this.opts.socketCloseTimeout,
|
|
118
|
+
metrics: this.components.metrics
|
|
100
119
|
});
|
|
101
120
|
}
|
|
102
121
|
/**
|
|
@@ -116,8 +135,8 @@ class TCP {
|
|
|
116
135
|
}
|
|
117
136
|
}
|
|
118
137
|
export function tcp(init = {}) {
|
|
119
|
-
return () => {
|
|
120
|
-
return new TCP(init);
|
|
138
|
+
return (components = {}) => {
|
|
139
|
+
return new TCP(components, init);
|
|
121
140
|
};
|
|
122
141
|
}
|
|
123
142
|
//# sourceMappingURL=index.js.map
|
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,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAgD,MAAM,EAAa,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/listener.d.ts
CHANGED
|
@@ -3,12 +3,19 @@ import type { Connection } from '@libp2p/interface-connection';
|
|
|
3
3
|
import type { Upgrader, Listener, ListenerEvents } from '@libp2p/interface-transport';
|
|
4
4
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
5
5
|
import type { TCPCreateListenerOptions } from './index.js';
|
|
6
|
+
import type { CounterGroup, Metric, Metrics } from '@libp2p/interface-metrics';
|
|
6
7
|
interface Context extends TCPCreateListenerOptions {
|
|
7
8
|
handler?: (conn: Connection) => void;
|
|
8
9
|
upgrader: Upgrader;
|
|
9
10
|
socketInactivityTimeout?: number;
|
|
10
11
|
socketCloseTimeout?: number;
|
|
11
12
|
maxConnections?: number;
|
|
13
|
+
metrics?: Metrics;
|
|
14
|
+
}
|
|
15
|
+
export interface TCPListenerMetrics {
|
|
16
|
+
status: Metric;
|
|
17
|
+
errors: CounterGroup;
|
|
18
|
+
events: CounterGroup;
|
|
12
19
|
}
|
|
13
20
|
export declare class TCPListener extends EventEmitter<ListenerEvents> implements Listener {
|
|
14
21
|
private readonly context;
|
|
@@ -16,6 +23,7 @@ export declare class TCPListener extends EventEmitter<ListenerEvents> implements
|
|
|
16
23
|
/** Keep track of open connections to destroy in case of timeout */
|
|
17
24
|
private readonly connections;
|
|
18
25
|
private status;
|
|
26
|
+
private metrics?;
|
|
19
27
|
constructor(context: Context);
|
|
20
28
|
private onSocket;
|
|
21
29
|
getAddrs(): Multiaddr[];
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAe9E,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;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAKD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,YAAY,CAAA;CACrB;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;IAC7D,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAoB;gBAEN,OAAO,EAAE,OAAO;IAkE9C,OAAO,CAAC,QAAQ;IA0DhB,QAAQ;IAgCF,MAAM,CAAE,EAAE,EAAE,SAAS;IAkBrB,KAAK;CAaZ"}
|
package/dist/src/listener.js
CHANGED
|
@@ -16,6 +16,8 @@ async function attemptClose(maConn) {
|
|
|
16
16
|
log.error('an error occurred closing the connection', err);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
const SERVER_STATUS_UP = 1;
|
|
20
|
+
const SERVER_STATUS_DOWN = 0;
|
|
19
21
|
export class TCPListener extends EventEmitter {
|
|
20
22
|
constructor(context) {
|
|
21
23
|
super();
|
|
@@ -32,25 +34,71 @@ export class TCPListener extends EventEmitter {
|
|
|
32
34
|
this.server.maxConnections = context.maxConnections;
|
|
33
35
|
}
|
|
34
36
|
this.server
|
|
35
|
-
.on('listening', () =>
|
|
36
|
-
.
|
|
37
|
-
|
|
37
|
+
.on('listening', () => {
|
|
38
|
+
if (context.metrics != null) {
|
|
39
|
+
// we are listening, register metrics for our port
|
|
40
|
+
const address = this.server.address();
|
|
41
|
+
let addr;
|
|
42
|
+
if (address == null) {
|
|
43
|
+
addr = 'unknown';
|
|
44
|
+
}
|
|
45
|
+
else if (typeof address === 'string') {
|
|
46
|
+
// unix socket
|
|
47
|
+
addr = address;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
addr = `${address.address}:${address.port}`;
|
|
51
|
+
}
|
|
52
|
+
context.metrics?.registerMetric(`libp2p_tcp_connections_${addr}_count`, {
|
|
53
|
+
help: 'Current active connections in TCP listener',
|
|
54
|
+
calculate: () => {
|
|
55
|
+
return this.connections.size;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
this.metrics = {
|
|
59
|
+
status: context.metrics.registerMetric(`libp2p_tcp_${addr}_server_status`, {
|
|
60
|
+
help: 'Current status of the TCP server'
|
|
61
|
+
}),
|
|
62
|
+
errors: context.metrics.registerCounterGroup(`libp2p_tcp_${addr}_server_errors_total`, {
|
|
63
|
+
label: 'error',
|
|
64
|
+
help: 'Total count of TCP listener errors by error type'
|
|
65
|
+
}),
|
|
66
|
+
events: context.metrics.registerCounterGroup(`libp2p_tcp_$${addr}_socket_events`, {
|
|
67
|
+
label: 'event',
|
|
68
|
+
help: 'Total count of TCP socket events by event'
|
|
69
|
+
})
|
|
70
|
+
};
|
|
71
|
+
this.metrics?.status.update(SERVER_STATUS_UP);
|
|
72
|
+
}
|
|
73
|
+
this.dispatchEvent(new CustomEvent('listening'));
|
|
74
|
+
})
|
|
75
|
+
.on('error', err => {
|
|
76
|
+
this.metrics?.errors.increment({ listen_error: true });
|
|
77
|
+
this.dispatchEvent(new CustomEvent('error', { detail: err }));
|
|
78
|
+
})
|
|
79
|
+
.on('close', () => {
|
|
80
|
+
this.metrics?.status.update(SERVER_STATUS_DOWN);
|
|
81
|
+
this.dispatchEvent(new CustomEvent('close'));
|
|
82
|
+
});
|
|
38
83
|
}
|
|
39
84
|
onSocket(socket) {
|
|
40
85
|
// Avoid uncaught errors caused by unstable connections
|
|
41
86
|
socket.on('error', err => {
|
|
42
87
|
log('socket error', err);
|
|
88
|
+
this.metrics?.events.increment({ error: true });
|
|
43
89
|
});
|
|
44
90
|
let maConn;
|
|
45
91
|
try {
|
|
46
92
|
maConn = toMultiaddrConnection(socket, {
|
|
47
93
|
listeningAddr: this.status.started ? this.status.listeningAddr : undefined,
|
|
48
94
|
socketInactivityTimeout: this.context.socketInactivityTimeout,
|
|
49
|
-
socketCloseTimeout: this.context.socketCloseTimeout
|
|
95
|
+
socketCloseTimeout: this.context.socketCloseTimeout,
|
|
96
|
+
metrics: this.metrics?.events
|
|
50
97
|
});
|
|
51
98
|
}
|
|
52
99
|
catch (err) {
|
|
53
100
|
log.error('inbound connection failed', err);
|
|
101
|
+
this.metrics?.errors.increment({ inbound_to_connection: true });
|
|
54
102
|
return;
|
|
55
103
|
}
|
|
56
104
|
log('new inbound connection %s', maConn.remoteAddr);
|
|
@@ -69,6 +117,7 @@ export class TCPListener extends EventEmitter {
|
|
|
69
117
|
})
|
|
70
118
|
.catch(async (err) => {
|
|
71
119
|
log.error('inbound connection failed', err);
|
|
120
|
+
this.metrics?.errors.increment({ inbound_upgrade: true });
|
|
72
121
|
await attemptClose(maConn);
|
|
73
122
|
})
|
|
74
123
|
.catch(err => {
|
|
@@ -80,6 +129,7 @@ export class TCPListener extends EventEmitter {
|
|
|
80
129
|
attemptClose(maConn)
|
|
81
130
|
.catch(err => {
|
|
82
131
|
log.error('closing inbound connection failed', err);
|
|
132
|
+
this.metrics?.errors.increment({ inbound_closing_failed: true });
|
|
83
133
|
});
|
|
84
134
|
}
|
|
85
135
|
}
|
|
@@ -119,10 +169,10 @@ export class TCPListener extends EventEmitter {
|
|
|
119
169
|
this.status = { started: true, listeningAddr, peerId };
|
|
120
170
|
return await new Promise((resolve, reject) => {
|
|
121
171
|
const options = multiaddrToNetConfig(listeningAddr);
|
|
122
|
-
this.server.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
172
|
+
this.server.on('error', (err) => {
|
|
173
|
+
reject(err);
|
|
174
|
+
});
|
|
175
|
+
this.server.listen(options, () => {
|
|
126
176
|
log('Listening on %s', this.server.address());
|
|
127
177
|
resolve();
|
|
128
178
|
});
|
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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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Socket } from 'net';
|
|
2
2
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
3
3
|
import type { MultiaddrConnection } from '@libp2p/interface-connection';
|
|
4
|
+
import type { CounterGroup } from '@libp2p/interface-metrics';
|
|
4
5
|
interface ToConnectionOptions {
|
|
5
6
|
listeningAddr?: Multiaddr;
|
|
6
7
|
remoteAddr?: Multiaddr;
|
|
@@ -8,11 +9,12 @@ interface ToConnectionOptions {
|
|
|
8
9
|
signal?: AbortSignal;
|
|
9
10
|
socketInactivityTimeout?: number;
|
|
10
11
|
socketCloseTimeout?: number;
|
|
12
|
+
metrics?: CounterGroup;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Convert a socket into a MultiaddrConnection
|
|
14
16
|
* https://github.com/libp2p/interface-transport#multiaddrconnection
|
|
15
17
|
*/
|
|
16
|
-
export declare const toMultiaddrConnection: (socket: Socket, options
|
|
18
|
+
export declare const toMultiaddrConnection: (socket: Socket, options: ToConnectionOptions) => MultiaddrConnection;
|
|
17
19
|
export {};
|
|
18
20
|
//# sourceMappingURL=socket-to-conn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-to-conn.d.ts","sourceRoot":"","sources":["../../src/socket-to-conn.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"socket-to-conn.d.ts","sourceRoot":"","sources":["../../src/socket-to-conn.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAI7D,UAAU,mBAAmB;IAC3B,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,WAAY,MAAM,WAAW,mBAAmB,wBAqKjF,CAAA"}
|
|
@@ -12,7 +12,7 @@ const log = logger('libp2p:tcp:socket');
|
|
|
12
12
|
* https://github.com/libp2p/interface-transport#multiaddrconnection
|
|
13
13
|
*/
|
|
14
14
|
export const toMultiaddrConnection = (socket, options) => {
|
|
15
|
-
|
|
15
|
+
const metrics = options.metrics;
|
|
16
16
|
const inactivityTimeout = options.socketInactivityTimeout ?? SOCKET_TIMEOUT;
|
|
17
17
|
const closeTimeout = options.socketCloseTimeout ?? CLOSE_TIMEOUT;
|
|
18
18
|
// Check if we are connected on a unix path
|
|
@@ -41,6 +41,7 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
41
41
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#socketsettimeouttimeout-callback
|
|
42
42
|
socket.setTimeout(inactivityTimeout, () => {
|
|
43
43
|
log('%s socket read timeout', lOptsStr);
|
|
44
|
+
metrics?.increment({ timeout: true });
|
|
44
45
|
// only destroy with an error if the remote has not sent the FIN message
|
|
45
46
|
let err;
|
|
46
47
|
if (socket.readable) {
|
|
@@ -52,6 +53,7 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
52
53
|
});
|
|
53
54
|
socket.once('close', () => {
|
|
54
55
|
log('%s socket read timeout', lOptsStr);
|
|
56
|
+
metrics?.increment({ close: true });
|
|
55
57
|
// In instances where `close` was not explicitly called,
|
|
56
58
|
// such as an iterable stream ending, ensure we have set the close
|
|
57
59
|
// timeline
|
|
@@ -63,6 +65,7 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
63
65
|
// the remote sent a FIN packet which means no more data will be sent
|
|
64
66
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#event-end
|
|
65
67
|
log('socket ended', maConn.remoteAddr.toString());
|
|
68
|
+
metrics?.increment({ end: true });
|
|
66
69
|
});
|
|
67
70
|
const maConn = {
|
|
68
71
|
async sink(source) {
|
|
@@ -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,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,4BAA4B;AAC5B,OAAO,UAAU,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,iBAAiB,IAAI,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,OAAO,MAAM,UAAU,CAAA;
|
|
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": "
|
|
3
|
+
"version": "6.0.0",
|
|
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,6 +148,7 @@
|
|
|
148
148
|
"stream-to-it": "^0.2.2"
|
|
149
149
|
},
|
|
150
150
|
"devDependencies": {
|
|
151
|
+
"@libp2p/interface-metrics": "^4.0.0",
|
|
151
152
|
"@libp2p/interface-mocks": "^7.0.1",
|
|
152
153
|
"@libp2p/interface-transport-compliance-tests": "^3.0.0",
|
|
153
154
|
"aegir": "^37.5.3",
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { CreateListenerOptions, DialOptions, Listener, symbol, Transport } from
|
|
|
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'
|
|
14
|
+
import type { CounterGroup, Metrics } from '@libp2p/interface-metrics'
|
|
14
15
|
|
|
15
16
|
const log = logger('libp2p:tcp')
|
|
16
17
|
|
|
@@ -55,11 +56,36 @@ export interface TCPCreateListenerOptions extends CreateListenerOptions, TCPSock
|
|
|
55
56
|
|
|
56
57
|
}
|
|
57
58
|
|
|
59
|
+
export interface TCPComponents {
|
|
60
|
+
metrics?: Metrics
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface TCPMetrics {
|
|
64
|
+
dialerEvents: CounterGroup
|
|
65
|
+
listenerEvents: CounterGroup
|
|
66
|
+
}
|
|
67
|
+
|
|
58
68
|
class TCP implements Transport {
|
|
59
69
|
private readonly opts: TCPOptions
|
|
70
|
+
private readonly metrics?: TCPMetrics
|
|
71
|
+
private readonly components: TCPComponents
|
|
60
72
|
|
|
61
|
-
constructor (options: TCPOptions = {}) {
|
|
73
|
+
constructor (components: TCPComponents, options: TCPOptions = {}) {
|
|
62
74
|
this.opts = options
|
|
75
|
+
this.components = components
|
|
76
|
+
|
|
77
|
+
if (components.metrics != null) {
|
|
78
|
+
this.metrics = {
|
|
79
|
+
dialerEvents: components.metrics.registerCounterGroup('libp2p_tcp_dialer_errors_total', {
|
|
80
|
+
label: 'event',
|
|
81
|
+
help: 'Total count of TCP dialer errors by error type'
|
|
82
|
+
}),
|
|
83
|
+
listenerEvents: components.metrics.registerCounterGroup('libp2p_tcp_listener_errors_total', {
|
|
84
|
+
label: 'event',
|
|
85
|
+
help: 'Total count of TCP listener errors by error type'
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
}
|
|
63
89
|
}
|
|
64
90
|
|
|
65
91
|
get [symbol] (): true {
|
|
@@ -84,7 +110,8 @@ class TCP implements Transport {
|
|
|
84
110
|
remoteAddr: ma,
|
|
85
111
|
signal: options.signal,
|
|
86
112
|
socketInactivityTimeout: this.opts.outboundSocketInactivityTimeout,
|
|
87
|
-
socketCloseTimeout: this.opts.socketCloseTimeout
|
|
113
|
+
socketCloseTimeout: this.opts.socketCloseTimeout,
|
|
114
|
+
metrics: this.metrics?.dialerEvents
|
|
88
115
|
})
|
|
89
116
|
log('new outbound connection %s', maConn.remoteAddr)
|
|
90
117
|
const conn = await options.upgrader.upgradeOutbound(maConn)
|
|
@@ -107,12 +134,14 @@ class TCP implements Transport {
|
|
|
107
134
|
|
|
108
135
|
const onError = (err: Error) => {
|
|
109
136
|
err.message = `connection error ${cOptsStr}: ${err.message}`
|
|
137
|
+
this.metrics?.dialerEvents.increment({ error: true })
|
|
110
138
|
|
|
111
139
|
done(err)
|
|
112
140
|
}
|
|
113
141
|
|
|
114
142
|
const onTimeout = () => {
|
|
115
143
|
log('connection timeout %s', cOptsStr)
|
|
144
|
+
this.metrics?.dialerEvents.increment({ timeout: true })
|
|
116
145
|
|
|
117
146
|
const err = errCode(new Error(`connection timeout after ${Date.now() - start}ms`), 'ERR_CONNECT_TIMEOUT')
|
|
118
147
|
// Note: this will result in onError() being called
|
|
@@ -121,11 +150,13 @@ class TCP implements Transport {
|
|
|
121
150
|
|
|
122
151
|
const onConnect = () => {
|
|
123
152
|
log('connection opened %j', cOpts)
|
|
153
|
+
this.metrics?.dialerEvents.increment({ connect: true })
|
|
124
154
|
done()
|
|
125
155
|
}
|
|
126
156
|
|
|
127
157
|
const onAbort = () => {
|
|
128
158
|
log('connection aborted %j', cOpts)
|
|
159
|
+
this.metrics?.dialerEvents.increment({ abort: true })
|
|
129
160
|
rawSocket.destroy()
|
|
130
161
|
done(new AbortError())
|
|
131
162
|
}
|
|
@@ -166,7 +197,8 @@ class TCP implements Transport {
|
|
|
166
197
|
...options,
|
|
167
198
|
maxConnections: this.opts.maxConnections,
|
|
168
199
|
socketInactivityTimeout: this.opts.inboundSocketInactivityTimeout,
|
|
169
|
-
socketCloseTimeout: this.opts.socketCloseTimeout
|
|
200
|
+
socketCloseTimeout: this.opts.socketCloseTimeout,
|
|
201
|
+
metrics: this.components.metrics
|
|
170
202
|
})
|
|
171
203
|
}
|
|
172
204
|
|
|
@@ -190,8 +222,8 @@ class TCP implements Transport {
|
|
|
190
222
|
}
|
|
191
223
|
}
|
|
192
224
|
|
|
193
|
-
export function tcp (init: TCPOptions = {}): (components?:
|
|
194
|
-
return () => {
|
|
195
|
-
return new TCP(init)
|
|
225
|
+
export function tcp (init: TCPOptions = {}): (components?: TCPComponents) => Transport {
|
|
226
|
+
return (components: TCPComponents = {}) => {
|
|
227
|
+
return new TCP(components, init)
|
|
196
228
|
}
|
|
197
229
|
}
|
package/src/listener.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { MultiaddrConnection, Connection } from '@libp2p/interface-connecti
|
|
|
11
11
|
import type { Upgrader, Listener, ListenerEvents } from '@libp2p/interface-transport'
|
|
12
12
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
13
13
|
import type { TCPCreateListenerOptions } from './index.js'
|
|
14
|
+
import type { CounterGroup, Metric, Metrics } from '@libp2p/interface-metrics'
|
|
14
15
|
|
|
15
16
|
const log = logger('libp2p:tcp:listener')
|
|
16
17
|
|
|
@@ -31,6 +32,16 @@ interface Context extends TCPCreateListenerOptions {
|
|
|
31
32
|
socketInactivityTimeout?: number
|
|
32
33
|
socketCloseTimeout?: number
|
|
33
34
|
maxConnections?: number
|
|
35
|
+
metrics?: Metrics
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const SERVER_STATUS_UP = 1
|
|
39
|
+
const SERVER_STATUS_DOWN = 0
|
|
40
|
+
|
|
41
|
+
export interface TCPListenerMetrics {
|
|
42
|
+
status: Metric
|
|
43
|
+
errors: CounterGroup
|
|
44
|
+
events: CounterGroup
|
|
34
45
|
}
|
|
35
46
|
|
|
36
47
|
type Status = {started: false} | {started: true, listeningAddr: Multiaddr, peerId: string | null }
|
|
@@ -39,8 +50,8 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
|
|
|
39
50
|
private readonly server: net.Server
|
|
40
51
|
/** Keep track of open connections to destroy in case of timeout */
|
|
41
52
|
private readonly connections = new Set<MultiaddrConnection>()
|
|
42
|
-
|
|
43
53
|
private status: Status = { started: false }
|
|
54
|
+
private metrics?: TCPListenerMetrics
|
|
44
55
|
|
|
45
56
|
constructor (private readonly context: Context) {
|
|
46
57
|
super()
|
|
@@ -57,15 +68,62 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
|
|
|
57
68
|
}
|
|
58
69
|
|
|
59
70
|
this.server
|
|
60
|
-
.on('listening', () =>
|
|
61
|
-
|
|
62
|
-
|
|
71
|
+
.on('listening', () => {
|
|
72
|
+
if (context.metrics != null) {
|
|
73
|
+
// we are listening, register metrics for our port
|
|
74
|
+
const address = this.server.address()
|
|
75
|
+
let addr: string
|
|
76
|
+
|
|
77
|
+
if (address == null) {
|
|
78
|
+
addr = 'unknown'
|
|
79
|
+
} else if (typeof address === 'string') {
|
|
80
|
+
// unix socket
|
|
81
|
+
addr = address
|
|
82
|
+
} else {
|
|
83
|
+
addr = `${address.address}:${address.port}`
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
context.metrics?.registerMetric(`libp2p_tcp_connections_${addr}_count`, {
|
|
87
|
+
help: 'Current active connections in TCP listener',
|
|
88
|
+
calculate: () => {
|
|
89
|
+
return this.connections.size
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
this.metrics = {
|
|
94
|
+
status: context.metrics.registerMetric(`libp2p_tcp_${addr}_server_status`, {
|
|
95
|
+
help: 'Current status of the TCP server'
|
|
96
|
+
}),
|
|
97
|
+
errors: context.metrics.registerCounterGroup(`libp2p_tcp_${addr}_server_errors_total`, {
|
|
98
|
+
label: 'error',
|
|
99
|
+
help: 'Total count of TCP listener errors by error type'
|
|
100
|
+
}),
|
|
101
|
+
events: context.metrics.registerCounterGroup(`libp2p_tcp_$${addr}_socket_events`, {
|
|
102
|
+
label: 'event',
|
|
103
|
+
help: 'Total count of TCP socket events by event'
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
this.metrics?.status.update(SERVER_STATUS_UP)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
this.dispatchEvent(new CustomEvent('listening'))
|
|
111
|
+
})
|
|
112
|
+
.on('error', err => {
|
|
113
|
+
this.metrics?.errors.increment({ listen_error: true })
|
|
114
|
+
this.dispatchEvent(new CustomEvent<Error>('error', { detail: err }))
|
|
115
|
+
})
|
|
116
|
+
.on('close', () => {
|
|
117
|
+
this.metrics?.status.update(SERVER_STATUS_DOWN)
|
|
118
|
+
this.dispatchEvent(new CustomEvent('close'))
|
|
119
|
+
})
|
|
63
120
|
}
|
|
64
121
|
|
|
65
122
|
private onSocket (socket: net.Socket) {
|
|
66
123
|
// Avoid uncaught errors caused by unstable connections
|
|
67
124
|
socket.on('error', err => {
|
|
68
125
|
log('socket error', err)
|
|
126
|
+
this.metrics?.events.increment({ error: true })
|
|
69
127
|
})
|
|
70
128
|
|
|
71
129
|
let maConn: MultiaddrConnection
|
|
@@ -73,10 +131,12 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
|
|
|
73
131
|
maConn = toMultiaddrConnection(socket, {
|
|
74
132
|
listeningAddr: this.status.started ? this.status.listeningAddr : undefined,
|
|
75
133
|
socketInactivityTimeout: this.context.socketInactivityTimeout,
|
|
76
|
-
socketCloseTimeout: this.context.socketCloseTimeout
|
|
134
|
+
socketCloseTimeout: this.context.socketCloseTimeout,
|
|
135
|
+
metrics: this.metrics?.events
|
|
77
136
|
})
|
|
78
137
|
} catch (err) {
|
|
79
138
|
log.error('inbound connection failed', err)
|
|
139
|
+
this.metrics?.errors.increment({ inbound_to_connection: true })
|
|
80
140
|
return
|
|
81
141
|
}
|
|
82
142
|
|
|
@@ -99,6 +159,7 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
|
|
|
99
159
|
})
|
|
100
160
|
.catch(async err => {
|
|
101
161
|
log.error('inbound connection failed', err)
|
|
162
|
+
this.metrics?.errors.increment({ inbound_upgrade: true })
|
|
102
163
|
|
|
103
164
|
await attemptClose(maConn)
|
|
104
165
|
})
|
|
@@ -111,6 +172,7 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
|
|
|
111
172
|
attemptClose(maConn)
|
|
112
173
|
.catch(err => {
|
|
113
174
|
log.error('closing inbound connection failed', err)
|
|
175
|
+
this.metrics?.errors.increment({ inbound_closing_failed: true })
|
|
114
176
|
})
|
|
115
177
|
}
|
|
116
178
|
}
|
|
@@ -155,10 +217,10 @@ export class TCPListener extends EventEmitter<ListenerEvents> implements Listene
|
|
|
155
217
|
|
|
156
218
|
return await new Promise<void>((resolve, reject) => {
|
|
157
219
|
const options = multiaddrToNetConfig(listeningAddr)
|
|
158
|
-
this.server.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
220
|
+
this.server.on('error', (err) => {
|
|
221
|
+
reject(err)
|
|
222
|
+
})
|
|
223
|
+
this.server.listen(options, () => {
|
|
162
224
|
log('Listening on %s', this.server.address())
|
|
163
225
|
resolve()
|
|
164
226
|
})
|
package/src/socket-to-conn.ts
CHANGED
|
@@ -9,6 +9,7 @@ import errCode from 'err-code'
|
|
|
9
9
|
import type { Socket } from 'net'
|
|
10
10
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
11
11
|
import type { MultiaddrConnection } from '@libp2p/interface-connection'
|
|
12
|
+
import type { CounterGroup } from '@libp2p/interface-metrics'
|
|
12
13
|
|
|
13
14
|
const log = logger('libp2p:tcp:socket')
|
|
14
15
|
|
|
@@ -19,14 +20,15 @@ interface ToConnectionOptions {
|
|
|
19
20
|
signal?: AbortSignal
|
|
20
21
|
socketInactivityTimeout?: number
|
|
21
22
|
socketCloseTimeout?: number
|
|
23
|
+
metrics?: CounterGroup
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
/**
|
|
25
27
|
* Convert a socket into a MultiaddrConnection
|
|
26
28
|
* https://github.com/libp2p/interface-transport#multiaddrconnection
|
|
27
29
|
*/
|
|
28
|
-
export const toMultiaddrConnection = (socket: Socket, options
|
|
29
|
-
|
|
30
|
+
export const toMultiaddrConnection = (socket: Socket, options: ToConnectionOptions) => {
|
|
31
|
+
const metrics = options.metrics
|
|
30
32
|
const inactivityTimeout = options.socketInactivityTimeout ?? SOCKET_TIMEOUT
|
|
31
33
|
const closeTimeout = options.socketCloseTimeout ?? CLOSE_TIMEOUT
|
|
32
34
|
|
|
@@ -61,6 +63,7 @@ export const toMultiaddrConnection = (socket: Socket, options?: ToConnectionOpti
|
|
|
61
63
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#socketsettimeouttimeout-callback
|
|
62
64
|
socket.setTimeout(inactivityTimeout, () => {
|
|
63
65
|
log('%s socket read timeout', lOptsStr)
|
|
66
|
+
metrics?.increment({ timeout: true })
|
|
64
67
|
|
|
65
68
|
// only destroy with an error if the remote has not sent the FIN message
|
|
66
69
|
let err: Error | undefined
|
|
@@ -75,6 +78,7 @@ export const toMultiaddrConnection = (socket: Socket, options?: ToConnectionOpti
|
|
|
75
78
|
|
|
76
79
|
socket.once('close', () => {
|
|
77
80
|
log('%s socket read timeout', lOptsStr)
|
|
81
|
+
metrics?.increment({ close: true })
|
|
78
82
|
|
|
79
83
|
// In instances where `close` was not explicitly called,
|
|
80
84
|
// such as an iterable stream ending, ensure we have set the close
|
|
@@ -88,6 +92,7 @@ export const toMultiaddrConnection = (socket: Socket, options?: ToConnectionOpti
|
|
|
88
92
|
// the remote sent a FIN packet which means no more data will be sent
|
|
89
93
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#event-end
|
|
90
94
|
log('socket ended', maConn.remoteAddr.toString())
|
|
95
|
+
metrics?.increment({ end: true })
|
|
91
96
|
})
|
|
92
97
|
|
|
93
98
|
const maConn: MultiaddrConnection = {
|