Skip to content

Commit

Permalink
feat(preload): Add new method destroyAllPreloads (#6756)
Browse files Browse the repository at this point in the history
  • Loading branch information
theodab authored Jun 5, 2024
1 parent c3e6450 commit b500799
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 10 deletions.
40 changes: 30 additions & 10 deletions lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -934,14 +934,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
// A PreloadManager can only be used with the Player instance that created
// it, so all PreloadManagers this Player has created are now useless.
// Destroy any remaining managers now, to help prevent memory leaks.
const preloadManagerDestroys = [];
for (const preloadManager of this.createdPreloadManagers_) {
if (!preloadManager.isDestroyed()) {
preloadManagerDestroys.push(preloadManager.destroy());
}
}
this.createdPreloadManagers_ = [];
await Promise.all(preloadManagerDestroys);
await this.destroyAllPreloads();

// Tear-down the event managers to ensure handlers stop firing.
if (this.globalEventManager_) {
Expand Down Expand Up @@ -1796,6 +1789,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
/* allowPrefetch= */ true,
/* disableVideo= */ false,
/* allowMakeAbrManager= */ false);
this.createdPreloadManagers_.push(preloadManager);
preloadManager.attachManifest(
this.manifest_, this.parser_, this.parserFactory_);
preloadManager.attachAbrManager(
Expand Down Expand Up @@ -1853,6 +1847,21 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
return preloadManager;
}

/**
* Calls |destroy| on each PreloadManager object this player has created.
* @export
*/
async destroyAllPreloads() {
const preloadManagerDestroys = [];
for (const preloadManager of this.createdPreloadManagers_) {
if (!preloadManager.isDestroyed()) {
preloadManagerDestroys.push(preloadManager.destroy());
}
}
this.createdPreloadManagers_ = [];
await Promise.all(preloadManagerDestroys);
}

/**
* @param {string} assetUri
* @param {?number} startTime
Expand Down Expand Up @@ -1890,9 +1899,21 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
disableVideo = true;
}
}
return this.makePreloadManager_(
let preloadManagerPromise = this.makePreloadManager_(
assetUri, startTime, mimeType || null, startTimeOfLoad,
/* allowPrefetch= */ !standardLoad, disableVideo, allowMakeAbrManager);
if (!standardLoad) {
// We only need to track the PreloadManager if it is not part of a
// standard load. If it is, the load() method will handle destroying it.
// Adding a standard load PreloadManager to the createdPreloadManagers_
// array runs the risk that the user will call destroyAllPreloads and
// destroy that PreloadManager mid-load.
preloadManagerPromise = preloadManagerPromise.then((preloadManager) => {
this.createdPreloadManagers_.push(preloadManager);
return preloadManager;
});
}
return preloadManagerPromise;
}

/**
Expand Down Expand Up @@ -2114,7 +2135,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
};
preloadManager = new shaka.media.PreloadManager(
assetUri, mimeType, startTimeOfLoad, startTime, playerInterface);
this.createdPreloadManagers_.push(preloadManager);
return preloadManager;
}

Expand Down
1 change: 1 addition & 0 deletions test/cast/cast_utils_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ describe('CastUtils', () => {
'detachAndSavePreload',
'unloadAndSavePreload',
'preload',
'destroyAllPreloads',
'getNonDefaultConfiguration',

// Test helper methods (not @export'd)
Expand Down

0 comments on commit b500799

Please sign in to comment.