badmfck-api-server 1.5.8 → 1.6.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.
@@ -47,7 +47,7 @@ async function Initializer(services) {
47
47
  exports.Initializer = Initializer;
48
48
  class APIService extends BaseService_1.BaseService {
49
49
  static nextLogID = 0;
50
- version = "1.5.5";
50
+ version = "1.6.0";
51
51
  options;
52
52
  monitor;
53
53
  monitorIndexFile;
@@ -63,11 +63,11 @@ class APIService extends BaseService_1.BaseService {
63
63
  if (this.options.monitor && this.options.monitor.length > 0) {
64
64
  this.monitor = new Monitor_1.Monitor();
65
65
  this.options.endpoints.push(this.monitor);
66
- console.log("Service Monitor initialized");
67
- console.log("monitor links:");
66
+ console.warn("Service Monitor initialized");
67
+ console.warn("monitor links:");
68
68
  for (let i of this.options.monitor) {
69
69
  const hash = crypto_1.default.createHash("sha256").update(i.login + i.password).digest().toString("hex");
70
- console.log("/sm-" + hash);
70
+ console.warn(i.login + " -> /sm-" + hash);
71
71
  }
72
72
  }
73
73
  }
@@ -16,7 +16,7 @@ export interface ILogItem {
16
16
  source: string;
17
17
  }
18
18
  export interface ILogServiceOptions {
19
- output?: (data?: any) => void;
19
+ output?: (data: ILogItem) => void;
20
20
  stackSize: number;
21
21
  level: LOG_LEVEL;
22
22
  textLimit: number;
@@ -153,8 +153,9 @@ class LogService extends BaseService_1.BaseService {
153
153
  date: this.createDate(d),
154
154
  source: source
155
155
  };
156
- if (this.options.output)
157
- this.options.output(logitem.source + " > " + logitem.level + " > " + logitem.date + " > " + text);
156
+ if (this.options.output) {
157
+ this.options.output(logitem);
158
+ }
158
159
  exports.S_LOG_CREATED.invoke(logitem);
159
160
  this.log.push(logitem);
160
161
  let limit = this.options.stackSize ?? 100;
@@ -1,5 +1,9 @@
1
+ import { Signal } from "badmfck-signal";
1
2
  import { BaseEndpoint } from "../BaseEndpoint";
2
3
  import { HTTPRequestVO, TransferPacketVO } from "../structures/Interfaces";
4
+ export interface IUserAction {
5
+ action: string;
6
+ }
3
7
  interface IStatObject {
4
8
  requests: Map<string, number>;
5
9
  errors: Map<string, number>;
@@ -7,16 +11,19 @@ interface IStatObject {
7
11
  apiErrors: Map<string, number>;
8
12
  }
9
13
  interface ISystemStat {
10
- cpuUsage: number;
14
+ cpuUsage: any;
11
15
  memoryTotal: number;
12
16
  memoryUsage: any;
13
17
  }
18
+ export declare const S_MONITOR_REGISTRATE_ACTION: Signal<IUserAction>;
14
19
  export declare class Monitor extends BaseEndpoint {
15
20
  ignoreHttpLogging: boolean;
16
- private startedAt;
17
21
  private httpRequests;
18
22
  private systemStat;
23
+ private userActions;
24
+ private registeredActions;
19
25
  constructor();
26
+ registrateAction(data: IUserAction): void;
20
27
  addSystemStat(): void;
21
28
  registrateError(endpoint: string): void;
22
29
  registrateFatalError(endpoint: string): void;
@@ -33,9 +40,9 @@ export declare class Monitor extends BaseEndpoint {
33
40
  netlog(req: HTTPRequestVO): Promise<TransferPacketVO<any>>;
34
41
  metrics(req: HTTPRequestVO): Promise<TransferPacketVO<any>>;
35
42
  serverStat(req: HTTPRequestVO): Promise<TransferPacketVO<any>>;
36
- mapToKeyValue(map: Map<string, number>): {
43
+ mapToKeyValue(map: Map<string, string | number>): {
37
44
  name: string;
38
- value: number;
45
+ value: string | number;
39
46
  }[];
40
47
  }
41
48
  export {};
@@ -3,19 +3,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Monitor = void 0;
6
+ exports.Monitor = exports.S_MONITOR_REGISTRATE_ACTION = void 0;
7
+ const badmfck_signal_1 = require("badmfck-signal");
7
8
  const APIService_1 = require("../APIService");
8
9
  const BaseEndpoint_1 = require("../BaseEndpoint");
9
10
  const LogService_1 = require("../LogService");
10
11
  const crypto_1 = __importDefault(require("crypto"));
11
12
  const os_1 = __importDefault(require("os"));
13
+ exports.S_MONITOR_REGISTRATE_ACTION = new badmfck_signal_1.Signal();
12
14
  class Monitor extends BaseEndpoint_1.BaseEndpoint {
13
15
  ignoreHttpLogging = true;
14
- startedAt = +new Date();
15
16
  httpRequests = new Map();
16
17
  systemStat = new Map();
18
+ userActions = new Map();
19
+ registeredActions = 0;
17
20
  constructor() {
18
21
  super("sys-monitor");
22
+ exports.S_MONITOR_REGISTRATE_ACTION.subscribe(data => this.registrateAction(data));
19
23
  this.registerEndpoints([
20
24
  { ignoreInterceptor: true, endpoint: "log", handler: this.logs },
21
25
  { ignoreInterceptor: true, endpoint: "netlog", handler: this.netlog },
@@ -27,6 +31,38 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
27
31
  }, 1000 * 60 * 10);
28
32
  this.addSystemStat();
29
33
  }
34
+ registrateAction(data) {
35
+ if (!data.action)
36
+ return;
37
+ if (typeof data.action !== "string")
38
+ return;
39
+ if (data.action.length > 20)
40
+ data.action = data.action.substring(0, 20);
41
+ const d = new Date();
42
+ const doy = this.getDateIndex(d);
43
+ let day = this.userActions.get(doy);
44
+ if (!day) {
45
+ day = new Map();
46
+ this.userActions.set(doy, day);
47
+ if (this.userActions.size > 7) {
48
+ for (let i of this.userActions) {
49
+ this.userActions.delete(i[0]);
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ const minute = this.getHourMinuteIndex(d);
55
+ let m = day.get(minute);
56
+ if (!m) {
57
+ m = new Map();
58
+ day.set(minute, m);
59
+ }
60
+ let cnt = m.get(data.action);
61
+ if (!cnt)
62
+ cnt = 0;
63
+ cnt++;
64
+ m.set(data.action, cnt);
65
+ }
30
66
  addSystemStat() {
31
67
  const so = this.createSystemStatObj();
32
68
  so.memoryUsage = process.memoryUsage();
@@ -54,6 +90,7 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
54
90
  reqep = 0;
55
91
  reqep += 1;
56
92
  statObject.set(endpoint, reqep);
93
+ this.registeredActions++;
57
94
  }
58
95
  createStatObj() {
59
96
  const d = new Date();
@@ -62,7 +99,7 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
62
99
  if (!day) {
63
100
  day = new Map();
64
101
  this.httpRequests.set(dtm, day);
65
- if (this.httpRequests.size > 14) {
102
+ if (this.httpRequests.size > 7) {
66
103
  for (let i of this.httpRequests) {
67
104
  this.httpRequests.delete(i[0]);
68
105
  break;
@@ -89,7 +126,7 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
89
126
  if (!day) {
90
127
  day = new Map();
91
128
  this.systemStat.set(dtm, day);
92
- if (this.systemStat.size > 14) {
129
+ if (this.systemStat.size > 7) {
93
130
  for (let i of this.systemStat) {
94
131
  this.systemStat.delete(i[0]);
95
132
  break;
@@ -162,27 +199,58 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
162
199
  const date = new Date();
163
200
  const di = this.getDateIndex(date);
164
201
  const stat = this.httpRequests.get(di);
202
+ let result = [];
203
+ if (stat) {
204
+ for (let minutes of stat) {
205
+ result.push({
206
+ m: minutes[0],
207
+ ae: this.mapToKeyValue(minutes[1].apiErrors),
208
+ e: this.mapToKeyValue(minutes[1].errors),
209
+ r: this.mapToKeyValue(minutes[1].requests),
210
+ fe: this.mapToKeyValue(minutes[1].fatalErrors),
211
+ });
212
+ }
213
+ }
214
+ const ua = this.userActions.get(di);
215
+ let uaResult = [];
216
+ if (ua) {
217
+ for (let i of ua) {
218
+ const minutes = i[1];
219
+ const mArray = [];
220
+ for (let j of i[0]) {
221
+ mArray.push({
222
+ action: j[0],
223
+ count: j[1]
224
+ });
225
+ }
226
+ result.push({
227
+ m: i[0],
228
+ data: mArray
229
+ });
230
+ }
231
+ }
232
+ return { data: { stat: result, date: +date, userActions: uaResult } };
233
+ }
234
+ async serverStat(req) {
235
+ const date = new Date();
236
+ const di = this.getDateIndex(date);
237
+ const stat = this.systemStat.get(di);
165
238
  if (!stat)
166
239
  return { data: [] };
167
240
  let result = [];
168
241
  for (let minutes of stat) {
169
242
  result.push({
170
243
  m: minutes[0],
171
- ae: this.mapToKeyValue(minutes[1].apiErrors),
172
- e: this.mapToKeyValue(minutes[1].errors),
173
- r: this.mapToKeyValue(minutes[1].requests),
174
- fe: this.mapToKeyValue(minutes[1].fatalErrors),
244
+ mt: minutes[1].memoryTotal,
245
+ mu: minutes[1].memoryUsage,
246
+ cu: minutes[1].cpuUsage,
175
247
  });
176
248
  }
177
- return { data: { stat: result, date: +date } };
178
- }
179
- async serverStat(req) {
180
249
  return { data: {
181
- memory: {
182
- cpus: os_1.default.cpus(),
183
- uptime: process.uptime,
184
- osUptime: os_1.default.uptime
185
- }
250
+ registeredActions: this.registeredActions,
251
+ uptime: process.uptime(),
252
+ osUptime: os_1.default.uptime(),
253
+ stat: result
186
254
  } };
187
255
  }
188
256
  mapToKeyValue(map) {
package/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ import { LocalRequest } from "./apiServer/LocalRequest";
3
3
  import { MysqlService } from "./apiServer/MysqlService";
4
4
  import { Validator } from "./apiServer/helper/Validator";
5
5
  import { LogService } from "./apiServer/LogService";
6
- export { APIService, Initializer, LocalRequest, MysqlService, Validator, LogService };
6
+ import { S_MONITOR_REGISTRATE_ACTION } from "./apiServer/monitor/Monitor";
7
+ export { APIService, Initializer, LocalRequest, MysqlService, Validator, LogService, S_MONITOR_REGISTRATE_ACTION };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogService = exports.Validator = exports.MysqlService = exports.LocalRequest = exports.Initializer = exports.APIService = void 0;
3
+ exports.S_MONITOR_REGISTRATE_ACTION = exports.LogService = exports.Validator = exports.MysqlService = exports.LocalRequest = exports.Initializer = exports.APIService = void 0;
4
4
  const APIService_1 = require("./apiServer/APIService");
5
5
  Object.defineProperty(exports, "APIService", { enumerable: true, get: function () { return APIService_1.APIService; } });
6
6
  Object.defineProperty(exports, "Initializer", { enumerable: true, get: function () { return APIService_1.Initializer; } });
@@ -12,3 +12,5 @@ const Validator_1 = require("./apiServer/helper/Validator");
12
12
  Object.defineProperty(exports, "Validator", { enumerable: true, get: function () { return Validator_1.Validator; } });
13
13
  const LogService_1 = require("./apiServer/LogService");
14
14
  Object.defineProperty(exports, "LogService", { enumerable: true, get: function () { return LogService_1.LogService; } });
15
+ const Monitor_1 = require("./apiServer/monitor/Monitor");
16
+ Object.defineProperty(exports, "S_MONITOR_REGISTRATE_ACTION", { enumerable: true, get: function () { return Monitor_1.S_MONITOR_REGISTRATE_ACTION; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "badmfck-api-server",
3
- "version": "1.5.8",
3
+ "version": "1.6.0",
4
4
  "description": "Simple API http server based on express",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",