apitally 0.18.1 → 0.19.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/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 +104 -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 +103 -83
- package/dist/adonisjs/middleware.js.map +1 -1
- package/dist/adonisjs/provider.cjs +4750 -60
- 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 +4728 -15
- package/dist/adonisjs/provider.js.map +1 -1
- package/dist/common/client.cjs +62 -40
- 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 +31 -9
- 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 +54 -33
- package/dist/common/requestLogger.cjs.map +1 -1
- package/dist/common/requestLogger.d.cts +11 -4
- package/dist/common/requestLogger.d.ts +11 -4
- package/dist/common/requestLogger.js +27 -6
- package/dist/common/requestLogger.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 +2 -2
- 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.map +1 -1
- package/dist/express/index.cjs +4979 -167
- 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 +4951 -118
- package/dist/express/index.js.map +1 -1
- package/dist/express/middleware.cjs +4979 -167
- 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 +4951 -118
- package/dist/express/middleware.js.map +1 -1
- package/dist/fastify/index.cjs +4908 -70
- 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 +4881 -22
- package/dist/fastify/index.js.map +1 -1
- package/dist/fastify/plugin.cjs +4908 -70
- 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 +4881 -22
- package/dist/fastify/plugin.js.map +1 -1
- package/dist/h3/index.cjs +219 -50
- 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 +184 -15
- package/dist/h3/index.js.map +1 -1
- package/dist/h3/plugin.cjs +219 -50
- 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 +184 -15
- 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 +278 -110
- 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 +244 -76
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/middleware.cjs +278 -110
- 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 +244 -76
- 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 +275 -105
- 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 +239 -69
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/middleware.cjs +273 -105
- 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 +239 -69
- 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 +4824 -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 +4813 -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 +4656 -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 +4648 -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 +5340 -450
- 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 +5293 -405
- package/dist/nestjs/index.js.map +1 -1
- package/package.json +4 -3
package/dist/hono/middleware.cjs
CHANGED
|
@@ -37,11 +37,12 @@ __export(middleware_exports, {
|
|
|
37
37
|
useApitally: () => useApitally
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(middleware_exports);
|
|
40
|
-
var
|
|
40
|
+
var import_node_async_hooks = require("async_hooks");
|
|
41
|
+
var import_node_perf_hooks = require("perf_hooks");
|
|
41
42
|
|
|
42
43
|
// src/common/client.ts
|
|
43
|
-
var import_crypto5 = require("crypto");
|
|
44
44
|
var import_fetch_retry = __toESM(require("fetch-retry"), 1);
|
|
45
|
+
var import_node_crypto5 = require("crypto");
|
|
45
46
|
|
|
46
47
|
// src/common/consumerRegistry.ts
|
|
47
48
|
var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
|
|
@@ -101,7 +102,7 @@ var ConsumerRegistry = _ConsumerRegistry;
|
|
|
101
102
|
|
|
102
103
|
// src/common/logging.ts
|
|
103
104
|
var import_winston = require("winston");
|
|
104
|
-
|
|
105
|
+
function getLogger() {
|
|
105
106
|
return (0, import_winston.createLogger)({
|
|
106
107
|
level: process.env.APITALLY_DEBUG ? "debug" : "warn",
|
|
107
108
|
format: import_winston.format.combine(import_winston.format.colorize(), import_winston.format.timestamp(), import_winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
|
|
@@ -109,7 +110,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
|
|
|
109
110
|
new import_winston.transports.Console()
|
|
110
111
|
]
|
|
111
112
|
});
|
|
112
|
-
}
|
|
113
|
+
}
|
|
114
|
+
__name(getLogger, "getLogger");
|
|
113
115
|
|
|
114
116
|
// src/common/paramValidation.ts
|
|
115
117
|
function isValidClientId(clientId) {
|
|
@@ -211,11 +213,11 @@ var RequestCounter = _RequestCounter;
|
|
|
211
213
|
|
|
212
214
|
// src/common/requestLogger.ts
|
|
213
215
|
var import_async_lock = __toESM(require("async-lock"), 1);
|
|
214
|
-
var
|
|
215
|
-
var
|
|
216
|
-
var
|
|
217
|
-
var
|
|
218
|
-
var
|
|
216
|
+
var import_node_buffer2 = require("buffer");
|
|
217
|
+
var import_node_crypto3 = require("crypto");
|
|
218
|
+
var import_node_fs2 = require("fs");
|
|
219
|
+
var import_node_os2 = require("os");
|
|
220
|
+
var import_node_path2 = require("path");
|
|
219
221
|
|
|
220
222
|
// src/common/sentry.ts
|
|
221
223
|
var sentry;
|
|
@@ -234,7 +236,7 @@ function getSentryEventId() {
|
|
|
234
236
|
__name(getSentryEventId, "getSentryEventId");
|
|
235
237
|
|
|
236
238
|
// src/common/serverErrorCounter.ts
|
|
237
|
-
var
|
|
239
|
+
var import_node_crypto = require("crypto");
|
|
238
240
|
var MAX_MSG_LENGTH = 2048;
|
|
239
241
|
var MAX_STACKTRACE_LENGTH = 65536;
|
|
240
242
|
var _ServerErrorCounter = class _ServerErrorCounter {
|
|
@@ -276,6 +278,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
276
278
|
});
|
|
277
279
|
this.errorCounts.clear();
|
|
278
280
|
this.errorDetails.clear();
|
|
281
|
+
this.sentryEventIds.clear();
|
|
279
282
|
return data;
|
|
280
283
|
}
|
|
281
284
|
getKey(serverError) {
|
|
@@ -287,7 +290,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
287
290
|
serverError.msg.trim(),
|
|
288
291
|
serverError.traceback.trim()
|
|
289
292
|
].join("|");
|
|
290
|
-
return (0,
|
|
293
|
+
return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
|
|
291
294
|
}
|
|
292
295
|
};
|
|
293
296
|
__name(_ServerErrorCounter, "ServerErrorCounter");
|
|
@@ -320,12 +323,13 @@ function truncateExceptionStackTrace(stack) {
|
|
|
320
323
|
__name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
|
|
321
324
|
|
|
322
325
|
// src/common/tempGzipFile.ts
|
|
323
|
-
var
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var
|
|
327
|
-
var
|
|
328
|
-
var
|
|
326
|
+
var import_node_buffer = require("buffer");
|
|
327
|
+
var import_node_crypto2 = require("crypto");
|
|
328
|
+
var import_node_fs = require("fs");
|
|
329
|
+
var import_promises = require("fs/promises");
|
|
330
|
+
var import_node_os = require("os");
|
|
331
|
+
var import_node_path = require("path");
|
|
332
|
+
var import_node_zlib = require("zlib");
|
|
329
333
|
var _TempGzipFile = class _TempGzipFile {
|
|
330
334
|
uuid;
|
|
331
335
|
filePath;
|
|
@@ -334,9 +338,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
334
338
|
readyPromise;
|
|
335
339
|
closedPromise;
|
|
336
340
|
constructor() {
|
|
337
|
-
this.uuid = (0,
|
|
338
|
-
this.filePath = (0,
|
|
339
|
-
this.writeStream = (0,
|
|
341
|
+
this.uuid = (0, import_node_crypto2.randomUUID)();
|
|
342
|
+
this.filePath = (0, import_node_path.join)((0, import_node_os.tmpdir)(), `apitally-${this.uuid}.gz`);
|
|
343
|
+
this.writeStream = (0, import_node_fs.createWriteStream)(this.filePath);
|
|
340
344
|
this.readyPromise = new Promise((resolve, reject) => {
|
|
341
345
|
this.writeStream.once("ready", resolve);
|
|
342
346
|
this.writeStream.once("error", reject);
|
|
@@ -345,7 +349,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
345
349
|
this.writeStream.once("close", resolve);
|
|
346
350
|
this.writeStream.once("error", reject);
|
|
347
351
|
});
|
|
348
|
-
this.gzip = (0,
|
|
352
|
+
this.gzip = (0, import_node_zlib.createGzip)();
|
|
349
353
|
this.gzip.pipe(this.writeStream);
|
|
350
354
|
}
|
|
351
355
|
get size() {
|
|
@@ -354,9 +358,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
354
358
|
async writeLine(data) {
|
|
355
359
|
await this.readyPromise;
|
|
356
360
|
return new Promise((resolve, reject) => {
|
|
357
|
-
this.gzip.write(
|
|
361
|
+
this.gzip.write(import_node_buffer.Buffer.concat([
|
|
358
362
|
data,
|
|
359
|
-
|
|
363
|
+
import_node_buffer.Buffer.from("\n")
|
|
360
364
|
]), (error) => {
|
|
361
365
|
if (error) {
|
|
362
366
|
reject(error);
|
|
@@ -368,7 +372,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
368
372
|
}
|
|
369
373
|
async getContent() {
|
|
370
374
|
return new Promise((resolve, reject) => {
|
|
371
|
-
(0,
|
|
375
|
+
(0, import_node_fs.readFile)(this.filePath, (error, data) => {
|
|
372
376
|
if (error) {
|
|
373
377
|
reject(error);
|
|
374
378
|
} else {
|
|
@@ -387,7 +391,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
387
391
|
}
|
|
388
392
|
async delete() {
|
|
389
393
|
await this.close();
|
|
390
|
-
(0,
|
|
394
|
+
await (0, import_promises.unlink)(this.filePath);
|
|
391
395
|
}
|
|
392
396
|
};
|
|
393
397
|
__name(_TempGzipFile, "TempGzipFile");
|
|
@@ -398,8 +402,9 @@ var MAX_BODY_SIZE = 5e4;
|
|
|
398
402
|
var MAX_FILE_SIZE = 1e6;
|
|
399
403
|
var MAX_FILES = 50;
|
|
400
404
|
var MAX_PENDING_WRITES = 100;
|
|
401
|
-
var
|
|
402
|
-
var
|
|
405
|
+
var MAX_LOG_MSG_LENGTH = 2048;
|
|
406
|
+
var BODY_TOO_LARGE = import_node_buffer2.Buffer.from("<body too large>");
|
|
407
|
+
var BODY_MASKED = import_node_buffer2.Buffer.from("<masked>");
|
|
403
408
|
var MASKED = "******";
|
|
404
409
|
var ALLOWED_CONTENT_TYPES = [
|
|
405
410
|
"application/json",
|
|
@@ -454,6 +459,7 @@ var DEFAULT_CONFIG = {
|
|
|
454
459
|
logResponseHeaders: true,
|
|
455
460
|
logResponseBody: false,
|
|
456
461
|
logException: true,
|
|
462
|
+
captureLogs: false,
|
|
457
463
|
maskQueryParams: [],
|
|
458
464
|
maskHeaders: [],
|
|
459
465
|
maskBodyFields: [],
|
|
@@ -596,7 +602,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
596
602
|
try {
|
|
597
603
|
const parsedBody = JSON.parse(bodyData.toString());
|
|
598
604
|
const maskedBody = this.maskBody(parsedBody);
|
|
599
|
-
item[key].body =
|
|
605
|
+
item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
|
|
600
606
|
} catch {
|
|
601
607
|
}
|
|
602
608
|
}
|
|
@@ -608,7 +614,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
608
614
|
item.request.url = url.toString();
|
|
609
615
|
return item;
|
|
610
616
|
}
|
|
611
|
-
logRequest(request, response, error) {
|
|
617
|
+
logRequest(request, response, error, logs) {
|
|
612
618
|
var _a2, _b, _c;
|
|
613
619
|
if (!this.enabled || this.suspendUntil !== null) return;
|
|
614
620
|
const url = new URL(request.url);
|
|
@@ -630,7 +636,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
630
636
|
response.size = void 0;
|
|
631
637
|
}
|
|
632
638
|
const item = {
|
|
633
|
-
uuid: (0,
|
|
639
|
+
uuid: (0, import_node_crypto3.randomUUID)(),
|
|
634
640
|
request,
|
|
635
641
|
response,
|
|
636
642
|
exception: error && this.config.logException ? {
|
|
@@ -640,6 +646,14 @@ var _RequestLogger = class _RequestLogger {
|
|
|
640
646
|
sentryEventId: getSentryEventId()
|
|
641
647
|
} : void 0
|
|
642
648
|
};
|
|
649
|
+
if (logs && logs.length > 0) {
|
|
650
|
+
item.logs = logs.map((log) => ({
|
|
651
|
+
timestamp: log.timestamp,
|
|
652
|
+
logger: log.logger,
|
|
653
|
+
level: log.level,
|
|
654
|
+
message: truncateLogMessage(log.message)
|
|
655
|
+
}));
|
|
656
|
+
}
|
|
643
657
|
this.pendingWrites.push(item);
|
|
644
658
|
if (this.pendingWrites.length > MAX_PENDING_WRITES) {
|
|
645
659
|
this.pendingWrites.shift();
|
|
@@ -661,7 +675,8 @@ var _RequestLogger = class _RequestLogger {
|
|
|
661
675
|
uuid: item.uuid,
|
|
662
676
|
request: skipEmptyValues(item.request),
|
|
663
677
|
response: skipEmptyValues(item.response),
|
|
664
|
-
exception: item.exception
|
|
678
|
+
exception: item.exception,
|
|
679
|
+
logs: item.logs
|
|
665
680
|
};
|
|
666
681
|
[
|
|
667
682
|
finalItem.request.body,
|
|
@@ -673,7 +688,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
673
688
|
};
|
|
674
689
|
}
|
|
675
690
|
});
|
|
676
|
-
await this.currentFile.writeLine(
|
|
691
|
+
await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
|
|
677
692
|
}
|
|
678
693
|
}
|
|
679
694
|
});
|
|
@@ -756,18 +771,26 @@ __name(matchPatterns, "matchPatterns");
|
|
|
756
771
|
function skipEmptyValues(data) {
|
|
757
772
|
return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
|
|
758
773
|
if (v == null || Number.isNaN(v)) return false;
|
|
759
|
-
if (Array.isArray(v) ||
|
|
774
|
+
if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
|
|
760
775
|
return v.length > 0;
|
|
761
776
|
}
|
|
762
777
|
return true;
|
|
763
778
|
}));
|
|
764
779
|
}
|
|
765
780
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
781
|
+
function truncateLogMessage(msg) {
|
|
782
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
783
|
+
const suffix = "... (truncated)";
|
|
784
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
785
|
+
}
|
|
786
|
+
return msg;
|
|
787
|
+
}
|
|
788
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
766
789
|
function checkWritableFs() {
|
|
767
790
|
try {
|
|
768
|
-
const testPath = (0,
|
|
769
|
-
(0,
|
|
770
|
-
(0,
|
|
791
|
+
const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
|
|
792
|
+
(0, import_node_fs2.writeFileSync)(testPath, "test");
|
|
793
|
+
(0, import_node_fs2.unlinkSync)(testPath);
|
|
771
794
|
return true;
|
|
772
795
|
} catch (error) {
|
|
773
796
|
return false;
|
|
@@ -776,7 +799,7 @@ function checkWritableFs() {
|
|
|
776
799
|
__name(checkWritableFs, "checkWritableFs");
|
|
777
800
|
|
|
778
801
|
// src/common/validationErrorCounter.ts
|
|
779
|
-
var
|
|
802
|
+
var import_node_crypto4 = require("crypto");
|
|
780
803
|
var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
781
804
|
errorCounts;
|
|
782
805
|
errorDetails;
|
|
@@ -820,7 +843,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
820
843
|
validationError.msg.trim(),
|
|
821
844
|
validationError.type
|
|
822
845
|
].join("|");
|
|
823
|
-
return (0,
|
|
846
|
+
return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
|
|
824
847
|
}
|
|
825
848
|
};
|
|
826
849
|
__name(_ValidationErrorCounter, "ValidationErrorCounter");
|
|
@@ -871,7 +894,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
871
894
|
_ApitallyClient.instance = this;
|
|
872
895
|
this.clientId = clientId;
|
|
873
896
|
this.env = env;
|
|
874
|
-
this.instanceUuid = (0,
|
|
897
|
+
this.instanceUuid = (0, import_node_crypto5.randomUUID)();
|
|
875
898
|
this.syncDataQueue = [];
|
|
876
899
|
this.requestCounter = new RequestCounter();
|
|
877
900
|
this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
|
|
@@ -977,7 +1000,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
977
1000
|
this.logger.debug("Sending startup data to Apitally Hub");
|
|
978
1001
|
const payload = {
|
|
979
1002
|
instance_uuid: this.instanceUuid,
|
|
980
|
-
message_uuid: (0,
|
|
1003
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
981
1004
|
...this.startupData
|
|
982
1005
|
};
|
|
983
1006
|
try {
|
|
@@ -999,7 +1022,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
999
1022
|
const newPayload = {
|
|
1000
1023
|
timestamp: Date.now() / 1e3,
|
|
1001
1024
|
instance_uuid: this.instanceUuid,
|
|
1002
|
-
message_uuid: (0,
|
|
1025
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1003
1026
|
requests: this.requestCounter.getAndResetRequests(),
|
|
1004
1027
|
validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
|
|
1005
1028
|
server_errors: this.serverErrorCounter.getAndResetServerErrors(),
|
|
@@ -1191,11 +1214,148 @@ async function teeResponse(response) {
|
|
|
1191
1214
|
}
|
|
1192
1215
|
__name(teeResponse, "teeResponse");
|
|
1193
1216
|
|
|
1217
|
+
// src/loggers/console.ts
|
|
1218
|
+
var import_node_util = require("util");
|
|
1219
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1220
|
+
var isPatched = false;
|
|
1221
|
+
var globalLogsContext;
|
|
1222
|
+
function patchConsole(logsContext) {
|
|
1223
|
+
globalLogsContext = logsContext;
|
|
1224
|
+
if (isPatched) {
|
|
1225
|
+
return;
|
|
1226
|
+
}
|
|
1227
|
+
const logMethods = [
|
|
1228
|
+
"log",
|
|
1229
|
+
"warn",
|
|
1230
|
+
"error",
|
|
1231
|
+
"info",
|
|
1232
|
+
"debug"
|
|
1233
|
+
];
|
|
1234
|
+
logMethods.forEach((method) => {
|
|
1235
|
+
const originalMethod = console[method];
|
|
1236
|
+
console[method] = function(...args) {
|
|
1237
|
+
captureLog(method, args);
|
|
1238
|
+
return originalMethod.apply(console, args);
|
|
1239
|
+
};
|
|
1240
|
+
});
|
|
1241
|
+
isPatched = true;
|
|
1242
|
+
}
|
|
1243
|
+
__name(patchConsole, "patchConsole");
|
|
1244
|
+
function captureLog(level, args) {
|
|
1245
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1246
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1247
|
+
logs.push({
|
|
1248
|
+
timestamp: Date.now() / 1e3,
|
|
1249
|
+
logger: "console",
|
|
1250
|
+
level,
|
|
1251
|
+
message: (0, import_node_util.format)(...args)
|
|
1252
|
+
});
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
__name(captureLog, "captureLog");
|
|
1256
|
+
|
|
1257
|
+
// src/loggers/utils.ts
|
|
1258
|
+
var import_node_util2 = require("util");
|
|
1259
|
+
function formatMessage(message, ...args) {
|
|
1260
|
+
return [
|
|
1261
|
+
message,
|
|
1262
|
+
...args
|
|
1263
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1264
|
+
}
|
|
1265
|
+
__name(formatMessage, "formatMessage");
|
|
1266
|
+
function removeKeys(obj, keys) {
|
|
1267
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1268
|
+
}
|
|
1269
|
+
__name(removeKeys, "removeKeys");
|
|
1270
|
+
function formatArg(arg) {
|
|
1271
|
+
if (typeof arg === "string") {
|
|
1272
|
+
return arg.trim();
|
|
1273
|
+
}
|
|
1274
|
+
if (arg instanceof Error) {
|
|
1275
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1276
|
+
}
|
|
1277
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1278
|
+
return "";
|
|
1279
|
+
}
|
|
1280
|
+
try {
|
|
1281
|
+
return JSON.stringify(arg);
|
|
1282
|
+
} catch {
|
|
1283
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
__name(formatArg, "formatArg");
|
|
1287
|
+
function isEmptyObject(obj) {
|
|
1288
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1289
|
+
}
|
|
1290
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1291
|
+
|
|
1292
|
+
// src/loggers/pino.ts
|
|
1293
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1294
|
+
|
|
1295
|
+
// src/loggers/winston.ts
|
|
1296
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1297
|
+
var isPatched2 = false;
|
|
1298
|
+
var globalLogsContext2;
|
|
1299
|
+
async function patchWinston(logsContext) {
|
|
1300
|
+
var _a2, _b;
|
|
1301
|
+
globalLogsContext2 = logsContext;
|
|
1302
|
+
if (isPatched2) {
|
|
1303
|
+
return;
|
|
1304
|
+
}
|
|
1305
|
+
try {
|
|
1306
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1307
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1308
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1309
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1310
|
+
captureLog2(info);
|
|
1311
|
+
return originalWrite.call(this, info);
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
} catch {
|
|
1315
|
+
}
|
|
1316
|
+
isPatched2 = true;
|
|
1317
|
+
}
|
|
1318
|
+
__name(patchWinston, "patchWinston");
|
|
1319
|
+
function captureLog2(info) {
|
|
1320
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1321
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1322
|
+
return;
|
|
1323
|
+
}
|
|
1324
|
+
try {
|
|
1325
|
+
const rest = removeKeys(info, [
|
|
1326
|
+
"timestamp",
|
|
1327
|
+
"level",
|
|
1328
|
+
"message",
|
|
1329
|
+
"splat"
|
|
1330
|
+
]);
|
|
1331
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1332
|
+
if (formattedMessage) {
|
|
1333
|
+
logs.push({
|
|
1334
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1335
|
+
level: info.level || "info",
|
|
1336
|
+
message: formattedMessage.trim()
|
|
1337
|
+
});
|
|
1338
|
+
}
|
|
1339
|
+
} catch (e) {
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
__name(captureLog2, "captureLog");
|
|
1343
|
+
function parseTimestamp(timestamp) {
|
|
1344
|
+
if (timestamp) {
|
|
1345
|
+
const ts = new Date(timestamp).getTime();
|
|
1346
|
+
if (!isNaN(ts)) {
|
|
1347
|
+
return ts / 1e3;
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
return Date.now() / 1e3;
|
|
1351
|
+
}
|
|
1352
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1353
|
+
|
|
1194
1354
|
// src/hono/utils.ts
|
|
1195
1355
|
var import_handler = require("hono/utils/handler");
|
|
1196
1356
|
|
|
1197
1357
|
// src/common/packageVersions.ts
|
|
1198
|
-
var
|
|
1358
|
+
var import_node_module = require("module");
|
|
1199
1359
|
var import_meta = {};
|
|
1200
1360
|
function getPackageVersion(name) {
|
|
1201
1361
|
const packageJsonPath = `${name}/package.json`;
|
|
@@ -1203,7 +1363,7 @@ function getPackageVersion(name) {
|
|
|
1203
1363
|
return require(packageJsonPath).version || null;
|
|
1204
1364
|
} catch (error) {
|
|
1205
1365
|
try {
|
|
1206
|
-
const _require = (0,
|
|
1366
|
+
const _require = (0, import_node_module.createRequire)(import_meta.url);
|
|
1207
1367
|
return _require(packageJsonPath).version || null;
|
|
1208
1368
|
} catch (error2) {
|
|
1209
1369
|
return null;
|
|
@@ -1305,84 +1465,92 @@ function useApitally(app, config) {
|
|
|
1305
1465
|
}
|
|
1306
1466
|
__name(useApitally, "useApitally");
|
|
1307
1467
|
function getMiddleware(client) {
|
|
1468
|
+
const logsContext = new import_node_async_hooks.AsyncLocalStorage();
|
|
1469
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1470
|
+
patchConsole(logsContext);
|
|
1471
|
+
patchWinston(logsContext);
|
|
1472
|
+
}
|
|
1308
1473
|
return async (c, next) => {
|
|
1309
1474
|
if (!client.isEnabled() || c.req.method.toUpperCase() === "OPTIONS") {
|
|
1310
1475
|
await next();
|
|
1311
1476
|
return;
|
|
1312
1477
|
}
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
method: c.req.method,
|
|
1325
|
-
path: c.req.routePath,
|
|
1326
|
-
statusCode: c.res.status,
|
|
1327
|
-
responseTime,
|
|
1328
|
-
requestSize,
|
|
1329
|
-
responseSize
|
|
1330
|
-
});
|
|
1331
|
-
response = newResponse;
|
|
1332
|
-
if (c.res.status === 400) {
|
|
1333
|
-
const [responseJson, newResponse2] = await getResponseJson(response);
|
|
1334
|
-
const validationErrors = extractZodErrors(responseJson);
|
|
1335
|
-
validationErrors.forEach((error) => {
|
|
1336
|
-
client.validationErrorCounter.addValidationError({
|
|
1337
|
-
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1338
|
-
method: c.req.method,
|
|
1339
|
-
path: c.req.routePath,
|
|
1340
|
-
...error
|
|
1341
|
-
});
|
|
1342
|
-
});
|
|
1343
|
-
response = newResponse2;
|
|
1344
|
-
}
|
|
1345
|
-
if (c.error) {
|
|
1346
|
-
client.serverErrorCounter.addServerError({
|
|
1478
|
+
await logsContext.run([], async () => {
|
|
1479
|
+
const timestamp = Date.now() / 1e3;
|
|
1480
|
+
const startTime = import_node_perf_hooks.performance.now();
|
|
1481
|
+
await next();
|
|
1482
|
+
let response;
|
|
1483
|
+
const responseTime = import_node_perf_hooks.performance.now() - startTime;
|
|
1484
|
+
const [responseSize, newResponse] = await measureResponseSize(c.res);
|
|
1485
|
+
const requestSize = parseContentLength(c.req.header("content-length"));
|
|
1486
|
+
const consumer = getConsumer(c);
|
|
1487
|
+
client.consumerRegistry.addOrUpdateConsumer(consumer);
|
|
1488
|
+
client.requestCounter.addRequest({
|
|
1347
1489
|
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1348
1490
|
method: c.req.method,
|
|
1349
1491
|
path: c.req.routePath,
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1492
|
+
statusCode: c.res.status,
|
|
1493
|
+
responseTime,
|
|
1494
|
+
requestSize,
|
|
1495
|
+
responseSize
|
|
1353
1496
|
});
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1497
|
+
response = newResponse;
|
|
1498
|
+
if (c.res.status === 400) {
|
|
1499
|
+
const [responseJson, newResponse2] = await getResponseJson(response);
|
|
1500
|
+
const validationErrors = extractZodErrors(responseJson);
|
|
1501
|
+
validationErrors.forEach((error) => {
|
|
1502
|
+
client.validationErrorCounter.addValidationError({
|
|
1503
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1504
|
+
method: c.req.method,
|
|
1505
|
+
path: c.req.routePath,
|
|
1506
|
+
...error
|
|
1507
|
+
});
|
|
1508
|
+
});
|
|
1366
1509
|
response = newResponse2;
|
|
1367
1510
|
}
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
}
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1511
|
+
if (c.error) {
|
|
1512
|
+
client.serverErrorCounter.addServerError({
|
|
1513
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1514
|
+
method: c.req.method,
|
|
1515
|
+
path: c.req.routePath,
|
|
1516
|
+
type: c.error.name,
|
|
1517
|
+
msg: c.error.message,
|
|
1518
|
+
traceback: c.error.stack || ""
|
|
1519
|
+
});
|
|
1520
|
+
}
|
|
1521
|
+
if (client.requestLogger.enabled) {
|
|
1522
|
+
let requestBody;
|
|
1523
|
+
let responseBody;
|
|
1524
|
+
let newResponse2 = response;
|
|
1525
|
+
const requestContentType = c.req.header("content-type");
|
|
1526
|
+
const responseContentType = c.res.headers.get("content-type");
|
|
1527
|
+
if (client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType)) {
|
|
1528
|
+
requestBody = Buffer.from(await c.req.arrayBuffer());
|
|
1529
|
+
}
|
|
1530
|
+
if (client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType)) {
|
|
1531
|
+
[responseBody, newResponse2] = await getResponseBody(response);
|
|
1532
|
+
response = newResponse2;
|
|
1533
|
+
}
|
|
1534
|
+
const logs = logsContext.getStore();
|
|
1535
|
+
client.requestLogger.logRequest({
|
|
1536
|
+
timestamp,
|
|
1537
|
+
method: c.req.method,
|
|
1538
|
+
path: c.req.routePath,
|
|
1539
|
+
url: c.req.url,
|
|
1540
|
+
headers: convertHeaders(c.req.header()),
|
|
1541
|
+
size: requestSize,
|
|
1542
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1543
|
+
body: requestBody
|
|
1544
|
+
}, {
|
|
1545
|
+
statusCode: c.res.status,
|
|
1546
|
+
responseTime: responseTime / 1e3,
|
|
1547
|
+
headers: convertHeaders(c.res.headers),
|
|
1548
|
+
size: responseSize,
|
|
1549
|
+
body: responseBody
|
|
1550
|
+
}, c.error, logs);
|
|
1551
|
+
}
|
|
1552
|
+
c.res = response;
|
|
1553
|
+
});
|
|
1386
1554
|
};
|
|
1387
1555
|
}
|
|
1388
1556
|
__name(getMiddleware, "getMiddleware");
|