w-web-perm 1.0.71 → 1.0.74
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/dist/css/app.c0e03d41.css +1 -0
- package/dist/index.tmp +1 -1
- package/dist/js/{app-legacy.a8a679a7.js → app-legacy.9564c1ab.js} +1 -1
- package/dist/js/{app.a8a679a7.js → app.9564c1ab.js} +1 -1
- package/dist/js/{chunk-vendors.644eda7c.js → chunk-vendors-legacy.778356e3.js} +1 -1
- package/dist/js/{chunk-vendors-legacy.644eda7c.js → chunk-vendors.778356e3.js} +1 -1
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +122 -2
- package/docs/WWebPerm.mjs.html +6 -3
- package/docs/index.html +1 -1
- package/package.json +13 -13
- package/server/WWebPerm.mjs +5 -2
- package/server/procLang.mjs +0 -12
- package/server/procStaInfor.mjs +19 -10
- package/server/srLog.mjs +14 -5
- package/server/staLogs/staEvent.callWorker.mjs +5 -40
- package/server/staLogs/staEvent.mjs +6 -112
- package/server/staLogs/staEventTable.callWorker.mjs +11 -0
- package/server/staLogs/staEventTable.mjs +6 -96
- package/server/staLogs/staLogsCore.callWorker.mjs +89 -0
- package/server/staLogs/staLogsCore.mjs +554 -0
- package/server/staLogs/staLogsCore.shellWorker.mjs +28 -0
- package/settings.json +1 -0
- package/src/components/LayoutContentStaInfor.vue +45 -73
- package/tableTags.json +1 -1
- package/dist/css/app.5a2ba039.css +0 -1
- package/logs/2026-06-19T16.log +0 -191
- package/logs/2026-06-19T23.log +0 -0
- package/logs/2026-06-20T00.log +0 -207
- package/logs/2026-06-20T11.log +0 -221
- package/logs/2026-06-20T12.log +0 -146
- package/logs/2026-06-20T13.log +0 -134
- package/logs/2026-06-20T14.log +0 -296
- package/logs/2026-06-20T15.log +0 -225
- package/logs/2026-06-20T16.log +0 -174
- package/logs/2026-06-21T16.log +0 -110
- package/logs/2026-06-21T17.log +0 -301
- package/logs/2026-06-21T18.log +0 -238
- package/logs/2026-06-21T19.log +0 -141
- package/logs/2026-06-21T20.log +0 -99
- package/logs/2026-06-21T21.log +0 -143
- package/logs/2026-06-21T23.log +0 -26
- package/logs/2026-06-22T00.log +0 -33
- package/logs/2026-06-22T08.log +0 -235
- package/logs/2026-06-22T09.log +0 -246
- package/logs/2026-06-22T10.log +0 -301
- package/logs/2026-06-22T11.log +0 -140
- package/logs/2026-06-22T12.log +0 -22
- package/logs/2026-06-22T14.log +0 -44
- package/logs/2026-06-22T23.log +0 -951
- package/logs/2026-06-23T00.log +0 -263
- package/logs/2026-06-23T08.log +0 -611
- package/logs/2026-06-30T21.log +0 -3609
- package/logs/2026-06-30T22.log +0 -3682
- package/logs/2026-06-30T23.log +0 -592
- package/logs/2026-07-01T12.log +0 -0
- package/logs/2026-07-09T22.log +0 -2220
- package/logs/2026-07-09T23.log +0 -1140
- package/logs/2026-07-10T12.log +0 -6
- package/logs/2026-07-10T13.log +0 -351
- package/logs/2026-07-10T16.log +0 -1272
- package/logs/2026-07-10T19.log +0 -6
- package/logs/2026-07-10T20.log +0 -1883
- package/logs/2026-07-10T21.log +0 -3505
- package/logs/2026-07-10T22.log +0 -3395
- package/logs/2026-07-11T00.log +0 -1338
- package/logs/2026-07-11T01.log +0 -2492
- package/logs/2026-07-11T17.log +0 -19
- package/logs/2026-08-25T19.log +0 -4704
- package/logs/2026-08-25T20.log +0 -5144
- package/logs/2026-08-25T21.log +0 -2116
- package/logs/2026-08-26T05.log +0 -1678
- package/logs/2026-08-26T06.log +0 -4561
- package/logs/2026-08-26T07.log +0 -4916
- package/logs/2026-08-26T08.log +0 -260
- package/logs/2026-08-26T09.log +0 -1543
- package/logs/2026-08-26T13.log +0 -2559
- package/logs/2026-08-26T14.log +0 -5526
- package/logs/2026-08-26T15.log +0 -2271
- package/server/staLogs/staEvent.shellWorker.mjs +0 -19
- package/z/344/277/256/346/255/243/350/246/217/345/212/203/346/233/270.md +0 -450
|
@@ -1,102 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import get from 'lodash-es/get.js'
|
|
3
|
-
import each from 'lodash-es/each.js'
|
|
4
|
-
import genPm from 'wsemi/src/genPm.mjs'
|
|
5
|
-
import isestr from 'wsemi/src/isestr.mjs'
|
|
6
|
-
import fsTreeFolder from 'wsemi/src/fsTreeFolder.mjs'
|
|
7
|
-
import fsBuildReadStreamText from 'wsemi/src/fsBuildReadStreamText.mjs'
|
|
8
|
-
import filterVpfsByWindow from './filterVpfsByWindow.mjs'
|
|
1
|
+
import { staTable } from './staLogsCore.mjs'
|
|
9
2
|
|
|
10
3
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
//回傳: [{ event, last1Day, last8Hour, last4Hour, last1Hour }, ...], 依 last1Day 由大到小排序。
|
|
4
|
+
//staEventTable: 各 event 於近 1日/8hr/4hr/1hr 巢狀窗之發生數量 (1hr⊂4hr⊂8hr⊂24hr), 由 staLogsCore 掃近 25 小時之檔取得; 簽章與輸出形狀不變
|
|
5
|
+
//回傳: [{ event, last1Day, last8Hour, last4Hour, last1Hour }, ...], 依 last1Day 由大到小排序
|
|
14
6
|
async function staEventTable(opt = {}) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let fdLog = get(opt, 'fdLog')
|
|
18
|
-
if (!isestr(fdLog)) {
|
|
19
|
-
fdLog = './_logs'
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
//now
|
|
23
|
-
let now = ot()
|
|
24
|
-
|
|
25
|
-
//kp, 各 event 名累計各窗計數
|
|
26
|
-
let kp = {}
|
|
27
|
-
|
|
28
|
-
//vpfs
|
|
29
|
-
let vpfs = fsTreeFolder(fdLog)
|
|
30
|
-
vpfs = filterVpfsByWindow(vpfs, now.subtract(25, 'hour'), 'YYYY-MM-DDTHH') //開檔前剔除窗外檔; 用 25h(非 24h)是因 diff('hour') 取整, 最舊可能到 now-25h, 多留一小時確保不漏讀
|
|
31
|
-
|
|
32
|
-
//逐檔逐行讀取
|
|
33
|
-
for (let vpf of vpfs) {
|
|
34
|
-
|
|
35
|
-
//fp
|
|
36
|
-
let fp = vpf.path
|
|
37
|
-
|
|
38
|
-
//ev
|
|
39
|
-
let ev = fsBuildReadStreamText(fp)
|
|
40
|
-
|
|
41
|
-
//line
|
|
42
|
-
ev.on('line', (line) => {
|
|
43
|
-
try {
|
|
44
|
-
let v = JSON.parse(line)
|
|
45
|
-
let event = v.event
|
|
46
|
-
if (!isestr(event)) {
|
|
47
|
-
return
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
//dh, 距今幾小時(用 dayjs 比較)
|
|
51
|
-
let dh = now.diff(ot(v.time), 'hour')
|
|
52
|
-
if (dh < 0 || dh > 24) {
|
|
53
|
-
return //超過 1日窗或未來時間略過
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
//初始化
|
|
57
|
-
if (!kp[event]) {
|
|
58
|
-
kp[event] = { last1Day: 0, last8Hour: 0, last4Hour: 0, last1Hour: 0 }
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
//巢狀窗各自累計(1hr⊂4hr⊂8hr⊂24hr)
|
|
62
|
-
if (dh <= 24) {
|
|
63
|
-
kp[event].last1Day += 1
|
|
64
|
-
}
|
|
65
|
-
if (dh <= 8) {
|
|
66
|
-
kp[event].last8Hour += 1
|
|
67
|
-
}
|
|
68
|
-
if (dh <= 4) {
|
|
69
|
-
kp[event].last4Hour += 1
|
|
70
|
-
}
|
|
71
|
-
if (dh <= 1) {
|
|
72
|
-
kp[event].last1Hour += 1
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
catch (err) {}
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
//await close
|
|
79
|
-
let pm = genPm()
|
|
80
|
-
ev.on('close', () => {
|
|
81
|
-
pm.resolve()
|
|
82
|
-
})
|
|
83
|
-
await pm
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
//rs
|
|
88
|
-
let rs = []
|
|
89
|
-
each(kp, (vv, event) => {
|
|
90
|
-
rs.push({
|
|
91
|
-
event,
|
|
92
|
-
...vv,
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
//依 last1Day 由大到小排序
|
|
97
|
-
rs.sort((a, b) => b.last1Day - a.last1Day)
|
|
98
|
-
|
|
99
|
-
return rs
|
|
7
|
+
let r = await staTable(opt)
|
|
8
|
+
return r.rs
|
|
100
9
|
}
|
|
101
10
|
|
|
11
|
+
|
|
102
12
|
export default staEventTable
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { fileURLToPath } from 'url'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import { Worker } from 'worker_threads'
|
|
4
|
+
import genPm from 'wsemi/src/genPm.mjs'
|
|
5
|
+
import { staLogs as staLogsCore, staTable as staTableCore } from './staLogsCore.mjs'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
let __filename = fileURLToPath(import.meta.url)
|
|
9
|
+
let __dirname = path.dirname(__filename)
|
|
10
|
+
|
|
11
|
+
let fpWkDefault = path.resolve(__dirname, 'staLogsCore.shellWorker.mjs')
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
//runWorker: 以單一 worker 執行指定 kind 之掃描 (主執行緒不阻塞), 回傳 worker 之 payload; fpWk 可注入 (測試用)
|
|
15
|
+
// 終止路徑一律走 settle(): message(done/error) / error / exit 三者任一先到者定案, 其餘為 no-op, 且皆 terminate 回收
|
|
16
|
+
// exit 為必要: worker 未送任何訊息即結束 (如 worker 內 process.exit) 時若無 exit 監聽, promise 永不落定,
|
|
17
|
+
// 又因 staLogsCore 之 single-flight 以 finally 釋放 in-flight key, 該 key 會永久卡死 (後續同參數呼叫皆取得死 promise, 需重啟後端)
|
|
18
|
+
function runWorker(param, fpWk = fpWkDefault) {
|
|
19
|
+
let pm = genPm()
|
|
20
|
+
|
|
21
|
+
//wk
|
|
22
|
+
let wk = new Worker(fpWk)
|
|
23
|
+
|
|
24
|
+
//settle
|
|
25
|
+
let settled = false
|
|
26
|
+
let settle = (fn, v) => {
|
|
27
|
+
if (!settled) {
|
|
28
|
+
settled = true
|
|
29
|
+
fn(v)
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
wk.terminate()
|
|
33
|
+
}
|
|
34
|
+
catch (err) {}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
wk.on('message', (msg) => {
|
|
38
|
+
if (msg.mode === 'done') {
|
|
39
|
+
settle(pm.resolve, msg.payload)
|
|
40
|
+
}
|
|
41
|
+
else if (msg.mode === 'error') {
|
|
42
|
+
settle(pm.reject, msg.payload)
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
wk.on('error', (err) => {
|
|
47
|
+
settle(pm.reject, err)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
wk.on('exit', (code) => {
|
|
51
|
+
settle(pm.reject, new Error(`staLogs worker exited without result, code=${code}`))
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
wk.postMessage(param)
|
|
55
|
+
|
|
56
|
+
return pm
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
//scanFilesByWorker: staEvent 之「需重掃檔案清單」交 worker
|
|
61
|
+
async function scanFilesByWorker(files, tStartMs, fmt) {
|
|
62
|
+
if (files.length === 0) {
|
|
63
|
+
return [] //無需重掃時不 spawn
|
|
64
|
+
}
|
|
65
|
+
return runWorker({ kind: 'scan', files, tStartMs, fmt })
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
//scanTableFilesByWorker: staEventTable 之近 25 小時檔案清單交 worker
|
|
70
|
+
async function scanTableFilesByWorker(files, nowMs) {
|
|
71
|
+
if (files.length === 0) {
|
|
72
|
+
return { kp: {}, errors: [] }
|
|
73
|
+
}
|
|
74
|
+
return runWorker({ kind: 'table', files, nowMs })
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
function staLogs(timeLength = 7, timeInterval = 'hr', opt = {}) {
|
|
79
|
+
return staLogsCore(timeLength, timeInterval, { ...opt, scanFiles: scanFilesByWorker })
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
function staTable(opt = {}) {
|
|
84
|
+
return staTableCore({ ...opt, scanTableFiles: scanTableFilesByWorker })
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
export { staLogs, staTable, scanFilesByWorker, scanTableFilesByWorker, runWorker }
|
|
89
|
+
export default staLogs
|