From 0d41171e9db82b36108514f0d00d0e3dc8459535 Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Sun, 21 Jul 2019 12:15:33 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D1=82=D0=B7=D1=8B=D0=B2=D1=87=D0=B8=D0=B2?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B1=D0=B0=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/components/Reader/share/bookManager.js | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/client/components/Reader/share/bookManager.js b/client/components/Reader/share/bookManager.js index 9d2932af..294bd624 100644 --- a/client/components/Reader/share/bookManager.js +++ b/client/components/Reader/share/bookManager.js @@ -143,7 +143,6 @@ class BookManager { } } - async deflateWithProgress(data, callback) { const chunkSize = 128*1024; const deflator = new utils.pako.Deflate({level: 5}); @@ -178,6 +177,40 @@ class BookManager { return deflator.result; } + async inflateWithProgress(data, callback) { + const chunkSize = 64*1024; + const inflator = new utils.pako.Inflate({to: 'string'}); + + let chunkTotal = 1 + Math.floor(data.length/chunkSize); + let chunkNum = 0; + let perc = 0; + let prevPerc = 0; + + for (var i = 0; i < data.length; i += chunkSize) { + if ((i + chunkSize) >= data.length) { + inflator.push(data.subarray(i, i + chunkSize), true); + } else { + inflator.push(data.subarray(i, i + chunkSize), false); + } + chunkNum++; + + perc = Math.round(chunkNum/chunkTotal*100); + if (perc != prevPerc) { + callback(perc); + await utils.sleep(1); + prevPerc = perc; + } + } + + if (inflator.err) { + throw new Error(inflator.msg); + } + + callback(100); + + return inflator.result; + } + async addBook(newBook, callback) { if (!this.books) await this.init(); @@ -239,12 +272,18 @@ class BookManager { if (result && !result.parsed) { let data = await bmDataStore.getItem(`bmData-${meta.key}`); - callback(10); + callback(5); await utils.sleep(10); + let cb = (perc) => { + const p = 5 + Math.round(15*perc/100); + callback(p); + }; + if (result.dataCompressed) { try { - data = utils.pako.inflate(data, {to: 'string'}); + //data = utils.pako.inflate(data, {to: 'string'}); + data = await this.inflateWithProgress(data, cb); } catch (e) { this.delBook(meta); throw e; @@ -252,7 +291,7 @@ class BookManager { } callback(20); - const cb = (perc) => { + cb = (perc) => { const p = 20 + Math.round(80*perc/100); callback(p); };