diff --git a/VERSIONS.md b/VERSIONS.md index 5c15ded..36ae2c4 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -1,4 +1,7 @@ # 版本歷史 +* PWA 9.0.1, Electron app 20.0.1: + * [修正] Electron app 啟動時偶爾讀取離線 DB 失敗。 + * PWA 9.0.0, Electron app 20.0.0: * [變更] 用 JS 改寫讀取檔案系統離線 DB 程式碼。 * [新增] 樹狀目錄新增知名經典目錄。 diff --git a/buildElectron/io.github.mrmyhuang.cbetar2.metainfo.xml b/buildElectron/io.github.mrmyhuang.cbetar2.metainfo.xml index 14eb245..ec7063c 100644 --- a/buildElectron/io.github.mrmyhuang.cbetar2.metainfo.xml +++ b/buildElectron/io.github.mrmyhuang.cbetar2.metainfo.xml @@ -26,6 +26,13 @@ + + +
    +
  • [修正] Electron app 啟動時偶爾讀取離線 DB 失敗。
  • +
+
+
    diff --git a/package.json b/package.json index 7aca396..63eba07 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "cbetar2", "productName": "電子佛典", "homepage": "/", - "pwaVersion": "9.0.0", - "version": "20.0.0", + "pwaVersion": "9.0.1", + "version": "20.0.1", "license": "MIT", "keywords": [ "CBETA", diff --git a/src/App.tsx b/src/App.tsx index 506aa25..ef73a80 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -177,11 +177,13 @@ class _AppOrig extends React.Component { electronBackendApi?.receive("fromMain", (data: any) => { switch (data.event) { case 'version': + // Backend is ready. this.props.dispatch({ type: "TMP_SET_KEY_VAL", key: 'mainVersion', val: data.version, }); + CbetaOfflineDb.setOfflineFileSystemV2Ready(); break; case 'cbetaOfflineDbMode': let dbMode = CbetaDbMode.Online; diff --git a/src/CbetaOfflineDb.ts b/src/CbetaOfflineDb.ts index 11328ff..c34f853 100644 --- a/src/CbetaOfflineDb.ts +++ b/src/CbetaOfflineDb.ts @@ -75,6 +75,11 @@ async function getFileAsStringFromIndexedDB(file: string) { return textDecoder.decode((await IndexedDbFuncs.getZippedFile(file)) as Uint8Array); } +let isOfflineFileSystemV2Ready = false; +export async function setOfflineFileSystemV2Ready() { + isOfflineFileSystemV2Ready = true; +} + export async function init(mode: CbetaDbMode) { // Avoid multiple inits. if (isInitializing) { @@ -111,6 +116,15 @@ export async function init(mode: CbetaDbMode) { const teiStylesheetString = await getFileAsStringFromIndexedDB(`/${Globals.cbetar2AssetDir}/tei.xsl`); await initFromFiles(catalogsString, spinesString, gaijisString, stylesheetString, documentString, teiStylesheetString); } else if (mode === CbetaDbMode.OfflineFileSystemV2) { + await new Promise(ok => { + const timer = setInterval(() => { + if (isOfflineFileSystemV2Ready) { + clearInterval(timer); + ok(); + } + }, 100); + }); + const catalogsString = (await readBookcaseFromFileSystem(`CBETA/catalog.txt`)); const spinesString = (await readBookcaseFromFileSystem(`CBETA/spine.txt`)); const gaijisString = (await readResourceFromFileSystem(`cbeta_gaiji/cbeta_gaiji.json`)); @@ -363,7 +377,11 @@ async function readResourceFromFileSystem(path: string) { electronBackendApi?.receiveOnce('fromMain', (data: any) => { switch (data.event) { case 'readResource': - ok(data.data); + if (data.error) { + fail(data.error); + } else { + ok(data.data); + } break; } }); @@ -376,7 +394,11 @@ async function readBookcaseFromFileSystem(path: string) { electronBackendApi?.receiveOnce('fromMain', (data: any) => { switch (data.event) { case 'readBookcase': - ok(data.data); + if (data.error) { + fail(data.error); + } else { + ok(data.data); + } break; } }); @@ -389,7 +411,8 @@ const CbetaOfflineDb = { fetchCatalogs, fetchAllCatalogs, fetchWork, - fetchJuan + fetchJuan, + setOfflineFileSystemV2Ready, }; export default CbetaOfflineDb; \ No newline at end of file diff --git a/srcElectron/main.ts b/srcElectron/main.ts index 3d5d334..e4dccb1 100644 --- a/srcElectron/main.ts +++ b/srcElectron/main.ts @@ -225,10 +225,21 @@ async function createWindow() { mainWindow?.webContents.send('fromMain', { event: 'version', version: PackageInfos.version }); break; case 'readResource': - mainWindow?.webContents.send('fromMain', Object.assign({ event: args.event }, { data: fs.readFileSync(`${isDevMode() ? '.' : resourcesPath}/${args.path}`).toString() })); + try { + const str = fs.readFileSync(`${isDevMode() ? '.' : resourcesPath}/${args.path}`).toString(); + mainWindow?.webContents.send('fromMain', Object.assign({ event: args.event }, { data: str })); + } catch (error) { + mainWindow?.webContents.send('fromMain', Object.assign({ event: args.event }, { error: error })); + } break; case 'readBookcase': - mainWindow?.webContents.send('fromMain', Object.assign({ event: args.event }, { data: fs.readFileSync(`${settings.cbetaBookcaseDir}/${args.path}`).toString() })); + try { + const str = fs.readFileSync(`${settings.cbetaBookcaseDir}/${args.path}`).toString(); + mainWindow?.webContents.send('fromMain', Object.assign({ event: args.event }, { data: str })); + } catch (error) { + mainWindow?.webContents.send('fromMain', Object.assign({ event: args.event }, { error: error })); + } + break; } });