badmfck-api-server 2.1.2 → 2.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,6 +9,7 @@ export interface APIServiceNetworkLogItem {
9
9
  id: number;
10
10
  created: number;
11
11
  time: number;
12
+ referer?: string;
12
13
  request: {
13
14
  [key: string]: any;
14
15
  };
@@ -59,6 +60,6 @@ export declare class APIService extends BaseService {
59
60
  netLog: APIServiceNetworkLogItem[];
60
61
  constructor(options?: APIServiceOptions | null);
61
62
  init(): Promise<void>;
62
- sendResponse(res: Response, data: TransferPacketVO<any>, requestTime: number, endpoint?: string, log?: APIServiceNetworkLogItem | null, req?: HTTPRequestVO): Promise<void>;
63
+ sendResponse(ref: string, res: Response, data: TransferPacketVO<any>, requestTime: number, endpoint?: string, log?: APIServiceNetworkLogItem | null, req?: HTTPRequestVO): Promise<void>;
63
64
  checkDataLength(data: any, result?: any, lvl?: number): any;
64
65
  }
@@ -83,7 +83,7 @@ async function Initializer(services) {
83
83
  exports.Initializer = Initializer;
84
84
  class APIService extends BaseService_1.BaseService {
85
85
  static nextLogID = 0;
86
- version = "2.1.2";
86
+ version = "2.1.4";
87
87
  options;
88
88
  monitor;
89
89
  monitorIndexFile;
@@ -154,10 +154,10 @@ class APIService extends BaseService_1.BaseService {
154
154
  app.use(express_1.default.urlencoded({ limit: '10mb', extended: true }));
155
155
  app.use((0, express_fileupload_1.default)({
156
156
  limitHandler: (req, res, next) => {
157
- this.sendResponse(res, {
157
+ this.sendResponse(req.get("Referer") ?? "", res, {
158
158
  error: DefaultErrors_1.default.FILE_TOO_LARGE,
159
159
  data: null,
160
- httpStatus: 413
160
+ httpStatus: 413,
161
161
  }, +new Date(), req.path);
162
162
  },
163
163
  limits: { fileSize: this.options.fileLimit },
@@ -182,7 +182,7 @@ class APIService extends BaseService_1.BaseService {
182
182
  if (typeof err === "object" && err.status === 400 && 'body' in err && err.type === 'entity.parse.failed') {
183
183
  responseError = DefaultErrors_1.default.JSON_MALFORMED;
184
184
  }
185
- this.sendResponse(resp, {
185
+ this.sendResponse(req.get("Referer") ?? "", resp, {
186
186
  error: responseError,
187
187
  data: null,
188
188
  httpStatus: 400
@@ -231,7 +231,8 @@ class APIService extends BaseService_1.BaseService {
231
231
  params: req.params,
232
232
  headers: req.headers,
233
233
  endpoint: ep,
234
- files: req.files ?? null
234
+ files: req.files ?? null,
235
+ referer: req.get("Referer"),
235
236
  };
236
237
  if (this.options.preproducer) {
237
238
  try {
@@ -240,7 +241,7 @@ class APIService extends BaseService_1.BaseService {
240
241
  httpRequest.preproducerResult = preproducerResult;
241
242
  }
242
243
  catch (e) {
243
- this.sendResponse(res, { error: { code: 10002, message: "Internal server error", details: `${e}` }, data: null, httpStatus: 500 }, tme, ep, log, httpRequest);
244
+ this.sendResponse(req.get("Referer") ?? "", res, { error: { code: 10002, message: "Internal server error", details: `${e}` }, data: null, httpStatus: 500 }, tme, ep, log, httpRequest);
244
245
  return;
245
246
  }
246
247
  }
@@ -251,7 +252,7 @@ class APIService extends BaseService_1.BaseService {
251
252
  if (this.options.interceptor) {
252
253
  interceptorResult = await this.options.interceptor.execute(httpRequest);
253
254
  if (interceptorResult.error && !j.allowInterceptorError) {
254
- this.sendResponse(res, interceptorResult, tme, ep, log, httpRequest);
255
+ this.sendResponse(req.get("Referer") ?? "", res, interceptorResult, tme, ep, log, httpRequest);
255
256
  return;
256
257
  }
257
258
  httpRequest.interceptorResult = interceptorResult;
@@ -261,7 +262,7 @@ class APIService extends BaseService_1.BaseService {
261
262
  httpRequest.precheck = { data: this.options.monitor };
262
263
  const precheck = await i.precheck(httpRequest);
263
264
  if (precheck && precheck.error) {
264
- this.sendResponse(res, precheck, tme, ep, log, httpRequest);
265
+ this.sendResponse(req.get("Referer") ?? "", res, precheck, tme, ep, log, httpRequest);
265
266
  return;
266
267
  }
267
268
  httpRequest.precheck = precheck;
@@ -273,7 +274,7 @@ class APIService extends BaseService_1.BaseService {
273
274
  this.options.onError(e);
274
275
  if (this.monitor)
275
276
  this.monitor.registrateFatalError(ep);
276
- this.sendResponse(res, {
277
+ this.sendResponse(req.get("Referer") ?? "", res, {
277
278
  httpStatus: 500,
278
279
  error: {
279
280
  code: 10002,
@@ -283,7 +284,7 @@ class APIService extends BaseService_1.BaseService {
283
284
  }, tme, ep, log, httpRequest);
284
285
  return;
285
286
  }
286
- this.sendResponse(res, result, tme, ep, log, httpRequest);
287
+ this.sendResponse(req.get("Referer") ?? "", res, result, tme, ep, log, httpRequest);
287
288
  };
288
289
  execute();
289
290
  });
@@ -311,7 +312,7 @@ class APIService extends BaseService_1.BaseService {
311
312
  res.status(200).send(this.monitorIndexFile);
312
313
  }
313
314
  catch (e) {
314
- this.sendResponse(res, {
315
+ this.sendResponse(req.get("Referer") ?? "", res, {
315
316
  error: {
316
317
  code: 10002,
317
318
  message: "Internal server error",
@@ -325,7 +326,7 @@ class APIService extends BaseService_1.BaseService {
325
326
  }
326
327
  }
327
328
  }
328
- this.sendResponse(res, {
329
+ this.sendResponse(req.get("Referer") ?? "", res, {
329
330
  error: DefaultErrors_1.default.UNKNOWN_REQUEST,
330
331
  data: null,
331
332
  httpStatus: 404
@@ -335,7 +336,7 @@ class APIService extends BaseService_1.BaseService {
335
336
  (0, LogService_1.logCrit)('${APIService.js}', 'API Service started at: ' + this.options.port + ", with base endpoint:" + this.options.baseEndPoint + ", ver.: " + this.version);
336
337
  });
337
338
  }
338
- async sendResponse(res, data, requestTime, endpoint, log, req) {
339
+ async sendResponse(ref, res, data, requestTime, endpoint, log, req) {
339
340
  if (this.options.postproducer) {
340
341
  try {
341
342
  data = await this.options.postproducer(req, res, data, requestTime, endpoint, log);
@@ -351,8 +352,10 @@ class APIService extends BaseService_1.BaseService {
351
352
  data.endpoint = endpoint ?? "no_endpoint";
352
353
  if (this.options.appVersion)
353
354
  data.version = this.options.appVersion;
354
- if (log)
355
+ if (log) {
355
356
  log.time = data.responseTime;
357
+ log.referer = ref;
358
+ }
356
359
  if (this.monitor)
357
360
  this.monitor.registrateResponse(data.endpoint, data.responseTime);
358
361
  if (res.destroyed || res.closed) {
@@ -374,7 +377,7 @@ class APIService extends BaseService_1.BaseService {
374
377
  this.options.onError("Can't send file: " + data.file, err);
375
378
  if (this.monitor && data.endpoint)
376
379
  this.monitor.registrateAPIError(data.endpoint);
377
- this.sendResponse(res, {
380
+ this.sendResponse(ref, res, {
378
381
  error: DefaultErrors_1.default.CANT_SEND_FILE,
379
382
  data: null,
380
383
  httpStatus: 500
@@ -1,6 +1,6 @@
1
- import { FieldInfo, MysqlError, Pool, PoolConnection } from "mysql";
2
1
  import { BaseService } from "./BaseService";
3
2
  import Signal, { Req } from "badmfck-signal";
3
+ import * as mysql from "mysql2/promise";
4
4
  export declare const S_MYSQL_STARTED: Signal<void>;
5
5
  export declare const REQ_MYSQL_QUERY: Req<MySqlQuery | MySqlQuery[], MysqlResult[]>;
6
6
  export declare const executeQuery: (query: MySqlQuery | MySqlQuery[]) => Promise<MysqlResult[]>;
@@ -11,20 +11,30 @@ export interface MysqlServiceOptions {
11
11
  password: string;
12
12
  port: number;
13
13
  database: string;
14
+ queueLimit?: number;
14
15
  migrations?: {
15
16
  dir: string;
16
17
  callback: () => void;
17
18
  } | null;
18
19
  }
20
+ export interface MysqlError {
21
+ code: string;
22
+ errno: number;
23
+ sql: string;
24
+ name: string;
25
+ message: string;
26
+ fatal?: boolean;
27
+ }
19
28
  export interface MysqlResult {
20
29
  error?: MysqlError | null;
30
+ rollbackError?: MysqlError | null;
21
31
  isDuplicateError?: boolean;
22
- fields?: FieldInfo[] | null;
23
32
  data: any;
24
33
  }
25
34
  export interface MySqlQuery {
26
35
  query: string;
27
36
  fields: MysqlQueryField[] | MysqlQueryFieldObject;
37
+ rollbackQuery?: string | null;
28
38
  }
29
39
  export interface MysqlQueryField {
30
40
  name: string;
@@ -46,7 +56,7 @@ export interface MysqlQueryFieldObject extends Record<string, string | number |
46
56
  export declare class MysqlService extends BaseService {
47
57
  reconnectionTimeout: number;
48
58
  reconnecting: boolean;
49
- pool: Pool | null;
59
+ pool: mysql.Pool | null;
50
60
  options: MysqlServiceOptions;
51
61
  serviceStarted: boolean;
52
62
  timeoutID: any;
@@ -54,14 +64,17 @@ export declare class MysqlService extends BaseService {
54
64
  constructor(options: MysqlServiceOptions);
55
65
  static executeQuery(query: MySqlQuery | MySqlQuery[]): Promise<MysqlResult[]>;
56
66
  init(): Promise<void>;
57
- recreatePool(): Promise<void>;
67
+ recreatePool(): Promise<boolean>;
58
68
  onApplicationReady(): Promise<void>;
59
69
  static fieldsToObject(fields: MysqlQueryField[] | MysqlQueryFieldObject, ignoreSystemParameters?: boolean): MysqlQueryFieldObject;
60
70
  static objectToFields(obj: MysqlQueryFieldObject | MysqlQueryField[]): MysqlQueryField[];
61
71
  static prepareQuery(query: string, fields: MysqlQueryField[] | MysqlQueryFieldObject): string;
62
72
  static prepareQueryFieldValue(value: string | number | boolean | null | undefined, system?: boolean): string | number | boolean | null | undefined;
63
- execute(query: string): Promise<MysqlResult>;
64
- sendQuery(conn: PoolConnection, query: string, resolve: (data: MysqlResult) => void): void;
65
- createPool(): Promise<boolean>;
73
+ execute(query: string, rollbackQuery: string | null): Promise<MysqlResult>;
74
+ sendQuery(conn: mysql.PoolConnection, query: string, resolve: (data: MysqlResult) => void, rollback: string | null): Promise<void>;
75
+ queryAsync(conn: mysql.PoolConnection, query: string): Promise<{
76
+ err: MysqlError | null;
77
+ results?: any;
78
+ }>;
66
79
  }
67
80
  export default MysqlService;
@@ -22,16 +22,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  exports.MysqlService = exports.executeQuery = exports.REQ_MYSQL_QUERY = exports.S_MYSQL_STARTED = void 0;
30
- const mysql_1 = __importDefault(require("mysql"));
31
27
  const BaseService_1 = require("./BaseService");
32
28
  const badmfck_signal_1 = __importStar(require("badmfck-signal"));
33
29
  const crypto_1 = require("crypto");
34
30
  const LogService_1 = require("./LogService");
31
+ const mysql = __importStar(require("mysql2/promise"));
35
32
  exports.S_MYSQL_STARTED = new badmfck_signal_1.default();
36
33
  exports.REQ_MYSQL_QUERY = new badmfck_signal_1.Req(undefined, "REQ_MYSQL_QUERY");
37
34
  const executeQuery = async (query) => { return await exports.REQ_MYSQL_QUERY.request(query); };
@@ -58,34 +55,98 @@ class MysqlService extends BaseService_1.BaseService {
58
55
  }
59
56
  static async executeQuery(query) { return await exports.REQ_MYSQL_QUERY.request(query); }
60
57
  async init() {
58
+ super.init();
59
+ process.on('SIGINT', async () => {
60
+ console.log('1. Received SIGINT. Performing cleanup...');
61
+ if (this.pool) {
62
+ try {
63
+ await this.pool.end();
64
+ }
65
+ catch (e) {
66
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't close MYSQL pool!");
67
+ }
68
+ }
69
+ process.exit(0);
70
+ });
71
+ process.on('SIGTERM', () => {
72
+ console.log('2. Received SIGTERM. Performing cleanup...');
73
+ process.exit(0);
74
+ });
61
75
  this.serviceStarted = false;
62
- await this.recreatePool();
76
+ let poolCreated = false;
77
+ while (!poolCreated) {
78
+ (0, LogService_1.logInfo)("${MysqlService.js}", "Connecting to MYSQL!");
79
+ poolCreated = await this.recreatePool();
80
+ if (!poolCreated) {
81
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL! Retrying in 3 seconds...");
82
+ await new Promise((resolve) => setTimeout(resolve, 3000));
83
+ }
84
+ }
63
85
  exports.REQ_MYSQL_QUERY.listener = async (data) => {
64
86
  if (!Array.isArray(data))
65
87
  data = [data];
66
88
  const promises = [];
67
89
  for (let i of data) {
68
90
  const query = MysqlService.prepareQuery(i.query, i.fields);
69
- promises.push(this.execute(query));
91
+ promises.push(this.execute(query, i.rollbackQuery ?? null));
70
92
  }
71
93
  return await Promise.all(promises);
72
94
  };
73
95
  }
74
96
  async recreatePool() {
75
- (0, LogService_1.logInfo)("${MysqlService.js}", "Mysql server trying to create pool");
76
- this.serviceStarted = false;
77
- const ok = await this.createPool();
78
- if (!ok) {
79
- (0, LogService_1.logWarn)("${MysqlService.js}", "Mysql server not connected, retrying in 3 sec");
80
- if (this.timeoutID)
81
- clearTimeout(this.timeoutID);
82
- this.timeoutID = setTimeout(() => { this.recreatePool(); }, 3000);
97
+ (0, LogService_1.logInfo)("${MysqlService.js}", "Connecting to mysql: \n HOST: " + this.options.host + '\n PORT:' + this.options.port);
98
+ if (this.pool) {
99
+ this.pool.removeAllListeners();
100
+ try {
101
+ await this.pool.end();
102
+ }
103
+ catch (e) {
104
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't close MYSQL pool!");
105
+ }
106
+ this.pool = null;
83
107
  }
84
- else {
85
- this.serviceStarted = true;
86
- (0, LogService_1.logInfo)("${MysqlService.js}", "Mysql Service started!");
87
- exports.S_MYSQL_STARTED.invoke();
108
+ try {
109
+ this.pool = mysql.createPool({
110
+ host: this.options.host,
111
+ user: this.options.user,
112
+ password: this.options.password,
113
+ database: this.options.database,
114
+ port: this.options.port,
115
+ connectionLimit: this.options.connectionLimit,
116
+ queueLimit: 10
117
+ });
88
118
  }
119
+ catch (e) {
120
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL!");
121
+ return false;
122
+ }
123
+ this.pool?.on('connection', (connection) => {
124
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION CREATED");
125
+ });
126
+ this.pool?.on('acquire', (connection) => {
127
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION ACQUIRED");
128
+ });
129
+ this.pool?.on('release', (connection) => {
130
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION RELEASED");
131
+ });
132
+ this.pool?.on('enqueue', () => {
133
+ (0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION ENQUEUED");
134
+ });
135
+ return new Promise(async (resolve, reject) => {
136
+ try {
137
+ const conn = await this.pool?.getConnection();
138
+ if (conn) {
139
+ conn?.release();
140
+ resolve(true);
141
+ }
142
+ else
143
+ resolve(false);
144
+ }
145
+ catch (e) {
146
+ (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL!");
147
+ resolve(false);
148
+ }
149
+ });
89
150
  }
90
151
  async onApplicationReady() { }
91
152
  static fieldsToObject(fields, ignoreSystemParameters) {
@@ -206,8 +267,8 @@ class MysqlService extends BaseService_1.BaseService {
206
267
  return "NULL";
207
268
  return value;
208
269
  }
209
- async execute(query) {
210
- return new Promise((resolve, reject) => {
270
+ async execute(query, rollbackQuery) {
271
+ return new Promise(async (resolve, reject) => {
211
272
  if (!this.pool) {
212
273
  (0, LogService_1.logError)("${MysqlService.js}", "No pool");
213
274
  resolve({
@@ -220,23 +281,11 @@ class MysqlService extends BaseService_1.BaseService {
220
281
  message: "Mysql pool not created"
221
282
  },
222
283
  data: null,
223
- fields: null
224
284
  });
225
285
  return;
226
286
  }
227
- this.pool.getConnection((err, conn) => {
228
- if (err) {
229
- (0, LogService_1.logError)("${MysqlService.js}", err);
230
- if (`${err}`.indexOf('ECONNREFUSED') !== -1) {
231
- this.recreatePool();
232
- }
233
- resolve({
234
- error: err,
235
- data: null,
236
- fields: null
237
- });
238
- return;
239
- }
287
+ try {
288
+ const conn = await this.pool.getConnection();
240
289
  if (!conn) {
241
290
  (0, LogService_1.logCrit)("${MysqlService.js}", `No connection created!`);
242
291
  resolve({
@@ -249,43 +298,43 @@ class MysqlService extends BaseService_1.BaseService {
249
298
  message: "Mysql pool cant get connection"
250
299
  },
251
300
  data: null,
252
- fields: null
253
- });
254
- }
255
- try {
256
- this.sendQuery(conn, query, resolve);
257
- }
258
- catch (e) {
259
- try {
260
- conn.removeAllListeners();
261
- conn.release();
262
- }
263
- catch (e) { }
264
- (0, LogService_1.logError)("${MysqlService.js}", "QUERY_ERR: " + e);
265
- resolve({
266
- error: {
267
- code: "QUERY_ERR",
268
- errno: 100002,
269
- fatal: true,
270
- sql: query,
271
- name: "QUERY_ERR",
272
- message: "Error: " + e
273
- },
274
- data: null,
275
- fields: null
276
301
  });
302
+ return;
277
303
  }
278
- });
304
+ this.sendQuery(conn, query, resolve, rollbackQuery);
305
+ }
306
+ catch (e) {
307
+ (0, LogService_1.logError)("${MysqlService.js}", e);
308
+ if (`${e}`.indexOf('ECONNREFUSED') !== -1)
309
+ this.recreatePool();
310
+ resolve({
311
+ error: {
312
+ code: "NO_CONN",
313
+ errno: 100001,
314
+ fatal: true,
315
+ sql: query,
316
+ name: "NO_CONN",
317
+ message: (e && typeof e === "object" && "message" in e) ? e.message : "Mysql cant get connection"
318
+ },
319
+ data: null
320
+ });
321
+ return;
322
+ }
279
323
  });
280
324
  }
281
- sendQuery(conn, query, resolve) {
325
+ async sendQuery(conn, query, resolve, rollback) {
282
326
  let errCatched = false;
283
- conn.on("error", err => {
327
+ conn.on("error", async (err) => {
284
328
  errCatched = true;
285
- conn.release();
286
- conn.removeAllListeners();
287
- (0, LogService_1.logError)("${MysqlService.js}", err);
288
- conn.removeAllListeners();
329
+ let rollbackError = null;
330
+ if (rollback)
331
+ rollbackError = (await this.queryAsync(conn, rollback)).err;
332
+ (0, LogService_1.logError)("${MysqlService.js}->conn.on('error')", err);
333
+ try {
334
+ conn.release();
335
+ conn.removeAllListeners();
336
+ }
337
+ catch (e) { }
289
338
  resolve({
290
339
  error: {
291
340
  code: "CONN_ERR",
@@ -296,87 +345,71 @@ class MysqlService extends BaseService_1.BaseService {
296
345
  message: "Error: " + err
297
346
  },
298
347
  data: null,
299
- fields: null
348
+ rollbackError: rollbackError
300
349
  });
301
350
  });
302
351
  (0, LogService_1.logInfo)("${MysqlService.js}", query);
303
- conn.query(query, (err, results, fields) => {
304
- conn.release();
305
- conn.removeAllListeners();
306
- if (errCatched)
307
- return;
308
- if (err) {
309
- const dup = `${err}`.toLowerCase().indexOf("er_dup_entry") !== -1;
310
- (0, LogService_1.logError)("${MysqlService.js}", err);
311
- resolve({
312
- error: err,
313
- data: null,
314
- fields: null,
315
- isDuplicateError: dup
316
- });
317
- return;
352
+ const queryResult = await this.queryAsync(conn, query);
353
+ if (queryResult.err) {
354
+ let rollbackError = null;
355
+ if (rollback)
356
+ rollbackError = (await this.queryAsync(conn, rollback)).err;
357
+ try {
358
+ conn.release();
359
+ conn.removeAllListeners();
318
360
  }
361
+ catch (e) { }
362
+ const dup = `${queryResult.err}`.toLowerCase().indexOf("er_dup_entry") !== -1;
363
+ (0, LogService_1.logError)("${MysqlService.js}->query error", queryResult.err);
319
364
  resolve({
320
- error: err,
321
- data: results,
322
- fields: fields
365
+ error: queryResult.err,
366
+ data: null,
367
+ rollbackError: rollbackError,
368
+ isDuplicateError: dup
323
369
  });
324
- return;
370
+ }
371
+ try {
372
+ conn.release();
373
+ conn.removeAllListeners();
374
+ }
375
+ catch (e) { }
376
+ resolve({
377
+ error: queryResult.err,
378
+ data: queryResult.results,
325
379
  });
326
380
  }
327
- async createPool() {
328
- (0, LogService_1.logInfo)("${MysqlService.js}", "Connecting to mysql: \n HOST: " + this.options.host + '\n PORT:' + this.options.port);
329
- let err = false;
330
- if (this.pool) {
331
- try {
332
- this.pool.removeAllListeners();
333
- this.pool.end(err => {
334
- if (err)
335
- (0, LogService_1.logError)("${MysqlService.js}", err);
336
- });
337
- }
338
- catch (e) {
339
- (0, LogService_1.logCrit)("${MysqlService.js}", e);
340
- }
341
- }
381
+ async queryAsync(conn, query) {
342
382
  try {
343
- this.pool = mysql_1.default.createPool({
344
- connectionLimit: this.options.connectionLimit,
345
- host: this.options.host,
346
- user: this.options.user,
347
- password: this.options.password,
348
- port: this.options.port,
349
- database: this.options.database,
350
- multipleStatements: true
351
- });
383
+ const result = await conn.query(query);
384
+ return {
385
+ err: null,
386
+ results: result[0],
387
+ };
352
388
  }
353
389
  catch (e) {
354
- (0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL!");
355
- err = true;
356
- }
357
- if (!err && this.pool) {
358
- this.pool.on("error", (evt) => {
359
- (0, LogService_1.logError)("${MysqlService.js}", evt);
360
- });
361
- }
362
- return new Promise((res, rej) => {
363
- if (err) {
364
- res(false);
365
- return;
366
- }
367
- if (!this.pool) {
368
- res(false);
369
- return;
390
+ const err = e;
391
+ if (err && typeof err === "object" && "code" in err && "errno" in err && "sql" in err && "name" in err && "message" in err) {
392
+ return {
393
+ err: {
394
+ code: err.code,
395
+ errno: err.errno,
396
+ sql: query,
397
+ name: err.name,
398
+ message: err.message
399
+ }
400
+ };
370
401
  }
371
- this.pool.getConnection((e, cnn) => {
372
- if (e) {
373
- (0, LogService_1.logError)("${MysqlService.js}", e.message);
374
- res(false);
375
- return;
402
+ return {
403
+ err: {
404
+ code: "QUERY_ERR",
405
+ errno: 100002,
406
+ fatal: true,
407
+ sql: query,
408
+ name: "QUERY_ERR",
409
+ message: "Error: " + e
376
410
  }
377
- res(true);
378
- });
379
- });
411
+ };
412
+ }
380
413
  }
381
414
  }
382
415
  exports.MysqlService = MysqlService;
@@ -29,6 +29,7 @@ export interface HTTPRequestVO<T = any> {
29
29
  preproducerResult?: any;
30
30
  precheck?: TransferPacketVO<any> | null;
31
31
  files: FileArray | null | undefined;
32
+ referer?: string;
32
33
  unlocked?: boolean;
33
34
  }
34
35
  export interface IError {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "badmfck-api-server",
3
- "version": "2.1.2",
3
+ "version": "2.1.4",
4
4
  "description": "Simple API http server based on express",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -25,7 +25,7 @@
25
25
  "cors": "^2.8.5",
26
26
  "express": "^4.19.2",
27
27
  "express-fileupload": "^1.5.0",
28
- "mysql": "^2.18.1",
28
+ "mysql2": "^3.11.3",
29
29
  "ws": "^8.18.0"
30
30
  },
31
31
  "devDependencies": {