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