Commit 4252778e44fe0ef8de04c02f32c9a4abce5a8db3

Authored by ww
1 parent 88957d05

perf: add prod env decode storage

1   -// const { encrypt, decrypt } = CryptoJS.AES
2   -// const parse = CryptoJS.enc.Utf8;
3   -// const pkcs7 = CryptoJS.pad.Pkcs7;
4   -// const ECB = CryptoJS.mode.ECB;
5   -// const UTF8 = CryptoJS.enc.Utf8;
6   -//
7   -// const cacheCipher = {
8   -// key: '_11111000001111@',
9   -// iv: '@11111000001111_',
10   -// }
11   -//
12   -// const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7;
13   -//
14   -// const isNullOrUnDef = (val) => typeof val === 'undefined' || val === null
15   -//
16   -// class AesEncryption {
17   -// key;
18   -// iv;
19   -//
20   -// constructor(opt = {}) {
21   -// const { key, iv } = opt;
22   -// if (key) {
23   -// this.key = parse(key);
24   -// }
25   -// if (iv) {
26   -// this.iv = parse(iv);
27   -// }
28   -// }
29   -//
30   -// get getOptions() {
31   -// return {
32   -// mode: ECB,
33   -// padding: pkcs7,
34   -// iv: this.iv,
35   -// };
36   -// }
37   -//
38   -// encryptByAES(cipherText) {
39   -// return encrypt(cipherText, this.key, this.getOptions).toString();
40   -// }
41   -//
42   -// decryptByAES(cipherText) {
43   -// return decrypt(cipherText, this.key, this.getOptions).toString(UTF8);
44   -// }
45   -// }
46   -//
47   -//
48   -// const createStorage = (
49   -// {
50   -// prefixKey = '',
51   -// storage = sessionStorage,
52   -// key = cacheCipher.key,
53   -// iv = cacheCipher.iv,
54   -// timeout = null,
55   -// hasEncrypt = true,
56   -// } = {}) => {
57   -// if (hasEncrypt && [ key.length, iv.length ].some((item) => item !== 16)) {
58   -// throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!');
59   -// }
60   -//
61   -// const encryption = new AesEncryption({ key, iv });
62   -//
63   -// /**
64   -// *Cache class
65   -// *Construction parameters can be passed into sessionStorage, localStorage,
66   -// * @class Cache
67   -// * @example
68   -// */
69   -// const WebStorage = class WebStorage {
70   -// storage
71   -// prefixKey
72   -// encryption
73   -// hasEncrypt
74   -//
75   -// /**
76   -// *
77   -// * @param {*} storage
78   -// */
79   -// constructor() {
80   -// this.storage = storage;
81   -// this.prefixKey = prefixKey;
82   -// this.encryption = encryption;
83   -// this.hasEncrypt = hasEncrypt;
84   -// }
85   -//
86   -// getKey(key) {
87   -// return `${ this.prefixKey }${ key }`.toUpperCase();
88   -// }
89   -//
90   -// /**
91   -// *
92   -// * Set cache
93   -// * @param {string} key
94   -// * @param {*} value
95   -// * @param {*} expire
96   -// * @expire Expiration time in seconds
97   -// * @memberof Cache
98   -// */
99   -// set(key, value, expire = timeout) {
100   -// const stringData = JSON.stringify({
101   -// value,
102   -// time: Date.now(),
103   -// expire: !isNullOrUnDef(expire) ? new Date().getTime() + expire * 1000 : null,
104   -// });
105   -// const stringifyValue = this.hasEncrypt
106   -// ? this.encryption.encryptByAES(stringData)
107   -// : stringData;
108   -// this.storage.setItem(this.getKey(key), stringifyValue);
109   -// }
110   -//
111   -// /**
112   -// *Read cache
113   -// * @param {string} key
114   -// * @param {any} [def=null] def
115   -// * @memberof Cache
116   -// */
117   -// get(key, def = null) {
118   -// const val = this.storage.getItem(this.getKey(key));
119   -// if (!val) return def;
120   -//
121   -// try {
122   -// const decVal = this.hasEncrypt ? this.encryption.decryptByAES(val) : val;
123   -// const data = JSON.parse(decVal);
124   -// const { value, expire } = data;
125   -// if (isNullOrUnDef(expire) || expire >= new Date().getTime()) {
126   -// return value;
127   -// }
128   -// this.remove(key);
129   -// } catch (e) {
130   -// return def;
131   -// }
132   -// }
133   -//
134   -// /**
135   -// * Delete cache based on key
136   -// * @param {string} key
137   -// * @memberof Cache
138   -// */
139   -// remove(key) {
140   -// this.storage.removeItem(this.getKey(key));
141   -// }
142   -//
143   -// /**
144   -// * Delete all caches of this instance
145   -// */
146   -// clear() {
147   -// this.storage.clear();
148   -// }
149   -// };
150   -// return new WebStorage();
151   -// }
152   -
153 1 const GLOBAL_STORAGE_KEY = (() => {
154   - const isDev = location.href.includes('dev=1')
155 2 const DEVELOPMENT = 'DEVELOPMENT'
156 3 const PRODUCTION = 'PRODUCTION'
157   - return `UNDEFINED__${ isDev ? DEVELOPMENT : PRODUCTION }__2.7.1__COMMON__LOCAL__KEY__`
  4 + return `UNDEFINED__${ isDEV ? DEVELOPMENT : PRODUCTION }__2.7.1__COMMON__LOCAL__KEY__`
158 5 })()
159 6
160 7 const GLOBAL_TOKEN = (() => {
161   - return JSON.parse(localStorage.getItem(GLOBAL_STORAGE_KEY)).value.JWT_TOKEN.value
  8 + const ls = createStorage({ storage: localStorage })
  9 + /**
  10 + * @description user info
  11 + * @type {{JWT_TOKEN: {value: string}}}
  12 + */
  13 + const common = ls.get(GLOBAL_STORAGE_KEY)
  14 + return common.JWT_TOKEN.value
162 15 })()
163 16
164 17 const GLOBAL_WS_URL = (() => {
... ...
  1 +const { encrypt, decrypt } = CryptoJS.AES
  2 +const { parse } = CryptoJS.enc.Utf8;
  3 +const pkcs7 = CryptoJS.pad.Pkcs7;
  4 +const ECB = CryptoJS.mode.ECB;
  5 +const UTF8 = CryptoJS.enc.Utf8;
  6 +
  7 +const isDEV = location.href.includes('dev=1')
  8 +
  9 +const cacheCipher = {
  10 + key: '_11111000001111@',
  11 + iv: '@11111000001111_',
  12 +}
  13 +
  14 +const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7;
  15 +
  16 +const isNullOrUnDef = (val) => typeof val === 'undefined' || val === null
  17 +
  18 +class AesEncryption {
  19 + key;
  20 + iv;
  21 +
  22 + constructor(opt = {}) {
  23 + const { key, iv } = opt;
  24 + if (key) {
  25 + this.key = parse(key);
  26 + }
  27 + if (iv) {
  28 + this.iv = parse(iv);
  29 + }
  30 + }
  31 +
  32 + get getOptions() {
  33 + return {
  34 + mode: ECB,
  35 + padding: pkcs7,
  36 + iv: this.iv,
  37 + };
  38 + }
  39 +
  40 + encryptByAES(cipherText) {
  41 + return encrypt(cipherText, this.key, this.getOptions).toString();
  42 + }
  43 +
  44 + decryptByAES(cipherText) {
  45 + return decrypt(cipherText, this.key, this.getOptions).toString(UTF8);
  46 + }
  47 +}
  48 +
  49 +
  50 +const createStorage = (
  51 + {
  52 + prefixKey = '',
  53 + storage = sessionStorage,
  54 + key = cacheCipher.key,
  55 + iv = cacheCipher.iv,
  56 + timeout = null,
  57 + hasEncrypt = !isDEV,
  58 + } = {}) => {
  59 + if (hasEncrypt && [ key.length, iv.length ].some((item) => item !== 16)) {
  60 + throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!');
  61 + }
  62 +
  63 + const encryption = new AesEncryption({ key, iv });
  64 +
  65 + /**
  66 + *Cache class
  67 + *Construction parameters can be passed into sessionStorage, localStorage,
  68 + * @class Cache
  69 + * @example
  70 + */
  71 + const WebStorage = class WebStorage {
  72 + storage
  73 + prefixKey
  74 + encryption
  75 + hasEncrypt
  76 +
  77 + /**
  78 + *
  79 + * @param {*} storage
  80 + */
  81 + constructor() {
  82 + this.storage = storage;
  83 + this.prefixKey = prefixKey;
  84 + this.encryption = encryption;
  85 + this.hasEncrypt = hasEncrypt;
  86 + }
  87 +
  88 + getKey(key) {
  89 + return `${ this.prefixKey }${ key }`.toUpperCase();
  90 + }
  91 +
  92 + /**
  93 + *
  94 + * Set cache
  95 + * @param {string} key
  96 + * @param {*} value
  97 + * @param {*} expire
  98 + * @expire Expiration time in seconds
  99 + * @memberof Cache
  100 + */
  101 + set(key, value, expire = timeout) {
  102 + const stringData = JSON.stringify({
  103 + value,
  104 + time: Date.now(),
  105 + expire: !isNullOrUnDef(expire) ? new Date().getTime() + expire * 1000 : null,
  106 + });
  107 + const stringifyValue = this.hasEncrypt
  108 + ? this.encryption.encryptByAES(stringData)
  109 + : stringData;
  110 + this.storage.setItem(this.getKey(key), stringifyValue);
  111 + }
  112 +
  113 + /**
  114 + *Read cache
  115 + * @param {string} key
  116 + * @param {any} [def=null] def
  117 + * @memberof Cache
  118 + */
  119 + get(key, def = null) {
  120 + const val = this.storage.getItem(this.getKey(key));
  121 + if (!val) return def;
  122 +
  123 + try {
  124 + const decVal = this.hasEncrypt ? this.encryption.decryptByAES(val) : val;
  125 + const data = JSON.parse(decVal);
  126 + const { value, expire } = data;
  127 + if (isNullOrUnDef(expire) || expire >= new Date().getTime()) {
  128 + return value;
  129 + }
  130 + this.remove(key);
  131 + } catch (e) {
  132 + return def;
  133 + }
  134 + }
  135 +
  136 + /**
  137 + * Delete cache based on key
  138 + * @param {string} key
  139 + * @memberof Cache
  140 + */
  141 + remove(key) {
  142 + this.storage.removeItem(this.getKey(key));
  143 + }
  144 +
  145 + /**
  146 + * Delete all caches of this instance
  147 + */
  148 + clear() {
  149 + this.storage.clear();
  150 + }
  151 + };
  152 + return new WebStorage();
  153 +}
\ No newline at end of file
... ...
... ... @@ -597,7 +597,7 @@ App.main = function(callback, createUi)
597 597 defHttp = createAxios({
598 598 timeout:10*1000,
599 599 baseURL:'/api',
600   - token: JSON.parse(localStorageInfo).value.JWT_TOKEN.value
  600 + token: GLOBAL_TOKEN
601 601 })
602 602 // Logs uncaught errors
603 603 window.onerror = function(message, url, linenumber, colno, err)
... ...