werift 0.24.4 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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":"userMedia.js","sourceRoot":"","sources":["../../../../src/nonstandard/userMedia.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { homedir } from \"os\";\nimport { isAbsolute, resolve } from \"path\";\nimport { Readable } from \"stream\";\nimport { readFile } from \"fs/promises\";\nimport {\n setImmediate as onNextTurn,\n setTimeout as wait,\n} from \"timers/promises\";\n\nimport {\n BufferSource,\n EncodedPacketSink,\n Input,\n type InputAudioTrack,\n type InputTrack,\n type InputVideoTrack,\n MP4,\n WEBM,\n} from \"mediabunny\";\n\nimport { Event } from \"../imports/common\";\nimport type { RTCRtpCodecParameters } from \"../media/parameters\";\nimport { MediaStreamTrack } from \"../media/track\";\nimport { codecParametersFromString } from \"../sdp\";\nimport {\n type SupportedSourceCodec,\n createPacketizer,\n supportedSourceCodecs,\n toSupportedMimeType,\n} from \"./userMedia/packetizer\";\n\ntype UserMediaSource =\n | { path: string; buffer?: never; stream?: never }\n | {\n path?: never;\n buffer: Buffer | ArrayBuffer | ArrayBufferView;\n stream?: never;\n }\n | {\n path?: never;\n buffer?: never;\n stream: Readable | ReadableStream<Uint8Array>;\n };\n\nexport type FileMediaTrackSource = UserMediaSource & {\n loop?: boolean;\n};\n\nexport const getUserMedia = async (options: FileMediaTrackSource) => {\n assertSupportedOptions(options);\n const replayableSource = await createReplayableSource(options);\n const input = await createInput(replayableSource);\n try {\n if (!(await input.canRead())) {\n throw new Error(\"Only MP4 and WebM file playback is supported\");\n }\n\n const streamId = randomUUID().toString();\n const playbackTracks = await selectPlaybackTracks(input, streamId);\n if (playbackTracks.length === 0) {\n throw new Error(\n \"The media source does not contain playable audio or video tracks\",\n );\n }\n\n const mediaStartTimestamp = await input.getFirstTimestamp(\n playbackTracks.map(({ inputTrack }) => inputTrack),\n );\n\n return new MediaPlayer({\n source: replayableSource,\n loop: options.loop ?? false,\n streamId,\n session: createPlaybackSession({\n input,\n mediaStartTimestamp,\n playbackTracks,\n }),\n });\n } catch (error) {\n input.dispose();\n throw error;\n }\n};\n\nclass MediaPlayer {\n readonly audio?: MediaStreamTrack;\n readonly video?: MediaStreamTrack;\n readonly onError = new Event<[Error]>();\n\n private readonly source: ReplayableUserMediaSource;\n private readonly loop: boolean;\n private readonly streamId: string;\n private session?: PlaybackSession;\n private running?: Promise<void>;\n private abortController?: AbortController;\n private hasStartedPlayback = false;\n private stopped = false;\n\n constructor({\n source,\n loop,\n streamId,\n session,\n }: {\n source: ReplayableUserMediaSource;\n loop: boolean;\n streamId: string;\n session: PlaybackSession;\n }) {\n this.source = source;\n this.loop = loop;\n this.streamId = streamId;\n this.session = session;\n\n this.audio = session.playbackTracks.find(\n ({ track }) => track.kind === \"audio\",\n )?.track;\n this.video = session.playbackTracks.find(\n ({ track }) => track.kind === \"video\",\n )?.track;\n }\n\n async start() {\n if (this.stopped) {\n throw new Error(\"The media source has already been stopped\");\n }\n if (this.running) {\n return;\n }\n\n const abortController = new AbortController();\n this.abortController = abortController;\n\n let startupPending = true;\n let session: PlaybackSession | undefined;\n const playback = (async () => {\n session = await this.getOrCreateSession();\n if (abortController.signal.aborted || this.stopped) {\n return;\n }\n\n session.runners.forEach((runner) => runner.assertReady());\n\n const initialSourceChanged = this.hasStartedPlayback;\n this.hasStartedPlayback = true;\n await this.run(session, abortController, initialSourceChanged);\n })();\n const observedPlayback = playback.catch((error) => {\n if (abortController.signal.aborted) {\n return;\n }\n\n this.onError.execute(toError(error));\n if (startupPending) {\n throw error;\n }\n });\n\n this.running = observedPlayback.finally(() => {\n if (this.abortController === abortController) {\n this.abortController = undefined;\n }\n this.running = undefined;\n this.disposeSession(session);\n });\n\n try {\n await Promise.race([this.running, onNextTurn()]);\n } finally {\n startupPending = false;\n }\n }\n\n stop() {\n if (this.stopped) {\n return;\n }\n // File playback mirrors the previous process-backed behavior: stop() is terminal.\n this.stopped = true;\n this.abortController?.abort();\n if (!this.running) {\n this.disposeSession();\n }\n }\n\n private async run(\n session: PlaybackSession,\n abortController: AbortController,\n initialSourceChanged: boolean,\n ) {\n let sourceChanged = initialSourceChanged;\n\n do {\n const startedAt = performance.now();\n await Promise.all(\n session.runners.map((runner) =>\n runner.play({\n startedAt,\n signal: abortController.signal,\n sourceChanged,\n }),\n ),\n );\n if (!this.loop || abortController.signal.aborted) {\n break;\n }\n sourceChanged = true;\n } while (!abortController.signal.aborted);\n }\n\n private async getOrCreateSession() {\n if (this.session) {\n return this.session;\n }\n\n const input = await createInput(this.source);\n try {\n if (!(await input.canRead())) {\n throw new Error(\"Only MP4 and WebM file playback is supported\");\n }\n\n const playbackTracks = await selectPlaybackTracks(\n input,\n this.streamId,\n buildExistingTrackMap(this.audio, this.video),\n );\n const mediaStartTimestamp = await input.getFirstTimestamp(\n playbackTracks.map(({ inputTrack }) => inputTrack),\n );\n\n const session = createPlaybackSession({\n input,\n mediaStartTimestamp,\n playbackTracks,\n });\n this.session = session;\n return session;\n } catch (error) {\n input.dispose();\n throw error;\n }\n }\n\n private disposeSession(session = this.session) {\n if (!session) {\n return;\n }\n\n session.input.dispose();\n if (this.session === session) {\n this.session = undefined;\n }\n }\n}\n\nclass TrackPlaybackRunner {\n constructor(\n private readonly props: PlaybackTrack & {\n mediaStartTimestamp: number;\n },\n ) {}\n\n async play({\n startedAt,\n signal,\n sourceChanged,\n }: {\n startedAt: number;\n signal: AbortSignal;\n sourceChanged: boolean;\n }) {\n const codec = this.requireNegotiatedCodec();\n const packetizer = createPacketizer({\n codec,\n sourceCodec: this.props.sourceCodec,\n decoderDescription: this.props.decoderDescription,\n });\n const packetSink = new EncodedPacketSink(this.props.inputTrack);\n let sourceChangeNotified = false;\n\n try {\n for await (const packet of packetSink.packets(undefined, undefined, {\n verifyKeyPackets: this.props.track.kind === \"video\",\n })) {\n signal.throwIfAborted?.();\n\n const dueAtMs =\n (packet.timestamp - this.props.mediaStartTimestamp) * 1_000;\n const remainingMs = dueAtMs - (performance.now() - startedAt);\n if (remainingMs > 0) {\n await wait(remainingMs, undefined, { signal });\n }\n\n const rtpTimestamp = toRtpTimestamp(\n packet.timestamp,\n this.props.mediaStartTimestamp,\n codec.clockRate,\n );\n const packets = packetizer.packetize(packet, rtpTimestamp);\n if (packets.length === 0) {\n continue;\n }\n\n if (sourceChanged && !sourceChangeNotified) {\n this.props.track.onSourceChanged.execute(packets[0].header);\n sourceChangeNotified = true;\n }\n\n for (const rtpPacket of packets) {\n this.props.track.writeRtp(rtpPacket);\n }\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n return;\n }\n throw error;\n }\n }\n\n assertReady() {\n const codec = this.requireNegotiatedCodec();\n createPacketizer({\n codec,\n sourceCodec: this.props.sourceCodec,\n decoderDescription: this.props.decoderDescription,\n });\n }\n\n private requireNegotiatedCodec() {\n const codec = this.props.track.codec;\n if (!codec) {\n throw new Error(\n `Cannot start ${this.props.track.kind} playback before the track is attached to an RTCRtpSender`,\n );\n }\n\n const expectedMimeType = toSupportedMimeType(this.props.sourceCodec);\n const negotiatedMimeType = normalizeMimeType(codec.mimeType);\n if (negotiatedMimeType !== expectedMimeType) {\n throw new Error(\n `Input ${this.props.track.kind} codec ${expectedMimeType} does not match negotiated codec ${codec.mimeType}`,\n );\n }\n\n const expectedClockRate =\n this.props.track.kind === \"audio\" ? 48_000 : 90_000;\n if (codec.clockRate !== expectedClockRate) {\n throw new Error(\n `Input ${this.props.track.kind} clock rate ${expectedClockRate} does not match negotiated clock rate ${codec.clockRate}`,\n );\n }\n\n assertCodecParameters({\n trackKind: this.props.track.kind === \"audio\" ? \"audio\" : \"video\",\n codec,\n sourceCodec: this.props.sourceCodec,\n decoderDescription: this.props.decoderDescription,\n sourceChannels: this.props.sourceChannels,\n });\n\n return codec;\n }\n}\n\ninterface PlaybackTrack {\n inputTrack: InputTrack;\n track: MediaStreamTrack;\n sourceCodec: SupportedSourceCodec;\n decoderDescription?: ArrayBuffer | ArrayBufferView | null;\n sourceChannels?: number;\n}\n\ninterface PlaybackSession {\n input: Input;\n mediaStartTimestamp: number;\n playbackTracks: PlaybackTrack[];\n runners: TrackPlaybackRunner[];\n}\n\nasync function selectPlaybackTracks(\n input: Input,\n streamId: string,\n existingTracks: Partial<Record<\"audio\" | \"video\", MediaStreamTrack>> = {},\n) {\n const primaryVideoTrack = await input.getPrimaryVideoTrack();\n const primaryAudioTrack = primaryVideoTrack\n ? ((await primaryVideoTrack.getPrimaryPairableAudioTrack()) ??\n (await input.getPrimaryAudioTrack()))\n : await input.getPrimaryAudioTrack();\n\n const playbackTracks: PlaybackTrack[] = [];\n if (primaryAudioTrack) {\n playbackTracks.push(\n await createPlaybackTrack(\n primaryAudioTrack,\n streamId,\n existingTracks.audio,\n ),\n );\n }\n if (primaryVideoTrack) {\n playbackTracks.push(\n await createPlaybackTrack(\n primaryVideoTrack,\n streamId,\n existingTracks.video,\n ),\n );\n }\n\n if (!primaryVideoTrack && !primaryAudioTrack) {\n const fallbackAudioTrack = await input.getPrimaryAudioTrack();\n if (fallbackAudioTrack) {\n playbackTracks.push(\n await createPlaybackTrack(\n fallbackAudioTrack,\n streamId,\n existingTracks.audio,\n ),\n );\n }\n }\n\n return playbackTracks;\n}\n\nasync function createPlaybackTrack(\n inputTrack: InputAudioTrack | InputVideoTrack,\n streamId: string,\n track?: MediaStreamTrack,\n): Promise<PlaybackTrack> {\n const sourceCodec = await requireSupportedCodec(inputTrack);\n const decoderConfig = await inputTrack.getDecoderConfig();\n const kind = inputTrack.isAudioTrack() ? \"audio\" : \"video\";\n\n return {\n inputTrack,\n sourceCodec,\n decoderDescription:\n decoderConfig && \"description\" in decoderConfig\n ? (decoderConfig.description ?? null)\n : null,\n sourceChannels:\n decoderConfig && \"numberOfChannels\" in decoderConfig\n ? decoderConfig.numberOfChannels\n : undefined,\n track:\n track ??\n new MediaStreamTrack({\n kind,\n streamId,\n }),\n };\n}\n\nasync function requireSupportedCodec(inputTrack: InputTrack) {\n const codec = await inputTrack.getCodec();\n if (codec && supportedSourceCodecs.includes(codec as SupportedSourceCodec)) {\n return codec as SupportedSourceCodec;\n }\n\n const codecLabel =\n codec ??\n (await inputTrack.getCodecParameterString()) ??\n String((await inputTrack.getInternalCodecId()) ?? \"unknown\");\n\n throw new Error(\n `Unsupported ${inputTrack.type} codec \"${codecLabel}\". File playback supports H264, VP8, VP9, AV1, and Opus only.`,\n );\n}\n\ntype ReplayableUserMediaSource =\n | { path: string; buffer?: never }\n | { path?: never; buffer: Buffer };\n\nasync function createReplayableSource(\n options: UserMediaSource,\n): Promise<ReplayableUserMediaSource> {\n if (typeof options.path === \"string\") {\n return { path: options.path };\n }\n\n const buffer =\n options.buffer != undefined\n ? toBuffer(options.buffer)\n : await readStreamToBuffer(options.stream);\n\n return { buffer };\n}\n\nasync function createInput(options: ReplayableUserMediaSource) {\n if (typeof options.path === \"string\") {\n const buffer = await readFile(resolveUserMediaPath(options.path));\n return new Input({\n source: new BufferSource(buffer),\n formats: [MP4, WEBM],\n });\n }\n\n return new Input({\n source: new BufferSource(options.buffer),\n formats: [MP4, WEBM],\n });\n}\n\nfunction resolveUserMediaPath(path: string) {\n if (path === \"~\") {\n return homedir();\n }\n if (path.startsWith(\"~/\")) {\n return resolve(homedir(), path.slice(2));\n }\n return isAbsolute(path) ? path : resolve(path);\n}\n\nasync function readStreamToBuffer(\n stream: Readable | ReadableStream<Uint8Array>,\n) {\n const chunks: Buffer[] = [];\n\n if (stream instanceof Readable) {\n for await (const chunk of stream) {\n chunks.push(toBuffer(chunk));\n }\n return Buffer.concat(chunks);\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value) {\n chunks.push(\n Buffer.from(value.buffer, value.byteOffset, value.byteLength),\n );\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return Buffer.concat(chunks);\n}\n\nfunction toBuffer(value: Buffer | ArrayBuffer | ArrayBufferView | string) {\n if (Buffer.isBuffer(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n return Buffer.from(value);\n }\n if (ArrayBuffer.isView(value)) {\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n }\n return Buffer.from(new Uint8Array(value));\n}\n\nfunction normalizeMimeType(mimeType: string) {\n return mimeType.toLowerCase();\n}\n\nfunction assertSupportedOptions(options: FileMediaTrackSource) {\n const legacyOptions = options as FileMediaTrackSource & {\n width?: unknown;\n height?: unknown;\n };\n\n if (legacyOptions.width != undefined || legacyOptions.height != undefined) {\n throw new Error(\n \"getUserMedia({ width, height }) is no longer supported for file playback. Resize or re-encode the source before calling getUserMedia().\",\n );\n }\n}\n\nfunction createPlaybackSession({\n input,\n mediaStartTimestamp,\n playbackTracks,\n}: {\n input: Input;\n mediaStartTimestamp: number;\n playbackTracks: PlaybackTrack[];\n}): PlaybackSession {\n return {\n input,\n mediaStartTimestamp,\n playbackTracks,\n runners: playbackTracks.map(\n (playbackTrack) =>\n new TrackPlaybackRunner({\n mediaStartTimestamp,\n ...playbackTrack,\n }),\n ),\n };\n}\n\nfunction buildExistingTrackMap(\n audio?: MediaStreamTrack,\n video?: MediaStreamTrack,\n): Partial<Record<\"audio\" | \"video\", MediaStreamTrack>> {\n return {\n ...(audio ? { audio } : {}),\n ...(video ? { video } : {}),\n };\n}\n\nfunction assertCodecParameters({\n trackKind,\n codec,\n sourceCodec,\n decoderDescription,\n sourceChannels,\n}: {\n trackKind: \"audio\" | \"video\";\n codec: RTCRtpCodecParameters;\n sourceCodec: SupportedSourceCodec;\n decoderDescription?: ArrayBuffer | ArrayBufferView | null;\n sourceChannels?: number;\n}) {\n if (sourceCodec === \"opus\" && sourceChannels && codec.channels != undefined) {\n if (codec.channels !== sourceChannels) {\n throw new Error(\n `Input ${trackKind} channels ${sourceChannels} do not match negotiated channels ${codec.channels}`,\n );\n }\n return;\n }\n\n if (sourceCodec !== \"avc\") {\n // mediabunny exposes codec-specific decoder configuration for H264 only here.\n return;\n }\n\n const negotiatedParameters = codecParametersFromString(\n codec.parameters ?? \"\",\n );\n const negotiatedPacketizationMode = Number(\n negotiatedParameters[\"packetization-mode\"] ?? 1,\n );\n if (negotiatedPacketizationMode !== 1) {\n throw new Error(\n `Input ${trackKind} packetization-mode 1 does not match negotiated packetization-mode ${negotiatedPacketizationMode}`,\n );\n }\n\n const sourceProfileLevelId = getH264ProfileLevelId(decoderDescription);\n const negotiatedProfileLevelId = normalizeOptionalHexParameter(\n negotiatedParameters[\"profile-level-id\"],\n );\n\n if (!sourceProfileLevelId) {\n return;\n }\n\n if (!negotiatedProfileLevelId) {\n throw new Error(\n `Input ${trackKind} profile-level-id ${sourceProfileLevelId} does not match negotiated profile-level-id <missing>`,\n );\n }\n\n if (sourceProfileLevelId !== negotiatedProfileLevelId) {\n throw new Error(\n `Input ${trackKind} profile-level-id ${sourceProfileLevelId} does not match negotiated profile-level-id ${negotiatedProfileLevelId}`,\n );\n }\n}\n\nfunction getH264ProfileLevelId(\n decoderDescription?: ArrayBuffer | ArrayBufferView | null,\n) {\n if (!decoderDescription) {\n return undefined;\n }\n\n const description = toDescriptionBuffer(decoderDescription);\n if (description.length < 4) {\n throw new Error(\"invalid H264 decoder configuration\");\n }\n\n return description.subarray(1, 4).toString(\"hex\");\n}\n\nfunction normalizeOptionalHexParameter(value: unknown) {\n return typeof value === \"string\" ? value.toLowerCase() : undefined;\n}\n\nfunction toRtpTimestamp(\n packetTimestamp: number,\n mediaStartTimestamp: number,\n clockRate: number,\n) {\n const relativeSeconds = Math.max(0, packetTimestamp - mediaStartTimestamp);\n return Math.round(relativeSeconds * clockRate) >>> 0;\n}\n\nfunction isAbortError(error: unknown) {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" ||\n error.message === \"The operation was aborted\")\n );\n}\n\nfunction toError(error: unknown) {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction toDescriptionBuffer(\n decoderDescription: ArrayBuffer | ArrayBufferView,\n) {\n if (ArrayBuffer.isView(decoderDescription)) {\n return Buffer.from(\n decoderDescription.buffer,\n decoderDescription.byteOffset,\n decoderDescription.byteLength,\n );\n }\n\n return Buffer.from(decoderDescription);\n}\n"]}
1
+ {"version":3,"file":"userMedia.js","sourceRoot":"","sources":["../../../../src/nonstandard/userMedia.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { homedir } from \"os\";\nimport { isAbsolute, resolve } from \"path\";\nimport { Readable } from \"stream\";\nimport { readFile } from \"fs/promises\";\nimport {\n setImmediate as onNextTurn,\n setTimeout as wait,\n} from \"timers/promises\";\n\nimport {\n BufferSource,\n EncodedPacketSink,\n Input,\n type InputAudioTrack,\n type InputTrack,\n type InputVideoTrack,\n MP4,\n WEBM,\n} from \"mediabunny\";\n\nimport { Event } from \"../imports/common\";\nimport { useAV1X, useH264, useOPUS, useVP8, useVP9 } from \"../media/codec\";\nimport type { RTCRtpCodecParameters } from \"../media/parameters\";\nimport { MediaStreamTrack } from \"../media/track\";\nimport { codecParametersFromString } from \"../sdp\";\nimport {\n type SupportedSourceCodec,\n createPacketizer,\n supportedSourceCodecs,\n toSupportedMimeType,\n} from \"./userMedia/packetizer\";\n\ntype UserMediaSource =\n | { path: string; buffer?: never; stream?: never }\n | {\n path?: never;\n buffer: Buffer | ArrayBuffer | ArrayBufferView;\n stream?: never;\n }\n | {\n path?: never;\n buffer?: never;\n stream: Readable | ReadableStream<Uint8Array>;\n };\n\nexport type FileMediaTrackSource = UserMediaSource & {\n loop?: boolean;\n};\n\nexport const createFileMediaPlayer = async (options: FileMediaTrackSource) => {\n assertSupportedOptions(options);\n const replayableSource = await createReplayableSource(options);\n const input = await createInput(replayableSource);\n try {\n if (!(await input.canRead())) {\n throw new Error(\"Only MP4 and WebM file playback is supported\");\n }\n\n const streamId = randomUUID().toString();\n const playbackTracks = await selectPlaybackTracks(input, streamId);\n if (playbackTracks.length === 0) {\n throw new Error(\n \"The media source does not contain playable audio or video tracks\",\n );\n }\n\n const mediaStartTimestamp = await input.getFirstTimestamp(\n playbackTracks.map(({ inputTrack }) => inputTrack),\n );\n\n return new MediaPlayer({\n source: replayableSource,\n loop: options.loop ?? false,\n streamId,\n session: createPlaybackSession({\n input,\n mediaStartTimestamp,\n playbackTracks,\n }),\n });\n } catch (error) {\n input.dispose();\n throw error;\n }\n};\n\nclass MediaPlayer {\n readonly audio?: MediaStreamTrack;\n readonly video?: MediaStreamTrack;\n readonly onError = new Event<[Error]>();\n\n private readonly source: ReplayableUserMediaSource;\n private readonly loop: boolean;\n private readonly streamId: string;\n private session?: PlaybackSession;\n private running?: Promise<void>;\n private abortController?: AbortController;\n private hasStartedPlayback = false;\n private stopped = false;\n\n constructor({\n source,\n loop,\n streamId,\n session,\n }: {\n source: ReplayableUserMediaSource;\n loop: boolean;\n streamId: string;\n session: PlaybackSession;\n }) {\n this.source = source;\n this.loop = loop;\n this.streamId = streamId;\n this.session = session;\n\n this.audio = session.playbackTracks.find(\n ({ track }) => track.kind === \"audio\",\n )?.track;\n this.video = session.playbackTracks.find(\n ({ track }) => track.kind === \"video\",\n )?.track;\n }\n\n async start() {\n if (this.stopped) {\n throw new Error(\"The media source has already been stopped\");\n }\n if (this.running) {\n return;\n }\n\n const abortController = new AbortController();\n this.abortController = abortController;\n\n let startupPending = true;\n let session: PlaybackSession | undefined;\n const playback = (async () => {\n session = await this.getOrCreateSession();\n if (abortController.signal.aborted || this.stopped) {\n return;\n }\n\n const initialSourceChanged = this.hasStartedPlayback;\n this.hasStartedPlayback = true;\n await this.run(session, abortController, initialSourceChanged);\n })();\n const observedPlayback = playback.catch((error) => {\n if (abortController.signal.aborted) {\n return;\n }\n\n this.onError.execute(toError(error));\n if (startupPending) {\n throw error;\n }\n });\n\n this.running = observedPlayback.finally(() => {\n if (this.abortController === abortController) {\n this.abortController = undefined;\n }\n this.running = undefined;\n this.disposeSession(session);\n });\n\n try {\n await Promise.race([this.running, onNextTurn()]);\n } finally {\n startupPending = false;\n }\n }\n\n stop() {\n if (this.stopped) {\n return;\n }\n // File playback mirrors the previous process-backed behavior: stop() is terminal.\n this.stopped = true;\n this.abortController?.abort();\n if (!this.running) {\n this.disposeSession();\n }\n }\n\n private async run(\n session: PlaybackSession,\n abortController: AbortController,\n initialSourceChanged: boolean,\n ) {\n let sourceChanged = initialSourceChanged;\n\n do {\n const startedAt = performance.now();\n await Promise.all(\n session.runners.map((runner) =>\n runner.play({\n startedAt,\n signal: abortController.signal,\n sourceChanged,\n }),\n ),\n );\n if (!this.loop || abortController.signal.aborted) {\n break;\n }\n sourceChanged = true;\n } while (!abortController.signal.aborted);\n }\n\n private async getOrCreateSession() {\n if (this.session) {\n return this.session;\n }\n\n const input = await createInput(this.source);\n try {\n if (!(await input.canRead())) {\n throw new Error(\"Only MP4 and WebM file playback is supported\");\n }\n\n const playbackTracks = await selectPlaybackTracks(\n input,\n this.streamId,\n buildExistingTrackMap(this.audio, this.video),\n );\n const mediaStartTimestamp = await input.getFirstTimestamp(\n playbackTracks.map(({ inputTrack }) => inputTrack),\n );\n\n const session = createPlaybackSession({\n input,\n mediaStartTimestamp,\n playbackTracks,\n });\n this.session = session;\n return session;\n } catch (error) {\n input.dispose();\n throw error;\n }\n }\n\n private disposeSession(session = this.session) {\n if (!session) {\n return;\n }\n\n session.input.dispose();\n if (this.session === session) {\n this.session = undefined;\n }\n }\n}\n\nclass TrackPlaybackRunner {\n constructor(\n private readonly props: PlaybackTrack & {\n mediaStartTimestamp: number;\n },\n ) {}\n\n async play({\n startedAt,\n signal,\n sourceChanged,\n }: {\n startedAt: number;\n signal: AbortSignal;\n sourceChanged: boolean;\n }) {\n const codec = this.requireNegotiatedCodec();\n const packetizer = createPacketizer({\n codec,\n sourceCodec: this.props.sourceCodec,\n decoderDescription: this.props.decoderDescription,\n });\n const packetSink = new EncodedPacketSink(this.props.inputTrack);\n let sourceChangeNotified = false;\n\n try {\n for await (const packet of packetSink.packets(undefined, undefined, {\n verifyKeyPackets: this.props.track.kind === \"video\",\n })) {\n signal.throwIfAborted?.();\n\n const dueAtMs =\n (packet.timestamp - this.props.mediaStartTimestamp) * 1_000;\n const remainingMs = dueAtMs - (performance.now() - startedAt);\n if (remainingMs > 0) {\n await wait(remainingMs, undefined, { signal });\n }\n\n const rtpTimestamp = toRtpTimestamp(\n packet.timestamp,\n this.props.mediaStartTimestamp,\n codec.clockRate,\n );\n const packets = packetizer.packetize(packet, rtpTimestamp);\n if (packets.length === 0) {\n continue;\n }\n\n if (sourceChanged && !sourceChangeNotified) {\n this.props.track.notifySourceChanged(packets[0].header);\n sourceChangeNotified = true;\n }\n\n for (const rtpPacket of packets) {\n this.props.track.writeRtp(rtpPacket);\n }\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n return;\n }\n throw error;\n }\n }\n\n private requireNegotiatedCodec() {\n const codec = this.props.track.codec;\n if (!codec) {\n throw new Error(\n `Cannot start ${this.props.track.kind} playback before the track is attached to an RTCRtpSender`,\n );\n }\n\n const expectedMimeType = toSupportedMimeType(this.props.sourceCodec);\n const negotiatedMimeType = normalizeMimeType(codec.mimeType);\n if (negotiatedMimeType !== expectedMimeType) {\n throw new Error(\n `Input ${this.props.track.kind} codec ${expectedMimeType} does not match negotiated codec ${codec.mimeType}`,\n );\n }\n\n const expectedClockRate =\n this.props.track.kind === \"audio\" ? 48_000 : 90_000;\n if (codec.clockRate !== expectedClockRate) {\n throw new Error(\n `Input ${this.props.track.kind} clock rate ${expectedClockRate} does not match negotiated clock rate ${codec.clockRate}`,\n );\n }\n\n assertCodecParameters({\n trackKind: this.props.track.kind === \"audio\" ? \"audio\" : \"video\",\n codec,\n sourceCodec: this.props.sourceCodec,\n decoderDescription: this.props.decoderDescription,\n sourceChannels: this.props.sourceChannels,\n });\n\n return codec;\n }\n}\n\ninterface PlaybackTrack {\n inputTrack: InputTrack;\n track: MediaStreamTrack;\n sourceCodec: SupportedSourceCodec;\n decoderDescription?: ArrayBuffer | ArrayBufferView | null;\n sourceChannels?: number;\n}\n\ninterface PlaybackSession {\n input: Input;\n mediaStartTimestamp: number;\n playbackTracks: PlaybackTrack[];\n runners: TrackPlaybackRunner[];\n}\n\nasync function selectPlaybackTracks(\n input: Input,\n streamId: string,\n existingTracks: Partial<Record<\"audio\" | \"video\", MediaStreamTrack>> = {},\n) {\n const primaryVideoTrack = await input.getPrimaryVideoTrack();\n const primaryAudioTrack = primaryVideoTrack\n ? ((await primaryVideoTrack.getPrimaryPairableAudioTrack()) ??\n (await input.getPrimaryAudioTrack()))\n : await input.getPrimaryAudioTrack();\n\n const playbackTracks: PlaybackTrack[] = [];\n if (primaryAudioTrack) {\n playbackTracks.push(\n await createPlaybackTrack(\n primaryAudioTrack,\n streamId,\n existingTracks.audio,\n ),\n );\n }\n if (primaryVideoTrack) {\n playbackTracks.push(\n await createPlaybackTrack(\n primaryVideoTrack,\n streamId,\n existingTracks.video,\n ),\n );\n }\n\n if (!primaryVideoTrack && !primaryAudioTrack) {\n const fallbackAudioTrack = await input.getPrimaryAudioTrack();\n if (fallbackAudioTrack) {\n playbackTracks.push(\n await createPlaybackTrack(\n fallbackAudioTrack,\n streamId,\n existingTracks.audio,\n ),\n );\n }\n }\n\n return playbackTracks;\n}\n\nasync function createPlaybackTrack(\n inputTrack: InputAudioTrack | InputVideoTrack,\n streamId: string,\n track?: MediaStreamTrack,\n): Promise<PlaybackTrack> {\n const sourceCodec = await requireSupportedCodec(inputTrack);\n const decoderConfig = await inputTrack.getDecoderConfig();\n const kind = inputTrack.isAudioTrack() ? \"audio\" : \"video\";\n\n return {\n inputTrack,\n sourceCodec,\n decoderDescription:\n decoderConfig && \"description\" in decoderConfig\n ? (decoderConfig.description ?? null)\n : null,\n sourceChannels:\n decoderConfig && \"numberOfChannels\" in decoderConfig\n ? decoderConfig.numberOfChannels\n : undefined,\n track:\n track ??\n new MediaStreamTrack({\n kind,\n streamId,\n codec: codecParametersForSource(\n sourceCodec,\n decoderConfig && \"description\" in decoderConfig\n ? (decoderConfig.description ?? null)\n : null,\n ),\n }),\n };\n}\n\nfunction codecParametersForSource(\n sourceCodec: SupportedSourceCodec,\n decoderDescription?: ArrayBuffer | ArrayBufferView | null,\n) {\n switch (sourceCodec) {\n case \"avc\": {\n const profileLevelId = getH264ProfileLevelId(decoderDescription);\n if (!profileLevelId) {\n return useH264();\n }\n return useH264({\n parameters: `profile-level-id=${profileLevelId};packetization-mode=1;level-asymmetry-allowed=1`,\n });\n }\n case \"vp8\":\n return useVP8();\n case \"vp9\":\n return useVP9();\n case \"av1\":\n return useAV1X();\n case \"opus\":\n return useOPUS();\n }\n}\n\nasync function requireSupportedCodec(inputTrack: InputTrack) {\n const codec = await inputTrack.getCodec();\n if (codec && supportedSourceCodecs.includes(codec as SupportedSourceCodec)) {\n return codec as SupportedSourceCodec;\n }\n\n const codecLabel =\n codec ??\n (await inputTrack.getCodecParameterString()) ??\n String((await inputTrack.getInternalCodecId()) ?? \"unknown\");\n\n throw new Error(\n `Unsupported ${inputTrack.type} codec \"${codecLabel}\". File playback supports H264, VP8, VP9, AV1, and Opus only.`,\n );\n}\n\ntype ReplayableUserMediaSource =\n | { path: string; buffer?: never }\n | { path?: never; buffer: Buffer };\n\nasync function createReplayableSource(\n options: UserMediaSource,\n): Promise<ReplayableUserMediaSource> {\n if (typeof options.path === \"string\") {\n return { path: options.path };\n }\n\n const buffer =\n options.buffer != undefined\n ? toBuffer(options.buffer)\n : await readStreamToBuffer(options.stream);\n\n return { buffer };\n}\n\nasync function createInput(options: ReplayableUserMediaSource) {\n if (typeof options.path === \"string\") {\n const buffer = await readFile(resolveUserMediaPath(options.path));\n return new Input({\n source: new BufferSource(buffer),\n formats: [MP4, WEBM],\n });\n }\n\n return new Input({\n source: new BufferSource(options.buffer),\n formats: [MP4, WEBM],\n });\n}\n\nfunction resolveUserMediaPath(path: string) {\n if (path === \"~\") {\n return homedir();\n }\n if (path.startsWith(\"~/\")) {\n return resolve(homedir(), path.slice(2));\n }\n return isAbsolute(path) ? path : resolve(path);\n}\n\nasync function readStreamToBuffer(\n stream: Readable | ReadableStream<Uint8Array>,\n) {\n const chunks: Buffer[] = [];\n\n if (stream instanceof Readable) {\n for await (const chunk of stream) {\n chunks.push(toBuffer(chunk));\n }\n return Buffer.concat(chunks);\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value) {\n chunks.push(\n Buffer.from(value.buffer, value.byteOffset, value.byteLength),\n );\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return Buffer.concat(chunks);\n}\n\nfunction toBuffer(value: Buffer | ArrayBuffer | ArrayBufferView | string) {\n if (Buffer.isBuffer(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n return Buffer.from(value);\n }\n if (ArrayBuffer.isView(value)) {\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n }\n return Buffer.from(new Uint8Array(value));\n}\n\nfunction normalizeMimeType(mimeType: string) {\n return mimeType.toLowerCase();\n}\n\nfunction assertSupportedOptions(options: FileMediaTrackSource) {\n const legacyOptions = options as FileMediaTrackSource & {\n width?: unknown;\n height?: unknown;\n };\n\n if (legacyOptions.width != undefined || legacyOptions.height != undefined) {\n throw new Error(\n \"File playback no longer accepts { width, height }. Resize or re-encode the source before creating the mp4/webm register.\",\n );\n }\n}\n\nfunction createPlaybackSession({\n input,\n mediaStartTimestamp,\n playbackTracks,\n}: {\n input: Input;\n mediaStartTimestamp: number;\n playbackTracks: PlaybackTrack[];\n}): PlaybackSession {\n return {\n input,\n mediaStartTimestamp,\n playbackTracks,\n runners: playbackTracks.map(\n (playbackTrack) =>\n new TrackPlaybackRunner({\n mediaStartTimestamp,\n ...playbackTrack,\n }),\n ),\n };\n}\n\nfunction buildExistingTrackMap(\n audio?: MediaStreamTrack,\n video?: MediaStreamTrack,\n): Partial<Record<\"audio\" | \"video\", MediaStreamTrack>> {\n return {\n ...(audio ? { audio } : {}),\n ...(video ? { video } : {}),\n };\n}\n\nfunction assertCodecParameters({\n trackKind,\n codec,\n sourceCodec,\n decoderDescription,\n sourceChannels,\n}: {\n trackKind: \"audio\" | \"video\";\n codec: RTCRtpCodecParameters;\n sourceCodec: SupportedSourceCodec;\n decoderDescription?: ArrayBuffer | ArrayBufferView | null;\n sourceChannels?: number;\n}) {\n if (sourceCodec === \"opus\" && sourceChannels && codec.channels != undefined) {\n if (codec.channels !== sourceChannels) {\n throw new Error(\n `Input ${trackKind} channels ${sourceChannels} do not match negotiated channels ${codec.channels}`,\n );\n }\n return;\n }\n\n if (sourceCodec !== \"avc\") {\n // mediabunny exposes codec-specific decoder configuration for H264 only here.\n return;\n }\n\n const negotiatedParameters = codecParametersFromString(\n codec.parameters ?? \"\",\n );\n const negotiatedPacketizationMode = Number(\n negotiatedParameters[\"packetization-mode\"] ?? 1,\n );\n if (negotiatedPacketizationMode !== 1) {\n throw new Error(\n `Input ${trackKind} packetization-mode 1 does not match negotiated packetization-mode ${negotiatedPacketizationMode}`,\n );\n }\n\n const sourceProfileLevelId = getH264ProfileLevelId(decoderDescription);\n const negotiatedProfileLevelId = normalizeOptionalHexParameter(\n negotiatedParameters[\"profile-level-id\"],\n );\n\n if (!sourceProfileLevelId) {\n return;\n }\n\n if (!negotiatedProfileLevelId) {\n throw new Error(\n `Input ${trackKind} profile-level-id ${sourceProfileLevelId} does not match negotiated profile-level-id <missing>`,\n );\n }\n\n if (sourceProfileLevelId !== negotiatedProfileLevelId) {\n throw new Error(\n `Input ${trackKind} profile-level-id ${sourceProfileLevelId} does not match negotiated profile-level-id ${negotiatedProfileLevelId}`,\n );\n }\n}\n\nfunction getH264ProfileLevelId(\n decoderDescription?: ArrayBuffer | ArrayBufferView | null,\n) {\n if (!decoderDescription) {\n return undefined;\n }\n\n const description = toDescriptionBuffer(decoderDescription);\n if (description.length < 4) {\n throw new Error(\"invalid H264 decoder configuration\");\n }\n\n return description.subarray(1, 4).toString(\"hex\");\n}\n\nfunction normalizeOptionalHexParameter(value: unknown) {\n return typeof value === \"string\" ? value.toLowerCase() : undefined;\n}\n\nfunction toRtpTimestamp(\n packetTimestamp: number,\n mediaStartTimestamp: number,\n clockRate: number,\n) {\n const relativeSeconds = Math.max(0, packetTimestamp - mediaStartTimestamp);\n return Math.round(relativeSeconds * clockRate) >>> 0;\n}\n\nfunction isAbortError(error: unknown) {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" ||\n error.message === \"The operation was aborted\")\n );\n}\n\nfunction toError(error: unknown) {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction toDescriptionBuffer(\n decoderDescription: ArrayBuffer | ArrayBufferView,\n) {\n if (ArrayBuffer.isView(decoderDescription)) {\n return Buffer.from(\n decoderDescription.buffer,\n decoderDescription.byteOffset,\n decoderDescription.byteLength,\n );\n }\n\n return Buffer.from(decoderDescription);\n}\n"]}
@@ -2,10 +2,10 @@ import type { RTCDataChannel } from "./dataChannel";
2
2
  import { EventTarget } from "./helper";
