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