apitally 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/adonisjs/configure.cjs +2 -2
  2. package/dist/adonisjs/configure.cjs.map +1 -1
  3. package/dist/adonisjs/configure.js.map +1 -1
  4. package/dist/adonisjs/index.cjs +2 -2
  5. package/dist/adonisjs/index.cjs.map +1 -1
  6. package/dist/adonisjs/index.d.cts +2 -2
  7. package/dist/adonisjs/index.d.ts +2 -2
  8. package/dist/adonisjs/index.js.map +1 -1
  9. package/dist/adonisjs/middleware.cjs +104 -84
  10. package/dist/adonisjs/middleware.cjs.map +1 -1
  11. package/dist/adonisjs/middleware.d.cts +2 -2
  12. package/dist/adonisjs/middleware.d.ts +2 -2
  13. package/dist/adonisjs/middleware.js +103 -83
  14. package/dist/adonisjs/middleware.js.map +1 -1
  15. package/dist/adonisjs/provider.cjs +4750 -60
  16. package/dist/adonisjs/provider.cjs.map +1 -1
  17. package/dist/adonisjs/provider.d.cts +7 -4
  18. package/dist/adonisjs/provider.d.ts +7 -4
  19. package/dist/adonisjs/provider.js +4728 -15
  20. package/dist/adonisjs/provider.js.map +1 -1
  21. package/dist/common/client.cjs +62 -40
  22. package/dist/common/client.cjs.map +1 -1
  23. package/dist/common/client.d.cts +2 -2
  24. package/dist/common/client.d.ts +2 -2
  25. package/dist/common/client.js +31 -9
  26. package/dist/common/client.js.map +1 -1
  27. package/dist/common/consumerRegistry.d.cts +2 -2
  28. package/dist/common/consumerRegistry.d.ts +2 -2
  29. package/dist/common/headers.cjs.map +1 -1
  30. package/dist/common/headers.d.cts +1 -1
  31. package/dist/common/headers.d.ts +1 -1
  32. package/dist/common/headers.js.map +1 -1
  33. package/dist/common/logging.cjs +3 -2
  34. package/dist/common/logging.cjs.map +1 -1
  35. package/dist/common/logging.d.cts +1 -1
  36. package/dist/common/logging.d.ts +1 -1
  37. package/dist/common/logging.js +3 -2
  38. package/dist/common/logging.js.map +1 -1
  39. package/dist/common/packageVersions.cjs +2 -2
  40. package/dist/common/packageVersions.cjs.map +1 -1
  41. package/dist/common/packageVersions.js.map +1 -1
  42. package/dist/common/requestCounter.d.cts +2 -2
  43. package/dist/common/requestCounter.d.ts +2 -2
  44. package/dist/common/requestLogger.cjs +54 -33
  45. package/dist/common/requestLogger.cjs.map +1 -1
  46. package/dist/common/requestLogger.d.cts +11 -4
  47. package/dist/common/requestLogger.d.ts +11 -4
  48. package/dist/common/requestLogger.js +27 -6
  49. package/dist/common/requestLogger.js.map +1 -1
  50. package/dist/common/serverErrorCounter.cjs +3 -2
  51. package/dist/common/serverErrorCounter.cjs.map +1 -1
  52. package/dist/common/serverErrorCounter.d.cts +2 -2
  53. package/dist/common/serverErrorCounter.d.ts +2 -2
  54. package/dist/common/serverErrorCounter.js +1 -0
  55. package/dist/common/serverErrorCounter.js.map +1 -1
  56. package/dist/common/tempGzipFile.cjs +15 -14
  57. package/dist/common/tempGzipFile.cjs.map +1 -1
  58. package/dist/common/tempGzipFile.d.cts +1 -1
  59. package/dist/common/tempGzipFile.d.ts +1 -1
  60. package/dist/common/tempGzipFile.js +3 -2
  61. package/dist/common/tempGzipFile.js.map +1 -1
  62. package/dist/common/types.d.cts +2 -2
  63. package/dist/common/types.d.ts +2 -2
  64. package/dist/common/validationErrorCounter.cjs +2 -2
  65. package/dist/common/validationErrorCounter.cjs.map +1 -1
  66. package/dist/common/validationErrorCounter.d.cts +2 -2
  67. package/dist/common/validationErrorCounter.d.ts +2 -2
  68. package/dist/common/validationErrorCounter.js.map +1 -1
  69. package/dist/express/index.cjs +4979 -167
  70. package/dist/express/index.cjs.map +1 -1
  71. package/dist/express/index.d.cts +2 -2
  72. package/dist/express/index.d.ts +2 -2
  73. package/dist/express/index.js +4951 -118
  74. package/dist/express/index.js.map +1 -1
  75. package/dist/express/middleware.cjs +4979 -167
  76. package/dist/express/middleware.cjs.map +1 -1
  77. package/dist/express/middleware.d.cts +2 -2
  78. package/dist/express/middleware.d.ts +2 -2
  79. package/dist/express/middleware.js +4951 -118
  80. package/dist/express/middleware.js.map +1 -1
  81. package/dist/fastify/index.cjs +4908 -70
  82. package/dist/fastify/index.cjs.map +1 -1
  83. package/dist/fastify/index.d.cts +3 -2
  84. package/dist/fastify/index.d.ts +3 -2
  85. package/dist/fastify/index.js +4881 -22
  86. package/dist/fastify/index.js.map +1 -1
  87. package/dist/fastify/plugin.cjs +4908 -70
  88. package/dist/fastify/plugin.cjs.map +1 -1
  89. package/dist/fastify/plugin.d.cts +8 -3
  90. package/dist/fastify/plugin.d.ts +8 -3
  91. package/dist/fastify/plugin.js +4881 -22
  92. package/dist/fastify/plugin.js.map +1 -1
  93. package/dist/h3/index.cjs +219 -50
  94. package/dist/h3/index.cjs.map +1 -1
  95. package/dist/h3/index.d.cts +2 -2
  96. package/dist/h3/index.d.ts +2 -2
  97. package/dist/h3/index.js +184 -15
  98. package/dist/h3/index.js.map +1 -1
  99. package/dist/h3/plugin.cjs +219 -50
  100. package/dist/h3/plugin.cjs.map +1 -1
  101. package/dist/h3/plugin.d.cts +6 -4
  102. package/dist/h3/plugin.d.ts +6 -4
  103. package/dist/h3/plugin.js +184 -15
  104. package/dist/h3/plugin.js.map +1 -1
  105. package/dist/h3/utils.cjs +2 -2
  106. package/dist/h3/utils.cjs.map +1 -1
  107. package/dist/h3/utils.js.map +1 -1
  108. package/dist/hono/index.cjs +278 -110
  109. package/dist/hono/index.cjs.map +1 -1
  110. package/dist/hono/index.d.cts +2 -2
  111. package/dist/hono/index.d.ts +2 -2
  112. package/dist/hono/index.js +244 -76
  113. package/dist/hono/index.js.map +1 -1
  114. package/dist/hono/middleware.cjs +278 -110
  115. package/dist/hono/middleware.cjs.map +1 -1
  116. package/dist/hono/middleware.d.cts +2 -2
  117. package/dist/hono/middleware.d.ts +2 -2
  118. package/dist/hono/middleware.js +244 -76
  119. package/dist/hono/middleware.js.map +1 -1
  120. package/dist/hono/utils.cjs +2 -2
  121. package/dist/hono/utils.cjs.map +1 -1
  122. package/dist/hono/utils.d.cts +2 -2
  123. package/dist/hono/utils.d.ts +2 -2
  124. package/dist/hono/utils.js.map +1 -1
  125. package/dist/koa/index.cjs +275 -105
  126. package/dist/koa/index.cjs.map +1 -1
  127. package/dist/koa/index.d.cts +2 -2
  128. package/dist/koa/index.d.ts +2 -2
  129. package/dist/koa/index.js +239 -69
  130. package/dist/koa/index.js.map +1 -1
  131. package/dist/koa/middleware.cjs +273 -105
  132. package/dist/koa/middleware.cjs.map +1 -1
  133. package/dist/koa/middleware.d.cts +2 -2
  134. package/dist/koa/middleware.d.ts +2 -2
  135. package/dist/koa/middleware.js +239 -69
  136. package/dist/koa/middleware.js.map +1 -1
  137. package/dist/loggers/console.cjs +69 -0
  138. package/dist/loggers/console.cjs.map +1 -0
  139. package/dist/loggers/console.d.cts +9 -0
  140. package/dist/loggers/console.d.ts +9 -0
  141. package/dist/loggers/console.js +46 -0
  142. package/dist/loggers/console.js.map +1 -0
  143. package/dist/loggers/index.cjs +4824 -0
  144. package/dist/loggers/index.cjs.map +1 -0
  145. package/dist/loggers/index.d.cts +9 -0
  146. package/dist/loggers/index.d.ts +9 -0
  147. package/dist/loggers/index.js +4813 -0
  148. package/dist/loggers/index.js.map +1 -0
  149. package/dist/loggers/nestjs.cjs +135 -0
  150. package/dist/loggers/nestjs.cjs.map +1 -0
  151. package/dist/loggers/nestjs.d.cts +9 -0
  152. package/dist/loggers/nestjs.d.ts +9 -0
  153. package/dist/loggers/nestjs.js +100 -0
  154. package/dist/loggers/nestjs.js.map +1 -0
  155. package/dist/loggers/pino.cjs +4656 -0
  156. package/dist/loggers/pino.cjs.map +1 -0
  157. package/dist/loggers/pino.d.cts +9 -0
  158. package/dist/loggers/pino.d.ts +9 -0
  159. package/dist/loggers/pino.js +4648 -0
  160. package/dist/loggers/pino.js.map +1 -0
  161. package/dist/loggers/utils.cjs +66 -0
  162. package/dist/loggers/utils.cjs.map +1 -0
  163. package/dist/loggers/utils.d.cts +6 -0
  164. package/dist/loggers/utils.d.ts +6 -0
  165. package/dist/loggers/utils.js +42 -0
  166. package/dist/loggers/utils.js.map +1 -0
  167. package/dist/loggers/winston.cjs +135 -0
  168. package/dist/loggers/winston.cjs.map +1 -0
  169. package/dist/loggers/winston.d.cts +9 -0
  170. package/dist/loggers/winston.d.ts +9 -0
  171. package/dist/loggers/winston.js +100 -0
  172. package/dist/loggers/winston.js.map +1 -0
  173. package/dist/nestjs/index.cjs +5341 -451
  174. package/dist/nestjs/index.cjs.map +1 -1
  175. package/dist/nestjs/index.d.cts +2 -2
  176. package/dist/nestjs/index.d.ts +2 -2
  177. package/dist/nestjs/index.js +5294 -406
  178. package/dist/nestjs/index.js.map +1 -1
  179. package/package.json +4 -3
