werift 0.24.4 → 0.25.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -113
- package/lib/common/src/transport.d.ts +22 -2
- package/lib/common/src/transport.js +84 -26
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/exceptions.d.ts +9 -0
- package/lib/ice/src/exceptions.js +23 -1
- package/lib/ice/src/exceptions.js.map +1 -1
- package/lib/ice/src/ice.d.ts +40 -0
- package/lib/ice/src/ice.js +194 -28
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +26 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +7 -0
- package/lib/ice/src/stun/const.js +8 -0
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/protocol.js +1 -4
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
- package/lib/ice/src/stun/tcpProtocol.js +65 -14
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +12 -1
- package/lib/ice/src/stun/transaction.js +37 -4
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +40 -15
- package/lib/ice/src/turn/protocol.js +141 -32
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +8 -0
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/index.mjs +6175 -4073
- package/lib/nonstandard/index.mjs +286 -1003
- package/lib/polyfill/dom.mjs +23794 -0
- package/lib/polyfill/index.mjs +23794 -0
- package/lib/rtp/src/extra/container/mp4/container.js +12 -4
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +8 -3
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/sctp/src/chunk.d.ts +5 -0
- package/lib/sctp/src/chunk.js +16 -11
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/index.d.ts +3 -1
- package/lib/sctp/src/index.js +10 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +12 -3
- package/lib/sctp/src/sctp.js +51 -18
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/const.js +2 -0
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +9 -1
- package/lib/webrtc/src/errors.js +19 -0
- package/lib/webrtc/src/errors.js.map +1 -1
- package/lib/webrtc/src/media/codec.d.ts +5 -0
- package/lib/webrtc/src/media/codec.js +21 -0
- package/lib/webrtc/src/media/codec.js.map +1 -1
- package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
- package/lib/webrtc/src/media/codecCompatibility.js +138 -0
- package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +2 -0
- package/lib/webrtc/src/media/router.js +23 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
- package/lib/webrtc/src/media/rtpReceiver.js +35 -0
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
- package/lib/webrtc/src/media/rtpSender.js +264 -35
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
- package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +29 -1
- package/lib/webrtc/src/media/track.js +164 -5
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
- package/lib/webrtc/src/nonstandard/index.js +0 -1
- package/lib/webrtc/src/nonstandard/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
- package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +126 -5
- package/lib/webrtc/src/peerConnection.js +609 -136
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/polyfill/api.d.ts +14 -0
- package/lib/webrtc/src/polyfill/api.js +23 -0
- package/lib/webrtc/src/polyfill/api.js.map +1 -0
- package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
- package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
- package/lib/webrtc/src/polyfill/dom.js +18 -0
- package/lib/webrtc/src/polyfill/dom.js.map +1 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
- package/lib/webrtc/src/polyfill/globals.js +3 -0
- package/lib/webrtc/src/polyfill/globals.js.map +1 -0
- package/lib/webrtc/src/polyfill/index.d.ts +2 -0
- package/lib/webrtc/src/polyfill/index.js +19 -0
- package/lib/webrtc/src/polyfill/index.js.map +1 -0
- package/lib/webrtc/src/polyfill/install.d.ts +13 -0
- package/lib/webrtc/src/polyfill/install.js +266 -0
- package/lib/webrtc/src/polyfill/install.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
- package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
- package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
- package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
- package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
- package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
- package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
- package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
- package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
- package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
- package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
- package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
- package/lib/webrtc/src/polyfill/trackStop.js +16 -0
- package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
- package/lib/webrtc/src/sctpManager.d.ts +2 -1
- package/lib/webrtc/src/sctpManager.js +5 -2
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -1
- package/lib/webrtc/src/sdp.js +5 -6
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +38 -1
- package/lib/webrtc/src/sdpManager.js +236 -30
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
- package/lib/webrtc/src/secureTransportManager.js +123 -47
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +91 -6
- package/lib/webrtc/src/transceiverManager.js +477 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +8 -0
- package/lib/webrtc/src/transport/ice.js +17 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +3 -2
- package/lib/webrtc/src/transport/sctp.js +8 -2
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +13 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transceiverManager.js","sourceRoot":"","sources":["../../../src/transceiverManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReceiverDirection, SenderDirections } from \"./const\";\nimport { createWebRtcDomException } from \"./errors\";\nimport { Event, debug } from \"./imports/common\";\nimport {\n MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n type RTCRtpEncodingParameters,\n type RTCRtpParameters,\n type RTCRtpReceiveParameters,\n RTCRtpReceiver,\n RTCRtpRtxParameters,\n RTCRtpSender,\n RTCRtpTransceiver,\n Recvonly,\n type RtpRouter,\n Sendonly,\n Sendrecv,\n type TransceiverOptions,\n} from \"./media\";\nimport type { RTCStats } from \"./media/stats\";\nimport { type PeerConfig, findCodecByMimeType } from \"./peerConnection\";\nimport { type MediaDescription, codecParametersFromString } from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport type { Kind } from \"./types/domain\";\nimport { reverseDirection } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpTransceiverManager.ts\");\n\nexport class TransceiverManager {\n private readonly transceivers: RTCRtpTransceiver[] = [];\n\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTrack = new Event<\n [\n {\n track: MediaStreamTrack;\n transceiver: RTCRtpTransceiver;\n streams: MediaStream[];\n },\n ]\n >();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(\n private readonly cname: string,\n private readonly config: Required<PeerConfig>,\n private readonly router: RtpRouter,\n ) {}\n\n getTransceivers(): RTCRtpTransceiver[] {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n getTransceiverByMLineIndex(index: number): RTCRtpTransceiver | undefined {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index,\n );\n }\n\n pushTransceiver(t: RTCRtpTransceiver): void {\n this.transceivers.push(t);\n }\n\n replaceTransceiver(t: RTCRtpTransceiver, index: number): void {\n this.transceivers[index] = t;\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n dtlsTransport?: RTCDtlsTransport,\n options: Partial<TransceiverOptions> = {},\n ): RTCRtpTransceiver {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const newTransceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction,\n );\n newTransceiver.options = options;\n newTransceiver.sender.setStreams(options.streams ?? []);\n newTransceiver.sender.setSendEncodings(\n (\n (options.sendEncodings as RTCRtpEncodingParameters[] | undefined) ?? []\n ).map((encoding) => ({ ...encoding })),\n );\n this.router.registerRtpSender(newTransceiver.sender);\n\n // reuse inactive\n const inactiveTransceiverIndex = this.transceivers.findIndex(\n (t) => t.currentDirection === \"inactive\" && !t.usedForSender,\n );\n const inactiveTransceiver = this.transceivers.find(\n (t) => t.currentDirection === \"inactive\" && !t.usedForSender,\n );\n if (inactiveTransceiverIndex > -1 && inactiveTransceiver) {\n this.replaceTransceiver(newTransceiver, inactiveTransceiverIndex);\n newTransceiver.mLineIndex = inactiveTransceiver.mLineIndex;\n newTransceiver.mid = inactiveTransceiver.mid;\n inactiveTransceiver.setCurrentDirection(undefined);\n } else {\n this.pushTransceiver(newTransceiver);\n }\n this.onTransceiverAdded.execute(newTransceiver);\n\n return newTransceiver;\n }\n\n addTrack(\n track: MediaStreamTrack,\n streams: MediaStream[] = [],\n ): RTCRtpTransceiver {\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n \"Track already added\",\n );\n }\n\n const emptyTrackSenderTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true,\n );\n if (emptyTrackSenderTransceiver) {\n const sender = emptyTrackSenderTransceiver.sender;\n sender.setStreams(streams);\n sender.registerTrack(track);\n emptyTrackSenderTransceiver.options = {\n ...emptyTrackSenderTransceiver.options,\n streams,\n };\n return emptyTrackSenderTransceiver;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender,\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.setStreams(streams);\n sender.registerTrack(track);\n notSendTransceiver.options = {\n ...notSendTransceiver.options,\n streams,\n };\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.setDirection(\"sendrecv\");\n break;\n case \"inactive\":\n notSendTransceiver.setDirection(\"sendonly\");\n break;\n }\n return notSendTransceiver;\n } else {\n const transceiver = this.addTransceiver(track, undefined, {\n direction: \"sendrecv\",\n streams,\n });\n return transceiver;\n }\n }\n\n removeTrack(sender: RTCRtpSender): void {\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n \"Sender does not exist\",\n );\n }\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc,\n );\n if (!transceiver) throw new Error(\"No matching transceiver found\");\n\n if (transceiver.stopping || transceiver.stopped) {\n return;\n }\n\n sender.stop();\n\n if ([\"recvonly\", \"inactive\"].includes(transceiver.currentDirection ?? \"\")) {\n this.onNegotiationNeeded.execute();\n return;\n }\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.setDirection(\"recvonly\");\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.setDirection(\"inactive\");\n }\n }\n\n assignTransceiverCodecs(transceiver: RTCRtpTransceiver): void {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if (ReceiverDirection.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if (SenderDirections.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver,\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {},\n ),\n ),\n };\n\n return receiveParameters;\n }\n\n setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\" | \"pranswer\",\n mLineIndex: number,\n ): void {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId ?? null;\n }\n transceiver.mLineIndex = mLineIndex;\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) {\n return false;\n }\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) {\n return false;\n }\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (\n this.config.headerExtensions[remoteMedia.kind as \"audio\" | \"video\"] ||\n []\n ).find((v) => v.uri === extension.uri),\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction ?? \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.setCurrentDirection(direction);\n } else {\n transceiver.offerDirection = direction;\n }\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n for (const param of remoteMedia.simulcastParameters) {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n }\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if (\n remoteMedia.port !== 0 &&\n [\"sendonly\", \"sendrecv\"].includes(mediaDirection)\n ) {\n const remoteStreamIds = [\n ...new Set(remoteMedia.msids.map((msid) => msid.split(\" \")[0])),\n ];\n const remoteTrackId = remoteMedia.msids[0]?.split(\" \")[1];\n transceiver.receiver.remoteStreamId = remoteStreamIds[0];\n transceiver.receiver.remoteStreamIds = remoteStreamIds;\n transceiver.receiver.remoteTrackId = remoteTrackId;\n\n this.onTrack.execute({\n track: transceiver.receiver.track,\n transceiver,\n streams: remoteStreamIds.map(\n (id) =>\n new MediaStream({\n id,\n tracks: [transceiver.receiver.track],\n }),\n ),\n });\n }\n\n if (remoteMedia.ssrc[0]?.ssrc) {\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);\n }\n }\n\n collectStats(timestamp: number): RTCStats[] {\n const stats: RTCStats[] = [];\n\n for (const transceiver of this.transceivers) {\n if (transceiver.sender) {\n stats.push(...transceiver.sender.collectStats(timestamp));\n }\n\n if (transceiver.receiver) {\n stats.push(...transceiver.receiver.collectStats(timestamp));\n }\n\n const codecStats = transceiver.collectCodecStats(timestamp);\n if (codecStats) {\n stats.push(...codecStats);\n }\n }\n\n return stats;\n }\n\n getStatsRootIds(selector: MediaStreamTrack | null | undefined) {\n if (!selector) {\n return [];\n }\n\n const rootIds: string[] = [];\n for (const transceiver of this.transceivers) {\n if (transceiver.sender.track === selector) {\n rootIds.push(...transceiver.sender.getStatsRootIds());\n }\n if (transceiver.receiver.tracks.includes(selector)) {\n rootIds.push(...transceiver.receiver.getStatsRootIds(selector));\n }\n }\n\n return rootIds;\n }\n\n /**\n * 全トランシーバーのreceiver/senderのstopを呼ぶcloseメソッド\n */\n close() {\n for (const transceiver of this.transceivers) {\n transceiver.forceStop();\n }\n\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onTrack.allUnsubscribe();\n this.onNegotiationNeeded.allUnsubscribe();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transceiverManager.js","sourceRoot":"","sources":["../../../src/transceiverManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReceiverDirection, SenderDirections } from \"./const\";\nimport { createWebRtcDomException } from \"./errors\";\nimport { Event, debug } from \"./imports/common\";\nimport {\n MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n type RTCRtpEncodingParameters,\n type RTCRtpParameters,\n type RTCRtpReceiveParameters,\n RTCRtpReceiver,\n RTCRtpRtxParameters,\n RTCRtpSender,\n RTCRtpTransceiver,\n Recvonly,\n type RtpRouter,\n Sendonly,\n Sendrecv,\n type TransceiverOptions,\n} from \"./media\";\nimport {\n assertCodecsSupported,\n hasCommonPrimaryMimeType,\n isCodecCompatible,\n resolveCodecs,\n} from \"./media/codecCompatibility\";\nimport type { RTCStats } from \"./media/stats\";\nimport { captureTrackSourceCodecs, getTrackSourceCodecs } from \"./media/track\";\nimport type { PeerConfig } from \"./peerConnection\";\nimport {\n type MediaDescription,\n type SessionDescription,\n codecParametersFromString,\n} from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport type { Kind } from \"./types/domain\";\nimport { reverseDirection } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpTransceiverManager.ts\");\n\nfunction simulcastFromSendEncodings(\n encodings: RTCRtpEncodingParameters[] | undefined,\n): TransceiverOptions[\"simulcast\"] | undefined {\n if (!encodings || encodings.length < 2) {\n return undefined;\n }\n const rids = encodings\n .map((encoding) => encoding.rid)\n .filter((rid): rid is string => typeof rid === \"string\" && rid.length > 0);\n if (rids.length < 2) {\n return undefined;\n }\n return rids.map((rid) => ({ rid, direction: \"send\" as const }));\n}\n\nexport class TransceiverManager {\n private readonly transceivers: RTCRtpTransceiver[] = [];\n private readonly watched = new WeakSet<RTCRtpTransceiver>();\n private remoteOfferSnapshot?: {\n transceivers: RTCRtpTransceiver[];\n /**適用中の remote offer が作成した transceiver (rollback で破棄する対象) */\n remoteCreated: Set<RTCRtpTransceiver>;\n states: Map<\n RTCRtpTransceiver,\n {\n mid: string | null;\n mLineIndex?: number;\n pendingRejection: boolean;\n firedReceiving: boolean;\n }\n >;\n };\n\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTrack = new Event<\n [\n {\n track: MediaStreamTrack;\n transceiver: RTCRtpTransceiver;\n streams: MediaStream[];\n },\n ]\n >();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(\n private readonly cname: string,\n private readonly config: Required<PeerConfig>,\n private readonly router: RtpRouter,\n ) {}\n\n getTransceivers(): RTCRtpTransceiver[] {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n getTransceiverByMLineIndex(index: number): RTCRtpTransceiver | undefined {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index,\n );\n }\n\n pushTransceiver(t: RTCRtpTransceiver): void {\n this.watchTransceiver(t);\n this.transceivers.push(t);\n }\n\n replaceTransceiver(t: RTCRtpTransceiver, index: number): void {\n this.watchTransceiver(t);\n this.transceivers[index] = t;\n }\n\n /**m-line から外れた transceiver の購読を解除する */\n private unwatchTransceiver(t: RTCRtpTransceiver) {\n this.watched.delete(t);\n t.onRelease.allUnsubscribe();\n t.onStopRequested.allUnsubscribe();\n }\n\n private watchTransceiver(t: RTCRtpTransceiver) {\n if (this.watched.has(t)) {\n return;\n }\n this.watched.add(t);\n t.onRelease.subscribe(() => {\n this.router.unregisterTransceiver(t);\n });\n t.onStopRequested.subscribe(() => {\n // 未関連付けの stop は m-line を作らないので交渉不要\n if (!t.stopped) {\n this.onNegotiationNeeded.execute();\n }\n });\n }\n\n /**\n * 拒否 / 停止の交渉が確定した port 0 の位置のうち、同じ kind で\n * まだ他の transceiver が予約していないものを返す。\n * stopping (未交渉) の位置は先取りしない。\n */\n private findReusableTransceiver(kind: Kind) {\n return this.transceivers.find(\n (t) =>\n t.stopped &&\n t.kind === kind &&\n t.mLineIndex != undefined &&\n !this.transceivers.some(\n (other) => other !== t && other.mLineIndex === t.mLineIndex,\n ),\n );\n }\n\n /**旧 transceiver を m-line から外し、同じ位置に新しい transceiver を置く */\n private takeOverMLine(\n oldTransceiver: RTCRtpTransceiver,\n newTransceiver: RTCRtpTransceiver,\n ) {\n const index = this.transceivers.indexOf(oldTransceiver);\n newTransceiver.mLineIndex = oldTransceiver.mLineIndex;\n oldTransceiver.mid = null;\n oldTransceiver.mLineIndex = undefined;\n this.unwatchTransceiver(oldTransceiver);\n this.replaceTransceiver(newTransceiver, index);\n }\n\n /**\n * 既存の未関連付け transceiver を remote m-line の位置に関連付ける。\n * 同じ位置に停止済みの旧 transceiver があれば m-line から外し、配列上でも置き換える。\n * (旧 transceiver が位置を持ったままだと MID の割り当て先が重複する)\n */\n associateMLine(transceiver: RTCRtpTransceiver, mLineIndex: number) {\n const previous = this.transceivers.find(\n (t) => t !== transceiver && t.stopped && t.mLineIndex === mLineIndex,\n );\n if (!previous) {\n return;\n }\n this.transceivers.splice(this.transceivers.indexOf(transceiver), 1);\n this.takeOverMLine(previous, transceiver);\n }\n\n /**\n * remote offer が定義した位置のうち、関連付けられなかった未交渉 transceiver の予約を解除する。\n * (remote が予約位置を別 kind や別 transceiver で再利用した場合、次の offer で末尾に追加させる)\n */\n releaseUnassociatedReservations(\n associated: Set<RTCRtpTransceiver>,\n mLineCount: number,\n ) {\n for (const t of this.transceivers) {\n if (\n !associated.has(t) &&\n t.mid == null &&\n t.mLineIndex != undefined &&\n t.mLineIndex < mLineCount\n ) {\n t.mLineIndex = undefined;\n }\n }\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n dtlsTransport?: RTCDtlsTransport,\n options: Partial<TransceiverOptions> = {},\n {\n remoteMLineIndex,\n }: {\n /**remote offer 起因で作る場合の m-line index。確定済み停止位置の自動再利用は行わない */\n remoteMLineIndex?: number;\n } = {},\n ): RTCRtpTransceiver {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n if (typeof trackOrKind !== \"string\") {\n captureTrackSourceCodecs(trackOrKind);\n assertCodecsSupported({\n kind,\n configured: this.filterCodecsByDirection(kind, direction),\n source: getTrackSourceCodecs(trackOrKind),\n preferences: undefined,\n });\n }\n\n const sender = new RTCRtpSender(trackOrKind, {\n pendingRtp: this.config.pendingRtp,\n });\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const newTransceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction,\n );\n newTransceiver.onCodecPreferencesChanged.subscribe(() => {\n this.onNegotiationNeeded.execute();\n });\n newTransceiver.options = {\n ...options,\n simulcast:\n options.simulcast ?? simulcastFromSendEncodings(options.sendEncodings),\n };\n newTransceiver.sender.setStreams(options.streams ?? []);\n newTransceiver.sender.setSendEncodings(\n (\n (options.sendEncodings as RTCRtpEncodingParameters[] | undefined) ?? []\n ).map((encoding) => ({ ...encoding })),\n );\n this.router.registerRtpSender(newTransceiver.sender);\n\n // 旧 transceiver は復活させず、MID は次の offer で新しく割り当てる\n const reusable =\n remoteMLineIndex == undefined\n ? this.findReusableTransceiver(kind)\n : this.transceivers.find(\n (t) => t.stopped && t.mLineIndex === remoteMLineIndex,\n );\n if (reusable) {\n this.takeOverMLine(reusable, newTransceiver);\n } else {\n this.pushTransceiver(newTransceiver);\n }\n if (remoteMLineIndex != undefined) {\n this.remoteOfferSnapshot?.remoteCreated.add(newTransceiver);\n }\n this.onTransceiverAdded.execute(newTransceiver);\n\n return newTransceiver;\n }\n\n addTrack(\n track: MediaStreamTrack,\n streams: MediaStream[] = [],\n ): RTCRtpTransceiver {\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n \"Track already added\",\n );\n }\n\n const reusableForTrack = (t: RTCRtpTransceiver) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n !t.usedForSender &&\n !t.stopping &&\n !t.stopped &&\n !t.rejected &&\n !t.pendingRejection;\n\n const emptyTrackSenderTransceiver = this.transceivers.find(\n (t) => reusableForTrack(t) && SenderDirections.includes(t.direction),\n );\n if (emptyTrackSenderTransceiver) {\n this.validateTrackForTransceiver(track, emptyTrackSenderTransceiver);\n const sender = emptyTrackSenderTransceiver.sender;\n sender.setStreams(streams);\n sender.registerTrack(track);\n emptyTrackSenderTransceiver.options = {\n ...emptyTrackSenderTransceiver.options,\n streams,\n };\n emptyTrackSenderTransceiver.codecs = [];\n return emptyTrackSenderTransceiver;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) => reusableForTrack(t) && !SenderDirections.includes(t.direction),\n );\n if (notSendTransceiver) {\n const nextDirection =\n notSendTransceiver.direction === \"recvonly\"\n ? \"sendrecv\"\n : notSendTransceiver.direction === \"inactive\"\n ? \"sendonly\"\n : notSendTransceiver.direction;\n this.validateTrackForTransceiver(\n track,\n notSendTransceiver,\n nextDirection,\n );\n const sender = notSendTransceiver.sender;\n sender.setStreams(streams);\n sender.registerTrack(track);\n notSendTransceiver.options = {\n ...notSendTransceiver.options,\n streams,\n };\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.setDirection(\"sendrecv\");\n break;\n case \"inactive\":\n notSendTransceiver.setDirection(\"sendonly\");\n break;\n }\n notSendTransceiver.codecs = [];\n return notSendTransceiver;\n } else {\n const transceiver = this.addTransceiver(track, undefined, {\n direction: \"sendrecv\",\n streams,\n });\n return transceiver;\n }\n }\n\n /**\n * sender から track を外す。\n * @returns 交渉が必要な変更をした場合 true (呼び出し側が negotiationneeded を要求する)\n */\n removeTrack(sender: RTCRtpSender): boolean {\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n \"Sender does not exist\",\n );\n }\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc,\n );\n if (!transceiver) throw new Error(\"No matching transceiver found\");\n\n if (transceiver.stopping || transceiver.stopped) {\n return false;\n }\n\n if (sender.track == undefined) {\n return false;\n }\n\n // sender 自体は止めず track だけ外し、同じ sender で送信を再開できるようにする\n sender.detachTrack();\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.setDirection(\"recvonly\");\n } else if (transceiver.direction === \"sendonly\") {\n transceiver.setDirection(\"inactive\");\n }\n return true;\n }\n\n assignTransceiverCodecs(transceiver: RTCRtpTransceiver): void {\n const configured = this.filterCodecsByDirection(\n transceiver.kind,\n transceiver.direction,\n );\n transceiver.codecs = assertCodecsSupported({\n kind: transceiver.kind,\n configured,\n source: getTrackSourceCodecs(transceiver.sender.track),\n preferences: transceiver.codecPreferences,\n });\n transceiver.codecPreferencesNeedResolution = false;\n }\n\n private filterCodecsByDirection(\n kind: Kind,\n direction: RTCRtpTransceiver[\"direction\"],\n ) {\n return (this.config.codecs[kind] as RTCRtpCodecParameters[]).filter(\n (codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if (ReceiverDirection.includes(direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if (SenderDirections.includes(direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(direction)) return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n },\n );\n }\n\n private validateTrackForTransceiver(\n track: MediaStreamTrack,\n transceiver: RTCRtpTransceiver,\n direction = transceiver.direction,\n ) {\n captureTrackSourceCodecs(track);\n assertCodecsSupported({\n kind: track.kind,\n configured: this.filterCodecsByDirection(track.kind, direction),\n source: getTrackSourceCodecs(track),\n preferences: transceiver.codecPreferences,\n });\n }\n\n getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver,\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {},\n ),\n ),\n };\n\n return receiveParameters;\n }\n\n /**\n * remote offer と local (source constraint + preferences) から\n * answer 用の codec を再解決し、sender/receiver の codec 状態も\n * 新しい negotiated codec に同期する。\n * setCodecPreferences() による無効化後に createAnswer() から呼ばれる。\n * direction / headerExtensions / onTrack は setRemoteDescription() 時の\n * まま変えない (track イベントの重複発火を避ける)。\n */\n resyncAnswerCodecs(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n ): void {\n this.refreshAnswerCodecs(transceiver, remoteMedia);\n\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remoteParams = this.getRemoteRtpParams(remoteMedia, transceiver);\n for (const param of remoteMedia.simulcastParameters) {\n this.router.registerRtpReceiverByRid(transceiver, param, remoteParams);\n }\n transceiver.receiver.resyncCodecs(\n remoteParams,\n remoteMedia.ssrc[0]?.ssrc,\n );\n this.router.registerRtpReceiverBySsrc(transceiver, remoteParams);\n }\n }\n\n /**\n * remote offer と local (source constraint + preferences) から\n * answer 用の codec だけを再解決する (sender/receiver の同期なし)。\n * setRemoteRTP() の交渉部分として使う。\n */\n private resolveRemoteCodecSet(\n localCodecs: RTCRtpCodecParameters[],\n remoteMedia: MediaDescription,\n order: \"local\" | \"remote\",\n source?: readonly RTCRtpCodecParameters[],\n ): RTCRtpCodecParameters[] {\n // # negotiate codecs\n const codecName = (codec: RTCRtpCodecParameters) =>\n codec.name.toLowerCase();\n const redPayloadTypes = (codec: RTCRtpCodecParameters) =>\n (codec.parameters ?? \"\")\n .split(\"/\")\n .map(Number)\n .filter((payloadType) => !Number.isNaN(payloadType));\n const remoteByLocal = new Map<\n RTCRtpCodecParameters,\n RTCRtpCodecParameters\n >();\n const usedRemote = new Set<RTCRtpCodecParameters>();\n for (const localCodec of localCodecs) {\n if ([\"red\", \"rtx\"].includes(codecName(localCodec))) continue;\n const remoteCodec = remoteMedia.rtp.codecs.find(\n (codec) =>\n !usedRemote.has(codec) &&\n codec.mimeType.toLowerCase() === localCodec.mimeType.toLowerCase() &&\n (source == undefined ||\n source.some((sourceCodec) =>\n isCodecCompatible(sourceCodec, codec),\n )),\n );\n if (remoteCodec) {\n remoteByLocal.set(localCodec, remoteCodec);\n usedRemote.add(remoteCodec);\n }\n }\n\n const negotiated = localCodecs.flatMap((localCodec) => {\n if (codecName(localCodec) === \"red\") {\n const remotePrimaryPayloadTypes = redPayloadTypes(localCodec).flatMap(\n (payloadType) => {\n const localPrimary = localCodecs.find(\n (codec) => codec.payloadType === payloadType,\n );\n const remotePrimary = localPrimary\n ? remoteByLocal.get(localPrimary)\n : undefined;\n return remotePrimary ? [remotePrimary.payloadType] : [];\n },\n );\n const remoteRed = remoteMedia.rtp.codecs.find((codec) => {\n if (codecName(codec) !== \"red\" || usedRemote.has(codec)) return false;\n const referenced = redPayloadTypes(codec);\n return (\n referenced.length === remotePrimaryPayloadTypes.length &&\n referenced.every(\n (payloadType, index) =>\n payloadType === remotePrimaryPayloadTypes[index],\n )\n );\n });\n if (!remoteRed) return [];\n usedRemote.add(remoteRed);\n return [remoteRed];\n }\n\n if (codecName(localCodec) !== \"rtx\") {\n const remoteCodec = remoteByLocal.get(localCodec);\n return remoteCodec ? [remoteCodec] : [];\n }\n\n const localApt = codecParametersFromString(\n localCodec.parameters ?? \"\",\n ).apt;\n const localPrimary = localCodecs.find(\n (codec) => codec.payloadType === localApt,\n );\n if (!localPrimary) return [];\n const remotePrimary = remoteByLocal.get(localPrimary);\n if (!remotePrimary) return [];\n const remoteRtx = remoteMedia.rtp.codecs.find((codec) => {\n if (codecName(codec) !== \"rtx\" || usedRemote.has(codec)) {\n return false;\n }\n return (\n codecParametersFromString(codec.parameters ?? \"\").apt ===\n remotePrimary.payloadType\n );\n });\n if (!remoteRtx) return [];\n usedRemote.add(remoteRtx);\n return [remoteRtx];\n });\n if (order === \"remote\") {\n const remoteOrder = new Map(\n remoteMedia.rtp.codecs.map((codec, index) => [codec, index]),\n );\n negotiated.sort(\n (left, right) => remoteOrder.get(left)! - remoteOrder.get(right)!,\n );\n }\n if (negotiated.length === 0) {\n throw createWebRtcDomException(\n \"NotSupportedError\",\n \"No compatible codec remains after remote negotiation.\",\n );\n }\n return negotiated;\n }\n\n refreshAnswerCodecs(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n ): void {\n const configured = this.config.codecs[remoteMedia.kind] || [];\n const source = getTrackSourceCodecs(transceiver.sender.track);\n assertCodecsSupported({\n kind: remoteMedia.kind,\n configured,\n source,\n preferences: transceiver.codecPreferences,\n });\n const localCodecs = resolveCodecs(\n configured,\n source,\n transceiver.codecPreferences,\n );\n transceiver.codecs = this.resolveRemoteCodecSet(\n localCodecs,\n remoteMedia,\n \"local\",\n source,\n );\n transceiver.codecPreferencesNeedResolution = false;\n log(\"negotiated codecs\", transceiver.codecs);\n }\n\n /**\n * remote SDP の全 audio/video m-line の codec を副作用なしで解決する。\n * transceiver の対応付けは本適用と同じ resolver を使い、検証と適用の判定をずらさない。\n * - port 0、停止済み / 停止中の m-line は codec 解決をしない (空)\n * - local capability と MIME が 1 つも一致しない m-line は空とし、\n * offer は setRemoteRTP() で拒否 (port 0 answer)、answer/pranswer は\n * SDPManager が InvalidAccessError とする (Issue #705)\n * - source constraint / preference / pending offer との不一致は NotSupportedError\n */\n planRemoteRtpCodecs(\n remoteSdp: SessionDescription,\n findTransceiver: (\n remoteMedia: MediaDescription,\n index: number,\n ) => RTCRtpTransceiver | undefined,\n ): Map<number, RTCRtpCodecParameters[]> {\n const plan = new Map<number, RTCRtpCodecParameters[]>();\n const isOffer = remoteSdp.type === \"offer\";\n for (const [index, remoteMedia] of remoteSdp.media.entries()) {\n if (![\"audio\", \"video\"].includes(remoteMedia.kind)) continue;\n const transceiver = findTransceiver(remoteMedia, index);\n if (\n remoteMedia.port === 0 ||\n transceiver?.stopped ||\n transceiver?.stopping\n ) {\n plan.set(index, []);\n continue;\n }\n const source = getTrackSourceCodecs(transceiver?.sender.track);\n const configured = this.config.codecs[remoteMedia.kind] || [];\n const localCodecs = isOffer\n ? configured\n : transceiver?.pendingLocalOfferCodecs || [];\n if (!hasCommonPrimaryMimeType(localCodecs, remoteMedia.rtp.codecs)) {\n plan.set(index, []);\n continue;\n }\n if (isOffer) {\n assertCodecsSupported({\n kind: remoteMedia.kind,\n configured,\n source,\n preferences: transceiver?.codecPreferences,\n });\n }\n const negotiated = this.resolveRemoteCodecSet(\n isOffer\n ? resolveCodecs(configured, source, transceiver?.codecPreferences)\n : localCodecs,\n remoteMedia,\n isOffer ? \"local\" : \"remote\",\n source,\n );\n if (source != undefined) {\n assertCodecsSupported({\n kind: remoteMedia.kind,\n configured: negotiated,\n source,\n preferences: undefined,\n });\n }\n plan.set(index, negotiated);\n }\n return plan;\n }\n\n /**\n * remote m-line を transceiver に適用する。\n * codecs は planRemoteRtpCodecs() で検証済みの解決結果を渡す。\n * codec が空、または remote port 0 の m-line は拒否として扱い、\n * sender/receiver 準備・router 登録・onTrack・TWCC を行わない。\n * @returns 受け入れた (RTP を流す) 場合 true\n */\n setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\" | \"pranswer\",\n mLineIndex: number,\n codecs: RTCRtpCodecParameters[],\n ): boolean {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId ?? null;\n }\n transceiver.mLineIndex = mLineIndex;\n if (type === \"answer\") transceiver.pendingLocalOfferCodecs = undefined;\n\n if (transceiver.stopped) {\n // 確定済みの停止 / 拒否 m-line は復活させない\n return false;\n }\n\n if (transceiver.stopping) {\n // app の stop() は自分の offer で交渉する。port 0 の answer で停止を確定する\n if (type === \"answer\" && remoteMedia.port === 0) {\n transceiver.commitStopped({ rejected: false });\n }\n return false;\n }\n\n log(\"negotiated codecs\", codecs);\n\n if (remoteMedia.port === 0 || codecs.length === 0) {\n if (type === \"answer\") {\n transceiver.commitStopped({ rejected: true });\n } else {\n // answer が確定するまで既存の RTP pipeline / track は維持する\n transceiver.pendingRejection = true;\n }\n return false;\n }\n transceiver.pendingRejection = false;\n\n transceiver.codecs = codecs;\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (\n this.config.headerExtensions[remoteMedia.kind as \"audio\" | \"video\"] ||\n []\n ).find((v) => v.uri === extension.uri),\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction ?? \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.setCurrentDirection(direction);\n } else {\n transceiver.offerDirection = direction;\n }\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n for (const param of remoteMedia.simulcastParameters) {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n }\n\n // codec map / RTX / TWCC を negotiated codec に合わせて再構築する\n transceiver.receiver.resyncCodecs(remotePrams, remoteMedia.ssrc[0]?.ssrc);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n const remoteStreamIds = [\n ...new Set(remoteMedia.msids.map((msid) => msid.split(\" \")[0])),\n ];\n const remoteTrackId = remoteMedia.msids[0]?.split(\" \")[1];\n transceiver.receiver.remoteStreamId = remoteStreamIds[0];\n transceiver.receiver.remoteStreamIds = remoteStreamIds;\n transceiver.receiver.remoteTrackId = remoteTrackId;\n\n // re-offer / re-answer で同じ受信を重複通知しない\n if (!transceiver.firedReceiving) {\n transceiver.firedReceiving = true;\n this.onTrack.execute({\n track: transceiver.receiver.track,\n transceiver,\n streams: remoteStreamIds.map(\n (id) =>\n new MediaStream({\n id,\n tracks: [transceiver.receiver.track],\n }),\n ),\n });\n }\n } else {\n transceiver.firedReceiving = false;\n }\n\n return true;\n }\n\n /**\n * remote offer 適用前の transceiver 対応を保存する。\n * 同じ offer/answer 交換中に複数回呼ばれても最初の状態を保持する。\n */\n beginRemoteOffer() {\n if (this.remoteOfferSnapshot) {\n return;\n }\n this.remoteOfferSnapshot = {\n transceivers: [...this.transceivers],\n remoteCreated: new Set(),\n states: new Map(\n this.transceivers.map((t) => [\n t,\n {\n mid: t.mid,\n mLineIndex: t.mLineIndex,\n pendingRejection: t.pendingRejection,\n firedReceiving: t.firedReceiving,\n },\n ]),\n ),\n };\n }\n\n /**\n * local answer の確定で、拒否予定の m-line を停止・解放する。\n * remote SDP 起因の停止なので negotiationneeded は要求しない。\n */\n commitRemoteOffer() {\n this.remoteOfferSnapshot = undefined;\n for (const transceiver of this.transceivers) {\n if (transceiver.pendingRejection) {\n transceiver.commitStopped({ rejected: true });\n }\n }\n }\n\n /**remote offer の rollback で transceiver 対応を元に戻す */\n rollbackRemoteOffer() {\n const snapshot = this.remoteOfferSnapshot;\n this.remoteOfferSnapshot = undefined;\n if (!snapshot) {\n return;\n }\n\n for (const transceiver of this.transceivers) {\n if (snapshot.states.has(transceiver)) {\n continue;\n }\n // app が追加した transceiver と、remote offer が作ったが app が addTrack で使い始めた\n // transceiver は残し、関連付けだけ外す (track の有無ではなく作成元で判定する)\n if (\n !snapshot.remoteCreated.has(transceiver) ||\n transceiver.sender.track\n ) {\n transceiver.mid = null;\n transceiver.mLineIndex = undefined;\n snapshot.transceivers.push(transceiver);\n continue;\n }\n // remote offer が作った transceiver は破棄する\n transceiver.forceStop();\n this.unwatchTransceiver(transceiver);\n }\n\n this.transceivers.splice(\n 0,\n this.transceivers.length,\n ...snapshot.transceivers,\n );\n snapshot.transceivers.forEach((t) => this.watchTransceiver(t));\n for (const [transceiver, state] of snapshot.states) {\n transceiver.mid = state.mid;\n transceiver.mLineIndex = state.mLineIndex;\n transceiver.pendingRejection = state.pendingRejection;\n transceiver.firedReceiving = state.firedReceiving;\n }\n }\n\n /**\n * answer 確定後に、stopping のまま交渉対象になり得ない transceiver の停止を確定する。\n * (MID が確定済み local description の非ゼロ m-line にない = offer から外れる)\n * @param negotiatedMids 確定済み local description の非ゼロ port の MID\n * @returns 次の自分の offer で port 0 を交渉すべき transceiver があるか\n */\n settleStoppingTransceivers(negotiatedMids: Set<string>) {\n for (const t of this.transceivers) {\n if (!t.stopping || t.stopped) {\n continue;\n }\n if (t.mid == undefined || !negotiatedMids.has(t.mid)) {\n t.commitStopped({ rejected: false });\n }\n }\n return this.transceivers.some((t) => t.stopping && !t.stopped);\n }\n\n collectStats(timestamp: number): RTCStats[] {\n const stats: RTCStats[] = [];\n\n for (const transceiver of this.transceivers) {\n if (transceiver.sender) {\n stats.push(...transceiver.sender.collectStats(timestamp));\n }\n\n if (transceiver.receiver) {\n stats.push(...transceiver.receiver.collectStats(timestamp));\n }\n\n const codecStats = transceiver.collectCodecStats(timestamp);\n if (codecStats) {\n stats.push(...codecStats);\n }\n }\n\n return stats;\n }\n\n getStatsRootIds(selector: MediaStreamTrack | null | undefined) {\n if (!selector) {\n return [];\n }\n\n const rootIds: string[] = [];\n for (const transceiver of this.transceivers) {\n if (transceiver.sender.track === selector) {\n rootIds.push(...transceiver.sender.getStatsRootIds());\n }\n if (transceiver.receiver.tracks.includes(selector)) {\n rootIds.push(...transceiver.receiver.getStatsRootIds(selector));\n }\n }\n\n return rootIds;\n }\n\n /**\n * 全トランシーバーのreceiver/senderのstopを呼ぶcloseメソッド\n */\n close() {\n for (const transceiver of this.transceivers) {\n transceiver.forceStop();\n this.unwatchTransceiver(transceiver);\n }\n\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onTrack.allUnsubscribe();\n this.onNegotiationNeeded.allUnsubscribe();\n }\n}\n"]}
|
|
@@ -58,6 +58,7 @@ export declare class RTCIceTransport {
|
|
|
58
58
|
getRemoteParameters(): RTCIceParameters | null;
|
|
59
59
|
private setState;
|
|
60
60
|
gather(): Promise<void>;
|
|
61
|
+
setIceServers(options: Partial<IceOptions>): void;
|
|
61
62
|
addRemoteCandidate: (candidate?: IceCandidate) => Promise<void> | undefined;
|
|
62
63
|
setRemoteParams(remoteParameters: RTCIceParameters, renomination?: boolean): void;
|
|
63
64
|
restart(): void;
|
|
@@ -77,6 +78,13 @@ export declare class RTCIceGatherer {
|
|
|
77
78
|
readonly onGatheringStateChange: Event<["complete" | "new" | "gathering"]>;
|
|
78
79
|
constructor(options?: Partial<IceOptions>);
|
|
79
80
|
gather(): Promise<void>;
|
|
81
|
+
setIceServers(options: Partial<IceOptions>): void;
|
|
82
|
+
/**
|
|
83
|
+
* Set gathering state and notify listeners.
|
|
84
|
+
* ICE restart must use this instead of writing gatheringState directly so
|
|
85
|
+
* SecureTransportManager can refresh its aggregate iceGatheringState.
|
|
86
|
+
*/
|
|
87
|
+
setGatheringState(state: IceGathererState): void;
|
|
80
88
|
get localCandidates(): IceCandidate[];
|
|
81
89
|
get localParameters(): RTCIceParameters;
|
|
82
90
|
private setState;
|
|
@@ -243,6 +243,9 @@ class RTCIceTransport {
|
|
|
243
243
|
gather() {
|
|
244
244
|
return this.iceGather.gather();
|
|
245
245
|
}
|
|
246
|
+
setIceServers(options) {
|
|
247
|
+
this.iceGather.setIceServers(options);
|
|
248
|
+
}
|
|
246
249
|
setRemoteParams(remoteParameters, renomination = false) {
|
|
247
250
|
if (renomination) {
|
|
248
251
|
this.renominating = true;
|
|
@@ -267,7 +270,9 @@ class RTCIceTransport {
|
|
|
267
270
|
this.iceRestarts++;
|
|
268
271
|
this.connection.restart();
|
|
269
272
|
this.setState("new");
|
|
270
|
-
|
|
273
|
+
// Use setGatheringState so onGatheringStateChange fires and the
|
|
274
|
+
// SecureTransportManager aggregate iceGatheringState stays in sync.
|
|
275
|
+
this.iceGather.setGatheringState("new");
|
|
271
276
|
this.waitStart = undefined;
|
|
272
277
|
this.onNegotiationNeeded.execute();
|
|
273
278
|
}
|
|
@@ -438,6 +443,17 @@ class RTCIceGatherer {
|
|
|
438
443
|
this.setState("complete");
|
|
439
444
|
}
|
|
440
445
|
}
|
|
446
|
+
setIceServers(options) {
|
|
447
|
+
this.connection.setIceServers(options);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Set gathering state and notify listeners.
|
|
451
|
+
* ICE restart must use this instead of writing gatheringState directly so
|
|
452
|
+
* SecureTransportManager can refresh its aggregate iceGatheringState.
|
|
453
|
+
*/
|
|
454
|
+
setGatheringState(state) {
|
|
455
|
+
this.setState(state);
|
|
456
|
+
}
|
|
441
457
|
get localCandidates() {
|
|
442
458
|
return this.connection.localCandidates.map(candidateFromIce);
|
|
443
459
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport { EventTarget as DomEventTarget } from \"../helper\";\nimport {\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n type RTCStatsIceCandidatePairState,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nfunction mapCandidatePairState(state: number): RTCStatsIceCandidatePairState {\n switch (state) {\n case 0:\n return \"frozen\";\n case 1:\n return \"waiting\";\n case 2:\n return \"in-progress\";\n case 3:\n return \"succeeded\";\n case 4:\n return \"failed\";\n default:\n return \"failed\";\n }\n}\n\n/**\n * +------------+\n | |\n |disconnected|\n | |\n +------------+\n ^ ^\n | |\n+------+ +----------+ +-----------+ +----------+\n| | | | | | | |\n| new | ---> | checking | ---> | connected | ---> | completed|\n| | | | | | | |\n+------+ +----+-----+ +-----------+ +----------+\n | \n | \n v \n +-------+ \n | | \n | failed| \n | | \n +-------+ \n */\n\nexport class RTCIceTransport {\n readonly id = randomUUID().toString();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n readonly component = \"rtp\";\n iceRestarts = 0;\n private waitStart?: Event<[]>;\n private renominating = false;\n private readonly events = new DomEventTarget();\n onstatechange?: () => void;\n ongatheringstatechange?: () => void;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n this.iceGather.onGatheringStateChange.subscribe(() => {\n this.ongatheringstatechange?.();\n this.events.emit(\"gatheringstatechange\");\n });\n }\n\n addEventListener = (\n type: string,\n listener: (...args: any[]) => void,\n options?: boolean | { once?: boolean },\n ) => {\n this.events.addEventListener(type, listener, options);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.events.removeEventListener(type, listener);\n };\n\n dispatchEvent = (event: globalThis.Event) => this.events.dispatchEvent(event);\n\n get role() {\n if (!this.connection.remoteUsername || !this.connection.remotePassword) {\n return \"unknown\";\n }\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n getRemoteCandidates() {\n return this.connection.remoteCandidates\n .filter((candidate) => candidate.type !== \"prflx\")\n .map((candidate) => candidateFromIce(candidate).toJSON());\n }\n\n getLocalCandidates() {\n return this.connection.localCandidates.map((candidate) =>\n candidateFromIce(candidate).toJSON(),\n );\n }\n\n getSelectedCandidatePair() {\n const pair =\n this.connection.candidatePairs.find((candidate) => candidate.nominated) ??\n this.connection.candidatePairs.find((candidate) => candidate.state === 3);\n if (!pair) {\n return null;\n }\n\n return {\n local: candidateFromIce(pair.localCandidate).toJSON(),\n remote: candidateFromIce(pair.remoteCandidate).toJSON(),\n };\n }\n\n getLocalParameters() {\n return this.localParameters ?? null;\n }\n\n getRemoteParameters() {\n if (!this.connection.remoteUsername || !this.connection.remotePassword) {\n return null;\n }\n\n return new RTCIceParameters({\n iceLite: this.connection.remoteIsLite,\n password: this.connection.remotePassword,\n usernameFragment: this.connection.remoteUsername,\n });\n }\n\n private setState(state: RTCIceConnectionState, emitEvent = true) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n if (emitEvent) {\n this.onstatechange?.();\n this.events.emit(\"statechange\");\n }\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n return !candidate\n ? this.connection.addRemoteCandidate(undefined)\n : this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.iceRestarts++;\n this.connection.restart();\n this.setState(\"new\");\n this.iceGather.gatheringState = \"new\";\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\", false);\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n\n async getStats(\n timestamp = getStatsTimestamp(),\n transportId = generateStatsId(\"transport\", this.id),\n ): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n // Local candidates\n for (const candidate of this.connection.localCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"local-candidate\",\n id: generateStatsId(\"local-candidate\", candidate.id),\n timestamp,\n transportId,\n address: candidate.host,\n port: candidate.port,\n protocol: candidate.transport,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n relatedAddress: candidate.relatedAddress,\n relatedPort: candidate.relatedPort,\n usernameFragment: candidate.ufrag,\n tcpType: candidate.tcptype as any,\n };\n stats.push(candidateStats);\n }\n\n // Remote candidates\n for (const candidate of this.connection.remoteCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"remote-candidate\",\n id: generateStatsId(\"remote-candidate\", candidate.id),\n timestamp,\n transportId,\n address: candidate.host,\n port: candidate.port,\n protocol: candidate.transport,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n relatedAddress: candidate.relatedAddress,\n relatedPort: candidate.relatedPort,\n usernameFragment: candidate.ufrag,\n tcpType: candidate.tcptype as any,\n };\n stats.push(candidateStats);\n }\n\n // Candidate pairs\n const pairs = this.connection?.candidatePairs\n ? [\n ...this.connection.candidatePairs.filter((p) => p.nominated),\n ...this.connection.candidatePairs.filter((p) => !p.nominated),\n ]\n : [];\n for (const pair of pairs) {\n const pairStats: RTCIceCandidatePairStats = {\n type: \"candidate-pair\",\n id: generateStatsId(\"candidate-pair\", pair.id),\n timestamp,\n transportId,\n localCandidateId: generateStatsId(\n \"local-candidate\",\n pair.localCandidate.id,\n ),\n remoteCandidateId: generateStatsId(\n \"remote-candidate\",\n pair.remoteCandidate.id,\n ),\n state: mapCandidatePairState(pair.state),\n nominated: pair.nominated,\n packetsSent: pair.packetsSent,\n packetsReceived: pair.packetsReceived,\n bytesSent: pair.bytesSent,\n bytesReceived: pair.bytesReceived,\n currentRoundTripTime: pair.rtt,\n totalRoundTripTime: pair.totalRoundTripTime,\n roundTripTimeMeasurements: pair.roundTripTimeMeasurements,\n requestsReceived: pair.requestsReceived,\n requestsSent: pair.requestsSent,\n responsesReceived: pair.responsesReceived,\n responsesSent: pair.responsesSent,\n retransmissionsReceived: pair.retransmissionsReceived,\n retransmissionsSent: pair.retransmissionsSent,\n consentRequestsSent: pair.consentRequestsSent,\n };\n stats.push(pairStats);\n }\n\n return stats;\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n iceLite: this.connection.iceLite,\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport interface RTCIceCandidateInit {\n candidate?: string;\n sdpMLineIndex?: number | null;\n sdpMid?: string | null;\n usernameFragment?: string | null;\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static fromSdp(sdp: string): RTCIceCandidate {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate.toJSON();\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate | RTCIceCandidateInit) {\n try {\n if (!data.candidate) {\n throw new Error(\"candidate is required\");\n }\n const normalizedCandidate = data.candidate.startsWith(\"candidate:\")\n ? data.candidate.slice(\"candidate:\".length)\n : data.candidate;\n const candidate = candidateFromSdp(normalizedCandidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;\n candidate.sdpMid = data.sdpMid ?? undefined;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../src/transport/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n Candidate,\n Connection,\n type IceConnection,\n type IceOptions,\n} from \"../../../ice/src\";\nimport { EventTarget as DomEventTarget } from \"../helper\";\nimport {\n type RTCIceCandidatePairStats,\n type RTCIceCandidateStats,\n type RTCStats,\n type RTCStatsIceCandidatePairState,\n generateStatsId,\n getStatsTimestamp,\n} from \"../media/stats\";\nimport { candidateFromSdp, candidateToSdp } from \"../sdp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/ice.ts\");\n\nfunction mapCandidatePairState(state: number): RTCStatsIceCandidatePairState {\n switch (state) {\n case 0:\n return \"frozen\";\n case 1:\n return \"waiting\";\n case 2:\n return \"in-progress\";\n case 3:\n return \"succeeded\";\n case 4:\n return \"failed\";\n default:\n return \"failed\";\n }\n}\n\n/**\n * +------------+\n | |\n |disconnected|\n | |\n +------------+\n ^ ^\n | |\n+------+ +----------+ +-----------+ +----------+\n| | | | | | | |\n| new | ---> | checking | ---> | connected | ---> | completed|\n| | | | | | | |\n+------+ +----+-----+ +-----------+ +----------+\n | \n | \n v \n +-------+ \n | | \n | failed| \n | | \n +-------+ \n */\n\nexport class RTCIceTransport {\n readonly id = randomUUID().toString();\n connection: IceConnection;\n state: RTCIceConnectionState = \"new\";\n readonly component = \"rtp\";\n iceRestarts = 0;\n private waitStart?: Event<[]>;\n private renominating = false;\n private readonly events = new DomEventTarget();\n onstatechange?: () => void;\n ongatheringstatechange?: () => void;\n\n readonly onStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(private iceGather: RTCIceGatherer) {\n this.connection = this.iceGather.connection;\n this.connection.stateChanged.subscribe((state) => {\n this.setState(state);\n });\n this.iceGather.onIceCandidate = (candidate) => {\n this.onIceCandidate.execute(candidate);\n };\n this.iceGather.onGatheringStateChange.subscribe(() => {\n this.ongatheringstatechange?.();\n this.events.emit(\"gatheringstatechange\");\n });\n }\n\n addEventListener = (\n type: string,\n listener: (...args: any[]) => void,\n options?: boolean | { once?: boolean },\n ) => {\n this.events.addEventListener(type, listener, options);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.events.removeEventListener(type, listener);\n };\n\n dispatchEvent = (event: globalThis.Event) => this.events.dispatchEvent(event);\n\n get role() {\n if (!this.connection.remoteUsername || !this.connection.remotePassword) {\n return \"unknown\";\n }\n if (this.connection.iceControlling) return \"controlling\";\n else return \"controlled\";\n }\n\n get gatheringState() {\n return this.iceGather.gatheringState;\n }\n\n get localCandidates() {\n return this.iceGather.localCandidates;\n }\n\n get localParameters() {\n return this.iceGather.localParameters;\n }\n\n getRemoteCandidates() {\n return this.connection.remoteCandidates\n .filter((candidate) => candidate.type !== \"prflx\")\n .map((candidate) => candidateFromIce(candidate).toJSON());\n }\n\n getLocalCandidates() {\n return this.connection.localCandidates.map((candidate) =>\n candidateFromIce(candidate).toJSON(),\n );\n }\n\n getSelectedCandidatePair() {\n const pair =\n this.connection.candidatePairs.find((candidate) => candidate.nominated) ??\n this.connection.candidatePairs.find((candidate) => candidate.state === 3);\n if (!pair) {\n return null;\n }\n\n return {\n local: candidateFromIce(pair.localCandidate).toJSON(),\n remote: candidateFromIce(pair.remoteCandidate).toJSON(),\n };\n }\n\n getLocalParameters() {\n return this.localParameters ?? null;\n }\n\n getRemoteParameters() {\n if (!this.connection.remoteUsername || !this.connection.remotePassword) {\n return null;\n }\n\n return new RTCIceParameters({\n iceLite: this.connection.remoteIsLite,\n password: this.connection.remotePassword,\n usernameFragment: this.connection.remoteUsername,\n });\n }\n\n private setState(state: RTCIceConnectionState, emitEvent = true) {\n if (state !== this.state) {\n this.state = state;\n\n this.onStateChange.execute(state);\n if (emitEvent) {\n this.onstatechange?.();\n this.events.emit(\"statechange\");\n }\n }\n }\n\n gather() {\n return this.iceGather.gather();\n }\n\n setIceServers(options: Partial<IceOptions>) {\n this.iceGather.setIceServers(options);\n }\n\n addRemoteCandidate = (candidate?: IceCandidate) => {\n if (!this.connection.remoteCandidatesEnd) {\n return !candidate\n ? this.connection.addRemoteCandidate(undefined)\n : this.connection.addRemoteCandidate(candidateToIce(candidate));\n }\n };\n\n setRemoteParams(remoteParameters: RTCIceParameters, renomination = false) {\n if (renomination) {\n this.renominating = true;\n }\n if (\n this.connection.remoteUsername &&\n this.connection.remotePassword &&\n (this.connection.remoteUsername !== remoteParameters.usernameFragment ||\n this.connection.remotePassword !== remoteParameters.password)\n ) {\n if (this.renominating) {\n log(\"renomination\", remoteParameters);\n this.connection.resetNominatedPair();\n this.renominating = false;\n } else {\n log(\"restart\", remoteParameters);\n this.restart();\n }\n }\n this.connection.setRemoteParams(remoteParameters);\n }\n\n restart() {\n this.iceRestarts++;\n this.connection.restart();\n this.setState(\"new\");\n // Use setGatheringState so onGatheringStateChange fires and the\n // SecureTransportManager aggregate iceGatheringState stays in sync.\n this.iceGather.setGatheringState(\"new\");\n this.waitStart = undefined;\n this.onNegotiationNeeded.execute();\n }\n\n async start() {\n if (this.state === \"closed\") {\n throw new Error(\"RTCIceTransport is closed\");\n }\n if (!this.connection.remotePassword || !this.connection.remoteUsername) {\n throw new Error(\"remoteParams missing\");\n }\n\n if (this.waitStart) {\n await this.waitStart.asPromise();\n }\n this.waitStart = new Event();\n\n this.setState(\"checking\");\n\n try {\n await this.connection.connect();\n } catch (error) {\n this.setState(\"failed\");\n throw error;\n }\n\n this.waitStart.execute();\n this.waitStart.complete();\n this.waitStart = undefined;\n }\n\n async stop() {\n if (this.state !== \"closed\") {\n this.setState(\"closed\", false);\n await this.connection.close();\n }\n this.onStateChange.complete();\n this.onIceCandidate.complete();\n this.onNegotiationNeeded.complete();\n }\n\n async getStats(\n timestamp = getStatsTimestamp(),\n transportId = generateStatsId(\"transport\", this.id),\n ): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n // Local candidates\n for (const candidate of this.connection.localCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"local-candidate\",\n id: generateStatsId(\"local-candidate\", candidate.id),\n timestamp,\n transportId,\n address: candidate.host,\n port: candidate.port,\n protocol: candidate.transport,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n relatedAddress: candidate.relatedAddress,\n relatedPort: candidate.relatedPort,\n usernameFragment: candidate.ufrag,\n tcpType: candidate.tcptype as any,\n };\n stats.push(candidateStats);\n }\n\n // Remote candidates\n for (const candidate of this.connection.remoteCandidates) {\n const candidateStats: RTCIceCandidateStats = {\n type: \"remote-candidate\",\n id: generateStatsId(\"remote-candidate\", candidate.id),\n timestamp,\n transportId,\n address: candidate.host,\n port: candidate.port,\n protocol: candidate.transport,\n candidateType: candidate.type as any,\n priority: candidate.priority,\n foundation: candidate.foundation,\n relatedAddress: candidate.relatedAddress,\n relatedPort: candidate.relatedPort,\n usernameFragment: candidate.ufrag,\n tcpType: candidate.tcptype as any,\n };\n stats.push(candidateStats);\n }\n\n // Candidate pairs\n const pairs = this.connection?.candidatePairs\n ? [\n ...this.connection.candidatePairs.filter((p) => p.nominated),\n ...this.connection.candidatePairs.filter((p) => !p.nominated),\n ]\n : [];\n for (const pair of pairs) {\n const pairStats: RTCIceCandidatePairStats = {\n type: \"candidate-pair\",\n id: generateStatsId(\"candidate-pair\", pair.id),\n timestamp,\n transportId,\n localCandidateId: generateStatsId(\n \"local-candidate\",\n pair.localCandidate.id,\n ),\n remoteCandidateId: generateStatsId(\n \"remote-candidate\",\n pair.remoteCandidate.id,\n ),\n state: mapCandidatePairState(pair.state),\n nominated: pair.nominated,\n packetsSent: pair.packetsSent,\n packetsReceived: pair.packetsReceived,\n bytesSent: pair.bytesSent,\n bytesReceived: pair.bytesReceived,\n currentRoundTripTime: pair.rtt,\n totalRoundTripTime: pair.totalRoundTripTime,\n roundTripTimeMeasurements: pair.roundTripTimeMeasurements,\n requestsReceived: pair.requestsReceived,\n requestsSent: pair.requestsSent,\n responsesReceived: pair.responsesReceived,\n responsesSent: pair.responsesSent,\n retransmissionsReceived: pair.retransmissionsReceived,\n retransmissionsSent: pair.retransmissionsSent,\n consentRequestsSent: pair.consentRequestsSent,\n };\n stats.push(pairStats);\n }\n\n return stats;\n }\n}\n\nexport const IceTransportStates = [\n \"new\",\n \"checking\",\n \"connected\",\n \"completed\",\n \"disconnected\",\n \"failed\",\n \"closed\",\n] as const;\nexport type RTCIceConnectionState = (typeof IceTransportStates)[number];\n\nexport const IceGathererStates = [\"new\", \"gathering\", \"complete\"] as const;\nexport type IceGathererState = (typeof IceGathererStates)[number];\n\nexport class RTCIceGatherer {\n onIceCandidate: (candidate: IceCandidate | undefined) => void = () => {};\n gatheringState: IceGathererState = \"new\";\n readonly connection: IceConnection;\n\n readonly onGatheringStateChange = new Event<[IceGathererState]>();\n\n constructor(private options: Partial<IceOptions> = {}) {\n this.connection = new Connection(false, this.options);\n this.connection.onIceCandidate.subscribe((candidate) => {\n this.onIceCandidate(candidateFromIce(candidate));\n });\n }\n\n async gather() {\n if (this.gatheringState === \"new\") {\n this.setState(\"gathering\");\n await this.connection.gatherCandidates();\n this.onIceCandidate(undefined);\n this.setState(\"complete\");\n }\n }\n\n setIceServers(options: Partial<IceOptions>) {\n this.connection.setIceServers(options);\n }\n\n /**\n * Set gathering state and notify listeners.\n * ICE restart must use this instead of writing gatheringState directly so\n * SecureTransportManager can refresh its aggregate iceGatheringState.\n */\n setGatheringState(state: IceGathererState) {\n this.setState(state);\n }\n\n get localCandidates() {\n return this.connection.localCandidates.map(candidateFromIce);\n }\n\n get localParameters() {\n const params = new RTCIceParameters({\n iceLite: this.connection.iceLite,\n usernameFragment: this.connection.localUsername,\n password: this.connection.localPassword,\n });\n\n return params;\n }\n\n private setState(state: IceGathererState) {\n if (state !== this.gatheringState) {\n this.gatheringState = state;\n this.onGatheringStateChange.execute(state);\n }\n }\n}\n\nexport function candidateFromIce(c: Candidate) {\n const candidate = new IceCandidate(\n c.component,\n c.foundation,\n c.host,\n c.port,\n c.priority,\n c.transport,\n c.type,\n c.generation,\n c.ufrag,\n );\n candidate.relatedAddress = c.relatedAddress;\n candidate.relatedPort = c.relatedPort;\n candidate.tcpType = c.tcptype;\n return candidate;\n}\n\nexport function candidateToIce(x: IceCandidate) {\n return new Candidate(\n x.foundation,\n x.component,\n x.protocol,\n x.priority,\n x.ip,\n x.port,\n x.type,\n x.relatedAddress,\n x.relatedPort,\n x.tcpType,\n x.generation,\n x.ufrag,\n );\n}\n\nexport interface RTCIceCandidateInit {\n candidate?: string;\n sdpMLineIndex?: number | null;\n sdpMid?: string | null;\n usernameFragment?: string | null;\n}\n\nexport class RTCIceCandidate {\n candidate!: string;\n sdpMid?: string;\n sdpMLineIndex?: number;\n usernameFragment?: string;\n\n constructor(props: Partial<RTCIceCandidate>) {\n Object.assign(this, props);\n }\n\n static fromSdp(sdp: string): RTCIceCandidate {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate.toJSON();\n }\n\n static isThis(o: any) {\n if (typeof o?.candidate === \"string\") return true;\n }\n\n toJSON() {\n return {\n candidate: this.candidate,\n sdpMid: this.sdpMid,\n sdpMLineIndex: this.sdpMLineIndex,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n\nexport class IceCandidate {\n // \"\"\"\n // The :class:`RTCIceCandidate` interface represents a candidate Interactive\n // Connectivity Establishment (ICE) configuration which may be used to\n // establish an RTCPeerConnection.\n // \"\"\"\n public relatedAddress?: string;\n public relatedPort?: number;\n public sdpMid?: string;\n public sdpMLineIndex?: number;\n public tcpType?: string;\n\n constructor(\n public component: number,\n public foundation: string,\n public ip: string,\n public port: number,\n public priority: number,\n public protocol: string,\n public type: string,\n public generation?: number,\n public ufrag?: string,\n ) {}\n\n toJSON(): RTCIceCandidate {\n return new RTCIceCandidate({\n candidate: candidateToSdp(this),\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.ufrag,\n });\n }\n\n static fromJSON(data: RTCIceCandidate | RTCIceCandidateInit) {\n try {\n if (!data.candidate) {\n throw new Error(\"candidate is required\");\n }\n const normalizedCandidate = data.candidate.startsWith(\"candidate:\")\n ? data.candidate.slice(\"candidate:\".length)\n : data.candidate;\n const candidate = candidateFromSdp(normalizedCandidate);\n candidate.sdpMLineIndex = data.sdpMLineIndex ?? undefined;\n candidate.sdpMid = data.sdpMid ?? undefined;\n return candidate;\n } catch (error) {}\n }\n}\n\nexport class RTCIceParameters {\n iceLite = false;\n usernameFragment!: string;\n password!: string;\n\n constructor(props: Partial<RTCIceParameters> = {}) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Event } from "../imports/common";
|
|
2
|
-
import { SCTP } from "../../../sctp/src";
|
|
2
|
+
import { SCTP, type SCTPOptions } from "../../../sctp/src";
|
|
3
3
|
import { RTCDataChannel } from "../dataChannel";
|
|
4
4
|
import type { RTCDtlsTransport } from "./dtls";
|
|
5
5
|
export declare const DEFAULT_MAX_MESSAGE_SIZE = 65536;
|
|
6
6
|
export declare class RTCSctpTransport {
|
|
7
7
|
port: number;
|
|
8
8
|
maxMessageSize: number;
|
|
9
|
+
private readonly sctpOptions;
|
|
9
10
|
dtlsTransport: RTCDtlsTransport;
|
|
10
11
|
sctp: SCTP;
|
|
11
12
|
readonly onDataChannel: Event<[RTCDataChannel]>;
|
|
@@ -20,7 +21,7 @@ export declare class RTCSctpTransport {
|
|
|
20
21
|
private dataChannelQueue;
|
|
21
22
|
private dataChannelId?;
|
|
22
23
|
private eventDisposer;
|
|
23
|
-
constructor(port?: number, maxMessageSize?: number);
|
|
24
|
+
constructor(port?: number, maxMessageSize?: number, sctpOptions?: SCTPOptions);
|
|
24
25
|
get transport(): RTCDtlsTransport;
|
|
25
26
|
setDtlsTransport(dtlsTransport: RTCDtlsTransport): void;
|
|
26
27
|
private get isServer();
|
|
@@ -9,7 +9,7 @@ const dataChannel_1 = require("../dataChannel");
|
|
|
9
9
|
const log = (0, common_1.debug)("werift:packages/webrtc/src/transport/sctp.ts");
|
|
10
10
|
exports.DEFAULT_MAX_MESSAGE_SIZE = 65536;
|
|
11
11
|
class RTCSctpTransport {
|
|
12
|
-
constructor(port = 5000, maxMessageSize = exports.DEFAULT_MAX_MESSAGE_SIZE) {
|
|
12
|
+
constructor(port = 5000, maxMessageSize = exports.DEFAULT_MAX_MESSAGE_SIZE, sctpOptions = {}) {
|
|
13
13
|
Object.defineProperty(this, "port", {
|
|
14
14
|
enumerable: true,
|
|
15
15
|
configurable: true,
|
|
@@ -22,6 +22,12 @@ class RTCSctpTransport {
|
|
|
22
22
|
writable: true,
|
|
23
23
|
value: maxMessageSize
|
|
24
24
|
});
|
|
25
|
+
Object.defineProperty(this, "sctpOptions", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: sctpOptions
|
|
30
|
+
});
|
|
25
31
|
Object.defineProperty(this, "dtlsTransport", {
|
|
26
32
|
enumerable: true,
|
|
27
33
|
configurable: true,
|
|
@@ -224,7 +230,7 @@ class RTCSctpTransport {
|
|
|
224
230
|
}
|
|
225
231
|
this.eventDisposer.forEach((dispose) => dispose());
|
|
226
232
|
this.dtlsTransport = dtlsTransport;
|
|
227
|
-
this.sctp = new src_1.SCTP(new BridgeDtls(this.dtlsTransport), this.port);
|
|
233
|
+
this.sctp = new src_1.SCTP(new BridgeDtls(this.dtlsTransport), this.port, this.sctpOptions);
|
|
228
234
|
this.eventDisposer = [
|
|
229
235
|
...[
|
|
230
236
|
this.sctp.onReceive.subscribe(this.datachannelReceive),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport { Event, debug } from \"../imports/common\";\n\nimport { SCTP, SCTP_STATE, type Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n type DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n getDataChannelMessageSize,\n} from \"../dataChannel\";\nimport type { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\nexport const DEFAULT_MAX_MESSAGE_SIZE = 65536;\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = randomUUID().toString();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n remoteMaxMessageSize = DEFAULT_MAX_MESSAGE_SIZE;\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(\n public port = 5000,\n public maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE,\n ) {}\n\n get transport() {\n return this.dtlsTransport;\n }\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n // !BBHLHH — 12 byte DCEP OPEN header (big-endian)\n const channelType = data.readUInt8(1);\n const reliability = data.readUInt32BE(4);\n const labelLength = data.readUInt16BE(8);\n const protocolLength = data.readUInt16BE(10);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n const ack = Buffer.allocUnsafe(1);\n ack.writeUInt8(DATA_CHANNEL_ACK, 0);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, ack]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n // Update reception statistics\n channel.messagesReceived++;\n channel.bytesReceived += data.length;\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id !== undefined) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits !== null) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime !== null) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n // !BBHLHH — message type / channel type / priority / reliability / label len / protocol len\n const data = Buffer.allocUnsafe(12);\n data.writeUInt8(DATA_CHANNEL_OPEN, 0);\n data.writeUInt8(channelType, 1);\n data.writeUInt16BE(priority, 2);\n data.writeUInt32BE(reliability, 4);\n data.writeUInt16BE(channel.label.length, 8);\n data.writeUInt16BE(channel.protocol.length, 10);\n const send = Buffer.concat([\n data,\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry =\n channel.maxPacketLifeTime !== null\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits ?? undefined,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n // Resetting the queue to empty array mitigates this.\n this.dataChannelQueue = [];\n }\n\n private assertSendableMessageSize(size: number) {\n if (this.remoteMaxMessageSize !== 0 && size > this.remoteMaxMessageSize) {\n throw new Error(\n `max-message-size exceeded: ${size} > ${this.remoteMaxMessageSize}`,\n );\n }\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n const userData = Buffer.isBuffer(data) ? data : Buffer.from(data);\n const size = getDataChannelMessageSize(data);\n\n this.assertSendableMessageSize(size);\n channel.addBufferedAmount(size);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, userData]\n : [channel, WEBRTC_BINARY, userData],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n\n return size;\n };\n\n getCapabilities() {\n return RTCSctpTransport.getCapabilities(this.maxMessageSize);\n }\n\n static getCapabilities(maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE) {\n return new RTCSctpCapabilities(maxMessageSize);\n }\n\n setRemoteMaxMessageSize(maxMessageSize?: number) {\n this.remoteMaxMessageSize = maxMessageSize ?? DEFAULT_MAX_MESSAGE_SIZE;\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n // Check if channel.id is already in reconfigQueue to prevent duplicates\n if (!this.sctp.reconfigQueue.includes(channel.id)) {\n this.sctp.reconfigQueue.push(channel.id);\n }\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n // Remove any pending reconfiguration requests for this channel\n this.sctp.reconfigQueue = this.sctp.reconfigQueue.filter(\n (streamId) => streamId !== channel.id,\n );\n if (channel.id !== undefined) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\n\nimport { Event, debug } from \"../imports/common\";\n\nimport {\n SCTP,\n type SCTPOptions,\n SCTP_STATE,\n type Transport,\n} from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n type DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n getDataChannelMessageSize,\n} from \"../dataChannel\";\nimport type { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\nexport const DEFAULT_MAX_MESSAGE_SIZE = 65536;\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = randomUUID().toString();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n remoteMaxMessageSize = DEFAULT_MAX_MESSAGE_SIZE;\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(\n public port = 5000,\n public maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE,\n private readonly sctpOptions: SCTPOptions = {},\n ) {}\n\n get transport() {\n return this.dtlsTransport;\n }\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(\n new BridgeDtls(this.dtlsTransport),\n this.port,\n this.sctpOptions,\n );\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n // !BBHLHH — 12 byte DCEP OPEN header (big-endian)\n const channelType = data.readUInt8(1);\n const reliability = data.readUInt32BE(4);\n const labelLength = data.readUInt16BE(8);\n const protocolLength = data.readUInt16BE(10);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n const ack = Buffer.allocUnsafe(1);\n ack.writeUInt8(DATA_CHANNEL_ACK, 0);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, ack]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n // Update reception statistics\n channel.messagesReceived++;\n channel.bytesReceived += data.length;\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id !== undefined) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits !== null) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime !== null) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n // !BBHLHH — message type / channel type / priority / reliability / label len / protocol len\n const data = Buffer.allocUnsafe(12);\n data.writeUInt8(DATA_CHANNEL_OPEN, 0);\n data.writeUInt8(channelType, 1);\n data.writeUInt16BE(priority, 2);\n data.writeUInt32BE(reliability, 4);\n data.writeUInt16BE(channel.label.length, 8);\n data.writeUInt16BE(channel.protocol.length, 10);\n const send = Buffer.concat([\n data,\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry =\n channel.maxPacketLifeTime !== null\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits ?? undefined,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n // Resetting the queue to empty array mitigates this.\n this.dataChannelQueue = [];\n }\n\n private assertSendableMessageSize(size: number) {\n if (this.remoteMaxMessageSize !== 0 && size > this.remoteMaxMessageSize) {\n throw new Error(\n `max-message-size exceeded: ${size} > ${this.remoteMaxMessageSize}`,\n );\n }\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n const userData = Buffer.isBuffer(data) ? data : Buffer.from(data);\n const size = getDataChannelMessageSize(data);\n\n this.assertSendableMessageSize(size);\n channel.addBufferedAmount(size);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, userData]\n : [channel, WEBRTC_BINARY, userData],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n\n return size;\n };\n\n getCapabilities() {\n return RTCSctpTransport.getCapabilities(this.maxMessageSize);\n }\n\n static getCapabilities(maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE) {\n return new RTCSctpCapabilities(maxMessageSize);\n }\n\n setRemoteMaxMessageSize(maxMessageSize?: number) {\n this.remoteMaxMessageSize = maxMessageSize ?? DEFAULT_MAX_MESSAGE_SIZE;\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n // Check if channel.id is already in reconfigQueue to prevent duplicates\n if (!this.sctp.reconfigQueue.includes(channel.id)) {\n this.sctp.reconfigQueue.push(channel.id);\n }\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n // Remove any pending reconfiguration requests for this channel\n this.sctp.reconfigQueue = this.sctp.reconfigQueue.filter(\n (streamId) => streamId !== channel.id,\n );\n if (channel.id !== undefined) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
|