Quellcode durchsuchen

Работа над ServerStorage

Book Pauk vor 6 Jahren
Ursprung
Commit
e473dc8843

+ 5 - 14
client/api/reader.js

@@ -1,5 +1,8 @@
+import _ from 'lodash';
 import axios from 'axios';
-import {sleep} from '../share/utils';
+import {Buffer} from 'safe-buffer';
+
+import * as utils from '../share/utils';
 
 const api = axios.create({
   baseURL: '/api/reader'
@@ -41,7 +44,7 @@ class Reader {
                 throw new Error(errMes);
             }
             if (i > 0)
-                await sleep(refreshPause);
+                await utils.sleep(refreshPause);
 
             i++;
             if (i > 120*1000/refreshPause) {//2 мин ждем телодвижений воркера
@@ -116,18 +119,6 @@ class Reader {
 
         return response.data;
     }
-
-    storageCheck(items) {
-        return this.storage({action: 'check', items});
-    }
-
-    storageGet(items) {
-        return this.storage({action: 'get', items});
-    }
-
-    storageSet(items, force) {
-        return this.storage({action: 'set', force, items});
-    }
 }
 
 export default new Reader();

+ 63 - 0
client/components/Reader/ServerStorage/ServerStorage.vue

@@ -7,10 +7,12 @@
 import Vue from 'vue';
 import Component from 'vue-class-component';
 import {Buffer} from 'safe-buffer';
+import _ from 'lodash';
 
 import bookManager from '../share/bookManager';
 import readerApi from '../../../api/reader';
 import * as utils from '../../../share/utils';
+import * as cryptoUtils from '../../../share/cryptoUtils';
 
 export default @Component({
 })
@@ -20,12 +22,73 @@ class ServerStorage extends Vue {
     }
 
     async init() {
+        if (!this.serverStorageKey) {
+            //генерируем новый ключ
+            this.generateNewServerStorageKey();
+        }
     }
 
     get settings() {
         return this.$store.state.reader.settings;
     }
 
+    get serverStorageKey() {
+        return this.$store.state.reader.serverStorageKey;
+    }
+
+    generateNewServerStorageKey() {
+        const key = utils.toBase58(Buffer.from(utils.randomArray(32)));
+        this.commit('reader/setServerStorageKey', key);
+    }
+
+    async storageCheck(items) {
+        return this.decodeStorageItems(await readerApi.storage({action: 'check', items}));
+    }
+
+    async storageGet(items) {
+        return this.decodeStorageItems(await readerApi.storage({action: 'get', items}));
+    }
+
+    async storageSet(items, force) {
+        return await readerApi.storage(this.encodeStorageItems({action: 'set', force, items}));
+    }
+
+    encodeStorageItems(request) {
+        let result = Object.assign({}, request);
+        let items = [];
+        for (const item of request.items) {
+            if (!_.isObject(item.data))
+                throw new Error('encodeStorageItems: data is not an object');
+
+            let encoded = Object.assign({}, item);
+
+            const comp = utils.pako.deflate(JSON.stringify(item.data), {level: 1});
+            encoded.data = utils.toBase64(Buffer.from(comp));
+            items.push(encoded);
+        }
+
+        result.items = items;
+        return result;
+    }
+
+    decodeStorageItems(response) {
+        let result = Object.assign({}, response);
+        let items = [];
+        for (const item of response.items) {
+            let decoded = Object.assign({}, item);
+            if (item.data) {
+                if (!_.isString(item.data))
+                    throw new Error('decodeStorageItems: data is not a string');
+                
+                const a = utils.fromBase64(item.data);
+                decoded.data = JSON.parse(utils.pako.inflate(a, {to: 'string'}));
+            }
+            items.push(decoded);
+        }
+
+        result.items = items;
+        return result;
+    }
 }
 //-----------------------------------------------------------------------------
 </script>

+ 1 - 1
client/share/utils.js

@@ -23,7 +23,7 @@ export function hexToString(str) {
 
 export function randomArray(len) {
     const a = new Uint8Array(len);
-    crypto.getRandomValues(a);
+    window.crypto.getRandomValues(a);
     return a;
 }
 

+ 4 - 0
client/store/modules/reader.js

@@ -177,6 +177,7 @@ for (const font of webFonts)
 // initial state
 const state = {
     toolBarActive: true,
+    serverStorageKey: '',
     settings: Object.assign({}, settingDefaults),
 };
 
@@ -191,6 +192,9 @@ const mutations = {
     setToolBarActive(state, value) {
         state.toolBarActive = value;
     },
+    setServerStorageKey(state, value) {
+        state.serverStorageKey = value;
+    },
     setSettings(state, value) {
         state.settings = Object.assign({}, state.settings, value);
     }