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/hono/index.js
CHANGED
|
@@ -10,11 +10,12 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
10
10
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
11
11
|
|
|
12
12
|
// src/hono/middleware.ts
|
|
13
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
13
14
|
import { performance } from "perf_hooks";
|
|
14
15
|
|
|
15
16
|
// src/common/client.ts
|
|
16
|
-
import { randomUUID as randomUUID3 } from "crypto";
|
|
17
17
|
import fetchRetry from "fetch-retry";
|
|
18
|
+
import { randomUUID as randomUUID3 } from "crypto";
|
|
18
19
|
|
|
19
20
|
// src/common/consumerRegistry.ts
|
|
20
21
|
var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
|
|
@@ -74,7 +75,7 @@ var ConsumerRegistry = _ConsumerRegistry;
|
|
|
74
75
|
|
|
75
76
|
// src/common/logging.ts
|
|
76
77
|
import { createLogger, format, transports } from "winston";
|
|
77
|
-
|
|
78
|
+
function getLogger() {
|
|
78
79
|
return createLogger({
|
|
79
80
|
level: process.env.APITALLY_DEBUG ? "debug" : "warn",
|
|
80
81
|
format: format.combine(format.colorize(), format.timestamp(), format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
|
|
@@ -82,7 +83,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
|
|
|
82
83
|
new transports.Console()
|
|
83
84
|
]
|
|
84
85
|
});
|
|
85
|
-
}
|
|
86
|
+
}
|
|
87
|
+
__name(getLogger, "getLogger");
|
|
86
88
|
|
|
87
89
|
// src/common/paramValidation.ts
|
|
88
90
|
function isValidClientId(clientId) {
|
|
@@ -186,7 +188,7 @@ var RequestCounter = _RequestCounter;
|
|
|
186
188
|
import AsyncLock from "async-lock";
|
|
187
189
|
import { Buffer as Buffer3 } from "buffer";
|
|
188
190
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
189
|
-
import { unlinkSync
|
|
191
|
+
import { unlinkSync, writeFileSync } from "fs";
|
|
190
192
|
import { tmpdir as tmpdir2 } from "os";
|
|
191
193
|
import { join as join2 } from "path";
|
|
192
194
|
|
|
@@ -249,6 +251,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
|
|
|
249
251
|
});
|
|
250
252
|
this.errorCounts.clear();
|
|
251
253
|
this.errorDetails.clear();
|
|
254
|
+
this.sentryEventIds.clear();
|
|
252
255
|
return data;
|
|
253
256
|
}
|
|
254
257
|
getKey(serverError) {
|
|
@@ -295,7 +298,8 @@ __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
|
|
|
295
298
|
// src/common/tempGzipFile.ts
|
|
296
299
|
import { Buffer as Buffer2 } from "buffer";
|
|
297
300
|
import { randomUUID } from "crypto";
|
|
298
|
-
import { createWriteStream, readFile
|
|
301
|
+
import { createWriteStream, readFile } from "fs";
|
|
302
|
+
import { unlink } from "fs/promises";
|
|
299
303
|
import { tmpdir } from "os";
|
|
300
304
|
import { join } from "path";
|
|
301
305
|
import { createGzip } from "zlib";
|
|
@@ -360,7 +364,7 @@ var _TempGzipFile = class _TempGzipFile {
|
|
|
360
364
|
}
|
|
361
365
|
async delete() {
|
|
362
366
|
await this.close();
|
|
363
|
-
|
|
367
|
+
await unlink(this.filePath);
|
|
364
368
|
}
|
|
365
369
|
};
|
|
366
370
|
__name(_TempGzipFile, "TempGzipFile");
|
|
@@ -371,6 +375,7 @@ var MAX_BODY_SIZE = 5e4;
|
|
|
371
375
|
var MAX_FILE_SIZE = 1e6;
|
|
372
376
|
var MAX_FILES = 50;
|
|
373
377
|
var MAX_PENDING_WRITES = 100;
|
|
378
|
+
var MAX_LOG_MSG_LENGTH = 2048;
|
|
374
379
|
var BODY_TOO_LARGE = Buffer3.from("<body too large>");
|
|
375
380
|
var BODY_MASKED = Buffer3.from("<masked>");
|
|
376
381
|
var MASKED = "******";
|
|
@@ -427,6 +432,7 @@ var DEFAULT_CONFIG = {
|
|
|
427
432
|
logResponseHeaders: true,
|
|
428
433
|
logResponseBody: false,
|
|
429
434
|
logException: true,
|
|
435
|
+
captureLogs: false,
|
|
430
436
|
maskQueryParams: [],
|
|
431
437
|
maskHeaders: [],
|
|
432
438
|
maskBodyFields: [],
|
|
@@ -581,7 +587,7 @@ var _RequestLogger = class _RequestLogger {
|
|
|
581
587
|
item.request.url = url.toString();
|
|
582
588
|
return item;
|
|
583
589
|
}
|
|
584
|
-
logRequest(request, response, error) {
|
|
590
|
+
logRequest(request, response, error, logs) {
|
|
585
591
|
var _a2, _b, _c;
|
|
586
592
|
if (!this.enabled || this.suspendUntil !== null) return;
|
|
587
593
|
const url = new URL(request.url);
|
|
@@ -613,6 +619,14 @@ var _RequestLogger = class _RequestLogger {
|
|
|
613
619
|
sentryEventId: getSentryEventId()
|
|
614
620
|
} : void 0
|
|
615
621
|
};
|
|
622
|
+
if (logs && logs.length > 0) {
|
|
623
|
+
item.logs = logs.map((log) => ({
|
|
624
|
+
timestamp: log.timestamp,
|
|
625
|
+
logger: log.logger,
|
|
626
|
+
level: log.level,
|
|
627
|
+
message: truncateLogMessage(log.message)
|
|
628
|
+
}));
|
|
629
|
+
}
|
|
616
630
|
this.pendingWrites.push(item);
|
|
617
631
|
if (this.pendingWrites.length > MAX_PENDING_WRITES) {
|
|
618
632
|
this.pendingWrites.shift();
|
|
@@ -634,7 +648,8 @@ var _RequestLogger = class _RequestLogger {
|
|
|
634
648
|
uuid: item.uuid,
|
|
635
649
|
request: skipEmptyValues(item.request),
|
|
636
650
|
response: skipEmptyValues(item.response),
|
|
637
|
-
exception: item.exception
|
|
651
|
+
exception: item.exception,
|
|
652
|
+
logs: item.logs
|
|
638
653
|
};
|
|
639
654
|
[
|
|
640
655
|
finalItem.request.body,
|
|
@@ -698,6 +713,9 @@ var _RequestLogger = class _RequestLogger {
|
|
|
698
713
|
__name(_RequestLogger, "RequestLogger");
|
|
699
714
|
var RequestLogger = _RequestLogger;
|
|
700
715
|
function convertHeaders(headers) {
|
|
716
|
+
if (!headers) {
|
|
717
|
+
return [];
|
|
718
|
+
}
|
|
701
719
|
if (headers instanceof Headers) {
|
|
702
720
|
return Array.from(headers.entries());
|
|
703
721
|
}
|
|
@@ -736,11 +754,19 @@ function skipEmptyValues(data) {
|
|
|
736
754
|
}));
|
|
737
755
|
}
|
|
738
756
|
__name(skipEmptyValues, "skipEmptyValues");
|
|
757
|
+
function truncateLogMessage(msg) {
|
|
758
|
+
if (msg.length > MAX_LOG_MSG_LENGTH) {
|
|
759
|
+
const suffix = "... (truncated)";
|
|
760
|
+
return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
|
|
761
|
+
}
|
|
762
|
+
return msg;
|
|
763
|
+
}
|
|
764
|
+
__name(truncateLogMessage, "truncateLogMessage");
|
|
739
765
|
function checkWritableFs() {
|
|
740
766
|
try {
|
|
741
767
|
const testPath = join2(tmpdir2(), `apitally-${randomUUID2()}`);
|
|
742
768
|
writeFileSync(testPath, "test");
|
|
743
|
-
|
|
769
|
+
unlinkSync(testPath);
|
|
744
770
|
return true;
|
|
745
771
|
} catch (error) {
|
|
746
772
|
return false;
|
|
@@ -773,7 +799,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
773
799
|
consumer: validationError.consumer || null,
|
|
774
800
|
method: validationError.method,
|
|
775
801
|
path: validationError.path,
|
|
776
|
-
loc: validationError.loc.split("."),
|
|
802
|
+
loc: validationError.loc.split(".").filter(Boolean),
|
|
777
803
|
msg: validationError.msg,
|
|
778
804
|
type: validationError.type,
|
|
779
805
|
error_count: count
|
|
@@ -789,7 +815,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
|
|
|
789
815
|
validationError.consumer || "",
|
|
790
816
|
validationError.method.toUpperCase(),
|
|
791
817
|
validationError.path,
|
|
792
|
-
validationError.loc,
|
|
818
|
+
validationError.loc.split(".").filter(Boolean),
|
|
793
819
|
validationError.msg.trim(),
|
|
794
820
|
validationError.type
|
|
795
821
|
].join("|");
|
|
@@ -1094,8 +1120,11 @@ function parseContentLength(contentLength) {
|
|
|
1094
1120
|
__name(parseContentLength, "parseContentLength");
|
|
1095
1121
|
|
|
1096
1122
|
// src/common/response.ts
|
|
1097
|
-
async function measureResponseSize(response) {
|
|
1098
|
-
const [newResponse1, newResponse2] =
|
|
1123
|
+
async function measureResponseSize(response, tee = true) {
|
|
1124
|
+
const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
|
|
1125
|
+
response,
|
|
1126
|
+
response
|
|
1127
|
+
];
|
|
1099
1128
|
let size = 0;
|
|
1100
1129
|
if (newResponse2.body) {
|
|
1101
1130
|
let done = false;
|
|
@@ -1114,8 +1143,11 @@ async function measureResponseSize(response) {
|
|
|
1114
1143
|
];
|
|
1115
1144
|
}
|
|
1116
1145
|
__name(measureResponseSize, "measureResponseSize");
|
|
1117
|
-
async function getResponseBody(response) {
|
|
1118
|
-
const [newResponse1, newResponse2] =
|
|
1146
|
+
async function getResponseBody(response, tee = true) {
|
|
1147
|
+
const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
|
|
1148
|
+
response,
|
|
1149
|
+
response
|
|
1150
|
+
];
|
|
1119
1151
|
const responseBuffer = Buffer.from(await newResponse2.arrayBuffer());
|
|
1120
1152
|
return [
|
|
1121
1153
|
responseBuffer,
|
|
@@ -1126,7 +1158,7 @@ __name(getResponseBody, "getResponseBody");
|
|
|
1126
1158
|
async function getResponseJson(response) {
|
|
1127
1159
|
const contentType = response.headers.get("content-type");
|
|
1128
1160
|
if (contentType == null ? void 0 : contentType.includes("application/json")) {
|
|
1129
|
-
const [newResponse1, newResponse2] =
|
|
1161
|
+
const [newResponse1, newResponse2] = teeResponse(response);
|
|
1130
1162
|
const responseJson = await newResponse2.json();
|
|
1131
1163
|
return [
|
|
1132
1164
|
responseJson,
|
|
@@ -1139,7 +1171,7 @@ async function getResponseJson(response) {
|
|
|
1139
1171
|
];
|
|
1140
1172
|
}
|
|
1141
1173
|
__name(getResponseJson, "getResponseJson");
|
|
1142
|
-
|
|
1174
|
+
function teeResponse(response) {
|
|
1143
1175
|
if (!response.body) {
|
|
1144
1176
|
return [
|
|
1145
1177
|
response,
|
|
@@ -1164,6 +1196,143 @@ async function teeResponse(response) {
|
|
|
1164
1196
|
}
|
|
1165
1197
|
__name(teeResponse, "teeResponse");
|
|
1166
1198
|
|
|
1199
|
+
// src/loggers/console.ts
|
|
1200
|
+
import { format as format2 } from "util";
|
|
1201
|
+
var MAX_BUFFER_SIZE = 1e3;
|
|
1202
|
+
var isPatched = false;
|
|
1203
|
+
var globalLogsContext;
|
|
1204
|
+
function patchConsole(logsContext) {
|
|
1205
|
+
globalLogsContext = logsContext;
|
|
1206
|
+
if (isPatched) {
|
|
1207
|
+
return;
|
|
1208
|
+
}
|
|
1209
|
+
const logMethods = [
|
|
1210
|
+
"log",
|
|
1211
|
+
"warn",
|
|
1212
|
+
"error",
|
|
1213
|
+
"info",
|
|
1214
|
+
"debug"
|
|
1215
|
+
];
|
|
1216
|
+
logMethods.forEach((method) => {
|
|
1217
|
+
const originalMethod = console[method];
|
|
1218
|
+
console[method] = function(...args) {
|
|
1219
|
+
captureLog(method, args);
|
|
1220
|
+
return originalMethod.apply(console, args);
|
|
1221
|
+
};
|
|
1222
|
+
});
|
|
1223
|
+
isPatched = true;
|
|
1224
|
+
}
|
|
1225
|
+
__name(patchConsole, "patchConsole");
|
|
1226
|
+
function captureLog(level, args) {
|
|
1227
|
+
const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
|
|
1228
|
+
if (logs && logs.length < MAX_BUFFER_SIZE) {
|
|
1229
|
+
logs.push({
|
|
1230
|
+
timestamp: Date.now() / 1e3,
|
|
1231
|
+
logger: "console",
|
|
1232
|
+
level,
|
|
1233
|
+
message: format2(...args)
|
|
1234
|
+
});
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
__name(captureLog, "captureLog");
|
|
1238
|
+
|
|
1239
|
+
// src/loggers/utils.ts
|
|
1240
|
+
import { format as format3 } from "util";
|
|
1241
|
+
function formatMessage(message, ...args) {
|
|
1242
|
+
return [
|
|
1243
|
+
message,
|
|
1244
|
+
...args
|
|
1245
|
+
].map(formatArg).filter((arg) => arg !== "").join("\n");
|
|
1246
|
+
}
|
|
1247
|
+
__name(formatMessage, "formatMessage");
|
|
1248
|
+
function removeKeys(obj, keys) {
|
|
1249
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
|
|
1250
|
+
}
|
|
1251
|
+
__name(removeKeys, "removeKeys");
|
|
1252
|
+
function formatArg(arg) {
|
|
1253
|
+
if (typeof arg === "string") {
|
|
1254
|
+
return arg.trim();
|
|
1255
|
+
}
|
|
1256
|
+
if (arg instanceof Error) {
|
|
1257
|
+
return format3(arg).trim();
|
|
1258
|
+
}
|
|
1259
|
+
if (arg === void 0 || arg === null || isEmptyObject(arg)) {
|
|
1260
|
+
return "";
|
|
1261
|
+
}
|
|
1262
|
+
try {
|
|
1263
|
+
return JSON.stringify(arg);
|
|
1264
|
+
} catch {
|
|
1265
|
+
return format3(arg).trim();
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
__name(formatArg, "formatArg");
|
|
1269
|
+
function isEmptyObject(obj) {
|
|
1270
|
+
return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
|
|
1271
|
+
}
|
|
1272
|
+
__name(isEmptyObject, "isEmptyObject");
|
|
1273
|
+
|
|
1274
|
+
// src/loggers/pino.ts
|
|
1275
|
+
var originalStreamSym = Symbol.for("apitally.originalStream");
|
|
1276
|
+
|
|
1277
|
+
// src/loggers/winston.ts
|
|
1278
|
+
var MAX_BUFFER_SIZE2 = 1e3;
|
|
1279
|
+
var isPatched2 = false;
|
|
1280
|
+
var globalLogsContext2;
|
|
1281
|
+
async function patchWinston(logsContext) {
|
|
1282
|
+
var _a2, _b;
|
|
1283
|
+
globalLogsContext2 = logsContext;
|
|
1284
|
+
if (isPatched2) {
|
|
1285
|
+
return;
|
|
1286
|
+
}
|
|
1287
|
+
try {
|
|
1288
|
+
const loggerModule = await import("winston/lib/winston/logger.js");
|
|
1289
|
+
if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
|
|
1290
|
+
const originalWrite = loggerModule.default.prototype.write;
|
|
1291
|
+
loggerModule.default.prototype.write = function(info) {
|
|
1292
|
+
captureLog2(info);
|
|
1293
|
+
return originalWrite.call(this, info);
|
|
1294
|
+
};
|
|
1295
|
+
}
|
|
1296
|
+
} catch {
|
|
1297
|
+
}
|
|
1298
|
+
isPatched2 = true;
|
|
1299
|
+
}
|
|
1300
|
+
__name(patchWinston, "patchWinston");
|
|
1301
|
+
function captureLog2(info) {
|
|
1302
|
+
const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
|
|
1303
|
+
if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
try {
|
|
1307
|
+
const rest = removeKeys(info, [
|
|
1308
|
+
"timestamp",
|
|
1309
|
+
"level",
|
|
1310
|
+
"message",
|
|
1311
|
+
"splat"
|
|
1312
|
+
]);
|
|
1313
|
+
const formattedMessage = formatMessage(info.message, rest);
|
|
1314
|
+
if (formattedMessage) {
|
|
1315
|
+
logs.push({
|
|
1316
|
+
timestamp: parseTimestamp(info.timestamp),
|
|
1317
|
+
level: info.level || "info",
|
|
1318
|
+
message: formattedMessage.trim()
|
|
1319
|
+
});
|
|
1320
|
+
}
|
|
1321
|
+
} catch (e) {
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
__name(captureLog2, "captureLog");
|
|
1325
|
+
function parseTimestamp(timestamp) {
|
|
1326
|
+
if (timestamp) {
|
|
1327
|
+
const ts = new Date(timestamp).getTime();
|
|
1328
|
+
if (!isNaN(ts)) {
|
|
1329
|
+
return ts / 1e3;
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
return Date.now() / 1e3;
|
|
1333
|
+
}
|
|
1334
|
+
__name(parseTimestamp, "parseTimestamp");
|
|
1335
|
+
|
|
1167
1336
|
// src/hono/utils.ts
|
|
1168
1337
|
import { isMiddleware } from "hono/utils/handler";
|
|
1169
1338
|
|
|
@@ -1277,84 +1446,92 @@ function useApitally(app, config) {
|
|
|
1277
1446
|
}
|
|
1278
1447
|
__name(useApitally, "useApitally");
|
|
1279
1448
|
function getMiddleware(client) {
|
|
1449
|
+
const logsContext = new AsyncLocalStorage();
|
|
1450
|
+
if (client.requestLogger.config.captureLogs) {
|
|
1451
|
+
patchConsole(logsContext);
|
|
1452
|
+
patchWinston(logsContext);
|
|
1453
|
+
}
|
|
1280
1454
|
return async (c, next) => {
|
|
1281
1455
|
if (!client.isEnabled() || c.req.method.toUpperCase() === "OPTIONS") {
|
|
1282
1456
|
await next();
|
|
1283
1457
|
return;
|
|
1284
1458
|
}
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
method: c.req.method,
|
|
1297
|
-
path: c.req.routePath,
|
|
1298
|
-
statusCode: c.res.status,
|
|
1299
|
-
responseTime,
|
|
1300
|
-
requestSize,
|
|
1301
|
-
responseSize
|
|
1302
|
-
});
|
|
1303
|
-
response = newResponse;
|
|
1304
|
-
if (c.res.status === 400) {
|
|
1305
|
-
const [responseJson, newResponse2] = await getResponseJson(response);
|
|
1306
|
-
const validationErrors = extractZodErrors(responseJson);
|
|
1307
|
-
validationErrors.forEach((error) => {
|
|
1308
|
-
client.validationErrorCounter.addValidationError({
|
|
1309
|
-
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1310
|
-
method: c.req.method,
|
|
1311
|
-
path: c.req.routePath,
|
|
1312
|
-
...error
|
|
1313
|
-
});
|
|
1314
|
-
});
|
|
1315
|
-
response = newResponse2;
|
|
1316
|
-
}
|
|
1317
|
-
if (c.error) {
|
|
1318
|
-
client.serverErrorCounter.addServerError({
|
|
1459
|
+
await logsContext.run([], async () => {
|
|
1460
|
+
const timestamp = Date.now() / 1e3;
|
|
1461
|
+
const startTime = performance.now();
|
|
1462
|
+
await next();
|
|
1463
|
+
let response;
|
|
1464
|
+
const responseTime = performance.now() - startTime;
|
|
1465
|
+
const [responseSize, newResponse] = await measureResponseSize(c.res);
|
|
1466
|
+
const requestSize = parseContentLength(c.req.header("content-length"));
|
|
1467
|
+
const consumer = getConsumer(c);
|
|
1468
|
+
client.consumerRegistry.addOrUpdateConsumer(consumer);
|
|
1469
|
+
client.requestCounter.addRequest({
|
|
1319
1470
|
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1320
1471
|
method: c.req.method,
|
|
1321
1472
|
path: c.req.routePath,
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1473
|
+
statusCode: c.res.status,
|
|
1474
|
+
responseTime,
|
|
1475
|
+
requestSize,
|
|
1476
|
+
responseSize
|
|
1325
1477
|
});
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1478
|
+
response = newResponse;
|
|
1479
|
+
if (c.res.status === 400) {
|
|
1480
|
+
const [responseJson, newResponse2] = await getResponseJson(response);
|
|
1481
|
+
const validationErrors = extractZodErrors(responseJson);
|
|
1482
|
+
validationErrors.forEach((error) => {
|
|
1483
|
+
client.validationErrorCounter.addValidationError({
|
|
1484
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1485
|
+
method: c.req.method,
|
|
1486
|
+
path: c.req.routePath,
|
|
1487
|
+
...error
|
|
1488
|
+
});
|
|
1489
|
+
});
|
|
1338
1490
|
response = newResponse2;
|
|
1339
1491
|
}
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1492
|
+
if (c.error) {
|
|
1493
|
+
client.serverErrorCounter.addServerError({
|
|
1494
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1495
|
+
method: c.req.method,
|
|
1496
|
+
path: c.req.routePath,
|
|
1497
|
+
type: c.error.name,
|
|
1498
|
+
msg: c.error.message,
|
|
1499
|
+
traceback: c.error.stack || ""
|
|
1500
|
+
});
|
|
1501
|
+
}
|
|
1502
|
+
if (client.requestLogger.enabled) {
|
|
1503
|
+
let requestBody;
|
|
1504
|
+
let responseBody;
|
|
1505
|
+
let newResponse2 = response;
|
|
1506
|
+
const requestContentType = c.req.header("content-type");
|
|
1507
|
+
const responseContentType = c.res.headers.get("content-type");
|
|
1508
|
+
if (client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType)) {
|
|
1509
|
+
requestBody = Buffer.from(await c.req.arrayBuffer());
|
|
1510
|
+
}
|
|
1511
|
+
if (client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType)) {
|
|
1512
|
+
[responseBody, newResponse2] = await getResponseBody(response);
|
|
1513
|
+
response = newResponse2;
|
|
1514
|
+
}
|
|
1515
|
+
const logs = logsContext.getStore();
|
|
1516
|
+
client.requestLogger.logRequest({
|
|
1517
|
+
timestamp,
|
|
1518
|
+
method: c.req.method,
|
|
1519
|
+
path: c.req.routePath,
|
|
1520
|
+
url: c.req.url,
|
|
1521
|
+
headers: convertHeaders(c.req.header()),
|
|
1522
|
+
size: requestSize,
|
|
1523
|
+
consumer: consumer == null ? void 0 : consumer.identifier,
|
|
1524
|
+
body: requestBody
|
|
1525
|
+
}, {
|
|
1526
|
+
statusCode: c.res.status,
|
|
1527
|
+
responseTime: responseTime / 1e3,
|
|
1528
|
+
headers: convertHeaders(c.res.headers),
|
|
1529
|
+
size: responseSize,
|
|
1530
|
+
body: responseBody
|
|
1531
|
+
}, c.error, logs);
|
|
1532
|
+
}
|
|
1533
|
+
c.res = response;
|
|
1534
|
+
});
|
|
1358
1535
|
};
|
|
1359
1536
|
}
|
|
1360
1537
|
__name(getMiddleware, "getMiddleware");
|