apitally 0.18.1 → 0.20.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.
- package/README.md +71 -44
- package/dist/adonisjs/configure.cjs +2 -2
- package/dist/adonisjs/configure.cjs.map +1 -1
- package/dist/adonisjs/configure.js.map +1 -1
- package/dist/adonisjs/index.cjs +2 -2
- package/dist/adonisjs/index.cjs.map +1 -1
- package/dist/adonisjs/index.d.cts +2 -2
- package/dist/adonisjs/index.d.ts +2 -2
- package/dist/adonisjs/index.js.map +1 -1
- package/dist/adonisjs/middleware.cjs +107 -84
- package/dist/adonisjs/middleware.cjs.map +1 -1
- package/dist/adonisjs/middleware.d.cts +2 -2
- package/dist/adonisjs/middleware.d.ts +2 -2
- package/dist/adonisjs/middleware.js +106 -83
- package/dist/adonisjs/middleware.js.map +1 -1
- package/dist/adonisjs/provider.cjs +4765 -62
- package/dist/adonisjs/provider.cjs.map +1 -1
- package/dist/adonisjs/provider.d.cts +7 -4
- package/dist/adonisjs/provider.d.ts +7 -4
- package/dist/adonisjs/provider.js +4743 -17
- package/dist/adonisjs/provider.js.map +1 -1
- package/dist/common/client.cjs +64 -42
- package/dist/common/client.cjs.map +1 -1
- package/dist/common/client.d.cts +2 -2
- package/dist/common/client.d.ts +2 -2
- package/dist/common/client.js +33 -11
- package/dist/common/client.js.map +1 -1
- package/dist/common/consumerRegistry.d.cts +2 -2
- package/dist/common/consumerRegistry.d.ts +2 -2
- package/dist/common/headers.cjs.map +1 -1
- package/dist/common/headers.d.cts +1 -1
- package/dist/common/headers.d.ts +1 -1
- package/dist/common/headers.js.map +1 -1
- package/dist/common/logging.cjs +3 -2
- package/dist/common/logging.cjs.map +1 -1
- package/dist/common/logging.d.cts +1 -1
- package/dist/common/logging.d.ts +1 -1
- package/dist/common/logging.js +3 -2
- package/dist/common/logging.js.map +1 -1
- package/dist/common/packageVersions.cjs +2 -2
- package/dist/common/packageVersions.cjs.map +1 -1
- package/dist/common/packageVersions.js.map +1 -1
- package/dist/common/requestCounter.d.cts +2 -2
- package/dist/common/requestCounter.d.ts +2 -2
- package/dist/common/requestLogger.cjs +57 -33
- package/dist/common/requestLogger.cjs.map +1 -1
- package/dist/common/requestLogger.d.cts +12 -5
- package/dist/common/requestLogger.d.ts +12 -5
- package/dist/common/requestLogger.js +30 -6
- package/dist/common/requestLogger.js.map +1 -1
- package/dist/common/response.cjs +12 -6
- package/dist/common/response.cjs.map +1 -1
- package/dist/common/response.d.cts +3 -3
- package/dist/common/response.d.ts +3 -3
- package/dist/common/response.js +12 -6
- package/dist/common/response.js.map +1 -1
- package/dist/common/serverErrorCounter.cjs +3 -2
- package/dist/common/serverErrorCounter.cjs.map +1 -1
- package/dist/common/serverErrorCounter.d.cts +2 -2
- package/dist/common/serverErrorCounter.d.ts +2 -2
- package/dist/common/serverErrorCounter.js +1 -0
- package/dist/common/serverErrorCounter.js.map +1 -1
- package/dist/common/tempGzipFile.cjs +15 -14
- package/dist/common/tempGzipFile.cjs.map +1 -1
- package/dist/common/tempGzipFile.d.cts +1 -1
- package/dist/common/tempGzipFile.d.ts +1 -1
- package/dist/common/tempGzipFile.js +3 -2
- package/dist/common/tempGzipFile.js.map +1 -1
- package/dist/common/types.d.cts +2 -2
- package/dist/common/types.d.ts +2 -2
- package/dist/common/validationErrorCounter.cjs +4 -4
- package/dist/common/validationErrorCounter.cjs.map +1 -1
- package/dist/common/validationErrorCounter.d.cts +2 -2
- package/dist/common/validationErrorCounter.d.ts +2 -2
- package/dist/common/validationErrorCounter.js +2 -2
- package/dist/common/validationErrorCounter.js.map +1 -1
- package/dist/elysia/index.cjs +1582 -0
- package/dist/elysia/index.cjs.map +1 -0
- package/dist/elysia/index.d.cts +9 -0
- package/dist/elysia/index.d.ts +9 -0
- package/dist/elysia/index.js +1552 -0
- package/dist/elysia/index.js.map +1 -0
- package/dist/elysia/plugin.cjs +1576 -0
- package/dist/elysia/plugin.cjs.map +1 -0
- package/dist/elysia/plugin.d.cts +53 -0
- package/dist/elysia/plugin.d.ts +53 -0
- package/dist/elysia/plugin.js +1552 -0
- package/dist/elysia/plugin.js.map +1 -0
- package/dist/elysia/utils.cjs +98 -0
- package/dist/elysia/utils.cjs.map +1 -0
- package/dist/elysia/utils.d.cts +12 -0
- package/dist/elysia/utils.d.ts +12 -0
- package/dist/elysia/utils.js +78 -0
- package/dist/elysia/utils.js.map +1 -0
- package/dist/express/index.cjs +4997 -169
- package/dist/express/index.cjs.map +1 -1
- package/dist/express/index.d.cts +2 -2
- package/dist/express/index.d.ts +2 -2
- package/dist/express/index.js +4969 -120
- package/dist/express/index.js.map +1 -1
- package/dist/express/middleware.cjs +4997 -169
- package/dist/express/middleware.cjs.map +1 -1
- package/dist/express/middleware.d.cts +2 -2
- package/dist/express/middleware.d.ts +2 -2
- package/dist/express/middleware.js +4969 -120
- package/dist/express/middleware.js.map +1 -1
- package/dist/fastify/index.cjs +4926 -72
- package/dist/fastify/index.cjs.map +1 -1
- package/dist/fastify/index.d.cts +3 -2
- package/dist/fastify/index.d.ts +3 -2
- package/dist/fastify/index.js +4899 -24
- package/dist/fastify/index.js.map +1 -1
- package/dist/fastify/plugin.cjs +4926 -72
- package/dist/fastify/plugin.cjs.map +1 -1
- package/dist/fastify/plugin.d.cts +8 -3
- package/dist/fastify/plugin.d.ts +8 -3
- package/dist/fastify/plugin.js +4899 -24
- package/dist/fastify/plugin.js.map +1 -1
- package/dist/h3/index.cjs +235 -57
- package/dist/h3/index.cjs.map +1 -1
- package/dist/h3/index.d.cts +2 -2
- package/dist/h3/index.d.ts +2 -2
- package/dist/h3/index.js +200 -22
- package/dist/h3/index.js.map +1 -1
- package/dist/h3/plugin.cjs +235 -57
- package/dist/h3/plugin.cjs.map +1 -1
- package/dist/h3/plugin.d.cts +6 -4
- package/dist/h3/plugin.d.ts +6 -4
- package/dist/h3/plugin.js +200 -22
- package/dist/h3/plugin.js.map +1 -1
- package/dist/h3/utils.cjs +2 -2
- package/dist/h3/utils.cjs.map +1 -1
- package/dist/h3/utils.js.map +1 -1
- package/dist/hono/index.cjs +295 -118
- package/dist/hono/index.cjs.map +1 -1
- package/dist/hono/index.d.cts +2 -2
- package/dist/hono/index.d.ts +2 -2
- package/dist/hono/index.js +261 -84
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/middleware.cjs +295 -118
- package/dist/hono/middleware.cjs.map +1 -1
- package/dist/hono/middleware.d.cts +2 -2
- package/dist/hono/middleware.d.ts +2 -2
- package/dist/hono/middleware.js +261 -84
- package/dist/hono/middleware.js.map +1 -1
- package/dist/hono/utils.cjs +2 -2
- package/dist/hono/utils.cjs.map +1 -1
- package/dist/hono/utils.d.cts +2 -2
- package/dist/hono/utils.d.ts +2 -2
- package/dist/hono/utils.js.map +1 -1
- package/dist/koa/index.cjs +280 -107
- package/dist/koa/index.cjs.map +1 -1
- package/dist/koa/index.d.cts +2 -2
- package/dist/koa/index.d.ts +2 -2
- package/dist/koa/index.js +244 -71
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/middleware.cjs +278 -107
- package/dist/koa/middleware.cjs.map +1 -1
- package/dist/koa/middleware.d.cts +2 -2
- package/dist/koa/middleware.d.ts +2 -2
- package/dist/koa/middleware.js +244 -71
- package/dist/koa/middleware.js.map +1 -1
- package/dist/loggers/console.cjs +69 -0
- package/dist/loggers/console.cjs.map +1 -0
- package/dist/loggers/console.d.cts +9 -0
- package/dist/loggers/console.d.ts +9 -0
- package/dist/loggers/console.js +46 -0
- package/dist/loggers/console.js.map +1 -0
- package/dist/loggers/index.cjs +4837 -0
- package/dist/loggers/index.cjs.map +1 -0
- package/dist/loggers/index.d.cts +9 -0
- package/dist/loggers/index.d.ts +9 -0
- package/dist/loggers/index.js +4826 -0
- package/dist/loggers/index.js.map +1 -0
- package/dist/loggers/nestjs.cjs +135 -0
- package/dist/loggers/nestjs.cjs.map +1 -0
- package/dist/loggers/nestjs.d.cts +9 -0
- package/dist/loggers/nestjs.d.ts +9 -0
- package/dist/loggers/nestjs.js +100 -0
- package/dist/loggers/nestjs.js.map +1 -0
- package/dist/loggers/pino.cjs +4669 -0
- package/dist/loggers/pino.cjs.map +1 -0
- package/dist/loggers/pino.d.cts +9 -0
- package/dist/loggers/pino.d.ts +9 -0
- package/dist/loggers/pino.js +4661 -0
- package/dist/loggers/pino.js.map +1 -0
- package/dist/loggers/utils.cjs +66 -0
- package/dist/loggers/utils.cjs.map +1 -0
- package/dist/loggers/utils.d.cts +6 -0
- package/dist/loggers/utils.d.ts +6 -0
- package/dist/loggers/utils.js +42 -0
- package/dist/loggers/utils.js.map +1 -0
- package/dist/loggers/winston.cjs +135 -0
- package/dist/loggers/winston.cjs.map +1 -0
- package/dist/loggers/winston.d.cts +9 -0
- package/dist/loggers/winston.d.ts +9 -0
- package/dist/loggers/winston.js +100 -0
- package/dist/loggers/winston.js.map +1 -0
- package/dist/nestjs/index.cjs +5448 -542
- package/dist/nestjs/index.cjs.map +1 -1
- package/dist/nestjs/index.d.cts +2 -2
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +5364 -460
- package/dist/nestjs/index.js.map +1 -1
- package/package.json +26 -4
package/dist/koa/index.cjs
CHANGED
|
@@ -38,9 +38,12 @@ __export(koa_exports, {
|
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(koa_exports);
|
|
40
40
|
|
|
41
|
+
// src/koa/middleware.ts
|
|
42
|
+
var import_node_async_hooks = require("async_hooks");
|
|
43
|
+
|
|
41
44
|
// src/common/client.ts
|
|
42
|
-
var import_crypto5 = require("crypto");
|
|
43
45
|
var import_fetch_retry = __toESM(require("fetch-retry"), 1);
|
|
46
|
+
var import_node_crypto5 = require("crypto");
|
|
44
47
|
|
|
45
48
|
// src/common/consumerRegistry.ts
|
|
46
49
|
var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
|
|
@@ -100,7 +103,7 @@ var ConsumerRegistry = _ConsumerRegistry;
|
|
|
100
103
|
|
|
101
104
|
// src/common/logging.ts
|
|
102
105
|
var import_winston = require("winston");
|
|
103
|
-
|
|
106
|
+
function getLogger() {
|
|
104
107
|
return (0, import_winston.createLogger)({
|
|
105
108
|
level: process.env.APITALLY_DEBUG ? "debug" : "warn",
|
|
106
109
|
format: import_winston.format.combine(import_winston.format.colorize(), import_winston.format.timestamp(), import_winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
|
|
@@ -108,7 +111,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
|
|
|
108
111
|
new import_winston.transports.Console()
|
|
109
112
|
]
|
|
110
113
|
});
|
|
111
|
-
}
|
|
114
|
+
}
|
|
115
|
+
__name(getLogger, "getLogger");
|
|
112
116
|
|
|
113
117
|
// src/common/paramValidation.ts
|
|
114
118
|
function isValidClientId(clientId) {
|
|
@@ -210,11 +214,11 @@ var RequestCounter = _RequestCounter;
|
|
|
210
214
|
|
|
211
215
|
// src/common/requestLogger.ts
|
|
212
216
|
var import_async_lock = __toESM(require("async-lock"), 1);
|
|
213
|
-
var
|
|
214
|
-
var
|
|
215
|
-
var
|
|
216
|
-
var
|
|
217
|
-
var
|
|
217
|
+
var import_node_buffer2 = require("buffer");
|
|
218
|
+
var import_node_crypto3 = require("crypto");
|
|
219
|
+
var import_node_fs2 = require("fs");
|
|
220
|
+
var import_node_os2 = require("os");
|
|
221
|
+
var import_node_path2 = require("path");
|
|
218
222
|
|
|
219
223
|
// src/common/sentry.ts
|
|
220
224
|
var sentry;
|
|
@@ -233,7 +237,7 @@ function getSentryEventId() {
|
|
|
233
237
|
__name(getSentryEventId, "getSentryEventId");
|
|
234
238
|
|
|
235
239
|
// src/common/serverErrorCounter.ts
|
|
236
|
-
var
|
|
240
|
+
var import_node_crypto = require("crypto");
|
|
237
241
|
var MAX_MSG_LENGTH = 2048;
|
|
238
242
|
var MAX_STACKTRACE_LENGTH = 65536;
|
|
239
243
|
var _ServerErrorCounter = class _ServerErrorCounter {
|
|
@@ -275,6 +279,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
275
279
|
});
|
|
276
280
|
this.errorCounts.clear();
|
|
277
281
|
this.errorDetails.clear();
|
|
282
|
+
this.sentryEventIds.clear();
|
|
278
283
|
return data;
|
|
279
284
|
}
|
|
280
285
|
getKey(serverError) {
|
|
@@ -286,7 +291,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
286
291
|
serverError.msg.trim(),
|
|
287
292
|
serverError.traceback.trim()
|
|
288
293
|
].join("|");
|
|
289
|
-
return (0,
|
|
294
|
+
return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
|
|
290
295
|
}
|
|
291
296
|
};
|
|
292
297
|
__name(_ServerErrorCounter, "ServerErrorCounter");
|
|
@@ -319,12 +324,13 @@ function truncateExceptionStackTrace(stack) {
|
|
|
319
324
|
__name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
|
|
320
325
|
|
|
321
326
|
// src/common/tempGzipFile.ts
|
|
322
|
-
var
|
|
323
|
-
var
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var
|
|
327
|
-
var
|
|
327
|
+
var import_node_buffer = require("buffer");
|
|
328
|
+
var import_node_crypto2 = require("crypto");
|
|
329
|
+
var import_node_fs = require("fs");
|
|
330
|
+
var import_promises = require("fs/promises");
|
|
331
|
+
var import_node_os = require("os");
|
|
332
|
+
var import_node_path = require("path");
|
|
333
|
+
var import_node_zlib = require("zlib");
|
|
328
334
|
var _TempGzipFile = class _TempGzipFile {
|
|
329
335
|
uuid;
|
|
330
336
|
filePath;
|
|
@@ -333,9 +339,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
333
339
|
readyPromise;
|
|
334
340
|
closedPromise;
|
|
335
341
|
constructor() {
|
|
336
|
-
this.uuid = (0,
|
|
337
|
-
this.filePath = (0,
|
|
338
|
-
this.writeStream = (0,
|
|
342
|
+
this.uuid = (0, import_node_crypto2.randomUUID)();
|
|
343
|
+
this.filePath = (0, import_node_path.join)((0, import_node_os.tmpdir)(), `apitally-${this.uuid}.gz`);
|
|
344
|
+
this.writeStream = (0, import_node_fs.createWriteStream)(this.filePath);
|
|
339
345
|
this.readyPromise = new Promise((resolve, reject) => {
|
|
340
346
|
this.writeStream.once("ready", resolve);
|
|
341
347
|
this.writeStream.once("error", reject);
|
|
@@ -344,7 +350,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
344
350
|
this.writeStream.once("close", resolve);
|
|
345
351
|
this.writeStream.once("error", reject);
|
|
346
352
|
});
|
|
347
|
-
this.gzip = (0,
|
|
353
|
+
this.gzip = (0, import_node_zlib.createGzip)();
|
|
348
354
|
this.gzip.pipe(this.writeStream);
|
|
349
355
|
}
|
|
350
356
|
get size() {
|
|
@@ -353,9 +359,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
353
359
|
async writeLine(data) {
|
|
354
360
|
await this.readyPromise;
|
|
355
361
|
return new Promise((resolve, reject) => {
|
|
356
|
-
this.gzip.write(
|
|
362
|
+
this.gzip.write(import_node_buffer.Buffer.concat([
|
|
357
363
|
data,
|
|
358
|
-
|
|
364
|
+
import_node_buffer.Buffer.from("\n")
|
|
359
365
|
]), (error) => {
|
|
360
366
|
if (error) {
|
|
361
367
|
reject(error);
|
|
@@ -367,7 +373,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
367
373
|
}
|
|
368
374
|
async getContent() {
|
|
369
375
|
return new Promise((resolve, reject) => {
|
|
370
|
-
(0,
|
|
376
|
+
(0, import_node_fs.readFile)(this.filePath, (error, data) => {
|
|
371
377
|
if (error) {
|
|
372
378
|
reject(error);
|
|
373
379
|
} else {
|
|
@@ -386,7 +392,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
386
392
|
}
|
|
387
393
|
async delete() {
|
|
388
394
|
await this.close();
|
|
389
|
-
(0,
|
|
395
|
+
await (0, import_promises.unlink)(this.filePath);
|
|
390
396
|
}
|
|
391
397
|
};
|
|
392
398
|
__name(_TempGzipFile, "TempGzipFile");
|
|
@@ -397,8 +403,9 @@ var MAX_BODY_SIZE = 5e4;
|
|
|
397
403
|
var MAX_FILE_SIZE = 1e6;
|
|
398
404
|
var MAX_FILES = 50;
|
|
399
405
|
var MAX_PENDING_WRITES = 100;
|
|
400
|
-
var
|
|
401
|
-
var
|
|
406
|
+
var MAX_LOG_MSG_LENGTH = 2048;
|
|
407
|
+
var BODY_TOO_LARGE = import_node_buffer2.Buffer.from("<body too large>");
|
|
408
|
+
var BODY_MASKED = import_node_buffer2.Buffer.from("<masked>");
|
|
402
409
|
var MASKED = "******";
|
|
403
410
|
var ALLOWED_CONTENT_TYPES = [
|
|
404
411
|
"application/json",
|
|
@@ -453,6 +460,7 @@ var DEFAULT_CONFIG = {
|
|
|
453
460
|
logResponseHeaders: true,
|
|
454
461
|
logResponseBody: false,
|
|
455
462
|
logException: true,
|
|
463
|
+
captureLogs: false,
|
|
456
464
|
maskQueryParams: [],
|
|
457
465
|
maskHeaders: [],
|
|
458
466
|
maskBodyFields: [],
|
|
@@ -595,7 +603,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
595
603
|
try {
|
|
596
604
|
const parsedBody = JSON.parse(bodyData.toString());
|
|
597
605
|
const maskedBody = this.maskBody(parsedBody);
|
|
598
|
-
item[key].body =
|
|
606
|
+
item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
|
|
599
607
|
} catch {
|
|
600
608
|
}
|
|
601
609
|
}
|
|
@@ -607,7 +615,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
607
615
|
item.request.url = url.toString();
|
|
608
616
|
return item;
|
|
609
617
|
}
|
|
610
|
-
logRequest(request, response, error) {
|
|
618
|
+
logRequest(request, response, error, logs) {
|
|
611
619
|
var _a2, _b, _c;
|
|
612
620
|
if (!this.enabled || this.suspendUntil !== null) return;
|
|
613
621
|
const url = new URL(request.url);
|
|
@@ -629,7 +637,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
629
637
|
response.size = void 0;
|
|
630
638
|
}
|
|
631
639
|
const item = {
|
|
632
|
-
uuid: (0,
|
|
640
|
+
uuid: (0, import_node_crypto3.randomUUID)(),
|
|
633
641
|
request,
|
|
634
642
|
response,
|
|
635
643
|
exception: error && this.config.logException ? {
|
|
@@ -639,6 +647,14 @@ var _RequestLogger = class _RequestLogger {
|
|
|
639
647
|
sentryEventId: getSentryEventId()
|
|
640
648
|
} : void 0
|
|
641
649
|
};
|
|
650
|
+
if (logs && logs.length > 0) {
|
|
651
|
+
item.logs = logs.map((log) => ({
|
|
652
|
+
timestamp: log.timestamp,
|
|
653
|
+
logger: log.logger,
|
|
654
|
+
level: log.level,
|
|
655
|
+
message: truncateLogMessage(log.message)
|
|
656
|
+
}));
|
|
657
|
+
}
|
|
642
658
|
this.pendingWrites.push(item);
|
|
643
659
|
if (this.pendingWrites.length > MAX_PENDING_WRITES) {
|
|
644
660
|
this.pendingWrites.shift();
|
|
@@ -660,7 +676,8 @@ var _RequestLogger = class _RequestLogger {
|
|
|
660
676
|
uuid: item.uuid,
|
|
661
677
|
request: skipEmptyValues(item.request),
|
|
662
678
|
response: skipEmptyValues(item.response),
|
|
663
|
-
exception: item.exception
|
|
679
|
+
exception: item.exception,
|
|
680
|
+
logs: item.logs
|
|
664
681
|
};
|
|
665
682
|
[
|
|
666
683
|
finalItem.request.body,
|
|
@@ -672,7 +689,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
672
689
|
};
|
|
673
690
|
}
|
|
674
691
|
});
|
|
675
|
-
await this.currentFile.writeLine(
|
|
692
|
+
await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
|
|
676
693
|
}
|
|
677
694
|
}
|
|
678
695
|
});
|
|
@@ -724,6 +741,9 @@ var _RequestLogger = class _RequestLogger {
|
|
|
724
741
|
__name(_RequestLogger, "RequestLogger");
|
|
725
742
|
var RequestLogger = _RequestLogger;
|
|
726
743
|
function convertHeaders(headers) {
|
|
744
|
+
if (!headers) {
|
|
745
|
+
return [];
|
|
746
|
+
}
|
|
727
747
|
if (headers instanceof Headers) {
|
|
728
748
|
return Array.from(headers.entries());
|
|
729
749
|
}
|
|
@@ -753,13 +773,13 @@ function convertBody(body, contentType) {
|
|
|
753
773
|
try {
|
|
754
774
|
if (contentType.startsWith("application/json")) {
|
|
755
775
|
if (isValidJsonString(body)) {
|
|
756
|
-
return
|
|
776
|
+
return import_node_buffer2.Buffer.from(body);
|
|
757
777
|
} else {
|
|
758
|
-
return
|
|
778
|
+
return import_node_buffer2.Buffer.from(JSON.stringify(body));
|
|
759
779
|
}
|
|
760
780
|
}
|
|
761
781
|
if (contentType.startsWith("text/") && typeof body === "string") {
|
|
762
|
-
return
|
|
782
|
+
return import_node_buffer2.Buffer.from(body);
|
|
763
783
|
}
|
|
764
784
|
} catch (error) {
|
|
765
785
|
return;
|
|
@@ -787,18 +807,26 @@ __name(matchPatterns, "matchPatterns");
|
|
|
787
807
|
function skipEmptyValues(data) {
|
|
788
808
|
return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
|
|
789
809
|
if (v == null || Number.isNaN(v)) return false;
|
|
790
|
-
if (Array.isArray(v) ||
|
|
810
|
+
if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
|
|
791
811
|
return v.length > 0;
|
|
792
812
|
}
|
|
793
813
|
return true;
|
|
794
814
|
}));
|
|
795
815
|
}
|
|
796
816
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
817
|
+
function truncateLogMessage(msg) {
|
|
818
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
819
|
+
const suffix = "... (truncated)";
|
|
820
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
821
|
+
}
|
|
822
|
+
return msg;
|
|
823
|
+
}
|
|
824
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
797
825
|
function checkWritableFs() {
|
|
798
826
|
try {
|
|
799
|
-
const testPath = (0,
|
|
800
|
-
(0,
|
|
801
|
-
(0,
|
|
827
|
+
const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
|
|
828
|
+
(0, import_node_fs2.writeFileSync)(testPath, "test");
|
|
829
|
+
(0, import_node_fs2.unlinkSync)(testPath);
|
|
802
830
|
return true;
|
|
803
831
|
} catch (error) {
|
|
804
832
|
return false;
|
|
@@ -807,7 +835,7 @@ function checkWritableFs() {
|
|
|
807
835
|
__name(checkWritableFs, "checkWritableFs");
|
|
808
836
|
|
|
809
837
|
// src/common/validationErrorCounter.ts
|
|
810
|
-
var
|
|
838
|
+
var import_node_crypto4 = require("crypto");
|
|
811
839
|
var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
812
840
|
errorCounts;
|
|
813
841
|
errorDetails;
|
|
@@ -831,7 +859,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
831
859
|
consumer: validationError.consumer || null,
|
|
832
860
|
method: validationError.method,
|
|
833
861
|
path: validationError.path,
|
|
834
|
-
loc: validationError.loc.split("."),
|
|
862
|
+
loc: validationError.loc.split(".").filter(Boolean),
|
|
835
863
|
msg: validationError.msg,
|
|
836
864
|
type: validationError.type,
|
|
837
865
|
error_count: count
|
|
@@ -847,11 +875,11 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
847
875
|
validationError.consumer || "",
|
|
848
876
|
validationError.method.toUpperCase(),
|
|
849
877
|
validationError.path,
|
|
850
|
-
validationError.loc,
|
|
878
|
+
validationError.loc.split(".").filter(Boolean),
|
|
851
879
|
validationError.msg.trim(),
|
|
852
880
|
validationError.type
|
|
853
881
|
].join("|");
|
|
854
|
-
return (0,
|
|
882
|
+
return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
|
|
855
883
|
}
|
|
856
884
|
};
|
|
857
885
|
__name(_ValidationErrorCounter, "ValidationErrorCounter");
|
|
@@ -902,7 +930,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
902
930
|
_ApitallyClient.instance = this;
|
|
903
931
|
this.clientId = clientId;
|
|
904
932
|
this.env = env;
|
|
905
|
-
this.instanceUuid = (0,
|
|
933
|
+
this.instanceUuid = (0, import_node_crypto5.randomUUID)();
|
|
906
934
|
this.syncDataQueue = [];
|
|
907
935
|
this.requestCounter = new RequestCounter();
|
|
908
936
|
this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
|
|
@@ -1008,7 +1036,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1008
1036
|
this.logger.debug("Sending startup data to Apitally Hub");
|
|
1009
1037
|
const payload = {
|
|
1010
1038
|
instance_uuid: this.instanceUuid,
|
|
1011
|
-
message_uuid: (0,
|
|
1039
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1012
1040
|
...this.startupData
|
|
1013
1041
|
};
|
|
1014
1042
|
try {
|
|
@@ -1030,7 +1058,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1030
1058
|
const newPayload = {
|
|
1031
1059
|
timestamp: Date.now() / 1e3,
|
|
1032
1060
|
instance_uuid: this.instanceUuid,
|
|
1033
|
-
message_uuid: (0,
|
|
1061
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1034
1062
|
requests: this.requestCounter.getAndResetRequests(),
|
|
1035
1063
|
validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
|
|
1036
1064
|
server_errors: this.serverErrorCounter.getAndResetServerErrors(),
|
|
@@ -1133,7 +1161,7 @@ __publicField(_ApitallyClient, "instance");
|
|
|
1133
1161
|
var ApitallyClient = _ApitallyClient;
|
|
1134
1162
|
|
|
1135
1163
|
// src/common/packageVersions.ts
|
|
1136
|
-
var
|
|
1164
|
+
var import_node_module = require("module");
|
|
1137
1165
|
var import_meta = {};
|
|
1138
1166
|
function getPackageVersion(name) {
|
|
1139
1167
|
const packageJsonPath = `${name}/package.json`;
|
|
@@ -1141,7 +1169,7 @@ function getPackageVersion(name) {
|
|
|
1141
1169
|
return require(packageJsonPath).version || null;
|
|
1142
1170
|
} catch (error) {
|
|
1143
1171
|
try {
|
|
1144
|
-
const _require = (0,
|
|
1172
|
+
const _require = (0, import_node_module.createRequire)(import_meta.url);
|
|
1145
1173
|
return _require(packageJsonPath).version || null;
|
|
1146
1174
|
} catch (error2) {
|
|
1147
1175
|
return null;
|
|
@@ -1150,6 +1178,143 @@ function getPackageVersion(name) {
|
|
|
1150
1178
|
}
|
|
1151
1179
|
__name(getPackageVersion, "getPackageVersion");
|
|
1152
1180
|
|
|
1181
|
+
// src/loggers/console.ts
|
|
1182
|
+
var import_node_util = require("util");
|
|
1183
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1184
|
+
var isPatched = false;
|
|
1185
|
+
var globalLogsContext;
|
|
1186
|
+
function patchConsole(logsContext) {
|
|
1187
|
+
globalLogsContext = logsContext;
|
|
1188
|
+
if (isPatched) {
|
|
1189
|
+
return;
|
|
1190
|
+
}
|
|
1191
|
+
const logMethods = [
|
|
1192
|
+
"log",
|
|
1193
|
+
"warn",
|
|
1194
|
+
"error",
|
|
1195
|
+
"info",
|
|
1196
|
+
"debug"
|
|
1197
|
+
];
|
|
1198
|
+
logMethods.forEach((method) => {
|
|
1199
|
+
const originalMethod = console[method];
|
|
1200
|
+
console[method] = function(...args) {
|
|
1201
|
+
captureLog(method, args);
|
|
1202
|
+
return originalMethod.apply(console, args);
|
|
1203
|
+
};
|
|
1204
|
+
});
|
|
1205
|
+
isPatched = true;
|
|
1206
|
+
}
|
|
1207
|
+
__name(patchConsole, "patchConsole");
|
|
1208
|
+
function captureLog(level, args) {
|
|
1209
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1210
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1211
|
+
logs.push({
|
|
1212
|
+
timestamp: Date.now() / 1e3,
|
|
1213
|
+
logger: "console",
|
|
1214
|
+
level,
|
|
1215
|
+
message: (0, import_node_util.format)(...args)
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
__name(captureLog, "captureLog");
|
|
1220
|
+
|
|
1221
|
+
// src/loggers/utils.ts
|
|
1222
|
+
var import_node_util2 = require("util");
|
|
1223
|
+
function formatMessage(message, ...args) {
|
|
1224
|
+
return [
|
|
1225
|
+
message,
|
|
1226
|
+
...args
|
|
1227
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1228
|
+
}
|
|
1229
|
+
__name(formatMessage, "formatMessage");
|
|
1230
|
+
function removeKeys(obj, keys) {
|
|
1231
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1232
|
+
}
|
|
1233
|
+
__name(removeKeys, "removeKeys");
|
|
1234
|
+
function formatArg(arg) {
|
|
1235
|
+
if (typeof arg === "string") {
|
|
1236
|
+
return arg.trim();
|
|
1237
|
+
}
|
|
1238
|
+
if (arg instanceof Error) {
|
|
1239
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1240
|
+
}
|
|
1241
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1242
|
+
return "";
|
|
1243
|
+
}
|
|
1244
|
+
try {
|
|
1245
|
+
return JSON.stringify(arg);
|
|
1246
|
+
} catch {
|
|
1247
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
__name(formatArg, "formatArg");
|
|
1251
|
+
function isEmptyObject(obj) {
|
|
1252
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1253
|
+
}
|
|
1254
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1255
|
+
|
|
1256
|
+
// src/loggers/pino.ts
|
|
1257
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1258
|
+
|
|
1259
|
+
// src/loggers/winston.ts
|
|
1260
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1261
|
+
var isPatched2 = false;
|
|
1262
|
+
var globalLogsContext2;
|
|
1263
|
+
async function patchWinston(logsContext) {
|
|
1264
|
+
var _a2, _b;
|
|
1265
|
+
globalLogsContext2 = logsContext;
|
|
1266
|
+
if (isPatched2) {
|
|
1267
|
+
return;
|
|
1268
|
+
}
|
|
1269
|
+
try {
|
|
1270
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1271
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1272
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1273
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1274
|
+
captureLog2(info);
|
|
1275
|
+
return originalWrite.call(this, info);
|
|
1276
|
+
};
|
|
1277
|
+
}
|
|
1278
|
+
} catch {
|
|
1279
|
+
}
|
|
1280
|
+
isPatched2 = true;
|
|
1281
|
+
}
|
|
1282
|
+
__name(patchWinston, "patchWinston");
|
|
1283
|
+
function captureLog2(info) {
|
|
1284
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1285
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1286
|
+
return;
|
|
1287
|
+
}
|
|
1288
|
+
try {
|
|
1289
|
+
const rest = removeKeys(info, [
|
|
1290
|
+
"timestamp",
|
|
1291
|
+
"level",
|
|
1292
|
+
"message",
|
|
1293
|
+
"splat"
|
|
1294
|
+
]);
|
|
1295
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1296
|
+
if (formattedMessage) {
|
|
1297
|
+
logs.push({
|
|
1298
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1299
|
+
level: info.level || "info",
|
|
1300
|
+
message: formattedMessage.trim()
|
|
1301
|
+
});
|
|
1302
|
+
}
|
|
1303
|
+
} catch (e) {
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
__name(captureLog2, "captureLog");
|
|
1307
|
+
function parseTimestamp(timestamp) {
|
|
1308
|
+
if (timestamp) {
|
|
1309
|
+
const ts = new Date(timestamp).getTime();
|
|
1310
|
+
if (!isNaN(ts)) {
|
|
1311
|
+
return ts / 1e3;
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
return Date.now() / 1e3;
|
|
1315
|
+
}
|
|
1316
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1317
|
+
|
|
1153
1318
|
// src/koa/middleware.ts
|
|
1154
1319
|
function useApitally(app, config) {
|
|
1155
1320
|
const client = new ApitallyClient(config);
|
|
@@ -1167,77 +1332,85 @@ function useApitally(app, config) {
|
|
|
1167
1332
|
}
|
|
1168
1333
|
__name(useApitally, "useApitally");
|
|
1169
1334
|
function getMiddleware(client) {
|
|
1335
|
+
const logsContext = new import_node_async_hooks.AsyncLocalStorage();
|
|
1336
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1337
|
+
patchConsole(logsContext);
|
|
1338
|
+
patchWinston(logsContext);
|
|
1339
|
+
}
|
|
1170
1340
|
return async (ctx, next) => {
|
|
1171
|
-
var _a2;
|
|
1172
1341
|
if (!client.isEnabled() || ctx.request.method.toUpperCase() === "OPTIONS") {
|
|
1173
1342
|
await next();
|
|
1174
1343
|
return;
|
|
1175
1344
|
}
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
if (path && statusCode === 500 && error instanceof Error) {
|
|
1186
|
-
serverError = error;
|
|
1187
|
-
client.serverErrorCounter.addServerError({
|
|
1188
|
-
consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
|
|
1189
|
-
method: ctx.request.method,
|
|
1190
|
-
path,
|
|
1191
|
-
type: error.name,
|
|
1192
|
-
msg: error.message,
|
|
1193
|
-
traceback: error.stack || ""
|
|
1194
|
-
});
|
|
1195
|
-
}
|
|
1196
|
-
throw error;
|
|
1197
|
-
} finally {
|
|
1198
|
-
const responseTime = performance.now() - startTime;
|
|
1199
|
-
const consumer = getConsumer(ctx);
|
|
1200
|
-
client.consumerRegistry.addOrUpdateConsumer(consumer);
|
|
1201
|
-
if (!path) {
|
|
1345
|
+
await logsContext.run([], async () => {
|
|
1346
|
+
var _a2;
|
|
1347
|
+
let path;
|
|
1348
|
+
let statusCode;
|
|
1349
|
+
let serverError;
|
|
1350
|
+
const startTime = performance.now();
|
|
1351
|
+
try {
|
|
1352
|
+
await next();
|
|
1353
|
+
} catch (error) {
|
|
1202
1354
|
path = getPath(ctx);
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
client.
|
|
1207
|
-
consumer:
|
|
1355
|
+
statusCode = error.statusCode || error.status || 500;
|
|
1356
|
+
if (path && statusCode === 500 && error instanceof Error) {
|
|
1357
|
+
serverError = error;
|
|
1358
|
+
client.serverErrorCounter.addServerError({
|
|
1359
|
+
consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
|
|
1208
1360
|
method: ctx.request.method,
|
|
1209
1361
|
path,
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
responseSize: ctx.response.length
|
|
1214
|
-
});
|
|
1215
|
-
} catch (error) {
|
|
1216
|
-
client.logger.error("Error while logging request in Apitally middleware.", {
|
|
1217
|
-
context: ctx,
|
|
1218
|
-
error
|
|
1362
|
+
type: error.name,
|
|
1363
|
+
msg: error.message,
|
|
1364
|
+
traceback: error.stack || ""
|
|
1219
1365
|
});
|
|
1220
1366
|
}
|
|
1367
|
+
throw error;
|
|
1368
|
+
} finally {
|
|
1369
|
+
const responseTime = performance.now() - startTime;
|
|
1370
|
+
const consumer = getConsumer(ctx);
|
|
1371
|
+
client.consumerRegistry.addOrUpdateConsumer(consumer);
|
|
1372
|
+
if (!path) {
|
|
1373
|
+
path = getPath(ctx);
|
|
1374
|
+
}
|
|
1375
|
+
if (path) {
|
|
1376
|
+
try {
|
|
1377
|
+
client.requestCounter.addRequest({
|
|
1378
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1379
|
+
method: ctx.request.method,
|
|
1380
|
+
path,
|
|
1381
|
+
statusCode: statusCode || ctx.response.status,
|
|
1382
|
+
responseTime,
|
|
1383
|
+
requestSize: ctx.request.length,
|
|
1384
|
+
responseSize: ctx.response.length
|
|
1385
|
+
});
|
|
1386
|
+
} catch (error) {
|
|
1387
|
+
client.logger.error("Error while logging request in Apitally middleware.", {
|
|
1388
|
+
context: ctx,
|
|
1389
|
+
error
|
|
1390
|
+
});
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
if (client.requestLogger.enabled) {
|
|
1394
|
+
const logs = logsContext.getStore();
|
|
1395
|
+
client.requestLogger.logRequest({
|
|
1396
|
+
timestamp: Date.now() / 1e3,
|
|
1397
|
+
method: ctx.request.method,
|
|
1398
|
+
path,
|
|
1399
|
+
url: ctx.request.href,
|
|
1400
|
+
headers: convertHeaders(ctx.request.headers),
|
|
1401
|
+
size: ctx.request.length,
|
|
1402
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1403
|
+
body: convertBody(ctx.request.body, ctx.request.get("content-type"))
|
|
1404
|
+
}, {
|
|
1405
|
+
statusCode: statusCode || ctx.response.status,
|
|
1406
|
+
responseTime: responseTime / 1e3,
|
|
1407
|
+
headers: convertHeaders(ctx.response.headers),
|
|
1408
|
+
size: ctx.response.length,
|
|
1409
|
+
body: convertBody(ctx.response.body, ctx.response.get("content-type"))
|
|
1410
|
+
}, serverError, logs);
|
|
1411
|
+
}
|
|
1221
1412
|
}
|
|
1222
|
-
|
|
1223
|
-
client.requestLogger.logRequest({
|
|
1224
|
-
timestamp: Date.now() / 1e3,
|
|
1225
|
-
method: ctx.request.method,
|
|
1226
|
-
path,
|
|
1227
|
-
url: ctx.request.href,
|
|
1228
|
-
headers: convertHeaders(ctx.request.headers),
|
|
1229
|
-
size: ctx.request.length,
|
|
1230
|
-
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1231
|
-
body: convertBody(ctx.request.body, ctx.request.get("content-type"))
|
|
1232
|
-
}, {
|
|
1233
|
-
statusCode: statusCode || ctx.response.status,
|
|
1234
|
-
responseTime: responseTime / 1e3,
|
|
1235
|
-
headers: convertHeaders(ctx.response.headers),
|
|
1236
|
-
size: ctx.response.length,
|
|
1237
|
-
body: convertBody(ctx.response.body, ctx.response.get("content-type"))
|
|
1238
|
-
}, serverError);
|
|
1239
|
-
}
|
|
1240
|
-
}
|
|
1413
|
+
});
|
|
1241
1414
|
};
|
|
1242
1415
|
}
|
|
1243
1416
|
__name(getMiddleware, "getMiddleware");
|