@libp2p/webrtc 3.2.1 → 3.2.2-77e3cbc3
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 +13 -13
- package/dist/src/index.d.ts +29 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/maconn.d.ts.map +1 -1
- package/dist/src/maconn.js +5 -2
- package/dist/src/maconn.js.map +1 -1
- package/dist/src/muxer.d.ts +10 -13
- package/dist/src/muxer.d.ts.map +1 -1
- package/dist/src/muxer.js +44 -29
- package/dist/src/muxer.js.map +1 -1
- package/dist/src/pb/message.d.ts +2 -1
- package/dist/src/pb/message.d.ts.map +1 -1
- package/dist/src/pb/message.js +2 -0
- package/dist/src/pb/message.js.map +1 -1
- package/dist/src/private-to-private/initiate-connection.d.ts +25 -0
- package/dist/src/private-to-private/initiate-connection.d.ts.map +1 -0
- package/dist/src/private-to-private/initiate-connection.js +145 -0
- package/dist/src/private-to-private/initiate-connection.js.map +1 -0
- package/dist/src/private-to-private/listener.d.ts +6 -2
- package/dist/src/private-to-private/listener.d.ts.map +1 -1
- package/dist/src/private-to-private/listener.js +6 -3
- package/dist/src/private-to-private/listener.js.map +1 -1
- package/dist/src/private-to-private/signaling-stream-handler.d.ts +10 -0
- package/dist/src/private-to-private/signaling-stream-handler.d.ts.map +1 -0
- package/dist/src/private-to-private/signaling-stream-handler.js +97 -0
- package/dist/src/private-to-private/signaling-stream-handler.js.map +1 -0
- package/dist/src/private-to-private/transport.d.ts +12 -2
- package/dist/src/private-to-private/transport.d.ts.map +1 -1
- package/dist/src/private-to-private/transport.js +67 -56
- package/dist/src/private-to-private/transport.js.map +1 -1
- package/dist/src/private-to-private/util.d.ts +6 -5
- package/dist/src/private-to-private/util.d.ts.map +1 -1
- package/dist/src/private-to-private/util.js +72 -21
- package/dist/src/private-to-private/util.js.map +1 -1
- package/dist/src/private-to-public/transport.d.ts +2 -2
- package/dist/src/private-to-public/transport.d.ts.map +1 -1
- package/dist/src/private-to-public/transport.js +2 -2
- package/dist/src/private-to-public/transport.js.map +1 -1
- package/dist/src/stream.d.ts +39 -19
- package/dist/src/stream.d.ts.map +1 -1
- package/dist/src/stream.js +135 -39
- package/dist/src/stream.js.map +1 -1
- package/dist/src/util.d.ts +6 -0
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +46 -0
- package/dist/src/util.js.map +1 -1
- package/package.json +17 -11
- package/src/index.ts +34 -0
- package/src/maconn.ts +7 -2
- package/src/muxer.ts +58 -44
- package/src/pb/message.proto +6 -1
- package/src/pb/message.ts +4 -2
- package/src/private-to-private/initiate-connection.ts +191 -0
- package/src/private-to-private/listener.ts +12 -4
- package/src/private-to-private/signaling-stream-handler.ts +129 -0
- package/src/private-to-private/transport.ts +87 -59
- package/src/private-to-private/util.ts +89 -24
- package/src/private-to-public/transport.ts +4 -4
- package/src/stream.ts +163 -61
- package/src/util.ts +60 -0
- package/dist/src/private-to-private/handler.d.ts +0 -26
- package/dist/src/private-to-private/handler.d.ts.map +0 -1
- package/dist/src/private-to-private/handler.js +0 -137
- package/dist/src/private-to-private/handler.js.map +0 -1
- package/dist/typedoc-urls.json +0 -6
- package/src/private-to-private/handler.ts +0 -177
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { CodeError } from '@libp2p/interface/errors';
|
|
2
|
+
import { logger } from '@libp2p/logger';
|
|
3
|
+
import { pbStream } from 'it-protobuf-stream';
|
|
4
|
+
import pDefer, {} from 'p-defer';
|
|
5
|
+
import { RTCSessionDescription } from '../webrtc/index.js';
|
|
6
|
+
import { Message } from './pb/message.js';
|
|
7
|
+
import { parseRemoteAddress, readCandidatesUntilConnected, resolveOnConnected } from './util.js';
|
|
8
|
+
const log = logger('libp2p:webrtc:signaling-stream-handler');
|
|
9
|
+
export async function handleIncomingStream({ peerConnection, stream, signal, connection }) {
|
|
10
|
+
log.trace('new inbound signaling stream');
|
|
11
|
+
const messageStream = pbStream(stream).pb(Message);
|
|
12
|
+
try {
|
|
13
|
+
const connectedPromise = pDefer();
|
|
14
|
+
const answerSentPromise = pDefer();
|
|
15
|
+
signal.onabort = () => {
|
|
16
|
+
connectedPromise.reject(new CodeError('Timed out while trying to connect', 'ERR_TIMEOUT'));
|
|
17
|
+
};
|
|
18
|
+
// candidate callbacks
|
|
19
|
+
peerConnection.onicecandidate = ({ candidate }) => {
|
|
20
|
+
answerSentPromise.promise.then(async () => {
|
|
21
|
+
// a null candidate means end-of-candidates, an empty string candidate
|
|
22
|
+
// means end-of-candidates for this generation, otherwise this should
|
|
23
|
+
// be a valid candidate object
|
|
24
|
+
// see - https://www.w3.org/TR/webrtc/#rtcpeerconnectioniceevent
|
|
25
|
+
const data = JSON.stringify(candidate?.toJSON() ?? null);
|
|
26
|
+
log.trace('recipient sending ICE candidate %s', data);
|
|
27
|
+
await messageStream.write({
|
|
28
|
+
type: Message.Type.ICE_CANDIDATE,
|
|
29
|
+
data
|
|
30
|
+
}, {
|
|
31
|
+
signal
|
|
32
|
+
});
|
|
33
|
+
}, (err) => {
|
|
34
|
+
log.error('cannot set candidate since sending answer failed', err);
|
|
35
|
+
connectedPromise.reject(err);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
resolveOnConnected(peerConnection, connectedPromise);
|
|
39
|
+
// read an SDP offer
|
|
40
|
+
const pbOffer = await messageStream.read({
|
|
41
|
+
signal
|
|
42
|
+
});
|
|
43
|
+
if (pbOffer.type !== Message.Type.SDP_OFFER) {
|
|
44
|
+
throw new CodeError(`expected message type SDP_OFFER, received: ${pbOffer.type ?? 'undefined'} `, 'ERR_SDP_HANDSHAKE_FAILED');
|
|
45
|
+
}
|
|
46
|
+
log.trace('recipient receive SDP offer %s', pbOffer.data);
|
|
47
|
+
const offer = new RTCSessionDescription({
|
|
48
|
+
type: 'offer',
|
|
49
|
+
sdp: pbOffer.data
|
|
50
|
+
});
|
|
51
|
+
await peerConnection.setRemoteDescription(offer).catch(err => {
|
|
52
|
+
log.error('could not execute setRemoteDescription', err);
|
|
53
|
+
throw new CodeError('Failed to set remoteDescription', 'ERR_SDP_HANDSHAKE_FAILED');
|
|
54
|
+
});
|
|
55
|
+
// create and write an SDP answer
|
|
56
|
+
const answer = await peerConnection.createAnswer().catch(err => {
|
|
57
|
+
log.error('could not execute createAnswer', err);
|
|
58
|
+
answerSentPromise.reject(err);
|
|
59
|
+
throw new CodeError('Failed to create answer', 'ERR_SDP_HANDSHAKE_FAILED');
|
|
60
|
+
});
|
|
61
|
+
log.trace('recipient send SDP answer %s', answer.sdp);
|
|
62
|
+
// write the answer to the remote
|
|
63
|
+
await messageStream.write({ type: Message.Type.SDP_ANSWER, data: answer.sdp }, {
|
|
64
|
+
signal
|
|
65
|
+
});
|
|
66
|
+
await peerConnection.setLocalDescription(answer).catch(err => {
|
|
67
|
+
log.error('could not execute setLocalDescription', err);
|
|
68
|
+
answerSentPromise.reject(err);
|
|
69
|
+
throw new CodeError('Failed to set localDescription', 'ERR_SDP_HANDSHAKE_FAILED');
|
|
70
|
+
});
|
|
71
|
+
answerSentPromise.resolve();
|
|
72
|
+
log.trace('recipient read candidates until connected');
|
|
73
|
+
// wait until candidates are connected
|
|
74
|
+
await readCandidatesUntilConnected(connectedPromise, peerConnection, messageStream, {
|
|
75
|
+
direction: 'recipient',
|
|
76
|
+
signal
|
|
77
|
+
});
|
|
78
|
+
log.trace('recipient connected, closing signaling stream');
|
|
79
|
+
await messageStream.unwrap().unwrap().close({
|
|
80
|
+
signal
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (peerConnection.connectionState !== 'connected') {
|
|
85
|
+
log.error('error while handling signaling stream from peer %a', connection.remoteAddr, err);
|
|
86
|
+
peerConnection.close();
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
log('error while handling signaling stream from peer %a, ignoring as the RTCPeerConnection is already connected', connection.remoteAddr, err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const remoteAddress = parseRemoteAddress(peerConnection.currentRemoteDescription?.sdp ?? '');
|
|
94
|
+
log.trace('recipient connected to remote address %s', remoteAddress);
|
|
95
|
+
return { remoteAddress };
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=signaling-stream-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signaling-stream-handler.js","sourceRoot":"","sources":["../../../src/private-to-private/signaling-stream-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
import { type CreateListenerOptions, type DialOptions, symbol, type Transport, type Listener, type Upgrader } from '@libp2p/interface/transport';
|
|
2
2
|
import { type Multiaddr } from '@multiformats/multiaddr';
|
|
3
|
-
import type {
|
|
3
|
+
import type { DataChannelOptions } from '../index.js';
|
|
4
4
|
import type { Connection } from '@libp2p/interface/connection';
|
|
5
5
|
import type { PeerId } from '@libp2p/interface/peer-id';
|
|
6
6
|
import type { CounterGroup, Metrics } from '@libp2p/interface/src/metrics/index.js';
|
|
7
7
|
import type { Startable } from '@libp2p/interface/startable';
|
|
8
8
|
import type { IncomingStreamData, Registrar } from '@libp2p/interface-internal/registrar';
|
|
9
|
+
import type { ConnectionManager } from '@libp2p/interface-internal/src/connection-manager/index.js';
|
|
9
10
|
import type { TransportManager } from '@libp2p/interface-internal/transport-manager';
|
|
11
|
+
export declare const SIGNALING_PROTO_ID = "/webrtc-signaling/0.0.1";
|
|
10
12
|
export interface WebRTCTransportInit {
|
|
11
13
|
rtcConfiguration?: RTCConfiguration;
|
|
12
|
-
dataChannel?:
|
|
14
|
+
dataChannel?: DataChannelOptions;
|
|
15
|
+
/**
|
|
16
|
+
* Inbound connections must complete the upgrade within this many ms
|
|
17
|
+
* (default: 30s)
|
|
18
|
+
*/
|
|
19
|
+
inboundConnectionTimeout?: number;
|
|
13
20
|
}
|
|
14
21
|
export interface WebRTCTransportComponents {
|
|
15
22
|
peerId: PeerId;
|
|
16
23
|
registrar: Registrar;
|
|
17
24
|
upgrader: Upgrader;
|
|
18
25
|
transportManager: TransportManager;
|
|
26
|
+
connectionManager: ConnectionManager;
|
|
19
27
|
metrics?: Metrics;
|
|
20
28
|
}
|
|
21
29
|
export interface WebRTCTransportMetrics {
|
|
@@ -27,6 +35,7 @@ export declare class WebRTCTransport implements Transport, Startable {
|
|
|
27
35
|
private readonly init;
|
|
28
36
|
private _started;
|
|
29
37
|
private readonly metrics?;
|
|
38
|
+
private readonly shutdownController;
|
|
30
39
|
constructor(components: WebRTCTransportComponents, init?: WebRTCTransportInit);
|
|
31
40
|
isStarted(): boolean;
|
|
32
41
|
start(): Promise<void>;
|
|
@@ -37,6 +46,7 @@ export declare class WebRTCTransport implements Transport, Startable {
|
|
|
37
46
|
filter(multiaddrs: Multiaddr[]): Multiaddr[];
|
|
38
47
|
dial(ma: Multiaddr, options: DialOptions): Promise<Connection>;
|
|
39
48
|
_onProtocol({ connection, stream }: IncomingStreamData): Promise<void>;
|
|
49
|
+
private _closeOnShutdown;
|
|
40
50
|
}
|
|
41
51
|
export declare function splitAddr(ma: Multiaddr): {
|
|
42
52
|
baseAddr: Multiaddr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,WAAW,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAGhJ,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,WAAW,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAGhJ,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAA;AASnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAA;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AACzF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4DAA4D,CAAA;AACnG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAA;AAMpF,eAAO,MAAM,kBAAkB,4BAA4B,CAAA;AAG3D,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAEhC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,YAAY,CAAA;IAC1B,cAAc,EAAE,YAAY,CAAA;CAC7B;AAED,qBAAa,eAAgB,YAAW,SAAS,EAAE,SAAS;IAMxD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;gBAGjC,UAAU,EAAE,yBAAyB,EACrC,IAAI,GAAE,mBAAwB;IAkBjD,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IASvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAM5B,cAAc,CAAE,OAAO,EAAE,qBAAqB,GAAG,QAAQ;IAMzD,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,oBAAmB;IAEhD,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAO;IAExB,MAAM,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAWvC,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAqC/D,WAAW,CAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC7E,OAAO,CAAC,gBAAgB;CAezB;AAED,wBAAgB,SAAS,CAAE,EAAE,EAAE,SAAS,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA4BjF"}
|
|
@@ -6,21 +6,26 @@ import { multiaddr } from '@multiformats/multiaddr';
|
|
|
6
6
|
import { WebRTC } from '@multiformats/multiaddr-matcher';
|
|
7
7
|
import { codes } from '../error.js';
|
|
8
8
|
import { WebRTCMultiaddrConnection } from '../maconn.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { DataChannelMuxerFactory } from '../muxer.js';
|
|
10
|
+
import { cleanup, RTCPeerConnection } from '../webrtc/index.js';
|
|
11
|
+
import { initiateConnection } from './initiate-connection.js';
|
|
11
12
|
import { WebRTCPeerListener } from './listener.js';
|
|
13
|
+
import { handleIncomingStream } from './signaling-stream-handler.js';
|
|
12
14
|
const log = logger('libp2p:webrtc:peer');
|
|
13
15
|
const WEBRTC_TRANSPORT = '/webrtc';
|
|
14
16
|
const CIRCUIT_RELAY_TRANSPORT = '/p2p-circuit';
|
|
15
|
-
const SIGNALING_PROTO_ID = '/webrtc-signaling/0.0.1';
|
|
17
|
+
export const SIGNALING_PROTO_ID = '/webrtc-signaling/0.0.1';
|
|
18
|
+
const INBOUND_CONNECTION_TIMEOUT = 30 * 1000;
|
|
16
19
|
export class WebRTCTransport {
|
|
17
20
|
components;
|
|
18
21
|
init;
|
|
19
22
|
_started = false;
|
|
20
23
|
metrics;
|
|
24
|
+
shutdownController;
|
|
21
25
|
constructor(components, init = {}) {
|
|
22
26
|
this.components = components;
|
|
23
27
|
this.init = init;
|
|
28
|
+
this.shutdownController = new AbortController();
|
|
24
29
|
if (components.metrics != null) {
|
|
25
30
|
this.metrics = {
|
|
26
31
|
dialerEvents: components.metrics.registerCounterGroup('libp2p_webrtc_dialer_events_total', {
|
|
@@ -51,7 +56,9 @@ export class WebRTCTransport {
|
|
|
51
56
|
this._started = false;
|
|
52
57
|
}
|
|
53
58
|
createListener(options) {
|
|
54
|
-
return new WebRTCPeerListener(this.components
|
|
59
|
+
return new WebRTCPeerListener(this.components, {
|
|
60
|
+
shutdownController: this.shutdownController
|
|
61
|
+
});
|
|
55
62
|
}
|
|
56
63
|
[Symbol.toStringTag] = '@libp2p/webrtc';
|
|
57
64
|
[symbol] = true;
|
|
@@ -66,77 +73,81 @@ export class WebRTCTransport {
|
|
|
66
73
|
* <relay address>/p2p/<relay-peer>/p2p-circuit/webrtc/p2p/<destination-peer>
|
|
67
74
|
*/
|
|
68
75
|
async dial(ma, options) {
|
|
69
|
-
log.trace('dialing address: ', ma);
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
this.metrics?.dialerEvents.increment({ open: true });
|
|
76
|
-
const connection = await this.components.transportManager.dial(baseAddr, options);
|
|
77
|
-
const signalingStream = await connection.newStream(SIGNALING_PROTO_ID, {
|
|
78
|
-
...options,
|
|
79
|
-
runOnTransientConnection: true
|
|
76
|
+
log.trace('dialing address: %a', ma);
|
|
77
|
+
const peerConnection = new RTCPeerConnection(this.init.rtcConfiguration);
|
|
78
|
+
const muxerFactory = new DataChannelMuxerFactory({
|
|
79
|
+
peerConnection,
|
|
80
|
+
dataChannelOptions: this.init.dataChannel
|
|
80
81
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
this.metrics?.dialerEvents.increment({ error: true });
|
|
104
|
-
// reset the stream in case of any error
|
|
105
|
-
signalingStream.abort(err);
|
|
106
|
-
throw err;
|
|
107
|
-
}
|
|
108
|
-
finally {
|
|
109
|
-
// Close the signaling connection
|
|
110
|
-
await connection.close();
|
|
111
|
-
}
|
|
82
|
+
const { remoteAddress } = await initiateConnection({
|
|
83
|
+
peerConnection,
|
|
84
|
+
multiaddr: ma,
|
|
85
|
+
dataChannelOptions: this.init.dataChannel,
|
|
86
|
+
signal: options.signal,
|
|
87
|
+
connectionManager: this.components.connectionManager,
|
|
88
|
+
transportManager: this.components.transportManager
|
|
89
|
+
});
|
|
90
|
+
const webRTCConn = new WebRTCMultiaddrConnection({
|
|
91
|
+
peerConnection,
|
|
92
|
+
timeline: { open: Date.now() },
|
|
93
|
+
remoteAddr: remoteAddress,
|
|
94
|
+
metrics: this.metrics?.dialerEvents
|
|
95
|
+
});
|
|
96
|
+
const connection = await options.upgrader.upgradeOutbound(webRTCConn, {
|
|
97
|
+
skipProtection: true,
|
|
98
|
+
skipEncryption: true,
|
|
99
|
+
muxerFactory
|
|
100
|
+
});
|
|
101
|
+
// close the connection on shut down
|
|
102
|
+
this._closeOnShutdown(peerConnection, webRTCConn);
|
|
103
|
+
return connection;
|
|
112
104
|
}
|
|
113
105
|
async _onProtocol({ connection, stream }) {
|
|
106
|
+
const signal = AbortSignal.timeout(this.init.inboundConnectionTimeout ?? INBOUND_CONNECTION_TIMEOUT);
|
|
107
|
+
const peerConnection = new RTCPeerConnection(this.init.rtcConfiguration);
|
|
108
|
+
const muxerFactory = new DataChannelMuxerFactory({ peerConnection, dataChannelOptions: this.init.dataChannel });
|
|
114
109
|
try {
|
|
115
|
-
const {
|
|
116
|
-
|
|
110
|
+
const { remoteAddress } = await handleIncomingStream({
|
|
111
|
+
peerConnection,
|
|
117
112
|
connection,
|
|
118
113
|
stream,
|
|
119
|
-
|
|
114
|
+
signal
|
|
120
115
|
});
|
|
121
|
-
|
|
122
|
-
peerConnection
|
|
116
|
+
const webRTCConn = new WebRTCMultiaddrConnection({
|
|
117
|
+
peerConnection,
|
|
123
118
|
timeline: { open: (new Date()).getTime() },
|
|
124
119
|
remoteAddr: multiaddr(remoteAddress).encapsulate(`/p2p/${connection.remotePeer.toString()}`),
|
|
125
120
|
metrics: this.metrics?.listenerEvents
|
|
126
|
-
})
|
|
121
|
+
});
|
|
122
|
+
// close the connection on shut down
|
|
123
|
+
this._closeOnShutdown(peerConnection, webRTCConn);
|
|
124
|
+
await this.components.upgrader.upgradeInbound(webRTCConn, {
|
|
127
125
|
skipEncryption: true,
|
|
128
126
|
skipProtection: true,
|
|
129
127
|
muxerFactory
|
|
130
128
|
});
|
|
129
|
+
// close the stream if SDP messages have been exchanged successfully
|
|
130
|
+
await stream.close({
|
|
131
|
+
signal
|
|
132
|
+
});
|
|
131
133
|
}
|
|
132
134
|
catch (err) {
|
|
133
135
|
stream.abort(err);
|
|
134
136
|
throw err;
|
|
135
137
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
}
|
|
139
|
+
_closeOnShutdown(pc, webRTCConn) {
|
|
140
|
+
// close the connection on shut down
|
|
141
|
+
const shutDownListener = () => {
|
|
142
|
+
webRTCConn.close()
|
|
143
|
+
.catch(err => {
|
|
144
|
+
log.error('could not close WebRTCMultiaddrConnection', err);
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
this.shutdownController.signal.addEventListener('abort', shutDownListener);
|
|
148
|
+
pc.addEventListener('close', () => {
|
|
149
|
+
this.shutdownController.signal.removeEventListener('abort', shutDownListener);
|
|
150
|
+
});
|
|
140
151
|
}
|
|
141
152
|
}
|
|
142
153
|
export function splitAddr(ma) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-private/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAgD,MAAM,EAAgD,MAAM,6BAA6B,CAAA;AAChJ,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAkB,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-private/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Message } from './pb/message.js';
|
|
2
|
+
import type { Stream } from '@libp2p/interface/connection';
|
|
3
|
+
import type { AbortOptions, MessageStream } from 'it-protobuf-stream';
|
|
2
4
|
import type { DeferredPromise } from 'p-defer';
|
|
3
|
-
interface
|
|
4
|
-
|
|
5
|
-
write: (d: Message) => void | Promise<void>;
|
|
5
|
+
export interface ReadCandidatesOptions extends AbortOptions {
|
|
6
|
+
direction: string;
|
|
6
7
|
}
|
|
7
|
-
export declare const readCandidatesUntilConnected: (connectedPromise: DeferredPromise<void>, pc: RTCPeerConnection, stream: MessageStream) => Promise<void>;
|
|
8
|
+
export declare const readCandidatesUntilConnected: (connectedPromise: DeferredPromise<void>, pc: RTCPeerConnection, stream: MessageStream<Message, Stream>, options: ReadCandidatesOptions) => Promise<void>;
|
|
8
9
|
export declare function resolveOnConnected(pc: RTCPeerConnection, promise: DeferredPromise<void>): void;
|
|
9
|
-
export
|
|
10
|
+
export declare function parseRemoteAddress(sdp: string): string;
|
|
10
11
|
//# sourceMappingURL=util.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9C,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,4BAA4B,qBAA4B,gBAAgB,IAAI,CAAC,MAAM,iBAAiB,UAAU,cAAc,OAAO,EAAE,MAAM,CAAC,WAAW,qBAAqB,KAAG,QAAQ,IAAI,CA0EvM,CAAA;AAED,wBAAgB,kBAAkB,CAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAgB/F;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWvD"}
|
|
@@ -1,41 +1,82 @@
|
|
|
1
|
+
import { CodeError } from '@libp2p/interface/errors';
|
|
1
2
|
import { logger } from '@libp2p/logger';
|
|
3
|
+
import { abortableSource } from 'abortable-iterator';
|
|
4
|
+
import { anySignal } from 'any-signal';
|
|
5
|
+
import * as lp from 'it-length-prefixed';
|
|
6
|
+
import { AbortError, raceSignal } from 'race-signal';
|
|
2
7
|
import { isFirefox } from '../util.js';
|
|
3
8
|
import { RTCIceCandidate } from '../webrtc/index.js';
|
|
4
9
|
import { Message } from './pb/message.js';
|
|
5
10
|
const log = logger('libp2p:webrtc:peer:util');
|
|
6
|
-
export const readCandidatesUntilConnected = async (connectedPromise, pc, stream) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
export const readCandidatesUntilConnected = async (connectedPromise, pc, stream, options) => {
|
|
12
|
+
// if we connect, stop trying to read from the stream
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
connectedPromise.promise.then(() => {
|
|
15
|
+
controller.abort();
|
|
16
|
+
}, () => {
|
|
17
|
+
controller.abort();
|
|
18
|
+
});
|
|
19
|
+
const signal = anySignal([
|
|
20
|
+
controller.signal,
|
|
21
|
+
options.signal
|
|
22
|
+
]);
|
|
23
|
+
const source = abortableSource(stream.unwrap().unwrap().source, signal, {
|
|
24
|
+
returnOnAbort: true
|
|
25
|
+
});
|
|
26
|
+
try {
|
|
27
|
+
// read candidates until we are connected or we reach the end of the stream
|
|
28
|
+
for await (const buf of lp.decode(source)) {
|
|
29
|
+
const message = Message.decode(buf);
|
|
12
30
|
if (message.type !== Message.Type.ICE_CANDIDATE) {
|
|
13
|
-
throw new
|
|
31
|
+
throw new CodeError('ICE candidate message expected', 'ERR_NOT_ICE_CANDIDATE');
|
|
14
32
|
}
|
|
15
|
-
|
|
16
|
-
if (
|
|
33
|
+
let candidateInit = JSON.parse(message.data ?? 'null');
|
|
34
|
+
if (candidateInit === '') {
|
|
35
|
+
log.trace('end-of-candidates for this generation received');
|
|
36
|
+
candidateInit = {
|
|
37
|
+
candidate: '',
|
|
38
|
+
sdpMid: '0',
|
|
39
|
+
sdpMLineIndex: 0
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (candidateInit === null) {
|
|
17
43
|
log.trace('end-of-candidates received');
|
|
18
|
-
|
|
44
|
+
candidateInit = {
|
|
45
|
+
candidate: null,
|
|
46
|
+
sdpMid: '0',
|
|
47
|
+
sdpMLineIndex: 0
|
|
48
|
+
};
|
|
19
49
|
}
|
|
20
|
-
|
|
50
|
+
// a null candidate means end-of-candidates
|
|
51
|
+
// see - https://www.w3.org/TR/webrtc/#rtcpeerconnectioniceevent
|
|
52
|
+
const candidate = new RTCIceCandidate(candidateInit);
|
|
53
|
+
log.trace('%s received new ICE candidate', options.direction, candidate);
|
|
21
54
|
try {
|
|
22
|
-
await pc.addIceCandidate(
|
|
55
|
+
await pc.addIceCandidate(candidate);
|
|
23
56
|
}
|
|
24
57
|
catch (err) {
|
|
25
|
-
log.error('bad candidate received
|
|
26
|
-
throw new Error('bad candidate received');
|
|
58
|
+
log.error('%s bad candidate received', options.direction, err);
|
|
27
59
|
}
|
|
28
60
|
}
|
|
29
|
-
else {
|
|
30
|
-
// connected promise resolved
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
61
|
}
|
|
34
|
-
|
|
62
|
+
catch (err) {
|
|
63
|
+
log.error('%s error parsing ICE candidate', options.direction, err);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
signal.clear();
|
|
67
|
+
}
|
|
68
|
+
if (options.signal?.aborted === true) {
|
|
69
|
+
throw new AbortError('Aborted while reading ICE candidates', 'ERR_ICE_CANDIDATES_READ_ABORTED');
|
|
70
|
+
}
|
|
71
|
+
// read all available ICE candidates, wait for connection state change
|
|
72
|
+
await raceSignal(connectedPromise.promise, options.signal, {
|
|
73
|
+
errorMessage: 'Aborted before connected',
|
|
74
|
+
errorCode: 'ERR_ABORTED_BEFORE_CONNECTED'
|
|
75
|
+
});
|
|
35
76
|
};
|
|
36
77
|
export function resolveOnConnected(pc, promise) {
|
|
37
78
|
pc[isFirefox ? 'oniceconnectionstatechange' : 'onconnectionstatechange'] = (_) => {
|
|
38
|
-
log.trace('receiver peerConnectionState state: ', pc.connectionState);
|
|
79
|
+
log.trace('receiver peerConnectionState state change: %s', pc.connectionState);
|
|
39
80
|
switch (isFirefox ? pc.iceConnectionState : pc.connectionState) {
|
|
40
81
|
case 'connected':
|
|
41
82
|
promise.resolve();
|
|
@@ -43,11 +84,21 @@ export function resolveOnConnected(pc, promise) {
|
|
|
43
84
|
case 'failed':
|
|
44
85
|
case 'disconnected':
|
|
45
86
|
case 'closed':
|
|
46
|
-
promise.reject(new
|
|
87
|
+
promise.reject(new CodeError('RTCPeerConnection was closed', 'ERR_CONNECTION_CLOSED_BEFORE_CONNECTED'));
|
|
47
88
|
break;
|
|
48
89
|
default:
|
|
49
90
|
break;
|
|
50
91
|
}
|
|
51
92
|
};
|
|
52
93
|
}
|
|
94
|
+
export function parseRemoteAddress(sdp) {
|
|
95
|
+
// 'a=candidate:1746876089 1 udp 2113937151 0614fbad-b...ocal 54882 typ host generation 0 network-cost 999'
|
|
96
|
+
const candidateLine = sdp.split('\r\n').filter(line => line.startsWith('a=candidate')).pop();
|
|
97
|
+
const candidateParts = candidateLine?.split(' ');
|
|
98
|
+
if (candidateLine == null || candidateParts == null || candidateParts.length < 5) {
|
|
99
|
+
log('could not parse remote address from', candidateLine);
|
|
100
|
+
return '/webrtc';
|
|
101
|
+
}
|
|
102
|
+
return `/dnsaddr/${candidateParts[4]}/${candidateParts[2].toLowerCase()}/${candidateParts[5]}/webrtc`;
|
|
103
|
+
}
|
|
53
104
|
//# sourceMappingURL=util.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type CreateListenerOptions, symbol, type Transport, type Listener } from '@libp2p/interface/transport';
|
|
2
2
|
import type { WebRTCDialOptions } from './options.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { DataChannelOptions } from '../index.js';
|
|
4
4
|
import type { Connection } from '@libp2p/interface/connection';
|
|
5
5
|
import type { CounterGroup, Metrics } from '@libp2p/interface/metrics';
|
|
6
6
|
import type { PeerId } from '@libp2p/interface/peer-id';
|
|
@@ -28,7 +28,7 @@ export interface WebRTCMetrics {
|
|
|
28
28
|
dialerEvents: CounterGroup;
|
|
29
29
|
}
|
|
30
30
|
export interface WebRTCTransportDirectInit {
|
|
31
|
-
dataChannel?:
|
|
31
|
+
dataChannel?: DataChannelOptions;
|
|
32
32
|
}
|
|
33
33
|
export declare class WebRTCDirectTransport implements Transport {
|
|
34
34
|
private readonly metrics?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAgB/G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAgB/G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AASxD;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MAAwC,CAAA;AAElE;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAmC,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,qBAAa,qBAAsB,YAAW,SAAS;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;gBACnC,UAAU,EAAE,+BAA+B,EAAE,IAAI,GAAE,yBAA8B;IAa9F;;OAEG;IACG,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAM3E;;OAEG;IACH,cAAc,CAAE,OAAO,EAAE,qBAAqB,GAAG,QAAQ;IAIzD;;OAEG;IACH,MAAM,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAI7C;;OAEG;IACH,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,2BAA0B;IAEvD;;OAEG;IACH,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAO;IAExB;;OAEG;IACG,QAAQ,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6I/E;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAkB9B"}
|
|
@@ -53,7 +53,7 @@ export class WebRTCDirectTransport {
|
|
|
53
53
|
*/
|
|
54
54
|
async dial(ma, options) {
|
|
55
55
|
const rawConn = await this._connect(ma, options);
|
|
56
|
-
log(
|
|
56
|
+
log('dialing address: %a', ma);
|
|
57
57
|
return rawConn;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
@@ -146,7 +146,7 @@ export class WebRTCDirectTransport {
|
|
|
146
146
|
// Since we use the default crypto interface and do not use a static key or early data,
|
|
147
147
|
// we pass in undefined for these parameters.
|
|
148
148
|
const noise = Noise({ prologueBytes: fingerprintsPrologue })();
|
|
149
|
-
const wrappedChannel = createStream({ channel: handshakeDataChannel, direction: 'inbound',
|
|
149
|
+
const wrappedChannel = createStream({ channel: handshakeDataChannel, direction: 'inbound', ...(this.init.dataChannel ?? {}) });
|
|
150
150
|
const wrappedDuplex = {
|
|
151
151
|
...wrappedChannel,
|
|
152
152
|
sink: wrappedChannel.sink.bind(wrappedChannel),
|