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
package/dist/h3/plugin.js CHANGED
@@ -11,11 +11,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11
11
 
12
12
  // src/h3/plugin.ts
13
13
  import { definePlugin, onError, onRequest, onResponse } from "h3";
14
+ import { AsyncLocalStorage } from "async_hooks";
14
15
  import { performance } from "perf_hooks";
15
16
 
16
17
  // src/common/client.ts
17
- import { randomUUID as randomUUID3 } from "crypto";
18
18
  import fetchRetry from "fetch-retry";
19
+ import { randomUUID as randomUUID3 } from "crypto";
19
20
 
20
21
  // src/common/consumerRegistry.ts
21
22
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -75,7 +76,7 @@ var ConsumerRegistry = _ConsumerRegistry;
75
76
 
76
77
  // src/common/logging.ts
77
78
  import { createLogger, format, transports } from "winston";
78
- var getLogger = /* @__PURE__ */ __name(() => {
79
+ function getLogger() {
79
80
  return createLogger({
80
81
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
81
82
  format: format.combine(format.colorize(), format.timestamp(), format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -83,7 +84,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
83
84
  new transports.Console()
84
85
  ]
85
86
  });
86
- }, "getLogger");
87
+ }
88
+ __name(getLogger, "getLogger");
87
89
 
88
90
  // src/common/paramValidation.ts
89
91
  function isValidClientId(clientId) {
@@ -187,7 +189,7 @@ var RequestCounter = _RequestCounter;
187
189
  import AsyncLock from "async-lock";
188
190
  import { Buffer as Buffer3 } from "buffer";
189
191
  import { randomUUID as randomUUID2 } from "crypto";
190
- import { unlinkSync as unlinkSync2, writeFileSync } from "fs";
192
+ import { unlinkSync, writeFileSync } from "fs";
191
193
  import { tmpdir as tmpdir2 } from "os";
192
194
  import { join as join2 } from "path";
193
195
 
@@ -250,6 +252,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
250
252
  });
251
253
  this.errorCounts.clear();
252
254
  this.errorDetails.clear();
255
+ this.sentryEventIds.clear();
253
256
  return data;
254
257
  }
255
258
  getKey(serverError) {
@@ -296,7 +299,8 @@ __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
296
299
  // src/common/tempGzipFile.ts
297
300
  import { Buffer as Buffer2 } from "buffer";
298
301
  import { randomUUID } from "crypto";
299
- import { createWriteStream, readFile, unlinkSync } from "fs";
302
+ import { createWriteStream, readFile } from "fs";
303
+ import { unlink } from "fs/promises";
300
304
  import { tmpdir } from "os";
301
305
  import { join } from "path";
302
306
  import { createGzip } from "zlib";
@@ -361,7 +365,7 @@ var _TempGzipFile = class _TempGzipFile {
361
365
  }
362
366
  async delete() {
363
367
  await this.close();
364
- unlinkSync(this.filePath);
368
+ await unlink(this.filePath);
365
369
  }
366
370
  };
367
371
  __name(_TempGzipFile, "TempGzipFile");
@@ -372,6 +376,7 @@ var MAX_BODY_SIZE = 5e4;
372
376
  var MAX_FILE_SIZE = 1e6;
373
377
  var MAX_FILES = 50;
374
378
  var MAX_PENDING_WRITES = 100;
379
+ var MAX_LOG_MSG_LENGTH = 2048;
375
380
  var BODY_TOO_LARGE = Buffer3.from("<body too large>");
376
381
  var BODY_MASKED = Buffer3.from("<masked>");
377
382
  var MASKED = "******";
