werift 0.24.4 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -113
- package/lib/common/src/transport.d.ts +22 -2
- package/lib/common/src/transport.js +84 -26
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/exceptions.d.ts +9 -0
- package/lib/ice/src/exceptions.js +23 -1
- package/lib/ice/src/exceptions.js.map +1 -1
- package/lib/ice/src/ice.d.ts +40 -0
- package/lib/ice/src/ice.js +194 -28
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +26 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +7 -0
- package/lib/ice/src/stun/const.js +8 -0
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/protocol.js +1 -4
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
- package/lib/ice/src/stun/tcpProtocol.js +65 -14
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +12 -1
- package/lib/ice/src/stun/transaction.js +37 -4
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +40 -15
- package/lib/ice/src/turn/protocol.js +141 -32
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +8 -0
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/index.mjs +6175 -4073
- package/lib/nonstandard/index.mjs +286 -1003
- package/lib/polyfill/dom.mjs +23794 -0
- package/lib/polyfill/index.mjs +23794 -0
- package/lib/rtp/src/extra/container/mp4/container.js +12 -4
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +8 -3
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/sctp/src/chunk.d.ts +5 -0
- package/lib/sctp/src/chunk.js +16 -11
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/index.d.ts +3 -1
- package/lib/sctp/src/index.js +10 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +12 -3
- package/lib/sctp/src/sctp.js +51 -18
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/const.js +2 -0
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +9 -1
- package/lib/webrtc/src/errors.js +19 -0
- package/lib/webrtc/src/errors.js.map +1 -1
- package/lib/webrtc/src/media/codec.d.ts +5 -0
- package/lib/webrtc/src/media/codec.js +21 -0
- package/lib/webrtc/src/media/codec.js.map +1 -1
- package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
- package/lib/webrtc/src/media/codecCompatibility.js +138 -0
- package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +2 -0
- package/lib/webrtc/src/media/router.js +23 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
- package/lib/webrtc/src/media/rtpReceiver.js +35 -0
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
- package/lib/webrtc/src/media/rtpSender.js +264 -35
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
- package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +29 -1
- package/lib/webrtc/src/media/track.js +164 -5
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
- package/lib/webrtc/src/nonstandard/index.js +0 -1
- package/lib/webrtc/src/nonstandard/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
- package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +126 -5
- package/lib/webrtc/src/peerConnection.js +609 -136
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/polyfill/api.d.ts +14 -0
- package/lib/webrtc/src/polyfill/api.js +23 -0
- package/lib/webrtc/src/polyfill/api.js.map +1 -0
- package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
- package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
- package/lib/webrtc/src/polyfill/dom.js +18 -0
- package/lib/webrtc/src/polyfill/dom.js.map +1 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
- package/lib/webrtc/src/polyfill/globals.js +3 -0
- package/lib/webrtc/src/polyfill/globals.js.map +1 -0
- package/lib/webrtc/src/polyfill/index.d.ts +2 -0
- package/lib/webrtc/src/polyfill/index.js +19 -0
- package/lib/webrtc/src/polyfill/index.js.map +1 -0
- package/lib/webrtc/src/polyfill/install.d.ts +13 -0
- package/lib/webrtc/src/polyfill/install.js +266 -0
- package/lib/webrtc/src/polyfill/install.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
- package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
- package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
- package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
- package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
- package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
- package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
- package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
- package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
- package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
- package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
- package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
- package/lib/webrtc/src/polyfill/trackStop.js +16 -0
- package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
- package/lib/webrtc/src/sctpManager.d.ts +2 -1
- package/lib/webrtc/src/sctpManager.js +5 -2
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -1
- package/lib/webrtc/src/sdp.js +5 -6
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +38 -1
- package/lib/webrtc/src/sdpManager.js +236 -30
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
- package/lib/webrtc/src/secureTransportManager.js +123 -47
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +91 -6
- package/lib/webrtc/src/transceiverManager.js +477 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +8 -0
- package/lib/webrtc/src/transport/ice.js +17 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +3 -2
- package/lib/webrtc/src/transport/sctp.js +8 -2
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +13 -3
|
@@ -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 { createWebRtcDomException, createWebRtcTypeError } from \"./errors\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n type TlsConnectionOptions,\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 type RTCStatsReport,\n buildStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type MediaDescription,\n type RTCSessionDescription,\n SessionDescription,\n} from \"./sdp\";\nimport { type RTCSessionDescriptionInit, SDPManager } from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type {\n DtlsKeys,\n RTCCertificate,\n RTCDtlsTransport,\n} from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport {\n DEFAULT_MAX_MESSAGE_SIZE,\n type RTCSctpTransport,\n} from \"./transport/sctp\";\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\n/**\n * W3C compatibility notes kept near the public RTCPeerConnection surface so the\n * reviewable diff does not depend on external PR text.\n *\n * - `current/pending*Description`, `canTrickleIceCandidates`, `sctp`,\n * `addIceCandidate(null)`, and `RTCConfiguration` round-trip behavior are\n * implemented here and covered by `tests/wpt/peerConnectionApiCompatibility.test.ts`.\n * - `addIceCandidate()` also validates `sdpMid` / `sdpMLineIndex` /\n * `usernameFragment` against the applied remote description and appends\n * candidates or end-of-candidates markers to the corresponding m-section.\n * The public API keeps werift's historical pre-SRD buffering behavior, while\n * the WPT runner wraps the class to exercise strict spec rejection.\n * - `bundlePolicy: \"balanced\"` is accepted for input compatibility but is\n * normalized to werift's `\"max-compat\"` behavior, so `getConfiguration()`\n * returns the normalized value.\n * - `setLocalDescription()` keeps the historical `SessionDescription` return\n * value for non-rollback calls, while `{ type: \"rollback\" }` resolves `void`\n * to match the actual behavior without pretending to return a description.\n * - API reference markdown is regenerated with `cd packages/webrtc && npm run doc`.\n * The generated output lives under `packages/webrtc/doc/`; compatibility\n * notes remain here and in the package README so review context is visible\n * even when generated docs are not committed in the same change.\n */\nexport class RTCPeerConnection extends EventTarget {\n readonly id = randomUUID().toString();\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 private lastCreatedAnswer?: RTCSessionDescription;\n private lastCreatedOffer?: RTCSessionDescription;\n private readonly pendingRemoteCandidates: Array<\n RTCIceCandidate | RTCIceCandidateInit | null\n > = [];\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 private readonly eventHandlers: PeerConnectionEventHandlers = {};\n\n get ondatachannel() {\n return this.eventHandlers.ondatachannel ?? null;\n }\n\n set ondatachannel(value: CallbackWithValue<RTCDataChannelEvent> | null) {\n this.eventHandlers.ondatachannel = value ?? undefined;\n }\n\n get onicecandidate() {\n return this.eventHandlers.onicecandidate ?? null;\n }\n\n set onicecandidate(value: CallbackWithValue<RTCPeerConnectionIceEvent> | null) {\n this.eventHandlers.onicecandidate = value ?? undefined;\n }\n\n get onicecandidateerror() {\n return this.eventHandlers.onicecandidateerror ?? null;\n }\n\n set onicecandidateerror(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onicecandidateerror = value ?? undefined;\n }\n\n get onicegatheringstatechange() {\n return this.eventHandlers.onicegatheringstatechange ?? null;\n }\n\n set onicegatheringstatechange(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onicegatheringstatechange = value ?? undefined;\n }\n\n get onnegotiationneeded() {\n return this.eventHandlers.onnegotiationneeded ?? null;\n }\n\n set onnegotiationneeded(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onnegotiationneeded = value ?? undefined;\n }\n\n get onsignalingstatechange() {\n return this.eventHandlers.onsignalingstatechange ?? null;\n }\n\n set onsignalingstatechange(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onsignalingstatechange = value ?? undefined;\n }\n\n get ontrack() {\n return this.eventHandlers.ontrack ?? null;\n }\n\n set ontrack(value: CallbackWithValue<RTCTrackEvent> | null) {\n this.eventHandlers.ontrack = value ?? undefined;\n }\n\n get onconnectionstatechange() {\n return this.eventHandlers.onconnectionstatechange ?? null;\n }\n\n set onconnectionstatechange(value: Callback | null) {\n this.eventHandlers.onconnectionstatechange = value ?? undefined;\n }\n\n get oniceconnectionstatechange() {\n return this.eventHandlers.oniceconnectionstatechange ?? null;\n }\n\n set oniceconnectionstatechange(value: Callback | null) {\n this.eventHandlers.oniceconnectionstatechange = value ?? undefined;\n }\n\n constructor(config: RTCPeerConnectionConfig = {}) {\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, streams, transceiver }) => {\n const event = new RTCTrackEvent({\n track,\n streams,\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 = { type: \"datachannel\", 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.subscribe((state) => {\n this.iceGatheringStateChange.execute(state);\n this.onicegatheringstatechange?.(\n new globalThis.Event(\"icegatheringstatechange\"),\n );\n this.emit(\"icegatheringstatechange\");\n });\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n this.oniceconnectionstatechange?.();\n this.emit(\"iceconnectionstatechange\");\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 const event: RTCPeerConnectionIceEvent = {\n type: \"icecandidate\",\n candidate: iceCandidate,\n };\n this.onicecandidate?.(event);\n this.emit(\"icecandidate\", event);\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 sctp() {\n return this.sctpTransport ?? null;\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 ?? null;\n }\n get currentLocalDescription() {\n return this.sdpManager.currentLocalDescription?.toJSON() ?? null;\n }\n get pendingLocalDescription() {\n return this.sdpManager.pendingLocalDescription?.toJSON() ?? null;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription ?? null;\n }\n get currentRemoteDescription() {\n return this.sdpManager.currentRemoteDescription?.toJSON() ?? null;\n }\n get pendingRemoteDescription() {\n return this.sdpManager.pendingRemoteDescription?.toJSON() ?? null;\n }\n get canTrickleIceCandidates() {\n const remoteDescription = this.sdpManager._remoteDescription;\n if (!remoteDescription) {\n return null;\n }\n const iceOptions = [\n remoteDescription.iceOptions,\n ...remoteDescription.media.map((media) => media.iceOptions),\n ]\n .filter((value): value is string => !!value)\n .join(\" \");\n return iceOptions.split(/\\s+/).includes(\"trickle\");\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: RTCPeerConnectionConfig) {\n const normalizedConfig = normalizePeerConfiguration(config);\n const isReconfiguration = !!this.sdpManager;\n\n if (\n normalizedConfig.rtcpMuxPolicy &&\n normalizedConfig.rtcpMuxPolicy !== \"require\"\n ) {\n throw new Error(\"rtcpMuxPolicy must be require\");\n }\n\n if (\n normalizedConfig.iceCandidatePoolSize !== undefined &&\n (!Number.isInteger(normalizedConfig.iceCandidatePoolSize) ||\n normalizedConfig.iceCandidatePoolSize < 0)\n ) {\n throw new Error(\"iceCandidatePoolSize must be a non-negative integer\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.bundlePolicy !== undefined &&\n normalizedConfig.bundlePolicy !== this.config.bundlePolicy\n ) {\n throw new Error(\"bundlePolicy cannot be changed\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.rtcpMuxPolicy !== undefined &&\n normalizedConfig.rtcpMuxPolicy !== this.config.rtcpMuxPolicy\n ) {\n throw new Error(\"rtcpMuxPolicy cannot be changed\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.certificates !== undefined &&\n !hasSameCertificates(\n normalizedConfig.certificates,\n this.config.certificates,\n )\n ) {\n throw new Error(\"certificates cannot be changed\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.iceCandidatePoolSize !== undefined &&\n this.localDescription &&\n normalizedConfig.iceCandidatePoolSize !== this.config.iceCandidatePoolSize\n ) {\n throw new Error(\n \"iceCandidatePoolSize cannot be changed after setLocalDescription\",\n );\n }\n\n if ((normalizedConfig.iceCandidatePoolSize ?? 0) > 0) {\n throw new Error(\"iceCandidatePoolSize > 0 is not supported\");\n }\n\n deepMerge(this.config, normalizedConfig as Partial<PeerConfig>);\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 if (\n !Number.isInteger(this.config.maxMessageSize) ||\n this.config.maxMessageSize < 0\n ) {\n throw new Error(\"maxMessageSize must be a non-negative integer\");\n }\n\n if (this.sctpManager?.sctpTransport) {\n this.sctpManager.sctpTransport.maxMessageSize =\n this.config.maxMessageSize;\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 clonePeerConfiguration(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 const createdOffer = description.toJSON();\n this.lastCreatedOffer = createdOffer;\n return createdOffer;\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport(\n this.config.maxMessageSize,\n );\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 createWebRtcDomException(\"InvalidStateError\", \"peer closed\");\n }\n this.transceiverManager.removeTrack(sender);\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.invalidateLastCreatedDescriptions();\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) {\n this.onnegotiationneeded(new globalThis.Event(\"negotiationneeded\"));\n }\n this.emit(\"negotiationneeded\");\n });\n };\n\n private invalidateLastCreatedDescriptions() {\n this.lastCreatedAnswer = undefined;\n this.lastCreatedOffer = undefined;\n }\n\n private async waitForPendingDescriptionTask() {\n this.assertNotClosed();\n await Promise.resolve();\n\n if (this.isClosed) {\n await new Promise<never>(() => undefined);\n }\n }\n\n private findOrCreateTransport() {\n const existingDtlsTransport = this.dtlsTransports.find(\n (transport) => transport.state !== \"closed\",\n );\n const existing = existingDtlsTransport?.iceTransport;\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 (existingDtlsTransport) {\n return existingDtlsTransport;\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: \"rollback\";\n }): Promise<void>;\n async setLocalDescription(\n sessionDescription?: RTCLocalSessionDescriptionInit,\n ): Promise<SessionDescription>;\n async setLocalDescription(\n sessionDescription?: RTCLocalSessionDescriptionInit,\n ): Promise<SessionDescription | void> {\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\n await this.waitForPendingDescriptionTask();\n\n if (sessionDescription?.type === \"rollback\") {\n this.sdpManager.rollbackLocalDescription(this.signalingState);\n this.setSignalingState(\"stable\");\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n this.invalidateLastCreatedDescriptions();\n return;\n }\n\n const needsGeneratedDescription =\n !sessionDescription?.type ||\n !sessionDescription.sdp ||\n sessionDescription.sdp.length === 0;\n\n const generatedDescription = needsGeneratedDescription\n ? sessionDescription?.type === \"offer\"\n ? (this.lastCreatedOffer ?? (await this.createOffer()))\n : sessionDescription?.type === \"answer\" ||\n sessionDescription?.type === \"pranswer\"\n ? (this.lastCreatedAnswer ?? (await this.createAnswer()))\n : implicitOfferState.includes(this.signalingState)\n ? (this.lastCreatedOffer ?? (await this.createOffer()))\n : (this.lastCreatedAnswer ?? (await this.createAnswer()))\n : undefined;\n\n sessionDescription = {\n type: sessionDescription?.type ?? generatedDescription!.type,\n sdp:\n sessionDescription?.sdp && sessionDescription.sdp.length > 0\n ? sessionDescription.sdp\n : generatedDescription!.sdp,\n };\n\n if (\n sessionDescription.type === \"offer\" &&\n this.lastCreatedOffer &&\n sessionDescription.sdp !== this.lastCreatedOffer.sdp\n ) {\n throw createWebRtcDomException(\n \"InvalidModificationError\",\n \"setLocalDescription must use the latest created offer\",\n );\n }\n\n // # parse and validate description\n const descriptionType = sessionDescription.type as Exclude<\n RTCSessionDescriptionInit[\"type\"],\n \"rollback\" | undefined\n >;\n const descriptionSdp = sessionDescription.sdp!;\n\n const description = this.sdpManager.parseSdp({\n sdp: descriptionSdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: descriptionType,\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 } else if (description.type === \"pranswer\") {\n this.setSignalingState(\"have-local-pranswer\");\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 === \"offer\" ? \"offer\" : \"answer\",\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 this.invalidateLastCreatedDescriptions();\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 | null = {},\n ) {\n if (this.isClosed) {\n throw createWebRtcDomException(\"InvalidStateError\", \"is closed\");\n }\n\n if (!this.remoteDescription || !this.sdpManager._remoteDescription) {\n this.pendingRemoteCandidates.push(candidateMessage);\n return;\n }\n await this.applyRemoteIceCandidate(candidateMessage);\n }\n\n private async applyRemoteIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit | null,\n ) {\n const sdp = this.sdpManager._remoteDescription;\n if (!sdp) {\n return;\n }\n const appliedCandidate = await this.secureManager.addIceCandidate(\n sdp,\n candidateMessage,\n );\n const remoteDescription = this.sdpManager._remoteDescription;\n if (!remoteDescription || !appliedCandidate) {\n return;\n }\n\n if (appliedCandidate.kind === \"end-of-candidates\") {\n for (const mediaIndex of appliedCandidate.mediaIndices) {\n const media = remoteDescription.media[mediaIndex];\n if (media) {\n media.iceCandidatesComplete = true;\n }\n }\n return;\n }\n\n for (const mediaIndex of appliedCandidate.mediaIndices) {\n const media = remoteDescription.media[mediaIndex];\n if (!media) {\n continue;\n }\n media.iceCandidates.push(appliedCandidate.candidate);\n }\n }\n\n private async flushPendingRemoteCandidates() {\n while (\n this.pendingRemoteCandidates.length > 0 &&\n this.remoteDescription &&\n this.sdpManager._remoteDescription\n ) {\n const candidate = this.pendingRemoteCandidates.shift();\n await this.applyRemoteIceCandidate(candidate ?? null);\n }\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 await this.waitForPendingDescriptionTask();\n\n const needsImplicitLocalRollback =\n sessionDescription.type === \"offer\" &&\n [\"have-local-offer\", \"have-local-pranswer\"].includes(this.signalingState);\n if (needsImplicitLocalRollback) {\n this.sdpManager.rollbackLocalDescription(this.signalingState);\n this.shouldNegotiationneeded = true;\n this.setSignalingState(\"stable\");\n await Promise.resolve();\n }\n\n // # parse and validate description\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\n );\n if (!remoteSdp) {\n this.setSignalingState(\"stable\");\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n this.invalidateLastCreatedDescriptions();\n return;\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 [null, 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 ?? null;\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 && !iceTransport.connection.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 } else if (remoteSdp.type === \"pranswer\") {\n this.setSignalingState(\"have-remote-pranswer\");\n }\n\n await this.flushPendingRemoteCandidates();\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 this.invalidateLastCreatedDescriptions();\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(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender {\n if (this.isClosed) {\n throw createWebRtcDomException(\"InvalidStateError\", \"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, streams);\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 const createdAnswer = description.toJSON();\n this.lastCreatedAnswer = createdAnswer;\n return createdAnswer;\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw createWebRtcDomException(\n \"InvalidStateError\",\n \"RTCPeerConnection is closed\",\n );\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n if (this.signalingState === state) {\n return;\n }\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange(new globalThis.Event(\"signalingstatechange\"));\n }\n this.emit(\"signalingstatechange\");\n }\n\n private createPeerConnectionStats(timestamp: number): RTCPeerConnectionStats {\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\", this.id),\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 timestamp = getStatsTimestamp();\n const stats: RTCStats[] = [];\n\n if (!selector) {\n stats.push(this.createPeerConnectionStats(timestamp));\n }\n\n stats.push(...this.transceiverManager.collectStats(timestamp));\n\n const transportStats = await this.secureManager.getStats(timestamp);\n stats.push(...transportStats);\n\n if (!selector && this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats(timestamp);\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n if (!selector) {\n return buildStatsReport(stats);\n }\n\n return buildStatsReport(\n stats,\n this.transceiverManager.getStatsRootIds(selector),\n );\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.pendingRemoteCandidates.length = 0;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n await this.secureManager.close();\n await this.sctpManager.close();\n\n // 公開 Event を完了させ、購読者・クロージャが PeerConnection を保持し続けないようにする\n this.completePeerEvents();\n\n log(\"peerConnection closed\");\n }\n\n private completePeerEvents() {\n const events = [\n this.onDataChannel,\n this.iceGatheringStateChange,\n this.iceConnectionStateChange,\n this.signalingStateChange,\n this.connectionStateChange,\n this.onTransceiverAdded,\n this.onRemoteTransceiverAdded,\n this.onIceCandidate,\n this.onNegotiationneeded,\n ] as const;\n for (const event of events) {\n if (!event.ended) {\n event.complete();\n }\n }\n }\n}\n\nexport type DebugConfig = Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\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 /** Advertise local ICE lite and operate in the controlled role. */\n iceLite: boolean;\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 iceUseTcp: boolean;\n turnTransport: \"udp\" | \"tcp\" | \"tls\" | undefined;\n turnTlsOptions: TlsConnectionOptions | undefined;\n /** @deprecated Prefer turn URL transport parameters or turnTransport. */\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 rtcpMuxPolicy: \"require\";\n iceCandidatePoolSize: number;\n certificates: RTCCertificate[];\n debug: DebugConfig;\n midSuffix: boolean;\n /** Advertised local SCTP max-message-size in SDP. Use 0 for unlimited. */\n maxMessageSize: number;\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 | string[];\n username?: string;\n credential?: string;\n};\n\nexport type RTCBundlePolicy = \"balanced\" | \"max-compat\" | \"max-bundle\";\nexport type RTCRtcpMuxPolicy = \"require\";\n\nexport interface RTCConfiguration {\n iceServers?: RTCIceServer[];\n iceTransportPolicy?: PeerConfig[\"iceTransportPolicy\"];\n bundlePolicy?: RTCBundlePolicy;\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\n iceCandidatePoolSize?: number;\n certificates?: RTCCertificate[];\n}\n\nexport interface RTCLocalSessionDescriptionInit\n extends RTCSessionDescriptionInit {\n type?: Exclude<RTCSessionDescriptionInit[\"type\"], \"rollback\"> | \"rollback\";\n}\n\ntype RTCPeerConnectionRTCConfiguration = Omit<\n RTCConfiguration,\n \"bundlePolicy\"\n> & {\n bundlePolicy?: PeerConfig[\"bundlePolicy\"] | RTCBundlePolicy;\n};\n\nexport type RTCPeerConnectionConfig = Partial<\n Omit<\n PeerConfig,\n \"bundlePolicy\" | \"rtcpMuxPolicy\" | \"iceCandidatePoolSize\" | \"certificates\"\n >\n> &\n RTCPeerConnectionRTCConfiguration;\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 iceLite: false,\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 iceUseTcp: false,\n turnTransport: undefined,\n turnTlsOptions: undefined,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n rtcpMuxPolicy: \"require\",\n iceCandidatePoolSize: 0,\n certificates: [],\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n maxMessageSize: DEFAULT_MAX_MESSAGE_SIZE,\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\n\nfunction normalizePeerConfiguration(\n config: RTCPeerConnectionConfig,\n): Partial<PeerConfig> {\n const input = Object(config ?? {}) as RTCPeerConnectionConfig;\n const normalizedConfig = { ...input } as Partial<PeerConfig>;\n\n if (input.bundlePolicy === \"balanced\") {\n normalizedConfig.bundlePolicy = \"max-compat\";\n }\n\n if (\"certificates\" in input) {\n if (input.certificates === undefined) {\n normalizedConfig.certificates = undefined;\n } else if (\n !Array.isArray(input.certificates) ||\n input.certificates.some((certificate) => certificate == null)\n ) {\n throw createWebRtcTypeError(\n \"certificates must be an array of RTCCertificate\",\n );\n } else {\n normalizedConfig.certificates = [...input.certificates];\n }\n }\n\n if (\"iceCandidatePoolSize\" in input) {\n normalizedConfig.iceCandidatePoolSize = coerceUnsignedShort(\n input.iceCandidatePoolSize,\n \"iceCandidatePoolSize\",\n );\n }\n\n return normalizedConfig;\n}\n\nfunction coerceUnsignedShort(value: unknown, name: string) {\n const coerced = Number(value);\n if (\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < 0 ||\n coerced > 65535\n ) {\n throw createWebRtcTypeError(`${name} must be an unsigned short`);\n }\n return coerced;\n}\n\nfunction hasSameCertificates(left: RTCCertificate[], right: RTCCertificate[]) {\n return (\n left.length === right.length &&\n left.every((certificate, index) => certificate === right[index])\n );\n}\n\nfunction clonePeerConfiguration(config: PeerConfig) {\n return {\n ...config,\n codecs: {\n audio: config.codecs.audio ? [...config.codecs.audio] : undefined,\n video: config.codecs.video ? [...config.codecs.video] : undefined,\n },\n headerExtensions: {\n audio: config.headerExtensions.audio\n ? [...config.headerExtensions.audio]\n : undefined,\n video: config.headerExtensions.video\n ? [...config.headerExtensions.video]\n : undefined,\n },\n iceServers: config.iceServers.map((server) => ({\n ...server,\n urls: Array.isArray(server.urls) ? [...server.urls] : server.urls,\n })),\n icePortRange: config.icePortRange\n ? ([...config.icePortRange] as [number, number])\n : undefined,\n iceAdditionalHostAddresses: config.iceAdditionalHostAddresses\n ? [...config.iceAdditionalHostAddresses]\n : undefined,\n dtls: { ...config.dtls },\n certificates: [...config.certificates],\n debug: { ...config.debug },\n };\n}\n\nexport class RTCTrackEvent {\n readonly type = \"track\";\n readonly track: MediaStreamTrack;\n readonly streams: MediaStream[];\n readonly transceiver: RTCRtpTransceiver;\n readonly receiver: RTCRtpReceiver;\n\n constructor(init: {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n }) {\n this.track = init.track;\n this.streams = [...init.streams];\n this.transceiver = init.transceiver;\n this.receiver = init.receiver;\n }\n}\n\nexport interface RTCDataChannelEvent {\n type?: \"datachannel\";\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n type?: \"icecandidate\";\n candidate?: RTCIceCandidate;\n}\n\ntype PeerConnectionEventHandlers = {\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"]}
|
|
1
|
+
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport { DEFAULT_SCTP_MTU, validateSctpMtu } from \"../../sctp/src\";\nimport type { RTCDataChannel } from \"./dataChannel\";\nimport { createWebRtcDomException, createWebRtcTypeError } from \"./errors\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n type TlsConnectionOptions,\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 RTCRtpSenderOptions,\n type RTCRtpTransceiver,\n RtpRouter,\n TransceiverManager,\n type TransceiverOptions,\n defaultCodecs,\n} from \"./media\";\nimport {\n type RTCPeerConnectionStats,\n type RTCStats,\n type RTCStatsReport,\n buildStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type GroupDescription,\n type MediaDescription,\n type RTCSessionDescription,\n SessionDescription,\n} from \"./sdp\";\nimport {\n type MLineReuse,\n type RTCSessionDescriptionInit,\n SDPManager,\n} from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type {\n DtlsKeys,\n RTCCertificate,\n RTCDtlsTransport,\n} from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport {\n DEFAULT_MAX_MESSAGE_SIZE,\n type RTCSctpTransport,\n} from \"./transport/sctp\";\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\n/**\n * W3C compatibility notes kept near the public RTCPeerConnection surface so the\n * reviewable diff does not depend on external PR text.\n *\n * - `current/pending*Description`, `canTrickleIceCandidates`, `sctp`,\n * `addIceCandidate(null)`, and `RTCConfiguration` round-trip behavior are\n * implemented here and covered by `tests/wpt/peerConnectionApiCompatibility.test.ts`.\n * - `addIceCandidate()` also validates `sdpMid` / `sdpMLineIndex` /\n * `usernameFragment` against the applied remote description and appends\n * candidates or end-of-candidates markers to the corresponding m-section.\n * The public API keeps werift's historical pre-SRD buffering behavior, while\n * the WPT runner wraps the class to exercise strict spec rejection.\n * - `bundlePolicy: \"balanced\"` is accepted for input compatibility but is\n * normalized to werift's `\"max-compat\"` behavior, so `getConfiguration()`\n * returns the normalized value.\n * - `setLocalDescription()` keeps the historical `SessionDescription` return\n * value for non-rollback calls, while `{ type: \"rollback\" }` resolves `void`\n * to match the actual behavior without pretending to return a description.\n * - API reference markdown is regenerated with `cd packages/webrtc && npm run doc`.\n * The generated output lives under `packages/webrtc/doc/`; compatibility\n * notes remain here and in the package README so review context is visible\n * even when generated docs are not committed in the same change.\n */\nexport class RTCPeerConnection extends EventTarget {\n readonly id = randomUUID().toString();\n readonly cname = randomUUID().toString();\n\n config: Required<PeerConfig> = generateDefaultPeerConfig();\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n /**同じ tick の複数の変更で negotiationneeded を重複発火しないための予約フラグ */\n private negotiationneededScheduled = false;\n /**交渉が必要な変更の通し番号 */\n private negotiationChangeSeq = 0;\n /**answer まで確定した local offer が反映している変更の通し番号 */\n private negotiatedChangeSeq = 0;\n /**適用中の local offer が反映している変更の通し番号 (rollback で破棄) */\n private pendingOfferChangeSeq?: number;\n private lastCreatedOfferChangeSeq = 0;\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 private lastCreatedAnswer?: RTCSessionDescription;\n private lastCreatedOffer?: RTCSessionDescription;\n private readonly pendingRemoteCandidates: Array<\n RTCIceCandidate | RTCIceCandidateInit | null\n > = [];\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 private readonly eventHandlers: PeerConnectionEventHandlers = {};\n\n get ondatachannel() {\n return this.eventHandlers.ondatachannel ?? null;\n }\n\n set ondatachannel(value: CallbackWithValue<RTCDataChannelEvent> | null) {\n this.eventHandlers.ondatachannel = value ?? undefined;\n }\n\n get onicecandidate() {\n return this.eventHandlers.onicecandidate ?? null;\n }\n\n set onicecandidate(value: CallbackWithValue<RTCPeerConnectionIceEvent> | null) {\n this.eventHandlers.onicecandidate = value ?? undefined;\n }\n\n get onicecandidateerror() {\n return this.eventHandlers.onicecandidateerror ?? null;\n }\n\n set onicecandidateerror(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onicecandidateerror = value ?? undefined;\n }\n\n get onicegatheringstatechange() {\n return this.eventHandlers.onicegatheringstatechange ?? null;\n }\n\n set onicegatheringstatechange(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onicegatheringstatechange = value ?? undefined;\n }\n\n get onnegotiationneeded() {\n return this.eventHandlers.onnegotiationneeded ?? null;\n }\n\n set onnegotiationneeded(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onnegotiationneeded = value ?? undefined;\n }\n\n get onsignalingstatechange() {\n return this.eventHandlers.onsignalingstatechange ?? null;\n }\n\n set onsignalingstatechange(value: CallbackWithValue<any> | null) {\n this.eventHandlers.onsignalingstatechange = value ?? undefined;\n }\n\n get ontrack() {\n return this.eventHandlers.ontrack ?? null;\n }\n\n set ontrack(value: CallbackWithValue<RTCTrackEvent> | null) {\n this.eventHandlers.ontrack = value ?? undefined;\n }\n\n get onconnectionstatechange() {\n return this.eventHandlers.onconnectionstatechange ?? null;\n }\n\n set onconnectionstatechange(value: Callback | null) {\n this.eventHandlers.onconnectionstatechange = value ?? undefined;\n }\n\n get oniceconnectionstatechange() {\n return this.eventHandlers.oniceconnectionstatechange ?? null;\n }\n\n set oniceconnectionstatechange(value: Callback | null) {\n this.eventHandlers.oniceconnectionstatechange = value ?? undefined;\n }\n\n constructor(config: RTCPeerConnectionConfig = {}) {\n super();\n\n this.setConfiguration(config);\n\n this.sdpManager = new SDPManager({\n cname: this.cname,\n bundlePolicy: this.config.bundlePolicy,\n mLineReuse: this.config.mLineReuse,\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, streams, transceiver }) => {\n const event = new RTCTrackEvent({\n track,\n streams,\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 = { type: \"datachannel\", 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.subscribe((state) => {\n this.iceGatheringStateChange.execute(state);\n this.onicegatheringstatechange?.(\n new globalThis.Event(\"icegatheringstatechange\"),\n );\n this.emit(\"icegatheringstatechange\");\n });\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n this.oniceconnectionstatechange?.();\n this.emit(\"iceconnectionstatechange\");\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 const event: RTCPeerConnectionIceEvent = {\n type: \"icecandidate\",\n candidate: iceCandidate,\n };\n this.onicecandidate?.(event);\n this.emit(\"icecandidate\", event);\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 sctp() {\n return this.sctpTransport ?? null;\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 ?? null;\n }\n get currentLocalDescription() {\n return this.sdpManager.currentLocalDescription?.toJSON() ?? null;\n }\n get pendingLocalDescription() {\n return this.sdpManager.pendingLocalDescription?.toJSON() ?? null;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription ?? null;\n }\n get currentRemoteDescription() {\n return this.sdpManager.currentRemoteDescription?.toJSON() ?? null;\n }\n get pendingRemoteDescription() {\n return this.sdpManager.pendingRemoteDescription?.toJSON() ?? null;\n }\n get canTrickleIceCandidates() {\n const remoteDescription = this.sdpManager._remoteDescription;\n if (!remoteDescription) {\n return null;\n }\n const iceOptions = [\n remoteDescription.iceOptions,\n ...remoteDescription.media.map((media) => media.iceOptions),\n ]\n .filter((value): value is string => !!value)\n .join(\" \");\n return iceOptions.split(/\\s+/).includes(\"trickle\");\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: RTCPeerConnectionConfig) {\n const normalizedConfig = normalizePeerConfiguration(config);\n const isReconfiguration = !!this.sdpManager;\n\n if (\n normalizedConfig.rtcpMuxPolicy &&\n normalizedConfig.rtcpMuxPolicy !== \"require\"\n ) {\n throw new Error(\"rtcpMuxPolicy must be require\");\n }\n\n if (\n normalizedConfig.iceCandidatePoolSize !== undefined &&\n (!Number.isInteger(normalizedConfig.iceCandidatePoolSize) ||\n normalizedConfig.iceCandidatePoolSize < 0)\n ) {\n throw new Error(\"iceCandidatePoolSize must be a non-negative integer\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.bundlePolicy !== undefined &&\n normalizedConfig.bundlePolicy !== this.config.bundlePolicy\n ) {\n throw new Error(\"bundlePolicy cannot be changed\");\n }\n\n if (\n normalizedConfig.mLineReuse !== undefined &&\n !MLineReuseModes.includes(normalizedConfig.mLineReuse)\n ) {\n throw createWebRtcTypeError(\n `mLineReuse must be one of ${MLineReuseModes.join(\", \")}`,\n );\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.mLineReuse !== undefined &&\n normalizedConfig.mLineReuse !== this.config.mLineReuse\n ) {\n throw createWebRtcDomException(\n \"InvalidModificationError\",\n \"mLineReuse cannot be changed\",\n );\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.rtcpMuxPolicy !== undefined &&\n normalizedConfig.rtcpMuxPolicy !== this.config.rtcpMuxPolicy\n ) {\n throw new Error(\"rtcpMuxPolicy cannot be changed\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.certificates !== undefined &&\n !hasSameCertificates(\n normalizedConfig.certificates,\n this.config.certificates,\n )\n ) {\n throw new Error(\"certificates cannot be changed\");\n }\n\n if (\n isReconfiguration &&\n normalizedConfig.iceCandidatePoolSize !== undefined &&\n this.localDescription &&\n normalizedConfig.iceCandidatePoolSize !== this.config.iceCandidatePoolSize\n ) {\n throw new Error(\n \"iceCandidatePoolSize cannot be changed after setLocalDescription\",\n );\n }\n\n if ((normalizedConfig.iceCandidatePoolSize ?? 0) > 0) {\n throw new Error(\"iceCandidatePoolSize > 0 is not supported\");\n }\n\n if (normalizedConfig.sctp !== undefined) {\n const requestedSctpMtu = normalizedConfig.sctp.mtu ?? DEFAULT_SCTP_MTU;\n validateSctpMtu(requestedSctpMtu);\n if (\n this.sctpManager?.sctpTransport &&\n requestedSctpMtu !== this.config.sctp.mtu\n ) {\n throw new Error(\n \"sctp.mtu cannot be changed after SCTP transport creation\",\n );\n }\n }\n\n deepMerge(this.config, normalizedConfig as Partial<PeerConfig>);\n this.config.sctp = {\n mtu: this.config.sctp?.mtu ?? DEFAULT_SCTP_MTU,\n };\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 if (\n !Number.isInteger(this.config.maxMessageSize) ||\n this.config.maxMessageSize < 0\n ) {\n throw new Error(\"maxMessageSize must be a non-negative integer\");\n }\n\n if (this.sctpManager?.sctpTransport) {\n this.sctpManager.sctpTransport.maxMessageSize =\n this.config.maxMessageSize;\n }\n\n assignDynamicPayloadTypes(this.config);\n\n [\n ...(this.config.headerExtensions.audio || []),\n ...(this.config.headerExtensions.video || []),\n ].forEach((v, i) => {\n v.id = 1 + i;\n });\n\n // Propagate ICE server changes only to transports still in gathering\n // state \"new\". JSEP (RFC 8829 §4.1.18): STUN/TURN changes affect the next\n // gathering phase; once gathering has started or finished, nothing is\n // applied to the live Connection (WHIP: createOffer → setConfiguration →\n // setLocalDescription). Per-transport state is used so a gatherer that\n // was reset to \"new\" (e.g. after ICE restart) is not blocked by a stale\n // manager aggregate of \"complete\".\n if (\n isReconfiguration &&\n this.secureManager &&\n (normalizedConfig.iceServers !== undefined ||\n normalizedConfig.turnUdpFamily !== undefined)\n ) {\n this.secureManager.updateIceServers();\n }\n }\n\n getConfiguration() {\n return clonePeerConfiguration(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 (\n transceiver.codecs.length === 0 ||\n transceiver.codecPreferencesNeedResolution\n ) {\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 const createdOffer = description.toJSON();\n this.lastCreatedOffer = createdOffer;\n this.lastCreatedOfferChangeSeq = this.negotiationChangeSeq;\n return createdOffer;\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport(\n this.config.maxMessageSize,\n this.config.sctp,\n );\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 createWebRtcDomException(\"InvalidStateError\", \"peer closed\");\n }\n if (this.transceiverManager.removeTrack(sender)) {\n this.needNegotiation();\n }\n }\n\n /**交渉が必要な変更を記録し、negotiationneeded を予約する */\n private needNegotiation = () => {\n this.negotiationChangeSeq++;\n this.scheduleNegotiationneeded();\n };\n\n /**未交渉の変更が残っていれば negotiationneeded を予約する (stable 復帰時の再判定にも使う) */\n private scheduleNegotiationneeded() {\n this.invalidateLastCreatedDescriptions();\n this.shouldNegotiationneeded = true;\n if (\n this.negotiationneeded ||\n this.negotiationneededScheduled ||\n this.signalingState !== \"stable\"\n ) {\n return;\n }\n this.shouldNegotiationneeded = false;\n this.negotiationneededScheduled = true;\n setImmediate(() => {\n this.negotiationneededScheduled = false;\n if (this.negotiatedChangeSeq >= this.negotiationChangeSeq) {\n // 発火前に適用された local offer が変更をすべて含んでいる\n return;\n }\n if (this.signalingState !== \"stable\") {\n // stable に戻った時点で改めて判定する\n this.shouldNegotiationneeded = true;\n return;\n }\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) {\n this.onnegotiationneeded(new globalThis.Event(\"negotiationneeded\"));\n }\n this.emit(\"negotiationneeded\");\n });\n }\n\n private invalidateLastCreatedDescriptions() {\n this.lastCreatedAnswer = undefined;\n this.lastCreatedOffer = undefined;\n }\n\n private async waitForPendingDescriptionTask() {\n this.assertNotClosed();\n await Promise.resolve();\n\n if (this.isClosed) {\n await new Promise<never>(() => undefined);\n }\n }\n\n private findOrCreateTransport() {\n const existingDtlsTransport = this.dtlsTransports.find(\n (transport) => transport.state !== \"closed\",\n );\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 (existingDtlsTransport) {\n return existingDtlsTransport;\n }\n }\n\n return this.createDtlsTransport();\n }\n\n /**\n * @param inheritCredentials false の場合は BUNDLE 外の独立 transport として\n * 既存 transport と異なる ICE credentials を使う\n */\n private createDtlsTransport({ inheritCredentials = true } = {}) {\n const dtlsTransport = this.secureManager.createTransport({\n inheritCredentials,\n });\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 const owner = this.resolveLocalCandidateOwner(iceTransport);\n if (!owner) {\n // 停止 / 拒否した m-line だけが使う transport の候補は通知しない\n log(\"no accepted m-line owns the ice transport\", iceTransport.id);\n return;\n }\n\n this.secureManager.handleNewIceCandidate({\n candidate,\n sdpMid: owner.mid,\n sdpMLineIndex: owner.index,\n });\n });\n\n return dtlsTransport;\n }\n\n /**\n * local candidate の sdpMid / sdpMLineIndex を、その ICE transport を実際に\n * 所有する受け入れ済み m-line (BUNDLE なら tag) に合わせる。\n */\n private resolveLocalCandidateOwner(iceTransport: RTCIceTransport) {\n const description = this._localDescription;\n if (!description) {\n return;\n }\n const owners = description.media\n .map((media, index) => ({ media, index }))\n .filter(({ media }) => {\n if (media.port === 0) {\n return false;\n }\n const mid = media.rtp.muxId;\n if (media.kind === \"application\") {\n return (\n !!this.sctpTransport &&\n this.sctpTransport.mid === mid &&\n this.sctpTransport.dtlsTransport?.iceTransport.id ===\n iceTransport.id\n );\n }\n const transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid != undefined && t.mid === mid);\n return (\n !!transceiver &&\n !transceiver.stopped &&\n transceiver.dtlsTransport?.iceTransport.id === iceTransport.id\n );\n });\n const tags = description.group\n .filter((group) => group.semantic === \"BUNDLE\")\n .map((group) => group.items[0]);\n const owner =\n owners.find(({ media }) => tags.includes(media.rtp.muxId!)) ?? owners[0];\n if (!owner) {\n return;\n }\n return { mid: owner.media.rtp.muxId, index: owner.index };\n }\n\n /**\n * answer 確定後の stopping transceiver を整理する。\n * @returns port 0 を自分の offer で交渉すべき transceiver が残っているか\n */\n private settleStoppingTransceivers() {\n const negotiatedMids = new Set(\n (this.sdpManager.currentLocalDescription?.media ?? [])\n .filter((media) => media.port !== 0 && media.rtp.muxId)\n .map((media) => media.rtp.muxId!),\n );\n const pending =\n this.transceiverManager.settleStoppingTransceivers(negotiatedMids);\n this.closeIdleTransports();\n return pending;\n }\n\n /**停止した transceiver の transport のうち、live な利用者がいないものを閉じる */\n private closeIdleTransports(\n candidates: (RTCDtlsTransport | undefined)[] = this.transceiverManager\n .getTransceivers()\n .filter((t) => t.stopped)\n .map((t) => t.dtlsTransport),\n ) {\n const live = new Set(this.dtlsTransports.map((t) => t.id));\n for (const transport of new Set(candidates)) {\n if (\n !transport ||\n transport.state === \"closed\" ||\n live.has(transport.id)\n ) {\n continue;\n }\n transport.stop().catch((error) => {\n log(\"failed to close idle transport\", error);\n });\n }\n }\n\n async setLocalDescription(sessionDescription: {\n type: \"rollback\";\n }): Promise<void>;\n async setLocalDescription(\n sessionDescription?: RTCLocalSessionDescriptionInit,\n ): Promise<SessionDescription>;\n async setLocalDescription(\n sessionDescription?: RTCLocalSessionDescriptionInit,\n ): Promise<SessionDescription | void> {\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\n await this.waitForPendingDescriptionTask();\n\n if (sessionDescription?.type === \"rollback\") {\n this.sdpManager.rollbackLocalDescription(this.signalingState);\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n transceiver.pendingLocalOfferCodecs = undefined;\n }\n this.pendingOfferChangeSeq = undefined;\n this.setSignalingState(\"stable\");\n if (this.shouldNegotiationneeded) {\n this.scheduleNegotiationneeded();\n }\n this.invalidateLastCreatedDescriptions();\n return;\n }\n\n const needsGeneratedDescription =\n !sessionDescription?.type ||\n !sessionDescription.sdp ||\n sessionDescription.sdp.length === 0;\n\n const generatedDescription = needsGeneratedDescription\n ? sessionDescription?.type === \"offer\"\n ? (this.lastCreatedOffer ?? (await this.createOffer()))\n : sessionDescription?.type === \"answer\" ||\n sessionDescription?.type === \"pranswer\"\n ? (this.lastCreatedAnswer ?? (await this.createAnswer()))\n : implicitOfferState.includes(this.signalingState)\n ? (this.lastCreatedOffer ?? (await this.createOffer()))\n : (this.lastCreatedAnswer ?? (await this.createAnswer()))\n : undefined;\n\n sessionDescription = {\n type: sessionDescription?.type ?? generatedDescription!.type,\n sdp:\n sessionDescription?.sdp && sessionDescription.sdp.length > 0\n ? sessionDescription.sdp\n : generatedDescription!.sdp,\n };\n\n if (\n sessionDescription.type === \"offer\" &&\n this.lastCreatedOffer &&\n sessionDescription.sdp !== this.lastCreatedOffer.sdp\n ) {\n throw createWebRtcDomException(\n \"InvalidModificationError\",\n \"setLocalDescription must use the latest created offer\",\n );\n }\n\n // # parse and validate description\n const descriptionType = sessionDescription.type as Exclude<\n RTCSessionDescriptionInit[\"type\"],\n \"rollback\" | undefined\n >;\n const descriptionSdp = sessionDescription.sdp!;\n\n const description = this.sdpManager.parseSdp({\n sdp: descriptionSdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: descriptionType,\n });\n\n // # update signaling state\n if (description.type === \"offer\") {\n // この offer は作成時点までの変更を含む。answer の適用で交渉済みにする\n this.pendingOfferChangeSeq =\n this.lastCreatedOffer?.sdp === sessionDescription.sdp\n ? this.lastCreatedOfferChangeSeq\n : undefined;\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n } else if (description.type === \"pranswer\") {\n this.setSignalingState(\"have-local-pranswer\");\n }\n\n if (description.type === \"answer\") {\n // answer の確定で拒否予定の m-line を停止し、RTP pipeline / 遊休 transport を解放する\n this.transceiverManager.commitRemoteOffer();\n // port 0 で答えた m-line (aggressive の inactive など) は offerer 側で拒否として停止が確定する。\n // answerer 側も同じ位置を停止確定にし、offerer が新 MID で再利用できるようにする\n for (const media of description.media) {\n if (![\"audio\", \"video\"].includes(media.kind) || media.port !== 0) {\n continue;\n }\n const transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid === media.rtp.muxId && !t.stopped);\n transceiver?.commitStopped({ rejected: true });\n }\n this.closeIdleTransports();\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) && media.port !== 0) {\n // 停止済み、別 kind、別 MID の transceiver には割り当てない (MID の一意性を保つ)\n const transceiver = this.transceiverManager\n .getTransceivers()\n .find(\n (t) =>\n t.mLineIndex === i &&\n !t.stopped &&\n t.kind === media.kind &&\n (t.mid == null || t.mid === mid),\n );\n if (transceiver) {\n transceiver.mid = mid;\n if (description.type === \"offer\") {\n transceiver.pendingLocalOfferCodecs = [...media.rtp.codecs];\n }\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 // transport ごとに、その transport を使う受け入れ済み m-line の a=setup を適用する\n // (BUNDLE group 外の独立 transport は先頭 m-line と異なる role を持ちうる)\n const roleOfTransport = new Map<\n RTCDtlsTransport,\n \"auto\" | \"client\" | \"server\"\n >();\n for (const media of description.media) {\n const mid = media.rtp.muxId;\n const mediaRole = media.dtlsParams?.role;\n if (media.port === 0 || mid == undefined || !mediaRole) {\n continue;\n }\n const owner =\n media.kind === \"application\"\n ? this.sctpTransport?.mid === mid\n ? this.sctpTransport\n : undefined\n : this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid === mid && !t.stopped);\n if (owner?.dtlsTransport && !roleOfTransport.has(owner.dtlsTransport)) {\n roleOfTransport.set(owner.dtlsTransport, mediaRole);\n }\n }\n\n this.secureManager.setLocalRole({\n type: description.type === \"offer\" ? \"offer\" : \"answer\",\n role,\n roleOfTransport,\n });\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n for (const media of description.media) {\n const t = this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid != undefined && t.mid === media.rtp.muxId);\n if (!t || t.stopped || t.pendingRejection) {\n continue;\n }\n const direction = t.stopping\n ? \"inactive\"\n : 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 // answerer の stop() は次の自分の offer で交渉する\n const hasUnnegotiatedStop =\n description.type === \"answer\" && this.settleStoppingTransceivers();\n if (this.shouldNegotiationneeded || hasUnnegotiatedStop) {\n this.scheduleNegotiationneeded();\n }\n\n this.invalidateLastCreatedDescriptions();\n return description;\n }\n\n private async gatherCandidates() {\n await this.secureManager.gatherCandidates();\n }\n\n async addIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit | null = {},\n ) {\n if (this.isClosed) {\n throw createWebRtcDomException(\"InvalidStateError\", \"is closed\");\n }\n\n if (!this.remoteDescription || !this.sdpManager._remoteDescription) {\n this.pendingRemoteCandidates.push(candidateMessage);\n return;\n }\n await this.applyRemoteIceCandidate(candidateMessage);\n }\n\n private async applyRemoteIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit | null,\n ) {\n const sdp = this.sdpManager._remoteDescription;\n if (!sdp) {\n return;\n }\n const appliedCandidate = await this.secureManager.addIceCandidate(\n sdp,\n candidateMessage,\n );\n const remoteDescription = this.sdpManager._remoteDescription;\n if (!remoteDescription || !appliedCandidate) {\n return;\n }\n\n if (appliedCandidate.kind === \"end-of-candidates\") {\n for (const mediaIndex of appliedCandidate.mediaIndices) {\n const media = remoteDescription.media[mediaIndex];\n if (media) {\n media.iceCandidatesComplete = true;\n }\n }\n return;\n }\n\n for (const mediaIndex of appliedCandidate.mediaIndices) {\n const media = remoteDescription.media[mediaIndex];\n if (!media) {\n continue;\n }\n media.iceCandidates.push(appliedCandidate.candidate);\n }\n }\n\n private async flushPendingRemoteCandidates() {\n while (\n this.pendingRemoteCandidates.length > 0 &&\n this.remoteDescription &&\n this.sdpManager._remoteDescription\n ) {\n const candidate = this.pendingRemoteCandidates.shift();\n await this.applyRemoteIceCandidate(candidate ?? null);\n }\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 await this.waitForPendingDescriptionTask();\n\n let codecPlan = new Map<number, RTCRtpCodecParameters[]>();\n if (\n sessionDescription.type &&\n sessionDescription.type !== \"rollback\" &&\n sessionDescription.sdp\n ) {\n const preview = this.sdpManager.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: false,\n signalingState: this.signalingState,\n type: sessionDescription.type,\n });\n // 本適用と同じ対応付けで全 m-line の codec を副作用なしに解決する\n const planned = new Set<RTCRtpTransceiver>();\n codecPlan = this.transceiverManager.planRemoteRtpCodecs(\n preview,\n (remoteMedia, index) => {\n const transceiver = this.findTransceiverForRemoteMedia(\n remoteMedia,\n index,\n planned,\n );\n if (transceiver) planned.add(transceiver);\n return transceiver;\n },\n );\n }\n\n const needsImplicitLocalRollback =\n sessionDescription.type === \"offer\" &&\n [\"have-local-offer\", \"have-local-pranswer\"].includes(this.signalingState);\n if (needsImplicitLocalRollback) {\n this.sdpManager.rollbackLocalDescription(this.signalingState);\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n transceiver.pendingLocalOfferCodecs = undefined;\n }\n this.pendingOfferChangeSeq = undefined;\n this.shouldNegotiationneeded = true;\n this.setSignalingState(\"stable\");\n await Promise.resolve();\n }\n\n // # parse and validate description\n this.assertAnswerKeepsSharedTransports(sessionDescription);\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\n );\n if (!remoteSdp) {\n // 非対応 re-offer などの rollback では元の transceiver 対応を復元する\n const transportsBeforeRollback = this.transceiverManager\n .getTransceivers()\n .map((t) => t.dtlsTransport);\n this.transceiverManager.rollbackRemoteOffer();\n this.closeIdleTransports(transportsBeforeRollback);\n this.setSignalingState(\"stable\");\n if (this.shouldNegotiationneeded) {\n this.scheduleNegotiationneeded();\n }\n this.invalidateLastCreatedDescriptions();\n return;\n }\n\n if (remoteSdp.type === \"offer\") {\n this.transceiverManager.beginRemoteOffer();\n }\n\n // # apply description\n const bundleGroups =\n this.config.bundlePolicy === \"disable\"\n ? []\n : remoteSdp.group.filter((group) => group.semantic === \"BUNDLE\");\n const groupOfMid = (mid: string | undefined) =>\n mid == undefined\n ? undefined\n : bundleGroups.find((group) => group.items.includes(mid));\n\n // ## associate m-lines with transceivers / sctp\n const associated = new Set<RTCRtpTransceiver>();\n const entries: RemoteMediaEntry[] = remoteSdp.media.map(\n (remoteMedia, index) => {\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.findTransceiverForRemoteMedia(\n remoteMedia,\n index,\n associated,\n );\n if (!transceiver) {\n if (remoteMedia.port === 0) {\n // 未知の MID の拒否済み m-line には transceiver を関連付けない\n return { remoteMedia, index };\n }\n transceiver = this.addRemoteTransceiver(remoteMedia, index);\n } else if (transceiver.mid == null) {\n this.transceiverManager.associateMLine(transceiver, index);\n }\n associated.add(transceiver);\n return { remoteMedia, index, transceiver };\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 return { remoteMedia, index, sctpTransport };\n } else {\n throw new Error(\"invalid media kind\");\n }\n },\n );\n if (remoteSdp.type === \"offer\") {\n this.transceiverManager.releaseUnassociatedReservations(\n associated,\n remoteSdp.media.length,\n );\n }\n const ownerOf = (entry: RemoteMediaEntry) =>\n entry.transceiver ?? entry.sctpTransport;\n\n // ## transport ownership\n // remote offer の所有関係は bundlePolicy によらず offer の BUNDLE group だけで決まる\n // (max-bundle は自分の offer にだけ効く)。group ごとに 1 つの transport を共有し、\n // 異なる group や group 外の m-line とは共有しない。\n // remote answer では offer で渡した ICE credentials を保つため transport を作り直さない\n // (共有 transport を分割する answer は assertAnswerKeepsSharedTransports で事前に拒否済み)\n const isRemoteOffer = remoteSdp.type === \"offer\";\n const liveTransport = (transport: RTCDtlsTransport | undefined) =>\n !!transport && transport.state !== \"closed\";\n const groupTransports = new Map<GroupDescription, RTCDtlsTransport>();\n const claimed = new Set<RTCDtlsTransport>();\n for (const group of bundleGroups) {\n const members = entries.filter(\n (entry) =>\n !!ownerOf(entry) &&\n group.items.includes(entry.remoteMedia.rtp.muxId!),\n );\n if (members.length === 0) {\n continue;\n }\n // 既存 member の transport を優先し、他の group が使っていれば新しい transport を作る\n let shared = members\n .map((entry) => ownerOf(entry)!.dtlsTransport)\n .find(\n (transport) =>\n liveTransport(transport) &&\n (!isRemoteOffer || !claimed.has(transport)),\n );\n if (!shared) {\n shared = this.createDtlsTransport({ inheritCredentials: false });\n }\n groupTransports.set(group, shared);\n claimed.add(shared);\n for (const entry of members) {\n const owner = ownerOf(entry)!;\n if (owner.dtlsTransport !== shared) {\n owner.setDtlsTransport(shared);\n }\n }\n }\n if (isRemoteOffer) {\n // group 外 (group のない offer を含む) で受け入れた m-line は独立した transport / ICE credentials を持つ\n for (const entry of entries) {\n const owner = ownerOf(entry);\n if (\n !owner ||\n entry.remoteMedia.port === 0 ||\n groupOfMid(entry.remoteMedia.rtp.muxId)\n ) {\n continue;\n }\n if (\n !liveTransport(owner.dtlsTransport) ||\n claimed.has(owner.dtlsTransport)\n ) {\n owner.setDtlsTransport(\n this.createDtlsTransport({ inheritCredentials: false }),\n );\n }\n claimed.add(owner.dtlsTransport);\n }\n }\n\n // ## apply RTP / SCTP (受け入れ判定)\n const acceptedEntries = new Set<RemoteMediaEntry>();\n for (const entry of entries) {\n const { remoteMedia, index } = entry;\n if (entry.transceiver) {\n if (\n this.transceiverManager.setRemoteRTP(\n entry.transceiver,\n remoteMedia,\n remoteSdp.type,\n index,\n codecPlan.get(index) ?? [],\n )\n ) {\n acceptedEntries.add(entry);\n }\n } else if (entry.sctpTransport) {\n this.sctpManager.setRemoteSCTP(remoteMedia, index);\n acceptedEntries.add(entry);\n }\n }\n\n // ICE / DTLS パラメータは group で最初に受け入れた member (tag) から適用する\n // (codec 不一致で拒否した member のパラメータは使わない)\n const groupParamSources = new Map<GroupDescription, RemoteMediaEntry>();\n for (const group of bundleGroups) {\n for (const mid of group.items) {\n const entry = entries.find(\n (e) =>\n e.remoteMedia.rtp.muxId === mid &&\n e.remoteMedia.port !== 0 &&\n acceptedEntries.has(e),\n );\n if (entry) {\n groupParamSources.set(group, entry);\n break;\n }\n }\n }\n\n // ## apply transport parameters\n for (const entry of entries) {\n const { remoteMedia } = entry;\n const owner = ownerOf(entry);\n if (!owner) {\n continue;\n }\n const accepted = acceptedEntries.has(entry);\n const dtlsTransport = owner.dtlsTransport;\n\n const group = groupOfMid(remoteMedia.rtp.muxId);\n if (\n remoteMedia.port === 0 ||\n !dtlsTransport ||\n dtlsTransport.state === \"closed\" ||\n // group 外の拒否 section の transport は使わない\n (!accepted && !group)\n ) {\n continue;\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n const ownsTransportParams =\n !group || groupParamSources.get(group) === entry;\n\n if (ownsTransportParams) {\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 (\n remoteMedia.iceParams.iceLite &&\n !iceTransport.connection.iceLite\n ) {\n iceTransport.connection.iceControlling = true;\n }\n }\n if (remoteMedia.dtlsParams) {\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n }\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 }\n\n if (remoteSdp.type === \"answer\") {\n // answer に含まれない既存 m-line は remote 起因の停止として確定する\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (\n !associated.has(transceiver) &&\n transceiver.mid != undefined &&\n !transceiver.stopped\n ) {\n transceiver.commitStopped({ rejected: true });\n }\n }\n this.closeIdleTransports();\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n } else if (remoteSdp.type === \"pranswer\") {\n this.setSignalingState(\"have-remote-pranswer\");\n }\n\n await this.flushPendingRemoteCandidates();\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 (\n remoteSdp.type === \"answer\" &&\n this.pendingOfferChangeSeq != undefined\n ) {\n this.negotiatedChangeSeq = Math.max(\n this.negotiatedChangeSeq,\n this.pendingOfferChangeSeq,\n );\n this.pendingOfferChangeSeq = undefined;\n }\n const hasUnnegotiatedStop =\n remoteSdp.type === \"answer\" && this.settleStoppingTransceivers();\n if (this.shouldNegotiationneeded || hasUnnegotiatedStop) {\n this.scheduleNegotiationneeded();\n }\n this.invalidateLastCreatedDescriptions();\n }\n\n /**\n * remote answer / pranswer の検証 (offerer 側、状態を変更する前に実行する)。\n * local offer で 1 つの transport を共有した m-line を、answer が同じ BUNDLE group に置かずに\n * 異なる ICE credentials で受け入れることはできない (RFC 8843 7.3.2)。共有 transport は分割できず、\n * 新しい transport を作ると offer で渡した ICE credentials とも一致しなくなる。\n * group の記述が MID と一致しなくても remote の ICE credentials が同じなら、同じ transport のまま扱う。\n */\n private assertAnswerKeepsSharedTransports(\n sessionDescription: RTCSessionDescriptionInit,\n ) {\n if (\n ![\"answer\", \"pranswer\"].includes(sessionDescription.type ?? \"\") ||\n ![\"have-local-offer\", \"have-local-pranswer\"].includes(\n this.signalingState,\n ) ||\n !sessionDescription.sdp ||\n this.config.bundlePolicy === \"disable\"\n ) {\n return;\n }\n const answer = SessionDescription.parse(sessionDescription.sdp);\n const answerGroups = answer.group.filter((g) => g.semantic === \"BUNDLE\");\n const byTransport = new Map<\n RTCDtlsTransport,\n { group?: GroupDescription; credentials: string }\n >();\n for (const media of answer.media) {\n const mid = media.rtp.muxId;\n if (media.port === 0 || mid == undefined) {\n continue;\n }\n const owner =\n media.kind === \"application\"\n ? this.sctpTransport?.mid === mid\n ? this.sctpTransport\n : undefined\n : this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid === mid && !t.stopped);\n const transport = owner?.dtlsTransport;\n if (!transport) {\n continue;\n }\n const current = {\n group: answerGroups.find((g) => g.items.includes(mid)),\n credentials: `${media.iceParams?.usernameFragment}:${media.iceParams?.password}`,\n };\n const first = byTransport.get(transport);\n if (!first) {\n byTransport.set(transport, current);\n continue;\n }\n const sameGroup = !!current.group && current.group === first.group;\n if (!sameGroup && current.credentials !== first.credentials) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n `mid=${mid} shares a transport in the local offer but the remote ${sessionDescription.type} moves it out of that BUNDLE group`,\n );\n }\n }\n }\n\n /**\n * remote m-line に対応する transceiver を探す。MID の一致を優先し、\n * 未関連付け transceiver は同じ offer 内で異なる m-line に割り当てる。\n */\n private findTransceiverForRemoteMedia(\n remoteMedia: MediaDescription,\n index: number,\n associated: Set<RTCRtpTransceiver>,\n ) {\n const candidates = this.transceiverManager\n .getTransceivers()\n .filter((t) => !associated.has(t) && t.kind === remoteMedia.kind);\n const mid = remoteMedia.rtp.muxId;\n const byMid =\n mid != undefined ? candidates.find((t) => t.mid === mid) : undefined;\n if (byMid) {\n return byMid;\n }\n if (remoteMedia.port === 0) {\n return;\n }\n const unassociated = candidates.filter(\n (t) => t.mid == null && !t.stopping && !t.stopped,\n );\n return unassociated.find((t) => t.mLineIndex === index) ?? unassociated[0];\n }\n\n /**\n * remote offer / answer の m-line 用に transceiver を作る。\n * 同じ位置に停止済みの旧 transceiver があれば、それを復活させず新しい receiver/router で置き換える。\n */\n private addRemoteTransceiver(remoteMedia: MediaDescription, index: number) {\n const dtlsTransport = this.findOrCreateTransport();\n const transceiver = this.transceiverManager.addTransceiver(\n remoteMedia.kind,\n dtlsTransport,\n { direction: \"recvonly\" },\n { remoteMLineIndex: index },\n );\n transceiver.mid = remoteMedia.rtp.muxId ?? null;\n this.secureManager.updateIceConnectionState();\n this.onRemoteTransceiverAdded.execute(transceiver);\n return transceiver;\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(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender {\n if (this.isClosed) {\n throw createWebRtcDomException(\"InvalidStateError\", \"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, streams);\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 // setCodecPreferences() で無効化された transceiver を再解決する。\n // offer 側と異なり answer は remote offer との交渉結果を使い、\n // sender/receiver の codec 状態も新しい negotiated codec に同期する。\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (\n transceiver.codecs.length !== 0 &&\n !transceiver.codecPreferencesNeedResolution\n ) {\n continue;\n }\n // 拒否予定 / 停止済みの m-line は port 0 で answer するため codec を解決しない\n if (\n transceiver.pendingRejection ||\n transceiver.stopping ||\n transceiver.stopped\n ) {\n continue;\n }\n const remoteDescription = this.sdpManager._remoteDescription;\n const remoteMedia =\n remoteDescription?.media.find(\n (media) =>\n media.rtp.muxId != undefined &&\n media.rtp.muxId === transceiver.mid &&\n media.kind === transceiver.kind,\n ) ??\n (transceiver.mLineIndex != undefined\n ? remoteDescription?.media[transceiver.mLineIndex]\n : undefined);\n if (remoteMedia && [\"audio\", \"video\"].includes(remoteMedia.kind)) {\n this.transceiverManager.resyncAnswerCodecs(transceiver, remoteMedia);\n } else {\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.buildAnswerSdp({\n transceivers: this.transceiverManager.getTransceivers(),\n sctpTransport: this.sctpTransport,\n signalingState: this.signalingState,\n });\n const createdAnswer = description.toJSON();\n this.lastCreatedAnswer = createdAnswer;\n return createdAnswer;\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw createWebRtcDomException(\n \"InvalidStateError\",\n \"RTCPeerConnection is closed\",\n );\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n if (this.signalingState === state) {\n return;\n }\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange(new globalThis.Event(\"signalingstatechange\"));\n }\n this.emit(\"signalingstatechange\");\n }\n\n private createPeerConnectionStats(timestamp: number): RTCPeerConnectionStats {\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\", this.id),\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 timestamp = getStatsTimestamp();\n const stats: RTCStats[] = [];\n\n if (!selector) {\n stats.push(this.createPeerConnectionStats(timestamp));\n }\n\n stats.push(...this.transceiverManager.collectStats(timestamp));\n\n const transportStats = await this.secureManager.getStats(timestamp);\n stats.push(...transportStats);\n\n if (!selector && this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats(timestamp);\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n if (!selector) {\n return buildStatsReport(stats);\n }\n\n return buildStatsReport(\n stats,\n this.transceiverManager.getStatsRootIds(selector),\n );\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.pendingRemoteCandidates.length = 0;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n // SCTP ABORT は DTLS/ICE が生きている間に送る(close は abrupt であり SHUTDOWN ではない)\n await this.sctpManager.close();\n await this.secureManager.close();\n\n // 公開 Event を完了させ、購読者・クロージャが PeerConnection を保持し続けないようにする\n this.completePeerEvents();\n\n log(\"peerConnection closed\");\n }\n\n private completePeerEvents() {\n const events = [\n this.onDataChannel,\n this.iceGatheringStateChange,\n this.iceConnectionStateChange,\n this.signalingStateChange,\n this.connectionStateChange,\n this.onTransceiverAdded,\n this.onRemoteTransceiverAdded,\n this.onIceCandidate,\n this.onNegotiationneeded,\n ] as const;\n for (const event of events) {\n if (!event.ended) {\n event.complete();\n }\n }\n }\n}\n\nexport type DebugConfig = Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\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 /** Advertise local ICE lite and operate in the controlled role. */\n iceLite: boolean;\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 iceUseTcp: boolean;\n /** Gather passive (listening) TCP host candidates. Defaults to true. */\n iceTcpPassive: boolean;\n /**\n * Seconds to wait for server-reflexive candidates while gathering.\n * Defaults to 5 when undefined.\n */\n iceStunGatherTimeout: number | undefined;\n /**\n * Seconds to wait for a TURN TCP/TLS connection to be established.\n * Defaults to 8 when undefined.\n */\n iceTurnConnectTimeout: number | undefined;\n turnTransport: \"udp\" | \"tcp\" | \"tls\" | undefined;\n turnTlsOptions: TlsConnectionOptions | undefined;\n /**\n * Preferred IP family of the TURN/UDP socket, applied only when the TURN\n * server is a hostname. Ignored for an IP literal server, whose own family\n * always selects the socket. Defaults to 4 when undefined.\n */\n turnUdpFamily: 4 | 6 | undefined;\n /** @deprecated Prefer turn URL transport parameters or turnTransport. */\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 rtcpMuxPolicy: \"require\";\n iceCandidatePoolSize: number;\n certificates: RTCCertificate[];\n debug: DebugConfig;\n midSuffix: boolean;\n /** Advertised local SCTP max-message-size in SDP. Use 0 for unlimited. */\n maxMessageSize: number;\n /** SCTP outbound packet MTU used for DATA chunk fragmentation. */\n sctp: { mtu: number };\n /**\n * Queue outbound RTP on each sender until DTLS is connected.\n * Disabled by default. Pass `true` or `{ enabled: true, maxLength }` to buffer.\n */\n pendingRtp: NonNullable<RTCRtpSenderOptions[\"pendingRtp\"]>;\n /**\n * How local SDP marks inactive / stopped m-lines. Cannot be changed after construction.\n * - `\"compatible\"` (default): an accepted `inactive` m-line keeps a non-zero port.\n * Only rejected (no common codec / remote port 0) or stopped m-lines use port 0,\n * and only those negotiated port 0 positions are reused by new transceivers.\n * - `\"aggressive\"`: legacy behavior. `inactive` m-lines are also written with port 0.\n */\n mLineReuse: MLineReuse;\n}\n\nconst MLineReuseModes: readonly MLineReuse[] = [\"compatible\", \"aggressive\"];\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\nfunction assignDynamicPayloadTypes(config: PeerConfig) {\n for (const [i, codecParams] of enumerate([\n ...(config.codecs.audio || []),\n ...(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\nexport type RTCIceServer = {\n urls: string | string[];\n username?: string;\n credential?: string;\n};\n\nexport type RTCBundlePolicy = \"balanced\" | \"max-compat\" | \"max-bundle\";\nexport type RTCRtcpMuxPolicy = \"require\";\n\nexport interface RTCSctpConfiguration {\n /** SCTP outbound packet MTU used for DATA chunk fragmentation. Defaults to 1191. */\n mtu?: number;\n}\n\nexport interface RTCConfiguration {\n iceServers?: RTCIceServer[];\n iceTransportPolicy?: PeerConfig[\"iceTransportPolicy\"];\n bundlePolicy?: RTCBundlePolicy;\n rtcpMuxPolicy?: RTCRtcpMuxPolicy;\n iceCandidatePoolSize?: number;\n certificates?: RTCCertificate[];\n}\n\nexport interface RTCLocalSessionDescriptionInit\n extends RTCSessionDescriptionInit {\n type?: Exclude<RTCSessionDescriptionInit[\"type\"], \"rollback\"> | \"rollback\";\n}\n\ntype RTCPeerConnectionRTCConfiguration = Omit<\n RTCConfiguration,\n \"bundlePolicy\"\n> & {\n bundlePolicy?: PeerConfig[\"bundlePolicy\"] | RTCBundlePolicy;\n};\n\nexport type RTCPeerConnectionConfig = Partial<\n Omit<\n PeerConfig,\n | \"bundlePolicy\"\n | \"rtcpMuxPolicy\"\n | \"iceCandidatePoolSize\"\n | \"certificates\"\n | \"sctp\"\n >\n> &\n RTCPeerConnectionRTCConfiguration & { sctp?: RTCSctpConfiguration };\n\nfunction generateDefaultPeerConfig(): PeerConfig {\n return {\n codecs: defaultCodecs(),\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceLite: false,\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 iceUseTcp: false,\n iceTcpPassive: true,\n iceStunGatherTimeout: undefined,\n iceTurnConnectTimeout: undefined,\n turnTransport: undefined,\n turnTlsOptions: undefined,\n turnUdpFamily: undefined,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n rtcpMuxPolicy: \"require\",\n iceCandidatePoolSize: 0,\n certificates: [],\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n maxMessageSize: DEFAULT_MAX_MESSAGE_SIZE,\n sctp: { mtu: DEFAULT_SCTP_MTU },\n pendingRtp: false,\n mLineReuse: \"compatible\",\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\n\nfunction normalizePeerConfiguration(\n config: RTCPeerConnectionConfig,\n): Partial<PeerConfig> & { sctp?: RTCSctpConfiguration } {\n const input = Object(config ?? {}) as RTCPeerConnectionConfig;\n const normalizedConfig = { ...input } as Partial<PeerConfig> & {\n sctp?: RTCSctpConfiguration;\n };\n\n if (input.sctp !== undefined) {\n normalizedConfig.sctp = { ...input.sctp } as PeerConfig[\"sctp\"];\n }\n\n if (input.bundlePolicy === \"balanced\") {\n normalizedConfig.bundlePolicy = \"max-compat\";\n }\n\n if (\"certificates\" in input) {\n if (input.certificates === undefined) {\n normalizedConfig.certificates = undefined;\n } else if (\n !Array.isArray(input.certificates) ||\n input.certificates.some((certificate) => certificate == null)\n ) {\n throw createWebRtcTypeError(\n \"certificates must be an array of RTCCertificate\",\n );\n } else {\n normalizedConfig.certificates = [...input.certificates];\n }\n }\n\n if (\"iceCandidatePoolSize\" in input) {\n normalizedConfig.iceCandidatePoolSize = coerceUnsignedShort(\n input.iceCandidatePoolSize,\n \"iceCandidatePoolSize\",\n );\n }\n\n return normalizedConfig;\n}\n\nfunction coerceUnsignedShort(value: unknown, name: string) {\n const coerced = Number(value);\n if (\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < 0 ||\n coerced > 65535\n ) {\n throw createWebRtcTypeError(`${name} must be an unsigned short`);\n }\n return coerced;\n}\n\nfunction hasSameCertificates(left: RTCCertificate[], right: RTCCertificate[]) {\n return (\n left.length === right.length &&\n left.every((certificate, index) => certificate === right[index])\n );\n}\n\nfunction clonePeerConfiguration(config: PeerConfig) {\n return {\n ...config,\n codecs: {\n audio: config.codecs.audio ? [...config.codecs.audio] : undefined,\n video: config.codecs.video ? [...config.codecs.video] : undefined,\n },\n headerExtensions: {\n audio: config.headerExtensions.audio\n ? [...config.headerExtensions.audio]\n : undefined,\n video: config.headerExtensions.video\n ? [...config.headerExtensions.video]\n : undefined,\n },\n iceServers: config.iceServers.map((server) => ({\n ...server,\n urls: Array.isArray(server.urls) ? [...server.urls] : server.urls,\n })),\n icePortRange: config.icePortRange\n ? ([...config.icePortRange] as [number, number])\n : undefined,\n iceAdditionalHostAddresses: config.iceAdditionalHostAddresses\n ? [...config.iceAdditionalHostAddresses]\n : undefined,\n dtls: { ...config.dtls },\n certificates: [...config.certificates],\n debug: { ...config.debug },\n sctp: { ...config.sctp },\n pendingRtp:\n typeof config.pendingRtp === \"object\" && config.pendingRtp != undefined\n ? { ...config.pendingRtp }\n : config.pendingRtp,\n };\n}\n\nexport class RTCTrackEvent {\n readonly type = \"track\";\n readonly track: MediaStreamTrack;\n readonly streams: MediaStream[];\n readonly transceiver: RTCRtpTransceiver;\n readonly receiver: RTCRtpReceiver;\n\n constructor(init: {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n }) {\n this.track = init.track;\n this.streams = [...init.streams];\n this.transceiver = init.transceiver;\n this.receiver = init.receiver;\n }\n}\n\ntype RemoteMediaEntry = {\n remoteMedia: MediaDescription;\n index: number;\n transceiver?: RTCRtpTransceiver;\n sctpTransport?: RTCSctpTransport;\n};\n\nexport interface RTCDataChannelEvent {\n type?: \"datachannel\";\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n type?: \"icecandidate\";\n candidate?: RTCIceCandidate;\n}\n\ntype PeerConnectionEventHandlers = {\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"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OverconstrainedError as WeriftOverconstrainedError } from "../errors";
|
|
2
|
+
export type { BoundMediaRegister, MediaGetUserMediaRequest, MediaKind, MediaRegister, MediaRegisterCommonOptions, MediaStreamConstraints, MediaTrackConstraints, } from "./mediaRegister";
|
|
3
|
+
export { installPolyfill } from "./install";
|
|
4
|
+
export type { InstallPolyfillOptions } from "./install";
|
|
5
|
+
export type { RTCPeerConnectionConfig } from "../peerConnection";
|
|
6
|
+
export { createPolyfillRTCPeerConnection, mergePeerConnectionConfig, } from "./peerConnectionConfig";
|
|
7
|
+
export { createCallbackRegister, createDummyRegister, } from "./registers/callback";
|
|
8
|
+
export { createEmptyRegister } from "./registers/empty";
|
|
9
|
+
export { createMp4WebmRegister } from "./registers/mp4Webm";
|
|
10
|
+
export type { CreateMp4WebmRegisterOptions, Mp4WebmCodecHint, } from "./registers/mp4Webm";
|
|
11
|
+
export { createEncodedBinaryRegister, createRtpRtcpRegister, } from "./registers/rtpRtcp";
|
|
12
|
+
export type { CreateEncodedBinaryRegisterOptions, CreateRtpRtcpRegisterOptions, } from "./registers/rtpRtcp";
|
|
13
|
+
export { PolyfillRTCSessionDescription as RTCSessionDescription } from "./rtcSessionDescription";
|
|
14
|
+
export { WeriftOverconstrainedError as OverconstrainedError };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OverconstrainedError = exports.RTCSessionDescription = exports.createRtpRtcpRegister = exports.createEncodedBinaryRegister = exports.createMp4WebmRegister = exports.createEmptyRegister = exports.createDummyRegister = exports.createCallbackRegister = exports.mergePeerConnectionConfig = exports.createPolyfillRTCPeerConnection = exports.installPolyfill = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
Object.defineProperty(exports, "OverconstrainedError", { enumerable: true, get: function () { return errors_1.OverconstrainedError; } });
|
|
6
|
+
var install_1 = require("./install");
|
|
7
|
+
Object.defineProperty(exports, "installPolyfill", { enumerable: true, get: function () { return install_1.installPolyfill; } });
|
|
8
|
+
var peerConnectionConfig_1 = require("./peerConnectionConfig");
|
|
9
|
+
Object.defineProperty(exports, "createPolyfillRTCPeerConnection", { enumerable: true, get: function () { return peerConnectionConfig_1.createPolyfillRTCPeerConnection; } });
|
|
10
|
+
Object.defineProperty(exports, "mergePeerConnectionConfig", { enumerable: true, get: function () { return peerConnectionConfig_1.mergePeerConnectionConfig; } });
|
|
11
|
+
var callback_1 = require("./registers/callback");
|
|
12
|
+
Object.defineProperty(exports, "createCallbackRegister", { enumerable: true, get: function () { return callback_1.createCallbackRegister; } });
|
|
13
|
+
Object.defineProperty(exports, "createDummyRegister", { enumerable: true, get: function () { return callback_1.createDummyRegister; } });
|
|
14
|
+
var empty_1 = require("./registers/empty");
|
|
15
|
+
Object.defineProperty(exports, "createEmptyRegister", { enumerable: true, get: function () { return empty_1.createEmptyRegister; } });
|
|
16
|
+
var mp4Webm_1 = require("./registers/mp4Webm");
|
|
17
|
+
Object.defineProperty(exports, "createMp4WebmRegister", { enumerable: true, get: function () { return mp4Webm_1.createMp4WebmRegister; } });
|
|
18
|
+
var rtpRtcp_1 = require("./registers/rtpRtcp");
|
|
19
|
+
Object.defineProperty(exports, "createEncodedBinaryRegister", { enumerable: true, get: function () { return rtpRtcp_1.createEncodedBinaryRegister; } });
|
|
20
|
+
Object.defineProperty(exports, "createRtpRtcpRegister", { enumerable: true, get: function () { return rtpRtcp_1.createRtpRtcpRegister; } });
|
|
21
|
+
var rtcSessionDescription_1 = require("./rtcSessionDescription");
|
|
22
|
+
Object.defineProperty(exports, "RTCSessionDescription", { enumerable: true, get: function () { return rtcSessionDescription_1.PolyfillRTCSessionDescription; } });
|
|
23
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/polyfill/api.ts"],"names":[],"mappings":";;;AAAA,sCAA+E;AAqCxC,qGArCN,6BAA0B,OAqCA;AA1B3D,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AAGxB,+DAGgC;AAF9B,uIAAA,+BAA+B,OAAA;AAC/B,iIAAA,yBAAyB,OAAA;AAE3B,iDAG8B;AAF5B,kHAAA,sBAAsB,OAAA;AACtB,+GAAA,mBAAmB,OAAA;AAErB,2CAAwD;AAA/C,4GAAA,mBAAmB,OAAA;AAC5B,+CAA4D;AAAnD,gHAAA,qBAAqB,OAAA;AAK9B,+CAG6B;AAF3B,sHAAA,2BAA2B,OAAA;AAC3B,gHAAA,qBAAqB,OAAA;AAMvB,iEAAiG;AAAxF,8HAAA,6BAA6B,OAAyB","sourcesContent":["import { OverconstrainedError as WeriftOverconstrainedError } from \"../errors\";\n\nexport type {\n BoundMediaRegister,\n MediaGetUserMediaRequest,\n MediaKind,\n MediaRegister,\n MediaRegisterCommonOptions,\n MediaStreamConstraints,\n MediaTrackConstraints,\n} from \"./mediaRegister\";\nexport { installPolyfill } from \"./install\";\nexport type { InstallPolyfillOptions } from \"./install\";\nexport type { RTCPeerConnectionConfig } from \"../peerConnection\";\nexport {\n createPolyfillRTCPeerConnection,\n mergePeerConnectionConfig,\n} from \"./peerConnectionConfig\";\nexport {\n createCallbackRegister,\n createDummyRegister,\n} from \"./registers/callback\";\nexport { createEmptyRegister } from \"./registers/empty\";\nexport { createMp4WebmRegister } from \"./registers/mp4Webm\";\nexport type {\n CreateMp4WebmRegisterOptions,\n Mp4WebmCodecHint,\n} from \"./registers/mp4Webm\";\nexport {\n createEncodedBinaryRegister,\n createRtpRtcpRegister,\n} from \"./registers/rtpRtcp\";\nexport type {\n CreateEncodedBinaryRegisterOptions,\n CreateRtpRtcpRegisterOptions,\n} from \"./registers/rtpRtcp\";\nexport { PolyfillRTCSessionDescription as RTCSessionDescription } from \"./rtcSessionDescription\";\nexport { WeriftOverconstrainedError as OverconstrainedError };\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chromium 111+ として mediasoup-client の Chrome111 Handler が選ぶ固定 User-Agent。
|
|
3
|
+
* 実行中 Node の major から Chrome バージョンを合成しない。
|
|
4
|
+
*/
|
|
5
|
+
export declare const CHROME111_COMPAT_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36";
|
|
6
|
+
export declare function parseUserAgentOption(userAgent: unknown): string | undefined;
|
|
7
|
+
export declare function shouldReplaceUserAgent(current: unknown): boolean;
|
|
8
|
+
export declare function resolveInstalledUserAgent(current: unknown, explicit: string | undefined): string | undefined;
|
|
9
|
+
export declare function applyUserAgent(navigatorObject: object, userAgent: string): void;
|
|
10
|
+
export declare function installUserAgent(navigatorObject: object, explicit: string | undefined): void;
|
|
11
|
+
export declare const assertUserAgentOption: typeof parseUserAgentOption;
|