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.
Files changed (166) hide show
  1. package/README.md +116 -113
  2. package/lib/common/src/transport.d.ts +22 -2
  3. package/lib/common/src/transport.js +84 -26
  4. package/lib/common/src/transport.js.map +1 -1
  5. package/lib/ice/src/exceptions.d.ts +9 -0
  6. package/lib/ice/src/exceptions.js +23 -1
  7. package/lib/ice/src/exceptions.js.map +1 -1
  8. package/lib/ice/src/ice.d.ts +40 -0
  9. package/lib/ice/src/ice.js +194 -28
  10. package/lib/ice/src/ice.js.map +1 -1
  11. package/lib/ice/src/iceBase.d.ts +26 -0
  12. package/lib/ice/src/iceBase.js.map +1 -1
  13. package/lib/ice/src/stun/const.d.ts +7 -0
  14. package/lib/ice/src/stun/const.js +8 -0
  15. package/lib/ice/src/stun/const.js.map +1 -1
  16. package/lib/ice/src/stun/protocol.js +1 -4
  17. package/lib/ice/src/stun/protocol.js.map +1 -1
  18. package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
  19. package/lib/ice/src/stun/tcpProtocol.js +65 -14
  20. package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
  21. package/lib/ice/src/stun/transaction.d.ts +12 -1
  22. package/lib/ice/src/stun/transaction.js +37 -4
  23. package/lib/ice/src/stun/transaction.js.map +1 -1
  24. package/lib/ice/src/turn/protocol.d.ts +40 -15
  25. package/lib/ice/src/turn/protocol.js +141 -32
  26. package/lib/ice/src/turn/protocol.js.map +1 -1
  27. package/lib/ice/src/types/model.d.ts +8 -0
  28. package/lib/ice/src/types/model.js.map +1 -1
  29. package/lib/index.mjs +6175 -4073
  30. package/lib/nonstandard/index.mjs +286 -1003
  31. package/lib/polyfill/dom.mjs +23794 -0
  32. package/lib/polyfill/index.mjs +23794 -0
  33. package/lib/rtp/src/extra/container/mp4/container.js +12 -4
  34. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  35. package/lib/rtp/src/extra/processor/mp4.js +8 -3
  36. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  37. package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
  38. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  39. package/lib/sctp/src/chunk.d.ts +5 -0
  40. package/lib/sctp/src/chunk.js +16 -11
  41. package/lib/sctp/src/chunk.js.map +1 -1
  42. package/lib/sctp/src/index.d.ts +3 -1
  43. package/lib/sctp/src/index.js +10 -1
  44. package/lib/sctp/src/index.js.map +1 -1
  45. package/lib/sctp/src/sctp.d.ts +12 -3
  46. package/lib/sctp/src/sctp.js +51 -18
  47. package/lib/sctp/src/sctp.js.map +1 -1
  48. package/lib/webrtc/src/const.js +2 -0
  49. package/lib/webrtc/src/const.js.map +1 -1
  50. package/lib/webrtc/src/errors.d.ts +9 -1
  51. package/lib/webrtc/src/errors.js +19 -0
  52. package/lib/webrtc/src/errors.js.map +1 -1
  53. package/lib/webrtc/src/media/codec.d.ts +5 -0
  54. package/lib/webrtc/src/media/codec.js +21 -0
  55. package/lib/webrtc/src/media/codec.js.map +1 -1
  56. package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
  57. package/lib/webrtc/src/media/codecCompatibility.js +138 -0
  58. package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
  59. package/lib/webrtc/src/media/index.d.ts +1 -0
  60. package/lib/webrtc/src/media/index.js +1 -0
  61. package/lib/webrtc/src/media/index.js.map +1 -1
  62. package/lib/webrtc/src/media/router.d.ts +2 -0
  63. package/lib/webrtc/src/media/router.js +23 -3
  64. package/lib/webrtc/src/media/router.js.map +1 -1
  65. package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
  66. package/lib/webrtc/src/media/rtpReceiver.js +35 -0
  67. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  68. package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
  69. package/lib/webrtc/src/media/rtpSender.js +264 -35
  70. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  71. package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
  72. package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
  73. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  74. package/lib/webrtc/src/media/track.d.ts +29 -1
  75. package/lib/webrtc/src/media/track.js +164 -5
  76. package/lib/webrtc/src/media/track.js.map +1 -1
  77. package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
  78. package/lib/webrtc/src/nonstandard/index.js +0 -1
  79. package/lib/webrtc/src/nonstandard/index.js.map +1 -1
  80. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
  81. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  82. package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
  83. package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
  84. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  85. package/lib/webrtc/src/peerConnection.d.ts +126 -5
  86. package/lib/webrtc/src/peerConnection.js +609 -136
  87. package/lib/webrtc/src/peerConnection.js.map +1 -1
  88. package/lib/webrtc/src/polyfill/api.d.ts +14 -0
  89. package/lib/webrtc/src/polyfill/api.js +23 -0
  90. package/lib/webrtc/src/polyfill/api.js.map +1 -0
  91. package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
  92. package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
  93. package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
  94. package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
  95. package/lib/webrtc/src/polyfill/dom.js +18 -0
  96. package/lib/webrtc/src/polyfill/dom.js.map +1 -0
  97. package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
  98. package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
  99. package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
  100. package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
  101. package/lib/webrtc/src/polyfill/globals.js +3 -0
  102. package/lib/webrtc/src/polyfill/globals.js.map +1 -0
  103. package/lib/webrtc/src/polyfill/index.d.ts +2 -0
  104. package/lib/webrtc/src/polyfill/index.js +19 -0
  105. package/lib/webrtc/src/polyfill/index.js.map +1 -0
  106. package/lib/webrtc/src/polyfill/install.d.ts +13 -0
  107. package/lib/webrtc/src/polyfill/install.js +266 -0
  108. package/lib/webrtc/src/polyfill/install.js.map +1 -0
  109. package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
  110. package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
  111. package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
  112. package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
  113. package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
  114. package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
  115. package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
  116. package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
  117. package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
  118. package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
  119. package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
  120. package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
  121. package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
  122. package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
  123. package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
  124. package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
  125. package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
  126. package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
  127. package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
  128. package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
  129. package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
  130. package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
  131. package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
  132. package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
  133. package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
  134. package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
  135. package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
  136. package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
  137. package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
  138. package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
  139. package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
  140. package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
  141. package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
  142. package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
  143. package/lib/webrtc/src/polyfill/trackStop.js +16 -0
  144. package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
  145. package/lib/webrtc/src/sctpManager.d.ts +2 -1
  146. package/lib/webrtc/src/sctpManager.js +5 -2
  147. package/lib/webrtc/src/sctpManager.js.map +1 -1
  148. package/lib/webrtc/src/sdp.d.ts +1 -1
  149. package/lib/webrtc/src/sdp.js +5 -6
  150. package/lib/webrtc/src/sdp.js.map +1 -1
  151. package/lib/webrtc/src/sdpManager.d.ts +38 -1
  152. package/lib/webrtc/src/sdpManager.js +236 -30
  153. package/lib/webrtc/src/sdpManager.js.map +1 -1
  154. package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
  155. package/lib/webrtc/src/secureTransportManager.js +123 -47
  156. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  157. package/lib/webrtc/src/transceiverManager.d.ts +91 -6
  158. package/lib/webrtc/src/transceiverManager.js +477 -62
  159. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  160. package/lib/webrtc/src/transport/ice.d.ts +8 -0
  161. package/lib/webrtc/src/transport/ice.js +17 -1
  162. package/lib/webrtc/src/transport/ice.js.map +1 -1
  163. package/lib/webrtc/src/transport/sctp.d.ts +3 -2
  164. package/lib/webrtc/src/transport/sctp.js +8 -2
  165. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  166. package/package.json +13 -3
