From 4839503d540adf7b48d0b1d337bef7b7c9b890ad Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 14 Aug 2021 12:41:58 -0400 Subject: Threaded dictionary delete (#1895) * Generalize dictionary worker * Add deleteDictionary functionality * Update DictionaryController to use DictionaryDatabaseModifier * Fix incorrect result handling --- ext/js/language/dictionary-database-modifier.js | 43 ++++++++++++++++++------- ext/js/language/dictionary-worker.js | 22 ++++++++++--- ext/js/pages/settings/dictionary-controller.js | 18 +++-------- 3 files changed, 53 insertions(+), 30 deletions(-) (limited to 'ext/js') diff --git a/ext/js/language/dictionary-database-modifier.js b/ext/js/language/dictionary-database-modifier.js index 3b100fae..055c4769 100644 --- a/ext/js/language/dictionary-database-modifier.js +++ b/ext/js/language/dictionary-database-modifier.js @@ -25,12 +25,22 @@ class DictionaryDatabaseModifier { } importDictionary(archiveContent, details, onProgress) { - return this._invoke('importDictionary', {details, archiveContent}, [archiveContent], onProgress); + return this._invoke( + 'importDictionary', + {details, archiveContent}, + [archiveContent], + onProgress, + this._formatimportDictionaryResult.bind(this) + ); + } + + deleteDictionary(dictionaryTitle, onProgress) { + return this._invoke('deleteDictionary', {dictionaryTitle}, [], onProgress); } // Private - _invoke(action, params, transfer, onProgress) { + _invoke(action, params, transfer, onProgress, formatResult) { return new Promise((resolve, reject) => { const worker = new Worker('/js/language/dictionary-worker-main.js', {}); const details = { @@ -39,7 +49,8 @@ class DictionaryDatabaseModifier { resolve, reject, onMessage: null, - onProgress + onProgress, + formatResult }; const onMessage = this._onMessage.bind(this, details); details.onMessage = onMessage; @@ -54,15 +65,17 @@ class DictionaryDatabaseModifier { switch (action) { case 'complete': { - const {worker, resolve, reject, onMessage} = details; + const {worker, resolve, reject, onMessage, formatResult} = details; details.complete = true; details.worker = null; details.resolve = null; details.reject = null; details.onMessage = null; + details.onProgress = null; + details.formatResult = null; worker.removeEventListener('message', onMessage); worker.terminate(); - this._onMessageComplete(params, resolve, reject); + this._onMessageComplete(params, resolve, reject, formatResult); } break; case 'progress': @@ -74,12 +87,21 @@ class DictionaryDatabaseModifier { } } - _onMessageComplete(params, resolve, reject) { + _onMessageComplete(params, resolve, reject, formatResult) { const {error} = params; if (typeof error !== 'undefined') { reject(deserializeError(error)); } else { - resolve(this._formatResult(params.result)); + let {result} = params; + try { + if (typeof formatResult === 'function') { + result = formatResult(result); + } + } catch (e) { + reject(e); + return; + } + resolve(result); } } @@ -101,9 +123,8 @@ class DictionaryDatabaseModifier { worker.postMessage({action: 'getImageResolution.response', params: response}); } - _formatResult(data) { - const {result, errors} = data; - const errors2 = errors.map((error) => deserializeError(error)); - return {result, errors: errors2}; + _formatimportDictionaryResult(result) { + result.errors = result.errors.map((error) => deserializeError(error)); + return result; } } diff --git a/ext/js/language/dictionary-worker.js b/ext/js/language/dictionary-worker.js index 5c482178..dc546657 100644 --- a/ext/js/language/dictionary-worker.js +++ b/ext/js/language/dictionary-worker.js @@ -36,7 +36,10 @@ class DictionaryWorker { const {action, params} = e.data; switch (action) { case 'importDictionary': - this._onImportDictionary(params); + this._onMessageWithProgress(params, this._importDictionary.bind(this)); + break; + case 'deleteDictionary': + this._onMessageWithProgress(params, this._deleteDictionary.bind(this)); break; case 'getImageResolution.response': this._mediaLoader.handleMessage(params); @@ -44,7 +47,7 @@ class DictionaryWorker { } } - async _onImportDictionary({details, archiveContent}) { + async _onMessageWithProgress(params, handler) { const onProgress = (...args) => { self.postMessage({ action: 'progress', @@ -53,7 +56,7 @@ class DictionaryWorker { }; let response; try { - const result = await this._importDictionary(archiveContent, details, onProgress); + const result = await handler(params, onProgress); response = {result}; } catch (e) { response = {error: serializeError(e)}; @@ -61,11 +64,11 @@ class DictionaryWorker { self.postMessage({action: 'complete', params: response}); } - async _importDictionary(archiveContent, importDetails, onProgress) { + async _importDictionary({details, archiveContent}, onProgress) { const dictionaryDatabase = await this._getPreparedDictionaryDatabase(); try { const dictionaryImporter = new DictionaryImporter(this._mediaLoader, onProgress); - const {result, errors} = await dictionaryImporter.importDictionary(dictionaryDatabase, archiveContent, importDetails); + const {result, errors} = await dictionaryImporter.importDictionary(dictionaryDatabase, archiveContent, details); return { result, errors: errors.map((error) => serializeError(error)) @@ -75,6 +78,15 @@ class DictionaryWorker { } } + async _deleteDictionary({dictionaryTitle}, onProgress) { + const dictionaryDatabase = await this._getPreparedDictionaryDatabase(); + try { + return await dictionaryDatabase.deleteDictionary(dictionaryTitle, {rate: 1000}, onProgress); + } finally { + dictionaryDatabase.close(); + } + } + async _getPreparedDictionaryDatabase() { const dictionaryDatabase = new DictionaryDatabase(); await dictionaryDatabase.prepare(); diff --git a/ext/js/pages/settings/dictionary-controller.js b/ext/js/pages/settings/dictionary-controller.js index 47b256d8..8df4b6bd 100644 --- a/ext/js/pages/settings/dictionary-controller.js +++ b/ext/js/pages/settings/dictionary-controller.js @@ -16,7 +16,7 @@ */ /* global - * DictionaryDatabase + * DictionaryDatabaseModifier */ class DictionaryEntry { @@ -679,19 +679,9 @@ class DictionaryController { } async _deleteDictionaryInternal(dictionaryTitle, onProgress) { - const dictionaryDatabase = await this._getPreparedDictionaryDatabase(); - try { - await dictionaryDatabase.deleteDictionary(dictionaryTitle, {rate: 1000}, onProgress); - yomichan.api.triggerDatabaseUpdated('dictionary', 'delete'); - } finally { - dictionaryDatabase.close(); - } - } - - async _getPreparedDictionaryDatabase() { - const dictionaryDatabase = new DictionaryDatabase(); - await dictionaryDatabase.prepare(); - return dictionaryDatabase; + const dictionaryDatabaseModifier = new DictionaryDatabaseModifier(); + await dictionaryDatabaseModifier.deleteDictionary(dictionaryTitle, onProgress); + yomichan.api.triggerDatabaseUpdated('dictionary', 'delete'); } async _deleteDictionarySettings(dictionaryTitle) { -- cgit v1.2.3