badmfck-api-server 2.8.8 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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",