mediabunny 1.24.2 → 1.24.3

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.
@@ -15072,10 +15072,16 @@ var Mediabunny = (() => {
15072
15072
  }
15073
15073
  break;
15074
15074
  }
15075
+ if (worker.aborted) {
15076
+ break;
15077
+ }
15075
15078
  this.onread?.(worker.currentPos, worker.currentPos + value.length);
15076
15079
  this._orchestrator.supplyWorkerData(worker, value);
15077
15080
  } else {
15078
15081
  const data = await this._blob.slice(worker.currentPos, worker.targetPos).arrayBuffer();
15082
+ if (worker.aborted) {
15083
+ break;
15084
+ }
15079
15085
  this.onread?.(worker.currentPos, worker.currentPos + data.byteLength);
15080
15086
  this._orchestrator.supplyWorkerData(worker, new Uint8Array(data));
15081
15087
  }
@@ -15189,7 +15195,7 @@ var Mediabunny = (() => {
15189
15195
  }
15190
15196
  /** @internal */
15191
15197
  async _runWorker(worker) {
15192
- while (!worker.aborted) {
15198
+ while (true) {
15193
15199
  const existing = this._existingResponses.get(worker);
15194
15200
  this._existingResponses.delete(worker);
15195
15201
  let abortController = existing?.abortController;
@@ -15249,6 +15255,9 @@ var Mediabunny = (() => {
15249
15255
  throw error;
15250
15256
  }
15251
15257
  }
15258
+ if (worker.aborted) {
15259
+ break;
15260
+ }
15252
15261
  const { done, value } = readResult;
15253
15262
  if (done) {
15254
15263
  this._orchestrator.forgetWorker(worker);
@@ -15263,6 +15272,9 @@ var Mediabunny = (() => {
15263
15272
  this.onread?.(worker.currentPos, worker.currentPos + value.length);
15264
15273
  this._orchestrator.supplyWorkerData(worker, value);
15265
15274
  }
15275
+ if (worker.aborted) {
15276
+ break;
15277
+ }
15266
15278
  }
15267
15279
  worker.running = false;
15268
15280
  }
@@ -15401,6 +15413,9 @@ var Mediabunny = (() => {
15401
15413
  const originalTargetPos = worker.targetPos;
15402
15414
  let data = this._options.read(worker.currentPos, originalTargetPos);
15403
15415
  if (data instanceof Promise) data = await data;
15416
+ if (worker.aborted) {
15417
+ break;
15418
+ }
15404
15419
  if (data instanceof Uint8Array) {
15405
15420
  data = toUint8Array(data);
15406
15421
  if (data.length !== originalTargetPos - worker.currentPos) {
@@ -15425,6 +15440,9 @@ var Mediabunny = (() => {
15425
15440
  if (!(value instanceof Uint8Array)) {
15426
15441
  throw new TypeError("ReadableStream returned by options.read must yield Uint8Array chunks.");
15427
15442
  }
15443
+ if (worker.aborted) {
15444
+ break;
15445
+ }
15428
15446
  const data2 = toUint8Array(value);
15429
15447
  this.onread?.(worker.currentPos, worker.currentPos + data2.length);
15430
15448
  this._orchestrator.supplyWorkerData(worker, data2);
@@ -15797,7 +15815,10 @@ var Mediabunny = (() => {
15797
15815
  currentPos: startPos,
15798
15816
  targetPos,
15799
15817
  running: false,
15800
- aborted: false,
15818
+ // Due to async shenanigans, it can happen that workers are started after disposal. In this case, instead of
15819
+ // simply not creating the worker, we allow it to run but immediately label it as aborted, so it can then
15820
+ // shut itself down.
15821
+ aborted: this.disposed,
15801
15822
  pendingSlices: [],
15802
15823
  age: this.nextAge++
15803
15824
  };
@@ -15837,9 +15858,7 @@ var Mediabunny = (() => {
15837
15858
  }
15838
15859
  /** Called by a worker when it has read some data. */
15839
15860
  supplyWorkerData(worker, bytes2) {
15840
- if (this.disposed) {
15841
- return;
15842
- }
15861
+ assert(!worker.aborted);
15843
15862
  const start = worker.currentPos;
15844
15863
  const end = start + bytes2.length;
15845
15864
  this.insertIntoCache({
@@ -22840,7 +22859,7 @@ ${cue.notes ?? ""}`;
22840
22859
  type: "videoTrack",
22841
22860
  trackId: this._workerTrackId,
22842
22861
  track: this._track
22843
- }, [this._track]);
22862
+ });
22844
22863
  this._workerListener = (event) => {
22845
22864
  const message = event.data;
22846
22865
  if (message.type === "videoFrame" && message.trackId === this._workerTrackId) {
@@ -23443,16 +23462,17 @@ ${cue.notes ?? ""}`;
23443
23462
  supported: typeof MediaStreamTrackProcessor !== "undefined"
23444
23463
  });
23445
23464
  const abortControllers = /* @__PURE__ */ new Map();
23446
- const stoppedTracks = /* @__PURE__ */ new Set();
23465
+ const activeTracks = /* @__PURE__ */ new Map();
23447
23466
  self.addEventListener("message", (event) => {
23448
23467
  const message = event.data;
23449
23468
  switch (message.type) {
23450
23469
  case "videoTrack":
23451
23470
  {
23471
+ activeTracks.set(message.trackId, message.track);
23452
23472
  const processor = new MediaStreamTrackProcessor({ track: message.track });
23453
23473
  const consumer = new WritableStream({
23454
23474
  write: (videoFrame) => {
23455
- if (stoppedTracks.has(message.trackId)) {
23475
+ if (!activeTracks.has(message.trackId)) {
23456
23476
  videoFrame.close();
23457
23477
  return;
23458
23478
  }
@@ -23485,7 +23505,9 @@ ${cue.notes ?? ""}`;
23485
23505
  abortController.abort();
23486
23506
  abortControllers.delete(message.trackId);
23487
23507
  }
23488
- stoppedTracks.add(message.trackId);
23508
+ const track = activeTracks.get(message.trackId);
23509
+ track?.stop();
23510
+ activeTracks.delete(message.trackId);
23489
23511
  sendMessage({
23490
23512
  type: "trackStopped",
23491
23513
  trackId: message.trackId