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
@@ -38,11 +38,12 @@ __export(plugin_exports, {
38
38
  });
39
39
  module.exports = __toCommonJS(plugin_exports);
40
40
  var import_h3 = require("h3");
41
- var import_perf_hooks = require("perf_hooks");
41
+ var import_node_async_hooks = require("async_hooks");
42
+ var import_node_perf_hooks = require("perf_hooks");
42
43
 
43
44
  // src/common/client.ts
44
- var import_crypto5 = require("crypto");
45
45
  var import_fetch_retry = __toESM(require("fetch-retry"), 1);
46
+ var import_node_crypto5 = require("crypto");
46
47
 
47
48
  // src/common/consumerRegistry.ts
48
49
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -102,7 +103,7 @@ var ConsumerRegistry = _ConsumerRegistry;
102
103
 
103
104
  // src/common/logging.ts
104
105
  var import_winston = require("winston");
105
- var getLogger = /* @__PURE__ */ __name(() => {
106
+ function getLogger() {
106
107
  return (0, import_winston.createLogger)({
107
108
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
108
109
  format: import_winston.format.combine(import_winston.format.colorize(), import_winston.format.timestamp(), import_winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -110,7 +111,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
110
111
  new import_winston.transports.Console()
111
112
  ]
112
113
  });
113
- }, "getLogger");
114
+ }
115
+ __name(getLogger, "getLogger");
114
116
 
115
117
  // src/common/paramValidation.ts
116
118
  function isValidClientId(clientId) {
@@ -212,11 +214,11 @@ var RequestCounter = _RequestCounter;
212
214
 
213
215
  // src/common/requestLogger.ts
214
216
  var import_async_lock = __toESM(require("async-lock"), 1);
215
- var import_buffer2 = require("buffer");
216
- var import_crypto3 = require("crypto");
217
- var import_fs2 = require("fs");
218
- var import_os2 = require("os");
219
- var import_path2 = require("path");
217
+ var import_node_buffer2 = require("buffer");
218
+ var import_node_crypto3 = require("crypto");
219
+ var import_node_fs2 = require("fs");
220
+ var import_node_os2 = require("os");
221
+ var import_node_path2 = require("path");
220
222
 
221
223
  // src/common/sentry.ts
222
224
  var sentry;
@@ -235,7 +237,7 @@ function getSentryEventId() {
235
237
  __name(getSentryEventId, "getSentryEventId");
236
238
 
237
239
  // src/common/serverErrorCounter.ts
238
- var import_crypto = require("crypto");
240
+ var import_node_crypto = require("crypto");
239
241
  var MAX_MSG_LENGTH = 2048;
240
242
  var MAX_STACKTRACE_LENGTH = 65536;
241
243
  var _ServerErrorCounter = class _ServerErrorCounter {
@@ -277,6 +279,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
277
279
  });
278
280
  this.errorCounts.clear();
279
281
  this.errorDetails.clear();
282
+ this.sentryEventIds.clear();
280
283
  return data;
281
284
  }
282
285
  getKey(serverError) {
@@ -288,7 +291,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
288
291
  serverError.msg.trim(),
289
292
  serverError.traceback.trim()
290
293
  ].join("|");
291
- return (0, import_crypto.createHash)("md5").update(hashInput).digest("hex");
294
+ return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
292
295
  }
293
296
  };
294
297
  __name(_ServerErrorCounter, "ServerErrorCounter");
