@libp2p/webrtc 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +19 -19
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/muxer.d.ts +6 -10
- package/dist/src/muxer.d.ts.map +1 -1
- package/dist/src/muxer.js +44 -13
- package/dist/src/muxer.js.map +1 -1
- package/dist/src/peer_transport/handler.d.ts +14 -0
- package/dist/src/peer_transport/handler.d.ts.map +1 -0
- package/dist/src/peer_transport/handler.js +107 -0
- package/dist/src/peer_transport/handler.js.map +1 -0
- package/dist/src/peer_transport/listener.d.ts +19 -0
- package/dist/src/peer_transport/listener.d.ts.map +1 -0
- package/dist/src/peer_transport/listener.js +32 -0
- package/dist/src/peer_transport/listener.js.map +1 -0
- package/dist/src/peer_transport/pb/index.d.ts +20 -0
- package/dist/src/peer_transport/pb/index.d.ts.map +1 -0
- package/dist/src/peer_transport/pb/index.js +73 -0
- package/dist/src/peer_transport/pb/index.js.map +1 -0
- package/dist/src/peer_transport/transport.d.ts +37 -0
- package/dist/src/peer_transport/transport.d.ts.map +1 -0
- package/dist/src/peer_transport/transport.js +128 -0
- package/dist/src/peer_transport/transport.js.map +1 -0
- package/dist/src/peer_transport/util.d.ts +10 -0
- package/dist/src/peer_transport/util.d.ts.map +1 -0
- package/dist/src/peer_transport/util.js +54 -0
- package/dist/src/peer_transport/util.js.map +1 -0
- package/dist/src/stream.d.ts +1 -0
- package/dist/src/stream.d.ts.map +1 -1
- package/dist/src/stream.js +6 -2
- package/dist/src/stream.js.map +1 -1
- package/dist/src/transport.d.ts +3 -3
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/transport.js +6 -5
- package/dist/src/transport.js.map +1 -1
- package/package.json +16 -5
- package/src/index.ts +11 -3
- package/src/muxer.ts +45 -15
- package/src/peer_transport/handler.ts +139 -0
- package/src/peer_transport/listener.ts +44 -0
- package/src/peer_transport/pb/index.proto +16 -0
- package/src/peer_transport/pb/index.ts +92 -0
- package/src/peer_transport/transport.ts +167 -0
- package/src/peer_transport/util.ts +62 -0
- package/src/stream.ts +7 -2
- package/src/transport.ts +9 -8
package/dist/src/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { Transport } from '@libp2p/interface-transport';
|
|
2
|
-
import { WebRTCTransportComponents } from './transport.js';
|
|
3
|
-
|
|
2
|
+
import type { WebRTCTransportComponents, WebRTCTransportInit } from './peer_transport/transport.js';
|
|
3
|
+
import { WebRTCDirectTransportComponents } from './transport.js';
|
|
4
|
+
declare function webRTCDirect(): (components: WebRTCDirectTransportComponents) => Transport;
|
|
5
|
+
declare function webRTC(init?: WebRTCTransportInit): (components: WebRTCTransportComponents) => Transport;
|
|
6
|
+
export { webRTC, webRTCDirect };
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAEnG,OAAO,EAAyB,+BAA+B,EAAE,MAAM,gBAAgB,CAAA;AAEvF,iBAAS,YAAY,IAAK,CAAC,UAAU,EAAE,+BAA+B,KAAK,SAAS,CAEnF;AAED,iBAAS,MAAM,CAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,CAAC,UAAU,EAAE,yBAAyB,KAAK,SAAS,CAEjG;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import { WebRTCTransport } from './transport.js';
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { WebRTCTransport } from './peer_transport/transport.js';
|
|
2
|
+
import { WebRTCDirectTransport } from './transport.js';
|
|
3
|
+
function webRTCDirect() {
|
|
4
|
+
return (components) => new WebRTCDirectTransport(components);
|
|
4
5
|
}
|
|
6
|
+
function webRTC(init) {
|
|
7
|
+
return (components) => new WebRTCTransport(components, init ?? {});
|
|
8
|
+
}
|
|
9
|
+
export { webRTC, webRTCDirect };
|
|
5
10
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAmC,MAAM,gBAAgB,CAAA;AAEvF,SAAS,YAAY;IACnB,OAAO,CAAC,UAA2C,EAAE,EAAE,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAA;AAC/F,CAAC;AAED,SAAS,MAAM,CAAE,IAA0B;IACzC,OAAO,CAAC,UAAqC,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;AAC/F,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/src/muxer.d.ts
CHANGED
|
@@ -2,29 +2,24 @@ import type { Stream } from '@libp2p/interface-connection';
|
|
|
2
2
|
import type { StreamMuxer, StreamMuxerFactory, StreamMuxerInit } from '@libp2p/interface-stream-muxer';
|
|
3
3
|
import type { Source, Sink } from 'it-stream-types';
|
|
4
4
|
export declare class DataChannelMuxerFactory implements StreamMuxerFactory {
|
|
5
|
+
readonly protocol: string;
|
|
5
6
|
/**
|
|
6
7
|
* WebRTC Peer Connection
|
|
7
8
|
*/
|
|
8
9
|
private readonly peerConnection;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
protocol: string;
|
|
13
|
-
constructor(peerConnection: RTCPeerConnection);
|
|
10
|
+
private streamBuffer;
|
|
11
|
+
constructor(peerConnection: RTCPeerConnection, protocol?: string);
|
|
14
12
|
createStreamMuxer(init?: StreamMuxerInit | undefined): StreamMuxer;
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
15
|
* A libp2p data channel stream muxer
|
|
18
16
|
*/
|
|
19
17
|
export declare class DataChannelMuxer implements StreamMuxer {
|
|
18
|
+
readonly protocol: string;
|
|
20
19
|
/**
|
|
21
20
|
* WebRTC Peer Connection
|
|
22
21
|
*/
|
|
23
22
|
private readonly peerConnection;
|
|
24
|
-
/**
|
|
25
|
-
* The protocol as represented in the multiaddress
|
|
26
|
-
*/
|
|
27
|
-
readonly protocol: string;
|
|
28
23
|
/**
|
|
29
24
|
* Array of streams in the data channel
|
|
30
25
|
*/
|
|
@@ -45,7 +40,8 @@ export declare class DataChannelMuxer implements StreamMuxer {
|
|
|
45
40
|
* The stream destination, a no-op as the transport natively supports multiplexing
|
|
46
41
|
*/
|
|
47
42
|
sink: Sink<Uint8Array, Promise<void>>;
|
|
48
|
-
constructor(peerConnection: RTCPeerConnection, init?: StreamMuxerInit);
|
|
43
|
+
constructor(peerConnection: RTCPeerConnection, streams: Stream[], protocol?: string, init?: StreamMuxerInit);
|
|
49
44
|
newStream(): Stream;
|
|
45
|
+
private wrapStreamEnd;
|
|
50
46
|
}
|
|
51
47
|
//# sourceMappingURL=muxer.d.ts.map
|
package/dist/src/muxer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxer.d.ts","sourceRoot":"","sources":["../../src/muxer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AACtG,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKnD,qBAAa,uBAAwB,YAAW,kBAAkB;
|
|
1
|
+
{"version":3,"file":"muxer.d.ts","sourceRoot":"","sources":["../../src/muxer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AACtG,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKnD,qBAAa,uBAAwB,YAAW,kBAAkB;IAOhB,QAAQ,CAAC,QAAQ;IANjE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD,OAAO,CAAC,YAAY,CAAqB;gBAE5B,cAAc,EAAE,iBAAiB,EAAW,QAAQ,SAAY;IAkB7E,iBAAiB,CAAE,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,WAAW;CAGpE;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IA+BiB,QAAQ,CAAC,QAAQ;IA9BpF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAElD;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAK;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,eAAe,CAAA;IAEtB;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,KAAK,IAAI,CAAY;IAEpD;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAY;IAEtC;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAU;gBAElC,cAAc,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,EAAW,QAAQ,SAAY,EAAE,IAAI,CAAC,EAAE,eAAe;IAgDxH,SAAS,IAAK,MAAM;IAkBpB,OAAO,CAAC,aAAa;CAStB"}
|
package/dist/src/muxer.js
CHANGED
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
import { WebRTCStream } from './stream.js';
|
|
2
2
|
import { nopSink, nopSource } from './util.js';
|
|
3
3
|
export class DataChannelMuxerFactory {
|
|
4
|
-
constructor(peerConnection) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
this.protocol = '/webrtc';
|
|
4
|
+
constructor(peerConnection, protocol = '/webrtc') {
|
|
5
|
+
this.protocol = protocol;
|
|
6
|
+
this.streamBuffer = [];
|
|
9
7
|
this.peerConnection = peerConnection;
|
|
8
|
+
// store any datachannels opened before upgrade has been completed
|
|
9
|
+
this.peerConnection.ondatachannel = ({ channel }) => {
|
|
10
|
+
const stream = new WebRTCStream({
|
|
11
|
+
channel,
|
|
12
|
+
stat: {
|
|
13
|
+
direction: 'inbound',
|
|
14
|
+
timeline: { open: 0 }
|
|
15
|
+
},
|
|
16
|
+
closeCb: (_stream) => {
|
|
17
|
+
this.streamBuffer = this.streamBuffer.filter(s => !_stream.eq(s));
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
this.streamBuffer.push(stream);
|
|
21
|
+
};
|
|
10
22
|
}
|
|
11
23
|
createStreamMuxer(init) {
|
|
12
|
-
return new DataChannelMuxer(this.peerConnection, init);
|
|
24
|
+
return new DataChannelMuxer(this.peerConnection, this.streamBuffer, this.protocol, init);
|
|
13
25
|
}
|
|
14
26
|
}
|
|
15
27
|
/**
|
|
16
28
|
* A libp2p data channel stream muxer
|
|
17
29
|
*/
|
|
18
30
|
export class DataChannelMuxer {
|
|
19
|
-
constructor(peerConnection, init) {
|
|
20
|
-
|
|
21
|
-
* The protocol as represented in the multiaddress
|
|
22
|
-
*/
|
|
23
|
-
this.protocol = '/webrtc';
|
|
31
|
+
constructor(peerConnection, streams, protocol = '/webrtc', init) {
|
|
32
|
+
this.protocol = protocol;
|
|
24
33
|
/**
|
|
25
34
|
* Array of streams in the data channel
|
|
26
35
|
*/
|
|
@@ -60,12 +69,24 @@ export class DataChannelMuxer {
|
|
|
60
69
|
open: 0
|
|
61
70
|
}
|
|
62
71
|
},
|
|
63
|
-
closeCb: init?.
|
|
72
|
+
closeCb: this.wrapStreamEnd(init?.onIncomingStream)
|
|
64
73
|
});
|
|
74
|
+
this.streams.push(stream);
|
|
65
75
|
if ((init?.onIncomingStream) != null) {
|
|
66
76
|
init.onIncomingStream(stream);
|
|
67
77
|
}
|
|
68
78
|
};
|
|
79
|
+
// wrap open streams with the onStreamEnd callback
|
|
80
|
+
this.streams = streams
|
|
81
|
+
.filter(stream => stream.stat.timeline.close == null)
|
|
82
|
+
.map(stream => {
|
|
83
|
+
stream.closeCb = this.wrapStreamEnd(init?.onStreamEnd);
|
|
84
|
+
return stream;
|
|
85
|
+
});
|
|
86
|
+
const onIncomingStream = init?.onIncomingStream;
|
|
87
|
+
if (onIncomingStream != null) {
|
|
88
|
+
this.streams.forEach(s => { onIncomingStream(s); });
|
|
89
|
+
}
|
|
69
90
|
}
|
|
70
91
|
newStream() {
|
|
71
92
|
// The spec says the label SHOULD be an empty string: https://github.com/libp2p/specs/blob/master/webrtc/README.md#rtcdatachannel-label
|
|
@@ -78,9 +99,19 @@ export class DataChannelMuxer {
|
|
|
78
99
|
open: 0
|
|
79
100
|
}
|
|
80
101
|
},
|
|
81
|
-
closeCb: this.init?.onStreamEnd
|
|
102
|
+
closeCb: this.wrapStreamEnd(this.init?.onStreamEnd)
|
|
82
103
|
});
|
|
104
|
+
this.streams.push(stream);
|
|
83
105
|
return stream;
|
|
84
106
|
}
|
|
107
|
+
wrapStreamEnd(onStreamEnd) {
|
|
108
|
+
const self = this;
|
|
109
|
+
return (_stream) => {
|
|
110
|
+
self.streams = self.streams.filter(s => !(_stream instanceof WebRTCStream && (_stream).eq(s)));
|
|
111
|
+
if (onStreamEnd != null) {
|
|
112
|
+
onStreamEnd(_stream);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
85
116
|
}
|
|
86
117
|
//# sourceMappingURL=muxer.js.map
|
package/dist/src/muxer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxer.js","sourceRoot":"","sources":["../../src/muxer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,OAAO,uBAAuB;
|
|
1
|
+
{"version":3,"file":"muxer.js","sourceRoot":"","sources":["../../src/muxer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IncomingStreamData } from '@libp2p/interface-registrar';
|
|
2
|
+
import type { Stream } from '@libp2p/interface-connection';
|
|
3
|
+
import type { StreamMuxerFactory } from '@libp2p/interface-stream-muxer';
|
|
4
|
+
export type IncomingStreamOpts = {
|
|
5
|
+
rtcConfiguration?: RTCConfiguration;
|
|
6
|
+
} & IncomingStreamData;
|
|
7
|
+
export declare function handleIncomingStream({ rtcConfiguration, stream: rawStream }: IncomingStreamOpts): Promise<[RTCPeerConnection, StreamMuxerFactory]>;
|
|
8
|
+
export interface ConnectOptions {
|
|
9
|
+
stream: Stream;
|
|
10
|
+
signal: AbortSignal;
|
|
11
|
+
rtcConfiguration?: RTCConfiguration;
|
|
12
|
+
}
|
|
13
|
+
export declare function initiateConnection({ rtcConfiguration, signal, stream: rawStream }: ConnectOptions): Promise<[RTCPeerConnection, StreamMuxerFactory]>;
|
|
14
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/peer_transport/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAQrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAOxE,MAAM,MAAM,kBAAkB,GAAG;IAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAAG,kBAAkB,CAAA;AAE7F,wBAAsB,oBAAoB,CAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CA+DzJ;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC;AAED,wBAAsB,kBAAkB,CAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAiD3J"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { pbStream } from 'it-pb-stream';
|
|
2
|
+
import pDefer from 'p-defer';
|
|
3
|
+
import { TimeoutController } from 'timeout-abort-controller';
|
|
4
|
+
import { readCandidatesUntilConnected, resolveOnConnected } from './util.js';
|
|
5
|
+
import * as pb from './pb/index.js';
|
|
6
|
+
import { abortableDuplex } from 'abortable-iterator';
|
|
7
|
+
import { logger } from '@libp2p/logger';
|
|
8
|
+
import { DataChannelMuxerFactory } from '../muxer.js';
|
|
9
|
+
const DEFAULT_TIMEOUT = 30 * 1000;
|
|
10
|
+
const log = logger('libp2p:webrtc:peer');
|
|
11
|
+
export async function handleIncomingStream({ rtcConfiguration, stream: rawStream }) {
|
|
12
|
+
const timeoutController = new TimeoutController(DEFAULT_TIMEOUT);
|
|
13
|
+
const signal = timeoutController.signal;
|
|
14
|
+
const stream = pbStream(abortableDuplex(rawStream, timeoutController.signal)).pb(pb.Message);
|
|
15
|
+
const pc = new RTCPeerConnection(rtcConfiguration);
|
|
16
|
+
const muxerFactory = new DataChannelMuxerFactory(pc);
|
|
17
|
+
const connectedPromise = pDefer();
|
|
18
|
+
const answerSentPromise = pDefer();
|
|
19
|
+
signal.onabort = () => { connectedPromise.reject(); };
|
|
20
|
+
// candidate callbacks
|
|
21
|
+
pc.onicecandidate = ({ candidate }) => {
|
|
22
|
+
answerSentPromise.promise.then(() => {
|
|
23
|
+
stream.write({
|
|
24
|
+
type: pb.Message.Type.ICE_CANDIDATE,
|
|
25
|
+
data: (candidate != null) ? JSON.stringify(candidate.toJSON()) : ''
|
|
26
|
+
});
|
|
27
|
+
}, (err) => {
|
|
28
|
+
log.error('cannot set candidate since sending answer failed', err);
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
resolveOnConnected(pc, connectedPromise);
|
|
32
|
+
// read an SDP offer
|
|
33
|
+
const pbOffer = await stream.read();
|
|
34
|
+
if (pbOffer.type !== pb.Message.Type.SDP_OFFER) {
|
|
35
|
+
throw new Error(`expected message type SDP_OFFER, received: ${pbOffer.type ?? 'undefined'} `);
|
|
36
|
+
}
|
|
37
|
+
const offer = new RTCSessionDescription({
|
|
38
|
+
type: 'offer',
|
|
39
|
+
sdp: pbOffer.data
|
|
40
|
+
});
|
|
41
|
+
await pc.setRemoteDescription(offer).catch(err => {
|
|
42
|
+
log.error('could not execute setRemoteDescription', err);
|
|
43
|
+
throw new Error('Failed to set remoteDescription');
|
|
44
|
+
});
|
|
45
|
+
// create and write an SDP answer
|
|
46
|
+
const answer = await pc.createAnswer().catch(err => {
|
|
47
|
+
log.error('could not execute createAnswer', err);
|
|
48
|
+
answerSentPromise.reject(err);
|
|
49
|
+
throw new Error('Failed to create answer');
|
|
50
|
+
});
|
|
51
|
+
// write the answer to the remote
|
|
52
|
+
stream.write({ type: pb.Message.Type.SDP_ANSWER, data: answer.sdp });
|
|
53
|
+
await pc.setLocalDescription(answer).catch(err => {
|
|
54
|
+
log.error('could not execute setLocalDescription', err);
|
|
55
|
+
answerSentPromise.reject(err);
|
|
56
|
+
throw new Error('Failed to set localDescription');
|
|
57
|
+
});
|
|
58
|
+
answerSentPromise.resolve();
|
|
59
|
+
// wait until candidates are connected
|
|
60
|
+
await readCandidatesUntilConnected(connectedPromise, pc, stream);
|
|
61
|
+
return [pc, muxerFactory];
|
|
62
|
+
}
|
|
63
|
+
export async function initiateConnection({ rtcConfiguration, signal, stream: rawStream }) {
|
|
64
|
+
const stream = pbStream(abortableDuplex(rawStream, signal)).pb(pb.Message);
|
|
65
|
+
// setup peer connection
|
|
66
|
+
const pc = new RTCPeerConnection(rtcConfiguration);
|
|
67
|
+
const muxerFactory = new DataChannelMuxerFactory(pc);
|
|
68
|
+
const connectedPromise = pDefer();
|
|
69
|
+
resolveOnConnected(pc, connectedPromise);
|
|
70
|
+
// reject the connectedPromise if the signal aborts
|
|
71
|
+
signal.onabort = connectedPromise.reject;
|
|
72
|
+
// we create the channel so that the peerconnection has a component for which
|
|
73
|
+
// to collect candidates. The label is not relevant to connection initiation
|
|
74
|
+
// but can be useful for debugging
|
|
75
|
+
const channel = pc.createDataChannel('init');
|
|
76
|
+
// setup callback to write ICE candidates to the remote
|
|
77
|
+
// peer
|
|
78
|
+
pc.onicecandidate = ({ candidate }) => {
|
|
79
|
+
stream.write({
|
|
80
|
+
type: pb.Message.Type.ICE_CANDIDATE,
|
|
81
|
+
data: (candidate != null) ? JSON.stringify(candidate.toJSON()) : ''
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
// create an offer
|
|
85
|
+
const offerSdp = await pc.createOffer();
|
|
86
|
+
// write the offer to the stream
|
|
87
|
+
stream.write({ type: pb.Message.Type.SDP_OFFER, data: offerSdp.sdp });
|
|
88
|
+
// set offer as local description
|
|
89
|
+
await pc.setLocalDescription(offerSdp).catch(err => {
|
|
90
|
+
log.error('could not execute setLocalDescription', err);
|
|
91
|
+
throw new Error('Failed to set localDescription');
|
|
92
|
+
});
|
|
93
|
+
// read answer
|
|
94
|
+
const answerMessage = await stream.read();
|
|
95
|
+
if (answerMessage.type !== pb.Message.Type.SDP_ANSWER) {
|
|
96
|
+
throw new Error('remote should send an SDP answer');
|
|
97
|
+
}
|
|
98
|
+
const answerSdp = new RTCSessionDescription({ type: 'answer', sdp: answerMessage.data });
|
|
99
|
+
await pc.setRemoteDescription(answerSdp).catch(err => {
|
|
100
|
+
log.error('could not execute setRemoteDescription', err);
|
|
101
|
+
throw new Error('Failed to set remoteDescription');
|
|
102
|
+
});
|
|
103
|
+
await readCandidatesUntilConnected(connectedPromise, pc, stream);
|
|
104
|
+
channel.close();
|
|
105
|
+
return [pc, muxerFactory];
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/peer_transport/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PeerId } from '@libp2p/interface-peer-id';
|
|
2
|
+
import type { ListenerEvents, TransportManager, Upgrader, Listener } from '@libp2p/interface-transport';
|
|
3
|
+
import { EventEmitter } from '@libp2p/interfaces/events';
|
|
4
|
+
import { Multiaddr } from '@multiformats/multiaddr';
|
|
5
|
+
export interface ListenerOptions {
|
|
6
|
+
peerId: PeerId;
|
|
7
|
+
upgrader: Upgrader;
|
|
8
|
+
transportManager: TransportManager;
|
|
9
|
+
}
|
|
10
|
+
export declare class WebRTCPeerListener extends EventEmitter<ListenerEvents> implements Listener {
|
|
11
|
+
private readonly opts;
|
|
12
|
+
constructor(opts: ListenerOptions);
|
|
13
|
+
private getBaseAddress;
|
|
14
|
+
private listeningAddrs;
|
|
15
|
+
listen(ma: Multiaddr): Promise<void>;
|
|
16
|
+
getAddrs(): Multiaddr[];
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/peer_transport/listener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACvG,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAa,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAI9D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,cAAc,CAAE,YAAW,QAAQ;IAEpF,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,eAAe;IAKxC,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc,CAAkB;IAClC,MAAM,CAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,QAAQ,IAAK,SAAS,EAAE;IAClB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAC9B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EventEmitter } from '@libp2p/interfaces/events';
|
|
2
|
+
import { multiaddr } from '@multiformats/multiaddr';
|
|
3
|
+
import { inappropriateMultiaddr } from '../error.js';
|
|
4
|
+
import { TRANSPORT } from './transport.js';
|
|
5
|
+
export class WebRTCPeerListener extends EventEmitter {
|
|
6
|
+
constructor(opts) {
|
|
7
|
+
super();
|
|
8
|
+
this.opts = opts;
|
|
9
|
+
this.listeningAddrs = [];
|
|
10
|
+
}
|
|
11
|
+
getBaseAddress(ma) {
|
|
12
|
+
const addrs = ma.toString().split(TRANSPORT);
|
|
13
|
+
if (addrs.length < 2) {
|
|
14
|
+
throw inappropriateMultiaddr('base address not found');
|
|
15
|
+
}
|
|
16
|
+
return multiaddr(addrs[0]);
|
|
17
|
+
}
|
|
18
|
+
async listen(ma) {
|
|
19
|
+
const baseAddr = this.getBaseAddress(ma);
|
|
20
|
+
const tpt = this.opts.transportManager.transportForMultiaddr(baseAddr);
|
|
21
|
+
const listener = tpt?.createListener({ ...this.opts });
|
|
22
|
+
await listener?.listen(baseAddr);
|
|
23
|
+
const listeningAddr = ma.encapsulate(`/p2p/${this.opts.peerId.toString()}`);
|
|
24
|
+
this.listeningAddrs.push(listeningAddr);
|
|
25
|
+
listener?.addEventListener('close', () => {
|
|
26
|
+
this.listeningAddrs = this.listeningAddrs.filter(a => a !== listeningAddr);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
getAddrs() { return this.listeningAddrs; }
|
|
30
|
+
async close() { }
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/peer_transport/listener.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,SAAS,EAAa,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAQ1C,MAAM,OAAO,kBAAmB,SAAQ,YAA4B;IAClE,YACmB,IAAqB;QAEtC,KAAK,EAAE,CAAA;QAFU,SAAI,GAAJ,IAAI,CAAiB;QAahC,mBAAc,GAAgB,EAAE,CAAA;IAVxC,CAAC;IAEO,cAAc,CAAE,EAAa;QACnC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,MAAM,sBAAsB,CAAC,wBAAwB,CAAC,CAAA;SACvD;QACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC;IAGD,KAAK,CAAC,MAAM,CAAE,EAAa;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QACtE,MAAM,QAAQ,GAAG,GAAG,EAAE,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACtD,MAAM,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC3E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACvC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ,KAAmB,OAAO,IAAI,CAAC,cAAc,CAAA,CAAC,CAAC;IACvD,KAAK,CAAC,KAAK,KAAqB,CAAC;CAClC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
2
|
+
import type { Codec } from 'protons-runtime';
|
|
3
|
+
export interface Message {
|
|
4
|
+
type?: Message.Type;
|
|
5
|
+
data?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare namespace Message {
|
|
8
|
+
enum Type {
|
|
9
|
+
SDP_OFFER = "SDP_OFFER",
|
|
10
|
+
SDP_ANSWER = "SDP_ANSWER",
|
|
11
|
+
ICE_CANDIDATE = "ICE_CANDIDATE"
|
|
12
|
+
}
|
|
13
|
+
namespace Type {
|
|
14
|
+
const codec: () => Codec<Type>;
|
|
15
|
+
}
|
|
16
|
+
const codec: () => Codec<Message>;
|
|
17
|
+
const encode: (obj: Message) => Uint8Array;
|
|
18
|
+
const decode: (buf: Uint8Array | Uint8ArrayList) => Message;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/peer_transport/pb/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,yBAAiB,OAAO,CAAC;IACvB,KAAY,IAAI;QACd,SAAS,cAAc;QACvB,UAAU,eAAe;QACzB,aAAa,kBAAkB;KAChC;IAQD,UAAiB,IAAI,CAAC;QACb,MAAM,KAAK,QAAO,MAAM,IAAI,CAElC,CAAA;KACF;IAIM,MAAM,KAAK,QAAO,MAAM,OAAO,CA8CrC,CAAA;IAEM,MAAM,MAAM,QAAS,OAAO,KAAG,UAErC,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,GAAG,cAAc,KAAG,OAEzD,CAAA;CACF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* eslint-disable import/export */
|
|
2
|
+
/* eslint-disable complexity */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-namespace */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
6
|
+
import { enumeration, encodeMessage, decodeMessage, message } from 'protons-runtime';
|
|
7
|
+
export var Message;
|
|
8
|
+
(function (Message) {
|
|
9
|
+
let Type;
|
|
10
|
+
(function (Type) {
|
|
11
|
+
Type["SDP_OFFER"] = "SDP_OFFER";
|
|
12
|
+
Type["SDP_ANSWER"] = "SDP_ANSWER";
|
|
13
|
+
Type["ICE_CANDIDATE"] = "ICE_CANDIDATE";
|
|
14
|
+
})(Type = Message.Type || (Message.Type = {}));
|
|
15
|
+
let __TypeValues;
|
|
16
|
+
(function (__TypeValues) {
|
|
17
|
+
__TypeValues[__TypeValues["SDP_OFFER"] = 0] = "SDP_OFFER";
|
|
18
|
+
__TypeValues[__TypeValues["SDP_ANSWER"] = 1] = "SDP_ANSWER";
|
|
19
|
+
__TypeValues[__TypeValues["ICE_CANDIDATE"] = 2] = "ICE_CANDIDATE";
|
|
20
|
+
})(__TypeValues || (__TypeValues = {}));
|
|
21
|
+
(function (Type) {
|
|
22
|
+
Type.codec = () => {
|
|
23
|
+
return enumeration(__TypeValues);
|
|
24
|
+
};
|
|
25
|
+
})(Type = Message.Type || (Message.Type = {}));
|
|
26
|
+
let _codec;
|
|
27
|
+
Message.codec = () => {
|
|
28
|
+
if (_codec == null) {
|
|
29
|
+
_codec = message((obj, w, opts = {}) => {
|
|
30
|
+
if (opts.lengthDelimited !== false) {
|
|
31
|
+
w.fork();
|
|
32
|
+
}
|
|
33
|
+
if (obj.type != null) {
|
|
34
|
+
w.uint32(8);
|
|
35
|
+
Message.Type.codec().encode(obj.type, w);
|
|
36
|
+
}
|
|
37
|
+
if (obj.data != null) {
|
|
38
|
+
w.uint32(18);
|
|
39
|
+
w.string(obj.data);
|
|
40
|
+
}
|
|
41
|
+
if (opts.lengthDelimited !== false) {
|
|
42
|
+
w.ldelim();
|
|
43
|
+
}
|
|
44
|
+
}, (reader, length) => {
|
|
45
|
+
const obj = {};
|
|
46
|
+
const end = length == null ? reader.len : reader.pos + length;
|
|
47
|
+
while (reader.pos < end) {
|
|
48
|
+
const tag = reader.uint32();
|
|
49
|
+
switch (tag >>> 3) {
|
|
50
|
+
case 1:
|
|
51
|
+
obj.type = Message.Type.codec().decode(reader);
|
|
52
|
+
break;
|
|
53
|
+
case 2:
|
|
54
|
+
obj.data = reader.string();
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
reader.skipType(tag & 7);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return obj;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return _codec;
|
|
65
|
+
};
|
|
66
|
+
Message.encode = (obj) => {
|
|
67
|
+
return encodeMessage(obj, Message.codec());
|
|
68
|
+
};
|
|
69
|
+
Message.decode = (buf) => {
|
|
70
|
+
return decodeMessage(buf, Message.codec());
|
|
71
|
+
};
|
|
72
|
+
})(Message || (Message = {}));
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/peer_transport/pb/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Connection } from '@libp2p/interface-connection';
|
|
2
|
+
import { CreateListenerOptions, DialOptions, Listener, symbol, Transport } from '@libp2p/interface-transport';
|
|
3
|
+
import type { TransportManager, Upgrader } from '@libp2p/interface-transport';
|
|
4
|
+
import { Multiaddr } from '@multiformats/multiaddr';
|
|
5
|
+
import type { IncomingStreamData, Registrar } from '@libp2p/interface-registrar';
|
|
6
|
+
import type { PeerId } from '@libp2p/interface-peer-id';
|
|
7
|
+
import type { Startable } from '@libp2p/interfaces/startable';
|
|
8
|
+
import type { PeerStore } from '@libp2p/interface-peer-store';
|
|
9
|
+
export declare const TRANSPORT = "/webrtc";
|
|
10
|
+
export declare const SIGNALING_PROTO_ID = "/webrtc-signaling/0.0.1";
|
|
11
|
+
export declare const CODE: number;
|
|
12
|
+
export interface WebRTCTransportInit {
|
|
13
|
+
rtcConfiguration?: RTCConfiguration;
|
|
14
|
+
}
|
|
15
|
+
export interface WebRTCTransportComponents {
|
|
16
|
+
peerId: PeerId;
|
|
17
|
+
registrar: Registrar;
|
|
18
|
+
upgrader: Upgrader;
|
|
19
|
+
transportManager: TransportManager;
|
|
20
|
+
peerStore: PeerStore;
|
|
21
|
+
}
|
|
22
|
+
export declare class WebRTCTransport implements Transport, Startable {
|
|
23
|
+
private readonly components;
|
|
24
|
+
private readonly init;
|
|
25
|
+
private _started;
|
|
26
|
+
constructor(components: WebRTCTransportComponents, init: WebRTCTransportInit);
|
|
27
|
+
isStarted(): boolean;
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
createListener(options: CreateListenerOptions): Listener;
|
|
31
|
+
get [Symbol.toStringTag](): string;
|
|
32
|
+
get [symbol](): true;
|
|
33
|
+
filter(multiaddrs: Multiaddr[]): Multiaddr[];
|
|
34
|
+
dial(ma: Multiaddr, options: DialOptions): Promise<Connection>;
|
|
35
|
+
_onProtocol({ connection, stream }: IncomingStreamData): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/peer_transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAa,SAAS,EAAa,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAChF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAQ7D,eAAO,MAAM,SAAS,YAAY,CAAA;AAClC,eAAO,MAAM,kBAAkB,4BAA4B,CAAA;AAC3D,eAAO,MAAM,IAAI,QAA2B,CAAA;AAE5C,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC;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,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,qBAAa,eAAgB,YAAW,SAAS,EAAE,SAAS;IAIxD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAQ;gBAGL,UAAU,EAAE,yBAAyB,EACrC,IAAI,EAAE,mBAAmB;IAI5C,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAOvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAK5B,cAAc,CAAE,OAAO,EAAE,qBAAqB,GAAG,QAAQ;IAIzD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAK,MAAM,CAElC;IAED,IAAI,CAAC,MAAM,CAAC,IAAK,IAAI,CAEpB;IAED,MAAM,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAcvC,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA6D/D,WAAW,CAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqB9E"}
|