@libp2p/ping 2.0.36 → 2.0.37-6059227cb
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/index.min.js.map +4 -4
- package/dist/src/index.d.ts +1 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/ping.d.ts +2 -3
- package/dist/src/ping.d.ts.map +1 -1
- package/dist/src/ping.js +66 -80
- package/dist/src/ping.js.map +1 -1
- package/package.json +13 -12
- package/src/index.ts +1 -12
- package/src/ping.ts +71 -92
- package/dist/typedoc-urls.json +0 -15
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;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,IAAI;IACnB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACtF;AAED,MAAM,WAAW,QAAQ;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAEhC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAA;IACpB,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;AAED,wBAAgB,IAAI,CAAE,IAAI,GAAE,QAAa,GAAG,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAE/E;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AA0B7C,MAAM,UAAU,IAAI,CAAE,OAAiB,EAAE;IACvC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACxD,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/src/ping.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { serviceCapabilities } from '@libp2p/interface';
|
|
2
2
|
import type { PingComponents, PingInit, Ping as PingInterface } from './index.js';
|
|
3
|
-
import type { AbortOptions, PeerId, Startable,
|
|
3
|
+
import type { AbortOptions, Stream, PeerId, Startable, Connection } from '@libp2p/interface';
|
|
4
4
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
5
5
|
export declare class Ping implements Startable, PingInterface {
|
|
6
6
|
readonly protocol: string;
|
|
@@ -10,7 +10,6 @@ export declare class Ping implements Startable, PingInterface {
|
|
|
10
10
|
private readonly maxInboundStreams;
|
|
11
11
|
private readonly maxOutboundStreams;
|
|
12
12
|
private readonly runOnLimitedConnection;
|
|
13
|
-
private readonly log;
|
|
14
13
|
constructor(components: PingComponents, init?: PingInit);
|
|
15
14
|
readonly [Symbol.toStringTag] = "@libp2p/ping";
|
|
16
15
|
readonly [serviceCapabilities]: string[];
|
|
@@ -20,7 +19,7 @@ export declare class Ping implements Startable, PingInterface {
|
|
|
20
19
|
/**
|
|
21
20
|
* A handler to register with Libp2p to process ping messages
|
|
22
21
|
*/
|
|
23
|
-
|
|
22
|
+
handlePing(stream: Stream, connection: Connection): Promise<void>;
|
|
24
23
|
/**
|
|
25
24
|
* Ping a given peer and wait for its response, getting the operation latency.
|
|
26
25
|
*/
|
package/dist/src/ping.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/ping.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/ping.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,mBAAmB,EAAiC,MAAM,mBAAmB,CAAA;AAMrG,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,YAAY,CAAA;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAA;AAChH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,qBAAa,IAAK,YAAW,SAAS,EAAE,aAAa;IACnD,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;gBAEnC,UAAU,EAAE,cAAc,EAAE,IAAI,GAAE,QAAa;IAY5D,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAiB;IAE9C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAEK,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IASvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAK5B,SAAS,IAAK,OAAO;IAIrB;;OAEG;IACG,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCxE;;OAEG;IACG,IAAI,CAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAqDjG"}
|
package/dist/src/ping.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { randomBytes } from '@libp2p/crypto';
|
|
2
|
-
import { ProtocolError,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { ProtocolError, serviceCapabilities, setMaxListeners, TimeoutError } from '@libp2p/interface';
|
|
3
|
+
import { pEvent } from 'p-event';
|
|
4
|
+
import { raceSignal } from 'race-signal';
|
|
5
|
+
import { Uint8ArrayList } from 'uint8arraylist';
|
|
5
6
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
6
7
|
import { PROTOCOL_PREFIX, PROTOCOL_NAME, PING_LENGTH, PROTOCOL_VERSION, TIMEOUT, MAX_INBOUND_STREAMS, MAX_OUTBOUND_STREAMS } from './constants.js';
|
|
7
8
|
export class Ping {
|
|
@@ -12,24 +13,22 @@ export class Ping {
|
|
|
12
13
|
maxInboundStreams;
|
|
13
14
|
maxOutboundStreams;
|
|
14
15
|
runOnLimitedConnection;
|
|
15
|
-
log;
|
|
16
16
|
constructor(components, init = {}) {
|
|
17
17
|
this.components = components;
|
|
18
|
-
this.log = components.logger.forComponent('libp2p:ping');
|
|
19
18
|
this.started = false;
|
|
20
19
|
this.protocol = `/${init.protocolPrefix ?? PROTOCOL_PREFIX}/${PROTOCOL_NAME}/${PROTOCOL_VERSION}`;
|
|
21
20
|
this.timeout = init.timeout ?? TIMEOUT;
|
|
22
21
|
this.maxInboundStreams = init.maxInboundStreams ?? MAX_INBOUND_STREAMS;
|
|
23
22
|
this.maxOutboundStreams = init.maxOutboundStreams ?? MAX_OUTBOUND_STREAMS;
|
|
24
23
|
this.runOnLimitedConnection = init.runOnLimitedConnection ?? true;
|
|
25
|
-
this.
|
|
24
|
+
this.handlePing = this.handlePing.bind(this);
|
|
26
25
|
}
|
|
27
26
|
[Symbol.toStringTag] = '@libp2p/ping';
|
|
28
27
|
[serviceCapabilities] = [
|
|
29
28
|
'@libp2p/ping'
|
|
30
29
|
];
|
|
31
30
|
async start() {
|
|
32
|
-
await this.components.registrar.handle(this.protocol, this.
|
|
31
|
+
await this.components.registrar.handle(this.protocol, this.handlePing, {
|
|
33
32
|
maxInboundStreams: this.maxInboundStreams,
|
|
34
33
|
maxOutboundStreams: this.maxOutboundStreams,
|
|
35
34
|
runOnLimitedConnection: this.runOnLimitedConnection
|
|
@@ -46,97 +45,84 @@ export class Ping {
|
|
|
46
45
|
/**
|
|
47
46
|
* A handler to register with Libp2p to process ping messages
|
|
48
47
|
*/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
async handlePing(stream, connection) {
|
|
49
|
+
const log = stream.log.newScope('ping');
|
|
50
|
+
log.trace('ping from %p', connection.remotePeer);
|
|
51
|
+
const signal = AbortSignal.timeout(this.timeout);
|
|
52
|
+
setMaxListeners(Infinity, signal);
|
|
53
|
+
signal.addEventListener('abort', () => {
|
|
54
|
+
stream.abort(new TimeoutError('Ping timed out'));
|
|
55
|
+
});
|
|
52
56
|
const start = Date.now();
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
signal
|
|
65
|
-
});
|
|
66
|
-
await bytes.write(buf, {
|
|
57
|
+
for await (const buf of stream) {
|
|
58
|
+
if (stream.status !== 'open') {
|
|
59
|
+
log('stream status changed to %s', stream.status);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
if (!stream.send(buf)) {
|
|
63
|
+
log('waiting for stream to drain');
|
|
64
|
+
await pEvent(stream, 'drain', {
|
|
65
|
+
rejectionEvents: [
|
|
66
|
+
'close'
|
|
67
|
+
],
|
|
67
68
|
signal
|
|
68
69
|
});
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
.catch(err => {
|
|
73
|
-
// ignore the error if we've processed at least one ping, the remote
|
|
74
|
-
// closed the stream and we handled or are handling the close cleanly
|
|
75
|
-
if (pinged && err.name === 'UnexpectedEOFError' && stream.readStatus !== 'ready') {
|
|
76
|
-
return;
|
|
70
|
+
log('stream drained');
|
|
77
71
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const ms = Date.now() - start;
|
|
83
|
-
this.log('incoming ping from %p complete in %dms', data.connection.remotePeer, ms);
|
|
84
|
-
const signal = AbortSignal.timeout(this.timeout);
|
|
85
|
-
setMaxListeners(Infinity, signal);
|
|
86
|
-
stream.close({
|
|
87
|
-
signal
|
|
88
|
-
})
|
|
89
|
-
.catch(err => {
|
|
90
|
-
this.log.error('error closing ping stream from %p - %e', data.connection.remotePeer, err);
|
|
91
|
-
stream?.abort(err);
|
|
92
|
-
});
|
|
72
|
+
}
|
|
73
|
+
log('ping from %p complete in %dms', connection.remotePeer, Date.now() - start);
|
|
74
|
+
await stream.close({
|
|
75
|
+
signal
|
|
93
76
|
});
|
|
94
77
|
}
|
|
95
78
|
/**
|
|
96
79
|
* Ping a given peer and wait for its response, getting the operation latency.
|
|
97
80
|
*/
|
|
98
81
|
async ping(peer, options = {}) {
|
|
99
|
-
this.log('pinging %p', peer);
|
|
100
|
-
const start = Date.now();
|
|
101
82
|
const data = randomBytes(PING_LENGTH);
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
...options,
|
|
108
|
-
signal
|
|
109
|
-
};
|
|
110
|
-
}
|
|
83
|
+
const stream = await this.components.connectionManager.openStream(peer, this.protocol, {
|
|
84
|
+
runOnLimitedConnection: this.runOnLimitedConnection,
|
|
85
|
+
...options
|
|
86
|
+
});
|
|
87
|
+
const log = stream.log.newScope('ping');
|
|
111
88
|
try {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
89
|
+
const start = Date.now();
|
|
90
|
+
const finished = Promise.withResolvers();
|
|
91
|
+
const received = new Uint8ArrayList();
|
|
92
|
+
const onPong = (evt) => {
|
|
93
|
+
received.append(evt.data);
|
|
94
|
+
if (received.byteLength === PING_LENGTH) {
|
|
95
|
+
stream.removeEventListener('message', onPong);
|
|
96
|
+
const rtt = Date.now() - start;
|
|
97
|
+
Promise.all([
|
|
98
|
+
stream.closeRead(options)
|
|
99
|
+
])
|
|
100
|
+
.then(() => {
|
|
101
|
+
if (!uint8ArrayEquals(data, received.subarray())) {
|
|
102
|
+
throw new ProtocolError(`Received wrong ping ack after ${rtt}ms`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
finished.resolve(rtt);
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
.catch(err => {
|
|
109
|
+
stream.abort(err);
|
|
110
|
+
finished.reject(err);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
stream.addEventListener('message', onPong);
|
|
115
|
+
stream.send(data);
|
|
116
|
+
await stream.close(options);
|
|
117
|
+
return await raceSignal(finished.promise, options.signal);
|
|
130
118
|
}
|
|
131
119
|
catch (err) {
|
|
132
|
-
|
|
120
|
+
log.error('error while pinging %o - %e', peer, err);
|
|
133
121
|
stream?.abort(err);
|
|
134
122
|
throw err;
|
|
135
123
|
}
|
|
136
124
|
finally {
|
|
137
|
-
|
|
138
|
-
await stream.close(options);
|
|
139
|
-
}
|
|
125
|
+
stream?.close();
|
|
140
126
|
}
|
|
141
127
|
}
|
|
142
128
|
}
|
package/dist/src/ping.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/ping.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/ping",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.37-6059227cb",
|
|
4
4
|
"description": "Implementation of Ping Protocol",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/protocol-ping#readme",
|
|
@@ -43,20 +43,21 @@
|
|
|
43
43
|
"doc-check": "aegir doc-check"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@libp2p/crypto": "
|
|
47
|
-
"@libp2p/interface": "
|
|
48
|
-
"@libp2p/interface-internal": "
|
|
49
|
-
"@multiformats/multiaddr": "^
|
|
50
|
-
"
|
|
51
|
-
"
|
|
46
|
+
"@libp2p/crypto": "5.1.8-6059227cb",
|
|
47
|
+
"@libp2p/interface": "2.11.0-6059227cb",
|
|
48
|
+
"@libp2p/interface-internal": "2.3.19-6059227cb",
|
|
49
|
+
"@multiformats/multiaddr": "^13.0.1",
|
|
50
|
+
"p-event": "^6.0.1",
|
|
51
|
+
"race-signal": "^2.0.0",
|
|
52
|
+
"uint8arraylist": "^2.4.8",
|
|
52
53
|
"uint8arrays": "^5.1.0"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
|
-
"@libp2p/
|
|
56
|
-
"@libp2p/
|
|
57
|
-
"aegir": "^47.0.
|
|
58
|
-
"
|
|
59
|
-
"
|
|
56
|
+
"@libp2p/peer-id": "5.1.9-6059227cb",
|
|
57
|
+
"@libp2p/utils": "6.7.2-6059227cb",
|
|
58
|
+
"aegir": "^47.0.22",
|
|
59
|
+
"delay": "^6.0.0",
|
|
60
|
+
"sinon": "^21.0.0",
|
|
60
61
|
"sinon-ts": "^2.0.0"
|
|
61
62
|
},
|
|
62
63
|
"sideEffects": false
|
package/src/index.ts
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import { Ping as PingClass } from './ping.js'
|
|
26
|
-
import type { AbortOptions,
|
|
26
|
+
import type { AbortOptions, PeerId } from '@libp2p/interface'
|
|
27
27
|
import type { ConnectionManager, Registrar } from '@libp2p/interface-internal'
|
|
28
28
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
29
29
|
|
|
@@ -31,11 +31,6 @@ export interface Ping {
|
|
|
31
31
|
ping(peer: PeerId | Multiaddr | Multiaddr[], options?: AbortOptions): Promise<number>
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
/**
|
|
35
|
-
* @deprecated Use the `Ping` export instead
|
|
36
|
-
*/
|
|
37
|
-
export type PingService = Ping
|
|
38
|
-
|
|
39
34
|
export interface PingInit {
|
|
40
35
|
protocolPrefix?: string
|
|
41
36
|
maxInboundStreams?: number
|
|
@@ -48,15 +43,9 @@ export interface PingInit {
|
|
|
48
43
|
timeout?: number
|
|
49
44
|
}
|
|
50
45
|
|
|
51
|
-
/**
|
|
52
|
-
* @deprecated Use the `PingInit` export instead
|
|
53
|
-
*/
|
|
54
|
-
export type PingServiceInit = PingInit
|
|
55
|
-
|
|
56
46
|
export interface PingComponents {
|
|
57
47
|
registrar: Registrar
|
|
58
48
|
connectionManager: ConnectionManager
|
|
59
|
-
logger: ComponentLogger
|
|
60
49
|
}
|
|
61
50
|
|
|
62
51
|
export function ping (init: PingInit = {}): (components: PingComponents) => Ping {
|
package/src/ping.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { randomBytes } from '@libp2p/crypto'
|
|
2
|
-
import { ProtocolError,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { ProtocolError, serviceCapabilities, setMaxListeners, TimeoutError } from '@libp2p/interface'
|
|
3
|
+
import { pEvent } from 'p-event'
|
|
4
|
+
import { raceSignal } from 'race-signal'
|
|
5
|
+
import { Uint8ArrayList } from 'uint8arraylist'
|
|
5
6
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
|
|
6
7
|
import { PROTOCOL_PREFIX, PROTOCOL_NAME, PING_LENGTH, PROTOCOL_VERSION, TIMEOUT, MAX_INBOUND_STREAMS, MAX_OUTBOUND_STREAMS } from './constants.js'
|
|
7
8
|
import type { PingComponents, PingInit, Ping as PingInterface } from './index.js'
|
|
8
|
-
import type { AbortOptions,
|
|
9
|
+
import type { AbortOptions, Stream, PeerId, Startable, Connection, StreamMessageEvent } from '@libp2p/interface'
|
|
9
10
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
10
11
|
|
|
11
12
|
export class Ping implements Startable, PingInterface {
|
|
@@ -16,11 +17,9 @@ export class Ping implements Startable, PingInterface {
|
|
|
16
17
|
private readonly maxInboundStreams: number
|
|
17
18
|
private readonly maxOutboundStreams: number
|
|
18
19
|
private readonly runOnLimitedConnection: boolean
|
|
19
|
-
private readonly log: Logger
|
|
20
20
|
|
|
21
21
|
constructor (components: PingComponents, init: PingInit = {}) {
|
|
22
22
|
this.components = components
|
|
23
|
-
this.log = components.logger.forComponent('libp2p:ping')
|
|
24
23
|
this.started = false
|
|
25
24
|
this.protocol = `/${init.protocolPrefix ?? PROTOCOL_PREFIX}/${PROTOCOL_NAME}/${PROTOCOL_VERSION}`
|
|
26
25
|
this.timeout = init.timeout ?? TIMEOUT
|
|
@@ -28,7 +27,7 @@ export class Ping implements Startable, PingInterface {
|
|
|
28
27
|
this.maxOutboundStreams = init.maxOutboundStreams ?? MAX_OUTBOUND_STREAMS
|
|
29
28
|
this.runOnLimitedConnection = init.runOnLimitedConnection ?? true
|
|
30
29
|
|
|
31
|
-
this.
|
|
30
|
+
this.handlePing = this.handlePing.bind(this)
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
readonly [Symbol.toStringTag] = '@libp2p/ping'
|
|
@@ -38,7 +37,7 @@ export class Ping implements Startable, PingInterface {
|
|
|
38
37
|
]
|
|
39
38
|
|
|
40
39
|
async start (): Promise<void> {
|
|
41
|
-
await this.components.registrar.handle(this.protocol, this.
|
|
40
|
+
await this.components.registrar.handle(this.protocol, this.handlePing, {
|
|
42
41
|
maxInboundStreams: this.maxInboundStreams,
|
|
43
42
|
maxOutboundStreams: this.maxOutboundStreams,
|
|
44
43
|
runOnLimitedConnection: this.runOnLimitedConnection
|
|
@@ -58,115 +57,95 @@ export class Ping implements Startable, PingInterface {
|
|
|
58
57
|
/**
|
|
59
58
|
* A handler to register with Libp2p to process ping messages
|
|
60
59
|
*/
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
60
|
+
async handlePing (stream: Stream, connection: Connection): Promise<void> {
|
|
61
|
+
const log = stream.log.newScope('ping')
|
|
62
|
+
log.trace('ping from %p', connection.remotePeer)
|
|
63
|
+
const signal = AbortSignal.timeout(this.timeout)
|
|
64
|
+
setMaxListeners(Infinity, signal)
|
|
65
|
+
signal.addEventListener('abort', () => {
|
|
66
|
+
stream.abort(new TimeoutError('Ping timed out'))
|
|
67
|
+
})
|
|
65
68
|
const start = Date.now()
|
|
66
|
-
const bytes = byteStream(stream)
|
|
67
|
-
let pinged = false
|
|
68
|
-
|
|
69
|
-
Promise.resolve().then(async () => {
|
|
70
|
-
while (true) {
|
|
71
|
-
const signal = AbortSignal.timeout(this.timeout)
|
|
72
|
-
setMaxListeners(Infinity, signal)
|
|
73
|
-
signal.addEventListener('abort', () => {
|
|
74
|
-
stream?.abort(new TimeoutError('ping timeout'))
|
|
75
|
-
})
|
|
76
69
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
for await (const buf of stream) {
|
|
71
|
+
if (stream.status !== 'open') {
|
|
72
|
+
log('stream status changed to %s', stream.status)
|
|
73
|
+
break
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!stream.send(buf)) {
|
|
77
|
+
log('waiting for stream to drain')
|
|
78
|
+
await pEvent(stream, 'drain', {
|
|
79
|
+
rejectionEvents: [
|
|
80
|
+
'close'
|
|
81
|
+
],
|
|
82
82
|
signal
|
|
83
83
|
})
|
|
84
|
-
|
|
85
|
-
pinged = true
|
|
84
|
+
log('stream drained')
|
|
86
85
|
}
|
|
87
|
-
}
|
|
88
|
-
.catch(err => {
|
|
89
|
-
// ignore the error if we've processed at least one ping, the remote
|
|
90
|
-
// closed the stream and we handled or are handling the close cleanly
|
|
91
|
-
if (pinged && err.name === 'UnexpectedEOFError' && stream.readStatus !== 'ready') {
|
|
92
|
-
return
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
this.log.error('incoming ping from %p failed with error - %e', data.connection.remotePeer, err)
|
|
96
|
-
stream?.abort(err)
|
|
97
|
-
})
|
|
98
|
-
.finally(() => {
|
|
99
|
-
const ms = Date.now() - start
|
|
100
|
-
this.log('incoming ping from %p complete in %dms', data.connection.remotePeer, ms)
|
|
86
|
+
}
|
|
101
87
|
|
|
102
|
-
|
|
103
|
-
setMaxListeners(Infinity, signal)
|
|
88
|
+
log('ping from %p complete in %dms', connection.remotePeer, Date.now() - start)
|
|
104
89
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
.catch(err => {
|
|
109
|
-
this.log.error('error closing ping stream from %p - %e', data.connection.remotePeer, err)
|
|
110
|
-
stream?.abort(err)
|
|
111
|
-
})
|
|
112
|
-
})
|
|
90
|
+
await stream.close({
|
|
91
|
+
signal
|
|
92
|
+
})
|
|
113
93
|
}
|
|
114
94
|
|
|
115
95
|
/**
|
|
116
96
|
* Ping a given peer and wait for its response, getting the operation latency.
|
|
117
97
|
*/
|
|
118
98
|
async ping (peer: PeerId | Multiaddr | Multiaddr[], options: AbortOptions = {}): Promise<number> {
|
|
119
|
-
this.log('pinging %p', peer)
|
|
120
|
-
|
|
121
|
-
const start = Date.now()
|
|
122
99
|
const data = randomBytes(PING_LENGTH)
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
options = {
|
|
130
|
-
...options,
|
|
131
|
-
signal
|
|
132
|
-
}
|
|
133
|
-
}
|
|
100
|
+
const stream = await this.components.connectionManager.openStream(peer, this.protocol, {
|
|
101
|
+
runOnLimitedConnection: this.runOnLimitedConnection,
|
|
102
|
+
...options
|
|
103
|
+
})
|
|
104
|
+
const log = stream.log.newScope('ping')
|
|
134
105
|
|
|
135
106
|
try {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
107
|
+
const start = Date.now()
|
|
108
|
+
const finished = Promise.withResolvers<number>()
|
|
109
|
+
const received = new Uint8ArrayList()
|
|
110
|
+
|
|
111
|
+
const onPong = (evt: StreamMessageEvent): void => {
|
|
112
|
+
received.append(evt.data)
|
|
113
|
+
|
|
114
|
+
if (received.byteLength === PING_LENGTH) {
|
|
115
|
+
stream.removeEventListener('message', onPong)
|
|
116
|
+
|
|
117
|
+
const rtt = Date.now() - start
|
|
118
|
+
|
|
119
|
+
Promise.all([
|
|
120
|
+
stream.closeRead(options)
|
|
121
|
+
])
|
|
122
|
+
.then(() => {
|
|
123
|
+
if (!uint8ArrayEquals(data, received.subarray())) {
|
|
124
|
+
throw new ProtocolError(`Received wrong ping ack after ${rtt}ms`)
|
|
125
|
+
} else {
|
|
126
|
+
finished.resolve(rtt)
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
.catch(err => {
|
|
130
|
+
stream.abort(err)
|
|
131
|
+
finished.reject(err)
|
|
132
|
+
})
|
|
133
|
+
}
|
|
155
134
|
}
|
|
156
135
|
|
|
157
|
-
|
|
136
|
+
stream.addEventListener('message', onPong)
|
|
137
|
+
stream.send(data)
|
|
138
|
+
await stream.close(options)
|
|
158
139
|
|
|
159
|
-
return
|
|
140
|
+
return await raceSignal(finished.promise, options.signal)
|
|
160
141
|
} catch (err: any) {
|
|
161
|
-
|
|
142
|
+
log.error('error while pinging %o - %e', peer, err)
|
|
162
143
|
|
|
163
144
|
stream?.abort(err)
|
|
164
145
|
|
|
165
146
|
throw err
|
|
166
147
|
} finally {
|
|
167
|
-
|
|
168
|
-
await stream.close(options)
|
|
169
|
-
}
|
|
148
|
+
stream?.close()
|
|
170
149
|
}
|
|
171
150
|
}
|
|
172
151
|
}
|
package/dist/typedoc-urls.json
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"Ping": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_ping.Ping.html",
|
|
3
|
-
".:Ping": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_ping.Ping.html",
|
|
4
|
-
"PingComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_ping.PingComponents.html",
|
|
5
|
-
".:PingComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_ping.PingComponents.html",
|
|
6
|
-
"PingInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_ping.PingInit.html",
|
|
7
|
-
".:PingInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_ping.PingInit.html",
|
|
8
|
-
"PingService": "https://libp2p.github.io/js-libp2p/types/_libp2p_ping.PingService.html",
|
|
9
|
-
".:PingService": "https://libp2p.github.io/js-libp2p/types/_libp2p_ping.PingService.html",
|
|
10
|
-
"PingServiceInit": "https://libp2p.github.io/js-libp2p/types/_libp2p_ping.PingServiceInit.html",
|
|
11
|
-
".:PingServiceInit": "https://libp2p.github.io/js-libp2p/types/_libp2p_ping.PingServiceInit.html",
|
|
12
|
-
"PING_PROTOCOL": "https://libp2p.github.io/js-libp2p/variables/_libp2p_ping.PING_PROTOCOL.html",
|
|
13
|
-
"ping": "https://libp2p.github.io/js-libp2p/functions/_libp2p_ping.ping.html",
|
|
14
|
-
".:ping": "https://libp2p.github.io/js-libp2p/functions/_libp2p_ping.ping.html"
|
|
15
|
-
}
|