n20-common-lib 2.22.53 → 2.22.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n20-common-lib",
3
- "version": "2.22.53",
3
+ "version": "2.22.55",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -68,6 +68,7 @@
68
68
  "v-viewer": "1.6.4",
69
69
  "vue-jsonp": "2.0.0",
70
70
  "vuedraggable": "*",
71
+ "worker-loader": "^3.0.8",
71
72
  "webpack-duplicate-relano-plugin": "^0.1.0",
72
73
  "xe-utils": "^3.5.11",
73
74
  "ngraph.events": "1.2.2"
@@ -34,11 +34,11 @@
34
34
  :show-overflow-tooltip="true"
35
35
  >
36
36
  <div
37
- v-title="item.memberName"
37
+ v-title="`${$lc(item.memberName)}`"
38
38
  :show-overflow-tooltip="true"
39
39
  class="n20-worker text-ellipsis approval-info-member"
40
40
  >
41
- {{ item.memberName }}
41
+ {{ $lc(item.memberName) }}
42
42
  </div>
43
43
  <div
44
44
  v-title="item.deptName"
@@ -148,11 +148,11 @@
148
148
  :show-overflow-tooltip="true"
149
149
  >
150
150
  <div
151
- v-title="row.memberName"
151
+ v-title="`${$lc(row.memberName)}`"
152
152
  :show-overflow-tooltip="true"
153
153
  class="n20-worker text-ellipsis approval-info-member"
154
154
  >
155
- {{ row.memberName }}
155
+ {{ $lc(row.memberName) }}
156
156
  </div>
157
157
  <div
158
158
  v-title="row.deptName"
@@ -509,7 +509,7 @@ export default {
509
509
  businessId: item._details.businessId
510
510
  })
511
511
  } else {
512
- this.$message.error($lc("未配置审批详情链接"))
512
+ this.$message.error($lc('未配置审批详情链接'))
513
513
  }
514
514
  },
