apitally 0.18.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -44
- package/dist/adonisjs/configure.cjs +2 -2
- package/dist/adonisjs/configure.cjs.map +1 -1
- package/dist/adonisjs/configure.js.map +1 -1
- package/dist/adonisjs/index.cjs +2 -2
- package/dist/adonisjs/index.cjs.map +1 -1
- package/dist/adonisjs/index.d.cts +2 -2
- package/dist/adonisjs/index.d.ts +2 -2
- package/dist/adonisjs/index.js.map +1 -1
- package/dist/adonisjs/middleware.cjs +107 -84
- package/dist/adonisjs/middleware.cjs.map +1 -1
- package/dist/adonisjs/middleware.d.cts +2 -2
- package/dist/adonisjs/middleware.d.ts +2 -2
- package/dist/adonisjs/middleware.js +106 -83
- package/dist/adonisjs/middleware.js.map +1 -1
- package/dist/adonisjs/provider.cjs +4765 -62
- package/dist/adonisjs/provider.cjs.map +1 -1
- package/dist/adonisjs/provider.d.cts +7 -4
- package/dist/adonisjs/provider.d.ts +7 -4
- package/dist/adonisjs/provider.js +4743 -17
- package/dist/adonisjs/provider.js.map +1 -1
- package/dist/common/client.cjs +64 -42
- package/dist/common/client.cjs.map +1 -1
- package/dist/common/client.d.cts +2 -2
- package/dist/common/client.d.ts +2 -2
- package/dist/common/client.js +33 -11
- package/dist/common/client.js.map +1 -1
- package/dist/common/consumerRegistry.d.cts +2 -2
- package/dist/common/consumerRegistry.d.ts +2 -2
- package/dist/common/headers.cjs.map +1 -1
- package/dist/common/headers.d.cts +1 -1
- package/dist/common/headers.d.ts +1 -1
- package/dist/common/headers.js.map +1 -1
- package/dist/common/logging.cjs +3 -2
- package/dist/common/logging.cjs.map +1 -1
- package/dist/common/logging.d.cts +1 -1
- package/dist/common/logging.d.ts +1 -1
- package/dist/common/logging.js +3 -2
- package/dist/common/logging.js.map +1 -1
- package/dist/common/packageVersions.cjs +2 -2
- package/dist/common/packageVersions.cjs.map +1 -1
- package/dist/common/packageVersions.js.map +1 -1
- package/dist/common/requestCounter.d.cts +2 -2
- package/dist/common/requestCounter.d.ts +2 -2
- package/dist/common/requestLogger.cjs +57 -33
- package/dist/common/requestLogger.cjs.map +1 -1
- package/dist/common/requestLogger.d.cts +12 -5
- package/dist/common/requestLogger.d.ts +12 -5
- package/dist/common/requestLogger.js +30 -6
- package/dist/common/requestLogger.js.map +1 -1
- package/dist/common/response.cjs +12 -6
- package/dist/common/response.cjs.map +1 -1
- package/dist/common/response.d.cts +3 -3
- package/dist/common/response.d.ts +3 -3
- package/dist/common/response.js +12 -6
- package/dist/common/response.js.map +1 -1
- package/dist/common/serverErrorCounter.cjs +3 -2
- package/dist/common/serverErrorCounter.cjs.map +1 -1
- package/dist/common/serverErrorCounter.d.cts +2 -2
- package/dist/common/serverErrorCounter.d.ts +2 -2
- package/dist/common/serverErrorCounter.js +1 -0
- package/dist/common/serverErrorCounter.js.map +1 -1
- package/dist/common/tempGzipFile.cjs +15 -14
- package/dist/common/tempGzipFile.cjs.map +1 -1
- package/dist/common/tempGzipFile.d.cts +1 -1
- package/dist/common/tempGzipFile.d.ts +1 -1
- package/dist/common/tempGzipFile.js +3 -2
- package/dist/common/tempGzipFile.js.map +1 -1
- package/dist/common/types.d.cts +2 -2
- package/dist/common/types.d.ts +2 -2
- package/dist/common/validationErrorCounter.cjs +4 -4
- package/dist/common/validationErrorCounter.cjs.map +1 -1
- package/dist/common/validationErrorCounter.d.cts +2 -2
- package/dist/common/validationErrorCounter.d.ts +2 -2
- package/dist/common/validationErrorCounter.js +2 -2
- package/dist/common/validationErrorCounter.js.map +1 -1
- package/dist/elysia/index.cjs +1582 -0
- package/dist/elysia/index.cjs.map +1 -0
- package/dist/elysia/index.d.cts +9 -0
- package/dist/elysia/index.d.ts +9 -0
- package/dist/elysia/index.js +1552 -0
- package/dist/elysia/index.js.map +1 -0
- package/dist/elysia/plugin.cjs +1576 -0
- package/dist/elysia/plugin.cjs.map +1 -0
- package/dist/elysia/plugin.d.cts +53 -0
- package/dist/elysia/plugin.d.ts +53 -0
- package/dist/elysia/plugin.js +1552 -0
- package/dist/elysia/plugin.js.map +1 -0
- package/dist/elysia/utils.cjs +98 -0
- package/dist/elysia/utils.cjs.map +1 -0
- package/dist/elysia/utils.d.cts +12 -0
- package/dist/elysia/utils.d.ts +12 -0
- package/dist/elysia/utils.js +78 -0
- package/dist/elysia/utils.js.map +1 -0
- package/dist/express/index.cjs +4997 -169
- package/dist/express/index.cjs.map +1 -1
- package/dist/express/index.d.cts +2 -2
- package/dist/express/index.d.ts +2 -2
- package/dist/express/index.js +4969 -120
- package/dist/express/index.js.map +1 -1
- package/dist/express/middleware.cjs +4997 -169
- package/dist/express/middleware.cjs.map +1 -1
- package/dist/express/middleware.d.cts +2 -2
- package/dist/express/middleware.d.ts +2 -2
- package/dist/express/middleware.js +4969 -120
- package/dist/express/middleware.js.map +1 -1
- package/dist/fastify/index.cjs +4926 -72
- package/dist/fastify/index.cjs.map +1 -1
- package/dist/fastify/index.d.cts +3 -2
- package/dist/fastify/index.d.ts +3 -2
- package/dist/fastify/index.js +4899 -24
- package/dist/fastify/index.js.map +1 -1
- package/dist/fastify/plugin.cjs +4926 -72
- package/dist/fastify/plugin.cjs.map +1 -1
- package/dist/fastify/plugin.d.cts +8 -3
- package/dist/fastify/plugin.d.ts +8 -3
- package/dist/fastify/plugin.js +4899 -24
- package/dist/fastify/plugin.js.map +1 -1
- package/dist/h3/index.cjs +235 -57
- package/dist/h3/index.cjs.map +1 -1
- package/dist/h3/index.d.cts +2 -2
- package/dist/h3/index.d.ts +2 -2
- package/dist/h3/index.js +200 -22
- package/dist/h3/index.js.map +1 -1
- package/dist/h3/plugin.cjs +235 -57
- package/dist/h3/plugin.cjs.map +1 -1
- package/dist/h3/plugin.d.cts +6 -4
- package/dist/h3/plugin.d.ts +6 -4
- package/dist/h3/plugin.js +200 -22
- package/dist/h3/plugin.js.map +1 -1
- package/dist/h3/utils.cjs +2 -2
- package/dist/h3/utils.cjs.map +1 -1
- package/dist/h3/utils.js.map +1 -1
- package/dist/hono/index.cjs +295 -118
- package/dist/hono/index.cjs.map +1 -1
- package/dist/hono/index.d.cts +2 -2
- package/dist/hono/index.d.ts +2 -2
- package/dist/hono/index.js +261 -84
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/middleware.cjs +295 -118
- package/dist/hono/middleware.cjs.map +1 -1
- package/dist/hono/middleware.d.cts +2 -2
- package/dist/hono/middleware.d.ts +2 -2
- package/dist/hono/middleware.js +261 -84
- package/dist/hono/middleware.js.map +1 -1
- package/dist/hono/utils.cjs +2 -2
- package/dist/hono/utils.cjs.map +1 -1
- package/dist/hono/utils.d.cts +2 -2
- package/dist/hono/utils.d.ts +2 -2
- package/dist/hono/utils.js.map +1 -1
- package/dist/koa/index.cjs +280 -107
- package/dist/koa/index.cjs.map +1 -1
- package/dist/koa/index.d.cts +2 -2
- package/dist/koa/index.d.ts +2 -2
- package/dist/koa/index.js +244 -71
- package/dist/koa/index.js.map +1 -1
- package/dist/koa/middleware.cjs +278 -107
- package/dist/koa/middleware.cjs.map +1 -1
- package/dist/koa/middleware.d.cts +2 -2
- package/dist/koa/middleware.d.ts +2 -2
- package/dist/koa/middleware.js +244 -71
- package/dist/koa/middleware.js.map +1 -1
- package/dist/loggers/console.cjs +69 -0
- package/dist/loggers/console.cjs.map +1 -0
- package/dist/loggers/console.d.cts +9 -0
- package/dist/loggers/console.d.ts +9 -0
- package/dist/loggers/console.js +46 -0
- package/dist/loggers/console.js.map +1 -0
- package/dist/loggers/index.cjs +4837 -0
- package/dist/loggers/index.cjs.map +1 -0
- package/dist/loggers/index.d.cts +9 -0
- package/dist/loggers/index.d.ts +9 -0
- package/dist/loggers/index.js +4826 -0
- package/dist/loggers/index.js.map +1 -0
- package/dist/loggers/nestjs.cjs +135 -0
- package/dist/loggers/nestjs.cjs.map +1 -0
- package/dist/loggers/nestjs.d.cts +9 -0
- package/dist/loggers/nestjs.d.ts +9 -0
- package/dist/loggers/nestjs.js +100 -0
- package/dist/loggers/nestjs.js.map +1 -0
- package/dist/loggers/pino.cjs +4669 -0
- package/dist/loggers/pino.cjs.map +1 -0
- package/dist/loggers/pino.d.cts +9 -0
- package/dist/loggers/pino.d.ts +9 -0
- package/dist/loggers/pino.js +4661 -0
- package/dist/loggers/pino.js.map +1 -0
- package/dist/loggers/utils.cjs +66 -0
- package/dist/loggers/utils.cjs.map +1 -0
- package/dist/loggers/utils.d.cts +6 -0
- package/dist/loggers/utils.d.ts +6 -0
- package/dist/loggers/utils.js +42 -0
- package/dist/loggers/utils.js.map +1 -0
- package/dist/loggers/winston.cjs +135 -0
- package/dist/loggers/winston.cjs.map +1 -0
- package/dist/loggers/winston.d.cts +9 -0
- package/dist/loggers/winston.d.ts +9 -0
- package/dist/loggers/winston.js +100 -0
- package/dist/loggers/winston.js.map +1 -0
- package/dist/nestjs/index.cjs +5448 -542
- package/dist/nestjs/index.cjs.map +1 -1
- package/dist/nestjs/index.d.cts +2 -2
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +5364 -460
- package/dist/nestjs/index.js.map +1 -1
- package/package.json +26 -4
package/dist/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
|
});
|
|
@@ -726,6 +741,9 @@ var _RequestLogger = class _RequestLogger {
|
|
|
726
741
|
__name(_RequestLogger, "RequestLogger");
|
|
727
742
|
var RequestLogger = _RequestLogger;
|
|
728
743
|
function convertHeaders(headers) {
|
|
744
|
+
if (!headers) {
|
|
745
|
+
return [];
|
|
746
|
+
}
|
|
729
747
|
if (headers instanceof Headers) {
|
|
730
748
|
return Array.from(headers.entries());
|
|
731
749
|
}
|
|
@@ -757,18 +775,26 @@ __name(matchPatterns, "matchPatterns");
|
|
|
757
775
|
function skipEmptyValues(data) {
|
|
758
776
|
return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
|
|
759
777
|
if (v == null || Number.isNaN(v)) return false;
|
|
760
|
-
if (Array.isArray(v) ||
|
|
778
|
+
if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
|
|
761
779
|
return v.length > 0;
|
|
762
780
|
}
|
|
763
781
|
return true;
|
|
764
782
|
}));
|
|
765
783
|
}
|
|
766
784
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
785
|
+
function truncateLogMessage(msg) {
|
|
786
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
787
|
+
const suffix = "... (truncated)";
|
|
788
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
789
|
+
}
|
|
790
|
+
return msg;
|
|
791
|
+
}
|
|
792
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
767
793
|
function checkWritableFs() {
|
|
768
794
|
try {
|
|
769
|
-
const testPath = (0,
|
|
770
|
-
(0,
|
|
771
|
-
(0,
|
|
795
|
+
const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
|
|
796
|
+
(0, import_node_fs2.writeFileSync)(testPath, "test");
|
|
797
|
+
(0, import_node_fs2.unlinkSync)(testPath);
|
|
772
798
|
return true;
|
|
773
799
|
} catch (error) {
|
|
774
800
|
return false;
|
|
@@ -777,7 +803,7 @@ function checkWritableFs() {
|
|
|
777
803
|
__name(checkWritableFs, "checkWritableFs");
|
|
778
804
|
|
|
779
805
|
// src/common/validationErrorCounter.ts
|
|
780
|
-
var
|
|
806
|
+
var import_node_crypto4 = require("crypto");
|
|
781
807
|
var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
782
808
|
errorCounts;
|
|
783
809
|
errorDetails;
|
|
@@ -801,7 +827,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
801
827
|
consumer: validationError.consumer || null,
|
|
802
828
|
method: validationError.method,
|
|
803
829
|
path: validationError.path,
|
|
804
|
-
loc: validationError.loc.split("."),
|
|
830
|
+
loc: validationError.loc.split(".").filter(Boolean),
|
|
805
831
|
msg: validationError.msg,
|
|
806
832
|
type: validationError.type,
|
|
807
833
|
error_count: count
|
|
@@ -817,11 +843,11 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
817
843
|
validationError.consumer || "",
|
|
818
844
|
validationError.method.toUpperCase(),
|
|
819
845
|
validationError.path,
|
|
820
|
-
validationError.loc,
|
|
846
|
+
validationError.loc.split(".").filter(Boolean),
|
|
821
847
|
validationError.msg.trim(),
|
|
822
848
|
validationError.type
|
|
823
849
|
].join("|");
|
|
824
|
-
return (0,
|
|
850
|
+
return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
|
|
825
851
|
}
|
|
826
852
|
};
|
|
827
853
|
__name(_ValidationErrorCounter, "ValidationErrorCounter");
|
|
@@ -872,7 +898,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
872
898
|
_ApitallyClient.instance = this;
|
|
873
899
|
this.clientId = clientId;
|
|
874
900
|
this.env = env;
|
|
875
|
-
this.instanceUuid = (0,
|
|
901
|
+
this.instanceUuid = (0, import_node_crypto5.randomUUID)();
|
|
876
902
|
this.syncDataQueue = [];
|
|
877
903
|
this.requestCounter = new RequestCounter();
|
|
878
904
|
this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
|
|
@@ -978,7 +1004,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
978
1004
|
this.logger.debug("Sending startup data to Apitally Hub");
|
|
979
1005
|
const payload = {
|
|
980
1006
|
instance_uuid: this.instanceUuid,
|
|
981
|
-
message_uuid: (0,
|
|
1007
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
982
1008
|
...this.startupData
|
|
983
1009
|
};
|
|
984
1010
|
try {
|
|
@@ -1000,7 +1026,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1000
1026
|
const newPayload = {
|
|
1001
1027
|
timestamp: Date.now() / 1e3,
|
|
1002
1028
|
instance_uuid: this.instanceUuid,
|
|
1003
|
-
message_uuid: (0,
|
|
1029
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1004
1030
|
requests: this.requestCounter.getAndResetRequests(),
|
|
1005
1031
|
validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
|
|
1006
1032
|
server_errors: this.serverErrorCounter.getAndResetServerErrors(),
|
|
@@ -1129,8 +1155,11 @@ function mergeHeaders(base, merge) {
|
|
|
1129
1155
|
__name(mergeHeaders, "mergeHeaders");
|
|
1130
1156
|
|
|
1131
1157
|
// src/common/response.ts
|
|
1132
|
-
async function measureResponseSize(response) {
|
|
1133
|
-
const [newResponse1, newResponse2] =
|
|
1158
|
+
async function measureResponseSize(response, tee = true) {
|
|
1159
|
+
const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
|
|
1160
|
+
response,
|
|
1161
|
+
response
|
|
1162
|
+
];
|
|
1134
1163
|
let size = 0;
|
|
1135
1164
|
if (newResponse2.body) {
|
|
1136
1165
|
let done = false;
|
|
@@ -1149,8 +1178,11 @@ async function measureResponseSize(response) {
|
|
|
1149
1178
|
];
|
|
1150
1179
|
}
|
|
1151
1180
|
__name(measureResponseSize, "measureResponseSize");
|
|
1152
|
-
async function getResponseBody(response) {
|
|
1153
|
-
const [newResponse1, newResponse2] =
|
|
1181
|
+
async function getResponseBody(response, tee = true) {
|
|
1182
|
+
const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
|
|
1183
|
+
response,
|
|
1184
|
+
response
|
|
1185
|
+
];
|
|
1154
1186
|
const responseBuffer = Buffer.from(await newResponse2.arrayBuffer());
|
|
1155
1187
|
return [
|
|
1156
1188
|
responseBuffer,
|
|
@@ -1158,7 +1190,7 @@ async function getResponseBody(response) {
|
|
|
1158
1190
|
];
|
|
1159
1191
|
}
|
|
1160
1192
|
__name(getResponseBody, "getResponseBody");
|
|
1161
|
-
|
|
1193
|
+
function teeResponse(response) {
|
|
1162
1194
|
if (!response.body) {
|
|
1163
1195
|
return [
|
|
1164
1196
|
response,
|
|
@@ -1183,8 +1215,145 @@ async function teeResponse(response) {
|
|
|
1183
1215
|
}
|
|
1184
1216
|
__name(teeResponse, "teeResponse");
|
|
1185
1217
|
|
|
1218
|
+
// src/loggers/console.ts
|
|
1219
|
+
var import_node_util = require("util");
|
|
1220
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1221
|
+
var isPatched = false;
|
|
1222
|
+
var globalLogsContext;
|
|
1223
|
+
function patchConsole(logsContext) {
|
|
1224
|
+
globalLogsContext = logsContext;
|
|
1225
|
+
if (isPatched) {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
const logMethods = [
|
|
1229
|
+
"log",
|
|
1230
|
+
"warn",
|
|
1231
|
+
"error",
|
|
1232
|
+
"info",
|
|
1233
|
+
"debug"
|
|
1234
|
+
];
|
|
1235
|
+
logMethods.forEach((method) => {
|
|
1236
|
+
const originalMethod = console[method];
|
|
1237
|
+
console[method] = function(...args) {
|
|
1238
|
+
captureLog(method, args);
|
|
1239
|
+
return originalMethod.apply(console, args);
|
|
1240
|
+
};
|
|
1241
|
+
});
|
|
1242
|
+
isPatched = true;
|
|
1243
|
+
}
|
|
1244
|
+
__name(patchConsole, "patchConsole");
|
|
1245
|
+
function captureLog(level, args) {
|
|
1246
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1247
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1248
|
+
logs.push({
|
|
1249
|
+
timestamp: Date.now() / 1e3,
|
|
1250
|
+
logger: "console",
|
|
1251
|
+
level,
|
|
1252
|
+
message: (0, import_node_util.format)(...args)
|
|
1253
|
+
});
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
__name(captureLog, "captureLog");
|
|
1257
|
+
|
|
1258
|
+
// src/loggers/utils.ts
|
|
1259
|
+
var import_node_util2 = require("util");
|
|
1260
|
+
function formatMessage(message, ...args) {
|
|
1261
|
+
return [
|
|
1262
|
+
message,
|
|
1263
|
+
...args
|
|
1264
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1265
|
+
}
|
|
1266
|
+
__name(formatMessage, "formatMessage");
|
|
1267
|
+
function removeKeys(obj, keys) {
|
|
1268
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1269
|
+
}
|
|
1270
|
+
__name(removeKeys, "removeKeys");
|
|
1271
|
+
function formatArg(arg) {
|
|
1272
|
+
if (typeof arg === "string") {
|
|
1273
|
+
return arg.trim();
|
|
1274
|
+
}
|
|
1275
|
+
if (arg instanceof Error) {
|
|
1276
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1277
|
+
}
|
|
1278
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1279
|
+
return "";
|
|
1280
|
+
}
|
|
1281
|
+
try {
|
|
1282
|
+
return JSON.stringify(arg);
|
|
1283
|
+
} catch {
|
|
1284
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
__name(formatArg, "formatArg");
|
|
1288
|
+
function isEmptyObject(obj) {
|
|
1289
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1290
|
+
}
|
|
1291
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1292
|
+
|
|
1293
|
+
// src/loggers/pino.ts
|
|
1294
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1295
|
+
|
|
1296
|
+
// src/loggers/winston.ts
|
|
1297
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1298
|
+
var isPatched2 = false;
|
|
1299
|
+
var globalLogsContext2;
|
|
1300
|
+
async function patchWinston(logsContext) {
|
|
1301
|
+
var _a2, _b;
|
|
1302
|
+
globalLogsContext2 = logsContext;
|
|
1303
|
+
if (isPatched2) {
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
try {
|
|
1307
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1308
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1309
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1310
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1311
|
+
captureLog2(info);
|
|
1312
|
+
return originalWrite.call(this, info);
|
|
1313
|
+
};
|
|
1314
|
+
}
|
|
1315
|
+
} catch {
|
|
1316
|
+
}
|
|
1317
|
+
isPatched2 = true;
|
|
1318
|
+
}
|
|
1319
|
+
__name(patchWinston, "patchWinston");
|
|
1320
|
+
function captureLog2(info) {
|
|
1321
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1322
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1323
|
+
return;
|
|
1324
|
+
}
|
|
1325
|
+
try {
|
|
1326
|
+
const rest = removeKeys(info, [
|
|
1327
|
+
"timestamp",
|
|
1328
|
+
"level",
|
|
1329
|
+
"message",
|
|
1330
|
+
"splat"
|
|
1331
|
+
]);
|
|
1332
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1333
|
+
if (formattedMessage) {
|
|
1334
|
+
logs.push({
|
|
1335
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1336
|
+
level: info.level || "info",
|
|
1337
|
+
message: formattedMessage.trim()
|
|
1338
|
+
});
|
|
1339
|
+
}
|
|
1340
|
+
} catch (e) {
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
__name(captureLog2, "captureLog");
|
|
1344
|
+
function parseTimestamp(timestamp) {
|
|
1345
|
+
if (timestamp) {
|
|
1346
|
+
const ts = new Date(timestamp).getTime();
|
|
1347
|
+
if (!isNaN(ts)) {
|
|
1348
|
+
return ts / 1e3;
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
return Date.now() / 1e3;
|
|
1352
|
+
}
|
|
1353
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1354
|
+
|
|
1186
1355
|
// src/common/packageVersions.ts
|
|
1187
|
-
var
|
|
1356
|
+
var import_node_module = require("module");
|
|
1188
1357
|
var import_meta = {};
|
|
1189
1358
|
function getPackageVersion(name) {
|
|
1190
1359
|
const packageJsonPath = `${name}/package.json`;
|
|
@@ -1192,7 +1361,7 @@ function getPackageVersion(name) {
|
|
|
1192
1361
|
return require(packageJsonPath).version || null;
|
|
1193
1362
|
} catch (error) {
|
|
1194
1363
|
try {
|
|
1195
|
-
const _require = (0,
|
|
1364
|
+
const _require = (0, import_node_module.createRequire)(import_meta.url);
|
|
1196
1365
|
return _require(packageJsonPath).version || null;
|
|
1197
1366
|
} catch (error2) {
|
|
1198
1367
|
return null;
|
|
@@ -1251,11 +1420,14 @@ function getAppInfo(h3, appVersion) {
|
|
|
1251
1420
|
__name(getAppInfo, "getAppInfo");
|
|
1252
1421
|
|
|
1253
1422
|
// src/h3/plugin.ts
|
|
1423
|
+
var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
|
|
1424
|
+
var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
|
|
1254
1425
|
var jsonHeaders = new Headers({
|
|
1255
1426
|
"content-type": "application/json;charset=UTF-8"
|
|
1256
1427
|
});
|
|
1257
1428
|
var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
1258
1429
|
const client = new ApitallyClient(config);
|
|
1430
|
+
const logsContext = new import_node_async_hooks.AsyncLocalStorage();
|
|
1259
1431
|
const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
|
|
1260
1432
|
const appInfo = getAppInfo(app, config.appVersion);
|
|
1261
1433
|
if (appInfo.paths.length > 0 || attempt >= 10) {
|
|
@@ -1265,13 +1437,17 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
|
1265
1437
|
}
|
|
1266
1438
|
}, "setStartupData");
|
|
1267
1439
|
setTimeout(() => setStartupData(), 500);
|
|
1440
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1441
|
+
patchConsole(logsContext);
|
|
1442
|
+
patchWinston(logsContext);
|
|
1443
|
+
}
|
|
1268
1444
|
const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
|
|
1269
1445
|
var _a2, _b;
|
|
1270
1446
|
if (event.req.method.toUpperCase() === "OPTIONS") {
|
|
1271
1447
|
return response;
|
|
1272
1448
|
}
|
|
1273
|
-
const startTime = event.context
|
|
1274
|
-
const responseTime = startTime ?
|
|
1449
|
+
const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
|
|
1450
|
+
const responseTime = startTime ? import_node_perf_hooks.performance.now() - startTime : 0;
|
|
1275
1451
|
const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
|
|
1276
1452
|
const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
|
|
1277
1453
|
const requestSize = parseContentLength(event.req.headers.get("content-length"));
|
|
@@ -1325,33 +1501,35 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
|
1325
1501
|
} else if (error && client.requestLogger.config.logResponseBody) {
|
|
1326
1502
|
responseBody = Buffer.from(JSON.stringify(error.toJSON()));
|
|
1327
1503
|
}
|
|
1504
|
+
const logs = logsContext.getStore();
|
|
1328
1505
|
client.requestLogger.logRequest({
|
|
1329
1506
|
timestamp: (Date.now() - responseTime) / 1e3,
|
|
1330
1507
|
method: event.req.method,
|
|
1331
1508
|
path,
|
|
1332
1509
|
url: event.req.url,
|
|
1333
1510
|
headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
|
|
1334
|
-
size:
|
|
1511
|
+
size: requestSize,
|
|
1335
1512
|
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1336
|
-
body: event.context
|
|
1513
|
+
body: event.context[REQUEST_BODY_SYMBOL]
|
|
1337
1514
|
}, {
|
|
1338
1515
|
statusCode,
|
|
1339
1516
|
responseTime: responseTime / 1e3,
|
|
1340
1517
|
headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
|
|
1341
1518
|
size: responseSize,
|
|
1342
1519
|
body: responseBody
|
|
1343
|
-
});
|
|
1520
|
+
}, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
|
|
1344
1521
|
}
|
|
1345
1522
|
return newResponse;
|
|
1346
1523
|
}, "handleResponse");
|
|
1347
1524
|
app.use((0, import_h3.onRequest)(async (event) => {
|
|
1348
|
-
|
|
1525
|
+
logsContext.enterWith([]);
|
|
1526
|
+
event.context[REQUEST_TIMESTAMP_SYMBOL] = import_node_perf_hooks.performance.now();
|
|
1349
1527
|
const requestContentType = event.req.headers.get("content-type");
|
|
1350
1528
|
const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
|
|
1351
1529
|
if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
|
|
1352
1530
|
const clonedRequest = event.req.clone();
|
|
1353
1531
|
const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
|
|
1354
|
-
event.context
|
|
1532
|
+
event.context[REQUEST_BODY_SYMBOL] = requestBody;
|
|
1355
1533
|
}
|
|
1356
1534
|
})).use((0, import_h3.onResponse)((response, event) => {
|
|
1357
1535
|
if (client.isEnabled()) {
|