@libp2p/webrtc 3.2.10 → 3.2.11-0b4a2ee79
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/README.md +1 -1
- package/dist/index.min.js +12 -12
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/maconn.d.ts +6 -1
- package/dist/src/maconn.d.ts.map +1 -1
- package/dist/src/maconn.js +6 -6
- package/dist/src/maconn.js.map +1 -1
- package/dist/src/muxer.d.ts +13 -2
- package/dist/src/muxer.d.ts.map +1 -1
- package/dist/src/muxer.js +36 -7
- package/dist/src/muxer.js.map +1 -1
- package/dist/src/private-to-private/initiate-connection.d.ts +3 -2
- package/dist/src/private-to-private/initiate-connection.d.ts.map +1 -1
- package/dist/src/private-to-private/initiate-connection.js +3 -4
- package/dist/src/private-to-private/initiate-connection.js.map +1 -1
- package/dist/src/private-to-private/signaling-stream-handler.d.ts +3 -1
- package/dist/src/private-to-private/signaling-stream-handler.d.ts.map +1 -1
- package/dist/src/private-to-private/signaling-stream-handler.js +3 -4
- package/dist/src/private-to-private/signaling-stream-handler.js.map +1 -1
- package/dist/src/private-to-private/transport.d.ts +3 -0
- package/dist/src/private-to-private/transport.d.ts.map +1 -1
- package/dist/src/private-to-private/transport.js +13 -11
- package/dist/src/private-to-private/transport.js.map +1 -1
- package/dist/src/private-to-private/util.d.ts +2 -1
- package/dist/src/private-to-private/util.d.ts.map +1 -1
- package/dist/src/private-to-private/util.js +25 -40
- package/dist/src/private-to-private/util.js.map +1 -1
- package/dist/src/private-to-public/sdp.d.ts +2 -1
- package/dist/src/private-to-public/sdp.d.ts.map +1 -1
- package/dist/src/private-to-public/sdp.js +3 -6
- package/dist/src/private-to-public/sdp.js.map +1 -1
- package/dist/src/private-to-public/transport.d.ts +3 -0
- package/dist/src/private-to-public/transport.d.ts.map +1 -1
- package/dist/src/private-to-public/transport.js +21 -10
- package/dist/src/private-to-public/transport.js.map +1 -1
- package/dist/src/stream.d.ts +10 -3
- package/dist/src/stream.d.ts.map +1 -1
- package/dist/src/stream.js +18 -32
- package/dist/src/stream.js.map +1 -1
- package/dist/src/util.d.ts +2 -1
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +4 -6
- package/dist/src/util.js.map +1 -1
- package/package.json +21 -20
- package/src/index.ts +6 -0
- package/src/maconn.ts +12 -7
- package/src/muxer.ts +57 -8
- package/src/private-to-private/initiate-connection.ts +5 -6
- package/src/private-to-private/signaling-stream-handler.ts +5 -5
- package/src/private-to-private/transport.ts +15 -12
- package/src/private-to-private/util.ts +29 -44
- package/src/private-to-public/sdp.ts +4 -8
- package/src/private-to-public/transport.ts +23 -11
- package/src/stream.ts +26 -37
- package/src/util.ts +5 -7
- package/dist/typedoc-urls.json +0 -8
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-private/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Message } from './pb/message.js';
|
|
2
|
+
import type { LoggerOptions } from '@libp2p/interface';
|
|
2
3
|
import type { Stream } from '@libp2p/interface/connection';
|
|
3
4
|
import type { AbortOptions, MessageStream } from 'it-protobuf-stream';
|
|
4
5
|
import type { DeferredPromise } from 'p-defer';
|
|
5
|
-
export interface ReadCandidatesOptions extends AbortOptions {
|
|
6
|
+
export interface ReadCandidatesOptions extends AbortOptions, LoggerOptions {
|
|
6
7
|
direction: string;
|
|
7
8
|
}
|
|
8
9
|
export declare const readCandidatesUntilConnected: (connectedPromise: DeferredPromise<void>, pc: RTCPeerConnection, stream: MessageStream<Message, Stream>, options: ReadCandidatesOptions) => Promise<void>;
|
|
@@ -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":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,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;AAE9C,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa;IACxE,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,CAgEvM,CAAA;AAED,wBAAgB,kBAAkB,CAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAe/F"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors';
|
|
2
|
-
import {
|
|
3
|
-
import { abortableSource } from 'abortable-iterator';
|
|
2
|
+
import { closeSource } from '@libp2p/utils/close-source';
|
|
4
3
|
import { anySignal } from 'any-signal';
|
|
5
|
-
import * as lp from 'it-length-prefixed';
|
|
6
|
-
import { AbortError, raceSignal } from 'race-signal';
|
|
7
4
|
import { isFirefox } from '../util.js';
|
|
8
5
|
import { RTCIceCandidate } from '../webrtc/index.js';
|
|
9
6
|
import { Message } from './pb/message.js';
|
|
10
|
-
const log = logger('libp2p:webrtc:peer:util');
|
|
11
7
|
export const readCandidatesUntilConnected = async (connectedPromise, pc, stream, options) => {
|
|
12
8
|
// if we connect, stop trying to read from the stream
|
|
13
9
|
const controller = new AbortController();
|
|
@@ -20,63 +16,52 @@ export const readCandidatesUntilConnected = async (connectedPromise, pc, stream,
|
|
|
20
16
|
controller.signal,
|
|
21
17
|
options.signal
|
|
22
18
|
]);
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
}
|
|
19
|
+
const abortListener = () => {
|
|
20
|
+
closeSource(stream.unwrap().unwrap().source, options.log);
|
|
21
|
+
};
|
|
22
|
+
signal.addEventListener('abort', abortListener);
|
|
26
23
|
try {
|
|
27
24
|
// read candidates until we are connected or we reach the end of the stream
|
|
28
|
-
|
|
29
|
-
const message =
|
|
25
|
+
while (true) {
|
|
26
|
+
const message = await Promise.race([
|
|
27
|
+
connectedPromise.promise,
|
|
28
|
+
stream.read()
|
|
29
|
+
]);
|
|
30
|
+
// stream ended or we became connected
|
|
31
|
+
if (message == null) {
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
30
34
|
if (message.type !== Message.Type.ICE_CANDIDATE) {
|
|
31
35
|
throw new CodeError('ICE candidate message expected', 'ERR_NOT_ICE_CANDIDATE');
|
|
32
36
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
candidateInit = {
|
|
37
|
-
candidate: '',
|
|
38
|
-
sdpMid: '0',
|
|
39
|
-
sdpMLineIndex: 0
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
if (candidateInit === null) {
|
|
43
|
-
log.trace('end-of-candidates received');
|
|
44
|
-
candidateInit = {
|
|
45
|
-
candidate: null,
|
|
46
|
-
sdpMid: '0',
|
|
47
|
-
sdpMLineIndex: 0
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
// a null candidate means end-of-candidates
|
|
37
|
+
const candidateInit = JSON.parse(message.data ?? 'null');
|
|
38
|
+
// an empty string means this generation of candidates is complete, a null
|
|
39
|
+
// candidate means candidate gathering has finished
|
|
51
40
|
// see - https://www.w3.org/TR/webrtc/#rtcpeerconnectioniceevent
|
|
41
|
+
if (candidateInit === '' || candidateInit === null) {
|
|
42
|
+
options.log.trace('end-of-candidates received');
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
52
45
|
const candidate = new RTCIceCandidate(candidateInit);
|
|
53
|
-
log.trace('%s received new ICE candidate', options.direction, candidate);
|
|
46
|
+
options.log.trace('%s received new ICE candidate', options.direction, candidate);
|
|
54
47
|
try {
|
|
55
48
|
await pc.addIceCandidate(candidate);
|
|
56
49
|
}
|
|
57
50
|
catch (err) {
|
|
58
|
-
log.error('%s bad candidate received', options.direction, err);
|
|
51
|
+
options.log.error('%s bad candidate received', options.direction, candidateInit, err);
|
|
59
52
|
}
|
|
60
53
|
}
|
|
61
54
|
}
|
|
62
55
|
catch (err) {
|
|
63
|
-
log.error('%s error parsing ICE candidate', options.direction, err);
|
|
56
|
+
options.log.error('%s error parsing ICE candidate', options.direction, err);
|
|
64
57
|
}
|
|
65
58
|
finally {
|
|
59
|
+
signal.removeEventListener('abort', abortListener);
|
|
66
60
|
signal.clear();
|
|
67
61
|
}
|
|
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
|
-
});
|
|
76
62
|
};
|
|
77
63
|
export function resolveOnConnected(pc, promise) {
|
|
78
64
|
pc[isFirefox ? 'oniceconnectionstatechange' : 'onconnectionstatechange'] = (_) => {
|
|
79
|
-
log.trace('receiver peerConnectionState state change: %s', pc.connectionState);
|
|
80
65
|
switch (isFirefox ? pc.iceConnectionState : pc.connectionState) {
|
|
81
66
|
case 'connected':
|
|
82
67
|
promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import * as multihashes from 'multihashes';
|
|
2
|
+
import type { LoggerOptions } from '@libp2p/interface';
|
|
2
3
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
3
4
|
import type { HashCode, HashName } from 'multihashes';
|
|
4
5
|
/**
|
|
5
6
|
* Get base2 | identity decoders
|
|
6
7
|
*/
|
|
7
8
|
export declare const mbdecoder: any;
|
|
8
|
-
export declare function getLocalFingerprint(pc: RTCPeerConnection): string | undefined;
|
|
9
|
+
export declare function getLocalFingerprint(pc: RTCPeerConnection, options: LoggerOptions): string | undefined;
|
|
9
10
|
export declare function getFingerprintFromSdp(sdp: string): string | undefined;
|
|
10
11
|
export declare function certhash(ma: Multiaddr): string;
|
|
11
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdp.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/sdp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sdp.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/sdp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,WAAW,MAAM,aAAa,CAAA;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAErD;;GAEG;AAEH,eAAO,MAAM,SAAS,EAAE,GAAwE,CAAA;AAEhG,wBAAgB,mBAAmB,CAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAwBtG;AAGD,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE;AAeD,wBAAgB,QAAQ,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAGxH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAWvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,MAAM,CAW3E;AA2BD;;GAEG;AACH,wBAAgB,aAAa,CAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAKtF;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAShG"}
|
|
@@ -1,26 +1,24 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger';
|
|
2
1
|
import { bases } from 'multiformats/basics';
|
|
3
2
|
import * as multihashes from 'multihashes';
|
|
4
3
|
import { inappropriateMultiaddr, invalidArgument, invalidFingerprint, unsupportedHashAlgorithm } from '../error.js';
|
|
5
4
|
import { CERTHASH_CODE } from './transport.js';
|
|
6
|
-
const log = logger('libp2p:webrtc:sdp');
|
|
7
5
|
/**
|
|
8
6
|
* Get base2 | identity decoders
|
|
9
7
|
*/
|
|
10
8
|
// @ts-expect-error - Not easy to combine these types.
|
|
11
9
|
export const mbdecoder = Object.values(bases).map(b => b.decoder).reduce((d, b) => d.or(b));
|
|
12
|
-
export function getLocalFingerprint(pc) {
|
|
10
|
+
export function getLocalFingerprint(pc, options) {
|
|
13
11
|
// try to fetch fingerprint from local certificate
|
|
14
12
|
const localCert = pc.getConfiguration().certificates?.at(0);
|
|
15
13
|
if (localCert == null || localCert.getFingerprints == null) {
|
|
16
|
-
log.trace('fetching fingerprint from local SDP');
|
|
14
|
+
options.log.trace('fetching fingerprint from local SDP');
|
|
17
15
|
const localDescription = pc.localDescription;
|
|
18
16
|
if (localDescription == null) {
|
|
19
17
|
return undefined;
|
|
20
18
|
}
|
|
21
19
|
return getFingerprintFromSdp(localDescription.sdp);
|
|
22
20
|
}
|
|
23
|
-
log.trace('fetching fingerprint from local certificate');
|
|
21
|
+
options.log.trace('fetching fingerprint from local certificate');
|
|
24
22
|
if (localCert.getFingerprints().length === 0) {
|
|
25
23
|
return undefined;
|
|
26
24
|
}
|
|
@@ -44,7 +42,6 @@ function ipv(ma) {
|
|
|
44
42
|
return proto.toUpperCase();
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
|
-
log('Warning: multiaddr does not appear to contain IP4 or IP6, defaulting to IP6', ma);
|
|
48
45
|
return 'IP6';
|
|
49
46
|
}
|
|
50
47
|
// Extract the certhash from a multiaddr
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/private-to-public/sdp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/private-to-public/sdp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type CreateListenerOptions, symbol, type Transport, type Listener } from '@libp2p/interface/transport';
|
|
2
2
|
import type { WebRTCDialOptions } from './options.js';
|
|
3
3
|
import type { DataChannelOptions } from '../index.js';
|
|
4
|
+
import type { ComponentLogger } from '@libp2p/interface';
|
|
4
5
|
import type { Connection } from '@libp2p/interface/connection';
|
|
5
6
|
import type { CounterGroup, Metrics } from '@libp2p/interface/metrics';
|
|
6
7
|
import type { PeerId } from '@libp2p/interface/peer-id';
|
|
@@ -23,6 +24,7 @@ export declare const CERTHASH_CODE: number;
|
|
|
23
24
|
export interface WebRTCDirectTransportComponents {
|
|
24
25
|
peerId: PeerId;
|
|
25
26
|
metrics?: Metrics;
|
|
27
|
+
logger: ComponentLogger;
|
|
26
28
|
}
|
|
27
29
|
export interface WebRTCMetrics {
|
|
28
30
|
dialerEvents: CounterGroup;
|
|
@@ -31,6 +33,7 @@ export interface WebRTCTransportDirectInit {
|
|
|
31
33
|
dataChannel?: DataChannelOptions;
|
|
32
34
|
}
|
|
33
35
|
export declare class WebRTCDirectTransport implements Transport {
|
|
36
|
+
private readonly log;
|
|
34
37
|
private readonly metrics?;
|
|
35
38
|
private readonly components;
|
|
36
39
|
private readonly init;
|
|
@@ -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;
|
|
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;AAe/G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAChE,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;AAOxD;;;;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;IACjB,MAAM,EAAE,eAAe,CAAA;CACxB;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,GAAG,CAAQ;IAC5B,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;IAc9F;;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;IAsJ/E;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAoB9B"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { noise as Noise } from '@chainsafe/libp2p-noise';
|
|
2
2
|
import { symbol } from '@libp2p/interface/transport';
|
|
3
|
-
import { logger } from '@libp2p/logger';
|
|
4
3
|
import * as p from '@libp2p/peer-id';
|
|
5
4
|
import { protocols } from '@multiformats/multiaddr';
|
|
6
5
|
import { WebRTCDirect } from '@multiformats/multiaddr-matcher';
|
|
@@ -15,7 +14,6 @@ import { isFirefox } from '../util.js';
|
|
|
15
14
|
import { RTCPeerConnection } from '../webrtc/index.js';
|
|
16
15
|
import * as sdp from './sdp.js';
|
|
17
16
|
import { genUfrag } from './util.js';
|
|
18
|
-
const log = logger('libp2p:webrtc:transport');
|
|
19
17
|
/**
|
|
20
18
|
* The time to wait, in milliseconds, for the data channel handshake to complete
|
|
21
19
|
*/
|
|
@@ -33,10 +31,12 @@ export const WEBRTC_CODE = protocols('webrtc-direct').code;
|
|
|
33
31
|
*/
|
|
34
32
|
export const CERTHASH_CODE = protocols('certhash').code;
|
|
35
33
|
export class WebRTCDirectTransport {
|
|
34
|
+
log;
|
|
36
35
|
metrics;
|
|
37
36
|
components;
|
|
38
37
|
init;
|
|
39
38
|
constructor(components, init = {}) {
|
|
39
|
+
this.log = components.logger.forComponent('libp2p:webrtc-direct');
|
|
40
40
|
this.components = components;
|
|
41
41
|
this.init = init;
|
|
42
42
|
if (components.metrics != null) {
|
|
@@ -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('dialing address: %a', ma);
|
|
56
|
+
this.log('dialing address: %a', ma);
|
|
57
57
|
return rawConn;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
@@ -106,7 +106,7 @@ export class WebRTCDirectTransport {
|
|
|
106
106
|
const handshakeDataChannel = peerConnection.createDataChannel('', { negotiated: true, id: 0 });
|
|
107
107
|
const handshakeTimeout = setTimeout(() => {
|
|
108
108
|
const error = `Data channel was never opened: state: ${handshakeDataChannel.readyState}`;
|
|
109
|
-
log.error(error);
|
|
109
|
+
this.log.error(error);
|
|
110
110
|
this.metrics?.dialerEvents.increment({ open_error: true });
|
|
111
111
|
reject(dataChannelError('data', error));
|
|
112
112
|
}, HANDSHAKE_TIMEOUT_MS);
|
|
@@ -119,7 +119,7 @@ export class WebRTCDirectTransport {
|
|
|
119
119
|
clearTimeout(handshakeTimeout);
|
|
120
120
|
const errorTarget = event.target?.toString() ?? 'not specified';
|
|
121
121
|
const error = `Error opening a data channel for handshaking: ${errorTarget}`;
|
|
122
|
-
log.error(error);
|
|
122
|
+
this.log.error(error);
|
|
123
123
|
// NOTE: We use unknown error here but this could potentially be considered a reset by some standards.
|
|
124
124
|
this.metrics?.dialerEvents.increment({ unknown_error: true });
|
|
125
125
|
reject(dataChannelError('data', error));
|
|
@@ -146,7 +146,12 @@ 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({
|
|
149
|
+
const wrappedChannel = createStream({
|
|
150
|
+
channel: handshakeDataChannel,
|
|
151
|
+
direction: 'inbound',
|
|
152
|
+
logger: this.components.logger,
|
|
153
|
+
...(this.init.dataChannel ?? {})
|
|
154
|
+
});
|
|
150
155
|
const wrappedDuplex = {
|
|
151
156
|
...wrappedChannel,
|
|
152
157
|
sink: wrappedChannel.sink.bind(wrappedChannel),
|
|
@@ -160,7 +165,7 @@ export class WebRTCDirectTransport {
|
|
|
160
165
|
};
|
|
161
166
|
// Creating the connection before completion of the noise
|
|
162
167
|
// handshake ensures that the stream opening callback is set up
|
|
163
|
-
const maConn = new WebRTCMultiaddrConnection({
|
|
168
|
+
const maConn = new WebRTCMultiaddrConnection(this.components, {
|
|
164
169
|
peerConnection,
|
|
165
170
|
remoteAddr: ma,
|
|
166
171
|
timeline: {
|
|
@@ -175,7 +180,7 @@ export class WebRTCDirectTransport {
|
|
|
175
180
|
case 'disconnected':
|
|
176
181
|
case 'closed':
|
|
177
182
|
maConn.close().catch((err) => {
|
|
178
|
-
log.error('error closing connection', err);
|
|
183
|
+
this.log.error('error closing connection', err);
|
|
179
184
|
}).finally(() => {
|
|
180
185
|
// Remove the event listener once the connection is closed
|
|
181
186
|
controller.abort();
|
|
@@ -187,7 +192,11 @@ export class WebRTCDirectTransport {
|
|
|
187
192
|
}, { signal });
|
|
188
193
|
// Track opened peer connection
|
|
189
194
|
this.metrics?.dialerEvents.increment({ peer_connection: true });
|
|
190
|
-
const muxerFactory = new DataChannelMuxerFactory(
|
|
195
|
+
const muxerFactory = new DataChannelMuxerFactory(this.components, {
|
|
196
|
+
peerConnection,
|
|
197
|
+
metrics: this.metrics?.dialerEvents,
|
|
198
|
+
dataChannelOptions: this.init.dataChannel
|
|
199
|
+
});
|
|
191
200
|
// For outbound connections, the remote is expected to start the noise handshake.
|
|
192
201
|
// Therefore, we need to secure an inbound noise connection from the remote.
|
|
193
202
|
await noise.secureInbound(myPeerId, wrappedDuplex, theirPeerId);
|
|
@@ -206,7 +215,9 @@ export class WebRTCDirectTransport {
|
|
|
206
215
|
if (pc.getConfiguration().certificates?.length === 0) {
|
|
207
216
|
throw invalidArgument('no local certificate');
|
|
208
217
|
}
|
|
209
|
-
const localFingerprint = sdp.getLocalFingerprint(pc
|
|
218
|
+
const localFingerprint = sdp.getLocalFingerprint(pc, {
|
|
219
|
+
log: this.log
|
|
220
|
+
});
|
|
210
221
|
if (localFingerprint == null) {
|
|
211
222
|
throw invalidArgument('no local fingerprint found');
|
|
212
223
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAA8B,MAAM,EAAiC,MAAM,6BAA6B,CAAA;AAC/G,OAAO,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/src/stream.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AbstractStream, type AbstractStreamInit } from '@libp2p/
|
|
1
|
+
import { AbstractStream, type AbstractStreamInit } from '@libp2p/utils/abstract-stream';
|
|
2
2
|
import { Uint8ArrayList } from 'uint8arraylist';
|
|
3
3
|
import type { DataChannelOptions } from './index.js';
|
|
4
|
-
import type { AbortOptions } from '@libp2p/interface';
|
|
4
|
+
import type { AbortOptions, ComponentLogger } from '@libp2p/interface';
|
|
5
5
|
import type { Direction } from '@libp2p/interface/connection';
|
|
6
6
|
export interface WebRTCStreamInit extends AbstractStreamInit, DataChannelOptions {
|
|
7
7
|
/**
|
|
@@ -11,6 +11,7 @@ export interface WebRTCStreamInit extends AbstractStreamInit, DataChannelOptions
|
|
|
11
11
|
* {@link https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel}
|
|
12
12
|
*/
|
|
13
13
|
channel: RTCDataChannel;
|
|
14
|
+
logger: ComponentLogger;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* How much can be buffered to the DataChannel at once
|
|
@@ -38,6 +39,11 @@ export declare const MAX_MESSAGE_SIZE: number;
|
|
|
38
39
|
* we close the stream anyway.
|
|
39
40
|
*/
|
|
40
41
|
export declare const FIN_ACK_TIMEOUT = 5000;
|
|
42
|
+
/**
|
|
43
|
+
* When sending data messages, if the channel is not in the "open" state, wait
|
|
44
|
+
* this long for the "open" event to fire.
|
|
45
|
+
*/
|
|
46
|
+
export declare const OPEN_TIMEOUT = 5000;
|
|
41
47
|
export declare class WebRTCStream extends AbstractStream {
|
|
42
48
|
/**
|
|
43
49
|
* The data channel used to send and receive data
|
|
@@ -48,7 +54,6 @@ export declare class WebRTCStream extends AbstractStream {
|
|
|
48
54
|
* and then the protobuf decoder.
|
|
49
55
|
*/
|
|
50
56
|
private readonly incomingData;
|
|
51
|
-
private messageQueue?;
|
|
52
57
|
private readonly maxBufferedAmount;
|
|
53
58
|
private readonly bufferedAmountLowEventTimeout;
|
|
54
59
|
/**
|
|
@@ -60,6 +65,7 @@ export declare class WebRTCStream extends AbstractStream {
|
|
|
60
65
|
*/
|
|
61
66
|
private readonly receiveFinAck;
|
|
62
67
|
private readonly finAckTimeout;
|
|
68
|
+
private readonly openTimeout;
|
|
63
69
|
constructor(init: WebRTCStreamInit);
|
|
64
70
|
sendNewStream(): void;
|
|
65
71
|
_sendMessage(data: Uint8ArrayList, checkBuffer?: boolean): Promise<void>;
|
|
@@ -89,6 +95,7 @@ export interface WebRTCStreamOptions extends DataChannelOptions {
|
|
|
89
95
|
* A callback invoked when the channel ends
|
|
90
96
|
*/
|
|
91
97
|
onEnd?(err?: Error | undefined): void;
|
|
98
|
+
logger: ComponentLogger;
|
|
92
99
|
}
|
|
93
100
|
export declare function createStream(options: WebRTCStreamOptions): WebRTCStream;
|
|
94
101
|
//# sourceMappingURL=stream.d.ts.map
|
package/dist/src/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAOvF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAG7D,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB,EAAE,kBAAkB;IAC9E;;;;;OAKG;IACH,OAAO,EAAE,cAAc,CAAA;IAEvB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAmB,CAAA;AAEnD;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAY,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAElC;;GAEG;AACH,eAAO,MAAM,aAAa,IAAI,CAAA;AAE9B;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAY,CAAA;AAEzC;;;;GAIG;AACH,eAAO,MAAM,eAAe,OAAO,CAAA;AAEnC;;;GAGG;AACH,eAAO,MAAM,YAAY,OAAO,CAAA;AAEhC,qBAAa,YAAa,SAAQ,cAAc;IAC9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAE1C,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAQ;IAEtD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAEvC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAEvB,IAAI,EAAE,gBAAgB;IAiHnC,aAAa,IAAK,IAAI;IAIhB,YAAY,CAAE,IAAI,EAAE,cAAc,EAAE,WAAW,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B/E,QAAQ,CAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9C,SAAS,IAAK,OAAO,CAAC,IAAI,CAAC;IAI3B,cAAc,CAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrD,aAAa,IAAK,OAAO,CAAC,IAAI,CAAC;IAIrC;;OAEG;IACH,OAAO,CAAC,uBAAuB;YAuCjB,SAAS;CAuBxB;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D;;;;;OAKG;IACH,OAAO,EAAE,cAAc,CAAA;IAEvB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAA;IAEpB;;OAEG;IACH,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;IAErC,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAQxE"}
|
package/dist/src/stream.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { CodeError } from '@libp2p/interface/errors';
|
|
2
|
-
import { AbstractStream } from '@libp2p/
|
|
3
|
-
import { logger } from '@libp2p/logger';
|
|
2
|
+
import { AbstractStream } from '@libp2p/utils/abstract-stream';
|
|
4
3
|
import * as lengthPrefixed from 'it-length-prefixed';
|
|
5
4
|
import { pushable } from 'it-pushable';
|
|
6
5
|
import pDefer from 'p-defer';
|
|
@@ -35,6 +34,11 @@ export const MAX_MESSAGE_SIZE = 16 * 1024;
|
|
|
35
34
|
* we close the stream anyway.
|
|
36
35
|
*/
|
|
37
36
|
export const FIN_ACK_TIMEOUT = 5000;
|
|
37
|
+
/**
|
|
38
|
+
* When sending data messages, if the channel is not in the "open" state, wait
|
|
39
|
+
* this long for the "open" event to fire.
|
|
40
|
+
*/
|
|
41
|
+
export const OPEN_TIMEOUT = 5000;
|
|
38
42
|
export class WebRTCStream extends AbstractStream {
|
|
39
43
|
/**
|
|
40
44
|
* The data channel used to send and receive data
|
|
@@ -45,7 +49,6 @@ export class WebRTCStream extends AbstractStream {
|
|
|
45
49
|
* and then the protobuf decoder.
|
|
46
50
|
*/
|
|
47
51
|
incomingData;
|
|
48
|
-
messageQueue;
|
|
49
52
|
maxBufferedAmount;
|
|
50
53
|
bufferedAmountLowEventTimeout;
|
|
51
54
|
/**
|
|
@@ -57,6 +60,7 @@ export class WebRTCStream extends AbstractStream {
|
|
|
57
60
|
*/
|
|
58
61
|
receiveFinAck;
|
|
59
62
|
finAckTimeout;
|
|
63
|
+
openTimeout;
|
|
60
64
|
constructor(init) {
|
|
61
65
|
// override onEnd to send/receive FIN_ACK before closing the stream
|
|
62
66
|
const originalOnEnd = init.onEnd;
|
|
@@ -90,15 +94,16 @@ export class WebRTCStream extends AbstractStream {
|
|
|
90
94
|
this.channel = init.channel;
|
|
91
95
|
this.channel.binaryType = 'arraybuffer';
|
|
92
96
|
this.incomingData = pushable();
|
|
93
|
-
this.messageQueue = new Uint8ArrayList();
|
|
94
97
|
this.bufferedAmountLowEventTimeout = init.bufferedAmountLowEventTimeout ?? BUFFERED_AMOUNT_LOW_TIMEOUT;
|
|
95
98
|
this.maxBufferedAmount = init.maxBufferedAmount ?? MAX_BUFFERED_AMOUNT;
|
|
96
99
|
this.maxMessageSize = (init.maxMessageSize ?? MAX_MESSAGE_SIZE) - PROTOBUF_OVERHEAD - VARINT_LENGTH;
|
|
97
100
|
this.receiveFinAck = pDefer();
|
|
98
101
|
this.finAckTimeout = init.closeTimeout ?? FIN_ACK_TIMEOUT;
|
|
102
|
+
this.openTimeout = init.openTimeout ?? OPEN_TIMEOUT;
|
|
99
103
|
// set up initial state
|
|
100
104
|
switch (this.channel.readyState) {
|
|
101
105
|
case 'open':
|
|
106
|
+
this.timeline.open = new Date().getTime();
|
|
102
107
|
break;
|
|
103
108
|
case 'closed':
|
|
104
109
|
case 'closing':
|
|
@@ -116,16 +121,6 @@ export class WebRTCStream extends AbstractStream {
|
|
|
116
121
|
// handle RTCDataChannel events
|
|
117
122
|
this.channel.onopen = (_evt) => {
|
|
118
123
|
this.timeline.open = new Date().getTime();
|
|
119
|
-
if (this.messageQueue != null && this.messageQueue.byteLength > 0) {
|
|
120
|
-
this.log.trace('dataChannel opened, sending queued messages', this.messageQueue.byteLength, this.channel.readyState);
|
|
121
|
-
// send any queued messages
|
|
122
|
-
this._sendMessage(this.messageQueue)
|
|
123
|
-
.catch(err => {
|
|
124
|
-
this.log.error('error sending queued messages', err);
|
|
125
|
-
this.abort(err);
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
this.messageQueue = undefined;
|
|
129
124
|
};
|
|
130
125
|
this.channel.onclose = (_evt) => {
|
|
131
126
|
// if the channel has closed we'll never receive a FIN_ACK so resolve the
|
|
@@ -167,6 +162,7 @@ export class WebRTCStream extends AbstractStream {
|
|
|
167
162
|
async _sendMessage(data, checkBuffer = true) {
|
|
168
163
|
if (checkBuffer && this.channel.bufferedAmount > this.maxBufferedAmount) {
|
|
169
164
|
try {
|
|
165
|
+
this.log('channel buffer is %d, wait for "bufferedamountlow" event', this.channel.bufferedAmount);
|
|
170
166
|
await pEvent(this.channel, 'bufferedamountlow', { timeout: this.bufferedAmountLowEventTimeout });
|
|
171
167
|
}
|
|
172
168
|
catch (err) {
|
|
@@ -179,23 +175,13 @@ export class WebRTCStream extends AbstractStream {
|
|
|
179
175
|
if (this.channel.readyState === 'closed' || this.channel.readyState === 'closing') {
|
|
180
176
|
throw new CodeError(`Invalid datachannel state - ${this.channel.readyState}`, 'ERR_INVALID_STATE');
|
|
181
177
|
}
|
|
182
|
-
if (this.channel.readyState
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
else if (this.channel.readyState === 'connecting') {
|
|
189
|
-
// queue message for when we are open
|
|
190
|
-
if (this.messageQueue == null) {
|
|
191
|
-
this.messageQueue = new Uint8ArrayList();
|
|
192
|
-
}
|
|
193
|
-
this.messageQueue.append(data);
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this.log.error('unknown datachannel state %s', this.channel.readyState);
|
|
197
|
-
throw new CodeError('Unknown datachannel state', 'ERR_INVALID_STATE');
|
|
178
|
+
if (this.channel.readyState !== 'open') {
|
|
179
|
+
this.log('channel state is "%s" and not "open", waiting for "open" event before sending data', this.channel.readyState);
|
|
180
|
+
await pEvent(this.channel, 'open', { timeout: this.openTimeout });
|
|
181
|
+
this.log('channel state is now "%s", sending data', this.channel.readyState);
|
|
198
182
|
}
|
|
183
|
+
// send message without copying data
|
|
184
|
+
this.channel.send(data.subarray());
|
|
199
185
|
}
|
|
200
186
|
async sendData(data) {
|
|
201
187
|
// sending messages is an async operation so use a copy of the list as it
|
|
@@ -275,7 +261,7 @@ export class WebRTCStream extends AbstractStream {
|
|
|
275
261
|
// flags can be sent while we or the remote are closing the datachannel so
|
|
276
262
|
// if the channel isn't open, don't try to send it but return false to let
|
|
277
263
|
// the caller know and act if they need to
|
|
278
|
-
this.log.trace('not sending flag %s because channel is not open', flag.toString());
|
|
264
|
+
this.log.trace('not sending flag %s because channel is "%s" and not "open"', this.channel.readyState, flag.toString());
|
|
279
265
|
return false;
|
|
280
266
|
}
|
|
281
267
|
this.log.trace('sending flag %s', flag.toString());
|
|
@@ -295,7 +281,7 @@ export function createStream(options) {
|
|
|
295
281
|
const { channel, direction } = options;
|
|
296
282
|
return new WebRTCStream({
|
|
297
283
|
id: direction === 'inbound' ? (`i${channel.id}`) : `r${channel.id}`,
|
|
298
|
-
log: logger(`libp2p:webrtc:stream:${direction}:${channel.id}`),
|
|
284
|
+
log: options.logger.forComponent(`libp2p:webrtc:stream:${direction}:${channel.id}`),
|
|
299
285
|
...options
|
|
300
286
|
});
|
|
301
287
|
}
|