From 010ac9aa7ce4ab81591cd3d515e4312ac050882d Mon Sep 17 00:00:00 2001 From: Book Pauk Date: Mon, 20 Jan 2020 21:21:13 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20api,=20=D0=B2=D0=BE=D1=81=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D1=8D?= =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=B8=D0=B7=20=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/api/reader.js | 76 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 11 deletions(-) diff --git a/client/api/reader.js b/client/api/reader.js index b57f0a79..62d1ab23 100644 --- a/client/api/reader.js +++ b/client/api/reader.js @@ -69,7 +69,7 @@ class Reader { if (response) { if (response.state == 'finish') {//воркер закончил работу, можно скачивать кешированный на сервере файл callback({step: 4}); - const book = await this.loadCachedBook(response.path, callback); + const book = await this.loadCachedBook(response.path, callback, false, (response.size ? response.size : -1)); return Object.assign({}, response, {data: book.data}); } @@ -88,18 +88,72 @@ class Reader { } async checkUrl(url) { - return await axios.head(url, {headers: {'Cache-Control': 'no-cache'}}); - } - - async loadCachedBook(url, callback) { - const response = await axios.head(url, {headers: {'Cache-Control': 'no-cache'}}); - - let estSize = 1000000; - if (response.headers['content-length']) { - estSize = response.headers['content-length']; + let fileExists = false; + try { + await axios.head(url, {headers: {'Cache-Control': 'no-cache'}}); + fileExists = true; + } catch (e) { + // } + //восстановим при необходимости файл на сервере из удаленного облака + if (!fileExists) { + let response = await api.post('/restore-cached-file', {path: url}); + + const workerId = response.data.workerId; + if (!workerId) + throw new Error('Неверный ответ api'); + + response = await this.getStateFinish(workerId); + if (response.state == 'error') { + throw new Error(response.error); + } + } + + return true; + } + + async loadCachedBook(url, callback, restore = true, estSize = -1) { + if (!callback) callback = () => {}; + let response = null; + callback({state: 'loading', progress: 0}); + + //получение размера файла + let fileExists = false; + if (estSize < 0) { + try { + response = await axios.head(url, {headers: {'Cache-Control': 'no-cache'}}); + + if (response.headers['content-length']) { + estSize = response.headers['content-length']; + } + fileExists = true; + } catch (e) { + // + } + } + + //восстановим при необходимости файл на сервере из удаленного облака + if (restore && !fileExists) { + response = await api.post('/restore-cached-file', {path: url}); + + const workerId = response.data.workerId; + if (!workerId) + throw new Error('Неверный ответ api'); + + response = await this.getStateFinish(workerId); + if (response.state == 'error') { + throw new Error(response.error); + } + + if (response.size && estSize < 0) { + estSize = response.size; + } + } + + //получение файла + estSize = (estSize > 0 ? estSize : 1000000); const options = { onDownloadProgress: progress => { while (progress.loaded > estSize) estSize *= 1.5; @@ -108,7 +162,7 @@ class Reader { callback({progress: Math.round((progress.loaded*100)/estSize)}); } } - //загрузка + return await axios.get(url, options); }