@rivmux/runtime-worker 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,7 +56,7 @@ type CoreError = {
56
56
  message: string;
57
57
  };
58
58
  type CoreProbeResult = {
59
- container: 'flv' | 'mpegTs';
59
+ container: 'flv' | 'mpegts';
60
60
  video?: 'avc' | 'hevc' | 'av1';
61
61
  audio?: 'aac' | 'mp3' | 'ac3' | 'eac3' | 'opus';
62
62
  };
@@ -149,6 +149,9 @@ declare class WasmTransmuxCoreHost implements TransmuxCoreHost {
149
149
  declare function normalizeCoreEvents(value: unknown): CoreEvent[];
150
150
  //#endregion
151
151
  //#region src/runtime.d.ts
152
+ type RuntimeMseCleanupOptions = {
153
+ force?: boolean;
154
+ };
152
155
  type RuntimeWorkerPort = {
153
156
  postMessage(message: WorkerMessage, transfer?: Transferable[]): void;
154
157
  close(): void;
@@ -171,13 +174,14 @@ type RuntimeMseController = {
171
174
  appendMediaSegment(segment: Extract<CoreEvent, {
172
175
  type: 'mediaSegment';
173
176
  }>['data']): Promise<void>;
174
- cleanupBefore(cutoff: number): Promise<void>;
177
+ cleanupBefore(cutoff: number, options?: RuntimeMseCleanupOptions): Promise<void>;
175
178
  destroy(): void;
176
179
  };
177
180
  type RuntimeWorkerDependencies = {
178
181
  createMseController?: () => RuntimeMseController;
179
182
  createLoader?: (config: StreamLoaderConfig) => StreamLoader;
180
183
  createTransmuxCore?: (options: NormalizedRivmuxPlayerOptions) => TransmuxCoreHost | undefined | Promise<TransmuxCoreHost | undefined>;
184
+ detectRuntime?: () => PlayerError | undefined;
181
185
  now?: () => number;
182
186
  };
183
187
  declare class RuntimeWorker {
@@ -185,6 +189,7 @@ declare class RuntimeWorker {
185
189
  private readonly createMseController;
186
190
  private readonly createLoader;
187
191
  private readonly createTransmuxCore;
192
+ private readonly detectRuntime;
188
193
  private readonly now;
189
194
  private state;
190
195
  private url?;
@@ -216,11 +221,15 @@ declare class RuntimeWorker {
216
221
  private processTransmuxEvents;
217
222
  private collectMseStats;
218
223
  private appendToMse;
224
+ private retryAppendAfterQuotaCleanup;
225
+ private quotaCleanupCutoff;
219
226
  private applyLatencyPolicy;
220
227
  private startStatsTimer;
221
228
  private stopStatsTimer;
222
229
  private emitStatsTick;
223
230
  private fail;
231
+ private failWithError;
232
+ private enterFatalErrorState;
224
233
  private post;
225
234
  }
226
235
  //#endregion
@@ -277,13 +286,16 @@ declare class MseController {
277
286
  appendFixture(fixture: M1StaticFmp4Fixture): Promise<void>;
278
287
  appendInitSegment(segment: CoreInitSegment): Promise<void>;
279
288
  appendMediaSegment(segment: CoreMediaSegment): Promise<void>;
280
- cleanupBefore(cutoff: number): Promise<void>;
289
+ cleanupBefore(cutoff: number, options?: MseCleanupOptions): Promise<void>;
281
290
  reset(): void;
282
291
  destroy(): void;
283
292
  private get primaryQueue();
284
293
  private requireMediaSource;
285
294
  private ensureQueue;
286
295
  }
296
+ type MseCleanupOptions = {
297
+ force?: boolean;
298
+ };
287
299
  //#endregion
288
300
  //#region src/mse/source-buffer-queue.d.ts
289
301
  declare class SourceBufferQueue {
@@ -1 +1 @@
1
- {"version":3,"file":"rivmux-runtime-worker.d.ts","names":[],"sources":["../src/fixtures/m1-static-fmp4.ts","../src/latency/buffer-ranges.ts","../src/loader/loader.ts","../src/wasm/rivmux-transmux-wasm.ts","../src/runtime.ts","../src/loader/http-flv-loader.ts","../src/mse/mse-controller.ts","../src/mse/source-buffer-queue.ts","../src/mse/mime.ts","../src/wasm/wasm-loader.ts","../src/worker-entry.ts"],"mappings":";;;KAAY,mBAAA;EACV,QAAA;EACA,KAAA;EACA,KAAA;EACA,MAAA;EACA,QAAA;EACA,WAAA,EAAa,WAAA;EACb,YAAA,EAAc,WAAW;AAAA;AAAA,cAGd,aAAA;AAAA,iBA4UG,yBAAA,IAA6B,mBAAmB;;;KCtVpD,aAAA;EACV,KAAA;EACA,GAAG;AAAA;;;KCAO,WAAA;EACV,KAAA,EAAO,UAAU;EACjB,YAAA;AAAA;AAAA,KAGU,iBAAA;EACV,aAAA;EACA,mBAAA;EACA,aAAA;EACA,WAAA;EACA,aAAA;AAAA;AAAA,KAGU,kBAAA;EACV,GAAA;EACA,OAAA,EAAS,wBAAA;EACT,KAAA,UAAe,KAAA;EACf,GAAA;EACA,KAAA,IAAS,EAAA,UAAY,MAAA,EAAQ,WAAA,KAAgB,OAAA;AAAA;AAAA,KAGnC,YAAA;EAAA,SACD,MAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA,EAAO,iBAAA;EAChB,IAAA,IAAQ,OAAA;EACR,IAAA,IAAQ,OAAA,CAAQ,WAAA;EAChB,KAAA;EACA,MAAA;EACA,KAAA,IAAS,OAAA;AAAA;;;KC7BC,aAAA;AAAA,KAUA,SAAA;EACV,IAAA,EAAM,aAAa;EACnB,OAAA;AAAA;AAAA,KAGU,eAAA;EACV,SAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,KAGU,aAAA;EACV,SAAA,EAAW,eAAA;EACX,KAAA,GAAQ,eAAA;EACR,KAAA,GAAQ,eAAA;EACR,UAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA;EACA,eAAA;EACA,iBAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAO;AAAA;AAAA,KAGG,aAAA;AAAA,KAEA,eAAA;EACV,KAAA,EAAO,aAAA;EACP,KAAA;EACA,SAAA;EACA,KAAA,EAAO,UAAU;AAAA;AAAA,KAGP,gBAAA;EACV,KAAA,EAAO,aAAA;EACP,UAAA;EACA,QAAA;EACA,QAAA;EACA,KAAA,EAAO,UAAU;AAAA;AAAA,KAGP,SAAA;EACN,IAAA;EAAqB,IAAA,EAAM,eAAA;AAAA;EAC3B,IAAA;EAAmB,IAAA,EAAM,aAAA;AAAA;EACzB,IAAA;EAAqB,IAAA,EAAM,eAAA;AAAA;EAC3B,IAAA;EAAsB,IAAA,EAAM,gBAAA;AAAA;EAC5B,IAAA;EAAqB,IAAA;AAAA;EACrB,IAAA;EAAqB,IAAA;AAAA;EACrB,IAAA;EAAqB,IAAA;AAAA;EACrB,IAAA;EAAqB,IAAA;AAAA;EACrB,IAAA;EAAkB,IAAA;AAAA;EAClB,IAAA;EAAiB,IAAA,EAAM,WAAA;AAAA;EACvB,IAAA;EAAoB,IAAA,EAAM,SAAA;AAAA;EAC1B,IAAA;EAAuB,IAAA;AAAA;AAAA,KAEjB,gBAAA;EACV,SAAA,CAAU,KAAA,EAAO,UAAA,GAAa,SAAA;EAC9B,KAAA,IAAS,SAAA;EACT,KAAA;EACA,OAAA;AAAA;AAAA,KAGU,2BAAA;EACV,SAAA,CAAU,KAAA,EAAO,UAAU;EAC3B,KAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,cAGW,oBAAA,YAAgC,gBAAA;EAAA,iBAC1B,IAAA;cAEL,IAAA,EAAM,2BAAA;EAIlB,SAAA,CAAU,KAAA,EAAO,UAAA,GAAa,SAAA;EAI9B,KAAA,IAAS,SAAA;EAIT,KAAA;EAIA,OAAA;AAAA;AAAA,iBAKc,mBAAA,CAAoB,KAAA,YAAiB,SAAS;;;KC9FlD,iBAAA;EACV,WAAA,CAAY,OAAA,EAAS,aAAA,EAAe,QAAA,GAAW,YAAY;EAC3D,KAAA;AAAA;AAAA,KAGU,oBAAA;EAAA,SACD,iBAAA;EAAA,SACA,gBAAA;EAAA,SACA,oBAAA;EAAA,SACA,iBAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;EAAA,SACA,gBAAA;EAAA,SACA,cAAA,EAAgB,aAAA;EAAA,SAChB,kBAAA;EACT,uBAAA,IAA2B,OAAA,CAAQ,iBAAA;EACnC,aAAA,CAAc,OAAA,EAAS,UAAA,QAAkB,yBAAA,IAA6B,OAAA;EACtE,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,SAAA;IAAa,IAAA;EAAA,aAAiC,OAAA;EACjF,kBAAA,CAAmB,OAAA,EAAS,OAAA,CAAQ,SAAA;IAAa,IAAA;EAAA,aAAkC,OAAA;EACnF,aAAA,CAAc,MAAA,WAAiB,OAAA;EAC/B,OAAA;AAAA;AAAA,KAGU,yBAAA;EACV,mBAAA,SAA4B,oBAAA;EAC5B,YAAA,IAAgB,MAAA,EAAQ,kBAAA,KAAuB,YAAA;EAC/C,kBAAA,IAAsB,OAAA,EAAS,6BAAA,KAAkC,gBAAA,eAA+B,OAAA,CAAQ,gBAAA;EACxG,GAAA;AAAA;AAAA,cAGW,aAAA;EAAA,iBACM,IAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,YAAA;EAAA,iBACA,kBAAA;EAAA,iBACA,GAAA;EAAA,QACT,KAAA;EAAA,QACA,GAAA;EAAA,QACA,OAAA;EAAA,QACA,GAAA;EAAA,QACA,MAAA;EAAA,QACA,YAAA;EAAA,QACA,iBAAA;EAAA,QACA,UAAA;EAAA,QACA,kBAAA;EAAA,QACA,UAAA;EAAA,QACA,iBAAA;EAAA,QACA,WAAA;EAAA,QACA,WAAA;EAAA,QACA,oBAAA;EAAA,QACA,mBAAA;cAEI,IAAA,EAAM,iBAAA,EAAmB,YAAA,GAAc,yBAAA;EAQ7C,aAAA,CAAc,OAAA,EAAS,aAAA,GAAgB,OAAA;EAAA,QA8C/B,iBAAA;EAAA,QAmBA,KAAA;EAAA,QA8CA,IAAA;EAAA,QAWA,OAAA;EAAA,QAYN,WAAA;EAAA,QAmBM,SAAA;EAAA,QAkCA,WAAA;EAAA,QAcA,kBAAA;EAAA,QAaN,eAAA;EAAA,QAIA,SAAA;EAAA,QA+BM,qBAAA;EAAA,QAyCN,eAAA;EAAA,QAqBM,WAAA;EAAA,QAUA,kBAAA;EAAA,QA+BN,eAAA;EAAA,QAYA,cAAA;EAAA,QAUM,aAAA;EAAA,QAgBN,IAAA;EAAA,QAQA,IAAA;AAAA;;;cCndG,kBAAA,SAA2B,KAAK;EAAA,SAClC,IAAA;EAAA,SACA,MAAA;cAEG,IAAA,UAAc,OAAA,UAAiB,MAAA;AAAA;AAAA,cAQhC,aAAA,YAAyB,YAAA;EAAA,iBACnB,GAAA;EAAA,iBACA,OAAA;EAAA,iBACA,WAAA;EAAA,iBACA,KAAA;EAAA,iBACA,SAAA;EAAA,iBACA,GAAA;EAAA,iBACA,KAAA;EAAA,QACT,eAAA;EAAA,QACA,MAAA;EAAA,QACA,KAAA;EAAA,QACA,WAAA;EAAA,QACA,aAAA;EAAA,iBACS,YAAA;cAKL,MAAA,EAAQ,kBAAA;EAAA,IAUhB,MAAA;EAAA,IAIA,MAAA;EAAA,IAIA,KAAA,IAAS,iBAAA;EAIP,IAAA,IAAQ,OAAA;EAwBR,IAAA,IAAQ,OAAA,CAAQ,WAAA;EAqCtB,KAAA;EAQA,MAAA;EASM,KAAA,IAAS,OAAA;EAAA,QAyBD,WAAA;EAAA,QAuCN,gBAAA;EAAA,QAUA,oBAAA;AAAA;;;cC3MG,aAAA;EAAA,QACH,WAAA;EAAA,iBACS,aAAA;EAAA,iBACA,MAAA;EAAA,QACT,iBAAA;EAAA,IAEJ,iBAAA;EAAA,IAIA,gBAAA;EAAA,IAIA,oBAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,aAAA;EAAA,IAIA,WAAA;EAAA,IAIA,gBAAA;EAAA,IAIA,cAAA,IAAkB,aAAA;EAAA,IAIlB,kBAAA;EAIE,uBAAA,IAA2B,OAAA,CAAQ,iBAAA;EAcnC,aAAA,CAAc,OAAA,EAAS,mBAAA,GAAsB,OAAA;EAc7C,iBAAA,CAAkB,OAAA,EAAS,eAAA,GAAkB,OAAA;EAU7C,kBAAA,CAAmB,OAAA,EAAS,gBAAA,GAAmB,OAAA;EAc/C,aAAA,CAAc,MAAA,WAAiB,OAAA;EASrC,KAAA;EAOA,OAAA;EAAA,YAoBY,YAAA;EAAA,QAIJ,kBAAA;EAAA,QAQA,WAAA;AAAA;;;cC/IG,iBAAA;EAAA,iBACM,YAAA;EAAA,iBACA,KAAA;EAAA,QACT,YAAA;EAAA,QACA,iBAAA;EAAA,QACA,SAAA;cAEI,YAAA,EAAc,YAAA;EAAA,IAItB,MAAA;EAAA,IAIA,WAAA;EAAA,IAIA,QAAA;EAAA,IAIA,cAAA,IAAkB,aAAA;EAAA,IAIlB,aAAA;EAAA,IAIA,WAAA;EAAA,IAIA,gBAAA;EAIJ,MAAA,CAAO,IAAA,EAAM,WAAA,GAAc,OAAA;EAU3B,aAAA,CAAc,MAAA,WAAiB,OAAA;EAe/B,KAAA;EAKA,OAAA;EAAA,QAKc,KAAA;EAAA,QA8BN,uBAAA;EAAA,QAUA,WAAA;AAAA;;;iBC9GM,cAAA,CAAe,QAAgB;;;iBCE/B,0BAAA,CAA2B,IAAA,EAAM,2BAAA,eAA0C,gBAAgB;;;KCGtG,wBAAA;EACH,gBAAA,CAAiB,IAAA,aAAiB,QAAA,GAAW,KAAA,EAAO,YAAA,CAAa,aAAA;EACjE,WAAA,CAAY,OAAA,EAAS,aAAA,EAAe,QAAA,GAAW,YAAA;EAC/C,KAAA;AAAA;AAAA,iBAGc,kBAAA,CAAmB,KAAA,EAAO,wBAAA,GAA2B,aAAa"}
1
+ {"version":3,"file":"rivmux-runtime-worker.d.ts","names":[],"sources":["../src/fixtures/m1-static-fmp4.ts","../src/latency/buffer-ranges.ts","../src/loader/loader.ts","../src/wasm/rivmux-transmux-wasm.ts","../src/runtime.ts","../src/loader/http-flv-loader.ts","../src/mse/mse-controller.ts","../src/mse/source-buffer-queue.ts","../src/mse/mime.ts","../src/wasm/wasm-loader.ts","../src/worker-entry.ts"],"mappings":"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"}
@@ -689,6 +689,7 @@ function createAbortError() {
689
689
  //#endregion
690
690
  //#region src/mse/mime.ts
691
691
  const M1_VIDEO_MIME$1 = "video/mp4; codecs=\"avc1.42C01E\"";
692
+ const M1_AUDIO_MIME = "audio/mp4; codecs=\"mp4a.40.2\"";
692
693
  function createMp4VideoMime(codec) {
693
694
  return `video/mp4; codecs="${codec}"`;
694
695
  }
@@ -882,8 +883,8 @@ var MseController = class {
882
883
  const duration = segment.dtsEndMs / 1e3;
883
884
  if (Number.isFinite(duration) && duration > 0 && mediaSource.readyState === "open") mediaSource.duration = Math.max(mediaSource.duration, duration);
884
885
  }
885
- async cleanupBefore(cutoff) {
886
- if (!Number.isFinite(cutoff) || cutoff <= 0 || cutoff <= this.lastCleanupBefore + CLEANUP_STEP_SECONDS) return;
886
+ async cleanupBefore(cutoff, options = {}) {
887
+ if (!Number.isFinite(cutoff) || cutoff <= 0 || !options.force && cutoff <= this.lastCleanupBefore + CLEANUP_STEP_SECONDS) return;
887
888
  this.lastCleanupBefore = cutoff;
888
889
  await Promise.all(Array.from(this.queues.values(), (queue) => queue.cleanupBefore(cutoff)));
889
890
  }
@@ -1058,7 +1059,7 @@ function normalizeMediaSegment(value) {
1058
1059
  };
1059
1060
  }
1060
1061
  function normalizeProbeResult(value) {
1061
- if (!isRecord$1(value) || value.container !== "flv" && value.container !== "mpegTs") throw new TypeError("Transmux core probe result has an unsupported container.");
1062
+ if (!isRecord$1(value) || value.container !== "flv" && value.container !== "mpegts") throw new TypeError("Transmux core probe result has an unsupported container.");
1062
1063
  const result = { container: value.container };
1063
1064
  const video = normalizeOptionalString(value.video, [
1064
1065
  "avc",
@@ -1478,13 +1479,22 @@ var RuntimeWorker = class {
1478
1479
  this.createMseController = dependencies.createMseController ?? (() => new MseController());
1479
1480
  this.createLoader = dependencies.createLoader ?? ((config) => new HttpFlvLoader(config));
1480
1481
  this.createTransmuxCore = dependencies.createTransmuxCore ?? ((options) => loadWasmTransmuxCoreHost(options.runtime.wasmUrl));
1482
+ this.detectRuntime = dependencies.detectRuntime ?? detectWorkerRuntime;
1481
1483
  this.now = dependencies.now ?? (() => performance.now());
1482
1484
  }
1483
1485
  async handleCommand(command) {
1484
1486
  if (this.state === "destroyed") return;
1487
+ if (this.state === "fatal-error" && command.type !== "destroy") return;
1485
1488
  try {
1486
1489
  switch (command.type) {
1487
1490
  case "init":
1491
+ {
1492
+ const runtimeError = this.detectRuntime();
1493
+ if (runtimeError !== void 0) {
1494
+ this.failWithError(runtimeError);
1495
+ return;
1496
+ }
1497
+ }
1488
1498
  this.url = command.url;
1489
1499
  this.options = command.options;
1490
1500
  this.latencyController = createLatencyController(command.options);
@@ -1702,11 +1712,7 @@ var RuntimeWorker = class {
1702
1712
  });
1703
1713
  break;
1704
1714
  case "fatalError":
1705
- this.post({
1706
- type: "error",
1707
- error: coreErrorToPlayerError(event.data)
1708
- });
1709
- this.state = "fatal-error";
1715
+ this.failWithError(coreErrorToPlayerError(event.data));
1710
1716
  return false;
1711
1717
  case "initSegment":
1712
1718
  if (!await this.appendToMse(() => this.mse?.appendInitSegment(event.data))) return false;
@@ -1746,10 +1752,37 @@ var RuntimeWorker = class {
1746
1752
  await append();
1747
1753
  return true;
1748
1754
  } catch (cause) {
1755
+ if (isQuotaExceededError(cause) && await this.retryAppendAfterQuotaCleanup(append)) return true;
1749
1756
  this.fail("mse", "RIVMUX_MSE_APPEND_FAILED", "MSE append failed.", true, cause);
1750
1757
  return false;
1751
1758
  }
1752
1759
  }
1760
+ async retryAppendAfterQuotaCleanup(append) {
1761
+ const mse = this.mse;
1762
+ const cutoff = this.quotaCleanupCutoff();
1763
+ if (mse === void 0 || cutoff === void 0 || cutoff <= 0) return false;
1764
+ try {
1765
+ await mse.cleanupBefore(cutoff, { force: true });
1766
+ await append();
1767
+ this.post({
1768
+ type: "warning",
1769
+ warning: {
1770
+ code: "RIVMUX_MSE_QUOTA_RETRY",
1771
+ message: "MSE quota was exceeded; old buffered ranges were cleaned before retrying append."
1772
+ }
1773
+ });
1774
+ return true;
1775
+ } catch {
1776
+ return false;
1777
+ }
1778
+ }
1779
+ quotaCleanupCutoff() {
1780
+ const backwardBuffer = this.options?.latency.backwardBuffer ?? 0;
1781
+ const currentTime = this.videoState?.currentTime;
1782
+ if (currentTime !== void 0 && Number.isFinite(currentTime)) return Math.max(0, currentTime - backwardBuffer);
1783
+ const bufferedEnd = this.mse?.bufferedEnd;
1784
+ return bufferedEnd === void 0 ? void 0 : Math.max(0, bufferedEnd - backwardBuffer);
1785
+ }
1753
1786
  async applyLatencyPolicy() {
1754
1787
  const latencyController = this.latencyController;
1755
1788
  const mse = this.mse;
@@ -1809,12 +1842,25 @@ var RuntimeWorker = class {
1809
1842
  terminal,
1810
1843
  cause: serializeCause(cause)
1811
1844
  };
1812
- if (terminal) this.state = "fatal-error";
1845
+ this.failWithError(error);
1846
+ }
1847
+ failWithError(error) {
1848
+ if (error.terminal) this.enterFatalErrorState();
1813
1849
  this.post({
1814
1850
  type: "error",
1815
1851
  error
1816
1852
  });
1817
1853
  }
1854
+ enterFatalErrorState() {
1855
+ if (this.state === "fatal-error") return;
1856
+ this.state = "fatal-error";
1857
+ this.closeLoader();
1858
+ this.mse?.destroy();
1859
+ this.mse = void 0;
1860
+ this.latencyController?.reset();
1861
+ this.videoState = void 0;
1862
+ this.lastLatencyMetrics = {};
1863
+ }
1818
1864
  post(message, transfer) {
1819
1865
  this.port.postMessage(message, transfer);
1820
1866
  }
@@ -1834,6 +1880,30 @@ function serializeCause(cause) {
1834
1880
  };
1835
1881
  return cause;
1836
1882
  }
1883
+ function isQuotaExceededError(cause) {
1884
+ return isNamedError(cause, "QuotaExceededError");
1885
+ }
1886
+ function isNamedError(value, name) {
1887
+ return typeof value === "object" && value !== null && "name" in value && value.name === name;
1888
+ }
1889
+ function detectWorkerRuntime() {
1890
+ if (typeof fetch !== "function") return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_FETCH", "Fetch is not available in this worker runtime.");
1891
+ if (typeof ReadableStream === "undefined") return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_READABLE_STREAM", "ReadableStream is not available in this worker runtime.");
1892
+ if (typeof WebAssembly === "undefined") return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_WASM", "WebAssembly is not available in this worker runtime.");
1893
+ if (typeof MediaSource === "undefined") return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_MSE", "MediaSource is not available in this worker runtime.");
1894
+ if (MediaSource.canConstructInDedicatedWorker !== true) return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_WORKER_MSE", "MediaSource cannot be constructed in this worker runtime.");
1895
+ if (typeof MediaSource.isTypeSupported !== "function") return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_MSE_TYPE_CHECK", "MediaSource.isTypeSupported is not available in this worker runtime.");
1896
+ if (!MediaSource.isTypeSupported("video/mp4; codecs=\"avc1.42C01E\"")) return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_M1_VIDEO_MIME", `MSE does not support ${M1_VIDEO_MIME$1}.`);
1897
+ if (!MediaSource.isTypeSupported("audio/mp4; codecs=\"mp4a.40.2\"")) return createUnsupportedRuntimeError("RIVMUX_UNSUPPORTED_M1_AUDIO_MIME", `MSE does not support ${M1_AUDIO_MIME}.`);
1898
+ }
1899
+ function createUnsupportedRuntimeError(code, message) {
1900
+ return {
1901
+ kind: "unsupported",
1902
+ code,
1903
+ message,
1904
+ terminal: true
1905
+ };
1906
+ }
1837
1907
  function createLatencyController(options) {
1838
1908
  return new LatencyController({
1839
1909
  latency: options.latency,