@@ -428,6 +433,7 @@ var DEFAULT_CONFIG = {
428
433
  logResponseHeaders: true,
429
434
  logResponseBody: false,
430
435
  logException: true,
436
+ captureLogs: false,
431
437
  maskQueryParams: [],
432
438
  maskHeaders: [],
433
439
  maskBodyFields: [],
@@ -582,7 +588,7 @@ var _RequestLogger = class _RequestLogger {
582
588
  item.request.url = url.toString();
583
589
  return item;
584
590
  }
585
- logRequest(request, response, error) {
591
+ logRequest(request, response, error, logs) {
586
592
  var _a2, _b, _c;
587
593
  if (!this.enabled || this.suspendUntil !== null) return;
588
594
  const url = new URL(request.url);
@@ -614,6 +620,14 @@ var _RequestLogger = class _RequestLogger {
614
620
  sentryEventId: getSentryEventId()
615
621
  } : void 0
616
622
  };
623
+ if (logs && logs.length > 0) {
624
+ item.logs = logs.map((log) => ({
625
+ timestamp: log.timestamp,
626
+ logger: log.logger,
627
+ level: log.level,
628
+ message: truncateLogMessage(log.message)
629
+ }));
630
+ }
617
631
  this.pendingWrites.push(item);
618
632
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
619
633
  this.pendingWrites.shift();
@@ -635,7 +649,8 @@ var _RequestLogger = class _RequestLogger {
635
649
  uuid: item.uuid,
636
650
  request: skipEmptyValues(item.request),
637
651
  response: skipEmptyValues(item.response),
638
- exception: item.exception
652
+ exception: item.exception,
653
+ logs: item.logs
639
654
  };
640
655
  [
641
656
  finalItem.request.body,
@@ -699,6 +714,9 @@ var _RequestLogger = class _RequestLogger {
699
714
  __name(_RequestLogger, "RequestLogger");
700
715
  var RequestLogger = _RequestLogger;
701
716
  function convertHeaders(headers) {
717
+ if (!headers) {
718
+ return [];
719
+ }
702
720
  if (headers instanceof Headers) {
703
721
  return Array.from(headers.entries());
704
722
  }
@@ -737,11 +755,19 @@ function skipEmptyValues(data) {
737
755
  }));
738
756
  }
739
757
  __name(skipEmptyValues, "skipEmptyValues");
758
+ function truncateLogMessage(msg) {
759
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
760
+ const suffix = "... (truncated)";
761
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
762
+ }
763
+ return msg;
764
+ }
765
+ __name(truncateLogMessage, "truncateLogMessage");
740
766
  function checkWritableFs() {
741
767
  try {
742
768
  const testPath = join2(tmpdir2(), `apitally-${randomUUID2()}`);
743
769
  writeFileSync(testPath, "test");
744
- unlinkSync2(testPath);
770
+ unlinkSync(testPath);
745
771
  return true;
746
772
  } catch (error) {
747
773
  return false;
@@ -774,7 +800,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
774
800
  consumer: validationError.consumer || null,
775
801
  method: validationError.method,
776
802
  path: validationError.path,
777
- loc: validationError.loc.split("."),
803
+ loc: validationError.loc.split(".").filter(Boolean),
778
804
  msg: validationError.msg,
779
805
  type: validationError.type,
780
806
  error_count: count
@@ -790,7 +816,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
790
816
  validationError.consumer || "",
791
817
  validationError.method.toUpperCase(),
792
818
  validationError.path,
793
- validationError.loc,
819
+ validationError.loc.split(".").filter(Boolean),
794
820
  validationError.msg.trim(),
795
821
  validationError.type
796
822
  ].join("|");
@@ -1102,8 +1128,11 @@ function mergeHeaders(base, merge) {
1102
1128
  __name(mergeHeaders, "mergeHeaders");
1103
1129
 
1104
1130
  // src/common/response.ts
1105
- async function measureResponseSize(response) {
1106
- const [newResponse1, newResponse2] = await teeResponse(response);
1131
+ async function measureResponseSize(response, tee = true) {
1132
+ const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
1133
+ response,
1134
+ response
1135
+ ];
1107
1136
  let size = 0;
1108
1137
  if (newResponse2.body) {
1109
1138
  let done = false;
@@ -1122,8 +1151,11 @@ async function measureResponseSize(response) {
1122
1151
  ];
1123
1152
  }
1124
1153
  __name(measureResponseSize, "measureResponseSize");
1125
- async function getResponseBody(response) {
1126
- const [newResponse1, newResponse2] = await teeResponse(response);
1154
+ async function getResponseBody(response, tee = true) {
1155
+ const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
1156
+ response,
1157
+ response
1158
+ ];
1127
1159
  const responseBuffer = Buffer.from(await newResponse2.arrayBuffer());
1128
1160
  return [
1129
1161
  responseBuffer,
@@ -1131,7 +1163,7 @@ async function getResponseBody(response) {
1131
1163
  ];
1132
1164
  }
1133
1165
  __name(getResponseBody, "getResponseBody");
1134
- async function teeResponse(response) {
1166
+ function teeResponse(response) {
1135
1167
  if (!response.body) {
1136
1168
  return [
1137
1169
  response,
@@ -1156,6 +1188,143 @@ async function teeResponse(response) {
1156
1188
  }
1157
1189
  __name(teeResponse, "teeResponse");
1158
1190
 
1191
+ // src/loggers/console.ts
1192
+ import { format as format2 } from "util";
1193
+ var MAX_BUFFER_SIZE = 1e3;
1194
+ var isPatched = false;
1195
+ var globalLogsContext;
1196
+ function patchConsole(logsContext) {
1197
+ globalLogsContext = logsContext;
1198
+ if (isPatched) {
1199
+ return;
1200
+ }
1201
+ const logMethods = [
1202
+ "log",
1203
+ "warn",
1204
+ "error",
1205
+ "info",
1206
+ "debug"
1207
+ ];
1208
+ logMethods.forEach((method) => {
1209
+ const originalMethod = console[method];
1210
+ console[method] = function(...args) {
1211
+ captureLog(method, args);
1212
+ return originalMethod.apply(console, args);
1213
+ };
1214
+ });
1215
+ isPatched = true;
1216
+ }
1217
+ __name(patchConsole, "patchConsole");
1218
+ function captureLog(level, args) {
1219
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1220
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1221
+ logs.push({
1222
+ timestamp: Date.now() / 1e3,
1223
+ logger: "console",
1224
+ level,
1225
+ message: format2(...args)
1226
+ });
1227
+ }
1228
+ }
1229
+ __name(captureLog, "captureLog");
1230
+
1231
+ // src/loggers/utils.ts
1232
+ import { format as format3 } from "util";
1233
+ function formatMessage(message, ...args) {
1234
+ return [
1235
+ message,
1236
+ ...args
1237
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1238
+ }
1239
+ __name(formatMessage, "formatMessage");
1240
+ function removeKeys(obj, keys) {
1241
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1242
+ }
1243
+ __name(removeKeys, "removeKeys");
1244
+ function formatArg(arg) {
1245
+ if (typeof arg === "string") {
1246
+ return arg.trim();
1247
+ }
1248
+ if (arg instanceof Error) {
1249
+ return format3(arg).trim();
1250
+ }
1251
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1252
+ return "";
1253
+ }
1254
+ try {
1255
+ return JSON.stringify(arg);
1256
+ } catch {
1257
+ return format3(arg).trim();
1258
+ }
1259
+ }
1260
+ __name(formatArg, "formatArg");
1261
+ function isEmptyObject(obj) {
1262
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1263
+ }
1264
+ __name(isEmptyObject, "isEmptyObject");
1265
+
1266
+ // src/loggers/pino.ts
1267
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1268
+
1269
+ // src/loggers/winston.ts
1270
+ var MAX_BUFFER_SIZE2 = 1e3;
1271
+ var isPatched2 = false;
1272
+ var globalLogsContext2;
1273
+ async function patchWinston(logsContext) {
1274
+ var _a2, _b;
1275
+ globalLogsContext2 = logsContext;
1276
+ if (isPatched2) {
1277
+ return;
1278
+ }
1279
+ try {
1280
+ const loggerModule = await import("winston/lib/winston/logger.js");
1281
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1282
+ const originalWrite = loggerModule.default.prototype.write;
1283
+ loggerModule.default.prototype.write = function(info) {
1284
+ captureLog2(info);
1285
+ return originalWrite.call(this, info);
1286
+ };
1287
+ }
1288
+ } catch {
1289
+ }
1290
+ isPatched2 = true;
1291
+ }
1292
+ __name(patchWinston, "patchWinston");
1293
+ function captureLog2(info) {
1294
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1295
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1296
+ return;
1297
+ }
1298
+ try {
1299
+ const rest = removeKeys(info, [
1300
+ "timestamp",
1301
+ "level",
1302
+ "message",
1303
+ "splat"
1304
+ ]);
1305
+ const formattedMessage = formatMessage(info.message, rest);
1306
+ if (formattedMessage) {
1307
+ logs.push({
1308
+ timestamp: parseTimestamp(info.timestamp),
1309
+ level: info.level || "info",
1310
+ message: formattedMessage.trim()
1311
+ });
1312
+ }
1313
+ } catch (e) {
1314
+ }
1315
+ }
1316
+ __name(captureLog2, "captureLog");
1317
+ function parseTimestamp(timestamp) {
1318
+ if (timestamp) {
1319
+ const ts = new Date(timestamp).getTime();
1320
+ if (!isNaN(ts)) {
1321
+ return ts / 1e3;
1322
+ }
1323
+ }
1324
+ return Date.now() / 1e3;
1325
+ }
1326
+ __name(parseTimestamp, "parseTimestamp");
1327
+
1159
1328
  // src/common/packageVersions.ts
1160
1329
  import { createRequire } from "module";
1161
1330
  function getPackageVersion(name) {
@@ -1223,11 +1392,14 @@ function getAppInfo(h3, appVersion) {
1223
1392
  __name(getAppInfo, "getAppInfo");
1224
1393
 
1225
1394
  // src/h3/plugin.ts
1395
+ var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
1396
+ var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
1226
1397
  var jsonHeaders = new Headers({
1227
1398
  "content-type": "application/json;charset=UTF-8"
1228
1399
  });
1229
1400
  var apitallyPlugin = definePlugin((app, config) => {
1230
1401
  const client = new ApitallyClient(config);
1402
+ const logsContext = new AsyncLocalStorage();
1231
1403
  const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
1232
1404
  const appInfo = getAppInfo(app, config.appVersion);
1233
1405
  if (appInfo.paths.length > 0 || attempt >= 10) {
@@ -1237,12 +1409,16 @@ var apitallyPlugin = definePlugin((app, config) => {
1237
1409
  }
1238
1410
  }, "setStartupData");
1239
1411
  setTimeout(() => setStartupData(), 500);
1412
+ if (client.requestLogger.config.captureLogs) {
1413
+ patchConsole(logsContext);
1414
+ patchWinston(logsContext);
1415
+ }
1240
1416
  const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
1241
1417
  var _a2, _b;
1242
1418
  if (event.req.method.toUpperCase() === "OPTIONS") {
1243
1419
  return response;
1244
1420
  }
1245
- const startTime = event.context._apitallyRequestTimestamp;
1421
+ const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
1246
1422
  const responseTime = startTime ? performance.now() - startTime : 0;
1247
1423
  const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
1248
1424
  const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
@@ -1297,33 +1473,35 @@ var apitallyPlugin = definePlugin((app, config) => {
1297
1473
  } else if (error && client.requestLogger.config.logResponseBody) {
1298
1474
  responseBody = Buffer.from(JSON.stringify(error.toJSON()));
1299
1475
  }
1476
+ const logs = logsContext.getStore();
1300
1477
  client.requestLogger.logRequest({
1301
1478
  timestamp: (Date.now() - responseTime) / 1e3,
1302
1479
  method: event.req.method,
1303
1480
  path,
1304
1481
  url: event.req.url,
1305
1482
  headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
1306
- size: Number(requestSize),
1483
+ size: requestSize,
1307
1484
  consumer: consumer == null ? void 0 : consumer.identifier,
1308
- body: event.context._apitallyRequestBody
1485
+ body: event.context[REQUEST_BODY_SYMBOL]
1309
1486
  }, {
1310
1487
  statusCode,
1311
1488
  responseTime: responseTime / 1e3,
1312
1489
  headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
1313
1490
  size: responseSize,
1314
1491
  body: responseBody
1315
- });
1492
+ }, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
1316
1493
  }
1317
1494
  return newResponse;
1318
1495
  }, "handleResponse");
1319
1496
  app.use(onRequest(async (event) => {
1320
- event.context._apitallyRequestTimestamp = performance.now();
1497
+ logsContext.enterWith([]);
1498
+ event.context[REQUEST_TIMESTAMP_SYMBOL] = performance.now();
1321
1499
  const requestContentType = event.req.headers.get("content-type");
1322
1500
  const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
1323
1501
  if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
1324
1502
  const clonedRequest = event.req.clone();
1325
1503
  const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
1326
- event.context._apitallyRequestBody = requestBody;
1504
+ event.context[REQUEST_BODY_SYMBOL] = requestBody;
1327
1505
  }
1328
1506
  })).use(onResponse((response, event) => {
1329
1507
  if (client.isEnabled()) {