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.
Files changed (205) hide show
  1. package/README.md +71 -44
  2. package/dist/adonisjs/configure.cjs +2 -2
  3. package/dist/adonisjs/configure.cjs.map +1 -1
  4. package/dist/adonisjs/configure.js.map +1 -1
  5. package/dist/adonisjs/index.cjs +2 -2
  6. package/dist/adonisjs/index.cjs.map +1 -1
  7. package/dist/adonisjs/index.d.cts +2 -2
  8. package/dist/adonisjs/index.d.ts +2 -2
  9. package/dist/adonisjs/index.js.map +1 -1
  10. package/dist/adonisjs/middleware.cjs +107 -84
  11. package/dist/adonisjs/middleware.cjs.map +1 -1
  12. package/dist/adonisjs/middleware.d.cts +2 -2
  13. package/dist/adonisjs/middleware.d.ts +2 -2
  14. package/dist/adonisjs/middleware.js +106 -83
  15. package/dist/adonisjs/middleware.js.map +1 -1
  16. package/dist/adonisjs/provider.cjs +4765 -62
  17. package/dist/adonisjs/provider.cjs.map +1 -1
  18. package/dist/adonisjs/provider.d.cts +7 -4
  19. package/dist/adonisjs/provider.d.ts +7 -4
  20. package/dist/adonisjs/provider.js +4743 -17
  21. package/dist/adonisjs/provider.js.map +1 -1
  22. package/dist/common/client.cjs +64 -42
  23. package/dist/common/client.cjs.map +1 -1
  24. package/dist/common/client.d.cts +2 -2
  25. package/dist/common/client.d.ts +2 -2
  26. package/dist/common/client.js +33 -11
  27. package/dist/common/client.js.map +1 -1
  28. package/dist/common/consumerRegistry.d.cts +2 -2
  29. package/dist/common/consumerRegistry.d.ts +2 -2
  30. package/dist/common/headers.cjs.map +1 -1
  31. package/dist/common/headers.d.cts +1 -1
  32. package/dist/common/headers.d.ts +1 -1
  33. package/dist/common/headers.js.map +1 -1
  34. package/dist/common/logging.cjs +3 -2
  35. package/dist/common/logging.cjs.map +1 -1
  36. package/dist/common/logging.d.cts +1 -1
  37. package/dist/common/logging.d.ts +1 -1
  38. package/dist/common/logging.js +3 -2
  39. package/dist/common/logging.js.map +1 -1
  40. package/dist/common/packageVersions.cjs +2 -2
  41. package/dist/common/packageVersions.cjs.map +1 -1
  42. package/dist/common/packageVersions.js.map +1 -1
  43. package/dist/common/requestCounter.d.cts +2 -2
  44. package/dist/common/requestCounter.d.ts +2 -2
  45. package/dist/common/requestLogger.cjs +57 -33
  46. package/dist/common/requestLogger.cjs.map +1 -1
  47. package/dist/common/requestLogger.d.cts +12 -5
  48. package/dist/common/requestLogger.d.ts +12 -5
  49. package/dist/common/requestLogger.js +30 -6
  50. package/dist/common/requestLogger.js.map +1 -1
  51. package/dist/common/response.cjs +12 -6
  52. package/dist/common/response.cjs.map +1 -1
  53. package/dist/common/response.d.cts +3 -3
  54. package/dist/common/response.d.ts +3 -3
  55. package/dist/common/response.js +12 -6
  56. package/dist/common/response.js.map +1 -1
  57. package/dist/common/serverErrorCounter.cjs +3 -2
  58. package/dist/common/serverErrorCounter.cjs.map +1 -1
  59. package/dist/common/serverErrorCounter.d.cts +2 -2
  60. package/dist/common/serverErrorCounter.d.ts +2 -2
  61. package/dist/common/serverErrorCounter.js +1 -0
  62. package/dist/common/serverErrorCounter.js.map +1 -1
  63. package/dist/common/tempGzipFile.cjs +15 -14
  64. package/dist/common/tempGzipFile.cjs.map +1 -1
  65. package/dist/common/tempGzipFile.d.cts +1 -1
  66. package/dist/common/tempGzipFile.d.ts +1 -1
  67. package/dist/common/tempGzipFile.js +3 -2
  68. package/dist/common/tempGzipFile.js.map +1 -1
  69. package/dist/common/types.d.cts +2 -2
  70. package/dist/common/types.d.ts +2 -2
  71. package/dist/common/validationErrorCounter.cjs +4 -4
  72. package/dist/common/validationErrorCounter.cjs.map +1 -1
  73. package/dist/common/validationErrorCounter.d.cts +2 -2
  74. package/dist/common/validationErrorCounter.d.ts +2 -2
  75. package/dist/common/validationErrorCounter.js +2 -2
  76. package/dist/common/validationErrorCounter.js.map +1 -1
  77. package/dist/elysia/index.cjs +1582 -0
  78. package/dist/elysia/index.cjs.map +1 -0
  79. package/dist/elysia/index.d.cts +9 -0
  80. package/dist/elysia/index.d.ts +9 -0
  81. package/dist/elysia/index.js +1552 -0
  82. package/dist/elysia/index.js.map +1 -0
  83. package/dist/elysia/plugin.cjs +1576 -0
  84. package/dist/elysia/plugin.cjs.map +1 -0
  85. package/dist/elysia/plugin.d.cts +53 -0
  86. package/dist/elysia/plugin.d.ts +53 -0
  87. package/dist/elysia/plugin.js +1552 -0
  88. package/dist/elysia/plugin.js.map +1 -0
  89. package/dist/elysia/utils.cjs +98 -0
  90. package/dist/elysia/utils.cjs.map +1 -0
  91. package/dist/elysia/utils.d.cts +12 -0
  92. package/dist/elysia/utils.d.ts +12 -0
  93. package/dist/elysia/utils.js +78 -0
  94. package/dist/elysia/utils.js.map +1 -0
  95. package/dist/express/index.cjs +4997 -169
  96. package/dist/express/index.cjs.map +1 -1
  97. package/dist/express/index.d.cts +2 -2
  98. package/dist/express/index.d.ts +2 -2
  99. package/dist/express/index.js +4969 -120
  100. package/dist/express/index.js.map +1 -1
  101. package/dist/express/middleware.cjs +4997 -169
  102. package/dist/express/middleware.cjs.map +1 -1
  103. package/dist/express/middleware.d.cts +2 -2
  104. package/dist/express/middleware.d.ts +2 -2
  105. package/dist/express/middleware.js +4969 -120
  106. package/dist/express/middleware.js.map +1 -1
  107. package/dist/fastify/index.cjs +4926 -72
  108. package/dist/fastify/index.cjs.map +1 -1
  109. package/dist/fastify/index.d.cts +3 -2
  110. package/dist/fastify/index.d.ts +3 -2
  111. package/dist/fastify/index.js +4899 -24
  112. package/dist/fastify/index.js.map +1 -1
  113. package/dist/fastify/plugin.cjs +4926 -72
  114. package/dist/fastify/plugin.cjs.map +1 -1
  115. package/dist/fastify/plugin.d.cts +8 -3
  116. package/dist/fastify/plugin.d.ts +8 -3
  117. package/dist/fastify/plugin.js +4899 -24
  118. package/dist/fastify/plugin.js.map +1 -1
  119. package/dist/h3/index.cjs +235 -57
  120. package/dist/h3/index.cjs.map +1 -1
  121. package/dist/h3/index.d.cts +2 -2
  122. package/dist/h3/index.d.ts +2 -2
  123. package/dist/h3/index.js +200 -22
  124. package/dist/h3/index.js.map +1 -1
  125. package/dist/h3/plugin.cjs +235 -57
  126. package/dist/h3/plugin.cjs.map +1 -1
  127. package/dist/h3/plugin.d.cts +6 -4
  128. package/dist/h3/plugin.d.ts +6 -4
  129. package/dist/h3/plugin.js +200 -22
  130. package/dist/h3/plugin.js.map +1 -1
  131. package/dist/h3/utils.cjs +2 -2
  132. package/dist/h3/utils.cjs.map +1 -1
  133. package/dist/h3/utils.js.map +1 -1
  134. package/dist/hono/index.cjs +295 -118
  135. package/dist/hono/index.cjs.map +1 -1
  136. package/dist/hono/index.d.cts +2 -2
  137. package/dist/hono/index.d.ts +2 -2
  138. package/dist/hono/index.js +261 -84
  139. package/dist/hono/index.js.map +1 -1
  140. package/dist/hono/middleware.cjs +295 -118
  141. package/dist/hono/middleware.cjs.map +1 -1
  142. package/dist/hono/middleware.d.cts +2 -2
  143. package/dist/hono/middleware.d.ts +2 -2
  144. package/dist/hono/middleware.js +261 -84
  145. package/dist/hono/middleware.js.map +1 -1
  146. package/dist/hono/utils.cjs +2 -2
  147. package/dist/hono/utils.cjs.map +1 -1
  148. package/dist/hono/utils.d.cts +2 -2
  149. package/dist/hono/utils.d.ts +2 -2
  150. package/dist/hono/utils.js.map +1 -1
  151. package/dist/koa/index.cjs +280 -107
  152. package/dist/koa/index.cjs.map +1 -1
  153. package/dist/koa/index.d.cts +2 -2
  154. package/dist/koa/index.d.ts +2 -2
  155. package/dist/koa/index.js +244 -71
  156. package/dist/koa/index.js.map +1 -1
  157. package/dist/koa/middleware.cjs +278 -107
  158. package/dist/koa/middleware.cjs.map +1 -1
  159. package/dist/koa/middleware.d.cts +2 -2
  160. package/dist/koa/middleware.d.ts +2 -2
  161. package/dist/koa/middleware.js +244 -71
  162. package/dist/koa/middleware.js.map +1 -1
  163. package/dist/loggers/console.cjs +69 -0
  164. package/dist/loggers/console.cjs.map +1 -0
  165. package/dist/loggers/console.d.cts +9 -0
  166. package/dist/loggers/console.d.ts +9 -0
  167. package/dist/loggers/console.js +46 -0
  168. package/dist/loggers/console.js.map +1 -0
  169. package/dist/loggers/index.cjs +4837 -0
  170. package/dist/loggers/index.cjs.map +1 -0
  171. package/dist/loggers/index.d.cts +9 -0
  172. package/dist/loggers/index.d.ts +9 -0
  173. package/dist/loggers/index.js +4826 -0
  174. package/dist/loggers/index.js.map +1 -0
  175. package/dist/loggers/nestjs.cjs +135 -0
  176. package/dist/loggers/nestjs.cjs.map +1 -0
  177. package/dist/loggers/nestjs.d.cts +9 -0
  178. package/dist/loggers/nestjs.d.ts +9 -0
  179. package/dist/loggers/nestjs.js +100 -0
  180. package/dist/loggers/nestjs.js.map +1 -0
  181. package/dist/loggers/pino.cjs +4669 -0
  182. package/dist/loggers/pino.cjs.map +1 -0
  183. package/dist/loggers/pino.d.cts +9 -0
  184. package/dist/loggers/pino.d.ts +9 -0
  185. package/dist/loggers/pino.js +4661 -0
  186. package/dist/loggers/pino.js.map +1 -0
  187. package/dist/loggers/utils.cjs +66 -0
  188. package/dist/loggers/utils.cjs.map +1 -0
  189. package/dist/loggers/utils.d.cts +6 -0
  190. package/dist/loggers/utils.d.ts +6 -0
  191. package/dist/loggers/utils.js +42 -0
  192. package/dist/loggers/utils.js.map +1 -0
  193. package/dist/loggers/winston.cjs +135 -0
  194. package/dist/loggers/winston.cjs.map +1 -0
  195. package/dist/loggers/winston.d.cts +9 -0
  196. package/dist/loggers/winston.d.ts +9 -0
  197. package/dist/loggers/winston.js +100 -0
  198. package/dist/loggers/winston.js.map +1 -0
  199. package/dist/nestjs/index.cjs +5448 -542
  200. package/dist/nestjs/index.cjs.map +1 -1
  201. package/dist/nestjs/index.d.cts +2 -2
  202. package/dist/nestjs/index.d.ts +2 -2
  203. package/dist/nestjs/index.js +5364 -460
  204. package/dist/nestjs/index.js.map +1 -1
  205. package/package.json +26 -4
@@ -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,
@@ -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
- unlinkSync2(testPath);
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] = await teeResponse(response);
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] = await teeResponse(response);
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] = await teeResponse(response);
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
- async function teeResponse(response) {
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
- 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({
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
- type: c.error.name,
1323
- msg: c.error.message,
1324
- traceback: c.error.stack || ""
1473
+ statusCode: c.res.status,
1474
+ responseTime,
1475
+ requestSize,
1476
+ responseSize
1325
1477
  });
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);
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
- 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;
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");