From 265784eae16e32ae5695bafe77dc522ca9c7728d Mon Sep 17 00:00:00 2001 From: theodab Date: Fri, 10 May 2024 04:14:43 -0700 Subject: [PATCH] fix: Destroy preload managers on player destroy (#6576) A PreloadManager can only be used on the Player instance that created it. That means that once that Player instance is destroyed any PreloadManagers it made are basically useless, so they should be automatically destroyed too. --- lib/player.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/player.js b/lib/player.js index 4da5af9a23..0d0cbd670d 100644 --- a/lib/player.js +++ b/lib/player.js @@ -715,6 +715,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.manifestFilterer_ = new shaka.media.ManifestFilterer( this.config_, this.maxHwRes_, null); + /** @private {!Array.} */ + this.createdPreloadManagers_ = []; + /** @private {shaka.util.Stats} */ this.stats_ = null; @@ -881,6 +884,18 @@ shaka.Player = class extends shaka.util.FakeEventTarget { await detachPromise; + // 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()); + } + } + await Promise.all(preloadManagerDestroys); + this.createdPreloadManagers_ = []; + // Tear-down the event managers to ensure handlers stop firing. if (this.globalEventManager_) { this.globalEventManager_.release(); @@ -1977,6 +1992,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { }; preloadManager = new shaka.media.PreloadManager( assetUri, mimeType, startTimeOfLoad, startTime, playerInterface); + this.createdPreloadManagers_.push(preloadManager); return preloadManager; }