515
515
  async seeApproveChild(id) {
@@ -1,5 +1,6 @@
1
1
  import axios from './axios'
2
2
  import { getItem, setItem } from './storageEdit'
3
+ import { persistPermissionItems } from './permissionStorage'
3
4
 
4
5
  /**
5
6
  * @description: 按需/按模块 加载权限
@@ -76,13 +77,21 @@ async function asyncGetRelaNos(appNo, rns) {
76
77
  // 将 ssCltrelaNos 重新赋值给 ssCltrelaNos ,并将 ssCltrelaNos 重新写回到 sessionStorage 中
77
78
  // 将 oRelaNos 重新赋值给 ssRelaNosG ,并将 ssRelaNosG 重新写回到 sessionStorage 中
78
79
  // 如果需要同步,则将 isSync 写回到 sessionStorage 中
79
- setItem('relaNos', ssRelaNos, isSync)
80
- setItem('cltrelaNos', ssCltrelaNos, isSync)
81
-
82
80
  let ssRelaNosG = getItem('relaNosGlobal')
83
81
  ssRelaNosG.push(...oRelaNos)
84
- setItem('relaNosGlobal', ssRelaNosG, isSync)
85
- isSync && sessionStorage.setItem('isSync', isSync)
82
+
83
+ if (isSync) {
84
+ await persistPermissionItems([
85
+ { key: 'relaNos', value: ssRelaNos },
86
+ { key: 'cltrelaNos', value: ssCltrelaNos },
87
+ { key: 'relaNosGlobal', value: ssRelaNosG }
88
+ ])
89
+ sessionStorage.setItem('isSync', isSync)
90
+ } else {
91
+ setItem('relaNos', ssRelaNos, false)
92
+ setItem('cltrelaNos', ssCltrelaNos, false)
93
+ setItem('relaNosGlobal', ssRelaNosG, false)
94
+ }
86
95
  } catch (error) {
87
96
  // 如果请求失败,从已加载列表中移除该模块
88
97
  const index = RLFM.indexOf(appNo)
@@ -0,0 +1,23 @@
1
+ import LZString from 'lz-string'
2
+
3
+ self.onmessage = function ({ data }) {
4
+ if (
5
+ !data ||
6
+ (typeof data.id !== 'number' && typeof data.id !== 'string') ||
7
+ typeof data.value !== 'string'
8
+ ) {
9
+ return
10
+ }
11
+
12
+ try {
13
+ self.postMessage({
14
+ id: data.id,
15
+ compressed: LZString.compressToBase64(data.value)
16
+ })
17
+ } catch (error) {
18
+ self.postMessage({
19
+ id: data.id,
20
+ error: error && error.message ? error.message : 'Compression failed'
21
+ })
22
+ }
23
+ }
@@ -0,0 +1,138 @@
1
+ import PermissionStorageWorker from 'worker-loader?filename=js/permission-storage-worker.[contenthash:8].js!./permission-storage-worker.v1.js'
2
+ import { setItem } from './storageEdit'
3
+
4
+ const LARGE_STORAGE_THRESHOLD = 524288
5
+ const WORKER_TIMEOUT = 30000
6
+ let compressionWorker = null
7
+ let requestSequence = 0
8
+ const pendingRequests = new Map()
9
+
10
+ function rejectPendingRequests(error) {
11
+ pendingRequests.forEach(({ reject, timeoutId }) => {
12
+ clearTimeout(timeoutId)
13
+ reject(error)
14
+ })
15
+ pendingRequests.clear()
16
+ }
17
+
18
+ function disposeWorker(error) {
19
+ if (compressionWorker) {
20
+ compressionWorker.terminate()
21
+ compressionWorker = null
22
+ }
23
+ rejectPendingRequests(error)
24
+ }
25
+
26
+ function getCompressionWorker() {
27
+ if (compressionWorker) return compressionWorker
28
+ if (typeof Worker === 'undefined') return null
29
+
30
+ try {
31
+ compressionWorker = new PermissionStorageWorker()
32
+ } catch (error) {
33
+ compressionWorker = null
34
+ return null
35
+ }
36
+
37
+ compressionWorker.onmessage = ({ data }) => {
38
+ if (!data) return
39
+
40
+ const pending = pendingRequests.get(data.id)
41
+ if (!pending) return
42
+
43
+ clearTimeout(pending.timeoutId)
44
+ pendingRequests.delete(data.id)
45
+
46
+ if (data.error || typeof data.compressed !== 'string') {
47
+ pending.reject(new Error(data.error || 'Invalid compression result'))
48
+ return
49
+ }
50
+
51
+ pending.resolve(data.compressed)
52
+ }
53
+
54
+ compressionWorker.onerror = () => {
55
+ disposeWorker(new Error('Permission compression worker failed'))
56
+ }
57
+
58
+ return compressionWorker
59
+ }
60
+
61
+ function compressInWorker(value) {
62
+ const worker = getCompressionWorker()
63
+ if (!worker) {
64
+ return Promise.reject(
65
+ new Error('Permission compression worker is unavailable')
66
+ )
67
+ }
68
+
69
+ return new Promise((resolve, reject) => {
70
+ const id = ++requestSequence
71
+ const timeoutId = setTimeout(() => {
72
+ if (!pendingRequests.has(id)) return
73
+ disposeWorker(new Error('Permission compression worker timed out'))
74
+ }, WORKER_TIMEOUT)
75
+
76
+ pendingRequests.set(id, { resolve, reject, timeoutId })
77
+ worker.postMessage({ id, value })
78
+ })
79
+ }
80
+
81
+ function writeCompressedValue(key, compressed) {
82
+ const storage = window.sessionStorage
83
+ const rawSetItem = storage._setItem
84
+ const rawRemoveItem = storage._removeItem
85
+
86
+ if (
87
+ typeof rawSetItem !== 'function' ||
88
+ typeof rawRemoveItem !== 'function'
89
+ ) {
90
+ throw new Error('Extended Storage API is unavailable')
91
+ }
92
+
93
+ try {
94
+ rawSetItem.call(storage, `${key}:[LZ]`, compressed)
95
+ rawRemoveItem.call(storage, key)
96
+ } catch (error) {
97
+ // A previous uncompressed value can consume the remaining quota.
98
+ rawRemoveItem.call(storage, key)
99
+ rawSetItem.call(storage, `${key}:[LZ]`, compressed)
100
+ }
101
+ }
102
+
103
+ async function persistItem({ key, value, serialized }) {
104
+ if (
105
+ typeof serialized !== 'string' ||
106
+ serialized.length <= LARGE_STORAGE_THRESHOLD
107
+ ) {
108
+ window.sessionStorage.setItem(key, serialized)
109
+ return
110
+ }
111
+
112
+ try {
113
+ const compressed = await compressInWorker(serialized)
114
+ writeCompressedValue(key, compressed)
115
+ } catch (error) {
116
+ // Preserve the existing synchronous behavior when Worker is unavailable.
117
+ setItem(key, value, true)
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Persist permission objects with the same cache keys and LZ storage format
123
+ * used by n20-common-lib, while moving large compression work off main thread.
124
+ */
125
+ export async function persistPermissionItems(items) {
126
+ const serializedItems = items.map(({ key, value }) => {
127
+ window[`_keep_${key}`] = value
128
+ return {
129
+ key,
130
+ value,
131
+ serialized: JSON.stringify(value)
132
+ }
133
+ })
134
+
135
+ for (const item of serializedItems) {
136
+ await persistItem(item)
137
+ }
138
+ }