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/h3/plugin.cjs
CHANGED
|
@@ -38,11 +38,12 @@ __export(plugin_exports, {
|
|
|
38
38
|
});
|
|
39
39
|
module.exports = __toCommonJS(plugin_exports);
|
|
40
40
|
var import_h3 = require("h3");
|
|
41
|
-
var
|
|
41
|
+
var import_node_async_hooks = require("async_hooks");
|
|
42
|
+
var import_node_perf_hooks = require("perf_hooks");
|
|
42
43
|
|
|
43
44
|
// src/common/client.ts
|
|
44
|
-
var import_crypto5 = require("crypto");
|
|
45
45
|
var import_fetch_retry = __toESM(require("fetch-retry"), 1);
|
|
46
|
+
var import_node_crypto5 = require("crypto");
|
|
46
47
|
|
|
47
48
|
// src/common/consumerRegistry.ts
|
|
48
49
|
var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
|
|
@@ -102,7 +103,7 @@ var ConsumerRegistry = _ConsumerRegistry;
|
|
|
102
103
|
|
|
103
104
|
// src/common/logging.ts
|
|
104
105
|
var import_winston = require("winston");
|
|
105
|
-
|
|
106
|
+
function getLogger() {
|
|
106
107
|
return (0, import_winston.createLogger)({
|
|
107
108
|
level: process.env.APITALLY_DEBUG ? "debug" : "warn",
|
|
108
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}`)),
|
|
@@ -110,7 +111,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
|
|
|
110
111
|
new import_winston.transports.Console()
|
|
111
112
|
]
|
|
112
113
|
});
|
|
113
|
-
}
|
|
114
|
+
}
|
|
115
|
+
__name(getLogger, "getLogger");
|
|
114
116
|
|
|
115
117
|
// src/common/paramValidation.ts
|
|
116
118
|
function isValidClientId(clientId) {
|
|
@@ -212,11 +214,11 @@ var RequestCounter = _RequestCounter;
|
|
|
212
214
|
|
|
213
215
|
// src/common/requestLogger.ts
|
|
214
216
|
var import_async_lock = __toESM(require("async-lock"), 1);
|
|
215
|
-
var
|
|
216
|
-
var
|
|
217
|
-
var
|
|
218
|
-
var
|
|
219
|
-
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");
|
|
220
222
|
|
|
221
223
|
// src/common/sentry.ts
|
|
222
224
|
var sentry;
|
|
@@ -235,7 +237,7 @@ function getSentryEventId() {
|
|
|
235
237
|
__name(getSentryEventId, "getSentryEventId");
|
|
236
238
|
|
|
237
239
|
// src/common/serverErrorCounter.ts
|
|
238
|
-
var
|
|
240
|
+
var import_node_crypto = require("crypto");
|
|
239
241
|
var MAX_MSG_LENGTH = 2048;
|
|
240
242
|
var MAX_STACKTRACE_LENGTH = 65536;
|
|
241
243
|
var _ServerErrorCounter = class _ServerErrorCounter {
|
|
@@ -277,6 +279,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
277
279
|
});
|
|
278
280
|
this.errorCounts.clear();
|
|
279
281
|
this.errorDetails.clear();
|
|
282
|
+
this.sentryEventIds.clear();
|
|
280
283
|
return data;
|
|
281
284
|
}
|
|
282
285
|
getKey(serverError) {
|
|
@@ -288,7 +291,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
288
291
|
serverError.msg.trim(),
|
|
289
292
|
serverError.traceback.trim()
|
|
290
293
|
].join("|");
|
|
291
|
-
return (0,
|
|
294
|
+
return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
|
|
292
295
|
}
|
|
293
296
|
};
|
|
294
297
|
__name(_ServerErrorCounter, "ServerErrorCounter");
|
|
@@ -321,12 +324,13 @@ function truncateExceptionStackTrace(stack) {
|
|
|
321
324
|
__name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
|
|
322
325
|
|
|
323
326
|
// src/common/tempGzipFile.ts
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var
|
|
327
|
-
var
|
|
328
|
-
var
|
|
329
|
-
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");
|
|
330
334
|
var _TempGzipFile = class _TempGzipFile {
|
|
331
335
|
uuid;
|
|
332
336
|
filePath;
|
|
@@ -335,9 +339,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
335
339
|
readyPromise;
|
|
336
340
|
closedPromise;
|
|
337
341
|
constructor() {
|
|
338
|
-
this.uuid = (0,
|
|
339
|
-
this.filePath = (0,
|
|
340
|
-
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);
|
|
341
345
|
this.readyPromise = new Promise((resolve, reject) => {
|
|
342
346
|
this.writeStream.once("ready", resolve);
|
|
343
347
|
this.writeStream.once("error", reject);
|
|
@@ -346,7 +350,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
346
350
|
this.writeStream.once("close", resolve);
|
|
347
351
|
this.writeStream.once("error", reject);
|
|
348
352
|
});
|
|
349
|
-
this.gzip = (0,
|
|
353
|
+
this.gzip = (0, import_node_zlib.createGzip)();
|
|
350
354
|
this.gzip.pipe(this.writeStream);
|
|
351
355
|
}
|
|
352
356
|
get size() {
|
|
@@ -355,9 +359,9 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
355
359
|
async writeLine(data) {
|
|
356
360
|
await this.readyPromise;
|
|
357
361
|
return new Promise((resolve, reject) => {
|
|
358
|
-
this.gzip.write(
|
|
362
|
+
this.gzip.write(import_node_buffer.Buffer.concat([
|
|
359
363
|
data,
|
|
360
|
-
|
|
364
|
+
import_node_buffer.Buffer.from("\n")
|
|
361
365
|
]), (error) => {
|
|
362
366
|
if (error) {
|
|
363
367
|
reject(error);
|
|
@@ -369,7 +373,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
369
373
|
}
|
|
370
374
|
async getContent() {
|
|
371
375
|
return new Promise((resolve, reject) => {
|
|
372
|
-
(0,
|
|
376
|
+
(0, import_node_fs.readFile)(this.filePath, (error, data) => {
|
|
373
377
|
if (error) {
|
|
374
378
|
reject(error);
|
|
375
379
|
} else {
|
|
@@ -388,7 +392,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
388
392
|
}
|
|
389
393
|
async delete() {
|
|
390
394
|
await this.close();
|
|
391
|
-
(0,
|
|
395
|
+
await (0, import_promises.unlink)(this.filePath);
|
|
392
396
|
}
|
|
393
397
|
};
|
|
394
398
|
__name(_TempGzipFile, "TempGzipFile");
|
|
@@ -399,8 +403,9 @@ var MAX_BODY_SIZE = 5e4;
|
|
|
399
403
|
var MAX_FILE_SIZE = 1e6;
|
|
400
404
|
var MAX_FILES = 50;
|
|
401
405
|
var MAX_PENDING_WRITES = 100;
|
|
402
|
-
var
|
|
403
|
-
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>");
|
|
404
409
|
var MASKED = "******";
|
|
405
410
|
var ALLOWED_CONTENT_TYPES = [
|
|
406
411
|
"application/json",
|
|
@@ -455,6 +460,7 @@ var DEFAULT_CONFIG = {
|
|
|
455
460
|
logResponseHeaders: true,
|
|
456
461
|
logResponseBody: false,
|
|
457
462
|
logException: true,
|
|
463
|
+
captureLogs: false,
|
|
458
464
|
maskQueryParams: [],
|
|
459
465
|
maskHeaders: [],
|
|
460
466
|
maskBodyFields: [],
|
|
@@ -597,7 +603,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
597
603
|
try {
|
|
598
604
|
const parsedBody = JSON.parse(bodyData.toString());
|
|
599
605
|
const maskedBody = this.maskBody(parsedBody);
|
|
600
|
-
item[key].body =
|
|
606
|
+
item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
|
|
601
607
|
} catch {
|
|
602
608
|
}
|
|
603
609
|
}
|
|
@@ -609,7 +615,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
609
615
|
item.request.url = url.toString();
|
|
610
616
|
return item;
|
|
611
617
|
}
|
|
612
|
-
logRequest(request, response, error) {
|
|
618
|
+
logRequest(request, response, error, logs) {
|
|
613
619
|
var _a2, _b, _c;
|
|
614
620
|
if (!this.enabled || this.suspendUntil !== null) return;
|
|
615
621
|
const url = new URL(request.url);
|
|
@@ -631,7 +637,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
631
637
|
response.size = void 0;
|
|
632
638
|
}
|
|
633
639
|
const item = {
|
|
634
|
-
uuid: (0,
|
|
640
|
+
uuid: (0, import_node_crypto3.randomUUID)(),
|
|
635
641
|
request,
|
|
636
642
|
response,
|
|
637
643
|
exception: error && this.config.logException ? {
|
|
@@ -641,6 +647,14 @@ var _RequestLogger = class _RequestLogger {
|
|
|
641
647
|
sentryEventId: getSentryEventId()
|
|
642
648
|
} : void 0
|
|
643
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
|
+
}
|
|
644
658
|
this.pendingWrites.push(item);
|
|
645
659
|
if (this.pendingWrites.length > MAX_PENDING_WRITES) {
|
|
646
660
|
this.pendingWrites.shift();
|
|
@@ -662,7 +676,8 @@ var _RequestLogger = class _RequestLogger {
|
|
|
662
676
|
uuid: item.uuid,
|
|
663
677
|
request: skipEmptyValues(item.request),
|
|
664
678
|
response: skipEmptyValues(item.response),
|
|
665
|
-
exception: item.exception
|
|
679
|
+
exception: item.exception,
|
|
680
|
+
logs: item.logs
|
|
666
681
|
};
|
|
667
682
|
[
|
|
668
683
|
finalItem.request.body,
|
|
@@ -674,7 +689,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
674
689
|
};
|
|
675
690
|
}
|
|
676
691
|
});
|
|
677
|
-
await this.currentFile.writeLine(
|
|
692
|
+
await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
|
|
678
693
|
}
|
|
679
694
|
}
|
|
680
695
|
});
|
|
@@ -757,18 +772,26 @@ __name(matchPatterns, "matchPatterns");
|
|
|
757
772
|
function skipEmptyValues(data) {
|
|
758
773
|
return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
|
|
759
774
|
if (v == null || Number.isNaN(v)) return false;
|
|
760
|
-
if (Array.isArray(v) ||
|
|
775
|
+
if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
|
|
761
776
|
return v.length > 0;
|
|
762
777
|
}
|
|
763
778
|
return true;
|
|
764
779
|
}));
|
|
765
780
|
}
|
|
766
781
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
782
|
+
function truncateLogMessage(msg) {
|
|
783
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
784
|
+
const suffix = "... (truncated)";
|
|
785
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
786
|
+
}
|
|
787
|
+
return msg;
|
|
788
|
+
}
|
|
789
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
767
790
|
function checkWritableFs() {
|
|
768
791
|
try {
|
|
769
|
-
const testPath = (0,
|
|
770
|
-
(0,
|
|
771
|
-
(0,
|
|
792
|
+
const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
|
|
793
|
+
(0, import_node_fs2.writeFileSync)(testPath, "test");
|
|
794
|
+
(0, import_node_fs2.unlinkSync)(testPath);
|
|
772
795
|
return true;
|
|
773
796
|
} catch (error) {
|
|
774
797
|
return false;
|
|
@@ -777,7 +800,7 @@ function checkWritableFs() {
|
|
|
777
800
|
__name(checkWritableFs, "checkWritableFs");
|
|
778
801
|
|
|
779
802
|
// src/common/validationErrorCounter.ts
|
|
780
|
-
var
|
|
803
|
+
var import_node_crypto4 = require("crypto");
|
|
781
804
|
var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
782
805
|
errorCounts;
|
|
783
806
|
errorDetails;
|
|
@@ -821,7 +844,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
821
844
|
validationError.msg.trim(),
|
|
822
845
|
validationError.type
|
|
823
846
|
].join("|");
|
|
824
|
-
return (0,
|
|
847
|
+
return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
|
|
825
848
|
}
|
|
826
849
|
};
|
|
827
850
|
__name(_ValidationErrorCounter, "ValidationErrorCounter");
|
|
@@ -872,7 +895,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
872
895
|
_ApitallyClient.instance = this;
|
|
873
896
|
this.clientId = clientId;
|
|
874
897
|
this.env = env;
|
|
875
|
-
this.instanceUuid = (0,
|
|
898
|
+
this.instanceUuid = (0, import_node_crypto5.randomUUID)();
|
|
876
899
|
this.syncDataQueue = [];
|
|
877
900
|
this.requestCounter = new RequestCounter();
|
|
878
901
|
this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
|
|
@@ -978,7 +1001,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
978
1001
|
this.logger.debug("Sending startup data to Apitally Hub");
|
|
979
1002
|
const payload = {
|
|
980
1003
|
instance_uuid: this.instanceUuid,
|
|
981
|
-
message_uuid: (0,
|
|
1004
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
982
1005
|
...this.startupData
|
|
983
1006
|
};
|
|
984
1007
|
try {
|
|
@@ -1000,7 +1023,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1000
1023
|
const newPayload = {
|
|
1001
1024
|
timestamp: Date.now() / 1e3,
|
|
1002
1025
|
instance_uuid: this.instanceUuid,
|
|
1003
|
-
message_uuid: (0,
|
|
1026
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1004
1027
|
requests: this.requestCounter.getAndResetRequests(),
|
|
1005
1028
|
validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
|
|
1006
1029
|
server_errors: this.serverErrorCounter.getAndResetServerErrors(),
|
|
@@ -1183,8 +1206,145 @@ async function teeResponse(response) {
|
|
|
1183
1206
|
}
|
|
1184
1207
|
__name(teeResponse, "teeResponse");
|
|
1185
1208
|
|
|
1209
|
+
// src/loggers/console.ts
|
|
1210
|
+
var import_node_util = require("util");
|
|
1211
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1212
|
+
var isPatched = false;
|
|
1213
|
+
var globalLogsContext;
|
|
1214
|
+
function patchConsole(logsContext) {
|
|
1215
|
+
globalLogsContext = logsContext;
|
|
1216
|
+
if (isPatched) {
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
const logMethods = [
|
|
1220
|
+
"log",
|
|
1221
|
+
"warn",
|
|
1222
|
+
"error",
|
|
1223
|
+
"info",
|
|
1224
|
+
"debug"
|
|
1225
|
+
];
|
|
1226
|
+
logMethods.forEach((method) => {
|
|
1227
|
+
const originalMethod = console[method];
|
|
1228
|
+
console[method] = function(...args) {
|
|
1229
|
+
captureLog(method, args);
|
|
1230
|
+
return originalMethod.apply(console, args);
|
|
1231
|
+
};
|
|
1232
|
+
});
|
|
1233
|
+
isPatched = true;
|
|
1234
|
+
}
|
|
1235
|
+
__name(patchConsole, "patchConsole");
|
|
1236
|
+
function captureLog(level, args) {
|
|
1237
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1238
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1239
|
+
logs.push({
|
|
1240
|
+
timestamp: Date.now() / 1e3,
|
|
1241
|
+
logger: "console",
|
|
1242
|
+
level,
|
|
1243
|
+
message: (0, import_node_util.format)(...args)
|
|
1244
|
+
});
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
__name(captureLog, "captureLog");
|
|
1248
|
+
|
|
1249
|
+
// src/loggers/utils.ts
|
|
1250
|
+
var import_node_util2 = require("util");
|
|
1251
|
+
function formatMessage(message, ...args) {
|
|
1252
|
+
return [
|
|
1253
|
+
message,
|
|
1254
|
+
...args
|
|
1255
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1256
|
+
}
|
|
1257
|
+
__name(formatMessage, "formatMessage");
|
|
1258
|
+
function removeKeys(obj, keys) {
|
|
1259
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1260
|
+
}
|
|
1261
|
+
__name(removeKeys, "removeKeys");
|
|
1262
|
+
function formatArg(arg) {
|
|
1263
|
+
if (typeof arg === "string") {
|
|
1264
|
+
return arg.trim();
|
|
1265
|
+
}
|
|
1266
|
+
if (arg instanceof Error) {
|
|
1267
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1268
|
+
}
|
|
1269
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1270
|
+
return "";
|
|
1271
|
+
}
|
|
1272
|
+
try {
|
|
1273
|
+
return JSON.stringify(arg);
|
|
1274
|
+
} catch {
|
|
1275
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
__name(formatArg, "formatArg");
|
|
1279
|
+
function isEmptyObject(obj) {
|
|
1280
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1281
|
+
}
|
|
1282
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1283
|
+
|
|
1284
|
+
// src/loggers/pino.ts
|
|
1285
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1286
|
+
|
|
1287
|
+
// src/loggers/winston.ts
|
|
1288
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1289
|
+
var isPatched2 = false;
|
|
1290
|
+
var globalLogsContext2;
|
|
1291
|
+
async function patchWinston(logsContext) {
|
|
1292
|
+
var _a2, _b;
|
|
1293
|
+
globalLogsContext2 = logsContext;
|
|
1294
|
+
if (isPatched2) {
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
try {
|
|
1298
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1299
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1300
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1301
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1302
|
+
captureLog2(info);
|
|
1303
|
+
return originalWrite.call(this, info);
|
|
1304
|
+
};
|
|
1305
|
+
}
|
|
1306
|
+
} catch {
|
|
1307
|
+
}
|
|
1308
|
+
isPatched2 = true;
|
|
1309
|
+
}
|
|
1310
|
+
__name(patchWinston, "patchWinston");
|
|
1311
|
+
function captureLog2(info) {
|
|
1312
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1313
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1314
|
+
return;
|
|
1315
|
+
}
|
|
1316
|
+
try {
|
|
1317
|
+
const rest = removeKeys(info, [
|
|
1318
|
+
"timestamp",
|
|
1319
|
+
"level",
|
|
1320
|
+
"message",
|
|
1321
|
+
"splat"
|
|
1322
|
+
]);
|
|
1323
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1324
|
+
if (formattedMessage) {
|
|
1325
|
+
logs.push({
|
|
1326
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1327
|
+
level: info.level || "info",
|
|
1328
|
+
message: formattedMessage.trim()
|
|
1329
|
+
});
|
|
1330
|
+
}
|
|
1331
|
+
} catch (e) {
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
__name(captureLog2, "captureLog");
|
|
1335
|
+
function parseTimestamp(timestamp) {
|
|
1336
|
+
if (timestamp) {
|
|
1337
|
+
const ts = new Date(timestamp).getTime();
|
|
1338
|
+
if (!isNaN(ts)) {
|
|
1339
|
+
return ts / 1e3;
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
return Date.now() / 1e3;
|
|
1343
|
+
}
|
|
1344
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1345
|
+
|
|
1186
1346
|
// src/common/packageVersions.ts
|
|
1187
|
-
var
|
|
1347
|
+
var import_node_module = require("module");
|
|
1188
1348
|
var import_meta = {};
|
|
1189
1349
|
function getPackageVersion(name) {
|
|
1190
1350
|
const packageJsonPath = `${name}/package.json`;
|
|
@@ -1192,7 +1352,7 @@ function getPackageVersion(name) {
|
|
|
1192
1352
|
return require(packageJsonPath).version || null;
|
|
1193
1353
|
} catch (error) {
|
|
1194
1354
|
try {
|
|
1195
|
-
const _require = (0,
|
|
1355
|
+
const _require = (0, import_node_module.createRequire)(import_meta.url);
|
|
1196
1356
|
return _require(packageJsonPath).version || null;
|
|
1197
1357
|
} catch (error2) {
|
|
1198
1358
|
return null;
|
|
@@ -1251,11 +1411,14 @@ function getAppInfo(h3, appVersion) {
|
|
|
1251
1411
|
__name(getAppInfo, "getAppInfo");
|
|
1252
1412
|
|
|
1253
1413
|
// src/h3/plugin.ts
|
|
1414
|
+
var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
|
|
1415
|
+
var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
|
|
1254
1416
|
var jsonHeaders = new Headers({
|
|
1255
1417
|
"content-type": "application/json;charset=UTF-8"
|
|
1256
1418
|
});
|
|
1257
1419
|
var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
1258
1420
|
const client = new ApitallyClient(config);
|
|
1421
|
+
const logsContext = new import_node_async_hooks.AsyncLocalStorage();
|
|
1259
1422
|
const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
|
|
1260
1423
|
const appInfo = getAppInfo(app, config.appVersion);
|
|
1261
1424
|
if (appInfo.paths.length > 0 || attempt >= 10) {
|
|
@@ -1265,13 +1428,17 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
|
1265
1428
|
}
|
|
1266
1429
|
}, "setStartupData");
|
|
1267
1430
|
setTimeout(() => setStartupData(), 500);
|
|
1431
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1432
|
+
patchConsole(logsContext);
|
|
1433
|
+
patchWinston(logsContext);
|
|
1434
|
+
}
|
|
1268
1435
|
const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
|
|
1269
1436
|
var _a2, _b;
|
|
1270
1437
|
if (event.req.method.toUpperCase() === "OPTIONS") {
|
|
1271
1438
|
return response;
|
|
1272
1439
|
}
|
|
1273
|
-
const startTime = event.context
|
|
1274
|
-
const responseTime = startTime ?
|
|
1440
|
+
const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
|
|
1441
|
+
const responseTime = startTime ? import_node_perf_hooks.performance.now() - startTime : 0;
|
|
1275
1442
|
const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
|
|
1276
1443
|
const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
|
|
1277
1444
|
const requestSize = parseContentLength(event.req.headers.get("content-length"));
|
|
@@ -1325,33 +1492,35 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
|
1325
1492
|
} else if (error && client.requestLogger.config.logResponseBody) {
|
|
1326
1493
|
responseBody = Buffer.from(JSON.stringify(error.toJSON()));
|
|
1327
1494
|
}
|
|
1495
|
+
const logs = logsContext.getStore();
|
|
1328
1496
|
client.requestLogger.logRequest({
|
|
1329
1497
|
timestamp: (Date.now() - responseTime) / 1e3,
|
|
1330
1498
|
method: event.req.method,
|
|
1331
1499
|
path,
|
|
1332
1500
|
url: event.req.url,
|
|
1333
1501
|
headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
|
|
1334
|
-
size:
|
|
1502
|
+
size: requestSize,
|
|
1335
1503
|
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1336
|
-
body: event.context
|
|
1504
|
+
body: event.context[REQUEST_BODY_SYMBOL]
|
|
1337
1505
|
}, {
|
|
1338
1506
|
statusCode,
|
|
1339
1507
|
responseTime: responseTime / 1e3,
|
|
1340
1508
|
headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
|
|
1341
1509
|
size: responseSize,
|
|
1342
1510
|
body: responseBody
|
|
1343
|
-
});
|
|
1511
|
+
}, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
|
|
1344
1512
|
}
|
|
1345
1513
|
return newResponse;
|
|
1346
1514
|
}, "handleResponse");
|
|
1347
1515
|
app.use((0, import_h3.onRequest)(async (event) => {
|
|
1348
|
-
|
|
1516
|
+
logsContext.enterWith([]);
|
|
1517
|
+
event.context[REQUEST_TIMESTAMP_SYMBOL] = import_node_perf_hooks.performance.now();
|
|
1349
1518
|
const requestContentType = event.req.headers.get("content-type");
|
|
1350
1519
|
const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
|
|
1351
1520
|
if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
|
|
1352
1521
|
const clonedRequest = event.req.clone();
|
|
1353
1522
|
const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
|
|
1354
|
-
event.context
|
|
1523
|
+
event.context[REQUEST_BODY_SYMBOL] = requestBody;
|
|
1355
1524
|
}
|
|
1356
1525
|
})).use((0, import_h3.onResponse)((response, event) => {
|
|
1357
1526
|
if (client.isEnabled()) {
|