3
3
  import { type Address, Event, type InterfaceAddresses, type TlsConnectionOptions } from "./imports/common";
4
4
  import type { CandidatePair, Message, Protocol } from "./imports/ice";
5
- import { type MediaStream, type MediaStreamTrack, type RTCRtpCodecParameters, type RTCRtpHeaderExtensionParameters, type RTCRtpReceiver, type RTCRtpSender, type RTCRtpTransceiver, type TransceiverOptions } from "./media";
5
+ import { type MediaStream, type MediaStreamTrack, type RTCRtpCodecParameters, type RTCRtpHeaderExtensionParameters, type RTCRtpReceiver, type RTCRtpSender, type RTCRtpSenderOptions, type RTCRtpTransceiver, type TransceiverOptions } from "./media";
6
6
  import { type RTCStatsReport } from "./media/stats";
7
- import { type BundlePolicy, type RTCSessionDescription, SessionDescription } from "./sdp";
8
- import { type RTCSessionDescriptionInit } from "./sdpManager";
7
+ import { type BundlePolicy, type GroupDescription, type RTCSessionDescription, SessionDescription } from "./sdp";
8
+ import { type MLineReuse, type RTCSessionDescriptionInit } from "./sdpManager";
9
9
  import type { DtlsKeys, RTCCertificate, RTCDtlsTransport } from "./transport/dtls";
