badmfck-api-server 2.8.8 → 2.9.0

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.
@@ -89,7 +89,7 @@ async function Initializer(services) {
89
89
  exports.Initializer = Initializer;
90
90
  class APIService extends BaseService_1.BaseService {
91
91
  static nextLogID = 0;
92
- version = "2.8.8";
92
+ version = "2.9.0";
93
93
  options;
94
94
  monitor = null;
95
95
  monitorIndexFile;
@@ -5,19 +5,27 @@ export interface IEPStat {
5
5
  success: number;
6
6
  fail: number;
7
7
  }
8
+ export interface ICustomEvent {
9
+ event: string;
10
+ data?: any;
11
+ project?: string;
12
+ }
8
13
  export interface IEPStatReqFilter {
9
- range: "minute" | "hour" | "day";
10
- from: string;
11
- to: string;
12
- ep: string;
14
+ range?: "minute" | "hour" | "day";
15
+ from?: string;
16
+ to?: string;
17
+ ep?: string;
18
+ project?: string;
19
+ event?: string;
13
20
  }
14
21
  export interface IEPStatResult {
15
22
  }
16
23
  export declare const S_STAT_REGISTRATE_REQUEST: Signal<TransferPacketVO<any>>;
24
+ export declare const S_STAT_REGISTRATE_CUSTOM_EVENT: Signal<ICustomEvent>;
17
25
  export declare const S_STAT_REGISTRATE_SERVICE: Signal<string>;
18
26
  export declare const REQ_EP_STAT: Req<IEPStatReqFilter, IEPStatResult>;
19
27
  export declare class MonitorService extends BaseService {
20
- endpoints: Map<number, Map<string, IEPStat>>;
28
+ projects: Map<string, Map<number, Map<string, IEPStat>>>;
21
29
  constructor();
22
30
  init(): Promise<void>;
23
31
  getEPStat(req: IEPStatReqFilter): Promise<IEPStatResult>;
@@ -23,14 +23,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.MonitorService = exports.REQ_EP_STAT = exports.S_STAT_REGISTRATE_SERVICE = exports.S_STAT_REGISTRATE_REQUEST = void 0;
26
+ exports.MonitorService = exports.REQ_EP_STAT = exports.S_STAT_REGISTRATE_SERVICE = exports.S_STAT_REGISTRATE_CUSTOM_EVENT = exports.S_STAT_REGISTRATE_REQUEST = void 0;
27
27
  const badmfck_signal_1 = __importStar(require("badmfck-signal"));
28
28
  const BaseService_1 = require("./BaseService");
29
29
  exports.S_STAT_REGISTRATE_REQUEST = new badmfck_signal_1.default();
30
+ exports.S_STAT_REGISTRATE_CUSTOM_EVENT = new badmfck_signal_1.default();
30
31
  exports.S_STAT_REGISTRATE_SERVICE = new badmfck_signal_1.default();
31
32
  exports.REQ_EP_STAT = new badmfck_signal_1.Req(undefined, "REQ_EP_STAT");
32
33
  class MonitorService extends BaseService_1.BaseService {
33
- endpoints = new Map();
34
+ projects = new Map();
34
35
  constructor() {
35
36
  super("MonitorService");
36
37
  exports.S_STAT_REGISTRATE_REQUEST.subscribe(req => this.onStatRegistrate(req));
@@ -40,10 +41,16 @@ class MonitorService extends BaseService_1.BaseService {
40
41
  super.init();
41
42
  }
42
43
  async getEPStat(req) {
43
- const result = new Map();
44
- if (req.range === "hour") {
45
- for (let [minute, minuteSlot] of this.endpoints) {
46
- const date = this.getDate(minute);
44
+ const result = [];
45
+ for (let [project, projectSlot] of this.projects) {
46
+ if (req.project && req.project !== project)
47
+ continue;
48
+ let p = result.find(p => p.project === project);
49
+ if (!p) {
50
+ p = { project, dates: [] };
51
+ result.push(p);
52
+ }
53
+ for (let [minute, minuteSlot] of projectSlot) {
47
54
  let range = minute + "";
48
55
  if (req.range === "hour")
49
56
  range = this.pad(this.getDate(minute).getHours());
@@ -57,42 +64,43 @@ class MonitorService extends BaseService_1.BaseService {
57
64
  if (range > req.to)
58
65
  continue;
59
66
  }
60
- let resultSlot = result.get(range);
61
- if (!resultSlot) {
62
- resultSlot = new Map();
63
- result.set(range, resultSlot);
64
- }
65
- let epSlot = resultSlot.get(req.ep);
66
- if (!epSlot) {
67
- epSlot = { success: 0, fail: 0 };
68
- resultSlot.set(req.ep, epSlot);
67
+ let dateSlot = p.dates.find(p => p.date === range);
68
+ if (!dateSlot) {
69
+ dateSlot = {
70
+ date: range,
71
+ endpoints: []
72
+ };
73
+ p.dates.push(dateSlot);
69
74
  }
70
- for (let [ep, stat] of minuteSlot) {
71
- epSlot.success += stat.success;
72
- epSlot.fail += stat.fail;
75
+ for (let [epName, epStatSlot] of minuteSlot) {
76
+ let epSlot = dateSlot.endpoints.find(p => p.ep === epName);
77
+ if (!epSlot) {
78
+ epSlot = {
79
+ ep: epName,
80
+ success: 0,
81
+ fail: 0
82
+ };
83
+ dateSlot.endpoints.push(epSlot);
84
+ }
85
+ epSlot.fail += epStatSlot.fail;
86
+ epSlot.success += epStatSlot.success;
73
87
  }
74
88
  }
75
89
  }
76
- const endResult = [];
77
- for (let [date, obj] of result) {
78
- const stat = {
79
- date,
80
- data: []
81
- };
82
- for (let [ep, s] of obj) {
83
- const r = { ep, ...s };
84
- stat.data.push(r);
85
- }
86
- endResult.push(stat);
87
- }
88
- return { filter: req, result: endResult, overallcount: this.endpoints.size };
90
+ return { filter: req, result: result };
89
91
  }
90
92
  onStatRegistrate(data) {
91
93
  const minute = this.getMinutes(new Date());
92
- let minuteSlot = this.endpoints.get(minute);
94
+ const project = data.project ?? "unknown";
95
+ let projectSlot = this.projects.get(project);
96
+ if (!projectSlot) {
97
+ projectSlot = new Map();
98
+ this.projects.set(project, projectSlot);
99
+ }
100
+ let minuteSlot = projectSlot.get(minute);
93
101
  if (!minuteSlot) {
94
102
  minuteSlot = new Map();
95
- this.endpoints.set(minute, minuteSlot);
103
+ projectSlot.set(minute, minuteSlot);
96
104
  }
97
105
  if (!data.endpoint)
98
106
  data.endpoint = "unknown";
@@ -107,10 +115,10 @@ class MonitorService extends BaseService_1.BaseService {
107
115
  else {
108
116
  epSlot.success++;
109
117
  }
110
- if (this.endpoints.size > 3000) {
111
- const firstItem = this.endpoints.keys().next().value;
118
+ if (projectSlot.size > 3000) {
119
+ const firstItem = projectSlot.keys().next().value;
112
120
  if (firstItem)
113
- this.endpoints.delete(firstItem);
121
+ projectSlot.delete(firstItem);
114
122
  }
115
123
  }
116
124
  pad(num) {
@@ -236,7 +236,7 @@ class MysqlAdapter {
236
236
  }
237
237
  }
238
238
  catch (e) {
239
- (0, LogService_1.logCrit)("MysqlAdapter", `Error when executing query: ${e}`);
239
+ (0, LogService_1.logCrit)("MysqlAdapter", `Error when executing query: ${query}`, e);
240
240
  const error = {
241
241
  code: "EXEC_ERROR",
242
242
  errno: 100002,
@@ -341,7 +341,9 @@ class MysqlAdapter {
341
341
  if (value === null || value === undefined)
342
342
  return "NULL";
343
343
  if (!system && typeof value === "string")
344
- value = value.replaceAll('"', '\\"');
344
+ value = '"' + value.replaceAll('"', '\\"') + '"';
345
+ if (typeof value === "boolean")
346
+ value = value ? 1 : 0;
345
347
  field.__parsedValue = value;
346
348
  return value;
347
349
  }
@@ -16,6 +16,7 @@ export interface TransferPacketVO<T = any> {
16
16
  };
17
17
  file?: string;
18
18
  blockResponse?: boolean;
19
+ project?: string;
19
20
  }
20
21
  export interface HTTPRequestVO<T = any> {
21
22
  raw: any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "badmfck-api-server",
3
- "version": "2.8.8",
3
+ "version": "2.9.0",
4
4
  "description": "Simple API http server based on express",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",