@@ -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
- var getLogger = /* @__PURE__ */ __name(() => {
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
- }, "getLogger");
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 as unlinkSync2, writeFileSync } from "fs";
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, unlinkSync } from "fs";
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
- unlinkSync(this.filePath);
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,
@@ -736,11 +751,19 @@ function skipEmptyValues(data) {
736
751
  }));
737
752
  }
738
753
  __name(skipEmptyValues, "skipEmptyValues");
754
+ function truncateLogMessage(msg) {
755
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
756
+ const suffix = "... (truncated)";
757
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
758
+ }
759
+ return msg;
760
+ }
761
+ __name(truncateLogMessage, "truncateLogMessage");
739
762
  function checkWritableFs() {
740
763
  try {
741
764
  const testPath = join2(tmpdir2(), `apitally-${randomUUID2()}`);
742
765
  writeFileSync(testPath, "test");
743
- unlinkSync2(testPath);
766
+ unlinkSync(testPath);
744
767
  return true;
745
768
  } catch (error) {
746
769
  return false;
@@ -1164,6 +1187,143 @@ async function teeResponse(response) {
1164
1187
  }
1165
1188
  __name(teeResponse, "teeResponse");
1166
1189
 
1190
+ // src/loggers/console.ts
1191
+ import { format as format2 } from "util";
1192
+ var MAX_BUFFER_SIZE = 1e3;
1193
+ var isPatched = false;
1194
+ var globalLogsContext;
1195
+ function patchConsole(logsContext) {
1196
+ globalLogsContext = logsContext;
1197
+ if (isPatched) {
1198
+ return;
1199
+ }
1200
+ const logMethods = [
1201
+ "log",
1202
+ "warn",
1203
+ "error",
1204
+ "info",
1205
+ "debug"
1206
+ ];
1207
+ logMethods.forEach((method) => {
1208
+ const originalMethod = console[method];
1209
+ console[method] = function(...args) {
1210
+ captureLog(method, args);
1211
+ return originalMethod.apply(console, args);
1212
+ };
1213
+ });
1214
+ isPatched = true;
1215
+ }
1216
+ __name(patchConsole, "patchConsole");
1217
+ function captureLog(level, args) {
1218
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1219
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1220
+ logs.push({
1221
+ timestamp: Date.now() / 1e3,
1222
+ logger: "console",
1223
+ level,
1224
+ message: format2(...args)
1225
+ });
1226
+ }
1227
+ }
1228
+ __name(captureLog, "captureLog");
1229
+
1230
+ // src/loggers/utils.ts
1231
+ import { format as format3 } from "util";
1232
+ function formatMessage(message, ...args) {
1233
+ return [
1234
+ message,
1235
+ ...args
1236
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1237
+ }
1238
+ __name(formatMessage, "formatMessage");
1239
+ function removeKeys(obj, keys) {
1240
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1241
+ }
1242
+ __name(removeKeys, "removeKeys");
1243
+ function formatArg(arg) {
1244
+ if (typeof arg === "string") {
1245
+ return arg.trim();
1246
+ }
1247
+ if (arg instanceof Error) {
1248
+ return format3(arg).trim();
1249
+ }
1250
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1251
+ return "";
1252
+ }
1253
+ try {
1254
+ return JSON.stringify(arg);
1255
+ } catch {
1256
+ return format3(arg).trim();
1257
+ }
1258
+ }
1259
+ __name(formatArg, "formatArg");
1260
+ function isEmptyObject(obj) {
1261
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1262
+ }
1263
+ __name(isEmptyObject, "isEmptyObject");
1264
+
1265
+ // src/loggers/pino.ts
1266
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1267
+
1268
+ // src/loggers/winston.ts
1269
+ var MAX_BUFFER_SIZE2 = 1e3;
1270
+ var isPatched2 = false;
1271
+ var globalLogsContext2;
1272
+ async function patchWinston(logsContext) {
1273
+ var _a2, _b;
1274
+ globalLogsContext2 = logsContext;
1275
+ if (isPatched2) {
1276
+ return;
1277
+ }
1278
+ try {
1279
+ const loggerModule = await import("winston/lib/winston/logger.js");
1280
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1281
+ const originalWrite = loggerModule.default.prototype.write;
1282
+ loggerModule.default.prototype.write = function(info) {
1283
+ captureLog2(info);
1284
+ return originalWrite.call(this, info);
1285
+ };
1286
+ }
1287
+ } catch {
1288
+ }
1289
+ isPatched2 = true;
1290
+ }
1291
+ __name(patchWinston, "patchWinston");
1292
+ function captureLog2(info) {
1293
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1294
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1295
+ return;
1296
+ }
1297
+ try {
1298
+ const rest = removeKeys(info, [
1299
+ "timestamp",
1300
+ "level",
1301
+ "message",
1302
+ "splat"
1303
+ ]);
1304
+ const formattedMessage = formatMessage(info.message, rest);
1305
+ if (formattedMessage) {
1306
+ logs.push({
1307
+ timestamp: parseTimestamp(info.timestamp),
1308
+ level: info.level || "info",
1309
+ message: formattedMessage.trim()
1310
+ });
1311
+ }
1312
+ } catch (e) {
1313
+ }
1314
+ }
1315
+ __name(captureLog2, "captureLog");
1316
+ function parseTimestamp(timestamp) {
1317
+ if (timestamp) {
1318
+ const ts = new Date(timestamp).getTime();
1319
+ if (!isNaN(ts)) {
1320
+ return ts / 1e3;
1321
+ }
1322
+ }
1323
+ return Date.now() / 1e3;
1324
+ }
1325
+ __name(parseTimestamp, "parseTimestamp");
1326
+
1167
1327
  // src/hono/utils.ts
