@libp2p/tcp 10.0.6 → 10.0.7
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/index.min.js +1 -1
- package/dist/src/constants.js +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/listener.d.ts.map +1 -1
- package/dist/src/listener.js +7 -6
- package/dist/src/listener.js.map +1 -1
- package/dist/src/socket-to-conn.d.ts +1 -0
- package/dist/src/socket-to-conn.d.ts.map +1 -1
- package/dist/src/socket-to-conn.js +74 -74
- package/dist/src/socket-to-conn.js.map +1 -1
- package/dist/src/tcp.d.ts.map +1 -1
- package/dist/src/tcp.js +34 -19
- package/dist/src/tcp.js.map +1 -1
- package/package.json +3 -2
- package/src/constants.ts +1 -1
- package/src/index.ts +2 -1
- package/src/listener.ts +9 -8
- package/src/socket-to-conn.ts +81 -77
- package/src/tcp.ts +35 -21
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { InvalidParametersError, TimeoutError } from '@libp2p/interface';
|
|
2
2
|
import { ipPortToMultiaddr as toMultiaddr } from '@libp2p/utils/ip-port-to-multiaddr';
|
|
3
|
+
import pDefer from 'p-defer';
|
|
4
|
+
import { raceEvent } from 'race-event';
|
|
3
5
|
import { duplex } from 'stream-to-it';
|
|
4
6
|
import { CLOSE_TIMEOUT, SOCKET_TIMEOUT } from './constants.js';
|
|
5
7
|
import { multiaddrToNetConfig } from './utils.js';
|
|
@@ -8,12 +10,15 @@ import { multiaddrToNetConfig } from './utils.js';
|
|
|
8
10
|
* https://github.com/libp2p/interface-transport#multiaddrconnection
|
|
9
11
|
*/
|
|
10
12
|
export const toMultiaddrConnection = (socket, options) => {
|
|
11
|
-
let closePromise
|
|
13
|
+
let closePromise;
|
|
12
14
|
const log = options.logger.forComponent('libp2p:tcp:socket');
|
|
15
|
+
const direction = options.direction;
|
|
13
16
|
const metrics = options.metrics;
|
|
14
17
|
const metricPrefix = options.metricPrefix ?? '';
|
|
15
18
|
const inactivityTimeout = options.socketInactivityTimeout ?? SOCKET_TIMEOUT;
|
|
16
19
|
const closeTimeout = options.socketCloseTimeout ?? CLOSE_TIMEOUT;
|
|
20
|
+
let timedout = false;
|
|
21
|
+
let errored = false;
|
|
17
22
|
// Check if we are connected on a unix path
|
|
18
23
|
if (options.listeningAddr?.getPath() != null) {
|
|
19
24
|
options.remoteAddr = options.listeningAddr;
|
|
@@ -21,6 +26,16 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
21
26
|
if (options.remoteAddr?.getPath() != null) {
|
|
22
27
|
options.localAddr = options.remoteAddr;
|
|
23
28
|
}
|
|
29
|
+
// handle socket errors
|
|
30
|
+
socket.on('error', err => {
|
|
31
|
+
errored = true;
|
|
32
|
+
if (!timedout) {
|
|
33
|
+
log.error('%s socket error - %e', direction, err);
|
|
34
|
+
metrics?.increment({ [`${metricPrefix}error`]: true });
|
|
35
|
+
}
|
|
36
|
+
socket.destroy();
|
|
37
|
+
maConn.timeline.close = Date.now();
|
|
38
|
+
});
|
|
24
39
|
let remoteAddr;
|
|
25
40
|
if (options.remoteAddr != null) {
|
|
26
41
|
remoteAddr = options.remoteAddr;
|
|
@@ -38,32 +53,32 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
38
53
|
const { sink, source } = duplex(socket);
|
|
39
54
|
// by default there is no timeout
|
|
40
55
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#socketsettimeouttimeout-callback
|
|
41
|
-
socket.setTimeout(inactivityTimeout
|
|
42
|
-
|
|
56
|
+
socket.setTimeout(inactivityTimeout);
|
|
57
|
+
socket.once('timeout', () => {
|
|
58
|
+
timedout = true;
|
|
59
|
+
log('%s %s socket read timeout', direction, lOptsStr);
|
|
43
60
|
metrics?.increment({ [`${metricPrefix}timeout`]: true });
|
|
44
|
-
// only destroy with an error if the remote has not sent the FIN message
|
|
45
|
-
let err;
|
|
46
|
-
if (socket.readable) {
|
|
47
|
-
err = new TimeoutError('Socket read timeout');
|
|
48
|
-
}
|
|
49
61
|
// if the socket times out due to inactivity we must manually close the connection
|
|
50
62
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#event-timeout
|
|
51
|
-
socket.destroy(
|
|
63
|
+
socket.destroy(new TimeoutError());
|
|
64
|
+
maConn.timeline.close = Date.now();
|
|
52
65
|
});
|
|
53
66
|
socket.once('close', () => {
|
|
54
|
-
|
|
55
|
-
|
|
67
|
+
// record metric for clean exit
|
|
68
|
+
if (!timedout && !errored) {
|
|
69
|
+
log('%s %s socket close', direction, lOptsStr);
|
|
70
|
+
metrics?.increment({ [`${metricPrefix}close`]: true });
|
|
71
|
+
}
|
|
56
72
|
// In instances where `close` was not explicitly called,
|
|
57
73
|
// such as an iterable stream ending, ensure we have set the close
|
|
58
74
|
// timeline
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
75
|
+
socket.destroy();
|
|
76
|
+
maConn.timeline.close = Date.now();
|
|
62
77
|
});
|
|
63
78
|
socket.once('end', () => {
|
|
64
79
|
// the remote sent a FIN packet which means no more data will be sent
|
|
65
80
|
// https://nodejs.org/dist/latest-v16.x/docs/api/net.html#event-end
|
|
66
|
-
log('%s socket end', lOptsStr);
|
|
81
|
+
log('%s %s socket end', direction, lOptsStr);
|
|
67
82
|
metrics?.increment({ [`${metricPrefix}end`]: true });
|
|
68
83
|
});
|
|
69
84
|
const maConn = {
|
|
@@ -86,7 +101,7 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
86
101
|
// If the source errored the socket will already have been destroyed by
|
|
87
102
|
// duplex(). If the socket errored it will already be
|
|
88
103
|
// destroyed. There's nothing to do here except log the error & return.
|
|
89
|
-
log.error('%s error in sink', lOptsStr, err);
|
|
104
|
+
log.error('%s %s error in sink - %e', direction, lOptsStr, err);
|
|
90
105
|
}
|
|
91
106
|
}
|
|
92
107
|
// we have finished writing, send the FIN message
|
|
@@ -98,86 +113,71 @@ export const toMultiaddrConnection = (socket, options) => {
|
|
|
98
113
|
timeline: { open: Date.now() },
|
|
99
114
|
async close(options = {}) {
|
|
100
115
|
if (socket.closed) {
|
|
101
|
-
log('
|
|
116
|
+
log('the %s %s socket is already closed', direction, lOptsStr);
|
|
102
117
|
return;
|
|
103
118
|
}
|
|
104
119
|
if (socket.destroyed) {
|
|
105
|
-
log('
|
|
120
|
+
log('the %s %s socket is already destroyed', direction, lOptsStr);
|
|
106
121
|
return;
|
|
107
122
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
123
|
+
if (closePromise != null) {
|
|
124
|
+
return closePromise.promise;
|
|
125
|
+
}
|
|
111
126
|
try {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
options.signal?.addEventListener('abort', abortSignalListener);
|
|
125
|
-
log('%s closing socket', lOptsStr);
|
|
126
|
-
closePromise = new Promise((resolve, reject) => {
|
|
127
|
-
socket.once('close', () => {
|
|
128
|
-
// socket completely closed
|
|
129
|
-
log('%s socket closed', lOptsStr);
|
|
130
|
-
resolve();
|
|
131
|
-
});
|
|
132
|
-
socket.once('error', (err) => {
|
|
133
|
-
log('%s socket error', lOptsStr, err);
|
|
134
|
-
if (!socket.destroyed) {
|
|
135
|
-
reject(err);
|
|
136
|
-
}
|
|
137
|
-
// if socket is destroyed, 'closed' event will be emitted later to resolve the promise
|
|
127
|
+
closePromise = pDefer();
|
|
128
|
+
// close writable end of socket
|
|
129
|
+
socket.end();
|
|
130
|
+
// convert EventEmitter to EventTarget
|
|
131
|
+
const eventTarget = socketToEventTarget(socket);
|
|
132
|
+
// don't wait forever to close
|
|
133
|
+
const signal = options.signal ?? AbortSignal.timeout(closeTimeout);
|
|
134
|
+
// wait for any unsent data to be sent
|
|
135
|
+
if (socket.writableLength > 0) {
|
|
136
|
+
log('%s %s draining socket', direction, lOptsStr);
|
|
137
|
+
await raceEvent(eventTarget, 'drain', signal, {
|
|
138
|
+
errorEvent: 'error'
|
|
138
139
|
});
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
socket.destroy();
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
// nothing to send, destroy immediately, no need for the timeout
|
|
153
|
-
socket.destroy();
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
await closePromise;
|
|
140
|
+
log('%s %s socket drained', direction, lOptsStr);
|
|
141
|
+
}
|
|
142
|
+
await Promise.all([
|
|
143
|
+
raceEvent(eventTarget, 'close', signal, {
|
|
144
|
+
errorEvent: 'error'
|
|
145
|
+
}),
|
|
146
|
+
// all bytes have been sent we can destroy the socket
|
|
147
|
+
socket.destroy()
|
|
148
|
+
]);
|
|
157
149
|
}
|
|
158
150
|
catch (err) {
|
|
159
151
|
this.abort(err);
|
|
160
152
|
}
|
|
161
153
|
finally {
|
|
162
|
-
|
|
154
|
+
closePromise.resolve();
|
|
163
155
|
}
|
|
164
156
|
},
|
|
165
157
|
abort: (err) => {
|
|
166
|
-
log('%s socket abort due to error', lOptsStr, err);
|
|
158
|
+
log('%s %s socket abort due to error - %e', direction, lOptsStr, err);
|
|
167
159
|
// the abortSignalListener may already destroyed the socket with an error
|
|
168
|
-
|
|
169
|
-
socket.destroy(err);
|
|
170
|
-
}
|
|
160
|
+
socket.destroy();
|
|
171
161
|
// closing a socket is always asynchronous (must wait for "close" event)
|
|
172
162
|
// but the tests expect this to be a synchronous operation so we have to
|
|
173
163
|
// set the close time here. the tests should be refactored to reflect
|
|
174
164
|
// reality.
|
|
175
|
-
|
|
176
|
-
maConn.timeline.close = Date.now();
|
|
177
|
-
}
|
|
165
|
+
maConn.timeline.close = Date.now();
|
|
178
166
|
},
|
|
179
167
|
log
|
|
180
168
|
};
|
|
181
169
|
return maConn;
|
|
182
170
|
};
|
|
171
|
+
function socketToEventTarget(obj) {
|
|
172
|
+
const eventTarget = {
|
|
173
|
+
addEventListener: (type, cb) => {
|
|
174
|
+
obj.addListener(type, cb);
|
|
175
|
+
},
|
|
176
|
+
removeEventListener: (type, cb) => {
|
|
177
|
+
obj.removeListener(type, cb);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
// @ts-expect-error partial implementation
|
|
181
|
+
return eventTarget;
|
|
182
|
+
}
|
|
183
183
|
//# sourceMappingURL=socket-to-conn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-to-conn.js","sourceRoot":"","sources":["../../src/socket-to-conn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"socket-to-conn.js","sourceRoot":"","sources":["../../src/socket-to-conn.ts"],"names":[],"mappings":"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"}
|
package/dist/src/tcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/tcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;AAGH,OAAO,EAA4B,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAOlG,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,aAAa,EAAE,cAAc,EAAc,UAAU,EAAE,MAAM,YAAY,CAAA;AAChI,OAAO,KAAK,EAAU,UAAU,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/tcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;AAGH,OAAO,EAA4B,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAOlG,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,aAAa,EAAE,cAAc,EAAc,UAAU,EAAE,MAAM,YAAY,CAAA;AAChI,OAAO,KAAK,EAAU,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAuB,MAAM,mBAAmB,CAAA;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAA8C,MAAM,KAAK,CAAA;AAE7E,qBAAa,GAAI,YAAW,SAAS,CAAC,aAAa,CAAC;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,UAAU,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe;IAmBhE,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAO;IAEjC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAgB;IAE7C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAEK,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAmClE,QAAQ,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA2ExE;;;;OAIG;IACH,cAAc,CAAE,OAAO,EAAE,wBAAwB,GAAG,QAAQ;IAc5D;;OAEG;IACH,YAAY,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAgBnD;;OAEG;IACH,UAAU,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;CAGlD"}
|
package/dist/src/tcp.js
CHANGED
|
@@ -45,7 +45,11 @@ export class TCP {
|
|
|
45
45
|
this.components = components;
|
|
46
46
|
if (components.metrics != null) {
|
|
47
47
|
this.metrics = {
|
|
48
|
-
|
|
48
|
+
events: components.metrics.registerCounterGroup('libp2p_tcp_dialer_events_total', {
|
|
49
|
+
label: 'event',
|
|
50
|
+
help: 'Total count of TCP dialer events by type'
|
|
51
|
+
}),
|
|
52
|
+
errors: components.metrics.registerCounterGroup('libp2p_tcp_dialer_errors_total', {
|
|
49
53
|
label: 'event',
|
|
50
54
|
help: 'Total count of TCP dialer events by type'
|
|
51
55
|
})
|
|
@@ -62,22 +66,28 @@ export class TCP {
|
|
|
62
66
|
options.noDelay = options.noDelay ?? true;
|
|
63
67
|
// options.signal destroys the socket before 'connect' event
|
|
64
68
|
const socket = await this._connect(ma, options);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
69
|
+
let maConn;
|
|
70
|
+
try {
|
|
71
|
+
maConn = toMultiaddrConnection(socket, {
|
|
72
|
+
remoteAddr: ma,
|
|
73
|
+
socketInactivityTimeout: this.opts.outboundSocketInactivityTimeout,
|
|
74
|
+
socketCloseTimeout: this.opts.socketCloseTimeout,
|
|
75
|
+
metrics: this.metrics?.events,
|
|
76
|
+
logger: this.components.logger,
|
|
77
|
+
direction: 'outbound'
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
this.metrics?.errors.increment({ outbound_to_connection: true });
|
|
82
|
+
socket.destroy(err);
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
76
85
|
try {
|
|
77
86
|
this.log('new outbound connection %s', maConn.remoteAddr);
|
|
78
87
|
return await options.upgrader.upgradeOutbound(maConn, options);
|
|
79
88
|
}
|
|
80
89
|
catch (err) {
|
|
90
|
+
this.metrics?.errors.increment({ outbound_upgrade: true });
|
|
81
91
|
this.log.error('error upgrading outbound connection', err);
|
|
82
92
|
maConn.abort(err);
|
|
83
93
|
throw err;
|
|
@@ -86,6 +96,7 @@ export class TCP {
|
|
|
86
96
|
async _connect(ma, options) {
|
|
87
97
|
options.signal?.throwIfAborted();
|
|
88
98
|
options.onProgress?.(new CustomProgressEvent('tcp:open-connection'));
|
|
99
|
+
let rawSocket;
|
|
89
100
|
return new Promise((resolve, reject) => {
|
|
90
101
|
const start = Date.now();
|
|
91
102
|
const cOpts = multiaddrToNetConfig(ma, {
|
|
@@ -93,29 +104,29 @@ export class TCP {
|
|
|
93
104
|
...options
|
|
94
105
|
});
|
|
95
106
|
this.log('dialing %a', ma);
|
|
96
|
-
|
|
107
|
+
rawSocket = net.connect(cOpts);
|
|
97
108
|
const onError = (err) => {
|
|
109
|
+
this.log.error('dial to %a errored - %e', ma, err);
|
|
98
110
|
const cOptsStr = cOpts.path ?? `${cOpts.host ?? ''}:${cOpts.port}`;
|
|
99
111
|
err.message = `connection error ${cOptsStr}: ${err.message}`;
|
|
100
|
-
this.metrics?.
|
|
112
|
+
this.metrics?.events.increment({ error: true });
|
|
101
113
|
done(err);
|
|
102
114
|
};
|
|
103
115
|
const onTimeout = () => {
|
|
104
116
|
this.log('connection timeout %a', ma);
|
|
105
|
-
this.metrics?.
|
|
106
|
-
const err = new TimeoutError(`
|
|
117
|
+
this.metrics?.events.increment({ timeout: true });
|
|
118
|
+
const err = new TimeoutError(`Connection timeout after ${Date.now() - start}ms`);
|
|
107
119
|
// Note: this will result in onError() being called
|
|
108
120
|
rawSocket.emit('error', err);
|
|
109
121
|
};
|
|
110
122
|
const onConnect = () => {
|
|
111
123
|
this.log('connection opened %a', ma);
|
|
112
|
-
this.metrics?.
|
|
124
|
+
this.metrics?.events.increment({ connect: true });
|
|
113
125
|
done();
|
|
114
126
|
};
|
|
115
127
|
const onAbort = () => {
|
|
116
128
|
this.log('connection aborted %a', ma);
|
|
117
|
-
this.metrics?.
|
|
118
|
-
rawSocket.destroy();
|
|
129
|
+
this.metrics?.events.increment({ abort: true });
|
|
119
130
|
done(new AbortError());
|
|
120
131
|
};
|
|
121
132
|
const done = (err) => {
|
|
@@ -137,6 +148,10 @@ export class TCP {
|
|
|
137
148
|
if (options.signal != null) {
|
|
138
149
|
options.signal.addEventListener('abort', onAbort);
|
|
139
150
|
}
|
|
151
|
+
})
|
|
152
|
+
.catch(err => {
|
|
153
|
+
rawSocket?.destroy();
|
|
154
|
+
throw err;
|
|
140
155
|
});
|
|
141
156
|
}
|
|
142
157
|
/**
|
package/dist/src/tcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/tcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAClG,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAMjD,MAAM,OAAO,GAAG;IACG,IAAI,CAAY;IAChB,OAAO,CAAa;IACpB,UAAU,CAAe;IACzB,GAAG,CAAQ;IAE5B,YAAa,UAAyB,EAAE,UAAsB,EAAE;QAC9D,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACvD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAE5B,IAAI,UAAU,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG;gBACb,
|
|
1
|
+
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/tcp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/tcp",
|
|
3
|
-
"version": "10.0.
|
|
3
|
+
"version": "10.0.7",
|
|
4
4
|
"description": "A TCP transport for libp2p",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/transport-tcp#readme",
|
|
@@ -65,7 +65,9 @@
|
|
|
65
65
|
"@multiformats/mafmt": "^12.1.6",
|
|
66
66
|
"@multiformats/multiaddr": "^12.2.3",
|
|
67
67
|
"@types/sinon": "^17.0.3",
|
|
68
|
+
"p-defer": "^4.0.1",
|
|
68
69
|
"progress-events": "^1.0.0",
|
|
70
|
+
"race-event": "^1.3.0",
|
|
69
71
|
"stream-to-it": "^1.0.1"
|
|
70
72
|
},
|
|
71
73
|
"devDependencies": {
|
|
@@ -74,7 +76,6 @@
|
|
|
74
76
|
"aegir": "^44.0.1",
|
|
75
77
|
"it-all": "^3.0.6",
|
|
76
78
|
"it-pipe": "^3.0.1",
|
|
77
|
-
"p-defer": "^4.0.1",
|
|
78
79
|
"sinon": "^18.0.0",
|
|
79
80
|
"uint8arrays": "^5.1.0",
|
|
80
81
|
"wherearewe": "^2.0.1"
|
package/src/constants.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -123,7 +123,8 @@ export interface TCPComponents {
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
export interface TCPMetrics {
|
|
126
|
-
|
|
126
|
+
events: CounterGroup<'error' | 'timeout' | 'connect' | 'abort'>
|
|
127
|
+
errors: CounterGroup<'outbound_to_connection' | 'outbound_upgrade'>
|
|
127
128
|
}
|
|
128
129
|
|
|
129
130
|
export function tcp (init: TCPOptions = {}): (components: TCPComponents) => Transport {
|
package/src/listener.ts
CHANGED
|
@@ -163,20 +163,19 @@ export class TCPListener extends TypedEventEmitter<ListenerEvents> implements Li
|
|
|
163
163
|
this.safeDispatchEvent('close')
|
|
164
164
|
}
|
|
165
165
|
})
|
|
166
|
+
.on('drop', () => {
|
|
167
|
+
this.metrics?.events.increment({ [`${this.addr} drop`]: true })
|
|
168
|
+
})
|
|
166
169
|
}
|
|
167
170
|
|
|
168
171
|
private onSocket (socket: net.Socket): void {
|
|
172
|
+
this.metrics?.events.increment({ [`${this.addr} connection`]: true })
|
|
173
|
+
|
|
169
174
|
if (this.status.code !== TCPListenerStatusCode.ACTIVE) {
|
|
170
175
|
socket.destroy()
|
|
171
176
|
throw new NotStartedError('Server is not listening yet')
|
|
172
177
|
}
|
|
173
178
|
|
|
174
|
-
// Avoid uncaught errors caused by unstable connections
|
|
175
|
-
socket.on('error', err => {
|
|
176
|
-
this.log('socket error', err)
|
|
177
|
-
this.metrics?.events.increment({ [`${this.addr} error`]: true })
|
|
178
|
-
})
|
|
179
|
-
|
|
180
179
|
let maConn: MultiaddrConnection
|
|
181
180
|
try {
|
|
182
181
|
maConn = toMultiaddrConnection(socket, {
|
|
@@ -185,11 +184,13 @@ export class TCPListener extends TypedEventEmitter<ListenerEvents> implements Li
|
|
|
185
184
|
socketCloseTimeout: this.context.socketCloseTimeout,
|
|
186
185
|
metrics: this.metrics?.events,
|
|
187
186
|
metricPrefix: `${this.addr} `,
|
|
188
|
-
logger: this.context.logger
|
|
187
|
+
logger: this.context.logger,
|
|
188
|
+
direction: 'inbound'
|
|
189
189
|
})
|
|
190
|
-
} catch (err) {
|
|
190
|
+
} catch (err: any) {
|
|
191
191
|
this.log.error('inbound connection failed', err)
|
|
192
192
|
this.metrics?.errors.increment({ [`${this.addr} inbound_to_connection`]: true })
|
|
193
|
+
socket.destroy()
|
|
193
194
|
return
|
|
194
195
|
}
|
|
195
196
|
|