werift 0.24.4 → 0.25.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -113
- package/lib/common/src/transport.d.ts +22 -2
- package/lib/common/src/transport.js +84 -26
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/exceptions.d.ts +9 -0
- package/lib/ice/src/exceptions.js +23 -1
- package/lib/ice/src/exceptions.js.map +1 -1
- package/lib/ice/src/ice.d.ts +40 -0
- package/lib/ice/src/ice.js +194 -28
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +26 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +7 -0
- package/lib/ice/src/stun/const.js +8 -0
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/protocol.js +1 -4
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
- package/lib/ice/src/stun/tcpProtocol.js +65 -14
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +12 -1
- package/lib/ice/src/stun/transaction.js +37 -4
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +40 -15
- package/lib/ice/src/turn/protocol.js +141 -32
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +8 -0
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/index.mjs +6175 -4073
- package/lib/nonstandard/index.mjs +286 -1003
- package/lib/polyfill/dom.mjs +23794 -0
- package/lib/polyfill/index.mjs +23794 -0
- package/lib/rtp/src/extra/container/mp4/container.js +12 -4
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +8 -3
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/sctp/src/chunk.d.ts +5 -0
- package/lib/sctp/src/chunk.js +16 -11
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/index.d.ts +3 -1
- package/lib/sctp/src/index.js +10 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +12 -3
- package/lib/sctp/src/sctp.js +51 -18
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/const.js +2 -0
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +9 -1
- package/lib/webrtc/src/errors.js +19 -0
- package/lib/webrtc/src/errors.js.map +1 -1
- package/lib/webrtc/src/media/codec.d.ts +5 -0
- package/lib/webrtc/src/media/codec.js +21 -0
- package/lib/webrtc/src/media/codec.js.map +1 -1
- package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
- package/lib/webrtc/src/media/codecCompatibility.js +138 -0
- package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +2 -0
- package/lib/webrtc/src/media/router.js +23 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
- package/lib/webrtc/src/media/rtpReceiver.js +35 -0
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
- package/lib/webrtc/src/media/rtpSender.js +264 -35
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
- package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +29 -1
- package/lib/webrtc/src/media/track.js +164 -5
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
- package/lib/webrtc/src/nonstandard/index.js +0 -1
- package/lib/webrtc/src/nonstandard/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
- package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +126 -5
- package/lib/webrtc/src/peerConnection.js +609 -136
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/polyfill/api.d.ts +14 -0
- package/lib/webrtc/src/polyfill/api.js +23 -0
- package/lib/webrtc/src/polyfill/api.js.map +1 -0
- package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
- package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
- package/lib/webrtc/src/polyfill/dom.js +18 -0
- package/lib/webrtc/src/polyfill/dom.js.map +1 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
- package/lib/webrtc/src/polyfill/globals.js +3 -0
- package/lib/webrtc/src/polyfill/globals.js.map +1 -0
- package/lib/webrtc/src/polyfill/index.d.ts +2 -0
- package/lib/webrtc/src/polyfill/index.js +19 -0
- package/lib/webrtc/src/polyfill/index.js.map +1 -0
- package/lib/webrtc/src/polyfill/install.d.ts +13 -0
- package/lib/webrtc/src/polyfill/install.js +266 -0
- package/lib/webrtc/src/polyfill/install.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
- package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
- package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
- package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
- package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
- package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
- package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
- package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
- package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
- package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
- package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
- package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
- package/lib/webrtc/src/polyfill/trackStop.js +16 -0
- package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
- package/lib/webrtc/src/sctpManager.d.ts +2 -1
- package/lib/webrtc/src/sctpManager.js +5 -2
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -1
- package/lib/webrtc/src/sdp.js +5 -6
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +38 -1
- package/lib/webrtc/src/sdpManager.js +236 -30
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
- package/lib/webrtc/src/secureTransportManager.js +123 -47
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +91 -6
- package/lib/webrtc/src/transceiverManager.js +477 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +8 -0
- package/lib/webrtc/src/transport/ice.js +17 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +3 -2
- package/lib/webrtc/src/transport/sctp.js +8 -2
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +13 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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():
|
|
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";
|