From 7176c61c1f377463f9f3ffb8424c0a7e80823b6e Mon Sep 17 00:00:00 2001 From: Andrew S Date: Thu, 21 Dec 2023 00:25:41 -0500 Subject: [PATCH] Firefox shenanigans --- chrome/player/FastStreamClient.mjs | 12 ++++++-- chrome/player/network/IndexedDBManager.mjs | 33 ++++++++++++++++------ chrome/player/players/dash/DashPlayer.mjs | 6 +++- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/chrome/player/FastStreamClient.mjs b/chrome/player/FastStreamClient.mjs index 2600717a..0cb79bee 100644 --- a/chrome/player/FastStreamClient.mjs +++ b/chrome/player/FastStreamClient.mjs @@ -710,7 +710,11 @@ export class FastStreamClient extends EventEmitter { } if (this.player) { - this.player.destroy(); + try { + this.player.destroy(); + } catch (e) { + console.error(e); + } this.player = null; } @@ -720,7 +724,11 @@ export class FastStreamClient extends EventEmitter { } if (this.previewPlayer) { - this.previewPlayer.destroy(); + try { + this.previewPlayer.destroy(); + } catch (e) { + console.error(e); + } this.previewPlayer = null; } diff --git a/chrome/player/network/IndexedDBManager.mjs b/chrome/player/network/IndexedDBManager.mjs index 1d75f8d7..b85fc7d7 100644 --- a/chrome/player/network/IndexedDBManager.mjs +++ b/chrome/player/network/IndexedDBManager.mjs @@ -26,7 +26,7 @@ export class IndexedDBManager { this.dbName = this.persistentName; } - this.db = await this.requestDB(this.dbName, true, this.isPersistent()); + this.db = await this.requestDB(this.dbName, true); closeQueue.push(this); return this.transact(this.db, 'metadata', 'readwrite', (transaction)=>{ @@ -70,6 +70,19 @@ export class IndexedDBManager { async prune() { const databases = await this.getDatabases(); + // Double check because of Firefox bug + if (!window.indexedDB.databases) { + const previouslyDeleted = JSON.parse(localStorage.getItem('fs_temp_databases_deleted') || '[]'); + await Promise.all(previouslyDeleted.map(async (database)=>{ + try { + await this.deleteDB(database); + } catch (e) { + console.error(e); + } + })); + localStorage.setItem('fs_temp_databases_deleted', '[]'); + } + return Promise.all(databases.map(async (database)=>{ if (database.name.startsWith('faststream-temp-')) { try { @@ -84,11 +97,6 @@ export class IndexedDBManager { db.close(); await this.deleteDB(database.name); console.log('Pruned', database.name); - - if (!window.indexedDB.databases) { - const databases = JSON.parse(localStorage.getItem('fs_temp_databases') || '[]'); - localStorage.setItem('fs_temp_databases', JSON.stringify(databases.filter((name)=>name !== database.name))); - } } } catch (e) { console.error(e); @@ -97,14 +105,14 @@ export class IndexedDBManager { })); } - async requestDB(dbName, open = false, persistent = false) { + async requestDB(dbName, open = false) { const request = window.indexedDB.open(dbName, 3); if (open) { request.onupgradeneeded = async (event) => { const db = event.target.result; db.createObjectStore('metadata'); db.createObjectStore('files'); - if (!persistent && !window.indexedDB.databases) { + if (!window.indexedDB.databases) { const databases = JSON.parse(localStorage.getItem('fs_temp_databases') || '[]'); if (!databases.includes(dbName)) databases.push(dbName); localStorage.setItem('fs_temp_databases', JSON.stringify(databases)); @@ -117,6 +125,15 @@ export class IndexedDBManager { async deleteDB(dbName) { try { await this.wrapRequest(window.indexedDB.deleteDatabase(dbName), 5000); + + if (!window.indexedDB.databases) { + const deleted = JSON.parse(localStorage.getItem('fs_temp_databases_deleted') || '[]'); + if (!deleted.includes(dbName)) deleted.push(dbName); + localStorage.setItem('fs_temp_databases_deleted', JSON.stringify(deleted)); + + const databases = JSON.parse(localStorage.getItem('fs_temp_databases') || '[]'); + localStorage.setItem('fs_temp_databases', JSON.stringify(databases.filter((name)=>name !== dbName))); + } } catch (e) { console.error(e); } diff --git a/chrome/player/players/dash/DashPlayer.mjs b/chrome/player/players/dash/DashPlayer.mjs index 339aa42c..9c4305e2 100644 --- a/chrome/player/players/dash/DashPlayer.mjs +++ b/chrome/player/players/dash/DashPlayer.mjs @@ -230,7 +230,11 @@ export default class DashPlayer extends EventEmitter { } destroy() { - this.dash.destroy(); + try { + this.dash.destroy(); + } catch (e) { + + } this.dash = null; this.emit(DefaultPlayerEvents.DESTROYED); }