import { getStoreKey } from "@/api/lock"; import storage from "@/libs/storage"; import { getNoteMetaNew, getNoteBlob } from "@/api/note"; import { reject } from "bluebird"; import { unwrap, md5 } from '@/libs/secret' export async function initPageData(view) { let noteKey = view.noteForm.key; let storeKey = getStoreKey(noteKey); view.secret.storeKey = storeKey; let keyMeta = storage.session.getObject("keyMeta"); if (keyMeta) { view.state.lock = 0; view.secret.cipher = keyMeta.cipher; view.secret.secretKey = keyMeta.secretKey; view.state.serverTime = keyMeta.serverTime; // key init Time view.state.initTime = keyMeta.serverTime; await storage.local.setText(storeKey, "0|" + view.secret.cipher + "|0|" + view.state.initTime + "|"); storage.session.delete("keyMeta"); return "000000"; } let noteMeta = storage.session.getObject(noteKey+".noteMeta"); if(null==noteMeta){ let resp = await getNoteMetaNew(view.noteForm.key); if (null == resp || null == resp.data) { return "100006"; } let result = resp.data; if (result.code != '000000') { return result.code; } let noteMeta = result.data; if (null == noteMeta) { return "100001"; } if (null == noteMeta.key) { return "100002"; } storage.session.setObject(noteKey+".noteMeta",noteMeta); }else{ getNoteMetaNew(view.noteForm.key).then(function(resp){ if (null == resp || null == resp.data) { return "100006"; } let result = resp.data; if (result.code != '000000') { return result.code; } let noteMeta = result.data; if (null == noteMeta) { return "100001"; } if (null == noteMeta.key) { return "100002"; } }); } //view if (1 == noteMeta.state) { view.secret.secretKey = noteMeta.secretKey; view.state.lock = noteMeta.lock; view.state.initTime = new Date().getTime(); view.state.initTtl = noteMeta.ttl; view.state.ttl = noteMeta.ttl; view.state.serverTime = noteMeta.serverTime; view.secret.cipher = "00000000000000000000000000000000";//noteMeta.cipher; //读者有没有值可配置 view.secret.md5 = noteMeta.md5; await loadText(view); return "000000"; } //deleted if (0 == noteMeta.state) { let storeKey = getStoreKey(noteKey); storage.local.delete(storeKey); // user deleted if (noteMeta.ttl > 0) { // errorMeta = 100003; return "100003"; //return errorRouter(100003); } else {// timeout // errorMeta = 100004; return "100004"; //return errorRouter(100004); } } //edit or unsubmitted if (null == noteMeta.state) { let storeKey = getStoreKey(noteKey); const storeInfo = await storage.local.getText(storeKey); //if has storage , then edit if (null != storeInfo) { view.secret.secretKey = noteMeta.secretKey; let starray = storeInfo.split('|'); view.state.lock = parseInt(starray[0]); view.secret.cipher = starray[1]; view.state.initTime = parseInt(starray[3]); //draw text; if (starray[4]) { view.noteForm.text = unwrap(starray[4], view.secret.secretKey); } return "000000"; } //storage is empty let df = storage.session.getText(storeKey + "_delete") if (df) {//unsubmitted,user deleted. // errorMeta = 100003; return "100003"; } else {//unsubmitted // errorMeta = 100005; return "100005"; } } } async function loadText(view) { let storeInfo = await storage.local.getText(view.secret.storeKey); let starray = []; if (storeInfo) { starray = storeInfo.split('|'); } if (!storeInfo || !starray[4] || (md5(starray[4]) != view.secret.md5)) { let bytesString = await getServerNote(view.noteForm.key); view.noteForm.text = unwrap(bytesString, view.secret.secretKey); } else { starray = storeInfo.split('|'); if (!starray[4]) { return; } view.noteForm.text = unwrap(starray[4], view.secret.secretKey); //this.noteForm.escapeText = getEscapeText(this.noteForm.text); // local is usable, and set commited flag if ("0" == starray[2]) { storage.local.setText(this.secret.storeKey, starray[0] + "|" + starray[1] + "|1|" + starray[3] + "|" + starray[4]); } } } async function getServerNote(key) { let resp = await getNoteBlob(key) if (!resp.data || resp.data.size == 0) { return "100006"; } let blob = new Blob([resp.data], { type: resp.data.type }); let bytesString = await fileReader(blob); return bytesString; } async function fileReader(blob) { return new Promise(function (resolve) { let reader = new FileReader(); reader.onload = function (e) { if (!e.target.result || e.target.result.byteLength == 0) { reject(""); } var bytes = new Uint8Array(e.target.result); bytes = bytes.subarray(7, bytes.length - 7); let bytesString = bytes.join(","); resolve(bytesString); }; reader.readAsArrayBuffer(blob) }); }