werift 0.22.4 → 0.22.5

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 (60) hide show
  1. package/lib/common/src/log.js +1 -4
  2. package/lib/common/src/log.js.map +1 -1
  3. package/lib/common/src/transport.d.ts +2 -2
  4. package/lib/common/src/transport.js +4 -7
  5. package/lib/common/src/transport.js.map +1 -1
  6. package/lib/dtls/src/cipher/create.js +1 -4
  7. package/lib/dtls/src/cipher/create.js.map +1 -1
  8. package/lib/dtls/src/cipher/namedCurve.js +2 -5
  9. package/lib/dtls/src/cipher/namedCurve.js.map +1 -1
  10. package/lib/dtls/src/cipher/prf.js +2 -5
  11. package/lib/dtls/src/cipher/prf.js.map +1 -1
  12. package/lib/dtls/src/cipher/suites/aead.js +1 -34
  13. package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
  14. package/lib/dtls/src/context/cipher.js +1 -34
  15. package/lib/dtls/src/context/cipher.js.map +1 -1
  16. package/lib/ice/src/dns/lookup.d.ts +2 -2
  17. package/lib/ice/src/dns/lookup.js +4 -7
  18. package/lib/ice/src/dns/lookup.js.map +1 -1
  19. package/lib/ice/src/ice.js +8 -44
  20. package/lib/ice/src/ice.js.map +1 -1
  21. package/lib/ice/src/stun/attributes.js +6 -42
  22. package/lib/ice/src/stun/attributes.js.map +1 -1
  23. package/lib/ice/src/stun/message.js +1 -4
  24. package/lib/ice/src/stun/message.js.map +1 -1
  25. package/lib/ice/src/utils.d.ts +1 -1
  26. package/lib/ice/src/utils.js +4 -7
  27. package/lib/ice/src/utils.js.map +1 -1
  28. package/lib/index.mjs +35 -26
  29. package/lib/nonstandard/index.mjs +13 -10
  30. package/lib/rtp/src/extra/container/mp4/container.js +1 -34
  31. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  32. package/lib/rtp/src/extra/container/mp4/h264.js +1 -4
  33. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  34. package/lib/rtp/src/extra/container/mp4/sps-parser.js +1 -4
  35. package/lib/rtp/src/extra/container/mp4/sps-parser.js.map +1 -1
  36. package/lib/rtp/src/extra/container/webm/container.js +1 -34
  37. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  38. package/lib/rtp/src/extra/container/webm/util.js +1 -34
  39. package/lib/rtp/src/extra/container/webm/util.js.map +1 -1
  40. package/lib/rtp/src/srtp/context/context.js +4 -7
  41. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  42. package/lib/sctp/src/chunk.js +1 -4
  43. package/lib/sctp/src/chunk.js.map +1 -1
  44. package/lib/sctp/src/index.d.ts +1 -0
  45. package/lib/sctp/src/index.js +4 -1
  46. package/lib/sctp/src/index.js.map +1 -1
  47. package/lib/webrtc/src/helper.d.ts +1 -1
  48. package/lib/webrtc/src/helper.js +2 -5
  49. package/lib/webrtc/src/helper.js.map +1 -1
  50. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +3 -0
  51. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  52. package/lib/webrtc/src/peerConnection.js +1 -1
  53. package/lib/webrtc/src/peerConnection.js.map +1 -1
  54. package/lib/webrtc/src/sdp.js +1 -34
  55. package/lib/webrtc/src/sdp.js.map +1 -1
  56. package/lib/webrtc/src/sdpManager.js +9 -1
  57. package/lib/webrtc/src/sdpManager.js.map +1 -1
  58. package/lib/webrtc/src/secureTransportManager.js +1 -1
  59. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  60. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import EventEmitter from "events";
1
+ import { EventEmitter } from "node:events";
2
2
  export declare function enumerate<T>(arr: T[]): [number, T][];
3
3
  export declare function divide(from: string, split: string): [string, string];
4
4
  export declare class PromiseQueue {
@@ -1,12 +1,9 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.EventTarget = exports.PromiseQueue = void 0;
7
4
  exports.enumerate = enumerate;
8
5
  exports.divide = divide;
9
- const events_1 = __importDefault(require("events"));
6
+ const node_events_1 = require("node:events");
10
7
  function enumerate(arr) {
11
8
  return arr.map((v, i) => [i, v]);
12
9
  }
@@ -53,7 +50,7 @@ class PromiseQueue {
53
50
  }
54
51
  }
55
52
  exports.PromiseQueue = PromiseQueue;
