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/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
|
});
|
|
@@ -728,6 +743,9 @@ var _RequestLogger = class _RequestLogger {
|
|
|
728
743
|
__name(_RequestLogger, "RequestLogger");
|
|
729
744
|
var RequestLogger = _RequestLogger;
|
|
730
745
|
function convertHeaders(headers) {
|
|
746
|
+
if (!headers) {
|
|
747
|
+
return [];
|
|
748
|
+
}
|
|
731
749
|
if (headers instanceof Headers) {
|
|
732
750
|
return Array.from(headers.entries());
|
|
733
751
|
}
|
|
@@ -759,18 +777,26 @@ __name(matchPatterns, "matchPatterns");
|
|
|
759
777
|
function skipEmptyValues(data) {
|
|
760
778
|
return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
|
|
761
779
|
if (v == null || Number.isNaN(v)) return false;
|
|
762
|
-
if (Array.isArray(v) ||
|
|
780
|
+
if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
|
|
763
781
|
return v.length > 0;
|
|
764
782
|
}
|
|
765
783
|
return true;
|
|
766
784
|
}));
|
|
767
785
|
}
|
|
768
786
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
787
|
+
function truncateLogMessage(msg) {
|
|
788
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
789
|
+
const suffix = "... (truncated)";
|
|
790
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
791
|
+
}
|
|
792
|
+
return msg;
|
|
793
|
+
}
|
|
794
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
769
795
|
function checkWritableFs() {
|
|
770
796
|
try {
|
|
771
|
-
const testPath = (0,
|
|
772
|
-
(0,
|
|
773
|
-
(0,
|
|
797
|
+
const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
|
|
798
|
+
(0, import_node_fs2.writeFileSync)(testPath, "test");
|
|
799
|
+
(0, import_node_fs2.unlinkSync)(testPath);
|
|
774
800
|
return true;
|
|
775
801
|
} catch (error) {
|
|
776
802
|
return false;
|
|
@@ -779,7 +805,7 @@ function checkWritableFs() {
|
|
|
779
805
|
__name(checkWritableFs, "checkWritableFs");
|
|
780
806
|
|
|
781
807
|
// src/common/validationErrorCounter.ts
|
|
782
|
-
var
|
|
808
|
+
var import_node_crypto4 = require("crypto");
|
|
783
809
|
var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
784
810
|
errorCounts;
|
|
785
811
|
errorDetails;
|
|
@@ -803,7 +829,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
803
829
|
consumer: validationError.consumer || null,
|
|
804
830
|
method: validationError.method,
|
|
805
831
|
path: validationError.path,
|
|
806
|
-
loc: validationError.loc.split("."),
|
|
832
|
+
loc: validationError.loc.split(".").filter(Boolean),
|
|
807
833
|
msg: validationError.msg,
|
|
808
834
|
type: validationError.type,
|
|
809
835
|
error_count: count
|
|
@@ -819,11 +845,11 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
819
845
|
validationError.consumer || "",
|
|
820
846
|
validationError.method.toUpperCase(),
|
|
821
847
|
validationError.path,
|
|
822
|
-
validationError.loc,
|
|
848
|
+
validationError.loc.split(".").filter(Boolean),
|
|
823
849
|
validationError.msg.trim(),
|
|
824
850
|
validationError.type
|
|
825
851
|
].join("|");
|
|
826
|
-
return (0,
|
|
852
|
+
return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
|
|
827
853
|
}
|
|
828
854
|
};
|
|
829
855
|
__name(_ValidationErrorCounter, "ValidationErrorCounter");
|
|
@@ -874,7 +900,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
874
900
|
_ApitallyClient.instance = this;
|
|
875
901
|
this.clientId = clientId;
|
|
876
902
|
this.env = env;
|
|
877
|
-
this.instanceUuid = (0,
|
|
903
|
+
this.instanceUuid = (0, import_node_crypto5.randomUUID)();
|
|
878
904
|
this.syncDataQueue = [];
|
|
879
905
|
this.requestCounter = new RequestCounter();
|
|
880
906
|
this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
|
|
@@ -980,7 +1006,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
980
1006
|
this.logger.debug("Sending startup data to Apitally Hub");
|
|
981
1007
|
const payload = {
|
|
982
1008
|
instance_uuid: this.instanceUuid,
|
|
983
|
-
message_uuid: (0,
|
|
1009
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
984
1010
|
...this.startupData
|
|
985
1011
|
};
|
|
986
1012
|
try {
|
|
@@ -1002,7 +1028,7 @@ var _ApitallyClient = class _ApitallyClient {
|
|
|
1002
1028
|
const newPayload = {
|
|
1003
1029
|
timestamp: Date.now() / 1e3,
|
|
1004
1030
|
instance_uuid: this.instanceUuid,
|
|
1005
|
-
message_uuid: (0,
|
|
1031
|
+
message_uuid: (0, import_node_crypto5.randomUUID)(),
|
|
1006
1032
|
requests: this.requestCounter.getAndResetRequests(),
|
|
1007
1033
|
validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
|
|
1008
1034
|
server_errors: this.serverErrorCounter.getAndResetServerErrors(),
|
|
@@ -1131,8 +1157,11 @@ function mergeHeaders(base, merge) {
|
|
|
1131
1157
|
__name(mergeHeaders, "mergeHeaders");
|
|
1132
1158
|
|
|
1133
1159
|
// src/common/response.ts
|
|
1134
|
-
async function measureResponseSize(response) {
|
|
1135
|
-
const [newResponse1, newResponse2] =
|
|
1160
|
+
async function measureResponseSize(response, tee = true) {
|
|
1161
|
+
const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
|
|
1162
|
+
response,
|
|
1163
|
+
response
|
|
1164
|
+
];
|
|
1136
1165
|
let size = 0;
|
|
1137
1166
|
if (newResponse2.body) {
|
|
1138
1167
|
let done = false;
|
|
@@ -1151,8 +1180,11 @@ async function measureResponseSize(response) {
|
|
|
1151
1180
|
];
|
|
1152
1181
|
}
|
|
1153
1182
|
__name(measureResponseSize, "measureResponseSize");
|
|
1154
|
-
async function getResponseBody(response) {
|
|
1155
|
-
const [newResponse1, newResponse2] =
|
|
1183
|
+
async function getResponseBody(response, tee = true) {
|
|
1184
|
+
const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
|
|
1185
|
+
response,
|
|
1186
|
+
response
|
|
1187
|
+
];
|
|
1156
1188
|
const responseBuffer = Buffer.from(await newResponse2.arrayBuffer());
|
|
1157
1189
|
return [
|
|
1158
1190
|
responseBuffer,
|
|
@@ -1160,7 +1192,7 @@ async function getResponseBody(response) {
|
|
|
1160
1192
|
];
|
|
1161
1193
|
}
|
|
1162
1194
|
__name(getResponseBody, "getResponseBody");
|
|
1163
|
-
|
|
1195
|
+
function teeResponse(response) {
|
|
1164
1196
|
if (!response.body) {
|
|
1165
1197
|
return [
|
|
1166
1198
|
response,
|
|
@@ -1185,8 +1217,145 @@ async function teeResponse(response) {
|
|
|
1185
1217
|
}
|
|
1186
1218
|
__name(teeResponse, "teeResponse");
|
|
1187
1219
|
|
|
1220
|
+
// src/loggers/console.ts
|
|
1221
|
+
var import_node_util = require("util");
|
|
1222
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1223
|
+
var isPatched = false;
|
|
1224
|
+
var globalLogsContext;
|
|
1225
|
+
function patchConsole(logsContext) {
|
|
1226
|
+
globalLogsContext = logsContext;
|
|
1227
|
+
if (isPatched) {
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
const logMethods = [
|
|
1231
|
+
"log",
|
|
1232
|
+
"warn",
|
|
1233
|
+
"error",
|
|
1234
|
+
"info",
|
|
1235
|
+
"debug"
|
|
1236
|
+
];
|
|
1237
|
+
logMethods.forEach((method) => {
|
|
1238
|
+
const originalMethod = console[method];
|
|
1239
|
+
console[method] = function(...args) {
|
|
1240
|
+
captureLog(method, args);
|
|
1241
|
+
return originalMethod.apply(console, args);
|
|
1242
|
+
};
|
|
1243
|
+
});
|
|
1244
|
+
isPatched = true;
|
|
1245
|
+
}
|
|
1246
|
+
__name(patchConsole, "patchConsole");
|
|
1247
|
+
function captureLog(level, args) {
|
|
1248
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1249
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1250
|
+
logs.push({
|
|
1251
|
+
timestamp: Date.now() / 1e3,
|
|
1252
|
+
logger: "console",
|
|
1253
|
+
level,
|
|
1254
|
+
message: (0, import_node_util.format)(...args)
|
|
1255
|
+
});
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
__name(captureLog, "captureLog");
|
|
1259
|
+
|
|
1260
|
+
// src/loggers/utils.ts
|
|
1261
|
+
var import_node_util2 = require("util");
|
|
1262
|
+
function formatMessage(message, ...args) {
|
|
1263
|
+
return [
|
|
1264
|
+
message,
|
|
1265
|
+
...args
|
|
1266
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1267
|
+
}
|
|
1268
|
+
__name(formatMessage, "formatMessage");
|
|
1269
|
+
function removeKeys(obj, keys) {
|
|
1270
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1271
|
+
}
|
|
1272
|
+
__name(removeKeys, "removeKeys");
|
|
1273
|
+
function formatArg(arg) {
|
|
1274
|
+
if (typeof arg === "string") {
|
|
1275
|
+
return arg.trim();
|
|
1276
|
+
}
|
|
1277
|
+
if (arg instanceof Error) {
|
|
1278
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1279
|
+
}
|
|
1280
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1281
|
+
return "";
|
|
1282
|
+
}
|
|
1283
|
+
try {
|
|
1284
|
+
return JSON.stringify(arg);
|
|
1285
|
+
} catch {
|
|
1286
|
+
return (0, import_node_util2.format)(arg).trim();
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
__name(formatArg, "formatArg");
|
|
1290
|
+
function isEmptyObject(obj) {
|
|
1291
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1292
|
+
}
|
|
1293
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1294
|
+
|
|
1295
|
+
// src/loggers/pino.ts
|
|
1296
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1297
|
+
|
|
1298
|
+
// src/loggers/winston.ts
|
|
1299
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1300
|
+
var isPatched2 = false;
|
|
1301
|
+
var globalLogsContext2;
|
|
1302
|
+
async function patchWinston(logsContext) {
|
|
1303
|
+
var _a2, _b;
|
|
1304
|
+
globalLogsContext2 = logsContext;
|
|
1305
|
+
if (isPatched2) {
|
|
1306
|
+
return;
|
|
1307
|
+
}
|
|
1308
|
+
try {
|
|
1309
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1310
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1311
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1312
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1313
|
+
captureLog2(info);
|
|
1314
|
+
return originalWrite.call(this, info);
|
|
1315
|
+
};
|
|
1316
|
+
}
|
|
1317
|
+
} catch {
|
|
1318
|
+
}
|
|
1319
|
+
isPatched2 = true;
|
|
1320
|
+
}
|
|
1321
|
+
__name(patchWinston, "patchWinston");
|
|
1322
|
+
function captureLog2(info) {
|
|
1323
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1324
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1325
|
+
return;
|
|
1326
|
+
}
|
|
1327
|
+
try {
|
|
1328
|
+
const rest = removeKeys(info, [
|
|
1329
|
+
"timestamp",
|
|
1330
|
+
"level",
|
|
1331
|
+
"message",
|
|
1332
|
+
"splat"
|
|
1333
|
+
]);
|
|
1334
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1335
|
+
if (formattedMessage) {
|
|
1336
|
+
logs.push({
|
|
1337
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1338
|
+
level: info.level || "info",
|
|
1339
|
+
message: formattedMessage.trim()
|
|
1340
|
+
});
|
|
1341
|
+
}
|
|
1342
|
+
} catch (e) {
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
__name(captureLog2, "captureLog");
|
|
1346
|
+
function parseTimestamp(timestamp) {
|
|
1347
|
+
if (timestamp) {
|
|
1348
|
+
const ts = new Date(timestamp).getTime();
|
|
1349
|
+
if (!isNaN(ts)) {
|
|
1350
|
+
return ts / 1e3;
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
return Date.now() / 1e3;
|
|
1354
|
+
}
|
|
1355
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1356
|
+
|
|
1188
1357
|
// src/common/packageVersions.ts
|
|
1189
|
-
var
|
|
1358
|
+
var import_node_module = require("module");
|
|
1190
1359
|
var import_meta = {};
|
|
1191
1360
|
function getPackageVersion(name) {
|
|
1192
1361
|
const packageJsonPath = `${name}/package.json`;
|
|
@@ -1194,7 +1363,7 @@ function getPackageVersion(name) {
|
|
|
1194
1363
|
return require(packageJsonPath).version || null;
|
|
1195
1364
|
} catch (error) {
|
|
1196
1365
|
try {
|
|
1197
|
-
const _require = (0,
|
|
1366
|
+
const _require = (0, import_node_module.createRequire)(import_meta.url);
|
|
1198
1367
|
return _require(packageJsonPath).version || null;
|
|
1199
1368
|
} catch (error2) {
|
|
1200
1369
|
return null;
|
|
@@ -1253,11 +1422,14 @@ function getAppInfo(h3, appVersion) {
|
|
|
1253
1422
|
__name(getAppInfo, "getAppInfo");
|
|
1254
1423
|
|
|
1255
1424
|
// src/h3/plugin.ts
|
|
1425
|
+
var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
|
|
1426
|
+
var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
|
|
1256
1427
|
var jsonHeaders = new Headers({
|
|
1257
1428
|
"content-type": "application/json;charset=UTF-8"
|
|
1258
1429
|
});
|
|
1259
1430
|
var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
1260
1431
|
const client = new ApitallyClient(config);
|
|
1432
|
+
const logsContext = new import_node_async_hooks.AsyncLocalStorage();
|
|
1261
1433
|
const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
|
|
1262
1434
|
const appInfo = getAppInfo(app, config.appVersion);
|
|
1263
1435
|
if (appInfo.paths.length > 0 || attempt >= 10) {
|
|
@@ -1267,13 +1439,17 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
|
1267
1439
|
}
|
|
1268
1440
|
}, "setStartupData");
|
|
1269
1441
|
setTimeout(() => setStartupData(), 500);
|
|
1442
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1443
|
+
patchConsole(logsContext);
|
|
1444
|
+
patchWinston(logsContext);
|
|
1445
|
+
}
|
|
1270
1446
|
const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
|
|
1271
1447
|
var _a2, _b;
|
|
1272
1448
|
if (event.req.method.toUpperCase() === "OPTIONS") {
|
|
1273
1449
|
return response;
|
|
1274
1450
|
}
|
|
1275
|
-
const startTime = event.context
|
|
1276
|
-
const responseTime = startTime ?
|
|
1451
|
+
const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
|
|
1452
|
+
const responseTime = startTime ? import_node_perf_hooks.performance.now() - startTime : 0;
|
|
1277
1453
|
const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
|
|
1278
1454
|
const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
|
|
1279
1455
|
const requestSize = parseContentLength(event.req.headers.get("content-length"));
|
|
@@ -1327,33 +1503,35 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
|
|
|
1327
1503
|
} else if (error && client.requestLogger.config.logResponseBody) {
|
|
1328
1504
|
responseBody = Buffer.from(JSON.stringify(error.toJSON()));
|
|
1329
1505
|
}
|
|
1506
|
+
const logs = logsContext.getStore();
|
|
1330
1507
|
client.requestLogger.logRequest({
|
|
1331
1508
|
timestamp: (Date.now() - responseTime) / 1e3,
|
|
1332
1509
|
method: event.req.method,
|
|
1333
1510
|
path,
|
|
1334
1511
|
url: event.req.url,
|
|
1335
1512
|
headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
|
|
1336
|
-
size:
|
|
1513
|
+
size: requestSize,
|
|
1337
1514
|
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1338
|
-
body: event.context
|
|
1515
|
+
body: event.context[REQUEST_BODY_SYMBOL]
|
|
1339
1516
|
}, {
|
|
1340
1517
|
statusCode,
|
|
1341
1518
|
responseTime: responseTime / 1e3,
|
|
1342
1519
|
headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
|
|
1343
1520
|
size: responseSize,
|
|
1344
1521
|
body: responseBody
|
|
1345
|
-
});
|
|
1522
|
+
}, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
|
|
1346
1523
|
}
|
|
1347
1524
|
return newResponse;
|
|
1348
1525
|
}, "handleResponse");
|
|
1349
1526
|
app.use((0, import_h3.onRequest)(async (event) => {
|
|
1350
|
-
|
|
1527
|
+
logsContext.enterWith([]);
|
|
1528
|
+
event.context[REQUEST_TIMESTAMP_SYMBOL] = import_node_perf_hooks.performance.now();
|
|
1351
1529
|
const requestContentType = event.req.headers.get("content-type");
|
|
1352
1530
|
const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
|
|
1353
1531
|
if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
|
|
1354
1532
|
const clonedRequest = event.req.clone();
|
|
1355
1533
|
const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
|
|
1356
|
-
event.context
|
|
1534
|
+
event.context[REQUEST_BODY_SYMBOL] = requestBody;
|
|
1357
1535
|
}
|
|
1358
1536
|
})).use((0, import_h3.onResponse)((response, event) => {
|
|
1359
1537
|
if (client.isEnabled()) {
|