@@ -1 +1 @@
1
- {"version":3,"file":"sctpManager.js","sourceRoot":"","sources":["../../../src/sctpManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { createWebRtcTypeError } from \"./errors\";\nimport { Event, debug } from \"./imports/common\";\n\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport {\n type RTCDataChannelStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport type { MediaDescription } from \"./sdp\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctpManager.ts\");\n\nexport class SctpTransportManager {\n sctpTransport?: RTCSctpTransport;\n sctpRemotePort?: number;\n dataChannelsOpened = 0;\n dataChannelsClosed = 0;\n private dataChannels: RTCDataChannel[] = [];\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n\n constructor() {}\n\n createSctpTransport(maxMessageSize?: number) {\n const sctp = new RTCSctpTransport(5000, maxMessageSize);\n sctp.mid = undefined;\n sctp.onDataChannel.subscribe((channel) => {\n this.dataChannelsOpened++;\n this.dataChannels.push(channel);\n this.onDataChannel.execute(channel);\n });\n\n this.sctpTransport = sctp;\n\n return sctp;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {},\n ): RTCDataChannel {\n const maxPacketLifeTime = coerceUnsignedShortOption(\n options.maxPacketLifeTime,\n \"maxPacketLifeTime\",\n );\n const maxRetransmits = coerceUnsignedShortOption(\n options.maxRetransmits,\n \"maxRetransmits\",\n );\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = {\n ...base,\n ...options,\n maxPacketLifeTime,\n maxRetransmits,\n } as any;\n\n if (settings.maxPacketLifeTime != null && settings.maxRetransmits != null) {\n throw createWebRtcTypeError(\n \"maxPacketLifeTime and maxRetransmits cannot both be set\",\n );\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n this.dataChannelsOpened++;\n this.dataChannels.push(channel);\n channel.stateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.dataChannelsClosed++;\n const index = this.dataChannels.indexOf(channel);\n if (index !== -1) {\n this.dataChannels.splice(index, 1);\n }\n }\n });\n return channel;\n }\n\n async connectSctp() {\n if (!this.sctpTransport || !this.sctpRemotePort) {\n return;\n }\n\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n\n setRemoteSCTP(remoteMedia: MediaDescription, mLineIndex: number) {\n if (!this.sctpTransport) {\n return;\n }\n\n // # configure sctp\n this.sctpTransport.setRemoteMaxMessageSize(\n remoteMedia.sctpCapabilities?.maxMessageSize,\n );\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n this.sctpTransport.setRemotePort(this.sctpRemotePort);\n this.sctpTransport.mLineIndex = mLineIndex;\n if (!this.sctpTransport.mid) {\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n async close() {\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n }\n\n this.onDataChannel.allUnsubscribe();\n }\n\n async getStats(timestamp = getStatsTimestamp()): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const channel of this.dataChannels) {\n const channelStats: RTCDataChannelStats = {\n type: \"data-channel\",\n id: generateStatsId(\"data-channel\", channel.id ?? channel.statsId),\n timestamp,\n label: channel.label,\n protocol: channel.protocol,\n dataChannelIdentifier: channel.id ?? undefined,\n state: channel.readyState,\n messagesSent: channel.messagesSent || 0,\n bytesSent: channel.bytesSent || 0,\n messagesReceived: channel.messagesReceived || 0,\n bytesReceived: channel.bytesReceived || 0,\n };\n stats.push(channelStats);\n }\n\n return stats;\n }\n}\n\nfunction coerceUnsignedShortOption(\n value: unknown,\n name: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const coerced = Number(value);\n if (\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < 0 ||\n coerced > 65535\n ) {\n throw createWebRtcTypeError(`${name} must be an unsigned short`);\n }\n\n return coerced;\n}\n"]}
1
+ {"version":3,"file":"sctpManager.js","sourceRoot":"","sources":["../../../src/sctpManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SCTPOptions } from \"../../sctp/src\";\nimport { createWebRtcTypeError } from \"./errors\";\nimport { Event, debug } from \"./imports/common\";\n\nimport { RTCDataChannel, RTCDataChannelParameters } from \"./dataChannel\";\nimport {\n type RTCDataChannelStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"./media/stats\";\nimport type { MediaDescription } from \"./sdp\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctpManager.ts\");\n\nexport class SctpTransportManager {\n sctpTransport?: RTCSctpTransport;\n sctpRemotePort?: number;\n dataChannelsOpened = 0;\n dataChannelsClosed = 0;\n private dataChannels: RTCDataChannel[] = [];\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n\n constructor() {}\n\n createSctpTransport(maxMessageSize?: number, sctpOptions?: SCTPOptions) {\n const sctp = new RTCSctpTransport(5000, maxMessageSize, sctpOptions);\n sctp.mid = undefined;\n sctp.onDataChannel.subscribe((channel) => {\n this.dataChannelsOpened++;\n this.dataChannels.push(channel);\n this.onDataChannel.execute(channel);\n });\n\n this.sctpTransport = sctp;\n\n return sctp;\n }\n\n createDataChannel(\n label: string,\n options: Partial<{\n maxPacketLifeTime?: number;\n protocol: string;\n maxRetransmits?: number;\n ordered: boolean;\n negotiated: boolean;\n id?: number;\n }> = {},\n ): RTCDataChannel {\n const maxPacketLifeTime = coerceUnsignedShortOption(\n options.maxPacketLifeTime,\n \"maxPacketLifeTime\",\n );\n const maxRetransmits = coerceUnsignedShortOption(\n options.maxRetransmits,\n \"maxRetransmits\",\n );\n const base: typeof options = {\n protocol: \"\",\n ordered: true,\n negotiated: false,\n };\n const settings: Required<typeof base> = {\n ...base,\n ...options,\n maxPacketLifeTime,\n maxRetransmits,\n } as any;\n\n if (settings.maxPacketLifeTime != null && settings.maxRetransmits != null) {\n throw createWebRtcTypeError(\n \"maxPacketLifeTime and maxRetransmits cannot both be set\",\n );\n }\n\n if (!this.sctpTransport) {\n this.sctpTransport = this.createSctpTransport();\n }\n\n const parameters = new RTCDataChannelParameters({\n id: settings.id,\n label,\n maxPacketLifeTime: settings.maxPacketLifeTime,\n maxRetransmits: settings.maxRetransmits,\n negotiated: settings.negotiated,\n ordered: settings.ordered,\n protocol: settings.protocol,\n });\n\n const channel = new RTCDataChannel(this.sctpTransport, parameters);\n this.dataChannelsOpened++;\n this.dataChannels.push(channel);\n channel.stateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.dataChannelsClosed++;\n const index = this.dataChannels.indexOf(channel);\n if (index !== -1) {\n this.dataChannels.splice(index, 1);\n }\n }\n });\n return channel;\n }\n\n async connectSctp() {\n if (!this.sctpTransport || !this.sctpRemotePort) {\n return;\n }\n\n await this.sctpTransport.start(this.sctpRemotePort);\n await this.sctpTransport.sctp.stateChanged.connected.asPromise();\n log(\"sctp connected\");\n }\n\n setRemoteSCTP(remoteMedia: MediaDescription, mLineIndex: number) {\n if (!this.sctpTransport) {\n return;\n }\n\n // # configure sctp\n this.sctpTransport.setRemoteMaxMessageSize(\n remoteMedia.sctpCapabilities?.maxMessageSize,\n );\n this.sctpRemotePort = remoteMedia.sctpPort;\n if (!this.sctpRemotePort) {\n throw new Error(\"sctpRemotePort not exist\");\n }\n\n this.sctpTransport.setRemotePort(this.sctpRemotePort);\n this.sctpTransport.mLineIndex = mLineIndex;\n if (!this.sctpTransport.mid) {\n this.sctpTransport.mid = remoteMedia.rtp.muxId;\n }\n }\n\n async close() {\n if (this.sctpTransport) {\n await this.sctpTransport.stop();\n // UdpTransport.send は既知アドレスでは callback を待たない。呼び出し側が\n // 直後に ICE ソケットを閉じると queued な AbortChunk が落ちるので、1 tick 譲る。\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n\n this.onDataChannel.allUnsubscribe();\n }\n\n async getStats(timestamp = getStatsTimestamp()): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const channel of this.dataChannels) {\n const channelStats: RTCDataChannelStats = {\n type: \"data-channel\",\n id: generateStatsId(\"data-channel\", channel.id ?? channel.statsId),\n timestamp,\n label: channel.label,\n protocol: channel.protocol,\n dataChannelIdentifier: channel.id ?? undefined,\n state: channel.readyState,\n messagesSent: channel.messagesSent || 0,\n bytesSent: channel.bytesSent || 0,\n messagesReceived: channel.messagesReceived || 0,\n bytesReceived: channel.bytesReceived || 0,\n };\n stats.push(channelStats);\n }\n\n return stats;\n }\n}\n\nfunction coerceUnsignedShortOption(\n value: unknown,\n name: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const coerced = Number(value);\n if (\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < 0 ||\n coerced > 65535\n ) {\n throw createWebRtcTypeError(`${name} must be an unsigned short`);\n }\n\n return coerced;\n}\n"]}
@@ -83,7 +83,7 @@ export declare class RTCSessionDescription {
83
83
  export declare function addSDPHeader(type: "offer" | "answer", description: SessionDescription): void;
84
84
  export declare function codecParametersFromString(str: string): any;
85
85
  export declare function codecParametersToString(parameters: {
86
- [key: string]: string | number;
86
+ [key: string]: string | number | undefined;
87
87
  }, joint?: string): string | undefined;
88
88
  export declare class SsrcDescription {
89
89
  ssrc: number;
@@ -817,6 +817,8 @@ function addSDPHeader(type, description) {
817
817
  function codecParametersFromString(str) {
818
818
  const parameters = {};
819
819
  str.split(";").forEach((param) => {
820
+ if (param.length === 0)
821
+ return;
820
822
  if (param.includes("=")) {
821
823
  const [k, v] = (0, helper_1.divide)(param, "=");
822
824
  if (const_1.FMTP_INT_PARAMETERS.includes(k)) {
@@ -837,12 +839,9 @@ function codecParametersFromString(str) {
837
839
  return parameters;
838
840
  }
839
841
  function codecParametersToString(parameters, joint = "=") {
840
- const params = Object.entries(parameters).map(([k, v]) => {
841
- if (v)
842
- return `${k}${joint}${v}`;
843
- else
844
- return k;
845
- });
842
+ const params = Object.entries(parameters)
843
+ .filter(([key, value]) => key.length > 0 && value !== undefined)
844
+ .map(([key, value]) => `${key}${joint}${value}`);
846
845
  if (params.length > 0) {
847
846
  return params.join(";");
848
847
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/sdp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport {\n DTLS_ROLE_SETUP,\n DTLS_SETUP_ROLE,\n FMTP_INT_PARAMETERS,\n SSRC_INFO_ATTRS,\n} from \"./const\";\nimport { divide } from \"./helper\";\nimport { Candidate } from \"./imports/ice\";\nimport {\n RTCRtcpFeedback,\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n type RTCRtpParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport type { MediaDirection } from \"./media/rtpTransceiver\";\nimport {\n type DtlsRole,\n RTCDtlsFingerprint,\n RTCDtlsParameters,\n} from \"./transport/dtls\";\nimport {\n type IceCandidate,\n RTCIceParameters,\n candidateFromIce,\n} from \"./transport/ice\";\nimport { RTCSctpCapabilities } from \"./transport/sctp\";\nimport type { Kind } from \"./types/domain\";\n\nexport class SessionDescription {\n version = 0;\n origin?: string;\n name = \"-\";\n time = \"0 0\";\n host?: string;\n group: GroupDescription[] = [];\n extMapAllowMixed = true;\n msidSemantic: GroupDescription[] = [];\n media: MediaDescription[] = [];\n type!: \"offer\" | \"answer\" | \"pranswer\";\n dtlsRole!: DtlsRole;\n iceOptions!: string;\n iceLite!: boolean;\n icePassword!: string;\n iceUsernameFragment!: string;\n dtlsFingerprints: RTCDtlsFingerprint[] = [];\n private cachedJson?: RTCSessionDescription;\n\n static parse(sdp: string) {\n const [sessionLines, mediaGroups] = groupLines(sdp);\n\n const session = new SessionDescription();\n sessionLines.forEach((line) => {\n if (line.startsWith(\"v=\")) {\n session.version = Number.parseInt(line.slice(2), 10);\n } else if (line.startsWith(\"o=\")) {\n session.origin = line.slice(2);\n } else if (line.startsWith(\"s=\")) {\n session.name = line.slice(2);\n } else if (line.startsWith(\"c=\")) {\n session.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"t=\")) {\n session.time = line.slice(2);\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n switch (attr) {\n case \"fingerprint\":\n {\n const [algorithm, fingerprint] = value?.split(\" \") || [];\n session.dtlsFingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\n }\n break;\n case \"ice-lite\":\n session.iceLite = true;\n break;\n case \"ice-options\":\n session.iceOptions = value;\n break;\n case \"ice-pwd\":\n session.icePassword = value;\n break;\n case \"ice-ufrag\":\n session.iceUsernameFragment = value;\n break;\n case \"group\":\n parseGroup(session.group, value);\n break;\n case \"msid-semantic\":\n parseGroup(session.msidSemantic, value);\n break;\n case \"setup\":\n session.dtlsRole = DTLS_SETUP_ROLE[value];\n break;\n case \"extmap-allow-mixed\":\n session.extMapAllowMixed = true;\n break;\n }\n }\n });\n\n const bundle = session.group.find((g) => g.semantic === \"BUNDLE\");\n\n mediaGroups.forEach((mediaLines) => {\n const target = mediaLines[0];\n const m = target.match(/^m=([^ ]+) ([0-9]+) ([A-Z/]+) (.+)/);\n if (!m) {\n throw new Error(\"m line not found\");\n }\n\n const kind = m[1] as Kind;\n const fmt = m[4].split(\" \");\n // todo fix\n const fmtInt = [\"audio\", \"video\"].includes(kind)\n ? fmt.map((v) => Number(v))\n : undefined;\n\n const currentMedia = new MediaDescription(\n kind,\n Number.parseInt(m[2]),\n m[3],\n fmtInt || fmt,\n );\n currentMedia.dtlsParams = new RTCDtlsParameters(\n [...session.dtlsFingerprints],\n session.dtlsRole,\n );\n\n currentMedia.iceParams = new RTCIceParameters({\n iceLite: session.iceLite,\n usernameFragment: session.iceUsernameFragment,\n password: session.icePassword,\n });\n\n currentMedia.iceOptions = session.iceOptions;\n session.media.push(currentMedia);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"c=\")) {\n currentMedia.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n\n switch (attr) {\n case \"candidate\":\n if (!value) throw new Error();\n currentMedia.iceCandidates.push(candidateFromSdp(value));\n break;\n case \"end-of-candidates\":\n currentMedia.iceCandidatesComplete = true;\n break;\n case \"extmap\":\n {\n // eslint-disable-next-line prefer-const\n let [extId, extUri] = value.split(\" \");\n if (extId.includes(\"/\")) {\n [extId] = extId.split(\"/\");\n }\n currentMedia.rtp.headerExtensions.push(\n new RTCRtpHeaderExtensionParameters({\n id: Number.parseInt(extId),\n uri: extUri,\n }),\n );\n }\n break;\n case \"fingerprint\":\n {\n if (!value) throw new Error();\n const [algorithm, fingerprint] = value.split(\" \");\n currentMedia.dtlsParams?.fingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\n }\n break;\n case \"ice-options\":\n currentMedia.iceOptions = value;\n break;\n case \"ice-pwd\":\n currentMedia.iceParams!.password = value;\n break;\n case \"ice-ufrag\":\n currentMedia.iceParams!.usernameFragment = value;\n break;\n case \"ice-lite\":\n currentMedia.iceParams!.iceLite = true;\n break;\n case \"max-message-size\":\n currentMedia.sctpCapabilities = new RTCSctpCapabilities(\n Number.parseInt(value, 10),\n );\n break;\n case \"mid\":\n currentMedia.rtp.muxId = value;\n break;\n case \"msid\":\n currentMedia.msids.push(value);\n break;\n case \"rtcp\":\n {\n const [port, rest] = divide(value, \" \");\n currentMedia.rtcpPort = Number.parseInt(port);\n currentMedia.rtcpHost = ipAddressFromSdp(rest);\n }\n break;\n case \"rtcp-mux\":\n currentMedia.rtcpMux = true;\n break;\n case \"setup\":\n currentMedia.dtlsParams!.role = DTLS_SETUP_ROLE[value];\n break;\n case \"recvonly\":\n case \"sendonly\":\n case \"sendrecv\":\n case \"inactive\":\n currentMedia.direction = attr;\n break;\n case \"rtpmap\":\n {\n const [formatId, formatDesc] = divide(value, \" \");\n const [type, clock, channel] = formatDesc.split(\"/\");\n let channels: number | undefined;\n if (currentMedia.kind === \"audio\") {\n channels = channel ? Number.parseInt(channel) : 1;\n }\n const codec = new RTCRtpCodecParameters({\n mimeType: currentMedia.kind + \"/\" + type,\n channels,\n clockRate: Number.parseInt(clock),\n payloadType: Number.parseInt(formatId),\n });\n currentMedia.rtp.codecs.push(codec);\n }\n break;\n case \"sctpmap\":\n {\n if (!value) throw new Error();\n const [formatId, formatDesc] = divide(value, \" \");\n currentMedia.sctpMap[Number.parseInt(formatId)] = formatDesc;\n currentMedia.sctpPort = Number.parseInt(formatId);\n }\n break;\n case \"sctp-port\":\n if (!value) throw new Error();\n currentMedia.sctpPort = Number.parseInt(value);\n break;\n case \"ssrc\":\n {\n const [ssrcStr, ssrcDesc] = divide(value, \" \");\n const ssrc = Number.parseInt(ssrcStr);\n const [ssrcAttr, ssrcValue] = divide(ssrcDesc, \":\");\n let ssrcInfo = currentMedia.ssrc.find((v) => v.ssrc === ssrc);\n if (!ssrcInfo) {\n ssrcInfo = new SsrcDescription({ ssrc });\n currentMedia.ssrc.push(ssrcInfo);\n }\n if (SSRC_INFO_ATTRS.includes(ssrcAttr)) {\n ssrcInfo[ssrcAttr] = ssrcValue;\n }\n }\n break;\n case \"ssrc-group\":\n parseGroup(currentMedia.ssrcGroup, value);\n break;\n case \"rid\":\n {\n const [rid, direction] = divide(value, \" \");\n\n currentMedia.simulcastParameters.push(\n new RTCRtpSimulcastParameters({\n rid,\n direction: direction as any,\n }),\n );\n }\n break;\n }\n }\n });\n\n if (\n !currentMedia.iceParams.usernameFragment ||\n !currentMedia.iceParams.password\n ) {\n if (\n currentMedia.rtp.muxId &&\n bundle &&\n bundle.items.includes(currentMedia.rtp.muxId)\n ) {\n for (let i = 0; i < bundle.items.length; i++) {\n if (!bundle.items.includes(i.toString())) continue;\n const check = session.media[i];\n if (check.iceParams?.usernameFragment && check.iceParams.password) {\n currentMedia.iceParams = {\n ...check.iceParams,\n };\n break;\n }\n }\n }\n }\n\n if (!currentMedia.dtlsParams.role) {\n currentMedia.dtlsParams = undefined;\n }\n\n const findCodec = (pt: number) =>\n currentMedia.rtp.codecs.find((v) => v.payloadType === pt);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n if (attr === \"fmtp\") {\n const [formatId, formatDesc] = divide(value, \" \");\n const codec = findCodec(Number(formatId))!;\n codec.parameters = formatDesc;\n } else if (attr === \"rtcp-fb\") {\n const [payloadType, feedbackType, feedbackParam] = value.split(\" \");\n currentMedia.rtp.codecs.forEach((codec) => {\n if ([\"*\", codec.payloadType!.toString()].includes(payloadType)) {\n codec.rtcpFeedback.push(\n new RTCRtcpFeedback({\n type: feedbackType,\n parameter: feedbackParam,\n }),\n );\n }\n });\n }\n }\n });\n });\n\n return session;\n }\n\n webrtcTrackId(media: MediaDescription) {\n if (media.msid?.includes(\" \")) {\n const bits = media.msid.split(\" \");\n for (const group of this.msidSemantic) {\n if (\n group.semantic === \"WMS\" &&\n (group.items.includes(bits[0]) || group.items.includes(\"*\"))\n ) {\n return bits[1];\n }\n }\n }\n return;\n }\n\n get string() {\n const lines = [`v=${this.version}`, `o=${this.origin}`, `s=${this.name}`];\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n lines.push(`t=${this.time}`);\n this.group.forEach((group) => lines.push(`a=group:${group.str}`));\n if (this.extMapAllowMixed) {\n lines.push(`a=extmap-allow-mixed`);\n }\n this.msidSemantic.forEach((group) =>\n lines.push(`a=msid-semantic:${group.str}`),\n );\n const media = this.media.map((m) => m.toString()).join(\"\");\n const sdp = lines.join(\"\\r\\n\") + \"\\r\\n\" + media;\n return sdp;\n }\n\n toJSON() {\n const sdp = this.string;\n if (\n !this.cachedJson ||\n this.cachedJson.sdp !== sdp ||\n this.cachedJson.type !== this.type\n ) {\n this.cachedJson = new RTCSessionDescription(sdp, this.type);\n }\n return this.cachedJson;\n }\n\n toSdp() {\n return {\n type: this.type,\n sdp: this.string,\n };\n }\n}\n\nexport class MediaDescription {\n // rtp\n host?: string;\n direction?: MediaDirection;\n msids: string[] = [];\n\n // rtcp\n rtcpPort?: number;\n rtcpHost?: string;\n rtcpMux = false;\n\n // ssrc\n ssrc: SsrcDescription[] = [];\n ssrcGroup: GroupDescription[] = [];\n\n // formats\n rtp: RTCRtpParameters = { codecs: [], headerExtensions: [] };\n\n // sctp\n sctpCapabilities?: RTCSctpCapabilities;\n sctpMap: { [key: number]: string } = {};\n sctpPort?: number;\n\n // DTLS\n dtlsParams?: RTCDtlsParameters;\n\n // ICE\n iceParams?: RTCIceParameters;\n iceCandidates: IceCandidate[] = [];\n iceCandidatesComplete = false;\n iceOptions?: string;\n\n // Simulcast\n simulcastParameters: RTCRtpSimulcastParameters[] = [];\n\n constructor(\n public kind: Kind,\n public port: number,\n public profile: string,\n public fmt: string[] | number[],\n ) {}\n\n get msid() {\n return this.msids[0];\n }\n\n set msid(value: string | undefined) {\n this.msids = value ? [value] : [];\n }\n\n toString() {\n const lines: string[] = [];\n lines.push(\n `m=${this.kind} ${this.port} ${this.profile} ${(this.fmt as number[])\n .map((v) => v.toString())\n .join(\" \")}`,\n );\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n // ice\n this.iceCandidates.forEach((candidate) => {\n lines.push(`a=candidate:${candidateToSdp(candidate)}`);\n });\n if (this.iceCandidatesComplete) {\n lines.push(\"a=end-of-candidates\");\n }\n if (this.iceParams?.usernameFragment) {\n lines.push(`a=ice-ufrag:${this.iceParams.usernameFragment}`);\n }\n if (this.iceParams?.password) {\n lines.push(`a=ice-pwd:${this.iceParams.password}`);\n }\n if (this.iceParams?.iceLite) {\n lines.push(`a=ice-lite`);\n }\n if (this.iceOptions) {\n lines.push(`a=ice-options:${this.iceOptions}`);\n }\n\n // dtls\n if (this.dtlsParams) {\n this.dtlsParams.fingerprints.forEach((fingerprint) => {\n lines.push(\n `a=fingerprint:${fingerprint.algorithm} ${fingerprint.value}`,\n );\n });\n lines.push(`a=setup:${DTLS_ROLE_SETUP[this.dtlsParams.role]}`);\n }\n\n if (this.direction) {\n lines.push(`a=${this.direction}`);\n }\n if (this.rtp.muxId) {\n lines.push(`a=mid:${this.rtp.muxId}`);\n }\n this.msids.forEach((msid) => lines.push(`a=msid:${msid}`));\n\n if (this.rtcpPort && this.rtcpHost) {\n lines.push(`a=rtcp:${this.rtcpPort} ${ipAddressToSdp(this.rtcpHost)}`);\n if (this.rtcpMux) {\n lines.push(\"a=rtcp-mux\");\n }\n }\n\n this.ssrcGroup.forEach((group) => {\n lines.push(`a=ssrc-group:${group.str}`);\n });\n this.ssrc.forEach((ssrcInfo) => {\n SSRC_INFO_ATTRS.forEach((ssrcAttr) => {\n const ssrcValue = ssrcInfo[ssrcAttr];\n if (ssrcValue !== undefined) {\n lines.push(`a=ssrc:${ssrcInfo.ssrc} ${ssrcAttr}:${ssrcValue}`);\n }\n });\n });\n\n this.rtp.codecs.forEach((codec) => {\n lines.push(`a=rtpmap:${codec.payloadType} ${codec.str}`);\n\n codec.rtcpFeedback.forEach((feedback) => {\n let value = feedback.type;\n if (feedback.parameter) value += ` ${feedback.parameter}`;\n lines.push(`a=rtcp-fb:${codec.payloadType} ${value}`);\n });\n\n if (codec.parameters) {\n lines.push(`a=fmtp:${codec.payloadType} ${codec.parameters}`);\n }\n });\n\n Object.keys(this.sctpMap).forEach((k) => {\n const v = this.sctpMap[Number(k)];\n lines.push(`a=sctpmap:${k} ${v}`);\n });\n if (this.sctpPort) {\n lines.push(`a=sctp-port:${this.sctpPort}`);\n }\n if (this.sctpCapabilities) {\n lines.push(`a=max-message-size:${this.sctpCapabilities.maxMessageSize}`);\n }\n\n // rtp extension\n this.rtp.headerExtensions.forEach((extension) =>\n lines.push(`a=extmap:${extension.id} ${extension.uri}`),\n );\n\n // simulcast\n if (this.simulcastParameters.length) {\n this.simulcastParameters.forEach((param) => {\n lines.push(`a=rid:${param.rid} ${param.direction}`);\n });\n let line = `a=simulcast:`;\n const recv = this.simulcastParameters.filter(\n (v) => v.direction === \"recv\",\n );\n if (recv.length) {\n line += `recv ${recv.map((v) => v.rid).join(\";\")} `;\n }\n const send = this.simulcastParameters.filter(\n (v) => v.direction === \"send\",\n );\n if (send.length) {\n line += `send ${send.map((v) => v.rid).join(\";\")}`;\n }\n\n lines.push(line);\n }\n\n return lines.join(\"\\r\\n\") + \"\\r\\n\";\n }\n}\n\nexport class GroupDescription {\n constructor(\n public semantic: string,\n public items: string[],\n ) {}\n\n get str() {\n return `${this.semantic} ${this.items.join(\" \")}`;\n }\n}\n\nfunction ipAddressFromSdp(sdp: string) {\n const m = sdp.match(/^IN (IP4|IP6) ([^ ]+)$/);\n if (!m) throw new Error(\"exception\");\n return m[2];\n}\n\nfunction ipAddressToSdp(addr: string) {\n const version = isIPv4(addr) ? 4 : 6;\n return `IN IP${version} ${addr}`;\n}\n\nexport function candidateToSdp(c: IceCandidate) {\n let sdp = `${c.foundation} ${c.component} ${c.protocol} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`;\n if (c.relatedAddress != undefined) {\n sdp += ` raddr ${c.relatedAddress}`;\n }\n if (c.relatedPort != undefined) {\n sdp += ` rport ${c.relatedPort}`;\n }\n if (c.tcpType != undefined) {\n sdp += ` tcptype ${c.tcpType}`;\n }\n if (c.generation != undefined) {\n sdp += ` generation ${c.generation}`;\n }\n if (c.ufrag != undefined) {\n sdp += ` ufrag ${c.ufrag}`;\n }\n\n return sdp;\n}\n\nfunction groupLines(sdp: string): [string[], string[][]] {\n const session: string[] = [];\n const media: string[][] = [];\n\n let lines = sdp.split(\"\\r\\n\");\n if (lines.length === 1) {\n lines = sdp.split(\"\\n\");\n }\n\n lines.forEach((line) => {\n if (line.startsWith(\"m=\")) {\n media.push([line]);\n } else if (media.length > 0) {\n media[media.length - 1].push(line);\n } else {\n session.push(line);\n }\n });\n\n return [session, media];\n}\n\nfunction parseAttr(line: string): [string, string] {\n if (line.includes(\":\")) {\n const bits = divide(line.slice(2), \":\");\n return [bits[0], bits[1]];\n } else {\n return [line.slice(2), undefined as any];\n }\n}\n\nexport function parseGroup(\n dest: GroupDescription[],\n value: string,\n type: (v: string) => any = (v) => v.toString(),\n) {\n const bits = value.split(\" \");\n if (bits.length > 0) {\n dest.push(new GroupDescription(bits[0], bits.slice(1).map(type)));\n }\n}\n\nexport function candidateFromSdp(sdp: string) {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate;\n}\n\nexport class RTCSessionDescription {\n readonly sdp!: string;\n readonly type!: \"offer\" | \"answer\" | \"pranswer\";\n\n constructor(sdp: string, type: \"offer\" | \"answer\" | \"pranswer\") {\n Object.defineProperties(this, {\n sdp: {\n configurable: true,\n enumerable: true,\n value: sdp,\n writable: false,\n },\n type: {\n configurable: true,\n enumerable: true,\n value: type,\n writable: false,\n },\n });\n }\n\n static isThis(o: any) {\n if (typeof o?.sdp === \"string\") return true;\n }\n\n toSdp() {\n return {\n sdp: this.sdp,\n type: this.type,\n };\n }\n}\n\nexport function addSDPHeader(\n type: \"offer\" | \"answer\",\n description: SessionDescription,\n) {\n const username = \"-\";\n const sessionId = randomBytes(8).readBigUInt64BE(0).toString().slice(0, 8);\n const sessionVersion = 0;\n\n description.origin = `${username} ${sessionId} ${sessionVersion} IN IP4 0.0.0.0`;\n description.msidSemantic.push(new GroupDescription(\"WMS\", [\"*\"]));\n description.type = type;\n}\n\nexport function codecParametersFromString(str: string) {\n const parameters: any = {};\n str.split(\";\").forEach((param) => {\n if (param.includes(\"=\")) {\n const [k, v] = divide(param, \"=\");\n if (FMTP_INT_PARAMETERS.includes(k)) {\n parameters[k] = Number(v);\n } else {\n parameters[k] = v;\n }\n } else if (param.includes(\":\")) {\n const [k, v] = param.split(\":\");\n parameters[k] = Number.isNaN(Number(v)) ? v : Number(v);\n } else {\n parameters[param] = undefined;\n }\n });\n return parameters;\n}\n\nexport function codecParametersToString(\n parameters: {\n [key: string]: string | number;\n },\n joint: string = \"=\",\n) {\n const params = Object.entries(parameters).map(([k, v]) => {\n if (v) return `${k}${joint}${v}`;\n else return k;\n });\n if (params.length > 0) {\n return params.join(\";\");\n }\n return undefined;\n}\n\nexport class SsrcDescription {\n ssrc!: number;\n cname?: string;\n msid?: string;\n msLabel?: string;\n label?: string;\n\n constructor(props: Partial<SsrcDescription>) {\n Object.assign(this, props);\n }\n}\n\nexport type BundlePolicy = \"max-compat\" | \"max-bundle\" | \"disable\";\n"]}
1
+ {"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../src/sdp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport {\n DTLS_ROLE_SETUP,\n DTLS_SETUP_ROLE,\n FMTP_INT_PARAMETERS,\n SSRC_INFO_ATTRS,\n} from \"./const\";\nimport { divide } from \"./helper\";\nimport { Candidate } from \"./imports/ice\";\nimport {\n RTCRtcpFeedback,\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n type RTCRtpParameters,\n RTCRtpSimulcastParameters,\n} from \"./media/parameters\";\nimport type { MediaDirection } from \"./media/rtpTransceiver\";\nimport {\n type DtlsRole,\n RTCDtlsFingerprint,\n RTCDtlsParameters,\n} from \"./transport/dtls\";\nimport {\n type IceCandidate,\n RTCIceParameters,\n candidateFromIce,\n} from \"./transport/ice\";\nimport { RTCSctpCapabilities } from \"./transport/sctp\";\nimport type { Kind } from \"./types/domain\";\n\nexport class SessionDescription {\n version = 0;\n origin?: string;\n name = \"-\";\n time = \"0 0\";\n host?: string;\n group: GroupDescription[] = [];\n extMapAllowMixed = true;\n msidSemantic: GroupDescription[] = [];\n media: MediaDescription[] = [];\n type!: \"offer\" | \"answer\" | \"pranswer\";\n dtlsRole!: DtlsRole;\n iceOptions!: string;\n iceLite!: boolean;\n icePassword!: string;\n iceUsernameFragment!: string;\n dtlsFingerprints: RTCDtlsFingerprint[] = [];\n private cachedJson?: RTCSessionDescription;\n\n static parse(sdp: string) {\n const [sessionLines, mediaGroups] = groupLines(sdp);\n\n const session = new SessionDescription();\n sessionLines.forEach((line) => {\n if (line.startsWith(\"v=\")) {\n session.version = Number.parseInt(line.slice(2), 10);\n } else if (line.startsWith(\"o=\")) {\n session.origin = line.slice(2);\n } else if (line.startsWith(\"s=\")) {\n session.name = line.slice(2);\n } else if (line.startsWith(\"c=\")) {\n session.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"t=\")) {\n session.time = line.slice(2);\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n switch (attr) {\n case \"fingerprint\":\n {\n const [algorithm, fingerprint] = value?.split(\" \") || [];\n session.dtlsFingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\n }\n break;\n case \"ice-lite\":\n session.iceLite = true;\n break;\n case \"ice-options\":\n session.iceOptions = value;\n break;\n case \"ice-pwd\":\n session.icePassword = value;\n break;\n case \"ice-ufrag\":\n session.iceUsernameFragment = value;\n break;\n case \"group\":\n parseGroup(session.group, value);\n break;\n case \"msid-semantic\":\n parseGroup(session.msidSemantic, value);\n break;\n case \"setup\":\n session.dtlsRole = DTLS_SETUP_ROLE[value];\n break;\n case \"extmap-allow-mixed\":\n session.extMapAllowMixed = true;\n break;\n }\n }\n });\n\n const bundle = session.group.find((g) => g.semantic === \"BUNDLE\");\n\n mediaGroups.forEach((mediaLines) => {\n const target = mediaLines[0];\n const m = target.match(/^m=([^ ]+) ([0-9]+) ([A-Z/]+) (.+)/);\n if (!m) {\n throw new Error(\"m line not found\");\n }\n\n const kind = m[1] as Kind;\n const fmt = m[4].split(\" \");\n // todo fix\n const fmtInt = [\"audio\", \"video\"].includes(kind)\n ? fmt.map((v) => Number(v))\n : undefined;\n\n const currentMedia = new MediaDescription(\n kind,\n Number.parseInt(m[2]),\n m[3],\n fmtInt || fmt,\n );\n currentMedia.dtlsParams = new RTCDtlsParameters(\n [...session.dtlsFingerprints],\n session.dtlsRole,\n );\n\n currentMedia.iceParams = new RTCIceParameters({\n iceLite: session.iceLite,\n usernameFragment: session.iceUsernameFragment,\n password: session.icePassword,\n });\n\n currentMedia.iceOptions = session.iceOptions;\n session.media.push(currentMedia);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"c=\")) {\n currentMedia.host = ipAddressFromSdp(line.slice(2));\n } else if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n\n switch (attr) {\n case \"candidate\":\n if (!value) throw new Error();\n currentMedia.iceCandidates.push(candidateFromSdp(value));\n break;\n case \"end-of-candidates\":\n currentMedia.iceCandidatesComplete = true;\n break;\n case \"extmap\":\n {\n // eslint-disable-next-line prefer-const\n let [extId, extUri] = value.split(\" \");\n if (extId.includes(\"/\")) {\n [extId] = extId.split(\"/\");\n }\n currentMedia.rtp.headerExtensions.push(\n new RTCRtpHeaderExtensionParameters({\n id: Number.parseInt(extId),\n uri: extUri,\n }),\n );\n }\n break;\n case \"fingerprint\":\n {\n if (!value) throw new Error();\n const [algorithm, fingerprint] = value.split(\" \");\n currentMedia.dtlsParams?.fingerprints.push(\n new RTCDtlsFingerprint(algorithm, fingerprint),\n );\n }\n break;\n case \"ice-options\":\n currentMedia.iceOptions = value;\n break;\n case \"ice-pwd\":\n currentMedia.iceParams!.password = value;\n break;\n case \"ice-ufrag\":\n currentMedia.iceParams!.usernameFragment = value;\n break;\n case \"ice-lite\":\n currentMedia.iceParams!.iceLite = true;\n break;\n case \"max-message-size\":\n currentMedia.sctpCapabilities = new RTCSctpCapabilities(\n Number.parseInt(value, 10),\n );\n break;\n case \"mid\":\n currentMedia.rtp.muxId = value;\n break;\n case \"msid\":\n currentMedia.msids.push(value);\n break;\n case \"rtcp\":\n {\n const [port, rest] = divide(value, \" \");\n currentMedia.rtcpPort = Number.parseInt(port);\n currentMedia.rtcpHost = ipAddressFromSdp(rest);\n }\n break;\n case \"rtcp-mux\":\n currentMedia.rtcpMux = true;\n break;\n case \"setup\":\n currentMedia.dtlsParams!.role = DTLS_SETUP_ROLE[value];\n break;\n case \"recvonly\":\n case \"sendonly\":\n case \"sendrecv\":\n case \"inactive\":\n currentMedia.direction = attr;\n break;\n case \"rtpmap\":\n {\n const [formatId, formatDesc] = divide(value, \" \");\n const [type, clock, channel] = formatDesc.split(\"/\");\n let channels: number | undefined;\n if (currentMedia.kind === \"audio\") {\n channels = channel ? Number.parseInt(channel) : 1;\n }\n const codec = new RTCRtpCodecParameters({\n mimeType: currentMedia.kind + \"/\" + type,\n channels,\n clockRate: Number.parseInt(clock),\n payloadType: Number.parseInt(formatId),\n });\n currentMedia.rtp.codecs.push(codec);\n }\n break;\n case \"sctpmap\":\n {\n if (!value) throw new Error();\n const [formatId, formatDesc] = divide(value, \" \");\n currentMedia.sctpMap[Number.parseInt(formatId)] = formatDesc;\n currentMedia.sctpPort = Number.parseInt(formatId);\n }\n break;\n case \"sctp-port\":\n if (!value) throw new Error();\n currentMedia.sctpPort = Number.parseInt(value);\n break;\n case \"ssrc\":\n {\n const [ssrcStr, ssrcDesc] = divide(value, \" \");\n const ssrc = Number.parseInt(ssrcStr);\n const [ssrcAttr, ssrcValue] = divide(ssrcDesc, \":\");\n let ssrcInfo = currentMedia.ssrc.find((v) => v.ssrc === ssrc);\n if (!ssrcInfo) {\n ssrcInfo = new SsrcDescription({ ssrc });\n currentMedia.ssrc.push(ssrcInfo);\n }\n if (SSRC_INFO_ATTRS.includes(ssrcAttr)) {\n ssrcInfo[ssrcAttr] = ssrcValue;\n }\n }\n break;\n case \"ssrc-group\":\n parseGroup(currentMedia.ssrcGroup, value);\n break;\n case \"rid\":\n {\n const [rid, direction] = divide(value, \" \");\n\n currentMedia.simulcastParameters.push(\n new RTCRtpSimulcastParameters({\n rid,\n direction: direction as any,\n }),\n );\n }\n break;\n }\n }\n });\n\n if (\n !currentMedia.iceParams.usernameFragment ||\n !currentMedia.iceParams.password\n ) {\n if (\n currentMedia.rtp.muxId &&\n bundle &&\n bundle.items.includes(currentMedia.rtp.muxId)\n ) {\n for (let i = 0; i < bundle.items.length; i++) {\n if (!bundle.items.includes(i.toString())) continue;\n const check = session.media[i];\n if (check.iceParams?.usernameFragment && check.iceParams.password) {\n currentMedia.iceParams = {\n ...check.iceParams,\n };\n break;\n }\n }\n }\n }\n\n if (!currentMedia.dtlsParams.role) {\n currentMedia.dtlsParams = undefined;\n }\n\n const findCodec = (pt: number) =>\n currentMedia.rtp.codecs.find((v) => v.payloadType === pt);\n\n mediaLines.slice(1).forEach((line) => {\n if (line.startsWith(\"a=\")) {\n const [attr, value] = parseAttr(line);\n if (attr === \"fmtp\") {\n const [formatId, formatDesc] = divide(value, \" \");\n const codec = findCodec(Number(formatId))!;\n codec.parameters = formatDesc;\n } else if (attr === \"rtcp-fb\") {\n const [payloadType, feedbackType, feedbackParam] = value.split(\" \");\n currentMedia.rtp.codecs.forEach((codec) => {\n if ([\"*\", codec.payloadType!.toString()].includes(payloadType)) {\n codec.rtcpFeedback.push(\n new RTCRtcpFeedback({\n type: feedbackType,\n parameter: feedbackParam,\n }),\n );\n }\n });\n }\n }\n });\n });\n\n return session;\n }\n\n webrtcTrackId(media: MediaDescription) {\n if (media.msid?.includes(\" \")) {\n const bits = media.msid.split(\" \");\n for (const group of this.msidSemantic) {\n if (\n group.semantic === \"WMS\" &&\n (group.items.includes(bits[0]) || group.items.includes(\"*\"))\n ) {\n return bits[1];\n }\n }\n }\n return;\n }\n\n get string() {\n const lines = [`v=${this.version}`, `o=${this.origin}`, `s=${this.name}`];\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n lines.push(`t=${this.time}`);\n this.group.forEach((group) => lines.push(`a=group:${group.str}`));\n if (this.extMapAllowMixed) {\n lines.push(`a=extmap-allow-mixed`);\n }\n this.msidSemantic.forEach((group) =>\n lines.push(`a=msid-semantic:${group.str}`),\n );\n const media = this.media.map((m) => m.toString()).join(\"\");\n const sdp = lines.join(\"\\r\\n\") + \"\\r\\n\" + media;\n return sdp;\n }\n\n toJSON() {\n const sdp = this.string;\n if (\n !this.cachedJson ||\n this.cachedJson.sdp !== sdp ||\n this.cachedJson.type !== this.type\n ) {\n this.cachedJson = new RTCSessionDescription(sdp, this.type);\n }\n return this.cachedJson;\n }\n\n toSdp() {\n return {\n type: this.type,\n sdp: this.string,\n };\n }\n}\n\nexport class MediaDescription {\n // rtp\n host?: string;\n direction?: MediaDirection;\n msids: string[] = [];\n\n // rtcp\n rtcpPort?: number;\n rtcpHost?: string;\n rtcpMux = false;\n\n // ssrc\n ssrc: SsrcDescription[] = [];\n ssrcGroup: GroupDescription[] = [];\n\n // formats\n rtp: RTCRtpParameters = { codecs: [], headerExtensions: [] };\n\n // sctp\n sctpCapabilities?: RTCSctpCapabilities;\n sctpMap: { [key: number]: string } = {};\n sctpPort?: number;\n\n // DTLS\n dtlsParams?: RTCDtlsParameters;\n\n // ICE\n iceParams?: RTCIceParameters;\n iceCandidates: IceCandidate[] = [];\n iceCandidatesComplete = false;\n iceOptions?: string;\n\n // Simulcast\n simulcastParameters: RTCRtpSimulcastParameters[] = [];\n\n constructor(\n public kind: Kind,\n public port: number,\n public profile: string,\n public fmt: string[] | number[],\n ) {}\n\n get msid() {\n return this.msids[0];\n }\n\n set msid(value: string | undefined) {\n this.msids = value ? [value] : [];\n }\n\n toString() {\n const lines: string[] = [];\n lines.push(\n `m=${this.kind} ${this.port} ${this.profile} ${(this.fmt as number[])\n .map((v) => v.toString())\n .join(\" \")}`,\n );\n if (this.host) {\n lines.push(`c=${ipAddressToSdp(this.host)}`);\n }\n // ice\n this.iceCandidates.forEach((candidate) => {\n lines.push(`a=candidate:${candidateToSdp(candidate)}`);\n });\n if (this.iceCandidatesComplete) {\n lines.push(\"a=end-of-candidates\");\n }\n if (this.iceParams?.usernameFragment) {\n lines.push(`a=ice-ufrag:${this.iceParams.usernameFragment}`);\n }\n if (this.iceParams?.password) {\n lines.push(`a=ice-pwd:${this.iceParams.password}`);\n }\n if (this.iceParams?.iceLite) {\n lines.push(`a=ice-lite`);\n }\n if (this.iceOptions) {\n lines.push(`a=ice-options:${this.iceOptions}`);\n }\n\n // dtls\n if (this.dtlsParams) {\n this.dtlsParams.fingerprints.forEach((fingerprint) => {\n lines.push(\n `a=fingerprint:${fingerprint.algorithm} ${fingerprint.value}`,\n );\n });\n lines.push(`a=setup:${DTLS_ROLE_SETUP[this.dtlsParams.role]}`);\n }\n\n if (this.direction) {\n lines.push(`a=${this.direction}`);\n }\n if (this.rtp.muxId) {\n lines.push(`a=mid:${this.rtp.muxId}`);\n }\n this.msids.forEach((msid) => lines.push(`a=msid:${msid}`));\n\n if (this.rtcpPort && this.rtcpHost) {\n lines.push(`a=rtcp:${this.rtcpPort} ${ipAddressToSdp(this.rtcpHost)}`);\n if (this.rtcpMux) {\n lines.push(\"a=rtcp-mux\");\n }\n }\n\n this.ssrcGroup.forEach((group) => {\n lines.push(`a=ssrc-group:${group.str}`);\n });\n this.ssrc.forEach((ssrcInfo) => {\n SSRC_INFO_ATTRS.forEach((ssrcAttr) => {\n const ssrcValue = ssrcInfo[ssrcAttr];\n if (ssrcValue !== undefined) {\n lines.push(`a=ssrc:${ssrcInfo.ssrc} ${ssrcAttr}:${ssrcValue}`);\n }\n });\n });\n\n this.rtp.codecs.forEach((codec) => {\n lines.push(`a=rtpmap:${codec.payloadType} ${codec.str}`);\n\n codec.rtcpFeedback.forEach((feedback) => {\n let value = feedback.type;\n if (feedback.parameter) value += ` ${feedback.parameter}`;\n lines.push(`a=rtcp-fb:${codec.payloadType} ${value}`);\n });\n\n if (codec.parameters) {\n lines.push(`a=fmtp:${codec.payloadType} ${codec.parameters}`);\n }\n });\n\n Object.keys(this.sctpMap).forEach((k) => {\n const v = this.sctpMap[Number(k)];\n lines.push(`a=sctpmap:${k} ${v}`);\n });\n if (this.sctpPort) {\n lines.push(`a=sctp-port:${this.sctpPort}`);\n }\n if (this.sctpCapabilities) {\n lines.push(`a=max-message-size:${this.sctpCapabilities.maxMessageSize}`);\n }\n\n // rtp extension\n this.rtp.headerExtensions.forEach((extension) =>\n lines.push(`a=extmap:${extension.id} ${extension.uri}`),\n );\n\n // simulcast\n if (this.simulcastParameters.length) {\n this.simulcastParameters.forEach((param) => {\n lines.push(`a=rid:${param.rid} ${param.direction}`);\n });\n let line = `a=simulcast:`;\n const recv = this.simulcastParameters.filter(\n (v) => v.direction === \"recv\",\n );\n if (recv.length) {\n line += `recv ${recv.map((v) => v.rid).join(\";\")} `;\n }\n const send = this.simulcastParameters.filter(\n (v) => v.direction === \"send\",\n );\n if (send.length) {\n line += `send ${send.map((v) => v.rid).join(\";\")}`;\n }\n\n lines.push(line);\n }\n\n return lines.join(\"\\r\\n\") + \"\\r\\n\";\n }\n}\n\nexport class GroupDescription {\n constructor(\n public semantic: string,\n public items: string[],\n ) {}\n\n get str() {\n return `${this.semantic} ${this.items.join(\" \")}`;\n }\n}\n\nfunction ipAddressFromSdp(sdp: string) {\n const m = sdp.match(/^IN (IP4|IP6) ([^ ]+)$/);\n if (!m) throw new Error(\"exception\");\n return m[2];\n}\n\nfunction ipAddressToSdp(addr: string) {\n const version = isIPv4(addr) ? 4 : 6;\n return `IN IP${version} ${addr}`;\n}\n\nexport function candidateToSdp(c: IceCandidate) {\n let sdp = `${c.foundation} ${c.component} ${c.protocol} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`;\n if (c.relatedAddress != undefined) {\n sdp += ` raddr ${c.relatedAddress}`;\n }\n if (c.relatedPort != undefined) {\n sdp += ` rport ${c.relatedPort}`;\n }\n if (c.tcpType != undefined) {\n sdp += ` tcptype ${c.tcpType}`;\n }\n if (c.generation != undefined) {\n sdp += ` generation ${c.generation}`;\n }\n if (c.ufrag != undefined) {\n sdp += ` ufrag ${c.ufrag}`;\n }\n\n return sdp;\n}\n\nfunction groupLines(sdp: string): [string[], string[][]] {\n const session: string[] = [];\n const media: string[][] = [];\n\n let lines = sdp.split(\"\\r\\n\");\n if (lines.length === 1) {\n lines = sdp.split(\"\\n\");\n }\n\n lines.forEach((line) => {\n if (line.startsWith(\"m=\")) {\n media.push([line]);\n } else if (media.length > 0) {\n media[media.length - 1].push(line);\n } else {\n session.push(line);\n }\n });\n\n return [session, media];\n}\n\nfunction parseAttr(line: string): [string, string] {\n if (line.includes(\":\")) {\n const bits = divide(line.slice(2), \":\");\n return [bits[0], bits[1]];\n } else {\n return [line.slice(2), undefined as any];\n }\n}\n\nexport function parseGroup(\n dest: GroupDescription[],\n value: string,\n type: (v: string) => any = (v) => v.toString(),\n) {\n const bits = value.split(\" \");\n if (bits.length > 0) {\n dest.push(new GroupDescription(bits[0], bits.slice(1).map(type)));\n }\n}\n\nexport function candidateFromSdp(sdp: string) {\n const ice = Candidate.fromSdp(sdp);\n const candidate = candidateFromIce(ice);\n return candidate;\n}\n\nexport class RTCSessionDescription {\n readonly sdp!: string;\n readonly type!: \"offer\" | \"answer\" | \"pranswer\";\n\n constructor(sdp: string, type: \"offer\" | \"answer\" | \"pranswer\") {\n Object.defineProperties(this, {\n sdp: {\n configurable: true,\n enumerable: true,\n value: sdp,\n writable: false,\n },\n type: {\n configurable: true,\n enumerable: true,\n value: type,\n writable: false,\n },\n });\n }\n\n static isThis(o: any) {\n if (typeof o?.sdp === \"string\") return true;\n }\n\n toSdp() {\n return {\n sdp: this.sdp,\n type: this.type,\n };\n }\n}\n\nexport function addSDPHeader(\n type: \"offer\" | \"answer\",\n description: SessionDescription,\n) {\n const username = \"-\";\n const sessionId = randomBytes(8).readBigUInt64BE(0).toString().slice(0, 8);\n const sessionVersion = 0;\n\n description.origin = `${username} ${sessionId} ${sessionVersion} IN IP4 0.0.0.0`;\n description.msidSemantic.push(new GroupDescription(\"WMS\", [\"*\"]));\n description.type = type;\n}\n\nexport function codecParametersFromString(str: string) {\n const parameters: any = {};\n str.split(\";\").forEach((param) => {\n if (param.length === 0) return;\n if (param.includes(\"=\")) {\n const [k, v] = divide(param, \"=\");\n if (FMTP_INT_PARAMETERS.includes(k)) {\n parameters[k] = Number(v);\n } else {\n parameters[k] = v;\n }\n } else if (param.includes(\":\")) {\n const [k, v] = param.split(\":\");\n parameters[k] = Number.isNaN(Number(v)) ? v : Number(v);\n } else {\n parameters[param] = undefined;\n }\n });\n return parameters;\n}\n\nexport function codecParametersToString(\n parameters: {\n [key: string]: string | number | undefined;\n },\n joint: string = \"=\",\n) {\n const params = Object.entries(parameters)\n .filter(([key, value]) => key.length > 0 && value !== undefined)\n .map(([key, value]) => `${key}${joint}${value}`);\n if (params.length > 0) {\n return params.join(\";\");\n }\n return undefined;\n}\n\nexport class SsrcDescription {\n ssrc!: number;\n cname?: string;\n msid?: string;\n msLabel?: string;\n label?: string;\n\n constructor(props: Partial<SsrcDescription>) {\n Object.assign(this, props);\n }\n}\n\nexport type BundlePolicy = \"max-compat\" | \"max-bundle\" | \"disable\";\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { RTCRtpTransceiver } from "./media";
2
+ import { type RTCRtpCodecParameters } from "./media/parameters";
2
3
  import type { MediaDirection } from "./media/rtpTransceiver";
3
4
  import { type BundlePolicy, GroupDescription, MediaDescription, SessionDescription } from "./sdp";
4
5
  import type { RTCDtlsTransport } from "./transport/dtls";
@@ -11,11 +12,13 @@ export declare class SDPManager {
11
12
  readonly cname: string;
12
13
  readonly midSuffix: boolean;
13
14
  readonly bundlePolicy?: BundlePolicy;
15
+ readonly mLineReuse: MLineReuse;
14
16
  private seenMid;
15
- constructor({ cname, midSuffix, bundlePolicy, }: {
17
+ constructor({ cname, midSuffix, bundlePolicy, mLineReuse, }: {
16
18
  cname: string;
17
19
  midSuffix?: boolean;
18
20
  bundlePolicy?: BundlePolicy;
21
+ mLineReuse?: MLineReuse;
19
22
  });
20
23
  get localDescription(): import("./sdp").RTCSessionDescription | undefined;
21
24
  get remoteDescription(): import("./sdp").RTCSessionDescription | undefined;
@@ -28,6 +31,17 @@ export declare class SDPManager {
28
31
  * MediaDescriptionをトランシーバー用に作成
29
32
  */
30
33
  createMediaDescriptionForTransceiver(transceiver: RTCRtpTransceiver, direction: MediaDirection): MediaDescription;
34
+ /**
35
+ * 拒否 / 停止した m-line を作成する (RFC 3264 §6 / RFC 8829 §5.3.1)。
36
+ * port は 0、proto と MID は元の m-line を保ち、fmt は少なくとも 1 token 残す。
37
+ */
38
+ createRejectedMediaDescription(source: {
39
+ kind: MediaDescription["kind"];
40
+ profile: string;
41
+ fmt: (string | number)[];
42
+ codecs: RTCRtpCodecParameters[];
43
+ mid?: string;
44
+ }, dtlsTransport?: RTCDtlsTransport): MediaDescription;
31
45
  /**
32
46
  * MediaDescriptionをSCTP用に作成
33
47
  */
@@ -51,6 +65,10 @@ export declare class SDPManager {
51
65
  * オファーSDPを構築
52
66
  */
53
67
  buildOfferSdp(transceivers: RTCRtpTransceiver[], sctpTransport: RTCSctpTransport | undefined): SessionDescription;
68
+ private liveTransportOr;
69
+ private findLiveDtlsTransport;
70
+ /**確定済み answer の BUNDLE tag (先頭 MID) */
71
+ get negotiatedBundleTag(): string | undefined;
54
72
  /**
55
73
  * アンサーSDPを構築
56
74
  */
@@ -59,6 +77,24 @@ export declare class SDPManager {
59
77
  sctpTransport: RTCSctpTransport | undefined;
60
78
  signalingState: string;
61
79
  }): SessionDescription;
80
+ /**
81
+ * RFC 8843 §7.3: offered BUNDLE group の member のうち受け入れた MID だけで
82
+ * answer の group を作る。確立済みの tag は保持し、初回 answer で
83
+ * offerer-tagged を拒否した場合は受け入れた先頭 member を answerer-tagged にする。
84
+ * 全 member を拒否した group は省略する。
85
+ */
86
+ private buildAnswerBundleGroups;
87
+ /**
88
+ * remote answer / pranswer を適用する前の検証。
89
+ * 非ゼロ port の RTP m-line が pending local offer と共通 codec を持たなければ拒否する。
90
+ */
91
+ private assertRemoteAnswerCodecs;
92
+ /**
93
+ * 確立済み BUNDLE の transport を共有している m-line を、re-offer が
94
+ * group の外へ出したり別々の group に分割したりすることはできない
95
+ * (共有 transport を分割できない)。状態を変更する前に拒否する。
96
+ */
97
+ private assertBundlePreserved;
62
98
  setLocalDescription(description: SessionDescription): void;
63
99
  setRemoteDescription(sessionDescription: RTCSessionDescriptionInit, signalingState: string): SessionDescription | undefined;
64
100
  rollbackLocalDescription(signalingState: string): void;
@@ -72,6 +108,7 @@ export declare class SDPManager {
72
108
  mid?: string;
73
109
  }): void;
74
110
  }
111
+ export type MLineReuse = "compatible" | "aggressive";
75
112
  export interface RTCSessionDescriptionInit {
76
113
  sdp?: string;
77
114
  type?: RTCSdpType;