56
- class EventTarget extends events_1.default {
53
+ class EventTarget extends node_events_1.EventEmitter {
57
54
  constructor() {
58
55
  super(...arguments);
59
56
  Object.defineProperty(this, "addEventListener", {
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;;;;AAEA,8BAEC;AAED,wBAGC;AATD,oDAAkC;AAElC,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAa,YAAY;IAAzB;QACE;;;;mBAA6D,EAAE;WAAC;QAChE;;;;mBAAU,KAAK;WAAC;QAEhB;;;;mBAAO,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,CAAC,CAAC;WAAC;IAcP,CAAC;IAZS,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAtBD,oCAsBC;AAED,MAAa,WAAY,SAAQ,gBAAY;IAA7C;;QACE;;;;mBAAmB,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnC,CAAC;WAAC;QAEF;;;;mBAAsB,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBACzE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;WAAC;IACJ,CAAC;CAAA;AARD,kCAQC","sourcesContent":["import EventEmitter from \"events\";\n\nexport function enumerate<T>(arr: T[]): [number, T][] {\n return arr.map((v, i) => [i, v]);\n}\n\nexport function divide(from: string, split: string): [string, string] {\n const arr = from.split(split);\n return [arr[0], arr.slice(1).join(split)];\n}\n\nexport class PromiseQueue {\n queue: { promise: () => Promise<any>; done: () => void }[] = [];\n running = false;\n\n push = (promise: () => Promise<any>) =>\n new Promise<void>((r) => {\n this.queue.push({ promise, done: r });\n if (!this.running) this.run();\n });\n\n private async run() {\n const task = this.queue.shift();\n if (task) {\n this.running = true;\n await task.promise();\n task.done();\n\n this.run();\n } else {\n this.running = false;\n }\n }\n}\n\nexport class EventTarget extends EventEmitter {\n addEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.addListener(type, listener);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.removeListener(type, listener);\n };\n}\n"]}
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;AAEA,8BAEC;AAED,wBAGC;AATD,6CAA2C;AAE3C,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAa,YAAY;IAAzB;QACE;;;;mBAA6D,EAAE;WAAC;QAChE;;;;mBAAU,KAAK;WAAC;QAEhB;;;;mBAAO,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,CAAC,CAAC;WAAC;IAcP,CAAC;IAZS,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAtBD,oCAsBC;AAED,MAAa,WAAY,SAAQ,0BAAY;IAA7C;;QACE;;;;mBAAmB,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnC,CAAC;WAAC;QAEF;;;;mBAAsB,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBACzE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;WAAC;IACJ,CAAC;CAAA;AARD,kCAQC","sourcesContent":["import { EventEmitter } from \"node:events\";\n\nexport function enumerate<T>(arr: T[]): [number, T][] {\n return arr.map((v, i) => [i, v]);\n}\n\nexport function divide(from: string, split: string): [string, string] {\n const arr = from.split(split);\n return [arr[0], arr.slice(1).join(split)];\n}\n\nexport class PromiseQueue {\n queue: { promise: () => Promise<any>; done: () => void }[] = [];\n running = false;\n\n push = (promise: () => Promise<any>) =>\n new Promise<void>((r) => {\n this.queue.push({ promise, done: r });\n if (!this.running) this.run();\n });\n\n private async run() {\n const task = this.queue.shift();\n if (task) {\n this.running = true;\n await task.promise();\n task.done();\n\n this.run();\n } else {\n this.running = false;\n }\n }\n}\n\nexport class EventTarget extends EventEmitter {\n addEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.addListener(type, listener);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.removeListener(type, listener);\n };\n}\n"]}
@@ -138,6 +138,9 @@ class WebmFactory extends _1.MediaWriter {
138
138
  if (this.props.path) {
139
139
  webm.pipe(async (o) => {
140
140
  const eol = await (0, rtpExtra_1.saveToFileSystem)(this.props.path)(o);
141
+ if (this.props.stream) {
142
+ this.props.stream.execute(o);
143
+ }
141
144
  if (eol) {
142
145
  this.onEol.execute();
143
146
  this.ended = true;
@@ -1 +1 @@
1
- {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { unlink } from \"fs/promises\";\nimport { Event, EventDisposer } from \"../../../imports/common\";\n\nimport { MediaWriter } from \".\";\nimport { type MediaStreamTrack, WeriftError } from \"../../..\";\nimport {\n DepacketizeCallback,\n JitterBufferCallback,\n LipsyncCallback,\n NtpTimeCallback,\n RtcpSourceCallback,\n RtpSourceCallback,\n RtpTimeCallback,\n WebmCallback,\n type WebmSupportedCodec,\n type WebmTrack,\n saveToFileSystem,\n} from \"../../../imports/rtpExtra\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceCallback[] = [];\n private onEol = new Event();\n private ended = false;\n unSubscribers = new EventDisposer();\n\n async start(tracks: MediaStreamTrack[]) {\n if (this.props.path) {\n await unlink(this.props.path).catch((e) => e);\n }\n\n const inputTracks: (WebmTrack & { track: MediaStreamTrack })[] = tracks.map(\n (track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): WebmSupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new WeriftError({\n message: \"unsupported codec\",\n payload: { track, path: sourcePath },\n });\n }\n })();\n return {\n kind: \"video\" as const,\n codec,\n clockRate: 90000,\n trackNumber,\n width: this.props.width ?? 640,\n height: this.props.height ?? 360,\n roll: this.props.roll,\n payloadType,\n track,\n };\n } else {\n return {\n kind: \"audio\" as const,\n codec: \"OPUS\" as const,\n clockRate: 48000,\n trackNumber,\n payloadType,\n track,\n };\n }\n },\n );\n\n const webm = new WebmCallback(inputTracks, {\n duration: this.props.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n const lipsync = new LipsyncCallback(this.props.lipsync ?? {});\n\n this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {\n const rtpSource = new RtpSourceCallback();\n const rtcpSource = new RtcpSourceCallback();\n track.onReceiveRtp\n .subscribe((rtp) => {\n rtpSource.input(rtp.clone());\n })\n .disposer(this.unSubscribers);\n track.onReceiveRtcp\n .subscribe((rtcp) => {\n rtcpSource.input(rtcp);\n })\n .disposer(this.unSubscribers);\n const time = this.props.disableNtp\n ? new RtpTimeCallback(clockRate)\n : new NtpTimeCallback(clockRate);\n\n if (track.kind === \"video\") {\n const depacketizer = new DepacketizeCallback(codec, {\n isFinalPacketInSequence: (h) => h.marker,\n });\n const jitterBuffer = new JitterBufferCallback(\n clockRate,\n this.props.jitterBuffer ?? {},\n );\n\n rtpSource.pipe(jitterBuffer.input);\n rtcpSource.pipe(time.input);\n\n jitterBuffer.pipe(time.input);\n time.pipe(depacketizer.input);\n if (this.props.disableLipSync) {\n depacketizer.pipe(webm.inputVideo);\n } else {\n depacketizer.pipe(lipsync.inputVideo);\n lipsync.pipeVideo(webm.inputVideo);\n }\n } else {\n const depacketizer = new DepacketizeCallback(codec);\n\n rtpSource.pipe(time.input);\n rtcpSource.pipe(time.input);\n\n time.pipe(depacketizer.input);\n if (this.props.disableLipSync) {\n depacketizer.pipe(webm.inputAudio);\n } else {\n depacketizer.pipe(lipsync.inputAudio);\n lipsync.pipeAudio(webm.inputAudio);\n }\n }\n\n return rtpSource;\n });\n if (this.props.path) {\n webm.pipe(async (o) => {\n const eol = await saveToFileSystem(this.props.path)(o);\n if (eol) {\n this.onEol.execute();\n this.ended = true;\n }\n });\n } else if (this.props.stream) {\n webm.pipe(async (o) => {\n this.props.stream.execute(o);\n });\n }\n }\n\n async stop() {\n await Promise.all(this.rtpSources.map((r) => r.stop()));\n\n if (!this.ended) {\n await this.onEol.asPromise(5000).catch((e) => e);\n }\n this.unSubscribers.dispose();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = (typeof supportedVideoCodecs)[number];\n"]}
1
+ {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { unlink } from \"fs/promises\";\nimport { Event, EventDisposer } from \"../../../imports/common\";\n\nimport { MediaWriter } from \".\";\nimport { type MediaStreamTrack, WeriftError } from \"../../..\";\nimport {\n DepacketizeCallback,\n JitterBufferCallback,\n LipsyncCallback,\n NtpTimeCallback,\n RtcpSourceCallback,\n RtpSourceCallback,\n RtpTimeCallback,\n WebmCallback,\n type WebmSupportedCodec,\n type WebmTrack,\n saveToFileSystem,\n} from \"../../../imports/rtpExtra\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceCallback[] = [];\n private onEol = new Event();\n private ended = false;\n unSubscribers = new EventDisposer();\n\n async start(tracks: MediaStreamTrack[]) {\n if (this.props.path) {\n await unlink(this.props.path).catch((e) => e);\n }\n\n const inputTracks: (WebmTrack & { track: MediaStreamTrack })[] = tracks.map(\n (track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): WebmSupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new WeriftError({\n message: \"unsupported codec\",\n payload: { track, path: sourcePath },\n });\n }\n })();\n return {\n kind: \"video\" as const,\n codec,\n clockRate: 90000,\n trackNumber,\n width: this.props.width ?? 640,\n height: this.props.height ?? 360,\n roll: this.props.roll,\n payloadType,\n track,\n };\n } else {\n return {\n kind: \"audio\" as const,\n codec: \"OPUS\" as const,\n clockRate: 48000,\n trackNumber,\n payloadType,\n track,\n };\n }\n },\n );\n\n const webm = new WebmCallback(inputTracks, {\n duration: this.props.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n const lipsync = new LipsyncCallback(this.props.lipsync ?? {});\n\n this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {\n const rtpSource = new RtpSourceCallback();\n const rtcpSource = new RtcpSourceCallback();\n track.onReceiveRtp\n .subscribe((rtp) => {\n rtpSource.input(rtp.clone());\n })\n .disposer(this.unSubscribers);\n track.onReceiveRtcp\n .subscribe((rtcp) => {\n rtcpSource.input(rtcp);\n })\n .disposer(this.unSubscribers);\n const time = this.props.disableNtp\n ? new RtpTimeCallback(clockRate)\n : new NtpTimeCallback(clockRate);\n\n if (track.kind === \"video\") {\n const depacketizer = new DepacketizeCallback(codec, {\n isFinalPacketInSequence: (h) => h.marker,\n });\n const jitterBuffer = new JitterBufferCallback(\n clockRate,\n this.props.jitterBuffer ?? {},\n );\n\n rtpSource.pipe(jitterBuffer.input);\n rtcpSource.pipe(time.input);\n\n jitterBuffer.pipe(time.input);\n time.pipe(depacketizer.input);\n if (this.props.disableLipSync) {\n depacketizer.pipe(webm.inputVideo);\n } else {\n depacketizer.pipe(lipsync.inputVideo);\n lipsync.pipeVideo(webm.inputVideo);\n }\n } else {\n const depacketizer = new DepacketizeCallback(codec);\n\n rtpSource.pipe(time.input);\n rtcpSource.pipe(time.input);\n\n time.pipe(depacketizer.input);\n if (this.props.disableLipSync) {\n depacketizer.pipe(webm.inputAudio);\n } else {\n depacketizer.pipe(lipsync.inputAudio);\n lipsync.pipeAudio(webm.inputAudio);\n }\n }\n\n return rtpSource;\n });\n if (this.props.path) {\n webm.pipe(async (o) => {\n const eol = await saveToFileSystem(this.props.path)(o);\n if (this.props.stream) {\n this.props.stream.execute(o);\n }\n if (eol) {\n this.onEol.execute();\n this.ended = true;\n }\n });\n } else if (this.props.stream) {\n webm.pipe(async (o) => {\n this.props.stream.execute(o);\n });\n }\n }\n\n async stop() {\n await Promise.all(this.rtpSources.map((r) => r.stop()));\n\n if (!this.ended) {\n await this.onEol.asPromise(5000).catch((e) => e);\n }\n this.unSubscribers.dispose();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = (typeof supportedVideoCodecs)[number];\n"]}
@@ -461,7 +461,7 @@ class RTCPeerConnection extends helper_1.EventTarget {
461
461
  media: this._localDescription.media[0],
462
462
  transceiver: this.transceiverManager
463
463
  .getTransceivers()
464
- .find((t) => t.dtlsTransport.iceTransport.id === iceTransport.id),
464
+ .find((t) => t?.dtlsTransport?.iceTransport.id === iceTransport.id),
465
465
  sctpTransport: this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id
466
466
  ? this.sctpTransport
467
467
  : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport type { RTCDataChannel } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport type { CandidatePair, Message, Protocol } from \"./imports/ice\";\nimport {\n type MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpReceiver,\n type RTCRtpSender,\n type RTCRtpTransceiver,\n RtpRouter,\n TransceiverManager,\n type TransceiverOptions,\n useOPUS,\n usePCMU,\n useVP8,\n} from \"./media\";\nimport {\n type RTCPeerConnectionStats,\n type RTCStats,\n RTCStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type MediaDescription,\n SessionDescription,\n} from \"./sdp\";\nimport { type RTCSessionDescriptionInit, SDPManager } from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type { DtlsKeys, RTCDtlsTransport } from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport type { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\nimport { andDirection, deepMerge } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = randomUUID().toString();\n\n config: Required<PeerConfig> = generateDefaultPeerConfig();\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n needRestart = false;\n private readonly router = new RtpRouter();\n private readonly sdpManager: SDPManager;\n private readonly transceiverManager: TransceiverManager;\n private readonly sctpManager: SctpTransportManager;\n private readonly secureManager: SecureTransportManager;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate | undefined]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onicecandidateerror?: CallbackWithValue<any>;\n onicegatheringstatechange?: CallbackWithValue<any>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n oniceconnectionstatechange?: Callback;\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n this.setConfiguration(config);\n\n this.sdpManager = new SDPManager({\n cname: this.cname,\n bundlePolicy: this.config.bundlePolicy,\n });\n this.transceiverManager = new TransceiverManager(\n this.cname,\n this.config,\n this.router,\n );\n this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);\n this.transceiverManager.onRemoteTransceiverAdded.pipe(\n this.onRemoteTransceiverAdded,\n );\n this.transceiverManager.onTrack.subscribe(\n ({ track, stream, transceiver }) => {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) {\n this.ontrack(event);\n }\n },\n );\n this.transceiverManager.onNegotiationNeeded.subscribe(() =>\n this.needNegotiation(),\n );\n this.sctpManager = new SctpTransportManager();\n this.sctpManager.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n const event: RTCDataChannelEvent = { channel };\n this.ondatachannel?.(event);\n this.emit(\"datachannel\", event);\n });\n this.secureManager = new SecureTransportManager({\n config: this.config,\n sctpManager: this.sctpManager,\n transceiverManager: this.transceiverManager,\n });\n this.secureManager.iceGatheringStateChange.pipe(\n this.iceGatheringStateChange,\n );\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n });\n this.secureManager.connectionStateChange.subscribe((state) => {\n this.connectionStateChange.execute(state);\n this.onconnectionstatechange?.();\n this.emit(\"connectionstatechange\");\n });\n this.secureManager.onIceCandidate.subscribe((candidate) => {\n const iceCandidate = candidate ? candidate.toJSON() : undefined;\n this.onIceCandidate.execute(iceCandidate);\n this.onicecandidate?.({ candidate: iceCandidate });\n this.emit(\"icecandidate\", { candidate: iceCandidate });\n });\n }\n\n get connectionState() {\n return this.secureManager.connectionState;\n }\n get iceConnectionState() {\n return this.secureManager.iceConnectionState;\n }\n get iceGathererState() {\n return this.secureManager.iceGatheringState;\n }\n get iceGatheringState() {\n return this.secureManager.iceGatheringState;\n }\n get dtlsTransports() {\n return this.secureManager.dtlsTransports;\n }\n get sctpTransport() {\n return this.sctpManager.sctpTransport;\n }\n get sctpRemotePort() {\n return this.sctpManager.sctpRemotePort;\n }\n get iceTransports() {\n return this.secureManager.iceTransports;\n }\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n get iceGeneration() {\n return this.iceTransports[0].connection.generation;\n }\n get localDescription() {\n return this.sdpManager.localDescription;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription;\n }\n get remoteIsBundled() {\n return this.sdpManager.remoteIsBundled;\n }\n /**@private */\n get _localDescription() {\n return this.sdpManager._localDescription;\n }\n /**@private */\n get _remoteDescription() {\n return this.sdpManager._remoteDescription;\n }\n\n getTransceivers() {\n return this.transceiverManager.getTransceivers();\n }\n\n getSenders(): RTCRtpSender[] {\n return this.transceiverManager.getSenders();\n }\n\n getReceivers() {\n return this.transceiverManager.getReceivers();\n }\n\n setConfiguration(config: Partial<PeerConfig>) {\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n for (const [i, codecParams] of enumerate([\n ...(this.config.codecs.audio || []),\n ...(this.config.codecs.video || []),\n ])) {\n if (codecParams.payloadType != undefined) {\n continue;\n }\n\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n if (codecParams.contentType === \"audio\") {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n }\n break;\n }\n }\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n }\n\n getConfiguration() {\n return this.config;\n }\n\n async createOffer({ iceRestart }: { iceRestart?: boolean } = {}) {\n if (iceRestart || this.needRestart) {\n this.needRestart = false;\n this.secureManager.restartIce();\n }\n\n await this.secureManager.ensureCerts();\n\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (transceiver.codecs.length === 0) {\n this.transceiverManager.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n }\n\n const description = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n return description.toJSON();\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport();\n const dtlsTransport = this.findOrCreateTransport();\n sctp.setDtlsTransport(dtlsTransport);\n return sctp;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {},\n ): RTCDataChannel {\n if (!this.sctpTransport) {\n this.createSctpTransport();\n this.needNegotiation();\n }\n\n const channel = this.sctpManager.createDataChannel(label, options);\n if (!channel.sctp.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n channel.sctp.setDtlsTransport(dtlsTransport);\n }\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) {\n throw new Error(\"peer closed\");\n }\n this.transceiverManager.removeTrack(sender);\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") {\n return;\n }\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private findOrCreateTransport() {\n const [existing] = this.iceTransports;\n\n // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.\n // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum\n if (\n this.sdpManager.bundlePolicy === \"max-bundle\" ||\n (this.sdpManager.bundlePolicy !== \"disable\" && this.remoteIsBundled)\n ) {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const dtlsTransport = this.secureManager.createTransport();\n dtlsTransport.onRtp.subscribe((rtp) => {\n this.router.routeRtp(rtp);\n });\n dtlsTransport.onRtcp.subscribe((rtcp) => {\n this.router.routeRtcp(rtcp);\n });\n const iceTransport = dtlsTransport.iceTransport;\n\n iceTransport.onNegotiationNeeded.subscribe(() => {\n this.needNegotiation();\n });\n iceTransport.onIceCandidate.subscribe((candidate) => {\n if (!this.localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n if (!candidate) {\n this.sdpManager.setLocal(\n this._localDescription!,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n this.onIceCandidate.execute(undefined);\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: undefined });\n }\n this.emit(\"icecandidate\", { candidate: undefined });\n return;\n }\n\n if (!this._localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n\n this.secureManager.handleNewIceCandidate({\n candidate,\n bundlePolicy: this.sdpManager.bundlePolicy,\n remoteIsBundled: !!this.sdpManager.remoteIsBundled,\n media: this._localDescription.media[0],\n transceiver: this.transceiverManager\n .getTransceivers()\n .find((t) => t.dtlsTransport.iceTransport.id === iceTransport.id),\n sctpTransport:\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ? this.sctpTransport\n : undefined,\n });\n });\n\n return dtlsTransport;\n }\n\n async setLocalDescription(sessionDescription?: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type\n const implicitOfferState: RTCSignalingState[] = [\n \"stable\",\n \"have-local-offer\",\n \"have-remote-pranswer\",\n ];\n sessionDescription =\n sessionDescription ??\n (implicitOfferState.includes(this.signalingState)\n ? await this.createOffer()\n : await this.createAnswer());\n\n // # parse and validate description\n const description = this.sdpManager.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: sessionDescription.type,\n });\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n for (const [i, media] of enumerate(description.media)) {\n const mid = media.rtp.muxId!;\n this.sdpManager.registerMid(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver =\n this.transceiverManager.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n }\n\n // setup ice,dtls role\n const role = description.media.find((media) => media.dtlsParams)?.dtlsParams\n ?.role;\n\n this.secureManager.setLocalRole({\n type: description.type,\n role,\n });\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n for (const t of this.transceiverManager.getTransceivers()) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n }\n }\n\n // for trickle ice\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n await this.gatherCandidates().catch((e) => {\n log(\"gatherCandidates failed\", e);\n });\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private async gatherCandidates() {\n await this.secureManager.gatherCandidates(\n !!this.sdpManager.remoteIsBundled,\n );\n }\n\n async addIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\n const sdp = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n await this.secureManager.addIceCandidate(sdp, candidateMessage);\n }\n\n private async connect() {\n log(\"start connect\");\n\n const res = await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n if (iceTransport.state === \"connected\") {\n return;\n }\n const checkDtlsConnected = () => dtlsTransport.state === \"connected\";\n\n if (checkDtlsConnected()) {\n return;\n }\n\n this.secureManager.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n\n if (checkDtlsConnected()) {\n return;\n }\n\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n\n if (\n this.sctpTransport &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpManager.connectSctp();\n }\n }),\n );\n\n if (res.find((r) => r.status === \"rejected\")) {\n this.secureManager.setConnectionState(\"failed\");\n } else {\n this.secureManager.setConnectionState(\"connected\");\n }\n }\n\n restartIce() {\n this.needRestart = true;\n this.needNegotiation();\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (sessionDescription instanceof SessionDescription) {\n sessionDescription = sessionDescription.toSdp();\n }\n\n // # parse and validate description\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\n );\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const matchTransceiverWithMedia = (\n transceiver: RTCRtpTransceiver,\n media: MediaDescription,\n ) =>\n transceiver.kind === media.kind &&\n [undefined, media.rtp.muxId].includes(transceiver.mid);\n\n let transports = remoteSdp.media.map((remoteMedia, i) => {\n let dtlsTransport: RTCDtlsTransport;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => matchTransceiverWithMedia(t, remoteMedia));\n if (!transceiver) {\n // create remote transceiver\n transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n } else {\n if (transceiver.direction === \"inactive\" && transceiver.stopping) {\n transceiver.stopped = true;\n\n if (sessionDescription.type === \"answer\") {\n transceiver.setCurrentDirection(\"inactive\");\n }\n return;\n }\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.transceiverManager.setRemoteRTP(\n transceiver,\n remoteMedia,\n remoteSdp.type,\n i,\n );\n } else if (remoteMedia.kind === \"application\") {\n let sctpTransport = this.sctpTransport;\n if (!sctpTransport) {\n sctpTransport = this.createSctpTransport();\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = sctpTransport.dtlsTransport;\n } else {\n sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = sctpTransport.dtlsTransport;\n\n this.sctpManager.setRemoteSCTP(remoteMedia, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams) {\n const renomination = !!this.sdpManager.inactiveRemoteMedia;\n iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n if (remoteMedia.dtlsParams) {\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n }) as RTCIceTransport[];\n\n // filter out inactive transports\n transports = transports.filter((iceTransport) => !!iceTransport);\n\n const removedTransceivers = this.transceiverManager\n .getTransceivers()\n .filter(\n (t) =>\n remoteSdp.media.find((m) => matchTransceiverWithMedia(t, m)) ==\n undefined,\n );\n\n if (sessionDescription.type === \"answer\") {\n for (const transceiver of removedTransceivers) {\n // todo: handle answer side transceiver removal work.\n // event should trigger to notify media source to stop.\n transceiver.stop();\n transceiver.stopped = true;\n }\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const dtlsTransport = this.findOrCreateTransport();\n const transceiver = this.transceiverManager.addTransceiver(\n trackOrKind,\n dtlsTransport,\n options,\n );\n\n this.secureManager.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ): RTCRtpSender {\n if (this.isClosed) {\n throw new Error(\"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, ms);\n if (!transceiver.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n transceiver.setDtlsTransport(dtlsTransport);\n }\n this.needNegotiation();\n return transceiver.sender;\n }\n\n async createAnswer() {\n this.assertNotClosed();\n\n await this.secureManager.ensureCerts();\n\n const description = this.sdpManager.buildAnswerSdp({\n transceivers: this.transceiverManager.getTransceivers(),\n sctpTransport: this.sctpTransport,\n signalingState: this.signalingState,\n });\n return description.toJSON();\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange({});\n }\n }\n\n private createPeerConnectionStats(): RTCPeerConnectionStats {\n const timestamp = getStatsTimestamp();\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\"),\n timestamp,\n dataChannelsOpened: this.sctpManager.dataChannelsOpened,\n dataChannelsClosed: this.sctpManager.dataChannelsClosed,\n };\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport> {\n const stats: RTCStats[] = [];\n\n // Peer connection stats - always included regardless of selector\n stats.push(this.createPeerConnectionStats());\n\n // Get stats from transceivers\n const transceiverStats = await this.transceiverManager.getStats(selector);\n stats.push(...transceiverStats);\n\n // Get transport stats - always included regardless of selector\n const transportStats = await this.secureManager.getStats();\n stats.push(...transportStats);\n\n // Get data channel stats - always included regardless of selector\n if (this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats();\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n return new RTCStatsReport(stats);\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n await this.secureManager.close();\n await this.sctpManager.close();\n\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n\n log(\"peerConnection closed\");\n }\n}\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n /** Add additional host (local) addresses to use for candidate gathering.\n * Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.\n */\n iceAdditionalHostAddresses: string[] | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n forceTurnTCP: boolean;\n /** such as google cloud run */\n iceUseLinkLocalAddress: boolean | undefined;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n iceFilterCandidatePair: ((pair: CandidatePair) => boolean) | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n icePasswordPrefix: string | undefined;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n midSuffix: boolean;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters,\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase(),\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nfunction generateDefaultPeerConfig(): PeerConfig {\n return {\n codecs: {\n audio: [useOPUS(), usePCMU()],\n video: [useVP8()],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceAdditionalHostAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate?: RTCIceCandidate;\n}\n"]}
1
+ {"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAGpC,qCAAkD;AAClD,6CAK0B;AAE1B,mCAciB;AACjB,yCAMuB;AACvB,+CAAqD;AACrD,+BAIe;AACf,6CAA0E;AAC1E,qEAAkE;AAWlE,mCAAkD;AAElD,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,8CAA8C,CAAC,CAAC;AAElE,MAAa,iBAAkB,SAAQ,oBAAW;IAoChD,YAAY,SAA8B,EAAE;QAC1C,KAAK,EAAE,CAAC;QApCD;;;;mBAAQ,IAAA,mBAAU,GAAE,CAAC,QAAQ,EAAE;WAAC;QAEzC;;;;mBAA+B,yBAAyB,EAAE;WAAC;QAC3D;;;;mBAAoC,QAAQ;WAAC;QAC7C;;;;mBAAoB,KAAK;WAAC;QAC1B;;;;mBAAc,KAAK;WAAC;QACH;;;;mBAAS,IAAI,iBAAS,EAAE;WAAC;QACzB;;;;;WAAuB;QACvB;;;;;WAAuC;QACvC;;;;;WAAkC;QAClC;;;;;WAAsC;QAC/C;;;;mBAAW,KAAK;WAAC;QACjB;;;;mBAA0B,KAAK;WAAC;QAE/B;;;;mBAA0B,IAAI,cAAK,EAAsB;WAAC;QAC1D;;;;mBAA2B,IAAI,cAAK,EAA2B;WAAC;QAChE;;;;mBAAuB,IAAI,cAAK,EAAuB;WAAC;QACxD;;;;mBAAwB,IAAI,cAAK,EAAqB;WAAC;QACvD;;;;mBAAgB,IAAI,cAAK,EAAoB;WAAC;QAC9C;;;;mBAA2B,IAAI,cAAK,EAAuB;WAAC;QAC5D;;;;mBAAqB,IAAI,cAAK,EAAuB;WAAC;QACtD;;;;mBAAiB,IAAI,cAAK,EAAiC;WAAC;QAC5D;;;;mBAAsB,IAAI,cAAK,EAAM;WAAC;QACtC;;;;mBAAU,IAAI,cAAK,EAAsB;WAAC;QAEnD;;;;;WAAuD;QACvD;;;;;WAA8D;QAC9D;;;;;WAA6C;QAC7C;;;;;WAAmD;QACnD;;;;;WAA6C;QAC7C;;;;;WAAgD;QAChD;;;;;WAA2C;QAC3C;;;;;WAAmC;QACnC;;;;;WAAsC;QAoP9B;;;;mBAAkB,KAAK,IAAI,EAAE;gBACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBACpC,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;oBAC/D,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;gBACrC,YAAY,CAAC,GAAG,EAAE;oBAChB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAC9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;oBACnC,IAAI,IAAI,CAAC,mBAAmB;wBAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gBAC7D,CAAC,CAAC,CAAC;YACL,CAAC;WAAC;QA1PA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAU,CAAC;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,0BAAkB,CAC9C,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzE,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,IAAI,CACnD,IAAI,CAAC,wBAAwB,CAC9B,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CACvC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;YACjC,MAAM,KAAK,GAAkB;gBAC3B,KAAK;gBACL,OAAO,EAAE,CAAC,MAAM,CAAC;gBACjB,WAAW;gBACX,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CACF,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,EAAE,CACzD,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,kCAAoB,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,KAAK,GAAwB,EAAE,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,+CAAsB,CAAC;YAC9C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAC7C,IAAI,CAAC,uBAAuB,CAC7B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9D,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YACD,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACxD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;IAC5C,CAAC;IACD,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;IAC/C,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;IAC9C,CAAC;IACD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC;IAC9C,CAAC;IACD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;IAC3C,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;IACxC,CAAC;IACD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IACzC,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;IAC1C,CAAC;IACD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACjC,CAAC;IACD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACrD,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAC1C,CAAC;IACD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;IAC3C,CAAC;IACD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;IACzC,CAAC;IACD,cAAc;IACd,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;IAC3C,CAAC;IACD,cAAc;IACd,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;IAC5C,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;IACnD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;IAChD,CAAC;IAED,gBAAgB,CAAC,MAA2B;QAC1C,IAAA,iBAAS,EAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC5C,IAAI,GAAG,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC7D,IAAI,GAAG,IAAI,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnE,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,IAAA,kBAAS,EAAC;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACpC,CAAC,EAAE,CAAC;YACH,IAAI,WAAW,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YAED,WAAW,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,QAAQ,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvC,KAAK,KAAK;oBACR,CAAC;wBACC,WAAW,CAAC,UAAU,GAAG,OAAO,WAAW,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;oBAChE,CAAC;oBACD,MAAM;gBACR,KAAK,KAAK;oBACR,CAAC;wBACC,IAAI,WAAW,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;4BACxC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,GAAG,CAAC,CAAC;4BAC9C,WAAW,CAAC,UAAU,GAAG,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;4BACrD,WAAW,CAAC,WAAW,GAAG,EAAE,CAAC;wBAC/B,CAAC;oBACH,CAAC;oBACD,MAAM;YACV,CAAC;QACH,CAAC;QAED;YACE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC;SAC9C,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAE,UAAU,KAA+B,EAAE;QAC7D,IAAI,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAEvC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC;YACpE,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,WAAW,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,WAAW,CAAC,gBAAgB;oBAC1B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAC/C,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,mBAAmB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CACf,KAAa,EACb,UAOK,EAAE;QAEP,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAeO,qBAAqB;QAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAEtC,wHAAwH;QACxH,wDAAwD;QACxD,IACE,IAAI,CAAC,UAAU,CAAC,YAAY,KAAK,YAAY;YAC7C,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,EACpE,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;QAC3D,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAEhD,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,EAAE;YAC9C,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB,IAAI,CAAC,iBAAkB,EACvB,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC;gBACvC,SAAS;gBACT,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY;gBAC1C,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe;gBAClD,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,WAAW,EAAE,IAAI,CAAC,kBAAkB;qBACjC,eAAe,EAAE;qBACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrE,aAAa,EACX,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE;oBACnE,CAAC,CAAC,IAAI,CAAC,aAAa;oBACpB,CAAC,CAAC,SAAS;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,kBAGzB;QACC,8FAA8F;QAC9F,MAAM,kBAAkB,GAAwB;YAC9C,QAAQ;YACR,kBAAkB;YAClB,sBAAsB;SACvB,CAAC;QACF,kBAAkB;YAChB,kBAAkB;gBAClB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;oBAC/C,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE;oBAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAEjC,mCAAmC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC3C,GAAG,EAAE,kBAAkB,CAAC,GAAG;YAC3B,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE,kBAAkB,CAAC,IAAI;SAC9B,CAAC,CAAC;QAEH,2BAA2B;QAC3B,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,eAAe;QACf,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAA,kBAAS,EAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,WAAW,GACf,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;gBACxD,IAAI,WAAW,EAAE,CAAC;oBAChB,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvD,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU;YAC1E,EAAE,IAAI,CAAC;QAET,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;YAC9B,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI;SACL,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC1D,MAAM,SAAS,GAAG,IAAA,oBAAY,EAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC9D,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB,WAAW,EACX,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACxC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB,WAAW,EACX,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CACvC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,gBAAuD;QAEvD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CACvC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EACzC,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,GAAG,CAAC,eAAe,CAAC,CAAC;QAErB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;YAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;YACvC,IAAI,YAAY,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,CAAC;YAErE,IAAI,kBAAkB,EAAE,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEpD,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;gBACtC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,kBAAkB,EAAE,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBACvC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IACE,IAAI,CAAC,aAAa;gBAClB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,EACxD,CAAC;gBACD,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,kBAA6C;QACtE,IAAI,kBAAkB,YAAY,wBAAkB,EAAE,CAAC;YACrD,kBAAkB,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACpD,kBAAkB,EAClB,IAAI,CAAC,cAAc,CACpB,CAAC;QAEF,IAAI,eAA6C,CAAC;QAElD,sBAAsB;QAEtB,MAAM,yBAAyB,GAAG,CAChC,WAA8B,EAC9B,KAAuB,EACvB,EAAE,CACF,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YAC/B,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzD,IAAI,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE;YACtD,IAAI,aAA+B,CAAC;YAEpC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,IAAI,WAAW,GAAG,IAAI,CAAC,kBAAkB;qBACtC,eAAe,EAAE;qBACjB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,4BAA4B;oBAC5B,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE;wBAClD,SAAS,EAAE,UAAU;qBACtB,CAAC,CAAC;oBACH,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;oBACxC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,IAAI,WAAW,CAAC,SAAS,KAAK,UAAU,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;wBACjE,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;wBAE3B,IAAI,kBAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACzC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;wBAC9C,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,eAAe,GAAG,WAAW,CAAC,aAAa,CAAC;oBAC9C,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;gBAED,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;gBAE1C,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAClC,WAAW,EACX,WAAW,EACX,SAAS,CAAC,IAAI,EACd,CAAC,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9C,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;gBACvC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC3C,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC5C,CAAC;gBAED,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC;gBAED,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;gBAE5C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;YAEhD,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;gBAC3D,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBAElE,6HAA6H;gBAC7H,kBAAkB;gBAClB,IAAI,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;oBACnC,YAAY,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC3B,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC;YAED,uBAAuB;YACvB,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAEnE,IAAI,WAAW,CAAC,qBAAqB,EAAE,CAAC;gBACtC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC;YAED,kBAAkB;YAClB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;gBAChE,aAAa,CAAC,IAAI;oBAChB,WAAW,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YACnE,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAsB,CAAC;QAExB,iCAAiC;QACjC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAEjE,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB;aAChD,eAAe,EAAE;aACjB,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,SAAS,CACZ,CAAC;QAEJ,IAAI,kBAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,KAAK,MAAM,WAAW,IAAI,mBAAmB,EAAE,CAAC;gBAC9C,qDAAqD;gBACrD,uDAAuD;gBACvD,WAAW,CAAC,IAAI,EAAE,CAAC;gBACnB,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,qBAAqB;QACrB,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,cAAc,CACZ,WAAoC,EACpC,UAAuC,EAAE;QAEzC,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CACxD,WAAW,EACX,aAAa,EACb,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;QAC9C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW;IACX,QAAQ,CACN,KAAuB;IACvB,eAAe;IACf,EAAgB;QAEhB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnD,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;YACjD,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;YACvD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAwB;QAChD,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,yBAAyB;QAC/B,MAAM,SAAS,GAAG,IAAA,yBAAiB,GAAE,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,IAAA,uBAAe,EAAC,iBAAiB,CAAC;YACtC,SAAS;YACT,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB;YACvD,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB;SACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAkC;QAC/C,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,iEAAiE;QACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAE7C,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAEhC,+DAA+D;QAC/D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QAE9B,kEAAkE;QAClE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC3D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,sBAAc,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAEhC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QAErC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/B,CAAC;CACF;AAhyBD,8CAgyBC;AAqDM,MAAM,mBAAmB,GAAG,CACjC,MAA+B,EAC/B,MAA6B,EAC7B,EAAE,CACF,MAAM,CAAC,IAAI,CACT,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CACtE;IACC,CAAC,CAAC,MAAM;IACR,CAAC,CAAC,SAAS,CAAC;AATH,QAAA,mBAAmB,uBAShB;AAQhB,SAAS,yBAAyB;IAChC,OAAO;QACL,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,IAAA,eAAO,GAAE,EAAE,IAAA,eAAO,GAAE,CAAC;YAC7B,KAAK,EAAE,CAAC,IAAA,cAAM,GAAE,CAAC;SAClB;QACD,gBAAgB,EAAE;YAChB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACV;QACD,kBAAkB,EAAE,KAAK;QACzB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;QACtD,YAAY,EAAE,SAAS;QACvB,qBAAqB,EAAE,SAAS;QAChC,0BAA0B,EAAE,SAAS;QACrC,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,qBAAqB,EAAE,SAAS;QAChC,sBAAsB,EAAE,SAAS;QACjC,iBAAiB,EAAE,SAAS;QAC5B,sBAAsB,EAAE,SAAS;QACjC,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,YAAY;QAC1B,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK;KACpB,CAAC;AACJ,CAAC;AACY,QAAA,iBAAiB,GAAe,yBAAyB,EAAE,CAAC","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport type { RTCDataChannel } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport type { CandidatePair, Message, Protocol } from \"./imports/ice\";\nimport {\n type MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpReceiver,\n type RTCRtpSender,\n type RTCRtpTransceiver,\n RtpRouter,\n TransceiverManager,\n type TransceiverOptions,\n useOPUS,\n usePCMU,\n useVP8,\n} from \"./media\";\nimport {\n type RTCPeerConnectionStats,\n type RTCStats,\n RTCStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type MediaDescription,\n SessionDescription,\n} from \"./sdp\";\nimport { type RTCSessionDescriptionInit, SDPManager } from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type { DtlsKeys, RTCDtlsTransport } from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport type { ConnectionState, Kind, RTCSignalingState } from \"./types/domain\";\nimport type { Callback, CallbackWithValue } from \"./types/util\";\nimport { andDirection, deepMerge } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/peerConnection.ts\");\n\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = randomUUID().toString();\n\n config: Required<PeerConfig> = generateDefaultPeerConfig();\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n needRestart = false;\n private readonly router = new RtpRouter();\n private readonly sdpManager: SDPManager;\n private readonly transceiverManager: TransceiverManager;\n private readonly sctpManager: SctpTransportManager;\n private readonly secureManager: SecureTransportManager;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate | undefined]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onicecandidateerror?: CallbackWithValue<any>;\n onicegatheringstatechange?: CallbackWithValue<any>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n oniceconnectionstatechange?: Callback;\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n this.setConfiguration(config);\n\n this.sdpManager = new SDPManager({\n cname: this.cname,\n bundlePolicy: this.config.bundlePolicy,\n });\n this.transceiverManager = new TransceiverManager(\n this.cname,\n this.config,\n this.router,\n );\n this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);\n this.transceiverManager.onRemoteTransceiverAdded.pipe(\n this.onRemoteTransceiverAdded,\n );\n this.transceiverManager.onTrack.subscribe(\n ({ track, stream, transceiver }) => {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) {\n this.ontrack(event);\n }\n },\n );\n this.transceiverManager.onNegotiationNeeded.subscribe(() =>\n this.needNegotiation(),\n );\n this.sctpManager = new SctpTransportManager();\n this.sctpManager.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n const event: RTCDataChannelEvent = { channel };\n this.ondatachannel?.(event);\n this.emit(\"datachannel\", event);\n });\n this.secureManager = new SecureTransportManager({\n config: this.config,\n sctpManager: this.sctpManager,\n transceiverManager: this.transceiverManager,\n });\n this.secureManager.iceGatheringStateChange.pipe(\n this.iceGatheringStateChange,\n );\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n });\n this.secureManager.connectionStateChange.subscribe((state) => {\n this.connectionStateChange.execute(state);\n this.onconnectionstatechange?.();\n this.emit(\"connectionstatechange\");\n });\n this.secureManager.onIceCandidate.subscribe((candidate) => {\n const iceCandidate = candidate ? candidate.toJSON() : undefined;\n this.onIceCandidate.execute(iceCandidate);\n this.onicecandidate?.({ candidate: iceCandidate });\n this.emit(\"icecandidate\", { candidate: iceCandidate });\n });\n }\n\n get connectionState() {\n return this.secureManager.connectionState;\n }\n get iceConnectionState() {\n return this.secureManager.iceConnectionState;\n }\n get iceGathererState() {\n return this.secureManager.iceGatheringState;\n }\n get iceGatheringState() {\n return this.secureManager.iceGatheringState;\n }\n get dtlsTransports() {\n return this.secureManager.dtlsTransports;\n }\n get sctpTransport() {\n return this.sctpManager.sctpTransport;\n }\n get sctpRemotePort() {\n return this.sctpManager.sctpRemotePort;\n }\n get iceTransports() {\n return this.secureManager.iceTransports;\n }\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n get iceGeneration() {\n return this.iceTransports[0].connection.generation;\n }\n get localDescription() {\n return this.sdpManager.localDescription;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription;\n }\n get remoteIsBundled() {\n return this.sdpManager.remoteIsBundled;\n }\n /**@private */\n get _localDescription() {\n return this.sdpManager._localDescription;\n }\n /**@private */\n get _remoteDescription() {\n return this.sdpManager._remoteDescription;\n }\n\n getTransceivers() {\n return this.transceiverManager.getTransceivers();\n }\n\n getSenders(): RTCRtpSender[] {\n return this.transceiverManager.getSenders();\n }\n\n getReceivers() {\n return this.transceiverManager.getReceivers();\n }\n\n setConfiguration(config: Partial<PeerConfig>) {\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n for (const [i, codecParams] of enumerate([\n ...(this.config.codecs.audio || []),\n ...(this.config.codecs.video || []),\n ])) {\n if (codecParams.payloadType != undefined) {\n continue;\n }\n\n codecParams.payloadType = 96 + i;\n switch (codecParams.name.toLowerCase()) {\n case \"rtx\":\n {\n codecParams.parameters = `apt=${codecParams.payloadType - 1}`;\n }\n break;\n case \"red\":\n {\n if (codecParams.contentType === \"audio\") {\n const redundant = codecParams.payloadType + 1;\n codecParams.parameters = `${redundant}/${redundant}`;\n codecParams.payloadType = 63;\n }\n }\n break;\n }\n }\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n }\n\n getConfiguration() {\n return this.config;\n }\n\n async createOffer({ iceRestart }: { iceRestart?: boolean } = {}) {\n if (iceRestart || this.needRestart) {\n this.needRestart = false;\n this.secureManager.restartIce();\n }\n\n await this.secureManager.ensureCerts();\n\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (transceiver.codecs.length === 0) {\n this.transceiverManager.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n }\n\n const description = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n return description.toJSON();\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport();\n const dtlsTransport = this.findOrCreateTransport();\n sctp.setDtlsTransport(dtlsTransport);\n return sctp;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {},\n ): RTCDataChannel {\n if (!this.sctpTransport) {\n this.createSctpTransport();\n this.needNegotiation();\n }\n\n const channel = this.sctpManager.createDataChannel(label, options);\n if (!channel.sctp.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n channel.sctp.setDtlsTransport(dtlsTransport);\n }\n return channel;\n }\n\n removeTrack(sender: RTCRtpSender) {\n if (this.isClosed) {\n throw new Error(\"peer closed\");\n }\n this.transceiverManager.removeTrack(sender);\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") {\n return;\n }\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private findOrCreateTransport() {\n const [existing] = this.iceTransports;\n\n // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.\n // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum\n if (\n this.sdpManager.bundlePolicy === \"max-bundle\" ||\n (this.sdpManager.bundlePolicy !== \"disable\" && this.remoteIsBundled)\n ) {\n if (existing) {\n return this.dtlsTransports[0];\n }\n }\n\n const dtlsTransport = this.secureManager.createTransport();\n dtlsTransport.onRtp.subscribe((rtp) => {\n this.router.routeRtp(rtp);\n });\n dtlsTransport.onRtcp.subscribe((rtcp) => {\n this.router.routeRtcp(rtcp);\n });\n const iceTransport = dtlsTransport.iceTransport;\n\n iceTransport.onNegotiationNeeded.subscribe(() => {\n this.needNegotiation();\n });\n iceTransport.onIceCandidate.subscribe((candidate) => {\n if (!this.localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n if (!candidate) {\n this.sdpManager.setLocal(\n this._localDescription!,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n this.onIceCandidate.execute(undefined);\n if (this.onicecandidate) {\n this.onicecandidate({ candidate: undefined });\n }\n this.emit(\"icecandidate\", { candidate: undefined });\n return;\n }\n\n if (!this._localDescription) {\n log(\"localDescription not found when ice candidate was gathered\");\n return;\n }\n\n this.secureManager.handleNewIceCandidate({\n candidate,\n bundlePolicy: this.sdpManager.bundlePolicy,\n remoteIsBundled: !!this.sdpManager.remoteIsBundled,\n media: this._localDescription.media[0],\n transceiver: this.transceiverManager\n .getTransceivers()\n .find((t) => t?.dtlsTransport?.iceTransport.id === iceTransport.id),\n sctpTransport:\n this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id\n ? this.sctpTransport\n : undefined,\n });\n });\n\n return dtlsTransport;\n }\n\n async setLocalDescription(sessionDescription?: {\n type: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type\n const implicitOfferState: RTCSignalingState[] = [\n \"stable\",\n \"have-local-offer\",\n \"have-remote-pranswer\",\n ];\n sessionDescription =\n sessionDescription ??\n (implicitOfferState.includes(this.signalingState)\n ? await this.createOffer()\n : await this.createAnswer());\n\n // # parse and validate description\n const description = this.sdpManager.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: sessionDescription.type,\n });\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n for (const [i, media] of enumerate(description.media)) {\n const mid = media.rtp.muxId!;\n this.sdpManager.registerMid(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver =\n this.transceiverManager.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n }\n\n // setup ice,dtls role\n const role = description.media.find((media) => media.dtlsParams)?.dtlsParams\n ?.role;\n\n this.secureManager.setLocalRole({\n type: description.type,\n role,\n });\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n for (const t of this.transceiverManager.getTransceivers()) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n }\n }\n\n // for trickle ice\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n await this.gatherCandidates().catch((e) => {\n log(\"gatherCandidates failed\", e);\n });\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private async gatherCandidates() {\n await this.secureManager.gatherCandidates(\n !!this.sdpManager.remoteIsBundled,\n );\n }\n\n async addIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\n const sdp = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n await this.secureManager.addIceCandidate(sdp, candidateMessage);\n }\n\n private async connect() {\n log(\"start connect\");\n\n const res = await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n if (iceTransport.state === \"connected\") {\n return;\n }\n const checkDtlsConnected = () => dtlsTransport.state === \"connected\";\n\n if (checkDtlsConnected()) {\n return;\n }\n\n this.secureManager.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n\n if (checkDtlsConnected()) {\n return;\n }\n\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n\n if (\n this.sctpTransport &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpManager.connectSctp();\n }\n }),\n );\n\n if (res.find((r) => r.status === \"rejected\")) {\n this.secureManager.setConnectionState(\"failed\");\n } else {\n this.secureManager.setConnectionState(\"connected\");\n }\n }\n\n restartIce() {\n this.needRestart = true;\n this.needNegotiation();\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (sessionDescription instanceof SessionDescription) {\n sessionDescription = sessionDescription.toSdp();\n }\n\n // # parse and validate description\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\n );\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const matchTransceiverWithMedia = (\n transceiver: RTCRtpTransceiver,\n media: MediaDescription,\n ) =>\n transceiver.kind === media.kind &&\n [undefined, media.rtp.muxId].includes(transceiver.mid);\n\n let transports = remoteSdp.media.map((remoteMedia, i) => {\n let dtlsTransport: RTCDtlsTransport;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => matchTransceiverWithMedia(t, remoteMedia));\n if (!transceiver) {\n // create remote transceiver\n transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n } else {\n if (transceiver.direction === \"inactive\" && transceiver.stopping) {\n transceiver.stopped = true;\n\n if (sessionDescription.type === \"answer\") {\n transceiver.setCurrentDirection(\"inactive\");\n }\n return;\n }\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.transceiverManager.setRemoteRTP(\n transceiver,\n remoteMedia,\n remoteSdp.type,\n i,\n );\n } else if (remoteMedia.kind === \"application\") {\n let sctpTransport = this.sctpTransport;\n if (!sctpTransport) {\n sctpTransport = this.createSctpTransport();\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = sctpTransport.dtlsTransport;\n } else {\n sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = sctpTransport.dtlsTransport;\n\n this.sctpManager.setRemoteSCTP(remoteMedia, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams) {\n const renomination = !!this.sdpManager.inactiveRemoteMedia;\n iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n if (remoteMedia.dtlsParams) {\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n }) as RTCIceTransport[];\n\n // filter out inactive transports\n transports = transports.filter((iceTransport) => !!iceTransport);\n\n const removedTransceivers = this.transceiverManager\n .getTransceivers()\n .filter(\n (t) =>\n remoteSdp.media.find((m) => matchTransceiverWithMedia(t, m)) ==\n undefined,\n );\n\n if (sessionDescription.type === \"answer\") {\n for (const transceiver of removedTransceivers) {\n // todo: handle answer side transceiver removal work.\n // event should trigger to notify media source to stop.\n transceiver.stop();\n transceiver.stopped = true;\n }\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const dtlsTransport = this.findOrCreateTransport();\n const transceiver = this.transceiverManager.addTransceiver(\n trackOrKind,\n dtlsTransport,\n options,\n );\n\n this.secureManager.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ): RTCRtpSender {\n if (this.isClosed) {\n throw new Error(\"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, ms);\n if (!transceiver.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n transceiver.setDtlsTransport(dtlsTransport);\n }\n this.needNegotiation();\n return transceiver.sender;\n }\n\n async createAnswer() {\n this.assertNotClosed();\n\n await this.secureManager.ensureCerts();\n\n const description = this.sdpManager.buildAnswerSdp({\n transceivers: this.transceiverManager.getTransceivers(),\n sctpTransport: this.sctpTransport,\n signalingState: this.signalingState,\n });\n return description.toJSON();\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange({});\n }\n }\n\n private createPeerConnectionStats(): RTCPeerConnectionStats {\n const timestamp = getStatsTimestamp();\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\"),\n timestamp,\n dataChannelsOpened: this.sctpManager.dataChannelsOpened,\n dataChannelsClosed: this.sctpManager.dataChannelsClosed,\n };\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport> {\n const stats: RTCStats[] = [];\n\n // Peer connection stats - always included regardless of selector\n stats.push(this.createPeerConnectionStats());\n\n // Get stats from transceivers\n const transceiverStats = await this.transceiverManager.getStats(selector);\n stats.push(...transceiverStats);\n\n // Get transport stats - always included regardless of selector\n const transportStats = await this.secureManager.getStats();\n stats.push(...transportStats);\n\n // Get data channel stats - always included regardless of selector\n if (this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats();\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n return new RTCStatsReport(stats);\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n await this.secureManager.close();\n await this.sctpManager.close();\n\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n\n log(\"peerConnection closed\");\n }\n}\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n /** Add additional host (local) addresses to use for candidate gathering.\n * Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.\n */\n iceAdditionalHostAddresses: string[] | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n forceTurnTCP: boolean;\n /** such as google cloud run */\n iceUseLinkLocalAddress: boolean | undefined;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n iceFilterCandidatePair: ((pair: CandidatePair) => boolean) | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n icePasswordPrefix: string | undefined;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n midSuffix: boolean;\n}\n\nexport const findCodecByMimeType = (\n codecs: RTCRtpCodecParameters[],\n target: RTCRtpCodecParameters,\n) =>\n codecs.find(\n (localCodec) =>\n localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase(),\n )\n ? target\n : undefined;\n\nexport type RTCIceServer = {\n urls: string;\n username?: string;\n credential?: string;\n};\n\nfunction generateDefaultPeerConfig(): PeerConfig {\n return {\n codecs: {\n audio: [useOPUS(), usePCMU()],\n video: [useVP8()],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceAdditionalHostAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate?: RTCIceCandidate;\n}\n"]}
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.SsrcDescription = exports.RTCSessionDescription = exports.GroupDescription = exports.MediaDescription = exports.SessionDescription = void 0;
37
4
  exports.candidateToSdp = candidateToSdp;
@@ -42,7 +9,7 @@ exports.codecParametersFromString = codecParametersFromString;
42
9
  exports.codecParametersToString = codecParametersToString;
43
10
  const crypto_1 = require("crypto");
44
11
  const net_1 = require("net");
45
- const Int64 = __importStar(require("int64-buffer"));
12
+ const Int64 = require("int64-buffer");
46
13
  const const_1 = require("./const");
47
14
  const helper_1 = require("./helper");
48
15
  const ice_1 = require("./imports/ice");