werift 0.23.0 → 0.24.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 +46 -0
- package/lib/common/src/transport.d.ts +22 -9
- package/lib/common/src/transport.js +152 -25
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +16 -1
- package/lib/ice/src/candidate.js +99 -15
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/ice.d.ts +2 -0
- package/lib/ice/src/ice.js +171 -41
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +23 -2
- package/lib/ice/src/iceBase.js +63 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +2 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +1 -26
- package/lib/ice/src/stun/const.js +15 -54
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -25
- package/lib/ice/src/stun/message.js +15 -149
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +1 -1
- package/lib/ice/src/stun/protocol.js +2 -2
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
- package/lib/ice/src/stun/tcpFrame.js +26 -0
- package/lib/ice/src/stun/tcpFrame.js.map +1 -0
- package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
- package/lib/ice/src/stun/tcpProtocol.js +326 -0
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
- package/lib/ice/src/stun/transaction.d.ts +2 -1
- package/lib/ice/src/stun/transaction.js +9 -3
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/frame.d.ts +1 -0
- package/lib/ice/src/turn/frame.js +18 -0
- package/lib/ice/src/turn/frame.js.map +1 -0
- package/lib/ice/src/turn/protocol.d.ts +9 -7
- package/lib/ice/src/turn/protocol.js +32 -44
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
- package/lib/{ice → ice-server}/src/stun/attributes.js +60 -19
- package/lib/ice-server/src/stun/attributes.js.map +1 -0
- package/lib/ice-server/src/stun/const.d.ts +28 -0
- package/lib/ice-server/src/stun/const.js +88 -0
- package/lib/ice-server/src/stun/const.js.map +1 -0
- package/lib/ice-server/src/stun/message.d.ts +37 -0
- package/lib/ice-server/src/stun/message.js +190 -0
- package/lib/ice-server/src/stun/message.js.map +1 -0
- package/lib/ice-server/src/turn/auth.d.ts +1 -0
- package/lib/ice-server/src/turn/auth.js +10 -0
- package/lib/ice-server/src/turn/auth.js.map +1 -0
- package/lib/ice-server/src/turn/frame.d.ts +13 -0
- package/lib/ice-server/src/turn/frame.js +69 -0
- package/lib/ice-server/src/turn/frame.js.map +1 -0
- package/lib/index.mjs +2688 -855
- package/lib/nonstandard/index.mjs +1753 -403
- package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
- package/lib/rtp/src/extra/container/mp4/container.js +258 -173
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
- package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
- package/lib/rtp/src/extra/processor/mp4.js +115 -60
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +3 -2
- package/lib/webrtc/src/dataChannel.js +9 -2
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +3 -0
- package/lib/webrtc/src/errors.js +11 -0
- package/lib/webrtc/src/errors.js.map +1 -0
- package/lib/webrtc/src/helper.d.ts +5 -1
- package/lib/webrtc/src/helper.js +33 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
- package/lib/webrtc/src/media/receiver/statistics.js +22 -0
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
- package/lib/webrtc/src/media/rtpReceiver.js +135 -20
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
- package/lib/webrtc/src/media/rtpSender.js +177 -28
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
- package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +15 -1
- package/lib/webrtc/src/media/stats.js +55 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -1
- package/lib/webrtc/src/media/track.js +7 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
- package/lib/webrtc/src/nonstandard/navigator.js +96 -32
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
- package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +183 -50
- package/lib/webrtc/src/peerConnection.js +458 -109
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +1 -1
- package/lib/webrtc/src/sctpManager.js +27 -7
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +10 -7
- package/lib/webrtc/src/sdp.js +39 -9
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +4 -3
- package/lib/webrtc/src/sdpManager.js +50 -27
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
- package/lib/webrtc/src/secureTransportManager.js +100 -22
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +5 -4
- package/lib/webrtc/src/transceiverManager.js +61 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +15 -4
- package/lib/webrtc/src/transport/dtls.js +91 -23
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +21 -3
- package/lib/webrtc/src/transport/ice.js +159 -30
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +1 -0
- package/lib/webrtc/src/transport/sctp.js +9 -6
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +12 -4
- package/lib/webrtc/src/utils.js +118 -16
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +7 -4
- package/lib/ice/src/stun/attributes.js.map +0 -1
- package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
- package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
- package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport type { RTCDataChannel } from \"./dataChannel\";\nimport { EventTarget, enumerate } from \"./helper\";\nimport {\n type Address,\n Event,\n type InterfaceAddresses,\n debug,\n} from \"./imports/common\";\nimport type { CandidatePair, Message, Protocol } from \"./imports/ice\";\nimport {\n type MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n type RTCRtpHeaderExtensionParameters,\n type RTCRtpReceiver,\n type RTCRtpSender,\n type RTCRtpTransceiver,\n RtpRouter,\n TransceiverManager,\n type TransceiverOptions,\n useOPUS,\n usePCMU,\n useVP8,\n} from \"./media\";\nimport {\n type RTCPeerConnectionStats,\n type RTCStats,\n RTCStatsReport,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport { SctpTransportManager } from \"./sctpManager\";\nimport {\n type BundlePolicy,\n type MediaDescription,\n SessionDescription,\n} from \"./sdp\";\nimport { type RTCSessionDescriptionInit, SDPManager } from \"./sdpManager\";\nimport { SecureTransportManager } from \"./secureTransportManager\";\nimport type { DtlsKeys, RTCDtlsTransport } from \"./transport/dtls\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n RTCIceTransport,\n} from \"./transport/ice\";\nimport { DEFAULT_MAX_MESSAGE_SIZE } 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\nexport class RTCPeerConnection extends EventTarget {\n readonly cname = randomUUID().toString();\n\n config: Required<PeerConfig> = generateDefaultPeerConfig();\n signalingState: RTCSignalingState = \"stable\";\n negotiationneeded = false;\n needRestart = false;\n private readonly router = new RtpRouter();\n private readonly sdpManager: SDPManager;\n private readonly transceiverManager: TransceiverManager;\n private readonly sctpManager: SctpTransportManager;\n private readonly secureManager: SecureTransportManager;\n private isClosed = false;\n private shouldNegotiationneeded = false;\n private remoteBundleNegotiated = false;\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly signalingStateChange = new Event<[RTCSignalingState]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onIceCandidate = new Event<[RTCIceCandidate | undefined]>();\n readonly onNegotiationneeded = new Event<[]>();\n readonly onTrack = new Event<[MediaStreamTrack]>();\n\n ondatachannel?: CallbackWithValue<RTCDataChannelEvent>;\n onicecandidate?: CallbackWithValue<RTCPeerConnectionIceEvent>;\n onicecandidateerror?: CallbackWithValue<any>;\n onicegatheringstatechange?: CallbackWithValue<any>;\n onnegotiationneeded?: CallbackWithValue<any>;\n onsignalingstatechange?: CallbackWithValue<any>;\n ontrack?: CallbackWithValue<RTCTrackEvent>;\n onconnectionstatechange?: Callback;\n oniceconnectionstatechange?: Callback;\n\n constructor(config: Partial<PeerConfig> = {}) {\n super();\n\n this.setConfiguration(config);\n\n this.sdpManager = new SDPManager({\n cname: this.cname,\n bundlePolicy: this.config.bundlePolicy,\n });\n this.transceiverManager = new TransceiverManager(\n this.cname,\n this.config,\n this.router,\n );\n this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);\n this.transceiverManager.onRemoteTransceiverAdded.pipe(\n this.onRemoteTransceiverAdded,\n );\n this.transceiverManager.onTrack.subscribe(\n ({ track, stream, transceiver }) => {\n const event: RTCTrackEvent = {\n track,\n streams: [stream],\n transceiver,\n receiver: transceiver.receiver,\n };\n this.onTrack.execute(track);\n this.emit(\"track\", event);\n if (this.ontrack) {\n this.ontrack(event);\n }\n },\n );\n this.transceiverManager.onNegotiationNeeded.subscribe(() =>\n this.needNegotiation(),\n );\n this.sctpManager = new SctpTransportManager();\n this.sctpManager.onDataChannel.subscribe((channel) => {\n this.onDataChannel.execute(channel);\n const event: RTCDataChannelEvent = { channel };\n this.ondatachannel?.(event);\n this.emit(\"datachannel\", event);\n });\n this.secureManager = new SecureTransportManager({\n config: this.config,\n sctpManager: this.sctpManager,\n transceiverManager: this.transceiverManager,\n });\n this.secureManager.iceGatheringStateChange.pipe(\n this.iceGatheringStateChange,\n );\n this.secureManager.iceConnectionStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.close();\n }\n this.iceConnectionStateChange.execute(state);\n });\n this.secureManager.connectionStateChange.subscribe((state) => {\n this.connectionStateChange.execute(state);\n this.onconnectionstatechange?.();\n this.emit(\"connectionstatechange\");\n });\n this.secureManager.onIceCandidate.subscribe((candidate) => {\n const iceCandidate = candidate ? candidate.toJSON() : undefined;\n this.onIceCandidate.execute(iceCandidate);\n this.onicecandidate?.({ candidate: iceCandidate });\n this.emit(\"icecandidate\", { candidate: iceCandidate });\n });\n }\n\n get connectionState() {\n return this.secureManager.connectionState;\n }\n get iceConnectionState() {\n return this.secureManager.iceConnectionState;\n }\n get iceGathererState() {\n return this.secureManager.iceGatheringState;\n }\n get iceGatheringState() {\n return this.secureManager.iceGatheringState;\n }\n get dtlsTransports() {\n return this.secureManager.dtlsTransports;\n }\n get sctpTransport() {\n return this.sctpManager.sctpTransport;\n }\n get sctpRemotePort() {\n return this.sctpManager.sctpRemotePort;\n }\n get iceTransports() {\n return this.secureManager.iceTransports;\n }\n get extIdUriMap() {\n return this.router.extIdUriMap;\n }\n get iceGeneration() {\n return this.iceTransports[0].connection.generation;\n }\n get localDescription() {\n return this.sdpManager.localDescription;\n }\n get remoteDescription() {\n return this.sdpManager.remoteDescription;\n }\n get remoteIsBundled() {\n return this.sdpManager.remoteIsBundled;\n }\n /**@private */\n get _localDescription() {\n return this.sdpManager._localDescription;\n }\n /**@private */\n get _remoteDescription() {\n return this.sdpManager._remoteDescription;\n }\n\n getTransceivers() {\n return this.transceiverManager.getTransceivers();\n }\n\n getSenders(): RTCRtpSender[] {\n return this.transceiverManager.getSenders();\n }\n\n getReceivers() {\n return this.transceiverManager.getReceivers();\n }\n\n setConfiguration(config: Partial<PeerConfig>) {\n deepMerge(this.config, config);\n\n if (this.config.icePortRange) {\n const [min, max] = this.config.icePortRange;\n if (min === max) throw new Error(\"should not be same value\");\n if (min >= max) throw new Error(\"The min must be less than max\");\n }\n\n 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 this.config;\n }\n\n async createOffer({ iceRestart }: { iceRestart?: boolean } = {}) {\n if (iceRestart || this.needRestart) {\n this.needRestart = false;\n this.secureManager.restartIce();\n }\n\n await this.secureManager.ensureCerts();\n\n for (const transceiver of this.transceiverManager.getTransceivers()) {\n if (transceiver.codecs.length === 0) {\n this.transceiverManager.assignTransceiverCodecs(transceiver);\n }\n if (transceiver.headerExtensions.length === 0) {\n transceiver.headerExtensions =\n this.config.headerExtensions[transceiver.kind] ?? [];\n }\n }\n\n const description = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n return description.toJSON();\n }\n\n private createSctpTransport() {\n const sctp = this.sctpManager.createSctpTransport(\n 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 new Error(\"peer closed\");\n }\n this.transceiverManager.removeTrack(sender);\n this.needNegotiation();\n }\n\n private needNegotiation = async () => {\n this.shouldNegotiationneeded = true;\n if (this.negotiationneeded || this.signalingState !== \"stable\") {\n return;\n }\n this.shouldNegotiationneeded = false;\n setImmediate(() => {\n this.negotiationneeded = true;\n this.onNegotiationneeded.execute();\n if (this.onnegotiationneeded) this.onnegotiationneeded({});\n });\n };\n\n private findOrCreateTransport() {\n const 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\" &&\n (this.remoteIsBundled || this.remoteBundleNegotiated))\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: \"offer\" | \"answer\";\n sdp: string;\n }): Promise<SessionDescription> {\n // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type\n const implicitOfferState: RTCSignalingState[] = [\n \"stable\",\n \"have-local-offer\",\n \"have-remote-pranswer\",\n ];\n sessionDescription =\n sessionDescription ??\n (implicitOfferState.includes(this.signalingState)\n ? await this.createOffer()\n : await this.createAnswer());\n\n // # parse and validate description\n const description = this.sdpManager.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: true,\n signalingState: this.signalingState,\n type: sessionDescription.type,\n });\n\n // # update signaling state\n if (description.type === \"offer\") {\n this.setSignalingState(\"have-local-offer\");\n } else if (description.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // # assign MID\n for (const [i, media] of enumerate(description.media)) {\n const mid = media.rtp.muxId!;\n this.sdpManager.registerMid(mid);\n if ([\"audio\", \"video\"].includes(media.kind)) {\n const transceiver =\n this.transceiverManager.getTransceiverByMLineIndex(i);\n if (transceiver) {\n transceiver.mid = mid;\n }\n }\n if (media.kind === \"application\" && this.sctpTransport) {\n this.sctpTransport.mid = mid;\n }\n }\n\n // setup ice,dtls role\n const role = description.media.find((media) => media.dtlsParams)?.dtlsParams\n ?.role;\n\n this.secureManager.setLocalRole({\n type: description.type,\n role,\n });\n\n // # configure direction\n if ([\"answer\", \"pranswer\"].includes(description.type)) {\n for (const t of this.transceiverManager.getTransceivers()) {\n const direction = andDirection(t.direction, t.offerDirection);\n t.setCurrentDirection(direction);\n }\n }\n\n // for trickle ice\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n await this.gatherCandidates().catch((e) => {\n log(\"gatherCandidates failed\", e);\n });\n\n // connect transports\n if (description.type === \"answer\") {\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.sdpManager.setLocal(\n description,\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n\n return description;\n }\n\n private async gatherCandidates() {\n await this.secureManager.gatherCandidates(\n !!this.sdpManager.remoteIsBundled,\n );\n }\n\n async addIceCandidate(\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\n const sdp = this.sdpManager.buildOfferSdp(\n this.transceiverManager.getTransceivers(),\n this.sctpTransport,\n );\n await this.secureManager.addIceCandidate(sdp, candidateMessage);\n }\n\n private async connect() {\n log(\"start connect\");\n\n const res = await Promise.allSettled(\n this.dtlsTransports.map(async (dtlsTransport) => {\n const { iceTransport } = dtlsTransport;\n if (iceTransport.state === \"connected\") {\n return;\n }\n const checkDtlsConnected = () => dtlsTransport.state === \"connected\";\n\n if (checkDtlsConnected()) {\n return;\n }\n\n this.secureManager.setConnectionState(\"connecting\");\n\n await iceTransport.start().catch((err) => {\n log(\"iceTransport.start failed\", err);\n throw err;\n });\n\n if (checkDtlsConnected()) {\n return;\n }\n\n await dtlsTransport.start().catch((err) => {\n log(\"dtlsTransport.start failed\", err);\n throw err;\n });\n\n if (\n this.sctpTransport &&\n this.sctpTransport.dtlsTransport.id === dtlsTransport.id\n ) {\n await this.sctpManager.connectSctp();\n }\n }),\n );\n\n if (res.find((r) => r.status === \"rejected\")) {\n this.secureManager.setConnectionState(\"failed\");\n } else {\n this.secureManager.setConnectionState(\"connected\");\n }\n }\n\n restartIce() {\n this.needRestart = true;\n this.needNegotiation();\n }\n\n async setRemoteDescription(sessionDescription: RTCSessionDescriptionInit) {\n if (sessionDescription instanceof SessionDescription) {\n sessionDescription = sessionDescription.toSdp();\n }\n\n // # parse and validate description\n const remoteSdp = this.sdpManager.setRemoteDescription(\n sessionDescription,\n this.signalingState,\n );\n if (\n remoteSdp.group.some(\n (group) => group.semantic === \"BUNDLE\" && group.items.length > 0,\n )\n ) {\n this.remoteBundleNegotiated = true;\n }\n\n let bundleTransport: RTCDtlsTransport | undefined;\n\n // # apply description\n\n const matchTransceiverWithMedia = (\n transceiver: RTCRtpTransceiver,\n media: MediaDescription,\n ) =>\n transceiver.kind === media.kind &&\n [undefined, media.rtp.muxId].includes(transceiver.mid);\n\n let transports = remoteSdp.media.map((remoteMedia, i) => {\n let dtlsTransport: RTCDtlsTransport;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n let transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => matchTransceiverWithMedia(t, remoteMedia));\n if (!transceiver) {\n // create remote transceiver\n transceiver = this.addTransceiver(remoteMedia.kind, {\n direction: \"recvonly\",\n });\n transceiver.mid = remoteMedia.rtp.muxId;\n this.onRemoteTransceiverAdded.execute(transceiver);\n } else {\n if (transceiver.direction === \"inactive\" && transceiver.stopping) {\n transceiver.stopped = true;\n\n if (sessionDescription.type === \"answer\") {\n transceiver.setCurrentDirection(\"inactive\");\n }\n return;\n }\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = transceiver.dtlsTransport;\n } else {\n transceiver.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = transceiver.dtlsTransport;\n\n this.transceiverManager.setRemoteRTP(\n transceiver,\n remoteMedia,\n remoteSdp.type,\n i,\n );\n } else if (remoteMedia.kind === \"application\") {\n let sctpTransport = this.sctpTransport;\n if (!sctpTransport) {\n sctpTransport = this.createSctpTransport();\n sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n\n if (this.sdpManager.remoteIsBundled) {\n if (!bundleTransport) {\n bundleTransport = sctpTransport.dtlsTransport;\n } else {\n sctpTransport.setDtlsTransport(bundleTransport);\n }\n }\n\n dtlsTransport = sctpTransport.dtlsTransport;\n\n this.sctpManager.setRemoteSCTP(remoteMedia, i);\n } else {\n throw new Error(\"invalid media kind\");\n }\n\n const iceTransport = dtlsTransport.iceTransport;\n\n if (remoteMedia.iceParams) {\n const renomination = !!this.sdpManager.inactiveRemoteMedia;\n iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);\n\n // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role\n // RFC 8445 S6.1.1\n if (remoteMedia.iceParams?.iceLite) {\n iceTransport.connection.iceControlling = true;\n }\n }\n if (remoteMedia.dtlsParams) {\n dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);\n }\n\n // # add ICE candidates\n remoteMedia.iceCandidates.forEach(iceTransport.addRemoteCandidate);\n\n if (remoteMedia.iceCandidatesComplete) {\n iceTransport.addRemoteCandidate(undefined);\n }\n\n // # set DTLS role\n if (remoteSdp.type === \"answer\" && remoteMedia.dtlsParams?.role) {\n dtlsTransport.role =\n remoteMedia.dtlsParams.role === \"client\" ? \"server\" : \"client\";\n }\n return iceTransport;\n }) as RTCIceTransport[];\n\n // filter out inactive transports\n transports = transports.filter((iceTransport) => !!iceTransport);\n\n const removedTransceivers = this.transceiverManager\n .getTransceivers()\n .filter(\n (t) =>\n remoteSdp.media.find((m) => matchTransceiverWithMedia(t, m)) ==\n undefined,\n );\n\n if (sessionDescription.type === \"answer\") {\n for (const transceiver of removedTransceivers) {\n // todo: handle answer side transceiver removal work.\n // event should trigger to notify media source to stop.\n transceiver.stop();\n transceiver.stopped = true;\n }\n }\n\n if (remoteSdp.type === \"offer\") {\n this.setSignalingState(\"have-remote-offer\");\n } else if (remoteSdp.type === \"answer\") {\n this.setSignalingState(\"stable\");\n }\n\n // connect transports\n if (remoteSdp.type === \"answer\") {\n log(\"caller start connect\");\n this.connect().catch((err) => {\n log(\"connect failed\", err);\n this.secureManager.setConnectionState(\"failed\");\n });\n }\n\n this.negotiationneeded = false;\n if (this.shouldNegotiationneeded) {\n this.needNegotiation();\n }\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n options: Partial<TransceiverOptions> = {},\n ) {\n const dtlsTransport = this.findOrCreateTransport();\n const transceiver = this.transceiverManager.addTransceiver(\n trackOrKind,\n dtlsTransport,\n options,\n );\n\n this.secureManager.updateIceConnectionState();\n this.needNegotiation();\n\n return transceiver;\n }\n\n // todo fix\n addTrack(\n track: MediaStreamTrack,\n /**todo impl */\n ms?: MediaStream,\n ): RTCRtpSender {\n if (this.isClosed) {\n throw new Error(\"is closed\");\n }\n const transceiver = this.transceiverManager.addTrack(track, ms);\n if (!transceiver.dtlsTransport) {\n const dtlsTransport = this.findOrCreateTransport();\n transceiver.setDtlsTransport(dtlsTransport);\n }\n this.needNegotiation();\n return transceiver.sender;\n }\n\n async createAnswer() {\n this.assertNotClosed();\n\n await this.secureManager.ensureCerts();\n\n const description = this.sdpManager.buildAnswerSdp({\n transceivers: this.transceiverManager.getTransceivers(),\n sctpTransport: this.sctpTransport,\n signalingState: this.signalingState,\n });\n return description.toJSON();\n }\n\n private assertNotClosed() {\n if (this.isClosed) {\n throw new Error(\"RTCPeerConnection is closed\");\n }\n }\n\n private setSignalingState(state: RTCSignalingState) {\n log(\"signalingStateChange\", state);\n this.signalingState = state;\n this.signalingStateChange.execute(state);\n if (this.onsignalingstatechange) {\n this.onsignalingstatechange({});\n }\n }\n\n private createPeerConnectionStats(): RTCPeerConnectionStats {\n const timestamp = getStatsTimestamp();\n return {\n type: \"peer-connection\",\n id: generateStatsId(\"peer-connection\"),\n timestamp,\n dataChannelsOpened: this.sctpManager.dataChannelsOpened,\n dataChannelsClosed: this.sctpManager.dataChannelsClosed,\n };\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport> {\n const stats: RTCStats[] = [];\n\n // Peer connection stats - always included regardless of selector\n stats.push(this.createPeerConnectionStats());\n\n // Get stats from transceivers\n const transceiverStats = await this.transceiverManager.getStats(selector);\n stats.push(...transceiverStats);\n\n // Get transport stats - always included regardless of selector\n const transportStats = await this.secureManager.getStats();\n stats.push(...transportStats);\n\n // Get data channel stats - always included regardless of selector\n if (this.sctpTransport) {\n const dataChannelStats = await this.sctpManager.getStats();\n if (dataChannelStats) {\n stats.push(...dataChannelStats);\n }\n }\n\n return new RTCStatsReport(stats);\n }\n\n async close() {\n if (this.isClosed) return;\n\n this.isClosed = true;\n this.setSignalingState(\"closed\");\n\n this.transceiverManager.close();\n\n await this.secureManager.close();\n await this.sctpManager.close();\n\n this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n\n log(\"peerConnection closed\");\n }\n}\n\nexport interface PeerConfig {\n codecs: Partial<{\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n audio: RTCRtpCodecParameters[];\n video: RTCRtpCodecParameters[];\n }>;\n headerExtensions: Partial<{\n audio: RTCRtpHeaderExtensionParameters[];\n video: RTCRtpHeaderExtensionParameters[];\n }>;\n iceTransportPolicy: \"all\" | \"relay\";\n iceServers: RTCIceServer[];\n /**Minimum port and Maximum port must not be the same value */\n icePortRange: [number, number] | undefined;\n iceInterfaceAddresses: InterfaceAddresses | undefined;\n /** Add additional host (local) addresses to use for candidate gathering.\n * Notably, you can include hosts that are normally excluded, such as loopback, tun interfaces, etc.\n */\n iceAdditionalHostAddresses: string[] | undefined;\n iceUseIpv4: boolean;\n iceUseIpv6: boolean;\n forceTurnTCP: boolean;\n /** such as google cloud run */\n iceUseLinkLocalAddress: boolean | undefined;\n /** If provided, is called on each STUN request.\n * Return `true` if a STUN response should be sent, false if it should be skipped. */\n iceFilterStunResponse:\n | ((message: Message, addr: Address, protocol: Protocol) => boolean)\n | undefined;\n iceFilterCandidatePair: ((pair: CandidatePair) => boolean) | undefined;\n dtls: Partial<{\n keys: DtlsKeys;\n }>;\n icePasswordPrefix: string | undefined;\n bundlePolicy: BundlePolicy;\n debug: Partial<{\n /**% */\n inboundPacketLoss: number;\n /**% */\n outboundPacketLoss: number;\n /**ms */\n receiverReportDelay: number;\n disableSendNack: boolean;\n disableRecvRetransmit: boolean;\n }>;\n midSuffix: boolean;\n /** 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;\n username?: string;\n credential?: string;\n};\n\nfunction generateDefaultPeerConfig(): PeerConfig {\n return {\n codecs: {\n audio: [useOPUS(), usePCMU()],\n video: [useVP8()],\n },\n headerExtensions: {\n audio: [],\n video: [],\n },\n iceTransportPolicy: \"all\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n icePortRange: undefined,\n iceInterfaceAddresses: undefined,\n iceAdditionalHostAddresses: undefined,\n iceUseIpv4: true,\n iceUseIpv6: true,\n iceFilterStunResponse: undefined,\n iceFilterCandidatePair: undefined,\n icePasswordPrefix: undefined,\n iceUseLinkLocalAddress: undefined,\n dtls: {},\n bundlePolicy: \"max-compat\",\n debug: {},\n midSuffix: false,\n forceTurnTCP: false,\n maxMessageSize: DEFAULT_MAX_MESSAGE_SIZE,\n };\n}\nexport const defaultPeerConfig: PeerConfig = generateDefaultPeerConfig();\n\nexport interface RTCTrackEvent {\n track: MediaStreamTrack;\n streams: MediaStream[];\n transceiver: RTCRtpTransceiver;\n receiver: RTCRtpReceiver;\n}\n\nexport interface RTCDataChannelEvent {\n channel: RTCDataChannel;\n}\n\nexport interface RTCPeerConnectionIceEvent {\n candidate?: RTCIceCandidate;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"peerConnection.js","sourceRoot":"","sources":["../../../src/peerConnection.ts"],"names":[],"mappings":"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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 this.onDataChannel.allUnsubscribe();\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.signalingStateChange.allUnsubscribe();\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n\n log(\"peerConnection closed\");\n }\n}\n\nexport 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"]}
|
|
@@ -23,5 +23,5 @@ export declare class SctpTransportManager {
|
|
|
23
23
|
connectSctp(): Promise<void>;
|
|
24
24
|
setRemoteSCTP(remoteMedia: MediaDescription, mLineIndex: number): void;
|
|
25
25
|
close(): Promise<void>;
|
|
26
|
-
getStats(): Promise<RTCStats[]>;
|
|
26
|
+
getStats(timestamp?: number): Promise<RTCStats[]>;
|
|
27
27
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SctpTransportManager = void 0;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
4
5
|
const common_1 = require("./imports/common");
|
|
5
6
|
const dataChannel_1 = require("./dataChannel");
|
|
6
7
|
const stats_1 = require("./media/stats");
|
|
@@ -57,14 +58,21 @@ class SctpTransportManager {
|
|
|
57
58
|
return sctp;
|
|
58
59
|
}
|
|
59
60
|
createDataChannel(label, options = {}) {
|
|
61
|
+
const maxPacketLifeTime = coerceUnsignedShortOption(options.maxPacketLifeTime, "maxPacketLifeTime");
|
|
62
|
+
const maxRetransmits = coerceUnsignedShortOption(options.maxRetransmits, "maxRetransmits");
|
|
60
63
|
const base = {
|
|
61
64
|
protocol: "",
|
|
62
65
|
ordered: true,
|
|
63
66
|
negotiated: false,
|
|
64
67
|
};
|
|
65
|
-
const settings = {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
const settings = {
|
|
69
|
+
...base,
|
|
70
|
+
...options,
|
|
71
|
+
maxPacketLifeTime,
|
|
72
|
+
maxRetransmits,
|
|
73
|
+
};
|
|
74
|
+
if (settings.maxPacketLifeTime != null && settings.maxRetransmits != null) {
|
|
75
|
+
throw (0, errors_1.createWebRtcTypeError)("maxPacketLifeTime and maxRetransmits cannot both be set");
|
|
68
76
|
}
|
|
69
77
|
if (!this.sctpTransport) {
|
|
70
78
|
this.sctpTransport = this.createSctpTransport();
|
|
@@ -122,17 +130,16 @@ class SctpTransportManager {
|
|
|
122
130
|
}
|
|
123
131
|
this.onDataChannel.allUnsubscribe();
|
|
124
132
|
}
|
|
125
|
-
async getStats() {
|
|
126
|
-
const timestamp = (0, stats_1.getStatsTimestamp)();
|
|
133
|
+
async getStats(timestamp = (0, stats_1.getStatsTimestamp)()) {
|
|
127
134
|
const stats = [];
|
|
128
135
|
for (const channel of this.dataChannels) {
|
|
129
136
|
const channelStats = {
|
|
130
137
|
type: "data-channel",
|
|
131
|
-
id: (0, stats_1.generateStatsId)("data-channel", channel.id),
|
|
138
|
+
id: (0, stats_1.generateStatsId)("data-channel", channel.id ?? channel.statsId),
|
|
132
139
|
timestamp,
|
|
133
140
|
label: channel.label,
|
|
134
141
|
protocol: channel.protocol,
|
|
135
|
-
dataChannelIdentifier: channel.id,
|
|
142
|
+
dataChannelIdentifier: channel.id ?? undefined,
|
|
136
143
|
state: channel.readyState,
|
|
137
144
|
messagesSent: channel.messagesSent || 0,
|
|
138
145
|
bytesSent: channel.bytesSent || 0,
|
|
@@ -145,4 +152,17 @@ class SctpTransportManager {
|
|
|
145
152
|
}
|
|
146
153
|
}
|
|
147
154
|
exports.SctpTransportManager = SctpTransportManager;
|
|
155
|
+
function coerceUnsignedShortOption(value, name) {
|
|
156
|
+
if (value === undefined) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
const coerced = Number(value);
|
|
160
|
+
if (!Number.isFinite(coerced) ||
|
|
161
|
+
!Number.isInteger(coerced) ||
|
|
162
|
+
coerced < 0 ||
|
|
163
|
+
coerced > 65535) {
|
|
164
|
+
throw (0, errors_1.createWebRtcTypeError)(`${name} must be an unsigned short`);
|
|
165
|
+
}
|
|
166
|
+
return coerced;
|
|
167
|
+
}
|
|
148
168
|
//# sourceMappingURL=sctpManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sctpManager.js","sourceRoot":"","sources":["../../../src/sctpManager.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,+CAAyE;AACzE,yCAKuB;AAEvB,2CAAoD;AAEpD,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,qDAAqD,CAAC,CAAC;AAEzE,MAAa,oBAAoB;IAS/B;QARA;;;;;WAAiC;QACjC;;;;;WAAwB;QACxB;;;;mBAAqB,CAAC;WAAC;QACvB;;;;mBAAqB,CAAC;WAAC;QACf;;;;mBAAiC,EAAE;WAAC;QAEnC;;;;mBAAgB,IAAI,cAAK,EAAoB;WAAC;IAExC,CAAC;IAEhB,mBAAmB,CAAC,cAAuB;QACzC,MAAM,IAAI,GAAG,IAAI,uBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACvC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CACf,KAAa,EACb,UAOK,EAAE;QAEP,MAAM,IAAI,GAAmB;YAC3B,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK;SAClB,CAAC;QACF,MAAM,QAAQ,GAA0B,
|
|
1
|
+
{"version":3,"file":"sctpManager.js","sourceRoot":"","sources":["../../../src/sctpManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { createWebRtcTypeError } from \"./errors\";\nimport { Event, debug } from \"./imports/common\";\n\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport {\n type RTCDataChannelStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport type { MediaDescription } from \"./sdp\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctpManager.ts\");\n\nexport class SctpTransportManager {\n sctpTransport?: RTCSctpTransport;\n sctpRemotePort?: number;\n dataChannelsOpened = 0;\n dataChannelsClosed = 0;\n private dataChannels: RTCDataChannel[] = [];\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n\n constructor() {}\n\n createSctpTransport(maxMessageSize?: number) {\n const sctp = new RTCSctpTransport(5000, maxMessageSize);\n sctp.mid = undefined;\n sctp.onDataChannel.subscribe((channel) => {\n this.dataChannelsOpened++;\n this.dataChannels.push(channel);\n this.onDataChannel.execute(channel);\n });\n\n this.sctpTransport = sctp;\n\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 const maxPacketLifeTime = coerceUnsignedShortOption(\n options.maxPacketLifeTime,\n \"maxPacketLifeTime\",\n );\n const maxRetransmits = coerceUnsignedShortOption(\n options.maxRetransmits,\n \"maxRetransmits\",\n );\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = {\n ...base,\n ...options,\n maxPacketLifeTime,\n maxRetransmits,\n } as any;\n\n if (settings.maxPacketLifeTime != null && settings.maxRetransmits != null) {\n throw createWebRtcTypeError(\n \"maxPacketLifeTime and maxRetransmits cannot both be set\",\n );\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n this.dataChannelsOpened++;\n this.dataChannels.push(channel);\n channel.stateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.dataChannelsClosed++;\n const index = this.dataChannels.indexOf(channel);\n if (index !== -1) {\n this.dataChannels.splice(index, 1);\n }\n }\n });\n return channel;\n }\n\n async connectSctp() {\n if (!this.sctpTransport || !this.sctpRemotePort) {\n return;\n }\n\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n\n setRemoteSCTP(remoteMedia: MediaDescription, mLineIndex: number) {\n if (!this.sctpTransport) {\n return;\n }\n\n // # configure sctp\n this.sctpTransport.setRemoteMaxMessageSize(\n remoteMedia.sctpCapabilities?.maxMessageSize,\n );\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n this.sctpTransport.setRemotePort(this.sctpRemotePort);\n this.sctpTransport.mLineIndex = mLineIndex;\n if (!this.sctpTransport.mid) {\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n async close() {\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n\n this.onDataChannel.allUnsubscribe();\n }\n\n async getStats(timestamp = getStatsTimestamp()): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const channel of this.dataChannels) {\n const channelStats: RTCDataChannelStats = {\n type: \"data-channel\",\n id: generateStatsId(\"data-channel\", channel.id ?? channel.statsId),\n timestamp,\n label: channel.label,\n protocol: channel.protocol,\n dataChannelIdentifier: channel.id ?? undefined,\n state: channel.readyState,\n messagesSent: channel.messagesSent || 0,\n bytesSent: channel.bytesSent || 0,\n messagesReceived: channel.messagesReceived || 0,\n bytesReceived: channel.bytesReceived || 0,\n };\n stats.push(channelStats);\n }\n\n return stats;\n }\n}\n\nfunction coerceUnsignedShortOption(\n value: unknown,\n name: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\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\n return coerced;\n}\n"]}
|
package/lib/webrtc/src/sdp.d.ts
CHANGED
|
@@ -14,19 +14,20 @@ export declare class SessionDescription {
|
|
|
14
14
|
extMapAllowMixed: boolean;
|
|
15
15
|
msidSemantic: GroupDescription[];
|
|
16
16
|
media: MediaDescription[];
|
|
17
|
-
type: "offer" | "answer";
|
|
17
|
+
type: "offer" | "answer" | "pranswer";
|
|
18
18
|
dtlsRole: DtlsRole;
|
|
19
19
|
iceOptions: string;
|
|
20
20
|
iceLite: boolean;
|
|
21
21
|
icePassword: string;
|
|
22
22
|
iceUsernameFragment: string;
|
|
23
23
|
dtlsFingerprints: RTCDtlsFingerprint[];
|
|
24
|
+
private cachedJson?;
|
|
24
25
|
static parse(sdp: string): SessionDescription;
|
|
25
26
|
webrtcTrackId(media: MediaDescription): string | undefined;
|
|
26
27
|
get string(): string;
|
|
27
28
|
toJSON(): RTCSessionDescription;
|
|
28
29
|
toSdp(): {
|
|
29
|
-
type: "offer" | "answer";
|
|
30
|
+
type: "offer" | "answer" | "pranswer";
|
|
30
31
|
sdp: string;
|
|
31
32
|
};
|
|
32
33
|
}
|
|
@@ -37,7 +38,7 @@ export declare class MediaDescription {
|
|
|
37
38
|
fmt: string[] | number[];
|
|
38
39
|
host?: string;
|
|
39
40
|
direction?: MediaDirection;
|
|
40
|
-
|
|
41
|
+
msids: string[];
|
|
41
42
|
rtcpPort?: number;
|
|
42
43
|
rtcpHost?: string;
|
|
43
44
|
rtcpMux: boolean;
|
|
@@ -56,6 +57,8 @@ export declare class MediaDescription {
|
|
|
56
57
|
iceOptions?: string;
|
|
57
58
|
simulcastParameters: RTCRtpSimulcastParameters[];
|
|
58
59
|
constructor(kind: Kind, port: number, profile: string, fmt: string[] | number[]);
|
|
60
|
+
get msid(): string | undefined;
|
|
61
|
+
set msid(value: string | undefined);
|
|
59
62
|
toString(): string;
|
|
60
63
|
}
|
|
61
64
|
export declare class GroupDescription {
|
|
@@ -68,13 +71,13 @@ export declare function candidateToSdp(c: IceCandidate): string;
|
|
|
68
71
|
export declare function parseGroup(dest: GroupDescription[], value: string, type?: (v: string) => any): void;
|
|
69
72
|
export declare function candidateFromSdp(sdp: string): IceCandidate;
|
|
70
73
|
export declare class RTCSessionDescription {
|
|
71
|
-
sdp: string;
|
|
72
|
-
type: "offer" | "answer";
|
|
73
|
-
constructor(sdp: string, type: "offer" | "answer");
|
|
74
|
+
readonly sdp: string;
|
|
75
|
+
readonly type: "offer" | "answer" | "pranswer";
|
|
76
|
+
constructor(sdp: string, type: "offer" | "answer" | "pranswer");
|
|
74
77
|
static isThis(o: any): true | undefined;
|
|
75
78
|
toSdp(): {
|
|
76
79
|
sdp: string;
|
|
77
|
-
type: "offer" | "answer";
|
|
80
|
+
type: "offer" | "answer" | "pranswer";
|
|
78
81
|
};
|
|
79
82
|
}
|
|
80
83
|
export declare function addSDPHeader(type: "offer" | "answer", description: SessionDescription): void;
|
package/lib/webrtc/src/sdp.js
CHANGED
|
@@ -148,6 +148,12 @@ class SessionDescription {
|
|
|
148
148
|
writable: true,
|
|
149
149
|
value: []
|
|
150
150
|
});
|
|
151
|
+
Object.defineProperty(this, "cachedJson", {
|
|
152
|
+
enumerable: true,
|
|
153
|
+
configurable: true,
|
|
154
|
+
writable: true,
|
|
155
|
+
value: void 0
|
|
156
|
+
});
|
|
151
157
|
}
|
|
152
158
|
static parse(sdp) {
|
|
153
159
|
const [sessionLines, mediaGroups] = groupLines(sdp);
|
|
@@ -281,7 +287,7 @@ class SessionDescription {
|
|
|
281
287
|
currentMedia.rtp.muxId = value;
|
|
282
288
|
break;
|
|
283
289
|
case "msid":
|
|
284
|
-
currentMedia.
|
|
290
|
+
currentMedia.msids.push(value);
|
|
285
291
|
break;
|
|
286
292
|
case "rtcp":
|
|
287
293
|
{
|
|
@@ -437,7 +443,13 @@ class SessionDescription {
|
|
|
437
443
|
return sdp;
|
|
438
444
|
}
|
|
439
445
|
toJSON() {
|
|
440
|
-
|
|
446
|
+
const sdp = this.string;
|
|
447
|
+
if (!this.cachedJson ||
|
|
448
|
+
this.cachedJson.sdp !== sdp ||
|
|
449
|
+
this.cachedJson.type !== this.type) {
|
|
450
|
+
this.cachedJson = new RTCSessionDescription(sdp, this.type);
|
|
451
|
+
}
|
|
452
|
+
return this.cachedJson;
|
|
441
453
|
}
|
|
442
454
|
toSdp() {
|
|
443
455
|
return {
|
|
@@ -486,11 +498,11 @@ class MediaDescription {
|
|
|
486
498
|
writable: true,
|
|
487
499
|
value: void 0
|
|
488
500
|
});
|
|
489
|
-
Object.defineProperty(this, "
|
|
501
|
+
Object.defineProperty(this, "msids", {
|
|
490
502
|
enumerable: true,
|
|
491
503
|
configurable: true,
|
|
492
504
|
writable: true,
|
|
493
|
-
value:
|
|
505
|
+
value: []
|
|
494
506
|
});
|
|
495
507
|
// rtcp
|
|
496
508
|
Object.defineProperty(this, "rtcpPort", {
|
|
@@ -590,6 +602,12 @@ class MediaDescription {
|
|
|
590
602
|
value: []
|
|
591
603
|
});
|
|
592
604
|
}
|
|
605
|
+
get msid() {
|
|
606
|
+
return this.msids[0];
|
|
607
|
+
}
|
|
608
|
+
set msid(value) {
|
|
609
|
+
this.msids = value ? [value] : [];
|
|
610
|
+
}
|
|
593
611
|
toString() {
|
|
594
612
|
const lines = [];
|
|
595
613
|
lines.push(`m=${this.kind} ${this.port} ${this.profile} ${this.fmt
|
|
@@ -630,9 +648,7 @@ class MediaDescription {
|
|
|
630
648
|
if (this.rtp.muxId) {
|
|
631
649
|
lines.push(`a=mid:${this.rtp.muxId}`);
|
|
632
650
|
}
|
|
633
|
-
|
|
634
|
-
lines.push(`a=msid:${this.msid}`);
|
|
635
|
-
}
|
|
651
|
+
this.msids.forEach((msid) => lines.push(`a=msid:${msid}`));
|
|
636
652
|
if (this.rtcpPort && this.rtcpHost) {
|
|
637
653
|
lines.push(`a=rtcp:${this.rtcpPort} ${ipAddressToSdp(this.rtcpHost)}`);
|
|
638
654
|
if (this.rtcpMux) {
|
|
@@ -789,13 +805,27 @@ class RTCSessionDescription {
|
|
|
789
805
|
enumerable: true,
|
|
790
806
|
configurable: true,
|
|
791
807
|
writable: true,
|
|
792
|
-
value:
|
|
808
|
+
value: void 0
|
|
793
809
|
});
|
|
794
810
|
Object.defineProperty(this, "type", {
|
|
795
811
|
enumerable: true,
|
|
796
812
|
configurable: true,
|
|
797
813
|
writable: true,
|
|
798
|
-
value:
|
|
814
|
+
value: void 0
|
|
815
|
+
});
|
|
816
|
+
Object.defineProperties(this, {
|
|
817
|
+
sdp: {
|
|
818
|
+
configurable: true,
|
|
819
|
+
enumerable: true,
|
|
820
|
+
value: sdp,
|
|
821
|
+
writable: false,
|
|
822
|
+
},
|
|
823
|
+
type: {
|
|
824
|
+
configurable: true,
|
|
825
|
+
enumerable: true,
|
|
826
|
+
value: type,
|
|
827
|
+
writable: false,
|
|
828
|
+
},
|
|
799
829
|
});
|
|
800
830
|
}
|
|
801
831
|
static isThis(o) {
|