@@ -321,12 +324,13 @@ function truncateExceptionStackTrace(stack) {
321
324
  __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
322
325
 
323
326
  // src/common/tempGzipFile.ts
324
- var import_buffer = require("buffer");
325
- var import_crypto2 = require("crypto");
326
- var import_fs = require("fs");
327
- var import_os = require("os");
328
- var import_path = require("path");
329
- var import_zlib = require("zlib");
327
+ var import_node_buffer = require("buffer");
328
+ var import_node_crypto2 = require("crypto");
329
+ var import_node_fs = require("fs");
330
+ var import_promises = require("fs/promises");
331
+ var import_node_os = require("os");
332
+ var import_node_path = require("path");
333
+ var import_node_zlib = require("zlib");
330
334
  var _TempGzipFile = class _TempGzipFile {
331
335
  uuid;
332
336
  filePath;
@@ -335,9 +339,9 @@ var _TempGzipFile = class _TempGzipFile {
335
339
  readyPromise;
336
340
  closedPromise;
337
341
  constructor() {
338
- this.uuid = (0, import_crypto2.randomUUID)();
339
- this.filePath = (0, import_path.join)((0, import_os.tmpdir)(), `apitally-${this.uuid}.gz`);
340
- this.writeStream = (0, import_fs.createWriteStream)(this.filePath);
342
+ this.uuid = (0, import_node_crypto2.randomUUID)();
343
+ this.filePath = (0, import_node_path.join)((0, import_node_os.tmpdir)(), `apitally-${this.uuid}.gz`);
344
+ this.writeStream = (0, import_node_fs.createWriteStream)(this.filePath);
341
345
  this.readyPromise = new Promise((resolve, reject) => {
342
346
  this.writeStream.once("ready", resolve);
343
347
  this.writeStream.once("error", reject);
@@ -346,7 +350,7 @@ var _TempGzipFile = class _TempGzipFile {
346
350
  this.writeStream.once("close", resolve);
347
351
  this.writeStream.once("error", reject);
348
352
  });
349
- this.gzip = (0, import_zlib.createGzip)();
353
+ this.gzip = (0, import_node_zlib.createGzip)();
350
354
  this.gzip.pipe(this.writeStream);
351
355
  }
352
356
  get size() {
@@ -355,9 +359,9 @@ var _TempGzipFile = class _TempGzipFile {
355
359
  async writeLine(data) {
356
360
  await this.readyPromise;
357
361
  return new Promise((resolve, reject) => {
358
- this.gzip.write(import_buffer.Buffer.concat([
362
+ this.gzip.write(import_node_buffer.Buffer.concat([
359
363
  data,
360
- import_buffer.Buffer.from("\n")
364
+ import_node_buffer.Buffer.from("\n")
361
365
  ]), (error) => {
362
366
  if (error) {
363
367
  reject(error);
@@ -369,7 +373,7 @@ var _TempGzipFile = class _TempGzipFile {
369
373
  }
370
374
  async getContent() {
371
375
  return new Promise((resolve, reject) => {
372
- (0, import_fs.readFile)(this.filePath, (error, data) => {
376
+ (0, import_node_fs.readFile)(this.filePath, (error, data) => {
373
377
  if (error) {
374
378
  reject(error);
375
379
  } else {
@@ -388,7 +392,7 @@ var _TempGzipFile = class _TempGzipFile {
388
392
  }
389
393
  async delete() {
390
394
  await this.close();
391
- (0, import_fs.unlinkSync)(this.filePath);
395
+ await (0, import_promises.unlink)(this.filePath);
392
396
  }
393
397
  };
394
398
  __name(_TempGzipFile, "TempGzipFile");
@@ -399,8 +403,9 @@ var MAX_BODY_SIZE = 5e4;
399
403
  var MAX_FILE_SIZE = 1e6;
400
404
  var MAX_FILES = 50;
401
405
  var MAX_PENDING_WRITES = 100;
402
- var BODY_TOO_LARGE = import_buffer2.Buffer.from("<body too large>");
403
- var BODY_MASKED = import_buffer2.Buffer.from("<masked>");
406
+ var MAX_LOG_MSG_LENGTH = 2048;
407
+ var BODY_TOO_LARGE = import_node_buffer2.Buffer.from("<body too large>");
408
+ var BODY_MASKED = import_node_buffer2.Buffer.from("<masked>");
404
409
  var MASKED = "******";
405
410
  var ALLOWED_CONTENT_TYPES = [
406
411
  "application/json",
@@ -455,6 +460,7 @@ var DEFAULT_CONFIG = {
455
460
  logResponseHeaders: true,
456
461
  logResponseBody: false,
457
462
  logException: true,
463
+ captureLogs: false,
458
464
  maskQueryParams: [],
459
465
  maskHeaders: [],
460
466
  maskBodyFields: [],
@@ -597,7 +603,7 @@ var _RequestLogger = class _RequestLogger {
597
603
  try {
598
604
  const parsedBody = JSON.parse(bodyData.toString());
599
605
  const maskedBody = this.maskBody(parsedBody);
600
- item[key].body = import_buffer2.Buffer.from(JSON.stringify(maskedBody));
606
+ item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
601
607
  } catch {
602
608
  }
603
609
  }
@@ -609,7 +615,7 @@ var _RequestLogger = class _RequestLogger {
609
615
  item.request.url = url.toString();
610
616
  return item;
611
617
  }
612
- logRequest(request, response, error) {
618
+ logRequest(request, response, error, logs) {
613
619
  var _a2, _b, _c;
614
620
  if (!this.enabled || this.suspendUntil !== null) return;
615
621
  const url = new URL(request.url);
@@ -631,7 +637,7 @@ var _RequestLogger = class _RequestLogger {
631
637
  response.size = void 0;
632
638
  }
633
639
  const item = {
634
- uuid: (0, import_crypto3.randomUUID)(),
640
+ uuid: (0, import_node_crypto3.randomUUID)(),
635
641
  request,
636
642
  response,
637
643
  exception: error && this.config.logException ? {
@@ -641,6 +647,14 @@ var _RequestLogger = class _RequestLogger {
641
647
  sentryEventId: getSentryEventId()
642
648
  } : void 0
643
649
  };
650
+ if (logs && logs.length > 0) {
651
+ item.logs = logs.map((log) => ({
652
+ timestamp: log.timestamp,
653
+ logger: log.logger,
654
+ level: log.level,
655
+ message: truncateLogMessage(log.message)
656
+ }));
657
+ }
644
658
  this.pendingWrites.push(item);
645
659
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
646
660
  this.pendingWrites.shift();
@@ -662,7 +676,8 @@ var _RequestLogger = class _RequestLogger {
662
676
  uuid: item.uuid,
663
677
  request: skipEmptyValues(item.request),
664
678
  response: skipEmptyValues(item.response),
665
- exception: item.exception
679
+ exception: item.exception,
680
+ logs: item.logs
666
681
  };
667
682
  [
668
683
  finalItem.request.body,
@@ -674,7 +689,7 @@ var _RequestLogger = class _RequestLogger {
674
689
  };
675
690
  }
676
691
  });
677
- await this.currentFile.writeLine(import_buffer2.Buffer.from(JSON.stringify(finalItem)));
692
+ await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
678
693
  }
679
694
  }
680
695
  });
@@ -757,18 +772,26 @@ __name(matchPatterns, "matchPatterns");
757
772
  function skipEmptyValues(data) {
758
773
  return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
759
774
  if (v == null || Number.isNaN(v)) return false;
760
- if (Array.isArray(v) || import_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
775
+ if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
761
776
  return v.length > 0;
762
777
  }
763
778
  return true;
764
779
  }));
765
780
  }
766
781
  __name(skipEmptyValues, "skipEmptyValues");
782
+ function truncateLogMessage(msg) {
783
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
784
+ const suffix = "... (truncated)";
785
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
786
+ }
787
+ return msg;
788
+ }
789
+ __name(truncateLogMessage, "truncateLogMessage");
767
790
  function checkWritableFs() {
768
791
  try {
769
- const testPath = (0, import_path2.join)((0, import_os2.tmpdir)(), `apitally-${(0, import_crypto3.randomUUID)()}`);
770
- (0, import_fs2.writeFileSync)(testPath, "test");
771
- (0, import_fs2.unlinkSync)(testPath);
792
+ const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
793
+ (0, import_node_fs2.writeFileSync)(testPath, "test");
794
+ (0, import_node_fs2.unlinkSync)(testPath);
772
795
  return true;
773
796
  } catch (error) {
774
797
  return false;
@@ -777,7 +800,7 @@ function checkWritableFs() {
777
800
  __name(checkWritableFs, "checkWritableFs");
778
801
 
779
802
  // src/common/validationErrorCounter.ts
780
- var import_crypto4 = require("crypto");
803
+ var import_node_crypto4 = require("crypto");
781
804
  var _ValidationErrorCounter = class _ValidationErrorCounter {
782
805
  errorCounts;
783
806
  errorDetails;
@@ -821,7 +844,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
821
844
  validationError.msg.trim(),
822
845
  validationError.type
823
846
  ].join("|");
824
- return (0, import_crypto4.createHash)("md5").update(hashInput).digest("hex");
847
+ return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
825
848
  }
826
849
  };
827
850
  __name(_ValidationErrorCounter, "ValidationErrorCounter");
@@ -872,7 +895,7 @@ var _ApitallyClient = class _ApitallyClient {
872
895
  _ApitallyClient.instance = this;
873
896
  this.clientId = clientId;
874
897
  this.env = env;
875
- this.instanceUuid = (0, import_crypto5.randomUUID)();
898
+ this.instanceUuid = (0, import_node_crypto5.randomUUID)();
876
899
  this.syncDataQueue = [];
877
900
  this.requestCounter = new RequestCounter();
878
901
  this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
@@ -978,7 +1001,7 @@ var _ApitallyClient = class _ApitallyClient {
978
1001
  this.logger.debug("Sending startup data to Apitally Hub");
979
1002
  const payload = {
980
1003
  instance_uuid: this.instanceUuid,
981
- message_uuid: (0, import_crypto5.randomUUID)(),
1004
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
982
1005
  ...this.startupData
983
1006
  };
984
1007
  try {
@@ -1000,7 +1023,7 @@ var _ApitallyClient = class _ApitallyClient {
1000
1023
  const newPayload = {
1001
1024
  timestamp: Date.now() / 1e3,
1002
1025
  instance_uuid: this.instanceUuid,
1003
- message_uuid: (0, import_crypto5.randomUUID)(),
1026
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
1004
1027
  requests: this.requestCounter.getAndResetRequests(),
1005
1028
  validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
1006
1029
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
@@ -1183,8 +1206,145 @@ async function teeResponse(response) {
1183
1206
  }
1184
1207
  __name(teeResponse, "teeResponse");
1185
1208
 
1209
+ // src/loggers/console.ts
1210
+ var import_node_util = require("util");
1211
+ var MAX_BUFFER_SIZE = 1e3;
1212
+ var isPatched = false;
1213
+ var globalLogsContext;
1214
+ function patchConsole(logsContext) {
1215
+ globalLogsContext = logsContext;
1216
+ if (isPatched) {
1217
+ return;
1218
+ }
1219
+ const logMethods = [
1220
+ "log",
1221
+ "warn",
1222
+ "error",
1223
+ "info",
1224
+ "debug"
1225
+ ];
1226
+ logMethods.forEach((method) => {
1227
+ const originalMethod = console[method];
1228
+ console[method] = function(...args) {
1229
+ captureLog(method, args);
1230
+ return originalMethod.apply(console, args);
1231
+ };
1232
+ });
1233
+ isPatched = true;
1234
+ }
1235
+ __name(patchConsole, "patchConsole");
1236
+ function captureLog(level, args) {
1237
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1238
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1239
+ logs.push({
1240
+ timestamp: Date.now() / 1e3,
1241
+ logger: "console",
1242
+ level,
1243
+ message: (0, import_node_util.format)(...args)
1244
+ });
1245
+ }
1246
+ }
1247
+ __name(captureLog, "captureLog");
1248
+
1249
+ // src/loggers/utils.ts
1250
+ var import_node_util2 = require("util");
1251
+ function formatMessage(message, ...args) {
1252
+ return [
1253
+ message,
1254
+ ...args
1255
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1256
+ }
1257
+ __name(formatMessage, "formatMessage");
1258
+ function removeKeys(obj, keys) {
1259
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1260
+ }
1261
+ __name(removeKeys, "removeKeys");
1262
+ function formatArg(arg) {
1263
+ if (typeof arg === "string") {
1264
+ return arg.trim();
1265
+ }
1266
+ if (arg instanceof Error) {
1267
+ return (0, import_node_util2.format)(arg).trim();
1268
+ }
1269
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1270
+ return "";
1271
+ }
1272
+ try {
1273
+ return JSON.stringify(arg);
1274
+ } catch {
1275
+ return (0, import_node_util2.format)(arg).trim();
1276
+ }
1277
+ }
1278
+ __name(formatArg, "formatArg");
1279
+ function isEmptyObject(obj) {
1280
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1281
+ }
1282
+ __name(isEmptyObject, "isEmptyObject");
1283
+
1284
+ // src/loggers/pino.ts
1285
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1286
+
1287
+ // src/loggers/winston.ts
1288
+ var MAX_BUFFER_SIZE2 = 1e3;
1289
+ var isPatched2 = false;
1290
+ var globalLogsContext2;
1291
+ async function patchWinston(logsContext) {
1292
+ var _a2, _b;
1293
+ globalLogsContext2 = logsContext;
1294
+ if (isPatched2) {
1295
+ return;
1296
+ }
1297
+ try {
1298
+ const loggerModule = await import("winston/lib/winston/logger.js");
1299
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1300
+ const originalWrite = loggerModule.default.prototype.write;
1301
+ loggerModule.default.prototype.write = function(info) {
1302
+ captureLog2(info);
1303
+ return originalWrite.call(this, info);
1304
+ };
1305
+ }
1306
+ } catch {
1307
+ }
1308
+ isPatched2 = true;
1309
+ }
1310
+ __name(patchWinston, "patchWinston");
1311
+ function captureLog2(info) {
1312
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1313
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1314
+ return;
1315
+ }
1316
+ try {
1317
+ const rest = removeKeys(info, [
1318
+ "timestamp",
1319
+ "level",
1320
+ "message",
1321
+ "splat"
1322
+ ]);
1323
+ const formattedMessage = formatMessage(info.message, rest);
1324
+ if (formattedMessage) {
1325
+ logs.push({
1326
+ timestamp: parseTimestamp(info.timestamp),
1327
+ level: info.level || "info",
1328
+ message: formattedMessage.trim()
1329
+ });
1330
+ }
1331
+ } catch (e) {
1332
+ }
1333
+ }
1334
+ __name(captureLog2, "captureLog");
1335
+ function parseTimestamp(timestamp) {
1336
+ if (timestamp) {
1337
+ const ts = new Date(timestamp).getTime();
1338
+ if (!isNaN(ts)) {
1339
+ return ts / 1e3;
1340
+ }
1341
+ }
1342
+ return Date.now() / 1e3;
1343
+ }
1344
+ __name(parseTimestamp, "parseTimestamp");
1345
+
1186
1346
  // src/common/packageVersions.ts
1187
- var import_module = require("module");
1347
+ var import_node_module = require("module");
1188
1348
  var import_meta = {};
1189
1349
  function getPackageVersion(name) {
1190
1350
  const packageJsonPath = `${name}/package.json`;
@@ -1192,7 +1352,7 @@ function getPackageVersion(name) {
1192
1352
  return require(packageJsonPath).version || null;
1193
1353
  } catch (error) {
1194
1354
  try {
1195
- const _require = (0, import_module.createRequire)(import_meta.url);
1355
+ const _require = (0, import_node_module.createRequire)(import_meta.url);
1196
1356
  return _require(packageJsonPath).version || null;
1197
1357
  } catch (error2) {
1198
1358
  return null;
@@ -1251,11 +1411,14 @@ function getAppInfo(h3, appVersion) {
1251
1411
  __name(getAppInfo, "getAppInfo");
1252
1412
 
1253
1413
  // src/h3/plugin.ts
1414
+ var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
1415
+ var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
1254
1416
  var jsonHeaders = new Headers({
1255
1417
  "content-type": "application/json;charset=UTF-8"
1256
1418
  });
1257
1419
  var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
1258
1420
  const client = new ApitallyClient(config);
1421
+ const logsContext = new import_node_async_hooks.AsyncLocalStorage();
1259
1422
  const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
1260
1423
  const appInfo = getAppInfo(app, config.appVersion);
1261
1424
  if (appInfo.paths.length > 0 || attempt >= 10) {
@@ -1265,13 +1428,17 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
1265
1428
  }
1266
1429
  }, "setStartupData");
1267
1430
  setTimeout(() => setStartupData(), 500);
1431
+ if (client.requestLogger.config.captureLogs) {
1432
+ patchConsole(logsContext);
1433
+ patchWinston(logsContext);
1434
+ }
1268
1435
  const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
1269
1436
  var _a2, _b;
1270
1437
  if (event.req.method.toUpperCase() === "OPTIONS") {
1271
1438
  return response;
1272
1439
  }
1273
- const startTime = event.context._apitallyRequestTimestamp;
1274
- const responseTime = startTime ? import_perf_hooks.performance.now() - startTime : 0;
1440
+ const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
1441
+ const responseTime = startTime ? import_node_perf_hooks.performance.now() - startTime : 0;
1275
1442
  const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
1276
1443
  const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
1277
1444
  const requestSize = parseContentLength(event.req.headers.get("content-length"));
@@ -1325,33 +1492,35 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
1325
1492
  } else if (error && client.requestLogger.config.logResponseBody) {
1326
1493
  responseBody = Buffer.from(JSON.stringify(error.toJSON()));
1327
1494
  }
1495
+ const logs = logsContext.getStore();
1328
1496
  client.requestLogger.logRequest({
1329
1497
  timestamp: (Date.now() - responseTime) / 1e3,
1330
1498
  method: event.req.method,
1331
1499
  path,
1332
1500
  url: event.req.url,
1333
1501
  headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
1334
- size: Number(requestSize),
1502
+ size: requestSize,
1335
1503
  consumer: consumer == null ? void 0 : consumer.identifier,
1336
- body: event.context._apitallyRequestBody
1504
+ body: event.context[REQUEST_BODY_SYMBOL]
1337
1505
  }, {
1338
1506
  statusCode,
1339
1507
  responseTime: responseTime / 1e3,
1340
1508
  headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
1341
1509
  size: responseSize,
1342
1510
  body: responseBody
1343
- });
1511
+ }, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
1344
1512
  }
1345
1513
  return newResponse;
1346
1514
  }, "handleResponse");
1347
1515
  app.use((0, import_h3.onRequest)(async (event) => {
1348
- event.context._apitallyRequestTimestamp = import_perf_hooks.performance.now();
1516
+ logsContext.enterWith([]);
1517
+ event.context[REQUEST_TIMESTAMP_SYMBOL] = import_node_perf_hooks.performance.now();
1349
1518
  const requestContentType = event.req.headers.get("content-type");
1350
1519
  const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
1351
1520
  if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
1352
1521
  const clonedRequest = event.req.clone();
1353
1522
  const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
1354
- event.context._apitallyRequestBody = requestBody;
1523
+ event.context[REQUEST_BODY_SYMBOL] = requestBody;
1355
1524
  }
1356
1525
  })).use((0, import_h3.onResponse)((response, event) => {
1357
1526
  if (client.isEnabled()) {