10
10
  import type { RTCIceCandidate, RTCIceCandidateInit, RTCIceTransport } from "./transport/ice";
11
11
  import { type RTCSctpTransport } from "./transport/sctp";
@@ -40,6 +40,15 @@ export declare class RTCPeerConnection extends EventTarget {
40
40
  config: Required<PeerConfig>;
41
41
  signalingState: RTCSignalingState;
42
42
  negotiationneeded: boolean;
43
+ /**同じ tick の複数の変更で negotiationneeded を重複発火しないための予約フラグ */
44
+ private negotiationneededScheduled;
45
+ /**交渉が必要な変更の通し番号 */
46
+ private negotiationChangeSeq;
47
+ /**answer まで確定した local offer が反映している変更の通し番号 */
48
+ private negotiatedChangeSeq;
49
+ /**適用中の local offer が反映している変更の通し番号 (rollback で破棄) */
50
+ private pendingOfferChangeSeq?;
51
+ private lastCreatedOfferChangeSeq;
43
52
  needRestart: boolean;
44
53
  private readonly router;
45
54
  private readonly sdpManager;
@@ -101,7 +110,7 @@ export declare class RTCPeerConnection extends EventTarget {
101
110
  get currentRemoteDescription(): RTCSessionDescription | null;
102
111
  get pendingRemoteDescription(): RTCSessionDescription | null;
103
112
  get canTrickleIceCandidates(): boolean | null;
104
- get remoteIsBundled(): import("./sdp").GroupDescription | undefined;
113
+ get remoteIsBundled(): GroupDescription | undefined;
105
114
  /**@private */
106
115
  get _localDescription(): SessionDescription | undefined;
107
116
  /**@private */
@@ -137,6 +146,13 @@ export declare class RTCPeerConnection extends EventTarget {
137
146
  disableSendNack?: boolean | undefined;
138
147
  disableRecvRetransmit?: boolean | undefined;
139
148
  };
149
+ sctp: {
150
+ mtu: number;
151
+ };
152
+ pendingRtp: boolean | {
153
+ enabled?: boolean;
154
+ maxLength?: number;
155
+ };
140
156
  iceTransportPolicy: "all" | "relay";
141
157
  /** Advertise local ICE lite and operate in the controlled role. */
142
158
  iceLite: boolean;
@@ -144,8 +160,26 @@ export declare class RTCPeerConnection extends EventTarget {
144
160
  iceUseIpv4: boolean;
145
161
  iceUseIpv6: boolean;
146
162
  iceUseTcp: boolean;
163
+ /** Gather passive (listening) TCP host candidates. Defaults to true. */
164
+ iceTcpPassive: boolean;
165
+ /**
166
+ * Seconds to wait for server-reflexive candidates while gathering.
167
+ * Defaults to 5 when undefined.
168
+ */
169
+ iceStunGatherTimeout: number | undefined;
170
+ /**
171
+ * Seconds to wait for a TURN TCP/TLS connection to be established.
172
+ * Defaults to 8 when undefined.
173
+ */
174
+ iceTurnConnectTimeout: number | undefined;
147
175
  turnTransport: "udp" | "tcp" | "tls" | undefined;
148
176
  turnTlsOptions: TlsConnectionOptions | undefined;
177
+ /**
178
+ * Preferred IP family of the TURN/UDP socket, applied only when the TURN
179
+ * server is a hostname. Ignored for an IP literal server, whose own family
180
+ * always selects the socket. Defaults to 4 when undefined.
181
+ */
182
+ turnUdpFamily: 4 | 6 | undefined;
149
183
  /** @deprecated Prefer turn URL transport parameters or turnTransport. */
150
184
  forceTurnTCP: boolean;
151
185
  /** such as google cloud run */
@@ -161,6 +195,14 @@ export declare class RTCPeerConnection extends EventTarget {
161
195
  midSuffix: boolean;
162
196
  /** Advertised local SCTP max-message-size in SDP. Use 0 for unlimited. */
163
197
  maxMessageSize: number;
198
+ /**
199
+ * How local SDP marks inactive / stopped m-lines. Cannot be changed after construction.
200
+ * - `"compatible"` (default): an accepted `inactive` m-line keeps a non-zero port.
201
+ * Only rejected (no common codec / remote port 0) or stopped m-lines use port 0,
202
+ * and only those negotiated port 0 positions are reused by new transceivers.
203
+ * - `"aggressive"`: legacy behavior. `inactive` m-lines are also written with port 0.
204
+ */
205
+ mLineReuse: MLineReuse;
164
206
  };
165
207
  createOffer({ iceRestart }?: {
166
208
  iceRestart?: boolean;
@@ -175,10 +217,30 @@ export declare class RTCPeerConnection extends EventTarget {
175
217
  id?: number;
176
218
  }>): RTCDataChannel;
177
219
  removeTrack(sender: RTCRtpSender): void;
220
+ /**交渉が必要な変更を記録し、negotiationneeded を予約する */
178
221
  private needNegotiation;
222
+ /**未交渉の変更が残っていれば negotiationneeded を予約する (stable 復帰時の再判定にも使う) */
223
+ private scheduleNegotiationneeded;
179
224
  private invalidateLastCreatedDescriptions;
180
225
  private waitForPendingDescriptionTask;
181
226
  private findOrCreateTransport;
227
+ /**
228
+ * @param inheritCredentials false の場合は BUNDLE 外の独立 transport として
229
+ * 既存 transport と異なる ICE credentials を使う
230
+ */
231
+ private createDtlsTransport;
232
+ /**
233
+ * local candidate の sdpMid / sdpMLineIndex を、その ICE transport を実際に
234
+ * 所有する受け入れ済み m-line (BUNDLE なら tag) に合わせる。
235
+ */
236
+ private resolveLocalCandidateOwner;
237
+ /**
238
+ * answer 確定後の stopping transceiver を整理する。
239
+ * @returns port 0 を自分の offer で交渉すべき transceiver が残っているか
240
+ */
241
+ private settleStoppingTransceivers;
242
+ /**停止した transceiver の transport のうち、live な利用者がいないものを閉じる */
243
+ private closeIdleTransports;
182
244
  setLocalDescription(sessionDescription: {
183
245
  type: "rollback";
184
246
  }): Promise<void>;
@@ -190,6 +252,24 @@ export declare class RTCPeerConnection extends EventTarget {
190
252
  private connect;
191
253
  restartIce(): void;
192
254
  setRemoteDescription(sessionDescription: RTCSessionDescriptionInit): Promise<void>;
255
+ /**
256
+ * remote answer / pranswer の検証 (offerer 側、状態を変更する前に実行する)。
257
+ * local offer で 1 つの transport を共有した m-line を、answer が同じ BUNDLE group に置かずに
258
+ * 異なる ICE credentials で受け入れることはできない (RFC 8843 7.3.2)。共有 transport は分割できず、
259
+ * 新しい transport を作ると offer で渡した ICE credentials とも一致しなくなる。
260
+ * group の記述が MID と一致しなくても remote の ICE credentials が同じなら、同じ transport のまま扱う。
261
+ */
262
+ private assertAnswerKeepsSharedTransports;
263
+ /**
264
+ * remote m-line に対応する transceiver を探す。MID の一致を優先し、
265
+ * 未関連付け transceiver は同じ offer 内で異なる m-line に割り当てる。
266
+ */
267
+ private findTransceiverForRemoteMedia;
268
+ /**
269
+ * remote offer / answer の m-line 用に transceiver を作る。
270
+ * 同じ位置に停止済みの旧 transceiver があれば、それを復活させず新しい receiver/router で置き換える。
271
+ */
272
+ private addRemoteTransceiver;
193
273
  addTransceiver(trackOrKind: Kind | MediaStreamTrack, options?: Partial<TransceiverOptions>): RTCRtpTransceiver;
194
274
  addTrack(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender;
195
275
  createAnswer(): Promise<RTCSessionDescription>;
@@ -237,8 +317,26 @@ export interface PeerConfig {
237
317
  iceUseIpv4: boolean;
238
318
  iceUseIpv6: boolean;
239
319
  iceUseTcp: boolean;
320
+ /** Gather passive (listening) TCP host candidates. Defaults to true. */
321
+ iceTcpPassive: boolean;
322
+ /**
323
+ * Seconds to wait for server-reflexive candidates while gathering.
324
+ * Defaults to 5 when undefined.
325
+ */
326
+ iceStunGatherTimeout: number | undefined;
327
+ /**
328
+ * Seconds to wait for a TURN TCP/TLS connection to be established.
329
+ * Defaults to 8 when undefined.
330
+ */
331
+ iceTurnConnectTimeout: number | undefined;
240
332
  turnTransport: "udp" | "tcp" | "tls" | undefined;
241
333
  turnTlsOptions: TlsConnectionOptions | undefined;
334
+ /**
335
+ * Preferred IP family of the TURN/UDP socket, applied only when the TURN
336
+ * server is a hostname. Ignored for an IP literal server, whose own family
337
+ * always selects the socket. Defaults to 4 when undefined.
338
+ */
339
+ turnUdpFamily: 4 | 6 | undefined;
242
340
  /** @deprecated Prefer turn URL transport parameters or turnTransport. */
243
341
  forceTurnTCP: boolean;
244
342
  /** such as google cloud run */
@@ -259,6 +357,23 @@ export interface PeerConfig {
259
357
  midSuffix: boolean;
260
358
  /** Advertised local SCTP max-message-size in SDP. Use 0 for unlimited. */
261
359
  maxMessageSize: number;
360
+ /** SCTP outbound packet MTU used for DATA chunk fragmentation. */
361
+ sctp: {
362
+ mtu: number;
363
+ };
364
+ /**
365
+ * Queue outbound RTP on each sender until DTLS is connected.
366
+ * Disabled by default. Pass `true` or `{ enabled: true, maxLength }` to buffer.
367
+ */
368
+ pendingRtp: NonNullable<RTCRtpSenderOptions["pendingRtp"]>;
369
+ /**
370
+ * How local SDP marks inactive / stopped m-lines. Cannot be changed after construction.
371
+ * - `"compatible"` (default): an accepted `inactive` m-line keeps a non-zero port.
372
+ * Only rejected (no common codec / remote port 0) or stopped m-lines use port 0,
373
+ * and only those negotiated port 0 positions are reused by new transceivers.
374
+ * - `"aggressive"`: legacy behavior. `inactive` m-lines are also written with port 0.
375
+ */
376
+ mLineReuse: MLineReuse;
262
377
  }
263
378
  export declare const findCodecByMimeType: (codecs: RTCRtpCodecParameters[], target: RTCRtpCodecParameters) => RTCRtpCodecParameters | undefined;
264
379
  export type RTCIceServer = {
@@ -268,6 +383,10 @@ export type RTCIceServer = {
268
383
  };
269
384
  export type RTCBundlePolicy = "balanced" | "max-compat" | "max-bundle";
270
385
  export type RTCRtcpMuxPolicy = "require";
386
+ export interface RTCSctpConfiguration {
387
+ /** SCTP outbound packet MTU used for DATA chunk fragmentation. Defaults to 1191. */
388
+ mtu?: number;
389
+ }
271
390
  export interface RTCConfiguration {
272
391
  iceServers?: RTCIceServer[];
273
392
  iceTransportPolicy?: PeerConfig["iceTransportPolicy"];
@@ -282,7 +401,9 @@ export interface RTCLocalSessionDescriptionInit extends RTCSessionDescriptionIni
282
401
  type RTCPeerConnectionRTCConfiguration = Omit<RTCConfiguration, "bundlePolicy"> & {
283
402
  bundlePolicy?: PeerConfig["bundlePolicy"] | RTCBundlePolicy;
284
403
  };
285
- export type RTCPeerConnectionConfig = Partial<Omit<PeerConfig, "bundlePolicy" | "rtcpMuxPolicy" | "iceCandidatePoolSize" | "certificates">> & RTCPeerConnectionRTCConfiguration;
404
+ export type RTCPeerConnectionConfig = Partial<Omit<PeerConfig, "bundlePolicy" | "rtcpMuxPolicy" | "iceCandidatePoolSize" | "certificates" | "sctp">> & RTCPeerConnectionRTCConfiguration & {
405
+ sctp?: RTCSctpConfiguration;
406
+ };
286
407
  export declare const defaultPeerConfig: PeerConfig;
287
408
  export declare class RTCTrackEvent {
288
409
  readonly type = "track";