1168
1328
  import { isMiddleware } from "hono/utils/handler";
1169
1329
 
@@ -1277,84 +1437,92 @@ function useApitally(app, config) {
1277
1437
  }
1278
1438
  __name(useApitally, "useApitally");
1279
1439
  function getMiddleware(client) {
1440
+ const logsContext = new AsyncLocalStorage();
1441
+ if (client.requestLogger.config.captureLogs) {
1442
+ patchConsole(logsContext);
1443
+ patchWinston(logsContext);
1444
+ }
1280
1445
  return async (c, next) => {
1281
1446
  if (!client.isEnabled() || c.req.method.toUpperCase() === "OPTIONS") {
1282
1447
  await next();
1283
1448
  return;
1284
1449
  }
1285
- const timestamp = Date.now() / 1e3;
1286
- const startTime = performance.now();
1287
- await next();
1288
- let response;
1289
- const responseTime = performance.now() - startTime;
1290
- const [responseSize, newResponse] = await measureResponseSize(c.res);
1291
- const requestSize = parseContentLength(c.req.header("content-length"));
1292
- const consumer = getConsumer(c);
1293
- client.consumerRegistry.addOrUpdateConsumer(consumer);
1294
- client.requestCounter.addRequest({
1295
- consumer: consumer == null ? void 0 : consumer.identifier,
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({
1450
+ await logsContext.run([], async () => {
1451
+ const timestamp = Date.now() / 1e3;
1452
+ const startTime = performance.now();
1453
+ await next();
1454
+ let response;
1455
+ const responseTime = performance.now() - startTime;
1456
+ const [responseSize, newResponse] = await measureResponseSize(c.res);
1457
+ const requestSize = parseContentLength(c.req.header("content-length"));
1458
+ const consumer = getConsumer(c);
1459
+ client.consumerRegistry.addOrUpdateConsumer(consumer);
1460
+ client.requestCounter.addRequest({
1319
1461
  consumer: consumer == null ? void 0 : consumer.identifier,
1320
1462
  method: c.req.method,
1321
1463
  path: c.req.routePath,
1322
- type: c.error.name,
1323
- msg: c.error.message,
1324
- traceback: c.error.stack || ""
1464
+ statusCode: c.res.status,
1465
+ responseTime,
1466
+ requestSize,
1467
+ responseSize
1325
1468
  });
1326
- }
1327
- if (client.requestLogger.enabled) {
1328
- let requestBody;
1329
- let responseBody;
1330
- let newResponse2 = response;
1331
- const requestContentType = c.req.header("content-type");
1332
- const responseContentType = c.res.headers.get("content-type");
1333
- if (client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType)) {
1334
- requestBody = Buffer.from(await c.req.arrayBuffer());
1335
- }
1336
- if (client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType)) {
1337
- [responseBody, newResponse2] = await getResponseBody(response);
1469
+ response = newResponse;
1470
+ if (c.res.status === 400) {
1471
+ const [responseJson, newResponse2] = await getResponseJson(response);
1472
+ const validationErrors = extractZodErrors(responseJson);
1473
+ validationErrors.forEach((error) => {
1474
+ client.validationErrorCounter.addValidationError({
1475
+ consumer: consumer == null ? void 0 : consumer.identifier,
1476
+ method: c.req.method,
1477
+ path: c.req.routePath,
1478
+ ...error
1479
+ });
1480
+ });
1338
1481
  response = newResponse2;
1339
1482
  }
1340
- client.requestLogger.logRequest({
1341
- timestamp,
1342
- method: c.req.method,
1343
- path: c.req.routePath,
1344
- url: c.req.url,
1345
- headers: convertHeaders(c.req.header()),
1346
- size: Number(requestSize),
1347
- consumer: consumer == null ? void 0 : consumer.identifier,
1348
- body: requestBody
1349
- }, {
1350
- statusCode: c.res.status,
1351
- responseTime: responseTime / 1e3,
1352
- headers: convertHeaders(c.res.headers),
1353
- size: responseSize,
1354
- body: responseBody
1355
- }, c.error);
1356
- }
1357
- c.res = response;
1483
+ if (c.error) {
1484
+ client.serverErrorCounter.addServerError({
1485
+ consumer: consumer == null ? void 0 : consumer.identifier,
1486
+ method: c.req.method,
1487
+ path: c.req.routePath,
1488
+ type: c.error.name,
1489
+ msg: c.error.message,
1490
+ traceback: c.error.stack || ""
1491
+ });
1492
+ }
1493
+ if (client.requestLogger.enabled) {
1494
+ let requestBody;
1495
+ let responseBody;
1496
+ let newResponse2 = response;
1497
+ const requestContentType = c.req.header("content-type");
1498
+ const responseContentType = c.res.headers.get("content-type");
1499
+ if (client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType)) {
1500
+ requestBody = Buffer.from(await c.req.arrayBuffer());
1501
+ }
1502
+ if (client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType)) {
1503
+ [responseBody, newResponse2] = await getResponseBody(response);
1504
+ response = newResponse2;
1505
+ }
1506
+ const logs = logsContext.getStore();
1507
+ client.requestLogger.logRequest({
1508
+ timestamp,
1509
+ method: c.req.method,
1510
+ path: c.req.routePath,
1511
+ url: c.req.url,
1512
+ headers: convertHeaders(c.req.header()),
1513
+ size: requestSize,
1514
+ consumer: consumer == null ? void 0 : consumer.identifier,
1515
+ body: requestBody
1516
+ }, {
1517
+ statusCode: c.res.status,
1518
+ responseTime: responseTime / 1e3,
1519
+ headers: convertHeaders(c.res.headers),
1520
+ size: responseSize,
1521
+ body: responseBody
1522
+ }, c.error, logs);
1523
+ }
1524
+ c.res = response;
1525
+ });
1358
1526
  };
1359
1527
  }
1360
1528
  __name(getMiddleware, "getMiddleware");