From 25441262b99a6e5a32023ed8f4d716646cbb13bb Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Mon, 14 Jan 2019 02:41:35 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20BookManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/components/Reader/share/bookManager.js | 71 ++++++++++++------- client/share/utils.js | 16 +++++ 2 files changed, 62 insertions(+), 25 deletions(-) diff --git a/client/components/Reader/share/bookManager.js b/client/components/Reader/share/bookManager.js index 93976011..7c866d13 100644 --- a/client/components/Reader/share/bookManager.js +++ b/client/components/Reader/share/bookManager.js @@ -1,38 +1,64 @@ import localForage from 'localforage'; -import path from 'path'; +import * as utils from '../../../share/utils'; import BookParser from './BookParser'; +const maxDataSize = 100*1024*1024;//chars, not bytes + class BookManager { async init() { this.books = {}; const len = await localForage.length(); - for (let i = 0; i < len; i++){ + for (let i = 0; i < len; i++) { const key = await localForage.key(i); const keySplit = key.split('-'); - if (keySplit.length == 2 && keySplit[1] == 'meta') { + + if (keySplit.length == 2 && keySplit[0] == 'bmMeta') { let meta = await localForage.getItem(key); - meta.data = await localForage.getItem(keySplit[0]); + meta.data = await localForage.getItem(`bmData-${keySplit[1]}`); this.books[meta.key] = meta; - this.books[meta.url] = meta; } } - console.log(this.books); + await this.cleanBooks(); + } + + async cleanBooks() { + while (1) {// eslint-disable-line no-constant-condition + let size = 0; + let min = Date.now(); + let toDel = null; + for (let key in this.books) { + let book = this.books[key]; + size += book.data.length; + + if (book.addTime < min) { + toDel = book; + min = book.addTime; + } + } + + if (size > maxDataSize && toDel) { + await this.delBook(toDel); + } else { + break; + } + } } async addBook(newBook, callback) { if (!this.books) await this.init(); let meta = {url: newBook.url, path: newBook.path}; - meta.key = path.basename(newBook.path); + meta.key = this.keyFromUrl(meta.url); + meta.addTime = Date.now(); const result = await this.parseBook(meta, newBook.data, callback); - await localForage.setItem(meta.key, result.data); - await localForage.setItem(`${meta.key}-meta`, meta); + await localForage.setItem(`bmMeta-${meta.key}`, this.metaOnly(result)); + await localForage.setItem(`bmData-${meta.key}`, result.data); return result; } @@ -41,10 +67,9 @@ class BookManager { if (!this.books) await this.init(); let result = undefined; - if (meta.key) - result = this.books[meta.key]; - else - result = this.books[meta.url]; + if (!meta.key) + meta.key = this.keyFromUrl(meta.url); + result = this.books[meta.key]; if (result && !result.parsed) { result = await this.parseBook(result, result.data, callback); @@ -56,19 +81,11 @@ class BookManager { async delBook(meta) { if (!this.books) await this.init(); - let book = undefined; - if (meta.key) - book = this.books[meta.key]; - else - book = this.books[meta.url]; - if (book) { - await localForage.removeItem(book.key); - await localForage.removeItem(`${book.key}-meta`); + await localForage.removeItem(`bmMeta-${meta.key}`); + await localForage.removeItem(`bmData-${meta.key}`); - delete this.books[book.key]; - delete this.books[book.url]; - } + delete this.books[meta.key]; } async parseBook(meta, data, callback) { @@ -80,7 +97,6 @@ class BookManager { const result = Object.assign({}, meta, parsedMeta, {data, parsed}); this.books[meta.key] = result; - this.books[meta.url] = result; return result; } @@ -91,6 +107,11 @@ class BookManager { delete result.parsed; return result; } + + keyFromUrl(url) { + return utils.stringToHex(url); + } + } export default new BookManager(); \ No newline at end of file diff --git a/client/share/utils.js b/client/share/utils.js index 44179597..912c2fac 100644 --- a/client/share/utils.js +++ b/client/share/utils.js @@ -1,3 +1,19 @@ export function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } + +export function stringToHex(str) { + let result = ''; + for (let i = 0; i < str.length; i++) { + result += str.charCodeAt(i).toString(16); + } + return result; +} + +export function hexToString(str) { + let result = ''; + for (let i = 0; i < str.length; i += 2) { + result += String.fromCharCode(parseInt(str.substr(i, 2), 16)); + } + return result; +} \ No newline at end of file