@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.
Files changed (48) hide show
  1. package/dist/index.min.js +19 -19
  2. package/dist/src/index.d.ts +5 -2
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +8 -3
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/muxer.d.ts +6 -10
  7. package/dist/src/muxer.d.ts.map +1 -1
  8. package/dist/src/muxer.js +44 -13
  9. package/dist/src/muxer.js.map +1 -1
  10. package/dist/src/peer_transport/handler.d.ts +14 -0
  11. package/dist/src/peer_transport/handler.d.ts.map +1 -0
  12. package/dist/src/peer_transport/handler.js +107 -0
  13. package/dist/src/peer_transport/handler.js.map +1 -0
  14. package/dist/src/peer_transport/listener.d.ts +19 -0
  15. package/dist/src/peer_transport/listener.d.ts.map +1 -0
  16. package/dist/src/peer_transport/listener.js +32 -0
  17. package/dist/src/peer_transport/listener.js.map +1 -0
  18. package/dist/src/peer_transport/pb/index.d.ts +20 -0
  19. package/dist/src/peer_transport/pb/index.d.ts.map +1 -0
  20. package/dist/src/peer_transport/pb/index.js +73 -0
  21. package/dist/src/peer_transport/pb/index.js.map +1 -0
  22. package/dist/src/peer_transport/transport.d.ts +37 -0
  23. package/dist/src/peer_transport/transport.d.ts.map +1 -0
  24. package/dist/src/peer_transport/transport.js +128 -0
  25. package/dist/src/peer_transport/transport.js.map +1 -0
  26. package/dist/src/peer_transport/util.d.ts +10 -0
  27. package/dist/src/peer_transport/util.d.ts.map +1 -0
  28. package/dist/src/peer_transport/util.js +54 -0
  29. package/dist/src/peer_transport/util.js.map +1 -0
  30. package/dist/src/stream.d.ts +1 -0
  31. package/dist/src/stream.d.ts.map +1 -1
  32. package/dist/src/stream.js +6 -2
  33. package/dist/src/stream.js.map +1 -1
  34. package/dist/src/transport.d.ts +3 -3
  35. package/dist/src/transport.d.ts.map +1 -1
  36. package/dist/src/transport.js +6 -5
  37. package/dist/src/transport.js.map +1 -1
  38. package/package.json +16 -5
  39. package/src/index.ts +11 -3
  40. package/src/muxer.ts +45 -15
  41. package/src/peer_transport/handler.ts +139 -0
  42. package/src/peer_transport/listener.ts +44 -0
  43. package/src/peer_transport/pb/index.proto +16 -0
  44. package/src/peer_transport/pb/index.ts +92 -0
  45. package/src/peer_transport/transport.ts +167 -0
  46. package/src/peer_transport/util.ts +62 -0
  47. package/src/stream.ts +7 -2
  48. package/src/transport.ts +9 -8
@@ -1,4 +1,7 @@
1
1
  import type { Transport } from '@libp2p/interface-transport';
2
- import { WebRTCTransportComponents } from './transport.js';
3
- export declare function webRTC(): (components: WebRTCTransportComponents) => Transport;
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
@@ -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,EAAmB,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE3E,wBAAgB,MAAM,IAAK,CAAC,UAAU,EAAE,yBAAyB,KAAK,SAAS,CAE9E"}
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
- export function webRTC() {
3
- return (components) => new WebRTCTransport(components);
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA6B,MAAM,gBAAgB,CAAA;AAE3E,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,UAAqC,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAA;AACnF,CAAC"}
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"}
@@ -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
- * The string representation of the protocol, required by `StreamMuxerFactory`
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
@@ -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;IAChE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAElD;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAY;gBAEf,cAAc,EAAE,iBAAiB;IAI9C,iBAAiB,CAAE,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,WAAW;CAGpE;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAY;IAErC;;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,CAAW;IAEnD;;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,IAAI,CAAC,EAAE,eAAe;IAmCtE,SAAS,IAAK,MAAM;CAgBrB"}
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
- * The string representation of the protocol, required by `StreamMuxerFactory`
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?.onStreamEnd
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
@@ -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;IAWlC,YAAa,cAAiC;QAL9C;;WAEG;QACH,aAAQ,GAAW,SAAS,CAAA;QAG1B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;IACtC,CAAC;IAED,iBAAiB,CAAE,IAAkC;QACnD,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAmC3B,YAAa,cAAiC,EAAE,IAAsB;QA9BtE;;WAEG;QACM,aAAQ,GAAW,SAAS,CAAA;QAErC;;WAEG;QACH,YAAO,GAAa,EAAE,CAAA;QAOtB;;WAEG;QACH,UAAK,GAAsC,GAAG,EAAE,GAAE,CAAC,CAAA;QAEnD;;WAEG;QACH,WAAM,GAAuB,SAAS,CAAA;QAEtC;;WAEG;QACH,SAAI,GAAoC,OAAO,CAAA;QAG7C;;WAEG;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAEhB;;WAEG;QACH,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QAEpC;;;;;WAKG;QACH,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAClD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;gBAC9B,OAAO;gBACP,IAAI,EAAE;oBACJ,SAAS,EAAE,SAAS;oBACpB,QAAQ,EAAE;wBACR,IAAI,EAAE,CAAC;qBACR;iBACF;gBACD,OAAO,EAAE,IAAI,EAAE,WAAW;aAC3B,CAAC,CAAA;YAEF,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,IAAI,EAAE;gBACpC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;aAC9B;QACH,CAAC,CAAA;IACH,CAAC;IAED,SAAS;QACP,uIAAuI;QACvI,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;YAC9B,OAAO;YACP,IAAI,EAAE;gBACJ,SAAS,EAAE,UAAU;gBACrB,QAAQ,EAAE;oBACR,IAAI,EAAE,CAAC;iBACR;aACF;YACD,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW;SAChC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
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"}