@rivmux/runtime-worker 0.4.0 → 1.0.0-rc.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"rivmux-runtime-worker.js","names":["ret","initBundledTransmuxCore","BundledTransmuxCore"],"sources":["../src/latency/buffer-ranges.ts","../src/latency/latency-controller.ts","../src/loader/retry-policy.ts","../src/loader/http-flv-loader.ts","../src/mse/mime.ts","../src/mse/source-buffer-queue.ts","../src/mse/mse-controller.ts","../src/wasm/rivmux-transmux-wasm.ts","../../../crates/transmux-core/dist/rivmux_transmux_core.js","../src/wasm/wasm-loader.ts","../src/runtime.ts","../src/worker-entry.ts"],"sourcesContent":["export type BufferedRange = {\n start: number\n end: number\n}\n\nexport function normalizeBufferedRanges(input: TimeRanges | readonly BufferedRange[]): BufferedRange[] {\n if (isBufferedRangeArray(input)) {\n return input.filter(isValidRange).map((range) => ({ start: range.start, end: range.end }))\n }\n\n const ranges: BufferedRange[] = []\n for (let index = 0; index < input.length; index += 1) {\n const range = {\n start: input.start(index),\n end: input.end(index),\n }\n if (isValidRange(range)) {\n ranges.push(range)\n }\n }\n return ranges\n}\n\nexport function getBufferedStart(ranges: readonly BufferedRange[]): number | undefined {\n return ranges.length === 0 ? undefined : ranges[0]?.start\n}\n\nexport function getLiveEdge(ranges: readonly BufferedRange[]): number | undefined {\n const range = ranges[ranges.length - 1]\n return range?.end\n}\n\nexport function getBufferedDuration(ranges: readonly BufferedRange[]): number | undefined {\n if (ranges.length === 0) {\n return undefined\n }\n\n return ranges.reduce((total, range) => total + Math.max(0, range.end - range.start), 0)\n}\n\nexport function getForwardBuffer(ranges: readonly BufferedRange[], currentTime: number): number | undefined {\n if (!Number.isFinite(currentTime)) {\n return undefined\n }\n\n const liveEdge = getLiveEdge(ranges)\n if (liveEdge === undefined) {\n return undefined\n }\n\n return Math.max(0, liveEdge - currentTime)\n}\n\nexport function getBackwardBuffer(ranges: readonly BufferedRange[], currentTime: number): number | undefined {\n if (!Number.isFinite(currentTime)) {\n return undefined\n }\n\n for (const range of ranges) {\n if (currentTime >= range.start && currentTime <= range.end) {\n return Math.max(0, currentTime - range.start)\n }\n }\n\n const firstRange = ranges.find((range) => currentTime < range.start)\n if (firstRange !== undefined) {\n return 0\n }\n\n const lastRange = ranges[ranges.length - 1]\n return lastRange === undefined ? undefined : Math.max(0, lastRange.end - lastRange.start)\n}\n\nfunction isValidRange(range: BufferedRange): boolean {\n return Number.isFinite(range.start) && Number.isFinite(range.end) && range.end > range.start\n}\n\nfunction isBufferedRangeArray(input: TimeRanges | readonly BufferedRange[]): input is readonly BufferedRange[] {\n return Array.isArray(input)\n}\n","import { getBufferedDuration, getBufferedStart, getForwardBuffer, getLiveEdge } from './buffer-ranges'\n\nimport type { NormalizedPlaybackOptions, NormalizedLatencyOptions, PlaybackControlAction, PlaybackControlResult, VideoElementState } from '@rivmux/protocol'\nimport type { BufferedRange } from './buffer-ranges'\n\nexport type LatencyMetrics = {\n bufferedStart?: number\n bufferedEnd?: number\n bufferedDuration?: number\n currentTime?: number\n forwardBuffer?: number\n liveLatency?: number\n playbackRate?: number\n readyState?: number\n droppedFrames?: number\n}\n\nexport type LatencyEvaluationInput = {\n ranges: readonly BufferedRange[]\n videoState?: VideoElementState\n loaderPaused: boolean\n nowMs: number\n}\n\nexport type LatencyEvaluation = {\n metrics: LatencyMetrics\n cleanupBefore?: number\n loaderCommand?: 'pause' | 'resume'\n playbackControl?: PlaybackControlAction\n}\n\nexport class LatencyController {\n private readonly latency: NormalizedLatencyOptions\n private readonly playback: NormalizedPlaybackOptions\n private startupPlayRequested = false\n private pendingPlaybackControl?: PlaybackControlAction['type']\n private lastSeekRequestAtMs = Number.NEGATIVE_INFINITY\n\n constructor(config: { latency: NormalizedLatencyOptions; playback: NormalizedPlaybackOptions }) {\n this.latency = config.latency\n this.playback = config.playback\n }\n\n evaluate(input: LatencyEvaluationInput): LatencyEvaluation {\n const metrics = this.computeMetrics(input)\n const evaluation: LatencyEvaluation = { metrics }\n\n if (metrics.currentTime !== undefined) {\n const cleanupBefore = metrics.currentTime - this.latency.backwardBuffer\n if (cleanupBefore > 0) {\n evaluation.cleanupBefore = cleanupBefore\n }\n }\n\n const forwardBuffer = metrics.forwardBuffer ?? metrics.bufferedDuration\n if (forwardBuffer !== undefined) {\n if (!input.loaderPaused && forwardBuffer >= this.latency.maxForwardBuffer) {\n evaluation.loaderCommand = 'pause'\n } else if (input.loaderPaused && forwardBuffer <= this.latency.target) {\n evaluation.loaderCommand = 'resume'\n }\n }\n\n evaluation.playbackControl = this.evaluatePlaybackControl(input, metrics)\n return evaluation\n }\n\n recordPlaybackControlResult(result: PlaybackControlResult): void {\n if (this.pendingPlaybackControl === result.type) {\n this.pendingPlaybackControl = undefined\n }\n }\n\n reset(): void {\n this.startupPlayRequested = false\n this.pendingPlaybackControl = undefined\n this.lastSeekRequestAtMs = Number.NEGATIVE_INFINITY\n }\n\n private computeMetrics(input: LatencyEvaluationInput): LatencyMetrics {\n const bufferedStart = getBufferedStart(input.ranges)\n const bufferedEnd = getLiveEdge(input.ranges)\n const bufferedDuration = getBufferedDuration(input.ranges)\n const videoState = input.videoState\n const metrics: LatencyMetrics = {\n bufferedStart,\n bufferedEnd,\n bufferedDuration,\n }\n\n if (videoState === undefined) {\n return metrics\n }\n\n const forwardBuffer = getForwardBuffer(input.ranges, videoState.currentTime)\n metrics.currentTime = videoState.currentTime\n metrics.forwardBuffer = forwardBuffer\n metrics.playbackRate = videoState.playbackRate\n metrics.readyState = videoState.readyState\n metrics.droppedFrames = videoState.droppedFrames\n metrics.liveLatency = forwardBuffer\n return metrics\n }\n\n private evaluatePlaybackControl(input: LatencyEvaluationInput, metrics: LatencyMetrics): PlaybackControlAction | undefined {\n if (this.pendingPlaybackControl !== undefined) {\n return undefined\n }\n\n if (\n !this.startupPlayRequested &&\n this.playback.autoPlay &&\n metrics.bufferedDuration !== undefined &&\n metrics.bufferedDuration >= this.latency.startupBuffer\n ) {\n this.startupPlayRequested = true\n this.pendingPlaybackControl = 'play'\n return { type: 'play', reason: 'startup-buffer-ready' }\n }\n\n if (input.videoState === undefined || metrics.liveLatency === undefined || metrics.bufferedEnd === undefined) {\n return undefined\n }\n\n if (metrics.liveLatency > this.latency.max) {\n const seekTarget = Math.max(metrics.bufferedStart ?? 0, metrics.bufferedEnd - this.latency.target)\n const hasSeekCooldownElapsed = input.nowMs - this.lastSeekRequestAtMs >= SEEK_COOLDOWN_MS\n if (hasSeekCooldownElapsed && Math.abs(seekTarget - input.videoState.currentTime) >= SEEK_MIN_DELTA_SECONDS) {\n this.lastSeekRequestAtMs = input.nowMs\n this.pendingPlaybackControl = 'seek'\n return { type: 'seek', targetTime: seekTarget, reason: 'latency-max-exceeded' }\n }\n return undefined\n }\n\n if (metrics.liveLatency > this.latency.target + PLAYBACK_RATE_CHASE_THRESHOLD_SECONDS) {\n if (Math.abs(input.videoState.playbackRate - PLAYBACK_RATE_CHASE) >= PLAYBACK_RATE_EPSILON) {\n this.pendingPlaybackControl = 'set-playback-rate'\n return { type: 'set-playback-rate', playbackRate: PLAYBACK_RATE_CHASE, reason: 'latency-above-target' }\n }\n } else if (input.videoState.playbackRate !== 1 && metrics.liveLatency <= this.latency.target + PLAYBACK_RATE_RESTORE_THRESHOLD_SECONDS) {\n this.pendingPlaybackControl = 'set-playback-rate'\n return { type: 'set-playback-rate', playbackRate: 1, reason: 'latency-near-target' }\n }\n\n return undefined\n }\n}\n\nconst PLAYBACK_RATE_CHASE = 1.05\nconst PLAYBACK_RATE_EPSILON = 0.005\nconst PLAYBACK_RATE_CHASE_THRESHOLD_SECONDS = 0.25\nconst PLAYBACK_RATE_RESTORE_THRESHOLD_SECONDS = 0.1\nconst SEEK_COOLDOWN_MS = 1000\nconst SEEK_MIN_DELTA_SECONDS = 0.1\n","export type RetryPolicy = {\n maxAttempts: number\n backoffMs: number\n}\n\nexport function createRetryPolicy(input: Partial<RetryPolicy> | undefined): RetryPolicy {\n return {\n maxAttempts: clampInteger(input?.maxAttempts, 1),\n backoffMs: clampInteger(input?.backoffMs, 0),\n }\n}\n\nexport function getRetryDelayMs(policy: RetryPolicy, attempt: number): number {\n if (policy.backoffMs === 0) {\n return 0\n }\n\n return policy.backoffMs * Math.max(1, attempt)\n}\n\nfunction clampInteger(value: number | undefined, minimum: number): number {\n if (value === undefined || !Number.isFinite(value)) {\n return minimum\n }\n\n return Math.max(minimum, Math.trunc(value))\n}\n","import { createRetryPolicy, getRetryDelayMs } from './retry-policy'\n\nimport type { StreamChunk, StreamLoader, StreamLoaderConfig, StreamLoaderStats } from './loader'\n\ntype LoaderState = 'idle' | 'opening' | 'open' | 'closed'\n\nexport class HttpFlvLoaderError extends Error {\n readonly code: string\n readonly status?: number\n\n constructor(code: string, message: string, status?: number) {\n super(message)\n this.name = 'HttpFlvLoaderError'\n this.code = code\n this.status = status\n }\n}\n\nexport class HttpFlvLoader implements StreamLoader {\n private readonly url: string\n private readonly headers: Record<string, string>\n private readonly credentials: RequestCredentials\n private readonly retry = createRetryPolicy(undefined)\n private readonly fetchImpl: typeof fetch\n private readonly now: () => number\n private readonly sleep: (ms: number, signal: AbortSignal) => Promise<void>\n private abortController?: AbortController\n private reader?: ReadableStreamDefaultReader<Uint8Array>\n private state: LoaderState = 'idle'\n private pausedState = false\n private resumeWaiters: Array<() => void> = []\n private readonly mutableStats: StreamLoaderStats = {\n bytesReceived: 0,\n currentNetworkSpeed: 0,\n }\n\n constructor(config: StreamLoaderConfig) {\n this.url = config.url\n this.headers = config.network.headers\n this.credentials = config.network.credentials\n this.retry = createRetryPolicy(config.network.retry)\n this.fetchImpl = config.fetch ?? globalThis.fetch.bind(globalThis)\n this.now = config.now ?? (() => performance.now())\n this.sleep = config.sleep ?? wait\n }\n\n get closed(): boolean {\n return this.state === 'closed'\n }\n\n get paused(): boolean {\n return this.pausedState\n }\n\n get stats(): StreamLoaderStats {\n return { ...this.mutableStats }\n }\n\n async open(): Promise<void> {\n if (this.state !== 'idle') {\n throw new HttpFlvLoaderError('RIVMUX_LOADER_INVALID_STATE', 'HTTP Fetch loader can only be opened once.')\n }\n\n this.state = 'opening'\n this.mutableStats.startedAtMs = this.now()\n\n for (let attempt = 1; attempt <= this.retry.maxAttempts; attempt += 1) {\n this.abortController = new AbortController()\n\n try {\n await this.openAttempt()\n return\n } catch (cause) {\n if (this.closed || isAbortLikeError(cause) || attempt >= this.retry.maxAttempts) {\n throw cause\n }\n\n await this.sleep(getRetryDelayMs(this.retry, attempt), this.abortController.signal)\n }\n }\n }\n\n async read(): Promise<StreamChunk | null> {\n await this.waitUntilResumed()\n\n if (this.closed) {\n return null\n }\n\n const reader = this.reader\n if (reader === undefined) {\n if (this.closed) {\n return null\n }\n\n throw new HttpFlvLoaderError('RIVMUX_LOADER_NOT_OPEN', 'HTTP Fetch loader must be opened before read().')\n }\n\n const result = await reader.read()\n if (result.done) {\n releaseReader(reader)\n if (this.reader === reader) {\n this.reader = undefined\n }\n return null\n }\n\n const bytes = result.value\n const receivedAtMs = this.now()\n const previousChunkAtMs = this.mutableStats.lastChunkAtMs ?? this.mutableStats.startedAtMs ?? receivedAtMs\n const elapsedSeconds = Math.max((receivedAtMs - previousChunkAtMs) / 1000, 0)\n\n this.mutableStats.bytesReceived += bytes.byteLength\n this.mutableStats.currentNetworkSpeed = elapsedSeconds === 0 ? bytes.byteLength : bytes.byteLength / elapsedSeconds\n this.mutableStats.lastChunkAtMs = receivedAtMs\n\n return { bytes, receivedAtMs }\n }\n\n pause(): void {\n if (this.closed) {\n return\n }\n\n this.pausedState = true\n }\n\n resume(): void {\n if (!this.pausedState) {\n return\n }\n\n this.pausedState = false\n this.resolveResumeWaiters()\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return\n }\n\n this.state = 'closed'\n this.pausedState = false\n this.resolveResumeWaiters()\n this.abortController?.abort()\n\n const reader = this.reader\n this.reader = undefined\n if (reader === undefined) {\n return\n }\n\n try {\n await reader.cancel()\n } catch {\n // Cancellation errors are expected while aborting an in-flight stream.\n } finally {\n releaseReader(reader)\n }\n }\n\n private async openAttempt(): Promise<void> {\n const abortController = this.abortController\n if (abortController === undefined) {\n throw new HttpFlvLoaderError('RIVMUX_LOADER_INVALID_STATE', 'HTTP Fetch loader abort controller is missing.')\n }\n\n const response = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: createHeaders(this.headers),\n credentials: this.credentials,\n signal: abortController.signal,\n })\n\n if (this.closed) {\n await response.body?.cancel()\n return\n }\n\n if (!response.ok) {\n await response.body?.cancel()\n throw new HttpFlvLoaderError('RIVMUX_HTTP_STATUS', `HTTP Fetch loader received status ${response.status} ${response.statusText}.`, response.status)\n }\n\n if (response.body === null) {\n throw new HttpFlvLoaderError('RIVMUX_HTTP_BODY_UNAVAILABLE', 'HTTP Fetch loader response body is unavailable.')\n }\n\n const contentLength = response.headers.get('Content-Length')\n if (contentLength !== null) {\n const parsedContentLength = Number.parseInt(contentLength, 10)\n if (Number.isFinite(parsedContentLength) && parsedContentLength >= 0) {\n this.mutableStats.contentLength = parsedContentLength\n }\n }\n\n this.reader = response.body.getReader()\n this.state = 'open'\n }\n\n private waitUntilResumed(): Promise<void> {\n if (!this.pausedState || this.closed) {\n return Promise.resolve()\n }\n\n return new Promise((resolve) => {\n this.resumeWaiters.push(resolve)\n })\n }\n\n private resolveResumeWaiters(): void {\n const waiters = this.resumeWaiters\n this.resumeWaiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n}\n\nexport function isAbortLikeError(cause: unknown): boolean {\n return cause instanceof DOMException && cause.name === 'AbortError'\n}\n\nfunction createHeaders(headers: Record<string, string>): Headers {\n const result = new Headers()\n for (const [key, value] of Object.entries(headers)) {\n result.append(key, value)\n }\n return result\n}\n\nfunction releaseReader(reader: ReadableStreamDefaultReader<Uint8Array>): void {\n try {\n reader.releaseLock()\n } catch {\n // A pending read can make releaseLock throw during teardown.\n }\n}\n\nfunction wait(ms: number, signal: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return Promise.resolve()\n }\n\n if (signal.aborted) {\n return Promise.reject(createAbortError())\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n }\n const onAbort = (): void => {\n cleanup()\n reject(createAbortError())\n }\n const timer = setTimeout(() => {\n cleanup()\n resolve()\n }, ms)\n\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction createAbortError(): DOMException {\n return new DOMException('HTTP Fetch loader was aborted.', 'AbortError')\n}\n","export type RequiredMseMimeType = {\n readonly mediaType: 'video' | 'audio'\n readonly mimeType: string\n readonly unsupportedCode: string\n}\n\nexport function createMp4VideoMime(codec: string): string {\n return `video/mp4; codecs=\"${codec}\"`\n}\n\nexport function createMp4AudioMime(codec: string): string {\n return `audio/mp4; codecs=\"${codec}\"`\n}\n\nexport const REQUIRED_MSE_MIME_TYPES = [\n {\n mediaType: 'video',\n mimeType: createMp4VideoMime('avc1.42C01E'),\n unsupportedCode: 'RIVMUX_UNSUPPORTED_MSE_VIDEO_MIME',\n },\n {\n mediaType: 'audio',\n mimeType: createMp4AudioMime('mp4a.40.2'),\n unsupportedCode: 'RIVMUX_UNSUPPORTED_MSE_AUDIO_MIME',\n },\n] as const satisfies readonly RequiredMseMimeType[]\n\nexport function isMseSupported(mimeType: string): boolean {\n return typeof MediaSource !== 'undefined' && typeof MediaSource.isTypeSupported === 'function' && MediaSource.isTypeSupported(mimeType)\n}\n\nexport function assertMseSupport(mimeType: string): void {\n if (typeof MediaSource === 'undefined') {\n throw new Error('MediaSource is not available in this worker.')\n }\n\n if (MediaSource.canConstructInDedicatedWorker !== true) {\n throw new Error('MediaSource cannot be constructed in this dedicated worker.')\n }\n\n if (!isMseSupported(mimeType)) {\n throw new Error(`MSE does not support ${mimeType}.`)\n }\n}\n\nexport function assertRequiredMseSupport(): void {\n for (const requirement of REQUIRED_MSE_MIME_TYPES) {\n assertMseSupport(requirement.mimeType)\n }\n}\n","import { getBufferedDuration, getBufferedStart, getLiveEdge, normalizeBufferedRanges } from '../latency/buffer-ranges'\n\nimport type { BufferedRange } from '../latency/buffer-ranges'\n\ntype SourceBufferOperation = { type: 'append'; data: ArrayBuffer } | { type: 'remove'; start: number; end: number }\n\nexport class SourceBufferQueue {\n private readonly sourceBuffer: SourceBuffer\n private readonly queue: SourceBufferOperation[] = []\n private pendingDrain?: Promise<void>\n private activeAppendBytes = 0\n private destroyed = false\n\n constructor(sourceBuffer: SourceBuffer) {\n this.sourceBuffer = sourceBuffer\n }\n\n get length(): number {\n return this.queue.length + (this.sourceBuffer.updating ? 1 : 0)\n }\n\n get queuedBytes(): number {\n return this.activeAppendBytes + this.queue.reduce((total, operation) => total + (operation.type === 'append' ? operation.data.byteLength : 0), 0)\n }\n\n get updating(): boolean {\n return this.sourceBuffer.updating\n }\n\n get bufferedRanges(): BufferedRange[] {\n return normalizeBufferedRanges(this.sourceBuffer.buffered)\n }\n\n get bufferedStart(): number | undefined {\n return getBufferedStart(this.bufferedRanges)\n }\n\n get bufferedEnd(): number | undefined {\n return getLiveEdge(this.bufferedRanges)\n }\n\n get bufferedDuration(): number | undefined {\n return getBufferedDuration(this.bufferedRanges)\n }\n\n append(data: ArrayBuffer): Promise<void> {\n if (this.destroyed) {\n return Promise.reject(new Error('SourceBufferQueue has been destroyed.'))\n }\n\n this.queue.push({ type: 'append', data })\n this.pendingDrain ??= this.drain()\n return this.pendingDrain\n }\n\n cleanupBefore(cutoff: number): Promise<void> {\n if (this.destroyed) {\n return Promise.reject(new Error('SourceBufferQueue has been destroyed.'))\n }\n\n const removals = this.createCleanupOperations(cutoff)\n if (removals.length === 0) {\n return this.pendingDrain ?? Promise.resolve()\n }\n\n this.queue.unshift(...removals)\n this.pendingDrain ??= this.drain()\n return this.pendingDrain\n }\n\n reset(): void {\n this.queue.length = 0\n this.activeAppendBytes = 0\n }\n\n destroy(): void {\n this.destroyed = true\n this.reset()\n }\n\n private async drain(): Promise<void> {\n try {\n while (this.queue.length > 0 && !this.destroyed) {\n await this.waitForIdle()\n this.activeAppendBytes = 0\n const operation = this.queue.shift()\n\n if (operation?.type === 'append') {\n this.activeAppendBytes = operation.data.byteLength\n try {\n this.sourceBuffer.appendBuffer(operation.data)\n } catch (cause) {\n this.activeAppendBytes = 0\n throw cause\n }\n } else if (operation?.type === 'remove') {\n this.sourceBuffer.remove(operation.start, operation.end)\n }\n }\n\n await this.waitForIdle()\n this.activeAppendBytes = 0\n } finally {\n if (this.queue.length === 0 && !this.sourceBuffer.updating) {\n this.activeAppendBytes = 0\n }\n this.pendingDrain = undefined\n }\n }\n\n private createCleanupOperations(cutoff: number): SourceBufferOperation[] {\n if (!Number.isFinite(cutoff) || cutoff <= 0) {\n return []\n }\n\n return this.bufferedRanges\n .map((range) => ({ type: 'remove' as const, start: range.start, end: Math.min(range.end, cutoff) }))\n .filter((operation) => operation.end > operation.start)\n }\n\n private waitForIdle(): Promise<void> {\n if (!this.sourceBuffer.updating) {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n this.sourceBuffer.removeEventListener('updateend', onUpdateEnd)\n this.sourceBuffer.removeEventListener('error', onError)\n this.sourceBuffer.removeEventListener('abort', onAbort)\n }\n const onUpdateEnd = (): void => {\n cleanup()\n resolve()\n }\n const onError = (): void => {\n cleanup()\n reject(new Error('SourceBuffer append failed.'))\n }\n const onAbort = (): void => {\n cleanup()\n reject(new Error('SourceBuffer append was aborted.'))\n }\n\n this.sourceBuffer.addEventListener('updateend', onUpdateEnd, { once: true })\n this.sourceBuffer.addEventListener('error', onError, { once: true })\n this.sourceBuffer.addEventListener('abort', onAbort, { once: true })\n })\n }\n}\n","import { assertMseSupport, assertRequiredMseSupport, createMp4AudioMime, createMp4VideoMime } from './mime'\nimport { SourceBufferQueue } from './source-buffer-queue'\n\nimport type { BufferedRange } from '../latency/buffer-ranges'\nimport type { CoreInitSegment, CoreMediaSegment } from '../wasm/rivmux-transmux-wasm'\n\nexport class MseController {\n private mediaSource?: MediaSource\n private readonly sourceBuffers = new Map<CoreInitSegment['track'], SourceBuffer>()\n private readonly queues = new Map<CoreInitSegment['track'], SourceBufferQueue>()\n private lastCleanupBefore = 0\n\n get appendQueueLength(): number {\n return Array.from(this.queues.values()).reduce((total, queue) => total + queue.length, 0)\n }\n\n get appendQueueBytes(): number {\n return Array.from(this.queues.values()).reduce((total, queue) => total + queue.queuedBytes, 0)\n }\n\n get sourceBufferUpdating(): boolean {\n return Array.from(this.queues.values()).some((queue) => queue.updating)\n }\n\n get sourceBufferCount(): number {\n return this.sourceBuffers.size\n }\n\n get bufferedStart(): number | undefined {\n return this.primaryQueue?.bufferedStart\n }\n\n get bufferedEnd(): number | undefined {\n return this.primaryQueue?.bufferedEnd\n }\n\n get bufferedDuration(): number | undefined {\n return this.primaryQueue?.bufferedDuration\n }\n\n get bufferedRanges(): BufferedRange[] {\n return this.primaryQueue?.bufferedRanges ?? []\n }\n\n get bufferedRangeCount(): number {\n return Array.from(this.queues.values()).reduce((total, queue) => total + queue.bufferedRanges.length, 0)\n }\n\n async createMediaSourceHandle(): Promise<MediaSourceHandle> {\n assertRequiredMseSupport()\n\n const mediaSource = new MediaSource()\n this.mediaSource = mediaSource\n\n const handle = (mediaSource as MediaSourceWithHandle).handle\n if (handle === undefined) {\n throw new Error('MediaSourceHandle is not available.')\n }\n\n return handle\n }\n\n async appendInitSegment(segment: CoreInitSegment): Promise<void> {\n const mediaSource = this.requireMediaSource()\n const mimeType = createMp4Mime(segment.track, segment.codec)\n assertMseSupport(mimeType)\n await waitForSourceOpen(mediaSource)\n\n const queue = this.ensureQueue(segment.track, mimeType)\n await queue.append(toAppendBuffer(segment.bytes))\n }\n\n async appendMediaSegment(segment: CoreMediaSegment): Promise<void> {\n const queue = this.queues.get(segment.track)\n if (queue === undefined) {\n throw new Error(`Cannot append ${segment.track} media segment before init segment.`)\n }\n\n await queue.append(toAppendBuffer(segment.bytes))\n const mediaSource = this.requireMediaSource()\n const duration = segment.dtsEndMs / 1000\n if (Number.isFinite(duration) && duration > 0 && mediaSource.readyState === 'open') {\n mediaSource.duration = Math.max(mediaSource.duration, duration)\n }\n }\n\n async cleanupBefore(cutoff: number, options: MseCleanupOptions = {}): Promise<void> {\n if (!Number.isFinite(cutoff) || cutoff <= 0 || (!options.force && cutoff <= this.lastCleanupBefore + CLEANUP_STEP_SECONDS)) {\n return\n }\n\n this.lastCleanupBefore = cutoff\n await Promise.all(Array.from(this.queues.values(), (queue) => queue.cleanupBefore(cutoff)))\n }\n\n reset(): void {\n for (const queue of this.queues.values()) {\n queue.reset()\n }\n this.lastCleanupBefore = 0\n }\n\n destroy(): void {\n for (const queue of this.queues.values()) {\n queue.destroy()\n }\n this.queues.clear()\n\n if (this.mediaSource !== undefined) {\n for (const sourceBuffer of this.sourceBuffers.values()) {\n try {\n this.mediaSource.removeSourceBuffer(sourceBuffer)\n } catch {\n // Browser cleanup can race sourceclose during worker termination.\n }\n }\n }\n\n this.sourceBuffers.clear()\n this.mediaSource = undefined\n }\n\n private get primaryQueue(): SourceBufferQueue | undefined {\n return this.queues.get('video') ?? this.queues.get('muxed') ?? this.queues.get('audio')\n }\n\n private requireMediaSource(): MediaSource {\n if (this.mediaSource === undefined) {\n throw new Error('MediaSource has not been created.')\n }\n\n return this.mediaSource\n }\n\n private ensureQueue(track: CoreInitSegment['track'], mimeType: string): SourceBufferQueue {\n const existing = this.queues.get(track)\n if (existing !== undefined) {\n return existing\n }\n\n const sourceBuffer = this.requireMediaSource().addSourceBuffer(mimeType)\n const queue = new SourceBufferQueue(sourceBuffer)\n this.sourceBuffers.set(track, sourceBuffer)\n this.queues.set(track, queue)\n return queue\n }\n}\n\ntype MediaSourceWithHandle = MediaSource & {\n readonly handle?: MediaSourceHandle\n}\n\nfunction waitForSourceOpen(mediaSource: MediaSource): Promise<void> {\n if (mediaSource.readyState === 'open') {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n mediaSource.removeEventListener('sourceopen', onOpen)\n mediaSource.removeEventListener('sourceclose', onClose)\n mediaSource.removeEventListener('error', onError)\n }\n const onOpen = (): void => {\n cleanup()\n resolve()\n }\n const onClose = (): void => {\n cleanup()\n reject(new Error('MediaSource closed before sourceopen.'))\n }\n const onError = (): void => {\n cleanup()\n reject(new Error('MediaSource failed before sourceopen.'))\n }\n\n mediaSource.addEventListener('sourceopen', onOpen, { once: true })\n mediaSource.addEventListener('sourceclose', onClose, { once: true })\n mediaSource.addEventListener('error', onError, { once: true })\n })\n}\n\nfunction toAppendBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength)\n copy.set(bytes)\n return copy.buffer\n}\n\nfunction createMp4Mime(track: CoreInitSegment['track'], codec: string): string {\n return track === 'audio' ? createMp4AudioMime(codec) : createMp4VideoMime(codec)\n}\n\nconst CLEANUP_STEP_SECONDS = 0.25\n\ntype MseCleanupOptions = {\n force?: boolean\n}\n","import type { MediaInfo, PlayerError, PlayerWarning } from '@rivmux/protocol'\n\nexport type CoreErrorCode =\n | 'unsupportedContainer'\n | 'unsupportedVideoCodec'\n | 'unsupportedAudioCodec'\n | 'invalidContainerData'\n | 'invalidCodecConfig'\n | 'invalidTimestamp'\n | 'muxerError'\n | 'internalError'\n\nexport type CoreError = {\n code: CoreErrorCode\n message: string\n}\n\nexport type CoreProbeResult = {\n container: 'flv' | 'mpegts'\n video?: 'avc' | 'hevc' | 'av1'\n audio?: 'aac' | 'mp3' | 'ac3' | 'eac3' | 'opus'\n}\n\nexport type CoreMediaInfo = {\n container: CoreProbeResult['container']\n video?: CoreProbeResult['video']\n audio?: CoreProbeResult['audio']\n videoCodec?: string\n audioCodec?: string\n width?: number\n height?: number\n audioSampleRate?: number\n audioChannelCount?: number\n}\n\nexport type CoreWarning = {\n code: string\n message: string\n}\n\nexport type CoreTrackKind = 'video' | 'audio' | 'muxed'\n\nexport type CoreInitSegment = {\n track: CoreTrackKind\n codec: string\n timescale: number\n bytes: Uint8Array\n}\n\nexport type CoreMediaSegment = {\n track: CoreTrackKind\n dtsStartMs: number\n dtsEndMs: number\n keyframe: boolean\n bytes: Uint8Array\n}\n\nexport type CoreEvent =\n | { type: 'probeResult'; data: CoreProbeResult }\n | { type: 'mediaInfo'; data: CoreMediaInfo }\n | { type: 'initSegment'; data: CoreInitSegment }\n | { type: 'mediaSegment'; data: CoreMediaSegment }\n | { type: 'videoConfig'; data: unknown }\n | { type: 'audioConfig'; data: unknown }\n | { type: 'videoSample'; data: unknown }\n | { type: 'audioSample'; data: unknown }\n | { type: 'metadata'; data: unknown }\n | { type: 'warning'; data: CoreWarning }\n | { type: 'fatalError'; data: CoreError }\n | { type: 'discontinuity'; data: unknown }\n\nexport type TransmuxCoreHost = {\n pushChunk(chunk: Uint8Array): CoreEvent[]\n flush(): CoreEvent[]\n reset(): void\n destroy(): void\n}\n\nexport type TransmuxCoreWasmConstructor = new () => {\n pushChunk(chunk: Uint8Array): unknown\n flush(): unknown\n reset(): void\n destroy(): void\n}\n\nexport class WasmTransmuxCoreHost implements TransmuxCoreHost {\n private readonly core: InstanceType<TransmuxCoreWasmConstructor>\n\n constructor(Core: TransmuxCoreWasmConstructor) {\n this.core = new Core()\n }\n\n pushChunk(chunk: Uint8Array): CoreEvent[] {\n return normalizeCoreEvents(this.core.pushChunk(chunk))\n }\n\n flush(): CoreEvent[] {\n return normalizeCoreEvents(this.core.flush())\n }\n\n reset(): void {\n this.core.reset()\n }\n\n destroy(): void {\n this.core.destroy()\n }\n}\n\nexport function normalizeCoreEvents(value: unknown): CoreEvent[] {\n if (!Array.isArray(value)) {\n throw new TypeError('Transmux core returned a non-array event payload.')\n }\n\n return value.map((event) => normalizeCoreEvent(event))\n}\n\nexport function coreMediaInfoToPlayerMediaInfo(mediaInfo: CoreMediaInfo): MediaInfo {\n const result: MediaInfo = {\n container: mediaInfo.container,\n }\n if (mediaInfo.videoCodec !== undefined) {\n result.videoCodec = mediaInfo.videoCodec\n }\n if (mediaInfo.audioCodec !== undefined) {\n result.audioCodec = mediaInfo.audioCodec\n }\n if (mediaInfo.width !== undefined) {\n result.width = mediaInfo.width\n }\n if (mediaInfo.height !== undefined) {\n result.height = mediaInfo.height\n }\n if (mediaInfo.audioSampleRate !== undefined) {\n result.audioSampleRate = mediaInfo.audioSampleRate\n }\n if (mediaInfo.audioChannelCount !== undefined) {\n result.audioChannelCount = mediaInfo.audioChannelCount\n }\n return result\n}\n\nexport function coreErrorToPlayerError(error: CoreError): PlayerError {\n return {\n kind: coreErrorKind(error.code),\n code: `RIVMUX_CORE_${coreErrorCodeLabel(error.code)}`,\n message: error.message,\n terminal: true,\n }\n}\n\nexport function coreWarningToPlayerWarning(warning: CoreWarning): PlayerWarning {\n return {\n code: warning.code,\n message: warning.message,\n }\n}\n\nfunction normalizeCoreEvent(value: unknown): CoreEvent {\n if (!isRecord(value) || typeof value.type !== 'string') {\n throw new TypeError('Transmux core event is missing a string type.')\n }\n\n const data = value.data\n switch (value.type) {\n case 'probeResult':\n return { type: 'probeResult', data: normalizeProbeResult(data) }\n case 'mediaInfo':\n return { type: 'mediaInfo', data: normalizeMediaInfo(data) }\n case 'initSegment':\n return { type: 'initSegment', data: normalizeInitSegment(data) }\n case 'mediaSegment':\n return { type: 'mediaSegment', data: normalizeMediaSegment(data) }\n case 'videoConfig':\n case 'audioConfig':\n case 'videoSample':\n case 'audioSample':\n case 'metadata':\n case 'discontinuity':\n return { type: value.type, data }\n case 'warning':\n return { type: 'warning', data: normalizeWarning(data) }\n case 'fatalError':\n return { type: 'fatalError', data: normalizeError(data) }\n default:\n throw new TypeError(`Unsupported transmux core event type: ${value.type}.`)\n }\n}\n\nfunction normalizeInitSegment(value: unknown): CoreInitSegment {\n if (!isRecord(value)) {\n throw new TypeError('Transmux core initSegment event payload must be an object.')\n }\n\n const track = normalizeTrackKind(value.track)\n const codec = normalizeRequiredPrimitive(value.codec, 'string', 'initSegment codec')\n const timescale = normalizeRequiredPrimitive(value.timescale, 'number', 'initSegment timescale')\n const bytes = normalizeBytes(value.bytes, 'initSegment bytes')\n\n return { track, codec, timescale, bytes }\n}\n\nfunction normalizeMediaSegment(value: unknown): CoreMediaSegment {\n if (!isRecord(value)) {\n throw new TypeError('Transmux core mediaSegment event payload must be an object.')\n }\n\n const track = normalizeTrackKind(value.track)\n const dtsStartMs = normalizeRequiredPrimitive(value.dtsStartMs, 'number', 'mediaSegment dtsStartMs')\n const dtsEndMs = normalizeRequiredPrimitive(value.dtsEndMs, 'number', 'mediaSegment dtsEndMs')\n const keyframe = normalizeRequiredPrimitive(value.keyframe, 'boolean', 'mediaSegment keyframe')\n const bytes = normalizeBytes(value.bytes, 'mediaSegment bytes')\n\n return { track, dtsStartMs, dtsEndMs, keyframe, bytes }\n}\n\nfunction normalizeProbeResult(value: unknown): CoreProbeResult {\n if (!isRecord(value) || (value.container !== 'flv' && value.container !== 'mpegts')) {\n throw new TypeError('Transmux core probe result has an unsupported container.')\n }\n\n const result: CoreProbeResult = {\n container: value.container,\n }\n const video = normalizeOptionalString(value.video, ['avc', 'hevc', 'av1'])\n const audio = normalizeOptionalString(value.audio, ['aac', 'mp3', 'ac3', 'eac3', 'opus'])\n if (video !== undefined) {\n result.video = video\n }\n if (audio !== undefined) {\n result.audio = audio\n }\n return result\n}\n\nfunction normalizeMediaInfo(value: unknown): CoreMediaInfo {\n if (!isRecord(value)) {\n throw new TypeError('Transmux core mediaInfo event payload must be an object.')\n }\n\n const result: CoreMediaInfo = {\n ...normalizeProbeResult(value),\n }\n const videoCodec = normalizeOptionalPrimitive(value.videoCodec, 'string')\n const audioCodec = normalizeOptionalPrimitive(value.audioCodec, 'string')\n const width = normalizeOptionalPrimitive(value.width, 'number')\n const height = normalizeOptionalPrimitive(value.height, 'number')\n const audioSampleRate = normalizeOptionalPrimitive(value.audioSampleRate, 'number')\n const audioChannelCount = normalizeOptionalPrimitive(value.audioChannelCount, 'number')\n if (videoCodec !== undefined) {\n result.videoCodec = videoCodec\n }\n if (audioCodec !== undefined) {\n result.audioCodec = audioCodec\n }\n if (width !== undefined) {\n result.width = width\n }\n if (height !== undefined) {\n result.height = height\n }\n if (audioSampleRate !== undefined) {\n result.audioSampleRate = audioSampleRate\n }\n if (audioChannelCount !== undefined) {\n result.audioChannelCount = audioChannelCount\n }\n return result\n}\n\nfunction normalizeWarning(value: unknown): CoreWarning {\n if (!isRecord(value) || typeof value.code !== 'string' || typeof value.message !== 'string') {\n throw new TypeError('Transmux core warning payload must include code and message.')\n }\n\n return {\n code: value.code,\n message: value.message,\n }\n}\n\nfunction normalizeError(value: unknown): CoreError {\n if (!isRecord(value) || typeof value.code !== 'string' || typeof value.message !== 'string') {\n throw new TypeError('Transmux core error payload must include code and message.')\n }\n\n return {\n code: normalizeCoreErrorCode(value.code),\n message: value.message,\n }\n}\n\nfunction normalizeCoreErrorCode(code: string): CoreErrorCode {\n const codes = [\n 'unsupportedContainer',\n 'unsupportedVideoCodec',\n 'unsupportedAudioCodec',\n 'invalidContainerData',\n 'invalidCodecConfig',\n 'invalidTimestamp',\n 'muxerError',\n 'internalError',\n ] as const\n\n if (!codes.includes(code as CoreErrorCode)) {\n throw new TypeError(`Unsupported transmux core error code: ${code}.`)\n }\n\n return code as CoreErrorCode\n}\n\nfunction coreErrorKind(code: CoreErrorCode): PlayerError['kind'] {\n switch (code) {\n case 'unsupportedContainer':\n case 'unsupportedVideoCodec':\n case 'unsupportedAudioCodec':\n return 'unsupported'\n case 'invalidContainerData':\n return 'demux'\n case 'invalidCodecConfig':\n return 'codec'\n case 'invalidTimestamp':\n return 'demux'\n case 'muxerError':\n return 'mux'\n case 'internalError':\n return 'runtime'\n }\n}\n\nfunction coreErrorCodeLabel(code: CoreErrorCode): string {\n return code.replace(/[A-Z]/g, (letter) => `_${letter}`).toUpperCase()\n}\n\nfunction normalizeOptionalString<const T extends string>(value: unknown, allowed: readonly T[]): T | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n\n if (typeof value === 'string' && allowed.includes(value as T)) {\n return value as T\n }\n\n throw new TypeError(`Unexpected transmux core enum value: ${String(value)}.`)\n}\n\nfunction normalizeOptionalPrimitive<T extends 'string' | 'number'>(value: unknown, expectedType: T): (T extends 'string' ? string : number) | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n\n if (typeof value === expectedType) {\n return value as T extends 'string' ? string : number\n }\n\n throw new TypeError(`Expected optional ${expectedType}, received ${typeof value}.`)\n}\n\nfunction normalizeRequiredPrimitive<T extends 'string' | 'number' | 'boolean'>(\n value: unknown,\n expectedType: T,\n field: string\n): T extends 'string' ? string : T extends 'number' ? number : boolean {\n if (typeof value !== expectedType) {\n throw new TypeError(`Expected ${field} to be ${expectedType}, received ${typeof value}.`)\n }\n\n return value as T extends 'string' ? string : T extends 'number' ? number : boolean\n}\n\nfunction normalizeTrackKind(value: unknown): CoreTrackKind {\n if (value === 'video' || value === 'audio' || value === 'muxed') {\n return value\n }\n\n throw new TypeError(`Unsupported transmux core track kind: ${String(value)}.`)\n}\n\nfunction normalizeBytes(value: unknown, field: string): Uint8Array {\n if (value instanceof Uint8Array) {\n return value\n }\n\n if (Array.isArray(value) && value.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {\n return new Uint8Array(value)\n }\n\n throw new TypeError(`Expected ${field} to be Uint8Array-compatible bytes.`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","/* @ts-self-types=\"./rivmux_transmux_core.d.ts\" */\n\nexport class TransmuxCore {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n TransmuxCoreFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_transmuxcore_free(ptr, 0);\n }\n destroy() {\n wasm.transmuxcore_destroy(this.__wbg_ptr);\n }\n /**\n * @returns {any}\n */\n flush() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.transmuxcore_flush(retptr, this.__wbg_ptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return takeObject(r0);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n constructor() {\n const ret = wasm.transmuxcore_new();\n this.__wbg_ptr = ret;\n TransmuxCoreFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {Uint8Array} data\n * @returns {any}\n */\n pushChunk(data) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export);\n const len0 = WASM_VECTOR_LEN;\n wasm.transmuxcore_pushChunk(retptr, this.__wbg_ptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return takeObject(r0);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n }\n reset() {\n wasm.transmuxcore_reset(this.__wbg_ptr);\n }\n}\nif (Symbol.dispose) TransmuxCore.prototype[Symbol.dispose] = TransmuxCore.prototype.free;\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_fdd633d4bb5dd76a: function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n },\n __wbg_String_8564e559799eccda: function(arg0, arg1) {\n const ret = String(getObject(arg1));\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_throw_ea4887a5f8f9a9db: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_new_2e117a478906f062: function() {\n const ret = new Object();\n return addHeapObject(ret);\n },\n __wbg_new_36e147a8ced3c6e0: function() {\n const ret = new Array();\n return addHeapObject(ret);\n },\n __wbg_set_6be42768c690e380: function(arg0, arg1, arg2) {\n getObject(arg0)[takeObject(arg1)] = takeObject(arg2);\n },\n __wbg_set_dc601f4a69da0bc2: function(arg0, arg1, arg2) {\n getObject(arg0)[arg1 >>> 0] = takeObject(arg2);\n },\n __wbindgen_cast_0000000000000001: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000002: function(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return addHeapObject(ret);\n },\n __wbindgen_cast_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n },\n __wbindgen_object_clone_ref: function(arg0) {\n const ret = getObject(arg0);\n return addHeapObject(ret);\n },\n __wbindgen_object_drop_ref: function(arg0) {\n takeObject(arg0);\n },\n };\n return {\n __proto__: null,\n \"./rivmux_transmux_core_bg.js\": import0,\n };\n}\n\nconst TransmuxCoreFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_transmuxcore_free(ptr, 1));\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction dropObject(idx) {\n if (idx < 1028) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap = new Array(1024).fill(undefined);\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasmInstance, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasmInstance = instance;\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = module.ok && expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (module_or_path === undefined) {\n module_or_path = new URL('rivmux_transmux_core_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","import { WasmTransmuxCoreHost } from './rivmux-transmux-wasm'\nimport initBundledTransmuxCore, { TransmuxCore as BundledTransmuxCore } from '@rivmux/transmux-core'\n\nimport type { TransmuxCoreHost, TransmuxCoreWasmConstructor } from './rivmux-transmux-wasm'\n\nexport function createWasmTransmuxCoreHost(Core: TransmuxCoreWasmConstructor | undefined): TransmuxCoreHost {\n if (Core === undefined) {\n throw new TypeError('WASM transmux core constructor is not available.')\n }\n\n return new WasmTransmuxCoreHost(Core)\n}\n\nexport async function loadWasmTransmuxCoreHost(wasmUrl: string | undefined): Promise<TransmuxCoreHost> {\n const source = wasmUrl ?? new URL('./rivmux-transmux-core.wasm', import.meta.url)\n await initBundledTransmuxCore(source)\n return createWasmTransmuxCoreHost(BundledTransmuxCore)\n}\n","import { LatencyController } from './latency/latency-controller'\nimport { HttpFlvLoader, HttpFlvLoaderError, isAbortLikeError } from './loader/http-flv-loader'\nimport { MseController } from './mse/mse-controller'\nimport { REQUIRED_MSE_MIME_TYPES } from './mse/mime'\nimport { loadWasmTransmuxCoreHost } from './wasm/wasm-loader'\nimport { coreErrorToPlayerError, coreMediaInfoToPlayerMediaInfo, coreWarningToPlayerWarning } from './wasm/rivmux-transmux-wasm'\n\nimport type { BufferedRange } from './latency/buffer-ranges'\nimport type { LatencyMetrics } from './latency/latency-controller'\nimport type { StreamLoader, StreamLoaderConfig, StreamLoaderStats } from './loader/loader'\nimport type { NormalizedRivmuxPlayerOptions, PlayerError, VideoElementState, WorkerCommand, WorkerMessage } from '@rivmux/protocol'\nimport type { CoreEvent, TransmuxCoreHost } from './wasm/rivmux-transmux-wasm'\n\ntype RuntimeState = 'idle' | 'ready' | 'attached' | 'started' | 'stopped' | 'destroyed' | 'fatal-error'\ntype RuntimeMseCleanupOptions = {\n force?: boolean\n}\n\nexport type RuntimeWorkerPort = {\n postMessage(message: WorkerMessage, transfer?: Transferable[]): void\n close(): void\n}\n\nexport type RuntimeMseController = {\n readonly appendQueueLength: number\n readonly appendQueueBytes: number\n readonly sourceBufferUpdating: boolean\n readonly sourceBufferCount: number\n readonly bufferedStart: number | undefined\n readonly bufferedEnd: number | undefined\n readonly bufferedDuration: number | undefined\n readonly bufferedRanges: BufferedRange[]\n readonly bufferedRangeCount: number\n createMediaSourceHandle(): Promise<MediaSourceHandle>\n appendInitSegment(segment: Extract<CoreEvent, { type: 'initSegment' }>['data']): Promise<void>\n appendMediaSegment(segment: Extract<CoreEvent, { type: 'mediaSegment' }>['data']): Promise<void>\n cleanupBefore(cutoff: number, options?: RuntimeMseCleanupOptions): Promise<void>\n destroy(): void\n}\n\nexport type RuntimeWorkerDependencies = {\n createMseController?: () => RuntimeMseController\n createLoader?: (config: StreamLoaderConfig) => StreamLoader\n createTransmuxCore?: (options: NormalizedRivmuxPlayerOptions) => TransmuxCoreHost | undefined | Promise<TransmuxCoreHost | undefined>\n detectRuntime?: () => PlayerError | undefined\n now?: () => number\n}\n\nexport class RuntimeWorker {\n private readonly port: RuntimeWorkerPort\n private readonly createMseController: () => RuntimeMseController\n private readonly createLoader: (config: StreamLoaderConfig) => StreamLoader\n private readonly createTransmuxCore: (options: NormalizedRivmuxPlayerOptions) => TransmuxCoreHost | undefined | Promise<TransmuxCoreHost | undefined>\n private readonly detectRuntime: () => PlayerError | undefined\n private readonly now: () => number\n private state: RuntimeState = 'idle'\n private url?: string\n private options?: NormalizedRivmuxPlayerOptions\n private mse?: RuntimeMseController\n private loader?: StreamLoader\n private transmuxCore?: TransmuxCoreHost\n private latencyController?: LatencyController\n private videoState?: VideoElementState\n private lastLatencyMetrics: LatencyMetrics = {}\n private statsTimer?: ReturnType<typeof setInterval>\n private statsTickInFlight = false\n private loaderRunId = 0\n private outputBytes = 0\n private appendQueueMaxLength = 0\n private appendQueueMaxBytes = 0\n\n constructor(port: RuntimeWorkerPort, dependencies: RuntimeWorkerDependencies = {}) {\n this.port = port\n this.createMseController = dependencies.createMseController ?? (() => new MseController())\n this.createLoader = dependencies.createLoader ?? ((config) => new HttpFlvLoader(config))\n this.createTransmuxCore = dependencies.createTransmuxCore ?? ((options) => loadWasmTransmuxCoreHost(options.runtime.wasmUrl))\n this.detectRuntime = dependencies.detectRuntime ?? detectWorkerRuntime\n this.now = dependencies.now ?? (() => performance.now())\n }\n\n async handleCommand(command: WorkerCommand): Promise<void> {\n if (this.state === 'destroyed') {\n return\n }\n\n if (this.state === 'fatal-error' && command.type !== 'destroy') {\n return\n }\n\n try {\n switch (command.type) {\n case 'init':\n {\n const runtimeError = this.detectRuntime()\n if (runtimeError !== undefined) {\n this.failWithError(runtimeError)\n return\n }\n }\n this.url = command.url\n this.options = command.options\n this.latencyController = createLatencyController(command.options)\n this.state = 'ready'\n this.post({ type: 'ready' })\n return\n case 'attach-media-source':\n await this.attachMediaSource()\n return\n case 'start':\n await this.start()\n return\n case 'stop':\n await this.stop()\n return\n case 'update-options':\n this.options = this.options === undefined ? undefined : mergeOptions(this.options, command.options)\n if (this.options !== undefined) {\n this.latencyController = createLatencyController(this.options)\n }\n return\n case 'video-state':\n this.videoState = command.state\n await this.applyLatencyPolicy()\n this.postStats()\n return\n case 'playback-control-result':\n this.latencyController?.recordPlaybackControlResult(command.result)\n return\n case 'destroy':\n await this.destroy()\n return\n }\n } catch (cause) {\n this.fail('runtime', 'RIVMUX_WORKER_COMMAND_FAILED', 'Worker command failed.', true, cause)\n }\n }\n\n private async attachMediaSource(): Promise<void> {\n if (this.state === 'idle') {\n this.fail('runtime', 'RIVMUX_WORKER_NOT_INITIALIZED', 'Worker must be initialized before attach.', true)\n return\n }\n\n if (this.mse === undefined) {\n this.mse = this.createMseController()\n }\n\n try {\n const handle = await this.mse.createMediaSourceHandle()\n this.post({ type: 'media-source-handle', handle }, [handle])\n this.state = 'attached'\n } catch (cause) {\n this.fail('mse', 'RIVMUX_MSE_ATTACH_FAILED', 'MSE media source attachment failed.', true, cause)\n }\n }\n\n private async start(): Promise<void> {\n const options = this.options\n if (this.mse === undefined || options === undefined || this.state === 'idle' || this.state === 'ready') {\n this.fail('runtime', 'RIVMUX_WORKER_START_REQUIRES_ATTACH', 'Worker start requires an attached MediaSource.', true)\n return\n }\n\n if (this.state === 'started') {\n return\n }\n\n let transmuxCore: TransmuxCoreHost\n try {\n const createdCore = await this.createTransmuxCore(options)\n if (createdCore === undefined) {\n this.fail('runtime', 'RIVMUX_TRANSMUX_CORE_UNAVAILABLE', 'Transmux core is not available.', true)\n return\n }\n transmuxCore = createdCore\n } catch (cause) {\n this.fail('runtime', 'RIVMUX_TRANSMUX_CORE_UNAVAILABLE', 'Transmux core is not available.', true, cause)\n return\n }\n\n this.transmuxCore?.destroy()\n this.transmuxCore = transmuxCore\n this.state = 'started'\n this.outputBytes = 0\n this.appendQueueMaxLength = 0\n this.appendQueueMaxBytes = 0\n this.startStatsTimer()\n await this.applyLatencyPolicy()\n this.postStats()\n this.startLoader()\n }\n\n private async stop(): Promise<void> {\n await this.closeLoader()\n this.mse?.destroy()\n this.mse = undefined\n this.latencyController?.reset()\n this.videoState = undefined\n this.lastLatencyMetrics = {}\n this.state = 'stopped'\n this.post({ type: 'stopped' })\n }\n\n private async destroy(): Promise<void> {\n await this.closeLoader()\n this.mse?.destroy()\n this.mse = undefined\n this.latencyController?.reset()\n this.videoState = undefined\n this.lastLatencyMetrics = {}\n this.state = 'destroyed'\n this.post({ type: 'destroyed' })\n this.port.close()\n }\n\n private startLoader(): void {\n const options = this.options\n const url = this.url\n if (options === undefined || url === undefined) {\n this.fail('runtime', 'RIVMUX_WORKER_NOT_INITIALIZED', 'Worker must be initialized before loader start.', true)\n return\n }\n\n const loader = this.createLoader({\n url,\n network: options.network,\n })\n const runId = this.loaderRunId + 1\n this.loaderRunId = runId\n this.loader = loader\n\n void this.runLoader(loader, runId)\n }\n\n private async runLoader(loader: StreamLoader, runId: number): Promise<void> {\n try {\n await loader.open()\n\n while (this.isCurrentLoader(loader, runId)) {\n await this.applyLatencyPolicy()\n const chunk = await loader.read()\n if (chunk === null) {\n break\n }\n\n this.postStats(loader.stats)\n if (!(await this.processTransmuxEvents(this.transmuxCore?.pushChunk(chunk.bytes) ?? []))) {\n await this.closeCurrentLoader(loader, runId)\n return\n }\n await this.applyLatencyPolicy()\n this.postStats(loader.stats)\n }\n } catch (cause) {\n if (!this.isCurrentLoader(loader, runId) || isAbortLikeError(cause)) {\n return\n }\n\n await this.closeCurrentLoader(loader, runId)\n this.fail('network', getNetworkErrorCode(cause), 'HTTP Fetch loader failed.', true, cause)\n return\n } finally {\n if (this.isCurrentLoader(loader, runId)) {\n await this.closeCurrentLoader(loader, runId)\n }\n }\n }\n\n private async closeLoader(): Promise<void> {\n this.stopStatsTimer()\n const loader = this.loader\n if (loader === undefined) {\n return\n }\n\n this.loader = undefined\n this.loaderRunId += 1\n this.transmuxCore?.destroy()\n this.transmuxCore = undefined\n await loader.close()\n }\n\n private async closeCurrentLoader(loader: StreamLoader, runId: number): Promise<void> {\n if (this.loader !== loader || this.loaderRunId !== runId) {\n return\n }\n\n this.stopStatsTimer()\n this.loader = undefined\n this.loaderRunId += 1\n this.transmuxCore?.destroy()\n this.transmuxCore = undefined\n await loader.close()\n }\n\n private isCurrentLoader(loader: StreamLoader, runId: number): boolean {\n return this.loader === loader && this.loaderRunId === runId && this.state === 'started'\n }\n\n private postStats(loaderStats?: StreamLoaderStats): void {\n const metrics = this.lastLatencyMetrics\n const mseStats = this.collectMseStats()\n const loaderSnapshot = loaderStats ?? this.loader?.stats\n this.post({\n type: 'stats',\n stats: {\n bytesReceived: loaderSnapshot?.bytesReceived ?? 0,\n currentNetworkSpeed: loaderSnapshot?.currentNetworkSpeed ?? 0,\n networkIdleMs: getNetworkIdleMs(loaderSnapshot, this.now()),\n outputBytes: this.outputBytes,\n appendQueueLength: mseStats.appendQueueLength,\n appendQueueBytes: mseStats.appendQueueBytes,\n appendQueueMaxLength: this.appendQueueMaxLength,\n appendQueueMaxBytes: this.appendQueueMaxBytes,\n loaderPaused: this.loader?.paused ?? false,\n sourceBufferUpdating: mseStats.sourceBufferUpdating,\n sourceBufferCount: mseStats.sourceBufferCount,\n bufferedStart: metrics.bufferedStart ?? this.mse?.bufferedStart,\n bufferedEnd: metrics.bufferedEnd ?? this.mse?.bufferedEnd,\n bufferedDuration: metrics.bufferedDuration ?? this.mse?.bufferedDuration,\n bufferedRangeCount: mseStats.bufferedRangeCount,\n currentTime: metrics.currentTime,\n liveLatency: metrics.liveLatency,\n playbackRate: metrics.playbackRate,\n readyState: metrics.readyState,\n droppedFrames: metrics.droppedFrames,\n },\n })\n }\n\n private async processTransmuxEvents(events: CoreEvent[]): Promise<boolean> {\n for (const event of events) {\n switch (event.type) {\n case 'mediaInfo':\n this.post({ type: 'media-info', mediaInfo: coreMediaInfoToPlayerMediaInfo(event.data) })\n break\n case 'warning':\n this.post({ type: 'warning', warning: coreWarningToPlayerWarning(event.data) })\n break\n case 'fatalError':\n this.failWithError(coreErrorToPlayerError(event.data))\n return false\n case 'initSegment':\n if (!(await this.appendToMse(() => this.mse?.appendInitSegment(event.data)))) {\n return false\n }\n this.outputBytes += event.data.bytes.byteLength\n await this.applyLatencyPolicy()\n break\n case 'mediaSegment':\n if (!(await this.appendToMse(() => this.mse?.appendMediaSegment(event.data)))) {\n return false\n }\n this.outputBytes += event.data.bytes.byteLength\n await this.applyLatencyPolicy()\n break\n case 'probeResult':\n case 'videoConfig':\n case 'audioConfig':\n case 'videoSample':\n case 'audioSample':\n case 'metadata':\n case 'discontinuity':\n break\n }\n }\n\n return true\n }\n\n private collectMseStats(): {\n appendQueueLength: number\n appendQueueBytes: number\n sourceBufferUpdating: boolean\n sourceBufferCount: number\n bufferedRangeCount: number\n } {\n const appendQueueLength = this.mse?.appendQueueLength ?? 0\n const appendQueueBytes = this.mse?.appendQueueBytes ?? 0\n this.appendQueueMaxLength = Math.max(this.appendQueueMaxLength, appendQueueLength)\n this.appendQueueMaxBytes = Math.max(this.appendQueueMaxBytes, appendQueueBytes)\n\n return {\n appendQueueLength,\n appendQueueBytes,\n sourceBufferUpdating: this.mse?.sourceBufferUpdating ?? false,\n sourceBufferCount: this.mse?.sourceBufferCount ?? 0,\n bufferedRangeCount: this.mse?.bufferedRangeCount ?? 0,\n }\n }\n\n private async appendToMse(append: () => Promise<void> | undefined): Promise<boolean> {\n try {\n await append()\n return true\n } catch (cause) {\n if (isQuotaExceededError(cause) && (await this.retryAppendAfterQuotaCleanup(append))) {\n return true\n }\n\n this.fail('mse', 'RIVMUX_MSE_APPEND_FAILED', 'MSE append failed.', true, cause)\n return false\n }\n }\n\n private async retryAppendAfterQuotaCleanup(append: () => Promise<void> | undefined): Promise<boolean> {\n const mse = this.mse\n const cutoff = this.quotaCleanupCutoff()\n if (mse === undefined || cutoff === undefined || cutoff <= 0) {\n return false\n }\n\n try {\n await mse.cleanupBefore(cutoff, { force: true })\n await append()\n this.post({\n type: 'warning',\n warning: {\n code: 'RIVMUX_MSE_QUOTA_RETRY',\n message: 'MSE quota was exceeded; old buffered ranges were cleaned before retrying append.',\n },\n })\n return true\n } catch {\n return false\n }\n }\n\n private quotaCleanupCutoff(): number | undefined {\n const backwardBuffer = this.options?.latency.backwardBuffer ?? 0\n const currentTime = this.videoState?.currentTime\n if (currentTime !== undefined && Number.isFinite(currentTime)) {\n return Math.max(0, currentTime - backwardBuffer)\n }\n\n const bufferedEnd = this.mse?.bufferedEnd\n return bufferedEnd === undefined ? undefined : Math.max(0, bufferedEnd - backwardBuffer)\n }\n\n private async applyLatencyPolicy(): Promise<void> {\n const latencyController = this.latencyController\n const mse = this.mse\n if (latencyController === undefined || mse === undefined) {\n return\n }\n\n const loader = this.loader\n const evaluation = latencyController.evaluate({\n ranges: mse.bufferedRanges,\n videoState: this.videoState,\n loaderPaused: loader?.paused ?? false,\n nowMs: this.now(),\n })\n this.lastLatencyMetrics = evaluation.metrics\n\n if (evaluation.cleanupBefore !== undefined) {\n await mse.cleanupBefore(evaluation.cleanupBefore)\n }\n\n if (loader !== undefined && evaluation.loaderCommand === 'pause') {\n loader.pause()\n } else if (loader !== undefined && evaluation.loaderCommand === 'resume') {\n loader.resume()\n }\n\n if (evaluation.playbackControl !== undefined) {\n this.post({ type: 'playback-control', action: evaluation.playbackControl })\n }\n }\n\n private startStatsTimer(): void {\n this.stopStatsTimer()\n const intervalMs = this.options?.diagnostics.statsIntervalMs\n if (intervalMs === undefined || intervalMs <= 0) {\n return\n }\n\n this.statsTimer = setInterval(() => {\n void this.emitStatsTick()\n }, intervalMs)\n }\n\n private stopStatsTimer(): void {\n if (this.statsTimer === undefined) {\n return\n }\n\n clearInterval(this.statsTimer)\n this.statsTimer = undefined\n this.statsTickInFlight = false\n }\n\n private async emitStatsTick(): Promise<void> {\n if (this.statsTickInFlight || this.state !== 'started') {\n return\n }\n\n this.statsTickInFlight = true\n try {\n await this.applyLatencyPolicy()\n this.postStats()\n } catch (cause) {\n this.fail('mse', 'RIVMUX_MSE_LATENCY_POLICY_FAILED', 'MSE latency policy failed.', true, cause)\n } finally {\n this.statsTickInFlight = false\n }\n }\n\n private fail(kind: PlayerError['kind'], code: string, message: string, terminal: boolean, cause?: unknown): void {\n const error = cause === undefined ? { kind, code, message, terminal } : { kind, code, message, terminal, cause: serializeCause(cause) }\n this.failWithError(error)\n }\n\n private failWithError(error: PlayerError): void {\n if (error.terminal) {\n this.enterFatalErrorState()\n }\n this.post({ type: 'error', error })\n }\n\n private enterFatalErrorState(): void {\n if (this.state === 'fatal-error') {\n return\n }\n\n this.state = 'fatal-error'\n void this.closeLoader()\n this.mse?.destroy()\n this.mse = undefined\n this.latencyController?.reset()\n this.videoState = undefined\n this.lastLatencyMetrics = {}\n }\n\n private post(message: WorkerMessage, transfer?: Transferable[]): void {\n this.port.postMessage(message, transfer)\n }\n}\n\nfunction getNetworkErrorCode(cause: unknown): string {\n return cause instanceof HttpFlvLoaderError ? cause.code : 'RIVMUX_HTTP_LOADER_FAILED'\n}\n\nfunction getNetworkIdleMs(stats: StreamLoaderStats | undefined, nowMs: number): number | undefined {\n const markerMs = stats?.lastChunkAtMs ?? stats?.startedAtMs\n if (markerMs === undefined) {\n return undefined\n }\n\n return Math.max(nowMs - markerMs, 0)\n}\n\nfunction serializeCause(cause: unknown): unknown {\n if (cause instanceof Error) {\n return {\n name: cause.name,\n message: cause.message,\n }\n }\n\n return cause\n}\n\nfunction isQuotaExceededError(cause: unknown): boolean {\n return isNamedError(cause, 'QuotaExceededError')\n}\n\nfunction isNamedError(value: unknown, name: string): boolean {\n return typeof value === 'object' && value !== null && 'name' in value && (value as { name?: unknown }).name === name\n}\n\nfunction detectWorkerRuntime(): PlayerError | undefined {\n if (typeof fetch !== 'function') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_FETCH', 'Fetch is not available in this worker runtime.')\n }\n\n if (typeof ReadableStream === 'undefined') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_READABLE_STREAM', 'ReadableStream is not available in this worker runtime.')\n }\n\n if (typeof WebAssembly === 'undefined') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_WASM', 'WebAssembly is not available in this worker runtime.')\n }\n\n if (typeof MediaSource === 'undefined') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_MSE', 'MediaSource is not available in this worker runtime.')\n }\n\n if (MediaSource.canConstructInDedicatedWorker !== true) {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_WORKER_MSE', 'MediaSource cannot be constructed in this worker runtime.')\n }\n\n if (typeof MediaSource.isTypeSupported !== 'function') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_MSE_TYPE_CHECK', 'MediaSource.isTypeSupported is not available in this worker runtime.')\n }\n\n for (const requirement of REQUIRED_MSE_MIME_TYPES) {\n if (!MediaSource.isTypeSupported(requirement.mimeType)) {\n return createUnsupportedRuntimeError(requirement.unsupportedCode, `MSE does not support ${requirement.mimeType}.`)\n }\n }\n\n return undefined\n}\n\nfunction createUnsupportedRuntimeError(code: string, message: string): PlayerError {\n return { kind: 'unsupported', code, message, terminal: true }\n}\n\nfunction createLatencyController(options: NormalizedRivmuxPlayerOptions): LatencyController {\n return new LatencyController({\n latency: options.latency,\n playback: options.playback,\n })\n}\n\nfunction mergeOptions(current: NormalizedRivmuxPlayerOptions, updates: Partial<NormalizedRivmuxPlayerOptions>): NormalizedRivmuxPlayerOptions {\n return {\n playback: {\n ...current.playback,\n ...updates.playback,\n },\n latency: {\n ...current.latency,\n ...updates.latency,\n },\n network: {\n ...current.network,\n ...updates.network,\n headers: {\n ...current.network.headers,\n ...updates.network?.headers,\n },\n retry: {\n ...current.network.retry,\n ...updates.network?.retry,\n },\n },\n runtime: {\n ...current.runtime,\n ...updates.runtime,\n },\n diagnostics: {\n ...current.diagnostics,\n ...updates.diagnostics,\n },\n }\n}\n","import { RuntimeWorker } from './runtime'\n\nimport type { WorkerCommand, WorkerMessage } from '@rivmux/protocol'\n\nexport { RuntimeWorker } from './runtime'\nexport { HttpFlvLoader, HttpFlvLoaderError } from './loader/http-flv-loader'\nexport { MseController } from './mse/mse-controller'\nexport { SourceBufferQueue } from './mse/source-buffer-queue'\nexport { isMseSupported } from './mse/mime'\nexport { WasmTransmuxCoreHost, normalizeCoreEvents } from './wasm/rivmux-transmux-wasm'\nexport { createWasmTransmuxCoreHost } from './wasm/wasm-loader'\nexport type { StreamChunk, StreamLoader, StreamLoaderConfig, StreamLoaderStats } from './loader/loader'\nexport type { CoreEvent, TransmuxCoreHost, TransmuxCoreWasmConstructor } from './wasm/rivmux-transmux-wasm'\n\ntype DedicatedWorkerScopeLike = {\n addEventListener(type: 'message', listener: (event: MessageEvent<WorkerCommand>) => void): void\n postMessage(message: WorkerMessage, transfer?: Transferable[]): void\n close(): void\n}\n\nexport function startRuntimeWorker(scope: DedicatedWorkerScopeLike): RuntimeWorker {\n const runtime = new RuntimeWorker({\n postMessage: (message, transfer) => scope.postMessage(message, transfer),\n close: () => scope.close(),\n })\n\n scope.addEventListener('message', (event) => {\n void runtime.handleCommand(event.data)\n })\n scope.postMessage({ type: 'worker-ready' })\n\n return runtime\n}\n\nconst globalScope = globalThis as typeof globalThis & Partial<DedicatedWorkerScopeLike>\nconst workerGlobalScope = (globalThis as typeof globalThis & { WorkerGlobalScope?: { new (): unknown } }).WorkerGlobalScope\n\nif (workerGlobalScope !== undefined && globalScope instanceof workerGlobalScope && typeof globalScope.postMessage === 'function') {\n startRuntimeWorker(globalScope as DedicatedWorkerScopeLike)\n}\n"],"mappings":";AAKA,SAAgB,wBAAwB,OAA+D;CACrG,IAAI,qBAAqB,KAAK,GAC5B,OAAO,MAAM,OAAO,YAAY,CAAC,CAAC,KAAK,WAAW;EAAE,OAAO,MAAM;EAAO,KAAK,MAAM;CAAI,EAAE;CAG3F,MAAM,SAA0B,CAAC;CACjC,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACpD,MAAM,QAAQ;GACZ,OAAO,MAAM,MAAM,KAAK;GACxB,KAAK,MAAM,IAAI,KAAK;EACtB;EACA,IAAI,aAAa,KAAK,GACpB,OAAO,KAAK,KAAK;CAErB;CACA,OAAO;AACT;AAEA,SAAgB,iBAAiB,QAAsD;CACrF,OAAO,OAAO,WAAW,IAAI,KAAA,IAAY,OAAO,EAAE,EAAE;AACtD;AAEA,SAAgB,YAAY,QAAsD;CAEhF,OADc,OAAO,OAAO,SAAS,EACzB,EAAE;AAChB;AAEA,SAAgB,oBAAoB,QAAsD;CACxF,IAAI,OAAO,WAAW,GACpB;CAGF,OAAO,OAAO,QAAQ,OAAO,UAAU,QAAQ,KAAK,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,GAAG,CAAC;AACxF;AAEA,SAAgB,iBAAiB,QAAkC,aAAyC;CAC1G,IAAI,CAAC,OAAO,SAAS,WAAW,GAC9B;CAGF,MAAM,WAAW,YAAY,MAAM;CACnC,IAAI,aAAa,KAAA,GACf;CAGF,OAAO,KAAK,IAAI,GAAG,WAAW,WAAW;AAC3C;AAsBA,SAAS,aAAa,OAA+B;CACnD,OAAO,OAAO,SAAS,MAAM,KAAK,KAAK,OAAO,SAAS,MAAM,GAAG,KAAK,MAAM,MAAM,MAAM;AACzF;AAEA,SAAS,qBAAqB,OAAiF;CAC7G,OAAO,MAAM,QAAQ,KAAK;AAC5B;;;AChDA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CACA,uBAA+B;CAC/B;CACA,sBAA8B,OAAO;CAErC,YAAY,QAAoF;EAC9F,KAAK,UAAU,OAAO;EACtB,KAAK,WAAW,OAAO;CACzB;CAEA,SAAS,OAAkD;EACzD,MAAM,UAAU,KAAK,eAAe,KAAK;EACzC,MAAM,aAAgC,EAAE,QAAQ;EAEhD,IAAI,QAAQ,gBAAgB,KAAA,GAAW;GACrC,MAAM,gBAAgB,QAAQ,cAAc,KAAK,QAAQ;GACzD,IAAI,gBAAgB,GAClB,WAAW,gBAAgB;EAE/B;EAEA,MAAM,gBAAgB,QAAQ,iBAAiB,QAAQ;EACvD,IAAI,kBAAkB,KAAA;OAChB,CAAC,MAAM,gBAAgB,iBAAiB,KAAK,QAAQ,kBACvD,WAAW,gBAAgB;QACtB,IAAI,MAAM,gBAAgB,iBAAiB,KAAK,QAAQ,QAC7D,WAAW,gBAAgB;EAAA;EAI/B,WAAW,kBAAkB,KAAK,wBAAwB,OAAO,OAAO;EACxE,OAAO;CACT;CAEA,4BAA4B,QAAqC;EAC/D,IAAI,KAAK,2BAA2B,OAAO,MACzC,KAAK,yBAAyB,KAAA;CAElC;CAEA,QAAc;EACZ,KAAK,uBAAuB;EAC5B,KAAK,yBAAyB,KAAA;EAC9B,KAAK,sBAAsB,OAAO;CACpC;CAEA,eAAuB,OAA+C;EACpE,MAAM,gBAAgB,iBAAiB,MAAM,MAAM;EACnD,MAAM,cAAc,YAAY,MAAM,MAAM;EAC5C,MAAM,mBAAmB,oBAAoB,MAAM,MAAM;EACzD,MAAM,aAAa,MAAM;EACzB,MAAM,UAA0B;GAC9B;GACA;GACA;EACF;EAEA,IAAI,eAAe,KAAA,GACjB,OAAO;EAGT,MAAM,gBAAgB,iBAAiB,MAAM,QAAQ,WAAW,WAAW;EAC3E,QAAQ,cAAc,WAAW;EACjC,QAAQ,gBAAgB;EACxB,QAAQ,eAAe,WAAW;EAClC,QAAQ,aAAa,WAAW;EAChC,QAAQ,gBAAgB,WAAW;EACnC,QAAQ,cAAc;EACtB,OAAO;CACT;CAEA,wBAAgC,OAA+B,SAA4D;EACzH,IAAI,KAAK,2BAA2B,KAAA,GAClC;EAGF,IACE,CAAC,KAAK,wBACN,KAAK,SAAS,YACd,QAAQ,qBAAqB,KAAA,KAC7B,QAAQ,oBAAoB,KAAK,QAAQ,eACzC;GACA,KAAK,uBAAuB;GAC5B,KAAK,yBAAyB;GAC9B,OAAO;IAAE,MAAM;IAAQ,QAAQ;GAAuB;EACxD;EAEA,IAAI,MAAM,eAAe,KAAA,KAAa,QAAQ,gBAAgB,KAAA,KAAa,QAAQ,gBAAgB,KAAA,GACjG;EAGF,IAAI,QAAQ,cAAc,KAAK,QAAQ,KAAK;GAC1C,MAAM,aAAa,KAAK,IAAI,QAAQ,iBAAiB,GAAG,QAAQ,cAAc,KAAK,QAAQ,MAAM;GAEjG,IAD+B,MAAM,QAAQ,KAAK,uBAAuB,oBAC3C,KAAK,IAAI,aAAa,MAAM,WAAW,WAAW,KAAK,wBAAwB;IAC3G,KAAK,sBAAsB,MAAM;IACjC,KAAK,yBAAyB;IAC9B,OAAO;KAAE,MAAM;KAAQ,YAAY;KAAY,QAAQ;IAAuB;GAChF;GACA;EACF;EAEA,IAAI,QAAQ,cAAc,KAAK,QAAQ,SAAS;OAC1C,KAAK,IAAI,MAAM,WAAW,eAAe,mBAAmB,KAAK,uBAAuB;IAC1F,KAAK,yBAAyB;IAC9B,OAAO;KAAE,MAAM;KAAqB,cAAc;KAAqB,QAAQ;IAAuB;GACxG;SACK,IAAI,MAAM,WAAW,iBAAiB,KAAK,QAAQ,eAAe,KAAK,QAAQ,SAAS,yCAAyC;GACtI,KAAK,yBAAyB;GAC9B,OAAO;IAAE,MAAM;IAAqB,cAAc;IAAG,QAAQ;GAAsB;EACrF;CAGF;AACF;AAEA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAC9B,MAAM,wCAAwC;AAC9C,MAAM,0CAA0C;AAChD,MAAM,mBAAmB;AACzB,MAAM,yBAAyB;;;ACrJ/B,SAAgB,kBAAkB,OAAsD;CACtF,OAAO;EACL,aAAa,aAAa,OAAO,aAAa,CAAC;EAC/C,WAAW,aAAa,OAAO,WAAW,CAAC;CAC7C;AACF;AAEA,SAAgB,gBAAgB,QAAqB,SAAyB;CAC5E,IAAI,OAAO,cAAc,GACvB,OAAO;CAGT,OAAO,OAAO,YAAY,KAAK,IAAI,GAAG,OAAO;AAC/C;AAEA,SAAS,aAAa,OAA2B,SAAyB;CACxE,IAAI,UAAU,KAAA,KAAa,CAAC,OAAO,SAAS,KAAK,GAC/C,OAAO;CAGT,OAAO,KAAK,IAAI,SAAS,KAAK,MAAM,KAAK,CAAC;AAC5C;;;ACpBA,IAAa,qBAAb,cAAwC,MAAM;CAC5C;CACA;CAEA,YAAY,MAAc,SAAiB,QAAiB;EAC1D,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,SAAS;CAChB;AACF;AAEA,IAAa,gBAAb,MAAmD;CACjD;CACA;CACA;CACA,QAAyB,kBAAkB,KAAA,CAAS;CACpD;CACA;CACA;CACA;CACA;CACA,QAA6B;CAC7B,cAAsB;CACtB,gBAA2C,CAAC;CAC5C,eAAmD;EACjD,eAAe;EACf,qBAAqB;CACvB;CAEA,YAAY,QAA4B;EACtC,KAAK,MAAM,OAAO;EAClB,KAAK,UAAU,OAAO,QAAQ;EAC9B,KAAK,cAAc,OAAO,QAAQ;EAClC,KAAK,QAAQ,kBAAkB,OAAO,QAAQ,KAAK;EACnD,KAAK,YAAY,OAAO,SAAS,WAAW,MAAM,KAAK,UAAU;EACjE,KAAK,MAAM,OAAO,cAAc,YAAY,IAAI;EAChD,KAAK,QAAQ,OAAO,SAAS;CAC/B;CAEA,IAAI,SAAkB;EACpB,OAAO,KAAK,UAAU;CACxB;CAEA,IAAI,SAAkB;EACpB,OAAO,KAAK;CACd;CAEA,IAAI,QAA2B;EAC7B,OAAO,EAAE,GAAG,KAAK,aAAa;CAChC;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,UAAU,QACjB,MAAM,IAAI,mBAAmB,+BAA+B,4CAA4C;EAG1G,KAAK,QAAQ;EACb,KAAK,aAAa,cAAc,KAAK,IAAI;EAEzC,KAAK,IAAI,UAAU,GAAG,WAAW,KAAK,MAAM,aAAa,WAAW,GAAG;GACrE,KAAK,kBAAkB,IAAI,gBAAgB;GAE3C,IAAI;IACF,MAAM,KAAK,YAAY;IACvB;GACF,SAAS,OAAO;IACd,IAAI,KAAK,UAAU,iBAAiB,KAAK,KAAK,WAAW,KAAK,MAAM,aAClE,MAAM;IAGR,MAAM,KAAK,MAAM,gBAAgB,KAAK,OAAO,OAAO,GAAG,KAAK,gBAAgB,MAAM;GACpF;EACF;CACF;CAEA,MAAM,OAAoC;EACxC,MAAM,KAAK,iBAAiB;EAE5B,IAAI,KAAK,QACP,OAAO;EAGT,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW;GACxB,IAAI,KAAK,QACP,OAAO;GAGT,MAAM,IAAI,mBAAmB,0BAA0B,iDAAiD;EAC1G;EAEA,MAAM,SAAS,MAAM,OAAO,KAAK;EACjC,IAAI,OAAO,MAAM;GACf,cAAc,MAAM;GACpB,IAAI,KAAK,WAAW,QAClB,KAAK,SAAS,KAAA;GAEhB,OAAO;EACT;EAEA,MAAM,QAAQ,OAAO;EACrB,MAAM,eAAe,KAAK,IAAI;EAC9B,MAAM,oBAAoB,KAAK,aAAa,iBAAiB,KAAK,aAAa,eAAe;EAC9F,MAAM,iBAAiB,KAAK,KAAK,eAAe,qBAAqB,KAAM,CAAC;EAE5E,KAAK,aAAa,iBAAiB,MAAM;EACzC,KAAK,aAAa,sBAAsB,mBAAmB,IAAI,MAAM,aAAa,MAAM,aAAa;EACrG,KAAK,aAAa,gBAAgB;EAElC,OAAO;GAAE;GAAO;EAAa;CAC/B;CAEA,QAAc;EACZ,IAAI,KAAK,QACP;EAGF,KAAK,cAAc;CACrB;CAEA,SAAe;EACb,IAAI,CAAC,KAAK,aACR;EAGF,KAAK,cAAc;EACnB,KAAK,qBAAqB;CAC5B;CAEA,MAAM,QAAuB;EAC3B,IAAI,KAAK,QACP;EAGF,KAAK,QAAQ;EACb,KAAK,cAAc;EACnB,KAAK,qBAAqB;EAC1B,KAAK,iBAAiB,MAAM;EAE5B,MAAM,SAAS,KAAK;EACpB,KAAK,SAAS,KAAA;EACd,IAAI,WAAW,KAAA,GACb;EAGF,IAAI;GACF,MAAM,OAAO,OAAO;EACtB,QAAQ,CAER,UAAU;GACR,cAAc,MAAM;EACtB;CACF;CAEA,MAAc,cAA6B;EACzC,MAAM,kBAAkB,KAAK;EAC7B,IAAI,oBAAoB,KAAA,GACtB,MAAM,IAAI,mBAAmB,+BAA+B,gDAAgD;EAG9G,MAAM,WAAW,MAAM,KAAK,UAAU,KAAK,KAAK;GAC9C,QAAQ;GACR,SAAS,cAAc,KAAK,OAAO;GACnC,aAAa,KAAK;GAClB,QAAQ,gBAAgB;EAC1B,CAAC;EAED,IAAI,KAAK,QAAQ;GACf,MAAM,SAAS,MAAM,OAAO;GAC5B;EACF;EAEA,IAAI,CAAC,SAAS,IAAI;GAChB,MAAM,SAAS,MAAM,OAAO;GAC5B,MAAM,IAAI,mBAAmB,sBAAsB,qCAAqC,SAAS,OAAO,GAAG,SAAS,WAAW,IAAI,SAAS,MAAM;EACpJ;EAEA,IAAI,SAAS,SAAS,MACpB,MAAM,IAAI,mBAAmB,gCAAgC,iDAAiD;EAGhH,MAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB;EAC3D,IAAI,kBAAkB,MAAM;GAC1B,MAAM,sBAAsB,OAAO,SAAS,eAAe,EAAE;GAC7D,IAAI,OAAO,SAAS,mBAAmB,KAAK,uBAAuB,GACjE,KAAK,aAAa,gBAAgB;EAEtC;EAEA,KAAK,SAAS,SAAS,KAAK,UAAU;EACtC,KAAK,QAAQ;CACf;CAEA,mBAA0C;EACxC,IAAI,CAAC,KAAK,eAAe,KAAK,QAC5B,OAAO,QAAQ,QAAQ;EAGzB,OAAO,IAAI,SAAS,YAAY;GAC9B,KAAK,cAAc,KAAK,OAAO;EACjC,CAAC;CACH;CAEA,uBAAqC;EACnC,MAAM,UAAU,KAAK;EACrB,KAAK,gBAAgB,CAAC;EACtB,KAAK,MAAM,WAAW,SACpB,QAAQ;CAEZ;AACF;AAEA,SAAgB,iBAAiB,OAAyB;CACxD,OAAO,iBAAiB,gBAAgB,MAAM,SAAS;AACzD;AAEA,SAAS,cAAc,SAA0C;CAC/D,MAAM,SAAS,IAAI,QAAQ;CAC3B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,OAAO,OAAO,KAAK,KAAK;CAE1B,OAAO;AACT;AAEA,SAAS,cAAc,QAAuD;CAC5E,IAAI;EACF,OAAO,YAAY;CACrB,QAAQ,CAER;AACF;AAEA,SAAS,KAAK,IAAY,QAAoC;CAC5D,IAAI,MAAM,GACR,OAAO,QAAQ,QAAQ;CAGzB,IAAI,OAAO,SACT,OAAO,QAAQ,OAAO,iBAAiB,CAAC;CAG1C,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,gBAAsB;GAC1B,aAAa,KAAK;GAClB,OAAO,oBAAoB,SAAS,OAAO;EAC7C;EACA,MAAM,gBAAsB;GAC1B,QAAQ;GACR,OAAO,iBAAiB,CAAC;EAC3B;EACA,MAAM,QAAQ,iBAAiB;GAC7B,QAAQ;GACR,QAAQ;EACV,GAAG,EAAE;EAEL,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC1D,CAAC;AACH;AAEA,SAAS,mBAAiC;CACxC,OAAO,IAAI,aAAa,kCAAkC,YAAY;AACxE;;;ACtQA,SAAgB,mBAAmB,OAAuB;CACxD,OAAO,sBAAsB,MAAM;AACrC;AAEA,SAAgB,mBAAmB,OAAuB;CACxD,OAAO,sBAAsB,MAAM;AACrC;AAEA,MAAa,0BAA0B,CACrC;CACE,WAAW;CACX,UAAU,mBAAmB,aAAa;CAC1C,iBAAiB;AACnB,GACA;CACE,WAAW;CACX,UAAU,mBAAmB,WAAW;CACxC,iBAAiB;AACnB,CACF;AAEA,SAAgB,eAAe,UAA2B;CACxD,OAAO,OAAO,gBAAgB,eAAe,OAAO,YAAY,oBAAoB,cAAc,YAAY,gBAAgB,QAAQ;AACxI;AAEA,SAAgB,iBAAiB,UAAwB;CACvD,IAAI,OAAO,gBAAgB,aACzB,MAAM,IAAI,MAAM,8CAA8C;CAGhE,IAAI,YAAY,kCAAkC,MAChD,MAAM,IAAI,MAAM,6DAA6D;CAG/E,IAAI,CAAC,eAAe,QAAQ,GAC1B,MAAM,IAAI,MAAM,wBAAwB,SAAS,EAAE;AAEvD;AAEA,SAAgB,2BAAiC;CAC/C,KAAK,MAAM,eAAe,yBACxB,iBAAiB,YAAY,QAAQ;AAEzC;;;AC3CA,IAAa,oBAAb,MAA+B;CAC7B;CACA,QAAkD,CAAC;CACnD;CACA,oBAA4B;CAC5B,YAAoB;CAEpB,YAAY,cAA4B;EACtC,KAAK,eAAe;CACtB;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAK,MAAM,UAAU,KAAK,aAAa,WAAW,IAAI;CAC/D;CAEA,IAAI,cAAsB;EACxB,OAAO,KAAK,oBAAoB,KAAK,MAAM,QAAQ,OAAO,cAAc,SAAS,UAAU,SAAS,WAAW,UAAU,KAAK,aAAa,IAAI,CAAC;CAClJ;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAK,aAAa;CAC3B;CAEA,IAAI,iBAAkC;EACpC,OAAO,wBAAwB,KAAK,aAAa,QAAQ;CAC3D;CAEA,IAAI,gBAAoC;EACtC,OAAO,iBAAiB,KAAK,cAAc;CAC7C;CAEA,IAAI,cAAkC;EACpC,OAAO,YAAY,KAAK,cAAc;CACxC;CAEA,IAAI,mBAAuC;EACzC,OAAO,oBAAoB,KAAK,cAAc;CAChD;CAEA,OAAO,MAAkC;EACvC,IAAI,KAAK,WACP,OAAO,QAAQ,uBAAO,IAAI,MAAM,uCAAuC,CAAC;EAG1E,KAAK,MAAM,KAAK;GAAE,MAAM;GAAU;EAAK,CAAC;EACxC,KAAK,iBAAiB,KAAK,MAAM;EACjC,OAAO,KAAK;CACd;CAEA,cAAc,QAA+B;EAC3C,IAAI,KAAK,WACP,OAAO,QAAQ,uBAAO,IAAI,MAAM,uCAAuC,CAAC;EAG1E,MAAM,WAAW,KAAK,wBAAwB,MAAM;EACpD,IAAI,SAAS,WAAW,GACtB,OAAO,KAAK,gBAAgB,QAAQ,QAAQ;EAG9C,KAAK,MAAM,QAAQ,GAAG,QAAQ;EAC9B,KAAK,iBAAiB,KAAK,MAAM;EACjC,OAAO,KAAK;CACd;CAEA,QAAc;EACZ,KAAK,MAAM,SAAS;EACpB,KAAK,oBAAoB;CAC3B;CAEA,UAAgB;EACd,KAAK,YAAY;EACjB,KAAK,MAAM;CACb;CAEA,MAAc,QAAuB;EACnC,IAAI;GACF,OAAO,KAAK,MAAM,SAAS,KAAK,CAAC,KAAK,WAAW;IAC/C,MAAM,KAAK,YAAY;IACvB,KAAK,oBAAoB;IACzB,MAAM,YAAY,KAAK,MAAM,MAAM;IAEnC,IAAI,WAAW,SAAS,UAAU;KAChC,KAAK,oBAAoB,UAAU,KAAK;KACxC,IAAI;MACF,KAAK,aAAa,aAAa,UAAU,IAAI;KAC/C,SAAS,OAAO;MACd,KAAK,oBAAoB;MACzB,MAAM;KACR;IACF,OAAO,IAAI,WAAW,SAAS,UAC7B,KAAK,aAAa,OAAO,UAAU,OAAO,UAAU,GAAG;GAE3D;GAEA,MAAM,KAAK,YAAY;GACvB,KAAK,oBAAoB;EAC3B,UAAU;GACR,IAAI,KAAK,MAAM,WAAW,KAAK,CAAC,KAAK,aAAa,UAChD,KAAK,oBAAoB;GAE3B,KAAK,eAAe,KAAA;EACtB;CACF;CAEA,wBAAgC,QAAyC;EACvE,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GACxC,OAAO,CAAC;EAGV,OAAO,KAAK,eACT,KAAK,WAAW;GAAE,MAAM;GAAmB,OAAO,MAAM;GAAO,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;EAAE,EAAE,CAAC,CACnG,QAAQ,cAAc,UAAU,MAAM,UAAU,KAAK;CAC1D;CAEA,cAAqC;EACnC,IAAI,CAAC,KAAK,aAAa,UACrB,OAAO,QAAQ,QAAQ;EAGzB,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,gBAAsB;IAC1B,KAAK,aAAa,oBAAoB,aAAa,WAAW;IAC9D,KAAK,aAAa,oBAAoB,SAAS,OAAO;IACtD,KAAK,aAAa,oBAAoB,SAAS,OAAO;GACxD;GACA,MAAM,oBAA0B;IAC9B,QAAQ;IACR,QAAQ;GACV;GACA,MAAM,gBAAsB;IAC1B,QAAQ;IACR,uBAAO,IAAI,MAAM,6BAA6B,CAAC;GACjD;GACA,MAAM,gBAAsB;IAC1B,QAAQ;IACR,uBAAO,IAAI,MAAM,kCAAkC,CAAC;GACtD;GAEA,KAAK,aAAa,iBAAiB,aAAa,aAAa,EAAE,MAAM,KAAK,CAAC;GAC3E,KAAK,aAAa,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;GACnE,KAAK,aAAa,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACrE,CAAC;CACH;AACF;;;AC/IA,IAAa,gBAAb,MAA2B;CACzB;CACA,gCAAiC,IAAI,IAA4C;CACjF,yBAA0B,IAAI,IAAiD;CAC/E,oBAA4B;CAE5B,IAAI,oBAA4B;EAC9B,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,UAAU,QAAQ,MAAM,QAAQ,CAAC;CAC1F;CAEA,IAAI,mBAA2B;EAC7B,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,UAAU,QAAQ,MAAM,aAAa,CAAC;CAC/F;CAEA,IAAI,uBAAgC;EAClC,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,MAAM,QAAQ;CACxE;CAEA,IAAI,oBAA4B;EAC9B,OAAO,KAAK,cAAc;CAC5B;CAEA,IAAI,gBAAoC;EACtC,OAAO,KAAK,cAAc;CAC5B;CAEA,IAAI,cAAkC;EACpC,OAAO,KAAK,cAAc;CAC5B;CAEA,IAAI,mBAAuC;EACzC,OAAO,KAAK,cAAc;CAC5B;CAEA,IAAI,iBAAkC;EACpC,OAAO,KAAK,cAAc,kBAAkB,CAAC;CAC/C;CAEA,IAAI,qBAA6B;EAC/B,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,UAAU,QAAQ,MAAM,eAAe,QAAQ,CAAC;CACzG;CAEA,MAAM,0BAAsD;EAC1D,yBAAyB;EAEzB,MAAM,cAAc,IAAI,YAAY;EACpC,KAAK,cAAc;EAEnB,MAAM,SAAU,YAAsC;EACtD,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,MAAM,qCAAqC;EAGvD,OAAO;CACT;CAEA,MAAM,kBAAkB,SAAyC;EAC/D,MAAM,cAAc,KAAK,mBAAmB;EAC5C,MAAM,WAAW,cAAc,QAAQ,OAAO,QAAQ,KAAK;EAC3D,iBAAiB,QAAQ;EACzB,MAAM,kBAAkB,WAAW;EAGnC,MADc,KAAK,YAAY,QAAQ,OAAO,QACpC,CAAC,CAAC,OAAO,eAAe,QAAQ,KAAK,CAAC;CAClD;CAEA,MAAM,mBAAmB,SAA0C;EACjE,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK;EAC3C,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,iBAAiB,QAAQ,MAAM,oCAAoC;EAGrF,MAAM,MAAM,OAAO,eAAe,QAAQ,KAAK,CAAC;EAChD,MAAM,cAAc,KAAK,mBAAmB;EAC5C,MAAM,WAAW,QAAQ,WAAW;EACpC,IAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,KAAK,YAAY,eAAe,QAC1E,YAAY,WAAW,KAAK,IAAI,YAAY,UAAU,QAAQ;CAElE;CAEA,MAAM,cAAc,QAAgB,UAA6B,CAAC,GAAkB;EAClF,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,KAAM,CAAC,QAAQ,SAAS,UAAU,KAAK,oBAAoB,sBACnG;EAGF,KAAK,oBAAoB;EACzB,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,OAAO,OAAO,IAAI,UAAU,MAAM,cAAc,MAAM,CAAC,CAAC;CAC5F;CAEA,QAAc;EACZ,KAAK,MAAM,SAAS,KAAK,OAAO,OAAO,GACrC,MAAM,MAAM;EAEd,KAAK,oBAAoB;CAC3B;CAEA,UAAgB;EACd,KAAK,MAAM,SAAS,KAAK,OAAO,OAAO,GACrC,MAAM,QAAQ;EAEhB,KAAK,OAAO,MAAM;EAElB,IAAI,KAAK,gBAAgB,KAAA,GACvB,KAAK,MAAM,gBAAgB,KAAK,cAAc,OAAO,GACnD,IAAI;GACF,KAAK,YAAY,mBAAmB,YAAY;EAClD,QAAQ,CAER;EAIJ,KAAK,cAAc,MAAM;EACzB,KAAK,cAAc,KAAA;CACrB;CAEA,IAAY,eAA8C;EACxD,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,OAAO,IAAI,OAAO;CACxF;CAEA,qBAA0C;EACxC,IAAI,KAAK,gBAAgB,KAAA,GACvB,MAAM,IAAI,MAAM,mCAAmC;EAGrD,OAAO,KAAK;CACd;CAEA,YAAoB,OAAiC,UAAqC;EACxF,MAAM,WAAW,KAAK,OAAO,IAAI,KAAK;EACtC,IAAI,aAAa,KAAA,GACf,OAAO;EAGT,MAAM,eAAe,KAAK,mBAAmB,CAAC,CAAC,gBAAgB,QAAQ;EACvE,MAAM,QAAQ,IAAI,kBAAkB,YAAY;EAChD,KAAK,cAAc,IAAI,OAAO,YAAY;EAC1C,KAAK,OAAO,IAAI,OAAO,KAAK;EAC5B,OAAO;CACT;AACF;AAMA,SAAS,kBAAkB,aAAyC;CAClE,IAAI,YAAY,eAAe,QAC7B,OAAO,QAAQ,QAAQ;CAGzB,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,gBAAsB;GAC1B,YAAY,oBAAoB,cAAc,MAAM;GACpD,YAAY,oBAAoB,eAAe,OAAO;GACtD,YAAY,oBAAoB,SAAS,OAAO;EAClD;EACA,MAAM,eAAqB;GACzB,QAAQ;GACR,QAAQ;EACV;EACA,MAAM,gBAAsB;GAC1B,QAAQ;GACR,uBAAO,IAAI,MAAM,uCAAuC,CAAC;EAC3D;EACA,MAAM,gBAAsB;GAC1B,QAAQ;GACR,uBAAO,IAAI,MAAM,uCAAuC,CAAC;EAC3D;EAEA,YAAY,iBAAiB,cAAc,QAAQ,EAAE,MAAM,KAAK,CAAC;EACjE,YAAY,iBAAiB,eAAe,SAAS,EAAE,MAAM,KAAK,CAAC;EACnE,YAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC/D,CAAC;AACH;AAEA,SAAS,eAAe,OAAgC;CACtD,MAAM,OAAO,IAAI,WAAW,MAAM,UAAU;CAC5C,KAAK,IAAI,KAAK;CACd,OAAO,KAAK;AACd;AAEA,SAAS,cAAc,OAAiC,OAAuB;CAC7E,OAAO,UAAU,UAAU,mBAAmB,KAAK,IAAI,mBAAmB,KAAK;AACjF;AAEA,MAAM,uBAAuB;;;AC3G7B,IAAa,uBAAb,MAA8D;CAC5D;CAEA,YAAY,MAAmC;EAC7C,KAAK,OAAO,IAAI,KAAK;CACvB;CAEA,UAAU,OAAgC;EACxC,OAAO,oBAAoB,KAAK,KAAK,UAAU,KAAK,CAAC;CACvD;CAEA,QAAqB;EACnB,OAAO,oBAAoB,KAAK,KAAK,MAAM,CAAC;CAC9C;CAEA,QAAc;EACZ,KAAK,KAAK,MAAM;CAClB;CAEA,UAAgB;EACd,KAAK,KAAK,QAAQ;CACpB;AACF;AAEA,SAAgB,oBAAoB,OAA6B;CAC/D,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,MAAM,IAAI,UAAU,mDAAmD;CAGzE,OAAO,MAAM,KAAK,UAAU,mBAAmB,KAAK,CAAC;AACvD;AAEA,SAAgB,+BAA+B,WAAqC;CAClF,MAAM,SAAoB,EACxB,WAAW,UAAU,UACvB;CACA,IAAI,UAAU,eAAe,KAAA,GAC3B,OAAO,aAAa,UAAU;CAEhC,IAAI,UAAU,eAAe,KAAA,GAC3B,OAAO,aAAa,UAAU;CAEhC,IAAI,UAAU,UAAU,KAAA,GACtB,OAAO,QAAQ,UAAU;CAE3B,IAAI,UAAU,WAAW,KAAA,GACvB,OAAO,SAAS,UAAU;CAE5B,IAAI,UAAU,oBAAoB,KAAA,GAChC,OAAO,kBAAkB,UAAU;CAErC,IAAI,UAAU,sBAAsB,KAAA,GAClC,OAAO,oBAAoB,UAAU;CAEvC,OAAO;AACT;AAEA,SAAgB,uBAAuB,OAA+B;CACpE,OAAO;EACL,MAAM,cAAc,MAAM,IAAI;EAC9B,MAAM,eAAe,mBAAmB,MAAM,IAAI;EAClD,SAAS,MAAM;EACf,UAAU;CACZ;AACF;AAEA,SAAgB,2BAA2B,SAAqC;CAC9E,OAAO;EACL,MAAM,QAAQ;EACd,SAAS,QAAQ;CACnB;AACF;AAEA,SAAS,mBAAmB,OAA2B;CACrD,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAC5C,MAAM,IAAI,UAAU,+CAA+C;CAGrE,MAAM,OAAO,MAAM;CACnB,QAAQ,MAAM,MAAd;EACE,KAAK,eACH,OAAO;GAAE,MAAM;GAAe,MAAM,qBAAqB,IAAI;EAAE;EACjE,KAAK,aACH,OAAO;GAAE,MAAM;GAAa,MAAM,mBAAmB,IAAI;EAAE;EAC7D,KAAK,eACH,OAAO;GAAE,MAAM;GAAe,MAAM,qBAAqB,IAAI;EAAE;EACjE,KAAK,gBACH,OAAO;GAAE,MAAM;GAAgB,MAAM,sBAAsB,IAAI;EAAE;EACnE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,iBACH,OAAO;GAAE,MAAM,MAAM;GAAM;EAAK;EAClC,KAAK,WACH,OAAO;GAAE,MAAM;GAAW,MAAM,iBAAiB,IAAI;EAAE;EACzD,KAAK,cACH,OAAO;GAAE,MAAM;GAAc,MAAM,eAAe,IAAI;EAAE;EAC1D,SACE,MAAM,IAAI,UAAU,yCAAyC,MAAM,KAAK,EAAE;CAC9E;AACF;AAEA,SAAS,qBAAqB,OAAiC;CAC7D,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,UAAU,4DAA4D;CAQlF,OAAO;EAAE,OALK,mBAAmB,MAAM,KAK1B;EAAG,OAJF,2BAA2B,MAAM,OAAO,UAAU,mBAI5C;EAAG,WAHL,2BAA2B,MAAM,WAAW,UAAU,uBAGzC;EAAG,OAFpB,eAAe,MAAM,OAAO,mBAEJ;CAAE;AAC1C;AAEA,SAAS,sBAAsB,OAAkC;CAC/D,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,UAAU,6DAA6D;CASnF,OAAO;EAAE,OANK,mBAAmB,MAAM,KAM1B;EAAG,YALG,2BAA2B,MAAM,YAAY,UAAU,yBAKjD;EAAG,UAJX,2BAA2B,MAAM,UAAU,UAAU,uBAInC;EAAG,UAHrB,2BAA2B,MAAM,UAAU,WAAW,uBAG1B;EAAG,OAFlC,eAAe,MAAM,OAAO,oBAEU;CAAE;AACxD;AAEA,SAAS,qBAAqB,OAAiC;CAC7D,IAAI,CAAC,SAAS,KAAK,KAAM,MAAM,cAAc,SAAS,MAAM,cAAc,UACxE,MAAM,IAAI,UAAU,0DAA0D;CAGhF,MAAM,SAA0B,EAC9B,WAAW,MAAM,UACnB;CACA,MAAM,QAAQ,wBAAwB,MAAM,OAAO;EAAC;EAAO;EAAQ;CAAK,CAAC;CACzE,MAAM,QAAQ,wBAAwB,MAAM,OAAO;EAAC;EAAO;EAAO;EAAO;EAAQ;CAAM,CAAC;CACxF,IAAI,UAAU,KAAA,GACZ,OAAO,QAAQ;CAEjB,IAAI,UAAU,KAAA,GACZ,OAAO,QAAQ;CAEjB,OAAO;AACT;AAEA,SAAS,mBAAmB,OAA+B;CACzD,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,UAAU,0DAA0D;CAGhF,MAAM,SAAwB,EAC5B,GAAG,qBAAqB,KAAK,EAC/B;CACA,MAAM,aAAa,2BAA2B,MAAM,YAAY,QAAQ;CACxE,MAAM,aAAa,2BAA2B,MAAM,YAAY,QAAQ;CACxE,MAAM,QAAQ,2BAA2B,MAAM,OAAO,QAAQ;CAC9D,MAAM,SAAS,2BAA2B,MAAM,QAAQ,QAAQ;CAChE,MAAM,kBAAkB,2BAA2B,MAAM,iBAAiB,QAAQ;CAClF,MAAM,oBAAoB,2BAA2B,MAAM,mBAAmB,QAAQ;CACtF,IAAI,eAAe,KAAA,GACjB,OAAO,aAAa;CAEtB,IAAI,eAAe,KAAA,GACjB,OAAO,aAAa;CAEtB,IAAI,UAAU,KAAA,GACZ,OAAO,QAAQ;CAEjB,IAAI,WAAW,KAAA,GACb,OAAO,SAAS;CAElB,IAAI,oBAAoB,KAAA,GACtB,OAAO,kBAAkB;CAE3B,IAAI,sBAAsB,KAAA,GACxB,OAAO,oBAAoB;CAE7B,OAAO;AACT;AAEA,SAAS,iBAAiB,OAA6B;CACrD,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,YAAY,UACjF,MAAM,IAAI,UAAU,8DAA8D;CAGpF,OAAO;EACL,MAAM,MAAM;EACZ,SAAS,MAAM;CACjB;AACF;AAEA,SAAS,eAAe,OAA2B;CACjD,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,YAAY,UACjF,MAAM,IAAI,UAAU,4DAA4D;CAGlF,OAAO;EACL,MAAM,uBAAuB,MAAM,IAAI;EACvC,SAAS,MAAM;CACjB;AACF;AAEA,SAAS,uBAAuB,MAA6B;CAY3D,IAAI,CAAC;EAVH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAGO,CAAC,CAAC,SAAS,IAAqB,GACvC,MAAM,IAAI,UAAU,yCAAyC,KAAK,EAAE;CAGtE,OAAO;AACT;AAEA,SAAS,cAAc,MAA0C;CAC/D,QAAQ,MAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK,yBACH,OAAO;EACT,KAAK,wBACH,OAAO;EACT,KAAK,sBACH,OAAO;EACT,KAAK,oBACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,iBACH,OAAO;CACX;AACF;AAEA,SAAS,mBAAmB,MAA6B;CACvD,OAAO,KAAK,QAAQ,WAAW,WAAW,IAAI,QAAQ,CAAC,CAAC,YAAY;AACtE;AAEA,SAAS,wBAAgD,OAAgB,SAAsC;CAC7G,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC;CAGF,IAAI,OAAO,UAAU,YAAY,QAAQ,SAAS,KAAU,GAC1D,OAAO;CAGT,MAAM,IAAI,UAAU,wCAAwC,OAAO,KAAK,EAAE,EAAE;AAC9E;AAEA,SAAS,2BAA0D,OAAgB,cAAqE;CACtJ,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC;CAGF,IAAI,OAAO,UAAU,cACnB,OAAO;CAGT,MAAM,IAAI,UAAU,qBAAqB,aAAa,aAAa,OAAO,MAAM,EAAE;AACpF;AAEA,SAAS,2BACP,OACA,cACA,OACqE;CACrE,IAAI,OAAO,UAAU,cACnB,MAAM,IAAI,UAAU,YAAY,MAAM,SAAS,aAAa,aAAa,OAAO,MAAM,EAAE;CAG1F,OAAO;AACT;AAEA,SAAS,mBAAmB,OAA+B;CACzD,IAAI,UAAU,WAAW,UAAU,WAAW,UAAU,SACtD,OAAO;CAGT,MAAM,IAAI,UAAU,yCAAyC,OAAO,KAAK,EAAE,EAAE;AAC/E;AAEA,SAAS,eAAe,OAAgB,OAA2B;CACjE,IAAI,iBAAiB,YACnB,OAAO;CAGT,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,UAAU,OAAO,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG,GACtG,OAAO,IAAI,WAAW,KAAK;CAG7B,MAAM,IAAI,UAAU,YAAY,MAAM,oCAAoC;AAC5E;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;;;ACtYA,IAAa,eAAb,MAA0B;CACtB,qBAAqB;EACjB,MAAM,MAAM,KAAK;EACjB,KAAK,YAAY;EACjB,yBAAyB,WAAW,IAAI;EACxC,OAAO;CACX;CACA,OAAO;EACH,MAAM,MAAM,KAAK,mBAAmB;EACpC,KAAK,wBAAwB,KAAK,CAAC;CACvC;CACA,UAAU;EACN,KAAK,qBAAqB,KAAK,SAAS;CAC5C;;;;CAIA,QAAQ;EACJ,IAAI;GACA,MAAM,SAAS,KAAK,gCAAgC,GAAG;GACvD,KAAK,mBAAmB,QAAQ,KAAK,SAAS;GAC9C,IAAI,KAAK,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAO,IAAI;GAC3D,IAAI,KAAK,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAO,IAAI;GAE3D,IADS,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAO,IAClD,GACD,MAAM,WAAW,EAAE;GAEvB,OAAO,WAAW,EAAE;EACxB,UAAU;GACN,KAAK,gCAAgC,EAAE;EAC3C;CACJ;CACA,cAAc;EACV,MAAM,MAAM,KAAK,iBAAiB;EAClC,KAAK,YAAY;EACjB,yBAAyB,SAAS,MAAM,KAAK,WAAW,IAAI;EAC5D,OAAO;CACX;;;;;CAKA,UAAU,MAAM;EACZ,IAAI;GACA,MAAM,SAAS,KAAK,gCAAgC,GAAG;GACvD,MAAM,OAAO,kBAAkB,MAAM,KAAK,iBAAiB;GAC3D,MAAM,OAAO;GACb,KAAK,uBAAuB,QAAQ,KAAK,WAAW,MAAM,IAAI;GAC9D,IAAI,KAAK,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAO,IAAI;GAC3D,IAAI,KAAK,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAO,IAAI;GAE3D,IADS,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAO,IAClD,GACD,MAAM,WAAW,EAAE;GAEvB,OAAO,WAAW,EAAE;EACxB,UAAU;GACN,KAAK,gCAAgC,EAAE;EAC3C;CACJ;CACA,QAAQ;EACJ,KAAK,mBAAmB,KAAK,SAAS;CAC1C;AACJ;AACA,IAAI,OAAO,SAAS,aAAa,UAAU,OAAO,WAAW,aAAa,UAAU;AACpF,SAAS,oBAAoB;CAsDzB,OAAO;EACH,WAAW;EACX,gCAAgC;GAtDhC,WAAW;GACX,8BAA8B,SAAS,MAAM,MAAM;IAE/C,OAAO,cADK,MAAM,mBAAmB,MAAM,IAAI,CACxB,CAAC;GAC5B;GACA,+BAA+B,SAAS,MAAM,MAAM;IAEhD,MAAM,OAAO,kBADD,OAAO,UAAU,IAAI,CACA,GAAG,KAAK,mBAAmB,KAAK,kBAAkB;IACnF,MAAM,OAAO;IACb,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAO,MAAM,IAAI;IACtD,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAO,MAAM,IAAI;GAC1D;GACA,yCAAyC,SAAS,MAAM,MAAM;IAC1D,MAAM,IAAI,MAAM,mBAAmB,MAAM,IAAI,CAAC;GAClD;GACA,4BAA4B,WAAW;IAEnC,OAAO,8BAAc,IADL,OACO,CAAC;GAC5B;GACA,4BAA4B,WAAW;IAEnC,OAAO,cAAc,IADL,MACO,CAAC;GAC5B;GACA,4BAA4B,SAAS,MAAM,MAAM,MAAM;IACnD,UAAU,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,WAAW,IAAI;GACvD;GACA,4BAA4B,SAAS,MAAM,MAAM,MAAM;IACnD,UAAU,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI;GACjD;GACA,kCAAkC,SAAS,MAAM;IAG7C,OAAO,cAAcA,IAAG;GAC5B;GACA,kCAAkC,SAAS,MAAM;IAG7C,OAAO,cAAcA,IAAG;GAC5B;GACA,kCAAkC,SAAS,MAAM,MAAM;IAGnD,OAAO,cADK,mBAAmB,MAAM,IACd,CAAC;GAC5B;GACA,6BAA6B,SAAS,MAAM;IAExC,OAAO,cADK,UAAU,IACC,CAAC;GAC5B;GACA,4BAA4B,SAAS,MAAM;IACvC,WAAW,IAAI;GACnB;EAIsC;CAC1C;AACJ;AAEA,MAAM,2BAA4B,OAAO,yBAAyB,cAC5D;CAAE,gBAAgB,CAAC;CAAG,kBAAkB,CAAC;AAAE,IAC3C,IAAI,sBAAqB,QAAO,KAAK,wBAAwB,KAAK,CAAC,CAAC;AAE1E,SAAS,cAAc,KAAK;CACxB,IAAI,cAAc,KAAK,QAAQ,KAAK,KAAK,KAAK,SAAS,CAAC;CACxD,MAAM,MAAM;CACZ,YAAY,KAAK;CAEjB,KAAK,OAAO;CACZ,OAAO;AACX;AAEA,SAAS,WAAW,KAAK;CACrB,IAAI,MAAM,MAAM;CAChB,KAAK,OAAO;CACZ,YAAY;AAChB;AAEA,IAAI,wBAAwB;AAC5B,SAAS,qBAAqB;CAC1B,IAAI,0BAA0B,QAAQ,sBAAsB,OAAO,aAAa,QAAS,sBAAsB,OAAO,aAAa,KAAA,KAAa,sBAAsB,WAAW,KAAK,OAAO,QACzL,wBAAwB,IAAI,SAAS,KAAK,OAAO,MAAM;CAE3D,OAAO;AACX;AAEA,SAAS,mBAAmB,KAAK,KAAK;CAClC,OAAO,WAAW,QAAQ,GAAG,GAAG;AACpC;AAEA,IAAI,0BAA0B;AAC9B,SAAS,uBAAuB;CAC5B,IAAI,4BAA4B,QAAQ,wBAAwB,eAAe,GAC3E,0BAA0B,IAAI,WAAW,KAAK,OAAO,MAAM;CAE/D,OAAO;AACX;AAEA,SAAS,UAAU,KAAK;CAAE,OAAO,KAAK;AAAM;AAE5C,IAAI,OAAO,IAAI,MAAM,IAAI,CAAC,CAAC,KAAK,KAAA,CAAS;AACzC,KAAK,KAAK,KAAA,GAAW,MAAM,MAAM,KAAK;AAEtC,IAAI,YAAY,KAAK;AAErB,SAAS,kBAAkB,KAAK,QAAQ;CACpC,MAAM,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC,MAAM;CAC1C,qBAAqB,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;CACvC,kBAAkB,IAAI;CACtB,OAAO;AACX;AAEA,SAAS,kBAAkB,KAAK,QAAQ,SAAS;CAC7C,IAAI,YAAY,KAAA,GAAW;EACvB,MAAM,MAAM,kBAAkB,OAAO,GAAG;EACxC,MAAM,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM;EACtC,qBAAqB,CAAC,CAAC,SAAS,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG;EAC9D,kBAAkB,IAAI;EACtB,OAAO;CACX;CAEA,IAAI,MAAM,IAAI;CACd,IAAI,MAAM,OAAO,KAAK,CAAC,MAAM;CAE7B,MAAM,MAAM,qBAAqB;CAEjC,IAAI,SAAS;CAEb,OAAO,SAAS,KAAK,UAAU;EAC3B,MAAM,OAAO,IAAI,WAAW,MAAM;EAClC,IAAI,OAAO,KAAM;EACjB,IAAI,MAAM,UAAU;CACxB;CACA,IAAI,WAAW,KAAK;EAChB,IAAI,WAAW,GACX,MAAM,IAAI,MAAM,MAAM;EAE1B,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IAAI,SAAS,GAAG,CAAC,MAAM;EAC9D,MAAM,OAAO,qBAAqB,CAAC,CAAC,SAAS,MAAM,QAAQ,MAAM,GAAG;EACpE,MAAM,MAAM,kBAAkB,WAAW,KAAK,IAAI;EAElD,UAAU,IAAI;EACd,MAAM,QAAQ,KAAK,KAAK,QAAQ,CAAC,MAAM;CAC3C;CAEA,kBAAkB;CAClB,OAAO;AACX;AAEA,SAAS,WAAW,KAAK;CACrB,MAAM,MAAM,UAAU,GAAG;CACzB,WAAW,GAAG;CACd,OAAO;AACX;AAEA,IAAI,oBAAoB,IAAI,YAAY,SAAS;CAAE,WAAW;CAAM,OAAO;AAAK,CAAC;AACjF,kBAAkB,OAAO;AACzB,MAAM,0BAA0B;AAChC,IAAI,kBAAkB;AACtB,SAAS,WAAW,KAAK,KAAK;CAC1B,mBAAmB;CACnB,IAAI,mBAAmB,yBAAyB;EAC5C,oBAAoB,IAAI,YAAY,SAAS;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EAC7E,kBAAkB,OAAO;EACzB,kBAAkB;CACtB;CACA,OAAO,kBAAkB,OAAO,qBAAqB,CAAC,CAAC,SAAS,KAAK,MAAM,GAAG,CAAC;AACnF;AAEA,MAAM,oBAAoB,IAAI,YAAY;AAE1C,IAAI,EAAE,gBAAgB,oBAClB,kBAAkB,aAAa,SAAU,KAAK,MAAM;CAChD,MAAM,MAAM,kBAAkB,OAAO,GAAG;CACxC,KAAK,IAAI,GAAG;CACZ,OAAO;EACH,MAAM,IAAI;EACV,SAAS,IAAI;CACjB;AACJ;AAGJ,IAAI,kBAAkB;IAEQ;AAC9B,SAAS,oBAAoB,UAAU,QAAQ;CAE3C,OAAO,SAAS;CAEhB,wBAAwB;CACxB,0BAA0B;CAC1B,OAAO;AACX;AAEA,eAAe,WAAW,QAAQ,SAAS;CACvC,IAAI,OAAO,aAAa,cAAc,kBAAkB,UAAU;EAC9D,IAAI,OAAO,YAAY,yBAAyB,YAC5C,IAAI;GACA,OAAO,MAAM,YAAY,qBAAqB,QAAQ,OAAO;EACjE,SAAS,GAAG;GAGR,IAFsB,OAAO,MAAM,qBAAqB,OAAO,IAAI,KAE9C,OAAO,QAAQ,IAAI,cAAc,MAAM,oBACxD,QAAQ,KAAK,qMAAqM,CAAC;QAE9M,MAAM;EACnB;EAGJ,MAAM,QAAQ,MAAM,OAAO,YAAY;EACvC,OAAO,MAAM,YAAY,YAAY,OAAO,OAAO;CACvD,OAAO;EACH,MAAM,WAAW,MAAM,YAAY,YAAY,QAAQ,OAAO;EAE9D,IAAI,oBAAoB,YAAY,UAChC,OAAO;GAAE;GAAU;EAAO;OAE1B,OAAO;CAEf;CAEA,SAAS,qBAAqB,MAAM;EAChC,QAAQ,MAAR;GACI,KAAK;GAAS,KAAK;GAAQ,KAAK,WAAW,OAAO;EACtD;EACA,OAAO;CACX;AACJ;AAsBA,eAAe,WAAW,gBAAgB;CACtC,IAAI,SAAS,KAAA,GAAW,OAAO;CAG/B,IAAI,mBAAmB,KAAA,GACnB,IAAI,OAAO,eAAe,cAAc,MAAM,OAAO,WACjD,CAAC,CAAC,kBAAkB;MAEpB,QAAQ,KAAK,2FAA2F;CAIhH,IAAI,mBAAmB,KAAA,GACnB,iBAAiB,IAAI,IAAI,gCAAgC,OAAO,KAAK,GAAG;CAE5E,MAAM,UAAU,kBAAkB;CAElC,IAAI,OAAO,mBAAmB,YAAa,OAAO,YAAY,cAAc,0BAA0B,WAAa,OAAO,QAAQ,cAAc,0BAA0B,KACtK,iBAAiB,MAAM,cAAc;CAGzC,MAAM,EAAE,UAAU,WAAW,MAAM,WAAW,MAAM,gBAAgB,OAAO;CAE3E,OAAO,oBAAoB,UAAU,MAAM;AAC/C;;;AC/UA,SAAgB,2BAA2B,MAAiE;CAC1G,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,UAAU,kDAAkD;CAGxE,OAAO,IAAI,qBAAqB,IAAI;AACtC;AAEA,eAAsB,yBAAyB,SAAwD;CAErG,MAAMC,WADS,WAAW,IAAI,IAAI,+BAA+B,OAAO,KAAK,GAAG,CAC5C;CACpC,OAAO,2BAA2BC,YAAmB;AACvD;;;AC+BA,IAAa,gBAAb,MAA2B;CACzB;CACA;CACA;CACA;CACA;CACA;CACA,QAA8B;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA,qBAA6C,CAAC;CAC9C;CACA,oBAA4B;CAC5B,cAAsB;CACtB,cAAsB;CACtB,uBAA+B;CAC/B,sBAA8B;CAE9B,YAAY,MAAyB,eAA0C,CAAC,GAAG;EACjF,KAAK,OAAO;EACZ,KAAK,sBAAsB,aAAa,8BAA8B,IAAI,cAAc;EACxF,KAAK,eAAe,aAAa,kBAAkB,WAAW,IAAI,cAAc,MAAM;EACtF,KAAK,qBAAqB,aAAa,wBAAwB,YAAY,yBAAyB,QAAQ,QAAQ,OAAO;EAC3H,KAAK,gBAAgB,aAAa,iBAAiB;EACnD,KAAK,MAAM,aAAa,cAAc,YAAY,IAAI;CACxD;CAEA,MAAM,cAAc,SAAuC;EACzD,IAAI,KAAK,UAAU,aACjB;EAGF,IAAI,KAAK,UAAU,iBAAiB,QAAQ,SAAS,WACnD;EAGF,IAAI;GACF,QAAQ,QAAQ,MAAhB;IACE,KAAK;KACH;MACE,MAAM,eAAe,KAAK,cAAc;MACxC,IAAI,iBAAiB,KAAA,GAAW;OAC9B,KAAK,cAAc,YAAY;OAC/B;MACF;KACF;KACA,KAAK,MAAM,QAAQ;KACnB,KAAK,UAAU,QAAQ;KACvB,KAAK,oBAAoB,wBAAwB,QAAQ,OAAO;KAChE,KAAK,QAAQ;KACb,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;KAC3B;IACF,KAAK;KACH,MAAM,KAAK,kBAAkB;KAC7B;IACF,KAAK;KACH,MAAM,KAAK,MAAM;KACjB;IACF,KAAK;KACH,MAAM,KAAK,KAAK;KAChB;IACF,KAAK;KACH,KAAK,UAAU,KAAK,YAAY,KAAA,IAAY,KAAA,IAAY,aAAa,KAAK,SAAS,QAAQ,OAAO;KAClG,IAAI,KAAK,YAAY,KAAA,GACnB,KAAK,oBAAoB,wBAAwB,KAAK,OAAO;KAE/D;IACF,KAAK;KACH,KAAK,aAAa,QAAQ;KAC1B,MAAM,KAAK,mBAAmB;KAC9B,KAAK,UAAU;KACf;IACF,KAAK;KACH,KAAK,mBAAmB,4BAA4B,QAAQ,MAAM;KAClE;IACF,KAAK;KACH,MAAM,KAAK,QAAQ;KACnB;GACJ;EACF,SAAS,OAAO;GACd,KAAK,KAAK,WAAW,gCAAgC,0BAA0B,MAAM,KAAK;EAC5F;CACF;CAEA,MAAc,oBAAmC;EAC/C,IAAI,KAAK,UAAU,QAAQ;GACzB,KAAK,KAAK,WAAW,iCAAiC,6CAA6C,IAAI;GACvG;EACF;EAEA,IAAI,KAAK,QAAQ,KAAA,GACf,KAAK,MAAM,KAAK,oBAAoB;EAGtC,IAAI;GACF,MAAM,SAAS,MAAM,KAAK,IAAI,wBAAwB;GACtD,KAAK,KAAK;IAAE,MAAM;IAAuB;GAAO,GAAG,CAAC,MAAM,CAAC;GAC3D,KAAK,QAAQ;EACf,SAAS,OAAO;GACd,KAAK,KAAK,OAAO,4BAA4B,uCAAuC,MAAM,KAAK;EACjG;CACF;CAEA,MAAc,QAAuB;EACnC,MAAM,UAAU,KAAK;EACrB,IAAI,KAAK,QAAQ,KAAA,KAAa,YAAY,KAAA,KAAa,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS;GACtG,KAAK,KAAK,WAAW,uCAAuC,kDAAkD,IAAI;GAClH;EACF;EAEA,IAAI,KAAK,UAAU,WACjB;EAGF,IAAI;EACJ,IAAI;GACF,MAAM,cAAc,MAAM,KAAK,mBAAmB,OAAO;GACzD,IAAI,gBAAgB,KAAA,GAAW;IAC7B,KAAK,KAAK,WAAW,oCAAoC,mCAAmC,IAAI;IAChG;GACF;GACA,eAAe;EACjB,SAAS,OAAO;GACd,KAAK,KAAK,WAAW,oCAAoC,mCAAmC,MAAM,KAAK;GACvG;EACF;EAEA,KAAK,cAAc,QAAQ;EAC3B,KAAK,eAAe;EACpB,KAAK,QAAQ;EACb,KAAK,cAAc;EACnB,KAAK,uBAAuB;EAC5B,KAAK,sBAAsB;EAC3B,KAAK,gBAAgB;EACrB,MAAM,KAAK,mBAAmB;EAC9B,KAAK,UAAU;EACf,KAAK,YAAY;CACnB;CAEA,MAAc,OAAsB;EAClC,MAAM,KAAK,YAAY;EACvB,KAAK,KAAK,QAAQ;EAClB,KAAK,MAAM,KAAA;EACX,KAAK,mBAAmB,MAAM;EAC9B,KAAK,aAAa,KAAA;EAClB,KAAK,qBAAqB,CAAC;EAC3B,KAAK,QAAQ;EACb,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;CAC/B;CAEA,MAAc,UAAyB;EACrC,MAAM,KAAK,YAAY;EACvB,KAAK,KAAK,QAAQ;EAClB,KAAK,MAAM,KAAA;EACX,KAAK,mBAAmB,MAAM;EAC9B,KAAK,aAAa,KAAA;EAClB,KAAK,qBAAqB,CAAC;EAC3B,KAAK,QAAQ;EACb,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;EAC/B,KAAK,KAAK,MAAM;CAClB;CAEA,cAA4B;EAC1B,MAAM,UAAU,KAAK;EACrB,MAAM,MAAM,KAAK;EACjB,IAAI,YAAY,KAAA,KAAa,QAAQ,KAAA,GAAW;GAC9C,KAAK,KAAK,WAAW,iCAAiC,mDAAmD,IAAI;GAC7G;EACF;EAEA,MAAM,SAAS,KAAK,aAAa;GAC/B;GACA,SAAS,QAAQ;EACnB,CAAC;EACD,MAAM,QAAQ,KAAK,cAAc;EACjC,KAAK,cAAc;EACnB,KAAK,SAAS;EAEd,KAAU,UAAU,QAAQ,KAAK;CACnC;CAEA,MAAc,UAAU,QAAsB,OAA8B;EAC1E,IAAI;GACF,MAAM,OAAO,KAAK;GAElB,OAAO,KAAK,gBAAgB,QAAQ,KAAK,GAAG;IAC1C,MAAM,KAAK,mBAAmB;IAC9B,MAAM,QAAQ,MAAM,OAAO,KAAK;IAChC,IAAI,UAAU,MACZ;IAGF,KAAK,UAAU,OAAO,KAAK;IAC3B,IAAI,CAAE,MAAM,KAAK,sBAAsB,KAAK,cAAc,UAAU,MAAM,KAAK,KAAK,CAAC,CAAC,GAAI;KACxF,MAAM,KAAK,mBAAmB,QAAQ,KAAK;KAC3C;IACF;IACA,MAAM,KAAK,mBAAmB;IAC9B,KAAK,UAAU,OAAO,KAAK;GAC7B;EACF,SAAS,OAAO;GACd,IAAI,CAAC,KAAK,gBAAgB,QAAQ,KAAK,KAAK,iBAAiB,KAAK,GAChE;GAGF,MAAM,KAAK,mBAAmB,QAAQ,KAAK;GAC3C,KAAK,KAAK,WAAW,oBAAoB,KAAK,GAAG,6BAA6B,MAAM,KAAK;GACzF;EACF,UAAU;GACR,IAAI,KAAK,gBAAgB,QAAQ,KAAK,GACpC,MAAM,KAAK,mBAAmB,QAAQ,KAAK;EAE/C;CACF;CAEA,MAAc,cAA6B;EACzC,KAAK,eAAe;EACpB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GACb;EAGF,KAAK,SAAS,KAAA;EACd,KAAK,eAAe;EACpB,KAAK,cAAc,QAAQ;EAC3B,KAAK,eAAe,KAAA;EACpB,MAAM,OAAO,MAAM;CACrB;CAEA,MAAc,mBAAmB,QAAsB,OAA8B;EACnF,IAAI,KAAK,WAAW,UAAU,KAAK,gBAAgB,OACjD;EAGF,KAAK,eAAe;EACpB,KAAK,SAAS,KAAA;EACd,KAAK,eAAe;EACpB,KAAK,cAAc,QAAQ;EAC3B,KAAK,eAAe,KAAA;EACpB,MAAM,OAAO,MAAM;CACrB;CAEA,gBAAwB,QAAsB,OAAwB;EACpE,OAAO,KAAK,WAAW,UAAU,KAAK,gBAAgB,SAAS,KAAK,UAAU;CAChF;CAEA,UAAkB,aAAuC;EACvD,MAAM,UAAU,KAAK;EACrB,MAAM,WAAW,KAAK,gBAAgB;EACtC,MAAM,iBAAiB,eAAe,KAAK,QAAQ;EACnD,KAAK,KAAK;GACR,MAAM;GACN,OAAO;IACL,eAAe,gBAAgB,iBAAiB;IAChD,qBAAqB,gBAAgB,uBAAuB;IAC5D,eAAe,iBAAiB,gBAAgB,KAAK,IAAI,CAAC;IAC1D,aAAa,KAAK;IAClB,mBAAmB,SAAS;IAC5B,kBAAkB,SAAS;IAC3B,sBAAsB,KAAK;IAC3B,qBAAqB,KAAK;IAC1B,cAAc,KAAK,QAAQ,UAAU;IACrC,sBAAsB,SAAS;IAC/B,mBAAmB,SAAS;IAC5B,eAAe,QAAQ,iBAAiB,KAAK,KAAK;IAClD,aAAa,QAAQ,eAAe,KAAK,KAAK;IAC9C,kBAAkB,QAAQ,oBAAoB,KAAK,KAAK;IACxD,oBAAoB,SAAS;IAC7B,aAAa,QAAQ;IACrB,aAAa,QAAQ;IACrB,cAAc,QAAQ;IACtB,YAAY,QAAQ;IACpB,eAAe,QAAQ;GACzB;EACF,CAAC;CACH;CAEA,MAAc,sBAAsB,QAAuC;EACzE,KAAK,MAAM,SAAS,QAClB,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,KAAK,KAAK;KAAE,MAAM;KAAc,WAAW,+BAA+B,MAAM,IAAI;IAAE,CAAC;IACvF;GACF,KAAK;IACH,KAAK,KAAK;KAAE,MAAM;KAAW,SAAS,2BAA2B,MAAM,IAAI;IAAE,CAAC;IAC9E;GACF,KAAK;IACH,KAAK,cAAc,uBAAuB,MAAM,IAAI,CAAC;IACrD,OAAO;GACT,KAAK;IACH,IAAI,CAAE,MAAM,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,MAAM,IAAI,CAAC,GACxE,OAAO;IAET,KAAK,eAAe,MAAM,KAAK,MAAM;IACrC,MAAM,KAAK,mBAAmB;IAC9B;GACF,KAAK;IACH,IAAI,CAAE,MAAM,KAAK,kBAAkB,KAAK,KAAK,mBAAmB,MAAM,IAAI,CAAC,GACzE,OAAO;IAET,KAAK,eAAe,MAAM,KAAK,MAAM;IACrC,MAAM,KAAK,mBAAmB;IAC9B;GACF,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,iBACH;EACJ;EAGF,OAAO;CACT;CAEA,kBAME;EACA,MAAM,oBAAoB,KAAK,KAAK,qBAAqB;EACzD,MAAM,mBAAmB,KAAK,KAAK,oBAAoB;EACvD,KAAK,uBAAuB,KAAK,IAAI,KAAK,sBAAsB,iBAAiB;EACjF,KAAK,sBAAsB,KAAK,IAAI,KAAK,qBAAqB,gBAAgB;EAE9E,OAAO;GACL;GACA;GACA,sBAAsB,KAAK,KAAK,wBAAwB;GACxD,mBAAmB,KAAK,KAAK,qBAAqB;GAClD,oBAAoB,KAAK,KAAK,sBAAsB;EACtD;CACF;CAEA,MAAc,YAAY,QAA2D;EACnF,IAAI;GACF,MAAM,OAAO;GACb,OAAO;EACT,SAAS,OAAO;GACd,IAAI,qBAAqB,KAAK,KAAM,MAAM,KAAK,6BAA6B,MAAM,GAChF,OAAO;GAGT,KAAK,KAAK,OAAO,4BAA4B,sBAAsB,MAAM,KAAK;GAC9E,OAAO;EACT;CACF;CAEA,MAAc,6BAA6B,QAA2D;EACpG,MAAM,MAAM,KAAK;EACjB,MAAM,SAAS,KAAK,mBAAmB;EACvC,IAAI,QAAQ,KAAA,KAAa,WAAW,KAAA,KAAa,UAAU,GACzD,OAAO;EAGT,IAAI;GACF,MAAM,IAAI,cAAc,QAAQ,EAAE,OAAO,KAAK,CAAC;GAC/C,MAAM,OAAO;GACb,KAAK,KAAK;IACR,MAAM;IACN,SAAS;KACP,MAAM;KACN,SAAS;IACX;GACF,CAAC;GACD,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;CAEA,qBAAiD;EAC/C,MAAM,iBAAiB,KAAK,SAAS,QAAQ,kBAAkB;EAC/D,MAAM,cAAc,KAAK,YAAY;EACrC,IAAI,gBAAgB,KAAA,KAAa,OAAO,SAAS,WAAW,GAC1D,OAAO,KAAK,IAAI,GAAG,cAAc,cAAc;EAGjD,MAAM,cAAc,KAAK,KAAK;EAC9B,OAAO,gBAAgB,KAAA,IAAY,KAAA,IAAY,KAAK,IAAI,GAAG,cAAc,cAAc;CACzF;CAEA,MAAc,qBAAoC;EAChD,MAAM,oBAAoB,KAAK;EAC/B,MAAM,MAAM,KAAK;EACjB,IAAI,sBAAsB,KAAA,KAAa,QAAQ,KAAA,GAC7C;EAGF,MAAM,SAAS,KAAK;EACpB,MAAM,aAAa,kBAAkB,SAAS;GAC5C,QAAQ,IAAI;GACZ,YAAY,KAAK;GACjB,cAAc,QAAQ,UAAU;GAChC,OAAO,KAAK,IAAI;EAClB,CAAC;EACD,KAAK,qBAAqB,WAAW;EAErC,IAAI,WAAW,kBAAkB,KAAA,GAC/B,MAAM,IAAI,cAAc,WAAW,aAAa;EAGlD,IAAI,WAAW,KAAA,KAAa,WAAW,kBAAkB,SACvD,OAAO,MAAM;OACR,IAAI,WAAW,KAAA,KAAa,WAAW,kBAAkB,UAC9D,OAAO,OAAO;EAGhB,IAAI,WAAW,oBAAoB,KAAA,GACjC,KAAK,KAAK;GAAE,MAAM;GAAoB,QAAQ,WAAW;EAAgB,CAAC;CAE9E;CAEA,kBAAgC;EAC9B,KAAK,eAAe;EACpB,MAAM,aAAa,KAAK,SAAS,YAAY;EAC7C,IAAI,eAAe,KAAA,KAAa,cAAc,GAC5C;EAGF,KAAK,aAAa,kBAAkB;GAClC,KAAU,cAAc;EAC1B,GAAG,UAAU;CACf;CAEA,iBAA+B;EAC7B,IAAI,KAAK,eAAe,KAAA,GACtB;EAGF,cAAc,KAAK,UAAU;EAC7B,KAAK,aAAa,KAAA;EAClB,KAAK,oBAAoB;CAC3B;CAEA,MAAc,gBAA+B;EAC3C,IAAI,KAAK,qBAAqB,KAAK,UAAU,WAC3C;EAGF,KAAK,oBAAoB;EACzB,IAAI;GACF,MAAM,KAAK,mBAAmB;GAC9B,KAAK,UAAU;EACjB,SAAS,OAAO;GACd,KAAK,KAAK,OAAO,oCAAoC,8BAA8B,MAAM,KAAK;EAChG,UAAU;GACR,KAAK,oBAAoB;EAC3B;CACF;CAEA,KAAa,MAA2B,MAAc,SAAiB,UAAmB,OAAuB;EAC/G,MAAM,QAAQ,UAAU,KAAA,IAAY;GAAE;GAAM;GAAM;GAAS;EAAS,IAAI;GAAE;GAAM;GAAM;GAAS;GAAU,OAAO,eAAe,KAAK;EAAE;EACtI,KAAK,cAAc,KAAK;CAC1B;CAEA,cAAsB,OAA0B;EAC9C,IAAI,MAAM,UACR,KAAK,qBAAqB;EAE5B,KAAK,KAAK;GAAE,MAAM;GAAS;EAAM,CAAC;CACpC;CAEA,uBAAqC;EACnC,IAAI,KAAK,UAAU,eACjB;EAGF,KAAK,QAAQ;EACb,KAAU,YAAY;EACtB,KAAK,KAAK,QAAQ;EAClB,KAAK,MAAM,KAAA;EACX,KAAK,mBAAmB,MAAM;EAC9B,KAAK,aAAa,KAAA;EAClB,KAAK,qBAAqB,CAAC;CAC7B;CAEA,KAAa,SAAwB,UAAiC;EACpE,KAAK,KAAK,YAAY,SAAS,QAAQ;CACzC;AACF;AAEA,SAAS,oBAAoB,OAAwB;CACnD,OAAO,iBAAiB,qBAAqB,MAAM,OAAO;AAC5D;AAEA,SAAS,iBAAiB,OAAsC,OAAmC;CACjG,MAAM,WAAW,OAAO,iBAAiB,OAAO;CAChD,IAAI,aAAa,KAAA,GACf;CAGF,OAAO,KAAK,IAAI,QAAQ,UAAU,CAAC;AACrC;AAEA,SAAS,eAAe,OAAyB;CAC/C,IAAI,iBAAiB,OACnB,OAAO;EACL,MAAM,MAAM;EACZ,SAAS,MAAM;CACjB;CAGF,OAAO;AACT;AAEA,SAAS,qBAAqB,OAAyB;CACrD,OAAO,aAAa,OAAO,oBAAoB;AACjD;AAEA,SAAS,aAAa,OAAgB,MAAuB;CAC3D,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAU,MAA6B,SAAS;AAClH;AAEA,SAAS,sBAA+C;CACtD,IAAI,OAAO,UAAU,YACnB,OAAO,8BAA8B,4BAA4B,gDAAgD;CAGnH,IAAI,OAAO,mBAAmB,aAC5B,OAAO,8BAA8B,sCAAsC,yDAAyD;CAGtI,IAAI,OAAO,gBAAgB,aACzB,OAAO,8BAA8B,2BAA2B,sDAAsD;CAGxH,IAAI,OAAO,gBAAgB,aACzB,OAAO,8BAA8B,0BAA0B,sDAAsD;CAGvH,IAAI,YAAY,kCAAkC,MAChD,OAAO,8BAA8B,iCAAiC,2DAA2D;CAGnI,IAAI,OAAO,YAAY,oBAAoB,YACzC,OAAO,8BAA8B,qCAAqC,sEAAsE;CAGlJ,KAAK,MAAM,eAAe,yBACxB,IAAI,CAAC,YAAY,gBAAgB,YAAY,QAAQ,GACnD,OAAO,8BAA8B,YAAY,iBAAiB,wBAAwB,YAAY,SAAS,EAAE;AAKvH;AAEA,SAAS,8BAA8B,MAAc,SAA8B;CACjF,OAAO;EAAE,MAAM;EAAe;EAAM;EAAS,UAAU;CAAK;AAC9D;AAEA,SAAS,wBAAwB,SAA2D;CAC1F,OAAO,IAAI,kBAAkB;EAC3B,SAAS,QAAQ;EACjB,UAAU,QAAQ;CACpB,CAAC;AACH;AAEA,SAAS,aAAa,SAAwC,SAAgF;CAC5I,OAAO;EACL,UAAU;GACR,GAAG,QAAQ;GACX,GAAG,QAAQ;EACb;EACA,SAAS;GACP,GAAG,QAAQ;GACX,GAAG,QAAQ;EACb;EACA,SAAS;GACP,GAAG,QAAQ;GACX,GAAG,QAAQ;GACX,SAAS;IACP,GAAG,QAAQ,QAAQ;IACnB,GAAG,QAAQ,SAAS;GACtB;GACA,OAAO;IACL,GAAG,QAAQ,QAAQ;IACnB,GAAG,QAAQ,SAAS;GACtB;EACF;EACA,SAAS;GACP,GAAG,QAAQ;GACX,GAAG,QAAQ;EACb;EACA,aAAa;GACX,GAAG,QAAQ;GACX,GAAG,QAAQ;EACb;CACF;AACF;;;ACnnBA,SAAgB,mBAAmB,OAAgD;CACjF,MAAM,UAAU,IAAI,cAAc;EAChC,cAAc,SAAS,aAAa,MAAM,YAAY,SAAS,QAAQ;EACvE,aAAa,MAAM,MAAM;CAC3B,CAAC;CAED,MAAM,iBAAiB,YAAY,UAAU;EAC3C,QAAa,cAAc,MAAM,IAAI;CACvC,CAAC;CACD,MAAM,YAAY,EAAE,MAAM,eAAe,CAAC;CAE1C,OAAO;AACT;AAEA,MAAM,cAAc;AACpB,MAAM,oBAAqB,WAA+E;AAE1G,IAAI,sBAAsB,KAAA,KAAa,uBAAuB,qBAAqB,OAAO,YAAY,gBAAgB,YACpH,mBAAmB,WAAuC"}
1
+ {"version":3,"file":"rivmux-runtime-worker.js","names":["ret","initBundledTransmuxCore","BundledTransmuxCore"],"sources":["../src/latency/buffer-ranges.ts","../src/latency/latency-controller.ts","../src/loader/http-flv-loader.ts","../src/loader/retry-policy.ts","../src/runtime/lifecycle.ts","../src/runtime/stats.ts","../src/mse/mime.ts","../src/mse/source-buffer-queue.ts","../src/mse/mse-controller.ts","../src/wasm/rivmux-transmux-wasm.ts","../../../crates/transmux-core/dist/rivmux_transmux_core.js","../src/wasm/wasm-loader.ts","../src/mse/fmp4-append-batcher.ts","../src/runtime/append.ts","../src/runtime/session.ts","../src/runtime/index.ts","../src/worker-entry.ts"],"sourcesContent":["export type BufferedRange = {\n start: number\n end: number\n}\n\nexport function normalizeBufferedRanges(input: TimeRanges | readonly BufferedRange[]): BufferedRange[] {\n if (isBufferedRangeArray(input)) {\n return input.filter(isValidRange).map((range) => ({ start: range.start, end: range.end }))\n }\n\n const ranges: BufferedRange[] = []\n for (let index = 0; index < input.length; index += 1) {\n const range = {\n start: input.start(index),\n end: input.end(index),\n }\n if (isValidRange(range)) {\n ranges.push(range)\n }\n }\n return ranges\n}\n\nexport function getBufferedStart(ranges: readonly BufferedRange[]): number | undefined {\n return ranges.length === 0 ? undefined : ranges[0]?.start\n}\n\nexport function getLiveEdge(ranges: readonly BufferedRange[]): number | undefined {\n const range = ranges[ranges.length - 1]\n return range?.end\n}\n\nexport function getBufferedDuration(ranges: readonly BufferedRange[]): number | undefined {\n if (ranges.length === 0) {\n return undefined\n }\n\n return ranges.reduce((total, range) => total + Math.max(0, range.end - range.start), 0)\n}\n\nexport function getForwardBuffer(ranges: readonly BufferedRange[], currentTime: number): number | undefined {\n if (!Number.isFinite(currentTime)) {\n return undefined\n }\n\n const liveEdge = getLiveEdge(ranges)\n if (liveEdge === undefined) {\n return undefined\n }\n\n return Math.max(0, liveEdge - currentTime)\n}\n\nexport function getBackwardBuffer(ranges: readonly BufferedRange[], currentTime: number): number | undefined {\n if (!Number.isFinite(currentTime)) {\n return undefined\n }\n\n for (const range of ranges) {\n if (currentTime >= range.start && currentTime <= range.end) {\n return Math.max(0, currentTime - range.start)\n }\n }\n\n const firstRange = ranges.find((range) => currentTime < range.start)\n if (firstRange !== undefined) {\n return 0\n }\n\n const lastRange = ranges[ranges.length - 1]\n return lastRange === undefined ? undefined : Math.max(0, lastRange.end - lastRange.start)\n}\n\nfunction isValidRange(range: BufferedRange): boolean {\n return Number.isFinite(range.start) && Number.isFinite(range.end) && range.end > range.start\n}\n\nfunction isBufferedRangeArray(input: TimeRanges | readonly BufferedRange[]): input is readonly BufferedRange[] {\n return Array.isArray(input)\n}\n","import { getBufferedDuration, getBufferedStart, getForwardBuffer, getLiveEdge } from './buffer-ranges'\n\nimport type { NormalizedPlaybackOptions, NormalizedLatencyOptions, PlaybackControlAction, PlaybackControlResult, VideoElementState } from '@rivmux/protocol'\nimport type { BufferedRange } from './buffer-ranges'\n\nexport type LatencyMetrics = {\n bufferedStart?: number\n bufferedEnd?: number\n bufferedDuration?: number\n currentTime?: number\n forwardBuffer?: number\n liveLatency?: number\n playbackRate?: number\n readyState?: number\n droppedFrames?: number\n}\n\nexport type LatencyEvaluationInput = {\n ranges: readonly BufferedRange[]\n videoState?: VideoElementState\n loaderPaused: boolean\n nowMs: number\n}\n\nexport type LatencyEvaluation = {\n metrics: LatencyMetrics\n cleanupBefore?: number\n loaderCommand?: 'pause' | 'resume'\n playbackControl?: PlaybackControlAction\n}\n\nexport class LatencyController {\n private readonly latency: NormalizedLatencyOptions\n private readonly playback: NormalizedPlaybackOptions\n private startupPlayRequested = false\n private pendingPlaybackControl?: PlaybackControlAction['type']\n private lastSeekRequestAtMs = Number.NEGATIVE_INFINITY\n\n constructor(config: { latency: NormalizedLatencyOptions; playback: NormalizedPlaybackOptions }) {\n this.latency = config.latency\n this.playback = config.playback\n }\n\n evaluate(input: LatencyEvaluationInput): LatencyEvaluation {\n const metrics = this.computeMetrics(input)\n const evaluation: LatencyEvaluation = { metrics }\n\n if (metrics.currentTime !== undefined) {\n const cleanupBefore = metrics.currentTime - this.latency.backwardBuffer\n if (cleanupBefore > 0) {\n evaluation.cleanupBefore = cleanupBefore\n }\n }\n\n const forwardBuffer = metrics.forwardBuffer ?? metrics.bufferedDuration\n if (forwardBuffer !== undefined) {\n if (!input.loaderPaused && forwardBuffer >= this.latency.maxForwardBuffer) {\n evaluation.loaderCommand = 'pause'\n } else if (input.loaderPaused && forwardBuffer <= this.latency.target) {\n evaluation.loaderCommand = 'resume'\n }\n }\n\n evaluation.playbackControl = this.evaluatePlaybackControl(input, metrics)\n return evaluation\n }\n\n recordPlaybackControlResult(result: PlaybackControlResult): void {\n if (this.pendingPlaybackControl === result.type) {\n this.pendingPlaybackControl = undefined\n }\n }\n\n reset(): void {\n this.startupPlayRequested = false\n this.pendingPlaybackControl = undefined\n this.lastSeekRequestAtMs = Number.NEGATIVE_INFINITY\n }\n\n private computeMetrics(input: LatencyEvaluationInput): LatencyMetrics {\n const bufferedStart = getBufferedStart(input.ranges)\n const bufferedEnd = getLiveEdge(input.ranges)\n const bufferedDuration = getBufferedDuration(input.ranges)\n const videoState = input.videoState\n const metrics: LatencyMetrics = {\n bufferedStart,\n bufferedEnd,\n bufferedDuration,\n }\n\n if (videoState === undefined) {\n return metrics\n }\n\n const forwardBuffer = getForwardBuffer(input.ranges, videoState.currentTime)\n metrics.currentTime = videoState.currentTime\n metrics.forwardBuffer = forwardBuffer\n metrics.playbackRate = videoState.playbackRate\n metrics.readyState = videoState.readyState\n metrics.droppedFrames = videoState.droppedFrames\n metrics.liveLatency = forwardBuffer\n return metrics\n }\n\n private evaluatePlaybackControl(input: LatencyEvaluationInput, metrics: LatencyMetrics): PlaybackControlAction | undefined {\n if (this.pendingPlaybackControl !== undefined) {\n return undefined\n }\n\n if (\n !this.startupPlayRequested &&\n this.playback.autoPlay &&\n metrics.bufferedDuration !== undefined &&\n metrics.bufferedDuration >= this.latency.startupBuffer\n ) {\n this.startupPlayRequested = true\n this.pendingPlaybackControl = 'play'\n return { type: 'play', reason: 'startup-buffer-ready' }\n }\n\n if (input.videoState === undefined || metrics.liveLatency === undefined || metrics.bufferedEnd === undefined) {\n return undefined\n }\n\n if (metrics.liveLatency > this.latency.max) {\n const seekTarget = Math.max(metrics.bufferedStart ?? 0, metrics.bufferedEnd - this.latency.target)\n const hasSeekCooldownElapsed = input.nowMs - this.lastSeekRequestAtMs >= SEEK_COOLDOWN_MS\n if (hasSeekCooldownElapsed && Math.abs(seekTarget - input.videoState.currentTime) >= SEEK_MIN_DELTA_SECONDS) {\n this.lastSeekRequestAtMs = input.nowMs\n this.pendingPlaybackControl = 'seek'\n return { type: 'seek', targetTime: seekTarget, reason: 'latency-max-exceeded' }\n }\n return undefined\n }\n\n if (metrics.liveLatency > this.latency.target + PLAYBACK_RATE_CHASE_THRESHOLD_SECONDS) {\n if (Math.abs(input.videoState.playbackRate - PLAYBACK_RATE_CHASE) >= PLAYBACK_RATE_EPSILON) {\n this.pendingPlaybackControl = 'set-playback-rate'\n return { type: 'set-playback-rate', playbackRate: PLAYBACK_RATE_CHASE, reason: 'latency-above-target' }\n }\n } else if (input.videoState.playbackRate !== 1 && metrics.liveLatency <= this.latency.target + PLAYBACK_RATE_RESTORE_THRESHOLD_SECONDS) {\n this.pendingPlaybackControl = 'set-playback-rate'\n return { type: 'set-playback-rate', playbackRate: 1, reason: 'latency-near-target' }\n }\n\n return undefined\n }\n}\n\nconst PLAYBACK_RATE_CHASE = 1.05\nconst PLAYBACK_RATE_EPSILON = 0.005\nconst PLAYBACK_RATE_CHASE_THRESHOLD_SECONDS = 0.25\nconst PLAYBACK_RATE_RESTORE_THRESHOLD_SECONDS = 0.1\nconst SEEK_COOLDOWN_MS = 1000\nconst SEEK_MIN_DELTA_SECONDS = 0.1\n","import type { StreamChunk, StreamLoader, StreamLoaderConfig, StreamLoaderStats } from './loader'\nimport type { ReconnectReason } from '@rivmux/protocol'\n\ntype LoaderState = 'idle' | 'opening' | 'open' | 'closed'\nexport type HttpFlvLoaderErrorPhase = 'open' | 'read'\n\nexport type HttpFlvLoaderErrorOptions = {\n phase: HttpFlvLoaderErrorPhase\n reason?: ReconnectReason\n status?: number\n cause?: unknown\n}\n\n/** Structured failure raised by one HTTP-FLV connection. */\nexport class HttpFlvLoaderError extends Error {\n readonly code: string\n readonly phase: HttpFlvLoaderErrorPhase\n readonly reason?: ReconnectReason\n readonly status?: number\n override readonly cause?: unknown\n\n constructor(code: string, message: string, options?: HttpFlvLoaderErrorOptions | number) {\n const normalizedOptions: HttpFlvLoaderErrorOptions =\n typeof options === 'number' ? { phase: 'open', reason: 'http-status', status: options } : (options ?? { phase: 'open' })\n super(message, normalizedOptions.cause === undefined ? undefined : { cause: normalizedOptions.cause })\n this.name = 'HttpFlvLoaderError'\n this.code = code\n this.phase = normalizedOptions.phase\n this.reason = normalizedOptions.reason\n this.status = normalizedOptions.status\n this.cause = normalizedOptions.cause\n }\n}\n\nexport class HttpFlvLoader implements StreamLoader {\n private readonly url: string\n private readonly headers: Record<string, string>\n private readonly credentials: RequestCredentials\n private readonly readIdleTimeoutMs: number\n private readonly fetchImpl: typeof fetch\n private readonly now: () => number\n private readonly setTimer: (callback: () => void, ms: number) => ReturnType<typeof setTimeout>\n private readonly clearTimer: (timer: ReturnType<typeof setTimeout>) => void\n private abortController?: AbortController\n private reader?: ReadableStreamDefaultReader<Uint8Array>\n private state: LoaderState = 'idle'\n private pausedState = false\n private resumeWaiters: Array<() => void> = []\n private activeReadTimeout?: PausableTimeout\n private readonly mutableStats: StreamLoaderStats = {\n bytesReceived: 0,\n currentNetworkSpeed: 0,\n }\n\n constructor(config: StreamLoaderConfig) {\n this.url = config.url\n this.headers = config.network.headers\n this.credentials = config.network.credentials\n this.readIdleTimeoutMs = config.network.readIdleTimeoutMs\n this.fetchImpl = config.fetch ?? globalThis.fetch.bind(globalThis)\n this.now = config.now ?? (() => performance.now())\n this.setTimer = config.setTimeout ?? ((callback, ms) => setTimeout(callback, ms))\n this.clearTimer = config.clearTimeout ?? ((timer) => clearTimeout(timer))\n }\n\n get closed(): boolean {\n return this.state === 'closed'\n }\n\n get paused(): boolean {\n return this.pausedState\n }\n\n get stats(): StreamLoaderStats {\n return { ...this.mutableStats }\n }\n\n async open(): Promise<void> {\n if (this.state !== 'idle') {\n throw new HttpFlvLoaderError('RIVMUX_LOADER_INVALID_STATE', 'HTTP Fetch loader can only be opened once.', { phase: 'open' })\n }\n\n this.state = 'opening'\n this.mutableStats.startedAtMs = this.now()\n const abortController = new AbortController()\n this.abortController = abortController\n\n let response: Response\n try {\n const fetchRequest = Promise.resolve(\n this.fetchImpl(this.url, {\n method: 'GET',\n headers: createHeaders(this.headers),\n credentials: this.credentials,\n signal: abortController.signal,\n })\n )\n response = await raceWithAbort(fetchRequest, abortController.signal, (lateResponse) => void cancelResponseBody(lateResponse))\n } catch (cause) {\n if (this.closed || isAbortLikeError(cause)) {\n throw cause\n }\n throw new HttpFlvLoaderError('RIVMUX_HTTP_NETWORK_ERROR', 'HTTP Fetch loader failed to open the stream.', {\n phase: 'open',\n reason: 'network-error',\n cause,\n })\n }\n\n if (this.closed) {\n await cancelResponseBody(response)\n return\n }\n\n if (!response.ok) {\n await cancelResponseBody(response)\n throw new HttpFlvLoaderError('RIVMUX_HTTP_STATUS', `HTTP Fetch loader received status ${response.status} ${response.statusText}.`, {\n phase: 'open',\n reason: 'http-status',\n status: response.status,\n })\n }\n\n if (response.body === null) {\n throw new HttpFlvLoaderError('RIVMUX_HTTP_BODY_UNAVAILABLE', 'HTTP Fetch loader response body is unavailable.', { phase: 'open' })\n }\n\n const contentLength = response.headers.get('Content-Length')\n if (contentLength !== null) {\n const parsedContentLength = Number.parseInt(contentLength, 10)\n if (Number.isFinite(parsedContentLength) && parsedContentLength >= 0) {\n this.mutableStats.contentLength = parsedContentLength\n }\n }\n\n try {\n this.reader = response.body.getReader()\n } catch (cause) {\n await cancelResponseBody(response)\n throw new HttpFlvLoaderError('RIVMUX_HTTP_NETWORK_ERROR', 'HTTP Fetch loader could not acquire a stream reader.', {\n phase: 'open',\n reason: 'network-error',\n cause,\n })\n }\n this.state = 'open'\n }\n\n async read(): Promise<StreamChunk | null> {\n await this.waitUntilResumed()\n\n if (this.closed) {\n return null\n }\n\n const reader = this.reader\n const abortController = this.abortController\n if (reader === undefined || abortController === undefined) {\n if (this.closed) {\n return null\n }\n\n throw new HttpFlvLoaderError('RIVMUX_LOADER_NOT_OPEN', 'HTTP Fetch loader must be opened before read().', { phase: 'read' })\n }\n\n const timeout = new PausableTimeout({\n durationMs: this.readIdleTimeoutMs,\n now: this.now,\n setTimeout: this.setTimer,\n clearTimeout: this.clearTimer,\n })\n this.activeReadTimeout = timeout\n if (this.pausedState) {\n timeout.pause()\n }\n\n let result: ReadableStreamReadResult<Uint8Array>\n try {\n result = await raceWithAbort(Promise.race([reader.read(), timeout.promise]), abortController.signal)\n } catch (cause) {\n if (this.closed || isAbortLikeError(cause)) {\n return null\n }\n if (cause instanceof ReadIdleTimeoutError) {\n throw new HttpFlvLoaderError('RIVMUX_HTTP_READ_TIMEOUT', `HTTP Fetch loader received no data for ${this.readIdleTimeoutMs} ms.`, {\n phase: 'read',\n reason: 'read-timeout',\n cause,\n })\n }\n throw new HttpFlvLoaderError('RIVMUX_HTTP_READ_FAILED', 'HTTP Fetch loader failed while reading the stream.', {\n phase: 'read',\n reason: 'read-error',\n cause,\n })\n } finally {\n timeout.cancel()\n if (this.activeReadTimeout === timeout) {\n this.activeReadTimeout = undefined\n }\n }\n\n if (result.done) {\n releaseReader(reader)\n if (this.reader === reader) {\n this.reader = undefined\n }\n if (this.closed) {\n return null\n }\n throw new HttpFlvLoaderError('RIVMUX_HTTP_UNEXPECTED_EOF', 'HTTP Fetch loader reached an unexpected end of the live stream.', {\n phase: 'read',\n reason: 'unexpected-eof',\n })\n }\n\n const bytes = result.value\n const receivedAtMs = this.now()\n const previousChunkAtMs = this.mutableStats.lastChunkAtMs ?? this.mutableStats.startedAtMs ?? receivedAtMs\n const elapsedSeconds = Math.max((receivedAtMs - previousChunkAtMs) / 1000, 0)\n\n this.mutableStats.bytesReceived += bytes.byteLength\n this.mutableStats.currentNetworkSpeed = elapsedSeconds === 0 ? bytes.byteLength : bytes.byteLength / elapsedSeconds\n this.mutableStats.lastChunkAtMs = receivedAtMs\n\n return { bytes, receivedAtMs }\n }\n\n pause(): void {\n if (this.closed || this.pausedState) {\n return\n }\n\n this.pausedState = true\n this.activeReadTimeout?.pause()\n }\n\n resume(): void {\n if (!this.pausedState) {\n return\n }\n\n this.pausedState = false\n this.activeReadTimeout?.resume()\n this.resolveResumeWaiters()\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return\n }\n\n this.state = 'closed'\n this.pausedState = false\n this.resolveResumeWaiters()\n this.activeReadTimeout?.cancel()\n this.abortController?.abort()\n\n const reader = this.reader\n this.reader = undefined\n if (reader === undefined) {\n return\n }\n\n try {\n await reader.cancel()\n } catch {\n // Cancellation errors are expected while aborting an in-flight stream.\n } finally {\n releaseReader(reader)\n }\n }\n\n private waitUntilResumed(): Promise<void> {\n if (!this.pausedState || this.closed) {\n return Promise.resolve()\n }\n\n return new Promise((resolve) => {\n this.resumeWaiters.push(resolve)\n })\n }\n\n private resolveResumeWaiters(): void {\n const waiters = this.resumeWaiters\n this.resumeWaiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n}\n\nexport function isAbortLikeError(cause: unknown): boolean {\n return cause instanceof DOMException && cause.name === 'AbortError'\n}\n\nfunction createHeaders(headers: Record<string, string>): Headers {\n const result = new Headers()\n for (const [key, value] of Object.entries(headers)) {\n result.append(key, value)\n }\n return result\n}\n\nasync function cancelResponseBody(response: Response): Promise<void> {\n try {\n await response.body?.cancel()\n } catch {\n // Response cancellation is best-effort while rejecting an unusable connection.\n }\n}\n\nfunction releaseReader(reader: ReadableStreamDefaultReader<Uint8Array>): void {\n try {\n reader.releaseLock()\n } catch {\n // A pending read can make releaseLock throw during teardown.\n }\n}\n\nfunction createAbortError(): DOMException {\n return new DOMException('HTTP Fetch loader was aborted.', 'AbortError')\n}\n\nfunction raceWithAbort<T>(operation: Promise<T>, signal: AbortSignal, onLateValue?: (value: T) => void): Promise<T> {\n if (signal.aborted) {\n void operation.then(onLateValue, () => undefined)\n return Promise.reject(createAbortError())\n }\n\n return new Promise((resolve, reject) => {\n let settled = false\n const onAbort = (): void => {\n if (settled) {\n return\n }\n settled = true\n signal.removeEventListener('abort', onAbort)\n void operation.then(onLateValue, () => undefined)\n reject(createAbortError())\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n void operation.then(\n (value) => {\n if (settled) {\n return\n }\n settled = true\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error: unknown) => {\n if (settled) {\n return\n }\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(error)\n }\n )\n })\n}\n\nclass ReadIdleTimeoutError extends Error {\n constructor() {\n super('HTTP Fetch loader read timed out.')\n this.name = 'ReadIdleTimeoutError'\n }\n}\n\ntype PausableTimeoutOptions = {\n durationMs: number\n now: () => number\n setTimeout: (callback: () => void, ms: number) => ReturnType<typeof setTimeout>\n clearTimeout: (timer: ReturnType<typeof setTimeout>) => void\n}\n\nclass PausableTimeout {\n readonly promise: Promise<never>\n private readonly now: () => number\n private readonly setTimer: PausableTimeoutOptions['setTimeout']\n private readonly clearTimer: PausableTimeoutOptions['clearTimeout']\n private reject?: (error: ReadIdleTimeoutError) => void\n private timer?: ReturnType<typeof setTimeout>\n private remainingMs: number\n private startedAtMs = 0\n private settled = false\n\n constructor(options: PausableTimeoutOptions) {\n this.now = options.now\n this.setTimer = options.setTimeout\n this.clearTimer = options.clearTimeout\n this.remainingMs = options.durationMs\n this.promise = new Promise<never>((_, reject) => {\n this.reject = reject\n })\n this.start()\n }\n\n pause(): void {\n if (this.settled || this.timer === undefined) {\n return\n }\n this.remainingMs = Math.max(0, this.remainingMs - Math.max(0, this.now() - this.startedAtMs))\n this.clearTimer(this.timer)\n this.timer = undefined\n }\n\n resume(): void {\n if (this.settled || this.timer !== undefined) {\n return\n }\n this.start()\n }\n\n cancel(): void {\n if (this.settled) {\n return\n }\n this.settled = true\n if (this.timer !== undefined) {\n this.clearTimer(this.timer)\n this.timer = undefined\n }\n this.reject = undefined\n }\n\n private start(): void {\n this.startedAtMs = this.now()\n this.timer = this.setTimer(() => {\n if (this.settled) {\n return\n }\n this.settled = true\n this.timer = undefined\n this.reject?.(new ReadIdleTimeoutError())\n this.reject = undefined\n }, this.remainingMs)\n }\n}\n","import { HttpFlvLoaderError } from './http-flv-loader'\n\nexport type RetryPolicy = {\n maxAttempts: number\n backoffMs: number\n maxBackoffMs: number\n jitterRatio: number\n}\n\nexport function createRetryPolicy(input: RetryPolicy): RetryPolicy {\n return { ...input }\n}\n\n/**\n * Calculates the delay after a failed one-based connection attempt.\n * Attempt 1 is the initial connection, so its retry uses the base delay.\n */\nexport function getRetryDelayMs(policy: RetryPolicy, failedAttempt: number, random: () => number = Math.random): number {\n if (policy.backoffMs === 0 || policy.maxBackoffMs === 0) {\n return 0\n }\n\n const exponent = Math.max(0, Math.trunc(failedAttempt) - 1)\n const exponentialDelay = Math.min(policy.maxBackoffMs, policy.backoffMs * 2 ** exponent)\n const randomValue = normalizeRandom(random())\n const jitterMultiplier = 1 + (randomValue * 2 - 1) * policy.jitterRatio\n return Math.min(policy.maxBackoffMs, Math.max(0, Math.round(exponentialDelay * jitterMultiplier)))\n}\n\nexport function isRecoverableHttpStatus(status: number): boolean {\n return status === 408 || status === 429 || (status >= 500 && status <= 599)\n}\n\nexport function isRecoverableLoaderError(cause: unknown): cause is HttpFlvLoaderError {\n if (!(cause instanceof HttpFlvLoaderError) || cause.reason === undefined) {\n return false\n }\n\n if (cause.reason === 'http-status') {\n return cause.status !== undefined && isRecoverableHttpStatus(cause.status)\n }\n\n return cause.reason === 'network-error' || cause.reason === 'read-error' || cause.reason === 'read-timeout' || cause.reason === 'unexpected-eof'\n}\n\nfunction normalizeRandom(value: number): number {\n if (!Number.isFinite(value)) {\n return 0.5\n }\n return Math.min(1, Math.max(0, value))\n}\n","export type LifecycleCommandContext = {\n generation: number\n signal: AbortSignal\n}\n\nexport type LifecycleOperationResult<T> = { cancelled: true } | { cancelled: false; value: T }\n\nexport function raceLifecycleOperation<T>(operation: Promise<T>, signal: AbortSignal, onLateValue?: (value: T) => void): Promise<LifecycleOperationResult<T>> {\n if (signal.aborted) {\n void operation.then(onLateValue, () => undefined)\n return Promise.resolve({ cancelled: true })\n }\n\n return new Promise((resolve, reject) => {\n let settled = false\n const onAbort = (): void => {\n if (settled) {\n return\n }\n settled = true\n signal.removeEventListener('abort', onAbort)\n void operation.then(onLateValue, () => undefined)\n resolve({ cancelled: true })\n }\n\n signal.addEventListener('abort', onAbort, { once: true })\n void operation.then(\n (value) => {\n if (settled) {\n return\n }\n settled = true\n signal.removeEventListener('abort', onAbort)\n resolve({ cancelled: false, value })\n },\n (error: unknown) => {\n if (settled) {\n return\n }\n settled = true\n signal.removeEventListener('abort', onAbort)\n reject(error)\n }\n )\n })\n}\n","import type { StreamLoaderStats } from '../loader/loader'\nimport type { LatencyMetrics } from '../latency/latency-controller'\nimport type { PlayerStats } from '@rivmux/protocol'\n\nexport type RuntimeMseStatsSnapshot = {\n appendQueueLength: number\n appendQueueBytes: number\n sourceBufferUpdating: boolean\n sourceBufferCount: number\n bufferedRangeCount: number\n bufferedStart: number | undefined\n bufferedEnd: number | undefined\n bufferedDuration: number | undefined\n}\n\nexport type AppendQueueHighWaterMark = {\n length: number\n bytes: number\n}\n\nexport type RuntimeStatsSnapshot = {\n loaderStats: StreamLoaderStats | undefined\n mseStats: RuntimeMseStatsSnapshot\n latencyMetrics: LatencyMetrics\n outputBytes: number\n appendQueueMaxLength: number\n appendQueueMaxBytes: number\n loaderPaused: boolean\n nowMs: number\n}\n\nexport function updateAppendQueueHighWaterMark(current: AppendQueueHighWaterMark, mseStats: RuntimeMseStatsSnapshot): AppendQueueHighWaterMark {\n return {\n length: Math.max(current.length, mseStats.appendQueueLength),\n bytes: Math.max(current.bytes, mseStats.appendQueueBytes),\n }\n}\n\nexport function getNetworkIdleMs(stats: StreamLoaderStats | undefined, nowMs: number): number | undefined {\n const markerMs = stats?.lastChunkAtMs ?? stats?.startedAtMs\n if (markerMs === undefined) {\n return undefined\n }\n\n return Math.max(nowMs - markerMs, 0)\n}\n\nexport function createPlayerStats(snapshot: RuntimeStatsSnapshot): PlayerStats {\n const { loaderStats, mseStats, latencyMetrics } = snapshot\n return {\n bytesReceived: loaderStats?.bytesReceived ?? 0,\n currentNetworkSpeed: loaderStats?.currentNetworkSpeed ?? 0,\n networkIdleMs: getNetworkIdleMs(loaderStats, snapshot.nowMs),\n outputBytes: snapshot.outputBytes,\n appendQueueLength: mseStats.appendQueueLength,\n appendQueueBytes: mseStats.appendQueueBytes,\n appendQueueMaxLength: snapshot.appendQueueMaxLength,\n appendQueueMaxBytes: snapshot.appendQueueMaxBytes,\n loaderPaused: snapshot.loaderPaused,\n sourceBufferUpdating: mseStats.sourceBufferUpdating,\n sourceBufferCount: mseStats.sourceBufferCount,\n bufferedStart: latencyMetrics.bufferedStart ?? mseStats.bufferedStart,\n bufferedEnd: latencyMetrics.bufferedEnd ?? mseStats.bufferedEnd,\n bufferedDuration: latencyMetrics.bufferedDuration ?? mseStats.bufferedDuration,\n bufferedRangeCount: mseStats.bufferedRangeCount,\n currentTime: latencyMetrics.currentTime,\n liveLatency: latencyMetrics.liveLatency,\n playbackRate: latencyMetrics.playbackRate,\n readyState: latencyMetrics.readyState,\n droppedFrames: latencyMetrics.droppedFrames,\n }\n}\n","export function createMp4VideoMime(codec: string): string {\n return `video/mp4; codecs=\"${codec}\"`\n}\n\nexport function createMp4AudioMime(codec: string): string {\n return `audio/mp4; codecs=\"${codec}\"`\n}\n\nexport class MseUnsupportedMimeError extends Error {\n readonly mimeType: string\n\n constructor(mimeType: string) {\n super(`MSE does not support ${mimeType}.`)\n this.name = 'MseUnsupportedMimeError'\n this.mimeType = mimeType\n }\n}\n\nexport function isMseSupported(mimeType: string): boolean {\n return typeof MediaSource !== 'undefined' && typeof MediaSource.isTypeSupported === 'function' && MediaSource.isTypeSupported(mimeType)\n}\n\nexport function assertMseRuntimeSupport(): void {\n if (typeof MediaSource === 'undefined') {\n throw new Error('MediaSource is not available in this worker.')\n }\n\n if (MediaSource.canConstructInDedicatedWorker !== true) {\n throw new Error('MediaSource cannot be constructed in this dedicated worker.')\n }\n\n if (typeof MediaSource.isTypeSupported !== 'function') {\n throw new Error('MediaSource.isTypeSupported is not available in this worker.')\n }\n}\n\nexport function assertMseSupport(mimeType: string): void {\n assertMseRuntimeSupport()\n if (!isMseSupported(mimeType)) {\n throw new MseUnsupportedMimeError(mimeType)\n }\n}\n","import { getBufferedDuration, getBufferedStart, getLiveEdge, normalizeBufferedRanges } from '../latency/buffer-ranges'\n\nimport type { BufferedRange } from '../latency/buffer-ranges'\n\ntype SourceBufferOperation = { type: 'append'; data: ArrayBuffer } | { type: 'remove'; start: number; end: number }\n\nexport class SourceBufferQueue {\n private readonly sourceBuffer: SourceBuffer\n private readonly queue: SourceBufferOperation[] = []\n private pendingDrain?: Promise<void>\n private activeAppendBytes = 0\n private destroyed = false\n\n constructor(sourceBuffer: SourceBuffer) {\n this.sourceBuffer = sourceBuffer\n }\n\n get length(): number {\n return this.queue.length + (this.sourceBuffer.updating ? 1 : 0)\n }\n\n get queuedBytes(): number {\n return this.activeAppendBytes + this.queue.reduce((total, operation) => total + (operation.type === 'append' ? operation.data.byteLength : 0), 0)\n }\n\n get updating(): boolean {\n return this.sourceBuffer.updating\n }\n\n get bufferedRanges(): BufferedRange[] {\n return normalizeBufferedRanges(this.sourceBuffer.buffered)\n }\n\n get bufferedStart(): number | undefined {\n return getBufferedStart(this.bufferedRanges)\n }\n\n get bufferedEnd(): number | undefined {\n return getLiveEdge(this.bufferedRanges)\n }\n\n get bufferedDuration(): number | undefined {\n return getBufferedDuration(this.bufferedRanges)\n }\n\n append(data: ArrayBuffer): Promise<void> {\n if (this.destroyed) {\n return Promise.reject(new Error('SourceBufferQueue has been destroyed.'))\n }\n\n this.queue.push({ type: 'append', data })\n this.pendingDrain ??= this.drain()\n return this.pendingDrain\n }\n\n cleanupBefore(cutoff: number): Promise<void> {\n if (this.destroyed) {\n return Promise.reject(new Error('SourceBufferQueue has been destroyed.'))\n }\n\n const removals = this.createCleanupOperations(cutoff)\n if (removals.length === 0) {\n return this.pendingDrain ?? Promise.resolve()\n }\n\n this.queue.unshift(...removals)\n this.pendingDrain ??= this.drain()\n return this.pendingDrain\n }\n\n reset(): void {\n this.queue.length = 0\n this.activeAppendBytes = 0\n }\n\n destroy(): void {\n this.destroyed = true\n this.reset()\n }\n\n private async drain(): Promise<void> {\n try {\n while (this.queue.length > 0 && !this.destroyed) {\n await this.waitForIdle()\n this.activeAppendBytes = 0\n const operation = this.queue.shift()\n\n if (operation?.type === 'append') {\n this.activeAppendBytes = operation.data.byteLength\n try {\n this.sourceBuffer.appendBuffer(operation.data)\n } catch (cause) {\n this.activeAppendBytes = 0\n throw cause\n }\n } else if (operation?.type === 'remove') {\n this.sourceBuffer.remove(operation.start, operation.end)\n }\n }\n\n await this.waitForIdle()\n this.activeAppendBytes = 0\n } finally {\n if (this.queue.length === 0 && !this.sourceBuffer.updating) {\n this.activeAppendBytes = 0\n }\n this.pendingDrain = undefined\n }\n }\n\n private createCleanupOperations(cutoff: number): SourceBufferOperation[] {\n if (!Number.isFinite(cutoff) || cutoff <= 0) {\n return []\n }\n\n return this.bufferedRanges\n .map((range) => ({ type: 'remove' as const, start: range.start, end: Math.min(range.end, cutoff) }))\n .filter((operation) => operation.end > operation.start)\n }\n\n private waitForIdle(): Promise<void> {\n if (!this.sourceBuffer.updating) {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n this.sourceBuffer.removeEventListener('updateend', onUpdateEnd)\n this.sourceBuffer.removeEventListener('error', onError)\n this.sourceBuffer.removeEventListener('abort', onAbort)\n }\n const onUpdateEnd = (): void => {\n cleanup()\n resolve()\n }\n const onError = (): void => {\n cleanup()\n reject(new Error('SourceBuffer append failed.'))\n }\n const onAbort = (): void => {\n cleanup()\n reject(new Error('SourceBuffer append was aborted.'))\n }\n\n this.sourceBuffer.addEventListener('updateend', onUpdateEnd, { once: true })\n this.sourceBuffer.addEventListener('error', onError, { once: true })\n this.sourceBuffer.addEventListener('abort', onAbort, { once: true })\n })\n }\n}\n","import { assertMseRuntimeSupport, assertMseSupport, createMp4AudioMime, createMp4VideoMime } from './mime'\nimport { SourceBufferQueue } from './source-buffer-queue'\n\nimport type { BufferedRange } from '../latency/buffer-ranges'\nimport type { CoreInitSegment, CoreMediaSegment } from '../wasm/rivmux-transmux-wasm'\n\nexport class MseController {\n private mediaSource?: MediaSource\n private readonly sourceBuffers = new Map<CoreInitSegment['track'], SourceBuffer>()\n private readonly queues = new Map<CoreInitSegment['track'], SourceBufferQueue>()\n private lastCleanupBefore = 0\n\n get appendQueueLength(): number {\n return Array.from(this.queues.values()).reduce((total, queue) => total + queue.length, 0)\n }\n\n get appendQueueBytes(): number {\n return Array.from(this.queues.values()).reduce((total, queue) => total + queue.queuedBytes, 0)\n }\n\n get sourceBufferUpdating(): boolean {\n return Array.from(this.queues.values()).some((queue) => queue.updating)\n }\n\n get sourceBufferCount(): number {\n return this.sourceBuffers.size\n }\n\n get bufferedStart(): number | undefined {\n return this.primaryQueue?.bufferedStart\n }\n\n get bufferedEnd(): number | undefined {\n return this.primaryQueue?.bufferedEnd\n }\n\n get bufferedDuration(): number | undefined {\n return this.primaryQueue?.bufferedDuration\n }\n\n get bufferedRanges(): BufferedRange[] {\n return this.primaryQueue?.bufferedRanges ?? []\n }\n\n get bufferedRangeCount(): number {\n return Array.from(this.queues.values()).reduce((total, queue) => total + queue.bufferedRanges.length, 0)\n }\n\n async createMediaSourceHandle(): Promise<MediaSourceHandle> {\n assertMseRuntimeSupport()\n\n const mediaSource = new MediaSource()\n this.mediaSource = mediaSource\n\n const handle = (mediaSource as MediaSourceWithHandle).handle\n if (handle === undefined) {\n throw new Error('MediaSourceHandle is not available.')\n }\n\n return handle\n }\n\n async appendInitSegment(segment: CoreInitSegment): Promise<void> {\n const mediaSource = this.requireMediaSource()\n const mimeType = createMp4Mime(segment.track, segment.codec)\n assertMseSupport(mimeType)\n await waitForSourceOpen(mediaSource)\n\n const queue = this.ensureQueue(segment.track, mimeType)\n await queue.append(toAppendBuffer(segment.bytes))\n }\n\n async appendMediaSegment(segment: CoreMediaSegment): Promise<void> {\n const queue = this.queues.get(segment.track) ?? this.queues.get('muxed')\n if (queue === undefined) {\n throw new Error(`Cannot append ${segment.track} media segment before init segment.`)\n }\n\n await queue.append(toAppendBuffer(segment.bytes))\n const mediaSource = this.requireMediaSource()\n const duration = segment.dtsEndMs / 1000\n if (Number.isFinite(duration) && duration > 0 && mediaSource.readyState === 'open') {\n mediaSource.duration = Math.max(mediaSource.duration, duration)\n }\n }\n\n async cleanupBefore(cutoff: number, options: MseCleanupOptions = {}): Promise<void> {\n if (!Number.isFinite(cutoff) || cutoff <= 0 || (!options.force && cutoff <= this.lastCleanupBefore + CLEANUP_STEP_SECONDS)) {\n return\n }\n\n this.lastCleanupBefore = cutoff\n await Promise.all(Array.from(this.queues.values(), (queue) => queue.cleanupBefore(cutoff)))\n }\n\n reset(): void {\n for (const queue of this.queues.values()) {\n queue.reset()\n }\n this.lastCleanupBefore = 0\n }\n\n destroy(): void {\n for (const queue of this.queues.values()) {\n queue.destroy()\n }\n this.queues.clear()\n\n if (this.mediaSource !== undefined) {\n for (const sourceBuffer of this.sourceBuffers.values()) {\n try {\n this.mediaSource.removeSourceBuffer(sourceBuffer)\n } catch {\n // Browser cleanup can race sourceclose during worker termination.\n }\n }\n }\n\n this.sourceBuffers.clear()\n this.mediaSource = undefined\n }\n\n private get primaryQueue(): SourceBufferQueue | undefined {\n return this.queues.get('video') ?? this.queues.get('muxed') ?? this.queues.get('audio')\n }\n\n private requireMediaSource(): MediaSource {\n if (this.mediaSource === undefined) {\n throw new Error('MediaSource has not been created.')\n }\n\n return this.mediaSource\n }\n\n private ensureQueue(track: CoreInitSegment['track'], mimeType: string): SourceBufferQueue {\n const existing = this.queues.get(track)\n if (existing !== undefined) {\n return existing\n }\n\n const sourceBuffer = this.requireMediaSource().addSourceBuffer(mimeType)\n const queue = new SourceBufferQueue(sourceBuffer)\n this.sourceBuffers.set(track, sourceBuffer)\n this.queues.set(track, queue)\n return queue\n }\n}\n\ntype MediaSourceWithHandle = MediaSource & {\n readonly handle?: MediaSourceHandle\n}\n\nfunction waitForSourceOpen(mediaSource: MediaSource): Promise<void> {\n if (mediaSource.readyState === 'open') {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n mediaSource.removeEventListener('sourceopen', onOpen)\n mediaSource.removeEventListener('sourceclose', onClose)\n mediaSource.removeEventListener('error', onError)\n }\n const onOpen = (): void => {\n cleanup()\n resolve()\n }\n const onClose = (): void => {\n cleanup()\n reject(new Error('MediaSource closed before sourceopen.'))\n }\n const onError = (): void => {\n cleanup()\n reject(new Error('MediaSource failed before sourceopen.'))\n }\n\n mediaSource.addEventListener('sourceopen', onOpen, { once: true })\n mediaSource.addEventListener('sourceclose', onClose, { once: true })\n mediaSource.addEventListener('error', onError, { once: true })\n })\n}\n\nfunction toAppendBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength)\n copy.set(bytes)\n return copy.buffer\n}\n\nfunction createMp4Mime(track: CoreInitSegment['track'], codec: string): string {\n return track === 'audio' ? createMp4AudioMime(codec) : createMp4VideoMime(codec)\n}\n\nconst CLEANUP_STEP_SECONDS = 0.25\n\ntype MseCleanupOptions = {\n force?: boolean\n}\n","import type { MediaInfo, PlayerError, PlayerWarning } from '@rivmux/protocol'\n\nexport type CoreErrorCode =\n | 'unsupportedContainer'\n | 'unsupportedVideoCodec'\n | 'unsupportedAudioCodec'\n | 'invalidContainerData'\n | 'invalidCodecConfig'\n | 'invalidTimestamp'\n | 'muxerError'\n | 'internalError'\n\nexport type CoreError = {\n code: CoreErrorCode\n message: string\n}\n\nexport type CoreProbeResult = {\n container: 'flv' | 'mpegts'\n video?: 'avc' | 'hevc' | 'av1'\n audio?: 'aac' | 'mp3' | 'ac3' | 'eac3' | 'opus'\n}\n\nexport type CoreMediaInfo = {\n container: CoreProbeResult['container']\n video?: CoreProbeResult['video']\n audio?: CoreProbeResult['audio']\n videoCodec?: string\n audioCodec?: string\n width?: number\n height?: number\n audioSampleRate?: number\n audioChannelCount?: number\n}\n\nexport type CoreWarning = {\n code: string\n message: string\n}\n\nexport type CoreTrackKind = 'video' | 'audio' | 'muxed'\n\nexport type CoreInitSegment = {\n track: CoreTrackKind\n codec: string\n timescale: number\n bytes: Uint8Array\n}\n\nexport type CoreMediaSegment = {\n track: CoreTrackKind\n dtsStartMs: number\n dtsEndMs: number\n keyframe: boolean\n bytes: Uint8Array\n}\n\nexport type CoreEvent =\n | { type: 'probeResult'; data: CoreProbeResult }\n | { type: 'mediaInfo'; data: CoreMediaInfo }\n | { type: 'initSegment'; data: CoreInitSegment }\n | { type: 'mediaSegment'; data: CoreMediaSegment }\n | { type: 'trackConfig'; data: unknown }\n | { type: 'sample'; data: unknown }\n | { type: 'metadata'; data: unknown }\n | { type: 'warning'; data: CoreWarning }\n | { type: 'fatalError'; data: CoreError }\n | { type: 'discontinuity'; data: unknown }\n\nexport type TransmuxCoreHost = {\n pushChunk(chunk: Uint8Array): CoreEvent[]\n flush(): CoreEvent[]\n reset(): void\n destroy(): void\n}\n\nexport type TransmuxCoreWasmConstructor = new () => {\n pushChunk(chunk: Uint8Array): unknown\n flush(): unknown\n reset(): void\n destroy(): void\n}\n\nexport class WasmTransmuxCoreHost implements TransmuxCoreHost {\n private readonly core: InstanceType<TransmuxCoreWasmConstructor>\n\n constructor(Core: TransmuxCoreWasmConstructor) {\n this.core = new Core()\n }\n\n pushChunk(chunk: Uint8Array): CoreEvent[] {\n return normalizeCoreEvents(this.core.pushChunk(chunk))\n }\n\n flush(): CoreEvent[] {\n return normalizeCoreEvents(this.core.flush())\n }\n\n reset(): void {\n this.core.reset()\n }\n\n destroy(): void {\n this.core.destroy()\n }\n}\n\nexport function normalizeCoreEvents(value: unknown): CoreEvent[] {\n if (!Array.isArray(value)) {\n throw new TypeError('Transmux core returned a non-array event payload.')\n }\n\n return value.map((event) => normalizeCoreEvent(event))\n}\n\nexport function coreMediaInfoToPlayerMediaInfo(mediaInfo: CoreMediaInfo): MediaInfo {\n const result: MediaInfo = {\n container: mediaInfo.container,\n }\n if (mediaInfo.videoCodec !== undefined) {\n result.videoCodec = mediaInfo.videoCodec\n }\n if (mediaInfo.audioCodec !== undefined) {\n result.audioCodec = mediaInfo.audioCodec\n }\n if (mediaInfo.width !== undefined) {\n result.width = mediaInfo.width\n }\n if (mediaInfo.height !== undefined) {\n result.height = mediaInfo.height\n }\n if (mediaInfo.audioSampleRate !== undefined) {\n result.audioSampleRate = mediaInfo.audioSampleRate\n }\n if (mediaInfo.audioChannelCount !== undefined) {\n result.audioChannelCount = mediaInfo.audioChannelCount\n }\n return result\n}\n\nexport function coreErrorToPlayerError(error: CoreError): PlayerError {\n return {\n kind: coreErrorKind(error.code),\n code: `RIVMUX_CORE_${coreErrorCodeLabel(error.code)}`,\n message: error.message,\n terminal: true,\n }\n}\n\nexport function coreWarningToPlayerWarning(warning: CoreWarning): PlayerWarning {\n return {\n code: warning.code,\n message: warning.message,\n }\n}\n\nfunction normalizeCoreEvent(value: unknown): CoreEvent {\n if (!isRecord(value) || typeof value.type !== 'string') {\n throw new TypeError('Transmux core event is missing a string type.')\n }\n\n const data = value.data\n switch (value.type) {\n case 'probeResult':\n return { type: 'probeResult', data: normalizeProbeResult(data) }\n case 'mediaInfo':\n return { type: 'mediaInfo', data: normalizeMediaInfo(data) }\n case 'initSegment':\n return { type: 'initSegment', data: normalizeInitSegment(data) }\n case 'mediaSegment':\n return { type: 'mediaSegment', data: normalizeMediaSegment(data) }\n case 'trackConfig':\n case 'sample':\n case 'metadata':\n case 'discontinuity':\n return { type: value.type, data }\n case 'warning':\n return { type: 'warning', data: normalizeWarning(data) }\n case 'fatalError':\n return { type: 'fatalError', data: normalizeError(data) }\n default:\n throw new TypeError(`Unsupported transmux core event type: ${value.type}.`)\n }\n}\n\nfunction normalizeInitSegment(value: unknown): CoreInitSegment {\n if (!isRecord(value)) {\n throw new TypeError('Transmux core initSegment event payload must be an object.')\n }\n\n const track = normalizeTrackKind(value.track)\n const codec = normalizeRequiredPrimitive(value.codec, 'string', 'initSegment codec')\n const timescale = normalizeRequiredPrimitive(value.timescale, 'number', 'initSegment timescale')\n const bytes = normalizeBytes(value.bytes, 'initSegment bytes')\n\n return { track, codec, timescale, bytes }\n}\n\nfunction normalizeMediaSegment(value: unknown): CoreMediaSegment {\n if (!isRecord(value)) {\n throw new TypeError('Transmux core mediaSegment event payload must be an object.')\n }\n\n const track = normalizeTrackKind(value.track)\n const dtsStartMs = normalizeRequiredPrimitive(value.dtsStartMs, 'number', 'mediaSegment dtsStartMs')\n const dtsEndMs = normalizeRequiredPrimitive(value.dtsEndMs, 'number', 'mediaSegment dtsEndMs')\n const keyframe = normalizeRequiredPrimitive(value.keyframe, 'boolean', 'mediaSegment keyframe')\n const bytes = normalizeBytes(value.bytes, 'mediaSegment bytes')\n\n return { track, dtsStartMs, dtsEndMs, keyframe, bytes }\n}\n\nfunction normalizeProbeResult(value: unknown): CoreProbeResult {\n if (!isRecord(value) || (value.container !== 'flv' && value.container !== 'mpegts')) {\n throw new TypeError('Transmux core probe result has an unsupported container.')\n }\n\n const result: CoreProbeResult = {\n container: value.container,\n }\n const video = normalizeOptionalString(value.video, ['avc', 'hevc', 'av1'])\n const audio = normalizeOptionalString(value.audio, ['aac', 'mp3', 'ac3', 'eac3', 'opus'])\n if (video !== undefined) {\n result.video = video\n }\n if (audio !== undefined) {\n result.audio = audio\n }\n return result\n}\n\nfunction normalizeMediaInfo(value: unknown): CoreMediaInfo {\n if (!isRecord(value)) {\n throw new TypeError('Transmux core mediaInfo event payload must be an object.')\n }\n\n const result: CoreMediaInfo = {\n ...normalizeProbeResult(value),\n }\n const videoCodec = normalizeOptionalPrimitive(value.videoCodec, 'string')\n const audioCodec = normalizeOptionalPrimitive(value.audioCodec, 'string')\n const width = normalizeOptionalPrimitive(value.width, 'number')\n const height = normalizeOptionalPrimitive(value.height, 'number')\n const audioSampleRate = normalizeOptionalPrimitive(value.audioSampleRate, 'number')\n const audioChannelCount = normalizeOptionalPrimitive(value.audioChannelCount, 'number')\n if (videoCodec !== undefined) {\n result.videoCodec = videoCodec\n }\n if (audioCodec !== undefined) {\n result.audioCodec = audioCodec\n }\n if (width !== undefined) {\n result.width = width\n }\n if (height !== undefined) {\n result.height = height\n }\n if (audioSampleRate !== undefined) {\n result.audioSampleRate = audioSampleRate\n }\n if (audioChannelCount !== undefined) {\n result.audioChannelCount = audioChannelCount\n }\n return result\n}\n\nfunction normalizeWarning(value: unknown): CoreWarning {\n if (!isRecord(value) || typeof value.code !== 'string' || typeof value.message !== 'string') {\n throw new TypeError('Transmux core warning payload must include code and message.')\n }\n\n return {\n code: value.code,\n message: value.message,\n }\n}\n\nfunction normalizeError(value: unknown): CoreError {\n if (!isRecord(value) || typeof value.code !== 'string' || typeof value.message !== 'string') {\n throw new TypeError('Transmux core error payload must include code and message.')\n }\n\n return {\n code: normalizeCoreErrorCode(value.code),\n message: value.message,\n }\n}\n\nfunction normalizeCoreErrorCode(code: string): CoreErrorCode {\n const codes = [\n 'unsupportedContainer',\n 'unsupportedVideoCodec',\n 'unsupportedAudioCodec',\n 'invalidContainerData',\n 'invalidCodecConfig',\n 'invalidTimestamp',\n 'muxerError',\n 'internalError',\n ] as const\n\n if (!codes.includes(code as CoreErrorCode)) {\n throw new TypeError(`Unsupported transmux core error code: ${code}.`)\n }\n\n return code as CoreErrorCode\n}\n\nfunction coreErrorKind(code: CoreErrorCode): PlayerError['kind'] {\n switch (code) {\n case 'unsupportedContainer':\n case 'unsupportedVideoCodec':\n case 'unsupportedAudioCodec':\n return 'unsupported'\n case 'invalidContainerData':\n return 'demux'\n case 'invalidCodecConfig':\n return 'codec'\n case 'invalidTimestamp':\n return 'demux'\n case 'muxerError':\n return 'mux'\n case 'internalError':\n return 'runtime'\n }\n}\n\nfunction coreErrorCodeLabel(code: CoreErrorCode): string {\n return code.replace(/[A-Z]/g, (letter) => `_${letter}`).toUpperCase()\n}\n\nfunction normalizeOptionalString<const T extends string>(value: unknown, allowed: readonly T[]): T | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n\n if (typeof value === 'string' && allowed.includes(value as T)) {\n return value as T\n }\n\n throw new TypeError(`Unexpected transmux core enum value: ${String(value)}.`)\n}\n\nfunction normalizeOptionalPrimitive<T extends 'string' | 'number'>(value: unknown, expectedType: T): (T extends 'string' ? string : number) | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n\n if (typeof value === expectedType) {\n return value as T extends 'string' ? string : number\n }\n\n throw new TypeError(`Expected optional ${expectedType}, received ${typeof value}.`)\n}\n\nfunction normalizeRequiredPrimitive<T extends 'string' | 'number' | 'boolean'>(\n value: unknown,\n expectedType: T,\n field: string\n): T extends 'string' ? string : T extends 'number' ? number : boolean {\n if (typeof value !== expectedType) {\n throw new TypeError(`Expected ${field} to be ${expectedType}, received ${typeof value}.`)\n }\n\n return value as T extends 'string' ? string : T extends 'number' ? number : boolean\n}\n\nfunction normalizeTrackKind(value: unknown): CoreTrackKind {\n if (value === 'video' || value === 'audio' || value === 'muxed') {\n return value\n }\n\n throw new TypeError(`Unsupported transmux core track kind: ${String(value)}.`)\n}\n\nfunction normalizeBytes(value: unknown, field: string): Uint8Array {\n if (value instanceof Uint8Array) {\n return value\n }\n\n if (Array.isArray(value) && value.every((entry) => Number.isInteger(entry) && entry >= 0 && entry <= 255)) {\n return new Uint8Array(value)\n }\n\n throw new TypeError(`Expected ${field} to be Uint8Array-compatible bytes.`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","/* @ts-self-types=\"./rivmux_transmux_core.d.ts\" */\n\nexport class TransmuxCore {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n TransmuxCoreFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_transmuxcore_free(ptr, 0);\n }\n destroy() {\n wasm.transmuxcore_destroy(this.__wbg_ptr);\n }\n /**\n * @returns {any}\n */\n flush() {\n const ret = wasm.transmuxcore_flush(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n constructor() {\n const ret = wasm.transmuxcore_new();\n this.__wbg_ptr = ret;\n TransmuxCoreFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {Uint8Array} data\n * @returns {any}\n */\n pushChunk(data) {\n const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.transmuxcore_pushChunk(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n reset() {\n wasm.transmuxcore_reset(this.__wbg_ptr);\n }\n}\nif (Symbol.dispose) TransmuxCore.prototype[Symbol.dispose] = TransmuxCore.prototype.free;\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_67e7344beaa85059: function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_Number_c54e7112a3fa7e3e: function(arg0) {\n const ret = Number(arg0);\n return ret;\n },\n __wbg_String_8564e559799eccda: function(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_throw_5d9e815e6fdf150f: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_new_bebc3f4757acf305: function() {\n const ret = new Object();\n return ret;\n },\n __wbg_new_ffa92086ea89f79c: function() {\n const ret = new Array();\n return ret;\n },\n __wbg_set_13d25b81ab403f5e: function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n },\n __wbg_set_6be42768c690e380: function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n },\n __wbindgen_generic_0000000000000001: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_generic_0000000000000002: function(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_generic_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n },\n };\n return {\n __proto__: null,\n \"./rivmux_transmux_core_bg.js\": import0,\n };\n}\n\nconst TransmuxCoreFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_transmuxcore_free(ptr, 1));\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasmInstance, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasmInstance = instance;\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n wasm.__wbindgen_start();\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (!module.ok) {\n throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);\n }\n\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (module_or_path === undefined) {\n module_or_path = new URL('rivmux_transmux_core_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","import { WasmTransmuxCoreHost } from './rivmux-transmux-wasm'\nimport initBundledTransmuxCore, { TransmuxCore as BundledTransmuxCore } from '@rivmux/transmux-core'\n\nimport type { TransmuxCoreHost, TransmuxCoreWasmConstructor } from './rivmux-transmux-wasm'\n\nexport function createWasmTransmuxCoreHost(Core: TransmuxCoreWasmConstructor | undefined): TransmuxCoreHost {\n if (Core === undefined) {\n throw new TypeError('WASM transmux core constructor is not available.')\n }\n\n return new WasmTransmuxCoreHost(Core)\n}\n\nexport async function loadWasmTransmuxCoreHost(wasmUrl: string | undefined): Promise<TransmuxCoreHost> {\n const source = wasmUrl ?? new URL('./rivmux-transmux-core.wasm', import.meta.url)\n await initBundledTransmuxCore(source)\n return createWasmTransmuxCoreHost(BundledTransmuxCore)\n}\n","import type { CoreMediaSegment } from '../wasm/rivmux-transmux-wasm'\n\ntype Track = CoreMediaSegment['track']\n\ntype PendingBatch = {\n readonly track: Track\n readonly dtsStartMs: number\n dtsEndMs: number\n readonly keyframe: boolean\n readonly parts: Uint8Array[]\n byteLength: number\n}\n\nexport type Fmp4AppendBatcherOptions = {\n maxDurationMs?: number\n maxBytes?: number\n}\n\nexport const DEFAULT_FMP4_APPEND_BATCH_DURATION_MS = 125\nexport const DEFAULT_FMP4_APPEND_BATCH_MAX_BYTES = 512 * 1024\n\nexport class Fmp4AppendBatcher {\n private readonly pending = new Map<Track, PendingBatch>()\n private readonly timers = new Map<Track, ReturnType<typeof setTimeout>>()\n private readonly maxDurationMs: number\n private readonly maxBytes: number\n private readonly onFlushDue: (track: Track) => void\n\n constructor(onFlushDue: (track: Track) => void, options: Fmp4AppendBatcherOptions = {}) {\n this.onFlushDue = onFlushDue\n this.maxDurationMs = options.maxDurationMs ?? DEFAULT_FMP4_APPEND_BATCH_DURATION_MS\n this.maxBytes = options.maxBytes ?? DEFAULT_FMP4_APPEND_BATCH_MAX_BYTES\n }\n\n push(segment: CoreMediaSegment): CoreMediaSegment | undefined {\n let batch = this.pending.get(segment.track)\n if (batch !== undefined && this.wouldExceedLimit(batch, segment)) {\n const flushed = this.flush(segment.track)\n batch = this.createBatch(segment)\n this.pending.set(segment.track, batch)\n this.scheduleFlush(segment.track)\n return flushed\n }\n\n if (batch === undefined) {\n batch = this.createBatch(segment)\n this.pending.set(segment.track, batch)\n this.scheduleFlush(segment.track)\n } else {\n batch.dtsEndMs = Math.max(batch.dtsEndMs, segment.dtsEndMs)\n batch.parts.push(segment.bytes)\n batch.byteLength += segment.bytes.byteLength\n }\n\n return batch.byteLength >= this.maxBytes ? this.flush(segment.track) : undefined\n }\n\n flush(track: Track): CoreMediaSegment | undefined {\n const batch = this.pending.get(track)\n if (batch === undefined) {\n return undefined\n }\n\n this.pending.delete(track)\n this.cancelFlush(track)\n return {\n track,\n dtsStartMs: batch.dtsStartMs,\n dtsEndMs: batch.dtsEndMs,\n keyframe: batch.keyframe,\n bytes: mergeBytes(batch.parts, batch.byteLength),\n }\n }\n\n flushAll(): CoreMediaSegment[] {\n const batches: CoreMediaSegment[] = []\n for (const track of [...this.pending.keys()]) {\n const batch = this.flush(track)\n if (batch !== undefined) {\n batches.push(batch)\n }\n }\n return batches\n }\n\n discard(): void {\n this.pending.clear()\n for (const timer of this.timers.values()) {\n clearTimeout(timer)\n }\n this.timers.clear()\n }\n\n private createBatch(segment: CoreMediaSegment): PendingBatch {\n return {\n track: segment.track,\n dtsStartMs: segment.dtsStartMs,\n dtsEndMs: segment.dtsEndMs,\n keyframe: segment.keyframe,\n parts: [segment.bytes],\n byteLength: segment.bytes.byteLength,\n }\n }\n\n private wouldExceedLimit(batch: PendingBatch, segment: CoreMediaSegment): boolean {\n const durationMs = Math.max(batch.dtsEndMs, segment.dtsEndMs) - batch.dtsStartMs\n return durationMs > this.maxDurationMs || batch.byteLength + segment.bytes.byteLength > this.maxBytes\n }\n\n private scheduleFlush(track: Track): void {\n this.timers.set(\n track,\n setTimeout(() => {\n this.timers.delete(track)\n this.onFlushDue(track)\n }, this.maxDurationMs)\n )\n }\n\n private cancelFlush(track: Track): void {\n const timer = this.timers.get(track)\n if (timer !== undefined) {\n clearTimeout(timer)\n this.timers.delete(track)\n }\n }\n}\n\nfunction mergeBytes(parts: readonly Uint8Array[], byteLength: number): Uint8Array {\n const bytes = new Uint8Array(byteLength)\n let offset = 0\n for (const part of parts) {\n bytes.set(part, offset)\n offset += part.byteLength\n }\n return bytes\n}\n","import { Fmp4AppendBatcher } from '../mse/fmp4-append-batcher'\n\nimport type { LifecycleCommandContext } from './lifecycle'\nimport type { CoreEvent } from '../wasm/rivmux-transmux-wasm'\n\ntype MediaSegment = Extract<CoreEvent, { type: 'mediaSegment' }>['data']\ntype MediaTrack = MediaSegment['track']\n\nexport type RuntimeAppendControllerDependencies = {\n appendToMse: (segment: MediaSegment, context: LifecycleCommandContext) => Promise<boolean>\n isStarted: () => boolean\n isLifecycleContextCurrent: (context: LifecycleCommandContext) => boolean\n onAppended: (segment: MediaSegment, context: LifecycleCommandContext) => Promise<void>\n onError: (cause: unknown, context: LifecycleCommandContext) => void\n}\n\n/** Owns fMP4 batching and serialized MSE media-segment appends. */\nexport class RuntimeAppendController {\n private readonly dependencies: RuntimeAppendControllerDependencies\n private batcher?: Fmp4AppendBatcher\n private generation = 0\n private tail: Promise<boolean> = Promise.resolve(true)\n\n constructor(dependencies: RuntimeAppendControllerDependencies) {\n this.dependencies = dependencies\n }\n\n start(context: LifecycleCommandContext): void {\n this.discard()\n this.batcher = new Fmp4AppendBatcher((track) => {\n const batch = this.batcher?.flush(track)\n if (batch !== undefined) {\n void this.enqueue(batch, context)\n }\n })\n }\n\n push(segment: MediaSegment, context: LifecycleCommandContext): Promise<boolean> | undefined {\n const batch = this.batcher?.push(segment)\n return batch === undefined ? undefined : this.enqueue(batch, context)\n }\n\n async flush(context: LifecycleCommandContext, track?: MediaTrack): Promise<boolean> {\n const batcher = this.batcher\n if (batcher === undefined) {\n return true\n }\n\n const batches = track === undefined ? batcher.flushAll() : [batcher.flush(track)].filter((batch): batch is NonNullable<typeof batch> => batch !== undefined)\n for (const batch of batches) {\n if (!(await this.enqueue(batch, context))) {\n return false\n }\n }\n return true\n }\n\n async waitForTail(): Promise<boolean> {\n return this.tail\n }\n\n discard(): void {\n this.generation += 1\n this.batcher?.discard()\n this.batcher = undefined\n this.tail = Promise.resolve(true)\n }\n\n private enqueue(segment: MediaSegment, context: LifecycleCommandContext): Promise<boolean> {\n const generation = this.generation\n const append = this.tail.then(async (previousAppendSucceeded) => {\n if (\n !previousAppendSucceeded ||\n generation !== this.generation ||\n !this.dependencies.isStarted() ||\n !this.dependencies.isLifecycleContextCurrent(context)\n ) {\n return false\n }\n\n if (!(await this.dependencies.appendToMse(segment, context))) {\n return false\n }\n\n if (!this.dependencies.isLifecycleContextCurrent(context)) {\n return false\n }\n await this.dependencies.onAppended(segment, context)\n return true\n })\n this.tail = append.catch((cause) => {\n if (this.dependencies.isLifecycleContextCurrent(context)) {\n this.dependencies.onError(cause, context)\n }\n return false\n })\n return this.tail\n }\n}\n","import { HttpFlvLoader, HttpFlvLoaderError, isAbortLikeError } from '../loader/http-flv-loader'\nimport { isRecoverableLoaderError } from '../loader/retry-policy'\nimport { MseController } from '../mse/mse-controller'\nimport { MseUnsupportedMimeError } from '../mse/mime'\nimport { loadWasmTransmuxCoreHost } from '../wasm/wasm-loader'\nimport { coreErrorToPlayerError, coreMediaInfoToPlayerMediaInfo, coreWarningToPlayerWarning } from '../wasm/rivmux-transmux-wasm'\nimport { RuntimeAppendController } from './append'\nimport { raceLifecycleOperation } from './lifecycle'\n\nimport type { BufferedRange } from '../latency/buffer-ranges'\nimport type { StreamLoader, StreamLoaderConfig, StreamLoaderStats } from '../loader/loader'\nimport type { NormalizedRivmuxPlayerOptions, PlayerError, WorkerMessage } from '@rivmux/protocol'\nimport type { LifecycleCommandContext } from './lifecycle'\nimport type { CoreEvent, TransmuxCoreHost } from '../wasm/rivmux-transmux-wasm'\nimport type { RuntimeMseStatsSnapshot } from './stats'\nimport type { RuntimeMseController, RuntimeWorkerDependencies } from './types'\n\ntype RuntimeSessionMessage = Extract<WorkerMessage, { type: 'media-info' | 'warning' }>\n\nexport type RuntimeSessionDependencies = Pick<RuntimeWorkerDependencies, 'createMseController' | 'createLoader' | 'createTransmuxCore'> & {\n isStarted: () => boolean\n isLifecycleContextCurrent: (context: LifecycleCommandContext) => boolean\n onMediaAppended: (context: LifecycleCommandContext) => Promise<void>\n onAppendError: (cause: unknown, context: LifecycleCommandContext) => void\n onLoaderClosing: () => void\n onStats: (stats?: StreamLoaderStats) => void\n onMessage: (message: RuntimeSessionMessage) => void\n onRecoverableFailure: (cause: HttpFlvLoaderError, context: LifecycleCommandContext) => void\n onFailure: (kind: PlayerError['kind'], code: string, message: string, cause?: unknown) => void\n onPlayerError: (error: PlayerError) => void\n applyLatencyPolicy: (context: LifecycleCommandContext) => Promise<void>\n quotaCleanupCutoff: () => number | undefined\n}\n\n/** Owns all resources that exist only for an attached playback session. */\nexport class RuntimeSession {\n private readonly dependencies: RuntimeSessionDependencies\n private readonly createMseController: () => RuntimeMseController\n private readonly createLoader: (config: StreamLoaderConfig) => StreamLoader\n private readonly createTransmuxCore: (options: NormalizedRivmuxPlayerOptions) => TransmuxCoreHost | undefined | Promise<TransmuxCoreHost | undefined>\n private readonly isStarted: () => boolean\n private readonly isLifecycleContextCurrent: (context: LifecycleCommandContext) => boolean\n private mse?: RuntimeMseController\n private loader?: StreamLoader\n private transmuxCore?: TransmuxCoreHost\n private loaderRunId = 0\n private loaderClosePromise?: Promise<void>\n private outputBytes = 0\n private readonly appendController: RuntimeAppendController\n\n constructor(dependencies: RuntimeSessionDependencies) {\n this.dependencies = dependencies\n this.createMseController = dependencies.createMseController ?? (() => new MseController())\n this.createLoader = dependencies.createLoader ?? ((config) => new HttpFlvLoader(config))\n this.createTransmuxCore = dependencies.createTransmuxCore ?? ((options) => loadWasmTransmuxCoreHost(options.runtime.wasmUrl))\n this.isStarted = dependencies.isStarted\n this.isLifecycleContextCurrent = dependencies.isLifecycleContextCurrent\n this.appendController = new RuntimeAppendController({\n appendToMse: (segment, context) => this.appendToMse(context, () => this.mse?.appendMediaSegment(segment)),\n isStarted: dependencies.isStarted,\n isLifecycleContextCurrent: dependencies.isLifecycleContextCurrent,\n onAppended: async (segment, context) => {\n if (!this.isLifecycleContextCurrent(context)) {\n return\n }\n this.outputBytes += segment.bytes.byteLength\n await dependencies.onMediaAppended(context)\n },\n onError: dependencies.onAppendError,\n })\n }\n\n get hasMse(): boolean {\n return this.mse !== undefined\n }\n\n get loaderStats(): StreamLoaderStats | undefined {\n return this.loader?.stats\n }\n\n get loaderPaused(): boolean {\n return this.loader?.paused ?? false\n }\n\n get bufferedRanges(): BufferedRange[] {\n return this.mse?.bufferedRanges ?? []\n }\n\n get emittedBytes(): number {\n return this.outputBytes\n }\n\n async attach(context: LifecycleCommandContext): Promise<MediaSourceHandle | undefined> {\n this.mse ??= this.createMseController()\n const attachment = await raceLifecycleOperation(this.mse.createMediaSourceHandle(), context.signal)\n if (attachment.cancelled || !this.isLifecycleContextCurrent(context)) {\n return undefined\n }\n return attachment.value\n }\n\n async createCore(options: NormalizedRivmuxPlayerOptions, context: LifecycleCommandContext): Promise<TransmuxCoreHost | undefined> {\n const creation = await raceLifecycleOperation(Promise.resolve(this.createTransmuxCore(options)), context.signal, (lateCore) => lateCore?.destroy())\n if (creation.cancelled || !this.isLifecycleContextCurrent(context)) {\n return undefined\n }\n return creation.value\n }\n\n start(core: TransmuxCoreHost, context: LifecycleCommandContext): void {\n this.transmuxCore?.destroy()\n this.transmuxCore = core\n this.outputBytes = 0\n this.appendController.start(context)\n }\n\n runLoader(config: StreamLoaderConfig, context: LifecycleCommandContext): void {\n const { loader, runId } = this.startLoader(config)\n void this.consumeLoader(loader, runId, context)\n }\n\n async close(): Promise<void> {\n this.dependencies.onLoaderClosing()\n this.appendController.discard()\n this.transmuxCore?.destroy()\n this.transmuxCore = undefined\n const loader = this.loader\n if (loader === undefined) {\n await this.loaderClosePromise\n return\n }\n\n this.loader = undefined\n this.loaderRunId += 1\n await this.closeLoaderInstance(loader)\n }\n\n destroyMse(): void {\n this.mse?.destroy()\n this.mse = undefined\n }\n\n discardAppend(): void {\n this.appendController.discard()\n }\n\n collectMseStats(): RuntimeMseStatsSnapshot {\n return {\n appendQueueLength: this.mse?.appendQueueLength ?? 0,\n appendQueueBytes: this.mse?.appendQueueBytes ?? 0,\n sourceBufferUpdating: this.mse?.sourceBufferUpdating ?? false,\n sourceBufferCount: this.mse?.sourceBufferCount ?? 0,\n bufferedRangeCount: this.mse?.bufferedRangeCount ?? 0,\n bufferedStart: this.mse?.bufferedStart,\n bufferedEnd: this.mse?.bufferedEnd,\n bufferedDuration: this.mse?.bufferedDuration,\n }\n }\n\n cleanupBefore(cutoff: number, force = false): Promise<void> | undefined {\n return this.mse?.cleanupBefore(cutoff, force ? { force: true } : undefined)\n }\n\n pauseLoader(): void {\n this.loader?.pause()\n }\n\n resumeLoader(): void {\n this.loader?.resume()\n }\n\n private startLoader(config: StreamLoaderConfig): { loader: StreamLoader; runId: number } {\n const loader = this.createLoader(config)\n const runId = this.loaderRunId + 1\n this.loaderRunId = runId\n this.loader = loader\n return { loader, runId }\n }\n\n private pushChunk(bytes: Uint8Array): CoreEvent[] {\n return this.transmuxCore?.pushChunk(bytes) ?? []\n }\n\n private isCurrentLoader(loader: StreamLoader, runId: number): boolean {\n return this.loader === loader && this.loaderRunId === runId && this.isStarted()\n }\n\n private async closeCurrentLoader(loader: StreamLoader, runId: number): Promise<void> {\n if (this.loader !== loader || this.loaderRunId !== runId) {\n return\n }\n\n this.dependencies.onLoaderClosing()\n this.appendController.discard()\n this.loader = undefined\n this.loaderRunId += 1\n this.transmuxCore?.destroy()\n this.transmuxCore = undefined\n await this.closeLoaderInstance(loader)\n }\n\n private async closeLoaderInstance(loader: StreamLoader): Promise<void> {\n let closing: Promise<void>\n try {\n closing = loader.close()\n } catch (cause) {\n closing = Promise.reject(cause)\n }\n this.loaderClosePromise = closing\n try {\n await closing\n } finally {\n if (this.loaderClosePromise === closing) {\n this.loaderClosePromise = undefined\n }\n }\n }\n\n private async consumeLoader(loader: StreamLoader, runId: number, context: LifecycleCommandContext): Promise<void> {\n try {\n await loader.open()\n\n while (this.isCurrentLoader(loader, runId) && this.isLifecycleContextCurrent(context)) {\n await this.dependencies.applyLatencyPolicy(context)\n if (!this.isCurrentLoader(loader, runId) || !this.isLifecycleContextCurrent(context)) {\n return\n }\n const chunk = await loader.read()\n if (chunk === null) {\n if (this.isCurrentLoader(loader, runId) && this.isLifecycleContextCurrent(context)) {\n if (!(await this.appendController.flush(context))) {\n return\n }\n this.dependencies.onStats(loader.stats)\n }\n return\n }\n if (!this.isCurrentLoader(loader, runId) || !this.isLifecycleContextCurrent(context)) {\n return\n }\n\n this.dependencies.onStats(loader.stats)\n if (!(await this.processEvents(this.pushChunk(chunk.bytes), context))) {\n await this.closeCurrentLoader(loader, runId)\n return\n }\n await this.dependencies.applyLatencyPolicy(context)\n if (!this.isCurrentLoader(loader, runId) || !this.isLifecycleContextCurrent(context)) {\n return\n }\n this.dependencies.onStats(loader.stats)\n }\n } catch (cause) {\n if (!this.isCurrentLoader(loader, runId) || isAbortLikeError(cause)) {\n return\n }\n\n try {\n await this.closeCurrentLoader(loader, runId)\n } catch {\n // Preserve the original loader failure; cleanup failure is secondary here.\n }\n if (!this.isLifecycleContextCurrent(context)) {\n return\n }\n if (isRecoverableLoaderError(cause)) {\n this.dependencies.onRecoverableFailure(cause, context)\n return\n }\n const code = cause instanceof HttpFlvLoaderError ? cause.code : 'RIVMUX_HTTP_LOADER_FAILED'\n this.dependencies.onFailure('network', code, 'HTTP Fetch loader failed.', cause)\n } finally {\n if (this.isCurrentLoader(loader, runId)) {\n try {\n await this.closeCurrentLoader(loader, runId)\n } catch (cause) {\n if (this.isLifecycleContextCurrent(context)) {\n this.dependencies.onFailure('network', 'RIVMUX_HTTP_LOADER_CLOSE_FAILED', 'HTTP Fetch loader failed to close.', cause)\n }\n }\n }\n }\n }\n\n private async processEvents(events: CoreEvent[], context: LifecycleCommandContext): Promise<boolean> {\n for (const event of events) {\n if (!this.isLifecycleContextCurrent(context)) {\n return false\n }\n switch (event.type) {\n case 'mediaInfo':\n this.dependencies.onMessage({ type: 'media-info', mediaInfo: coreMediaInfoToPlayerMediaInfo(event.data) })\n break\n case 'warning':\n this.dependencies.onMessage({ type: 'warning', warning: coreWarningToPlayerWarning(event.data) })\n break\n case 'fatalError':\n this.dependencies.onPlayerError(coreErrorToPlayerError(event.data))\n return false\n case 'initSegment':\n if (!(await this.appendController.flush(context))) {\n return false\n }\n if (!(await this.appendToMse(context, () => this.mse?.appendInitSegment(event.data)))) {\n return false\n }\n if (!this.isLifecycleContextCurrent(context)) {\n return false\n }\n this.outputBytes += event.data.bytes.byteLength\n await this.dependencies.applyLatencyPolicy(context)\n break\n case 'mediaSegment': {\n const append = this.appendController.push(event.data, context)\n if (append !== undefined && !(await append)) {\n return false\n }\n break\n }\n case 'probeResult':\n case 'trackConfig':\n case 'sample':\n case 'metadata':\n case 'discontinuity':\n break\n }\n }\n\n return this.appendController.waitForTail()\n }\n\n private async appendToMse(context: LifecycleCommandContext, append: () => Promise<void> | undefined): Promise<boolean> {\n try {\n const result = await raceLifecycleOperation(Promise.resolve(append()), context.signal)\n if (result.cancelled || !this.isLifecycleContextCurrent(context)) {\n return false\n }\n return true\n } catch (cause) {\n if (!this.isLifecycleContextCurrent(context)) {\n return false\n }\n if (isQuotaExceededError(cause) && (await this.retryAppendAfterQuotaCleanup(context, append))) {\n return true\n }\n\n if (cause instanceof MseUnsupportedMimeError) {\n this.dependencies.onFailure('unsupported', 'RIVMUX_UNSUPPORTED_MSE_CODEC', cause.message, cause)\n return false\n }\n\n this.dependencies.onFailure('mse', 'RIVMUX_MSE_APPEND_FAILED', 'MSE append failed.', cause)\n return false\n }\n }\n\n private async retryAppendAfterQuotaCleanup(context: LifecycleCommandContext, append: () => Promise<void> | undefined): Promise<boolean> {\n const cutoff = this.dependencies.quotaCleanupCutoff()\n if (cutoff === undefined || cutoff <= 0) {\n return false\n }\n\n try {\n const cleanup = await raceLifecycleOperation(Promise.resolve(this.cleanupBefore(cutoff, true)), context.signal)\n if (cleanup.cancelled || !this.isLifecycleContextCurrent(context)) {\n return false\n }\n const retry = await raceLifecycleOperation(Promise.resolve(append()), context.signal)\n if (retry.cancelled || !this.isLifecycleContextCurrent(context)) {\n return false\n }\n this.dependencies.onMessage({\n type: 'warning',\n warning: {\n code: 'RIVMUX_MSE_QUOTA_RETRY',\n message: 'MSE quota was exceeded; old buffered ranges were cleaned before retrying append.',\n },\n })\n return true\n } catch {\n return false\n }\n }\n}\n\nfunction isQuotaExceededError(cause: unknown): boolean {\n return typeof cause === 'object' && cause !== null && 'name' in cause && (cause as { name?: unknown }).name === 'QuotaExceededError'\n}\n","import { LatencyController } from '../latency/latency-controller'\nimport { getRetryDelayMs } from '../loader/retry-policy'\nimport { raceLifecycleOperation } from './lifecycle'\nimport { createPlayerStats, updateAppendQueueHighWaterMark } from './stats'\nimport { RuntimeSession } from './session'\n\nimport type { LatencyMetrics } from '../latency/latency-controller'\nimport type { StreamLoaderStats } from '../loader/loader'\nimport type { HttpFlvLoaderError } from '../loader/http-flv-loader'\nimport type { NormalizedRivmuxPlayerOptions, PlayerError, RecoveryInfo, VideoElementState, WorkerCommand, WorkerMessage } from '@rivmux/protocol'\nimport type { LifecycleCommandContext } from './lifecycle'\nimport type { RuntimeState, RuntimeWorkerDependencies, RuntimeWorkerPort } from './types'\n\nexport type { RuntimeMseController, RuntimeWorkerDependencies, RuntimeWorkerPort } from './types'\n\nexport class RuntimeWorker {\n private readonly port: RuntimeWorkerPort\n private readonly detectRuntime: () => PlayerError | undefined\n private readonly now: () => number\n private readonly sleep: (delayMs: number, signal: AbortSignal) => Promise<void>\n private readonly random: () => number\n private state: RuntimeState = 'idle'\n private url?: string\n private options?: NormalizedRivmuxPlayerOptions\n private readonly session: RuntimeSession\n private latencyController?: LatencyController\n private videoState?: VideoElementState\n private lastLatencyMetrics: LatencyMetrics = {}\n private statsTimer?: ReturnType<typeof setInterval>\n private statsTickInFlight = false\n private appendQueueMaxLength = 0\n private appendQueueMaxBytes = 0\n private commandTail: Promise<void> = Promise.resolve()\n private lifecycleGeneration = 0\n private lifecycleAbortController = new AbortController()\n private fatalCleanupPromise: Promise<void> = Promise.resolve()\n private recoveryPromise?: Promise<void>\n private connectionAttempt = 1\n private recoveryStartedAt?: number\n private pendingRecovery?: RecoveryInfo\n\n constructor(port: RuntimeWorkerPort, dependencies: RuntimeWorkerDependencies = {}) {\n this.port = port\n this.detectRuntime = dependencies.detectRuntime ?? detectWorkerRuntime\n this.now = dependencies.now ?? (() => performance.now())\n this.sleep = dependencies.sleep ?? waitForDelay\n this.random = dependencies.random ?? Math.random\n this.session = new RuntimeSession({\n ...dependencies,\n isStarted: () => this.state === 'started',\n isLifecycleContextCurrent: (context) => this.isLifecycleContextCurrent(context),\n onMediaAppended: async (context) => {\n this.markRecovered(context)\n await this.applyLatencyPolicy(context)\n },\n onAppendError: (cause, context) => {\n if (this.isLifecycleContextCurrent(context)) {\n this.fail('mse', 'RIVMUX_MSE_APPEND_FAILED', 'MSE append failed.', true, cause)\n }\n },\n onLoaderClosing: () => this.stopStatsTimer(),\n onStats: (stats) => this.postStats(stats),\n onMessage: (message) => this.post(message),\n onRecoverableFailure: (cause, context) => this.scheduleRecovery(cause, context),\n onFailure: (kind, code, message, cause) => this.fail(kind, code, message, true, cause),\n onPlayerError: (error) => this.failWithError(error),\n applyLatencyPolicy: (context) => this.applyLatencyPolicy(context),\n quotaCleanupCutoff: () => this.quotaCleanupCutoff(),\n })\n }\n\n handleCommand(command: WorkerCommand): Promise<void> {\n if (command.type === 'stop' || command.type === 'destroy') {\n this.invalidateLifecycle()\n }\n\n const context = {\n generation: this.lifecycleGeneration,\n signal: this.lifecycleAbortController.signal,\n }\n const handling = this.commandTail.then(() => this.executeCommand(command, context))\n this.commandTail = handling.catch(() => undefined)\n return handling\n }\n\n private async executeCommand(command: WorkerCommand, context: LifecycleCommandContext): Promise<void> {\n if (this.state === 'destroyed') {\n return\n }\n\n if ((command.type === 'attach-media-source' || command.type === 'start') && !this.isLifecycleContextCurrent(context)) {\n return\n }\n\n if (this.state === 'fatal-error') {\n if (command.type === 'stop') {\n this.post({ type: 'stopped' })\n }\n if (command.type !== 'destroy') {\n return\n }\n }\n\n try {\n switch (command.type) {\n case 'init':\n {\n const runtimeError = this.detectRuntime()\n if (runtimeError !== undefined) {\n this.failWithError(runtimeError)\n return\n }\n }\n this.url = command.url\n this.options = command.options\n this.latencyController = createLatencyController(command.options)\n this.state = 'ready'\n this.post({ type: 'ready' })\n return\n case 'attach-media-source':\n await this.attachMediaSource(context)\n return\n case 'start':\n await this.start(context)\n return\n case 'stop':\n await this.stop()\n return\n case 'video-state':\n this.videoState = command.state\n {\n const policy = await raceLifecycleOperation(this.applyLatencyPolicy(context), context.signal)\n if (!policy.cancelled && this.isLifecycleContextCurrent(context) && this.state === 'started') {\n this.postStats()\n }\n }\n return\n case 'playback-control-result':\n this.latencyController?.recordPlaybackControlResult(command.result)\n return\n case 'destroy':\n await this.destroy()\n return\n }\n } catch (cause) {\n this.fail('runtime', 'RIVMUX_WORKER_COMMAND_FAILED', 'Worker command failed.', true, cause)\n }\n }\n\n private async attachMediaSource(context: LifecycleCommandContext): Promise<void> {\n if (this.state === 'idle') {\n this.fail('runtime', 'RIVMUX_WORKER_NOT_INITIALIZED', 'Worker must be initialized before attach.', true)\n return\n }\n\n try {\n const handle = await this.session.attach(context)\n if (handle === undefined || context.generation !== this.lifecycleGeneration) {\n return\n }\n this.post({ type: 'media-source-handle', handle }, [handle])\n this.state = 'attached'\n } catch (cause) {\n if (context.generation !== this.lifecycleGeneration) {\n return\n }\n this.fail('mse', 'RIVMUX_MSE_ATTACH_FAILED', 'MSE media source attachment failed.', true, cause)\n }\n }\n\n private async start(context: LifecycleCommandContext): Promise<void> {\n const options = this.options\n if (!this.session.hasMse || options === undefined || this.state === 'idle' || this.state === 'ready') {\n this.fail('runtime', 'RIVMUX_WORKER_START_REQUIRES_ATTACH', 'Worker start requires an attached MediaSource.', true)\n return\n }\n\n if (this.state === 'started') {\n this.post({ type: 'started' })\n return\n }\n\n try {\n const transmuxCore = await this.session.createCore(options, context)\n if (context.generation !== this.lifecycleGeneration) {\n return\n }\n if (transmuxCore === undefined) {\n this.fail('runtime', 'RIVMUX_TRANSMUX_CORE_UNAVAILABLE', 'Transmux core is not available.', true)\n return\n }\n this.session.start(transmuxCore, context)\n } catch (cause) {\n if (context.generation !== this.lifecycleGeneration) {\n return\n }\n this.fail('runtime', 'RIVMUX_TRANSMUX_CORE_UNAVAILABLE', 'Transmux core is not available.', true, cause)\n return\n }\n\n this.state = 'started'\n this.appendQueueMaxLength = 0\n this.appendQueueMaxBytes = 0\n const initialPolicy = await raceLifecycleOperation(this.applyLatencyPolicy(context), context.signal)\n if (initialPolicy.cancelled || !this.isLifecycleContextCurrent(context)) {\n return\n }\n this.startStatsTimer()\n this.postStats()\n if (!this.startLoader(context)) {\n return\n }\n if (!this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n this.post({ type: 'started' })\n }\n\n private async stop(): Promise<void> {\n await this.waitForRecovery()\n await this.closeLoader()\n this.session.destroyMse()\n this.latencyController?.reset()\n this.videoState = undefined\n this.lastLatencyMetrics = {}\n this.resetRecoveryCycle()\n this.state = 'stopped'\n this.post({ type: 'stopped' })\n }\n\n private async destroy(): Promise<void> {\n await this.fatalCleanupPromise\n await this.waitForRecovery()\n await this.closeLoader()\n this.session.destroyMse()\n this.latencyController?.reset()\n this.videoState = undefined\n this.lastLatencyMetrics = {}\n this.resetRecoveryCycle()\n this.state = 'destroyed'\n this.post({ type: 'destroyed' })\n this.port.close()\n }\n\n private startLoader(context: LifecycleCommandContext): boolean {\n const options = this.options\n const url = this.url\n if (options === undefined || url === undefined) {\n this.fail('runtime', 'RIVMUX_WORKER_NOT_INITIALIZED', 'Worker must be initialized before loader start.', true)\n return false\n }\n\n this.session.runLoader(\n {\n url,\n network: options.network,\n },\n context\n )\n return true\n }\n\n private async closeLoader(): Promise<void> {\n this.stopStatsTimer()\n await this.session.close()\n }\n\n private scheduleRecovery(cause: HttpFlvLoaderError, context: LifecycleCommandContext): void {\n if (!this.isLifecycleContextCurrent(context) || this.state !== 'started' || this.recoveryPromise !== undefined) {\n return\n }\n\n const recovery = this.recover(cause, context).finally(() => {\n if (this.recoveryPromise === recovery) {\n this.recoveryPromise = undefined\n }\n })\n this.recoveryPromise = recovery\n }\n\n private async recover(cause: HttpFlvLoaderError, context: LifecycleCommandContext): Promise<void> {\n const options = this.options\n if (options === undefined || !this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n\n this.recoveryStartedAt ??= this.now()\n if (this.connectionAttempt >= options.network.retry.maxAttempts) {\n this.fail('network', 'RIVMUX_RECONNECT_EXHAUSTED', 'Live stream reconnect attempts were exhausted.', true, cause)\n return\n }\n\n const failedAttempt = this.connectionAttempt\n const attempt = failedAttempt + 1\n this.connectionAttempt = attempt\n const delayMs = getRetryDelayMs(options.network.retry, failedAttempt, this.random)\n this.post({\n type: 'reconnecting',\n info: {\n attempt,\n maxAttempts: options.network.retry.maxAttempts,\n delayMs,\n reason: cause.reason ?? 'network-error',\n },\n })\n\n await this.closeLoader()\n this.session.destroyMse()\n this.latencyController?.reset()\n this.lastLatencyMetrics = {}\n if (!this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n\n try {\n const delayed = await raceLifecycleOperation(this.sleep(delayMs, context.signal), context.signal)\n if (delayed.cancelled || !this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n } catch (delayError) {\n if (this.isLifecycleContextCurrent(context)) {\n this.fail('network', 'RIVMUX_RECONNECT_DELAY_FAILED', 'Live stream reconnect delay failed.', true, delayError)\n }\n return\n }\n\n let handle: MediaSourceHandle | undefined\n try {\n handle = await this.session.attach(context)\n } catch (attachError) {\n if (this.isLifecycleContextCurrent(context)) {\n this.fail('mse', 'RIVMUX_MSE_ATTACH_FAILED', 'MSE media source attachment failed during reconnect.', true, attachError)\n }\n return\n }\n if (handle === undefined || !this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n this.post({ type: 'media-source-handle', handle }, [handle])\n\n try {\n const core = await this.session.createCore(options, context)\n if (!this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n if (core === undefined) {\n this.fail('runtime', 'RIVMUX_TRANSMUX_CORE_UNAVAILABLE', 'Transmux core is not available during reconnect.', true)\n return\n }\n this.session.start(core, context)\n } catch (coreError) {\n if (this.isLifecycleContextCurrent(context)) {\n this.fail('runtime', 'RIVMUX_TRANSMUX_CORE_UNAVAILABLE', 'Transmux core is not available during reconnect.', true, coreError)\n }\n return\n }\n\n this.pendingRecovery = {\n attempt,\n downtimeMs: 0,\n }\n this.appendQueueMaxLength = 0\n this.appendQueueMaxBytes = 0\n this.startStatsTimer()\n this.postStats()\n this.recoveryPromise = undefined\n this.startLoader(context)\n }\n\n private markRecovered(context: LifecycleCommandContext): void {\n const recovery = this.pendingRecovery\n const startedAt = this.recoveryStartedAt\n if (recovery === undefined || startedAt === undefined || !this.isLifecycleContextCurrent(context) || this.state !== 'started') {\n return\n }\n\n this.pendingRecovery = undefined\n this.recoveryStartedAt = undefined\n this.connectionAttempt = 1\n this.post({\n type: 'recovered',\n info: {\n attempt: recovery.attempt,\n downtimeMs: Math.max(0, this.now() - startedAt),\n },\n })\n }\n\n private async waitForRecovery(): Promise<void> {\n try {\n await this.recoveryPromise\n } catch {\n // Recovery reports current lifecycle failures through the worker protocol.\n }\n }\n\n private resetRecoveryCycle(): void {\n this.connectionAttempt = 1\n this.recoveryStartedAt = undefined\n this.pendingRecovery = undefined\n }\n\n private postStats(loaderStats?: StreamLoaderStats): void {\n const mseStats = this.collectMseStats()\n const loaderSnapshot = loaderStats ?? this.session.loaderStats\n this.post({\n type: 'stats',\n stats: createPlayerStats({\n loaderStats: loaderSnapshot,\n mseStats,\n latencyMetrics: this.lastLatencyMetrics,\n outputBytes: this.session.emittedBytes,\n appendQueueMaxLength: this.appendQueueMaxLength,\n appendQueueMaxBytes: this.appendQueueMaxBytes,\n loaderPaused: this.session.loaderPaused,\n nowMs: this.now(),\n }),\n })\n }\n\n private collectMseStats() {\n const stats = this.session.collectMseStats()\n const highWaterMark = updateAppendQueueHighWaterMark({ length: this.appendQueueMaxLength, bytes: this.appendQueueMaxBytes }, stats)\n this.appendQueueMaxLength = highWaterMark.length\n this.appendQueueMaxBytes = highWaterMark.bytes\n\n return {\n ...stats,\n }\n }\n\n private quotaCleanupCutoff(): number | undefined {\n const backwardBuffer = this.options?.latency.backwardBuffer ?? 0\n const currentTime = this.videoState?.currentTime\n if (currentTime !== undefined && Number.isFinite(currentTime)) {\n return Math.max(0, currentTime - backwardBuffer)\n }\n\n const bufferedEnd = this.session.collectMseStats().bufferedEnd\n return bufferedEnd === undefined ? undefined : Math.max(0, bufferedEnd - backwardBuffer)\n }\n\n private async applyLatencyPolicy(context?: LifecycleCommandContext): Promise<void> {\n const latencyController = this.latencyController\n if (latencyController === undefined || !this.session.hasMse) {\n return\n }\n\n const evaluation = latencyController.evaluate({\n ranges: this.session.bufferedRanges,\n videoState: this.videoState,\n loaderPaused: this.session.loaderPaused,\n nowMs: this.now(),\n })\n this.lastLatencyMetrics = evaluation.metrics\n\n if (evaluation.cleanupBefore !== undefined) {\n await this.session.cleanupBefore(evaluation.cleanupBefore)\n }\n\n if (context !== undefined && !this.isLifecycleContextCurrent(context)) {\n return\n }\n\n if (evaluation.loaderCommand === 'pause') {\n this.session.pauseLoader()\n } else if (evaluation.loaderCommand === 'resume') {\n this.session.resumeLoader()\n }\n\n if (evaluation.playbackControl !== undefined) {\n this.post({ type: 'playback-control', action: evaluation.playbackControl })\n }\n }\n\n private startStatsTimer(): void {\n this.stopStatsTimer()\n const intervalMs = this.options?.diagnostics.statsIntervalMs\n if (intervalMs === undefined || intervalMs <= 0) {\n return\n }\n\n this.statsTimer = setInterval(() => {\n void this.emitStatsTick()\n }, intervalMs)\n }\n\n private stopStatsTimer(): void {\n if (this.statsTimer === undefined) {\n return\n }\n\n clearInterval(this.statsTimer)\n this.statsTimer = undefined\n this.statsTickInFlight = false\n }\n\n private async emitStatsTick(): Promise<void> {\n if (this.statsTickInFlight || this.state !== 'started') {\n return\n }\n\n this.statsTickInFlight = true\n const context = this.currentLifecycleContext()\n try {\n const policy = await raceLifecycleOperation(this.applyLatencyPolicy(context), context.signal)\n if (!policy.cancelled && this.isLifecycleContextCurrent(context) && this.state === 'started') {\n this.postStats()\n }\n } catch (cause) {\n if (!this.isLifecycleContextCurrent(context)) {\n return\n }\n this.fail('mse', 'RIVMUX_MSE_LATENCY_POLICY_FAILED', 'MSE latency policy failed.', true, cause)\n } finally {\n this.statsTickInFlight = false\n }\n }\n\n private currentLifecycleContext(): LifecycleCommandContext {\n return {\n generation: this.lifecycleGeneration,\n signal: this.lifecycleAbortController.signal,\n }\n }\n\n private isLifecycleContextCurrent(context: LifecycleCommandContext): boolean {\n return !context.signal.aborted && context.generation === this.lifecycleGeneration\n }\n\n private fail(kind: PlayerError['kind'], code: string, message: string, terminal: boolean, cause?: unknown): void {\n const error = cause === undefined ? { kind, code, message, terminal } : { kind, code, message, terminal, cause: serializeCause(cause) }\n this.failWithError(error)\n }\n\n private failWithError(error: PlayerError): void {\n if (this.state === 'destroyed') {\n return\n }\n if (error.terminal) {\n this.enterFatalErrorState()\n }\n this.post({ type: 'error', error })\n }\n\n private enterFatalErrorState(): void {\n if (this.state === 'fatal-error' || this.state === 'destroyed') {\n return\n }\n\n this.state = 'fatal-error'\n this.invalidateLifecycle()\n this.session.discardAppend()\n this.fatalCleanupPromise = this.closeLoader().catch(() => undefined)\n this.session.destroyMse()\n this.latencyController?.reset()\n this.videoState = undefined\n this.lastLatencyMetrics = {}\n this.resetRecoveryCycle()\n }\n\n private post(message: WorkerMessage, transfer?: Transferable[]): void {\n this.port.postMessage(message, transfer)\n }\n\n private invalidateLifecycle(): void {\n this.lifecycleGeneration += 1\n this.lifecycleAbortController.abort()\n this.lifecycleAbortController = new AbortController()\n }\n}\n\nfunction waitForDelay(delayMs: number, signal: AbortSignal): Promise<void> {\n if (delayMs <= 0) {\n return Promise.resolve()\n }\n if (signal.aborted) {\n return Promise.reject(new DOMException('Reconnect delay was aborted.', 'AbortError'))\n }\n\n return new Promise((resolve, reject) => {\n const cleanup = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n }\n const onAbort = (): void => {\n cleanup()\n reject(new DOMException('Reconnect delay was aborted.', 'AbortError'))\n }\n const timer = setTimeout(() => {\n cleanup()\n resolve()\n }, delayMs)\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction serializeCause(cause: unknown): { name: string; message: string } {\n if (cause instanceof Error) {\n return {\n name: cause.name,\n message: cause.message,\n }\n }\n\n if (typeof cause === 'object' && cause !== null) {\n const value = cause as { name?: unknown; message?: unknown }\n return {\n name: typeof value.name === 'string' ? value.name : 'Error',\n message: typeof value.message === 'string' ? value.message : String(cause),\n }\n }\n\n return { name: 'Error', message: String(cause) }\n}\n\nfunction detectWorkerRuntime(): PlayerError | undefined {\n if (typeof fetch !== 'function') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_FETCH', 'Fetch is not available in this worker runtime.')\n }\n\n if (typeof ReadableStream === 'undefined') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_READABLE_STREAM', 'ReadableStream is not available in this worker runtime.')\n }\n\n if (typeof WebAssembly === 'undefined') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_WASM', 'WebAssembly is not available in this worker runtime.')\n }\n\n if (typeof MediaSource === 'undefined') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_MSE', 'MediaSource is not available in this worker runtime.')\n }\n\n if (MediaSource.canConstructInDedicatedWorker !== true) {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_WORKER_MSE', 'MediaSource cannot be constructed in this worker runtime.')\n }\n\n if (typeof MediaSource.isTypeSupported !== 'function') {\n return createUnsupportedRuntimeError('RIVMUX_UNSUPPORTED_MSE_TYPE_CHECK', 'MediaSource.isTypeSupported is not available in this worker runtime.')\n }\n\n return undefined\n}\n\nfunction createUnsupportedRuntimeError(code: string, message: string): PlayerError {\n return { kind: 'unsupported', code, message, terminal: true }\n}\n\nfunction createLatencyController(options: NormalizedRivmuxPlayerOptions): LatencyController {\n return new LatencyController({\n latency: options.latency,\n playback: options.playback,\n })\n}\n","import { RuntimeWorker } from './runtime/index'\n\nimport type { WorkerCommand, WorkerMessage } from '@rivmux/protocol'\n\nexport { RuntimeWorker } from './runtime/index'\nexport { HttpFlvLoader, HttpFlvLoaderError } from './loader/http-flv-loader'\nexport { MseController } from './mse/mse-controller'\nexport { SourceBufferQueue } from './mse/source-buffer-queue'\nexport { isMseSupported } from './mse/mime'\nexport { WasmTransmuxCoreHost, normalizeCoreEvents } from './wasm/rivmux-transmux-wasm'\nexport { createWasmTransmuxCoreHost } from './wasm/wasm-loader'\nexport type { StreamChunk, StreamLoader, StreamLoaderConfig, StreamLoaderStats } from './loader/loader'\nexport type { CoreEvent, TransmuxCoreHost, TransmuxCoreWasmConstructor } from './wasm/rivmux-transmux-wasm'\n\ntype DedicatedWorkerScopeLike = {\n addEventListener(type: 'message', listener: (event: MessageEvent<WorkerCommand>) => void): void\n postMessage(message: WorkerMessage, transfer?: Transferable[]): void\n close(): void\n}\n\nexport function startRuntimeWorker(scope: DedicatedWorkerScopeLike): RuntimeWorker {\n const runtime = new RuntimeWorker({\n postMessage: (message, transfer) => scope.postMessage(message, transfer),\n close: () => scope.close(),\n })\n\n scope.addEventListener('message', (event) => {\n void runtime.handleCommand(event.data)\n })\n scope.postMessage({ type: 'worker-ready' })\n\n return runtime\n}\n\nconst globalScope = globalThis as typeof globalThis & Partial<DedicatedWorkerScopeLike>\nconst workerGlobalScope = (globalThis as typeof globalThis & { WorkerGlobalScope?: { new (): unknown } }).WorkerGlobalScope\n\nif (workerGlobalScope !== undefined && globalScope instanceof workerGlobalScope && typeof globalScope.postMessage === 'function') {\n startRuntimeWorker(globalScope as DedicatedWorkerScopeLike)\n}\n"],"mappings":"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"}