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.
Files changed (82) hide show
  1. package/dist/css/app.c0e03d41.css +1 -0
  2. package/dist/index.tmp +1 -1
  3. package/dist/js/{app-legacy.a8a679a7.js → app-legacy.9564c1ab.js} +1 -1
  4. package/dist/js/{app.a8a679a7.js → app.9564c1ab.js} +1 -1
  5. package/dist/js/{chunk-vendors.644eda7c.js → chunk-vendors-legacy.778356e3.js} +1 -1
  6. package/dist/js/{chunk-vendors-legacy.644eda7c.js → chunk-vendors.778356e3.js} +1 -1
  7. package/dist/w-web-perm.umd.js +2 -2
  8. package/dist/w-web-perm.umd.js.map +1 -1
  9. package/docs/WWebPerm.html +122 -2
  10. package/docs/WWebPerm.mjs.html +6 -3
  11. package/docs/index.html +1 -1
  12. package/package.json +13 -13
  13. package/server/WWebPerm.mjs +5 -2
  14. package/server/procLang.mjs +0 -12
  15. package/server/procStaInfor.mjs +19 -10
  16. package/server/srLog.mjs +14 -5
  17. package/server/staLogs/staEvent.callWorker.mjs +5 -40
  18. package/server/staLogs/staEvent.mjs +6 -112
  19. package/server/staLogs/staEventTable.callWorker.mjs +11 -0
  20. package/server/staLogs/staEventTable.mjs +6 -96
  21. package/server/staLogs/staLogsCore.callWorker.mjs +89 -0
  22. package/server/staLogs/staLogsCore.mjs +554 -0
  23. package/server/staLogs/staLogsCore.shellWorker.mjs +28 -0
  24. package/settings.json +1 -0
  25. package/src/components/LayoutContentStaInfor.vue +45 -73
  26. package/tableTags.json +1 -1
  27. package/dist/css/app.5a2ba039.css +0 -1
  28. package/logs/2026-06-19T16.log +0 -191
  29. package/logs/2026-06-19T23.log +0 -0
  30. package/logs/2026-06-20T00.log +0 -207
  31. package/logs/2026-06-20T11.log +0 -221
  32. package/logs/2026-06-20T12.log +0 -146
  33. package/logs/2026-06-20T13.log +0 -134
  34. package/logs/2026-06-20T14.log +0 -296
  35. package/logs/2026-06-20T15.log +0 -225
  36. package/logs/2026-06-20T16.log +0 -174
  37. package/logs/2026-06-21T16.log +0 -110
  38. package/logs/2026-06-21T17.log +0 -301
  39. package/logs/2026-06-21T18.log +0 -238
  40. package/logs/2026-06-21T19.log +0 -141
  41. package/logs/2026-06-21T20.log +0 -99
  42. package/logs/2026-06-21T21.log +0 -143
  43. package/logs/2026-06-21T23.log +0 -26
  44. package/logs/2026-06-22T00.log +0 -33
  45. package/logs/2026-06-22T08.log +0 -235
  46. package/logs/2026-06-22T09.log +0 -246
  47. package/logs/2026-06-22T10.log +0 -301
  48. package/logs/2026-06-22T11.log +0 -140
  49. package/logs/2026-06-22T12.log +0 -22
  50. package/logs/2026-06-22T14.log +0 -44
  51. package/logs/2026-06-22T23.log +0 -951
  52. package/logs/2026-06-23T00.log +0 -263
  53. package/logs/2026-06-23T08.log +0 -611
  54. package/logs/2026-06-30T21.log +0 -3609
  55. package/logs/2026-06-30T22.log +0 -3682
  56. package/logs/2026-06-30T23.log +0 -592
  57. package/logs/2026-07-01T12.log +0 -0
  58. package/logs/2026-07-09T22.log +0 -2220
  59. package/logs/2026-07-09T23.log +0 -1140
  60. package/logs/2026-07-10T12.log +0 -6
  61. package/logs/2026-07-10T13.log +0 -351
  62. package/logs/2026-07-10T16.log +0 -1272
  63. package/logs/2026-07-10T19.log +0 -6
  64. package/logs/2026-07-10T20.log +0 -1883
  65. package/logs/2026-07-10T21.log +0 -3505
  66. package/logs/2026-07-10T22.log +0 -3395
  67. package/logs/2026-07-11T00.log +0 -1338
  68. package/logs/2026-07-11T01.log +0 -2492
  69. package/logs/2026-07-11T17.log +0 -19
  70. package/logs/2026-08-25T19.log +0 -4704
  71. package/logs/2026-08-25T20.log +0 -5144
  72. package/logs/2026-08-25T21.log +0 -2116
  73. package/logs/2026-08-26T05.log +0 -1678
  74. package/logs/2026-08-26T06.log +0 -4561
  75. package/logs/2026-08-26T07.log +0 -4916
  76. package/logs/2026-08-26T08.log +0 -260
  77. package/logs/2026-08-26T09.log +0 -1543
  78. package/logs/2026-08-26T13.log +0 -2559
  79. package/logs/2026-08-26T14.log +0 -5526
  80. package/logs/2026-08-26T15.log +0 -2271
  81. package/server/staLogs/staEvent.shellWorker.mjs +0 -19
  82. 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 ot from 'dayjs'
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
- //統計各 event 事件於近 1日/8hr/4hr/1hr 各窗內之發生數量(鏡像 staEvent.mjs 的 NDJSON 讀取方式)。
12
- //巢狀窗:1hr⊂4hr⊂8hr⊂24hr, 各窗各自累計該窗內出現總數。
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
- //fdLog
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