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
@@ -37,11 +37,12 @@ __export(middleware_exports, {
37
37
  useApitally: () => useApitally
38
38
  });
39
39
  module.exports = __toCommonJS(middleware_exports);
40
- var import_perf_hooks = require("perf_hooks");
40
+ var import_node_async_hooks = require("async_hooks");
41
+ var import_node_perf_hooks = require("perf_hooks");
41
42
 
42
43
  // src/common/client.ts
43
- var import_crypto5 = require("crypto");
44
44
  var import_fetch_retry = __toESM(require("fetch-retry"), 1);
45
+ var import_node_crypto5 = require("crypto");
45
46
 
46
47
  // src/common/consumerRegistry.ts
47
48
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -101,7 +102,7 @@ var ConsumerRegistry = _ConsumerRegistry;
101
102
 
102
103
  // src/common/logging.ts
103
104
  var import_winston = require("winston");
104
- var getLogger = /* @__PURE__ */ __name(() => {
105
+ function getLogger() {
105
106
  return (0, import_winston.createLogger)({
106
107
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
107
108
  format: import_winston.format.combine(import_winston.format.colorize(), import_winston.format.timestamp(), import_winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -109,7 +110,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
109
110
  new import_winston.transports.Console()
110
111
  ]
111
112
  });
112
- }, "getLogger");
113
+ }
114
+ __name(getLogger, "getLogger");
113
115
 
114
116
  // src/common/paramValidation.ts
115
117
  function isValidClientId(clientId) {
@@ -211,11 +213,11 @@ var RequestCounter = _RequestCounter;
211
213
 
212
214
  // src/common/requestLogger.ts
213
215
  var import_async_lock = __toESM(require("async-lock"), 1);
214
- var import_buffer2 = require("buffer");
215
- var import_crypto3 = require("crypto");
216
- var import_fs2 = require("fs");
217
- var import_os2 = require("os");
218
- var import_path2 = require("path");
216
+ var import_node_buffer2 = require("buffer");
217
+ var import_node_crypto3 = require("crypto");
218
+ var import_node_fs2 = require("fs");
219
+ var import_node_os2 = require("os");
220
+ var import_node_path2 = require("path");
219
221
 
220
222
  // src/common/sentry.ts
221
223
  var sentry;
@@ -234,7 +236,7 @@ function getSentryEventId() {
234
236
  __name(getSentryEventId, "getSentryEventId");
235
237
 
236
238
  // src/common/serverErrorCounter.ts
237
- var import_crypto = require("crypto");
239
+ var import_node_crypto = require("crypto");
238
240
  var MAX_MSG_LENGTH = 2048;
239
241
  var MAX_STACKTRACE_LENGTH = 65536;
240
242
  var _ServerErrorCounter = class _ServerErrorCounter {
@@ -276,6 +278,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
276
278
  });
277
279
  this.errorCounts.clear();
278
280
  this.errorDetails.clear();
281
+ this.sentryEventIds.clear();
279
282
  return data;
280
283
  }
281
284
  getKey(serverError) {
@@ -287,7 +290,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
287
290
  serverError.msg.trim(),
288
291
  serverError.traceback.trim()
289
292
  ].join("|");
290
- return (0, import_crypto.createHash)("md5").update(hashInput).digest("hex");
293
+ return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
291
294
  }
292
295
  };
293
296
  __name(_ServerErrorCounter, "ServerErrorCounter");
@@ -320,12 +323,13 @@ function truncateExceptionStackTrace(stack) {
320
323
  __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
321
324
 
322
325
  // src/common/tempGzipFile.ts
323
- var import_buffer = require("buffer");
324
- var import_crypto2 = require("crypto");
325
- var import_fs = require("fs");
326
- var import_os = require("os");
327
- var import_path = require("path");
328
- var import_zlib = require("zlib");
326
+ var import_node_buffer = require("buffer");
327
+ var import_node_crypto2 = require("crypto");
328
+ var import_node_fs = require("fs");
329
+ var import_promises = require("fs/promises");
330
+ var import_node_os = require("os");
331
+ var import_node_path = require("path");
332
+ var import_node_zlib = require("zlib");
329
333
  var _TempGzipFile = class _TempGzipFile {
330
334
  uuid;
331
335
  filePath;
@@ -334,9 +338,9 @@ var _TempGzipFile = class _TempGzipFile {
334
338
  readyPromise;
335
339
  closedPromise;
336
340
  constructor() {
337
- this.uuid = (0, import_crypto2.randomUUID)();
338
- this.filePath = (0, import_path.join)((0, import_os.tmpdir)(), `apitally-${this.uuid}.gz`);
339
- this.writeStream = (0, import_fs.createWriteStream)(this.filePath);
341
+ this.uuid = (0, import_node_crypto2.randomUUID)();
342
+ this.filePath = (0, import_node_path.join)((0, import_node_os.tmpdir)(), `apitally-${this.uuid}.gz`);
343
+ this.writeStream = (0, import_node_fs.createWriteStream)(this.filePath);
340
344
  this.readyPromise = new Promise((resolve, reject) => {
341
345
  this.writeStream.once("ready", resolve);
342
346
  this.writeStream.once("error", reject);
@@ -345,7 +349,7 @@ var _TempGzipFile = class _TempGzipFile {
345
349
  this.writeStream.once("close", resolve);
346
350
  this.writeStream.once("error", reject);
347
351
  });
348
- this.gzip = (0, import_zlib.createGzip)();
352
+ this.gzip = (0, import_node_zlib.createGzip)();
349
353
  this.gzip.pipe(this.writeStream);
350
354
  }
351
355
  get size() {
@@ -354,9 +358,9 @@ var _TempGzipFile = class _TempGzipFile {
354
358
  async writeLine(data) {
355
359
  await this.readyPromise;
356
360
  return new Promise((resolve, reject) => {
357
- this.gzip.write(import_buffer.Buffer.concat([
361
+ this.gzip.write(import_node_buffer.Buffer.concat([
358
362
  data,
359
- import_buffer.Buffer.from("\n")
363
+ import_node_buffer.Buffer.from("\n")
360
364
  ]), (error) => {
361
365
  if (error) {
362
366
  reject(error);
@@ -368,7 +372,7 @@ var _TempGzipFile = class _TempGzipFile {
368
372
  }
369
373
  async getContent() {
370
374
  return new Promise((resolve, reject) => {
371
- (0, import_fs.readFile)(this.filePath, (error, data) => {
375
+ (0, import_node_fs.readFile)(this.filePath, (error, data) => {
372
376
  if (error) {
373
377
  reject(error);
374
378
  } else {
@@ -387,7 +391,7 @@ var _TempGzipFile = class _TempGzipFile {
387
391
  }
388
392
  async delete() {
389
393
  await this.close();
390
- (0, import_fs.unlinkSync)(this.filePath);
394
+ await (0, import_promises.unlink)(this.filePath);
391
395
  }
392
396
  };
393
397
  __name(_TempGzipFile, "TempGzipFile");
@@ -398,8 +402,9 @@ var MAX_BODY_SIZE = 5e4;
398
402
  var MAX_FILE_SIZE = 1e6;
399
403
  var MAX_FILES = 50;
400
404
  var MAX_PENDING_WRITES = 100;
401
- var BODY_TOO_LARGE = import_buffer2.Buffer.from("<body too large>");
402
- var BODY_MASKED = import_buffer2.Buffer.from("<masked>");
405
+ var MAX_LOG_MSG_LENGTH = 2048;
406
+ var BODY_TOO_LARGE = import_node_buffer2.Buffer.from("<body too large>");
407
+ var BODY_MASKED = import_node_buffer2.Buffer.from("<masked>");
403
408
  var MASKED = "******";
404
409
  var ALLOWED_CONTENT_TYPES = [
405
410
  "application/json",
@@ -454,6 +459,7 @@ var DEFAULT_CONFIG = {
454
459
  logResponseHeaders: true,
455
460
  logResponseBody: false,
456
461
  logException: true,
462
+ captureLogs: false,
457
463
  maskQueryParams: [],
458
464
  maskHeaders: [],
459
465
  maskBodyFields: [],
@@ -596,7 +602,7 @@ var _RequestLogger = class _RequestLogger {
596
602
  try {
597
603
  const parsedBody = JSON.parse(bodyData.toString());
598
604
  const maskedBody = this.maskBody(parsedBody);
599
- item[key].body = import_buffer2.Buffer.from(JSON.stringify(maskedBody));
605
+ item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
600
606
  } catch {
601
607
  }
602
608
  }
@@ -608,7 +614,7 @@ var _RequestLogger = class _RequestLogger {
608
614
  item.request.url = url.toString();
609
615
  return item;
610
616
  }
611
- logRequest(request, response, error) {
617
+ logRequest(request, response, error, logs) {
612
618
  var _a2, _b, _c;
613
619
  if (!this.enabled || this.suspendUntil !== null) return;
614
620
  const url = new URL(request.url);
@@ -630,7 +636,7 @@ var _RequestLogger = class _RequestLogger {
630
636
  response.size = void 0;
631
637
  }
632
638
  const item = {
633
- uuid: (0, import_crypto3.randomUUID)(),
639
+ uuid: (0, import_node_crypto3.randomUUID)(),
634
640
  request,
635
641
  response,
636
642
  exception: error && this.config.logException ? {
@@ -640,6 +646,14 @@ var _RequestLogger = class _RequestLogger {
640
646
  sentryEventId: getSentryEventId()
641
647
  } : void 0
642
648
  };
649
+ if (logs && logs.length > 0) {
650
+ item.logs = logs.map((log) => ({
651
+ timestamp: log.timestamp,
652
+ logger: log.logger,
653
+ level: log.level,
654
+ message: truncateLogMessage(log.message)
655
+ }));
656
+ }
643
657
  this.pendingWrites.push(item);
644
658
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
645
659
  this.pendingWrites.shift();
@@ -661,7 +675,8 @@ var _RequestLogger = class _RequestLogger {
661
675
  uuid: item.uuid,
662
676
  request: skipEmptyValues(item.request),
663
677
  response: skipEmptyValues(item.response),
664
- exception: item.exception
678
+ exception: item.exception,
679
+ logs: item.logs
665
680
  };
666
681
  [
667
682
  finalItem.request.body,
@@ -673,7 +688,7 @@ var _RequestLogger = class _RequestLogger {
673
688
  };
674
689
  }
675
690
  });
676
- await this.currentFile.writeLine(import_buffer2.Buffer.from(JSON.stringify(finalItem)));
691
+ await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
677
692
  }
678
693
  }
679
694
  });
@@ -756,18 +771,26 @@ __name(matchPatterns, "matchPatterns");
756
771
  function skipEmptyValues(data) {
757
772
  return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
758
773
  if (v == null || Number.isNaN(v)) return false;
759
- if (Array.isArray(v) || import_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
774
+ if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
760
775
  return v.length > 0;
761
776
  }
762
777
  return true;
763
778
  }));
764
779
  }
765
780
  __name(skipEmptyValues, "skipEmptyValues");
781
+ function truncateLogMessage(msg) {
782
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
783
+ const suffix = "... (truncated)";
784
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
785
+ }
786
+ return msg;
787
+ }
788
+ __name(truncateLogMessage, "truncateLogMessage");
766
789
  function checkWritableFs() {
767
790
  try {
768
- const testPath = (0, import_path2.join)((0, import_os2.tmpdir)(), `apitally-${(0, import_crypto3.randomUUID)()}`);
769
- (0, import_fs2.writeFileSync)(testPath, "test");
770
- (0, import_fs2.unlinkSync)(testPath);
791
+ const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
792
+ (0, import_node_fs2.writeFileSync)(testPath, "test");
793
+ (0, import_node_fs2.unlinkSync)(testPath);
771
794
  return true;
772
795
  } catch (error) {
773
796
  return false;
@@ -776,7 +799,7 @@ function checkWritableFs() {
776
799
  __name(checkWritableFs, "checkWritableFs");
777
800
 
778
801
  // src/common/validationErrorCounter.ts
779
- var import_crypto4 = require("crypto");
802
+ var import_node_crypto4 = require("crypto");
780
803
  var _ValidationErrorCounter = class _ValidationErrorCounter {
781
804
  errorCounts;
782
805
  errorDetails;
@@ -820,7 +843,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
820
843
  validationError.msg.trim(),
821
844
  validationError.type
822
845
  ].join("|");
823
- return (0, import_crypto4.createHash)("md5").update(hashInput).digest("hex");
846
+ return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
824
847
  }
825
848
  };
826
849
  __name(_ValidationErrorCounter, "ValidationErrorCounter");
@@ -871,7 +894,7 @@ var _ApitallyClient = class _ApitallyClient {
871
894
  _ApitallyClient.instance = this;
872
895
  this.clientId = clientId;
873
896
  this.env = env;
874
- this.instanceUuid = (0, import_crypto5.randomUUID)();
897
+ this.instanceUuid = (0, import_node_crypto5.randomUUID)();
875
898
  this.syncDataQueue = [];
876
899
  this.requestCounter = new RequestCounter();
877
900
  this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
@@ -977,7 +1000,7 @@ var _ApitallyClient = class _ApitallyClient {
977
1000
  this.logger.debug("Sending startup data to Apitally Hub");
978
1001
  const payload = {
979
1002
  instance_uuid: this.instanceUuid,
980
- message_uuid: (0, import_crypto5.randomUUID)(),
1003
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
981
1004
  ...this.startupData
982
1005
  };
983
1006
  try {
@@ -999,7 +1022,7 @@ var _ApitallyClient = class _ApitallyClient {
999
1022
  const newPayload = {
1000
1023
  timestamp: Date.now() / 1e3,
1001
1024
  instance_uuid: this.instanceUuid,
1002
- message_uuid: (0, import_crypto5.randomUUID)(),
1025
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
1003
1026
  requests: this.requestCounter.getAndResetRequests(),
1004
1027
  validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
1005
1028
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
@@ -1191,11 +1214,148 @@ async function teeResponse(response) {
1191
1214
  }
1192
1215
  __name(teeResponse, "teeResponse");
1193
1216
 
1217
+ // src/loggers/console.ts
1218
+ var import_node_util = require("util");
1219
+ var MAX_BUFFER_SIZE = 1e3;
1220
+ var isPatched = false;
1221
+ var globalLogsContext;
1222
+ function patchConsole(logsContext) {
1223
+ globalLogsContext = logsContext;
1224
+ if (isPatched) {
1225
+ return;
1226
+ }
1227
+ const logMethods = [
1228
+ "log",
1229
+ "warn",
1230
+ "error",
1231
+ "info",
1232
+ "debug"
1233
+ ];
1234
+ logMethods.forEach((method) => {
1235
+ const originalMethod = console[method];
1236
+ console[method] = function(...args) {
1237
+ captureLog(method, args);
1238
+ return originalMethod.apply(console, args);
1239
+ };
1240
+ });
1241
+ isPatched = true;
1242
+ }
1243
+ __name(patchConsole, "patchConsole");
1244
+ function captureLog(level, args) {
1245
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1246
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1247
+ logs.push({
1248
+ timestamp: Date.now() / 1e3,
1249
+ logger: "console",
1250
+ level,
1251
+ message: (0, import_node_util.format)(...args)
1252
+ });
1253
+ }
1254
+ }
1255
+ __name(captureLog, "captureLog");
1256
+
1257
+ // src/loggers/utils.ts
1258
+ var import_node_util2 = require("util");
1259
+ function formatMessage(message, ...args) {
1260
+ return [
1261
+ message,
1262
+ ...args
1263
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1264
+ }
1265
+ __name(formatMessage, "formatMessage");
1266
+ function removeKeys(obj, keys) {
1267
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1268
+ }
1269
+ __name(removeKeys, "removeKeys");
1270
+ function formatArg(arg) {
1271
+ if (typeof arg === "string") {
1272
+ return arg.trim();
1273
+ }
1274
+ if (arg instanceof Error) {
1275
+ return (0, import_node_util2.format)(arg).trim();
1276
+ }
1277
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1278
+ return "";
1279
+ }
1280
+ try {
1281
+ return JSON.stringify(arg);
1282
+ } catch {
1283
+ return (0, import_node_util2.format)(arg).trim();
1284
+ }
1285
+ }
1286
+ __name(formatArg, "formatArg");
1287
+ function isEmptyObject(obj) {
1288
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1289
+ }
1290
+ __name(isEmptyObject, "isEmptyObject");
1291
+
1292
+ // src/loggers/pino.ts
1293
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1294
+
1295
+ // src/loggers/winston.ts
1296
+ var MAX_BUFFER_SIZE2 = 1e3;
1297
+ var isPatched2 = false;
1298
+ var globalLogsContext2;
1299
+ async function patchWinston(logsContext) {
1300
+ var _a2, _b;
1301
+ globalLogsContext2 = logsContext;
1302
+ if (isPatched2) {
1303
+ return;
1304
+ }
1305
+ try {
1306
+ const loggerModule = await import("winston/lib/winston/logger.js");
1307
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1308
+ const originalWrite = loggerModule.default.prototype.write;
1309
+ loggerModule.default.prototype.write = function(info) {
1310
+ captureLog2(info);
1311
+ return originalWrite.call(this, info);
1312
+ };
1313
+ }
1314
+ } catch {
1315
+ }
1316
+ isPatched2 = true;
1317
+ }
1318
+ __name(patchWinston, "patchWinston");
1319
+ function captureLog2(info) {
1320
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1321
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1322
+ return;
1323
+ }
1324
+ try {
1325
+ const rest = removeKeys(info, [
1326
+ "timestamp",
1327
+ "level",
1328
+ "message",
1329
+ "splat"
1330
+ ]);
1331
+ const formattedMessage = formatMessage(info.message, rest);
1332
+ if (formattedMessage) {
1333
+ logs.push({
1334
+ timestamp: parseTimestamp(info.timestamp),
1335
+ level: info.level || "info",
1336
+ message: formattedMessage.trim()
1337
+ });
1338
+ }
1339
+ } catch (e) {
1340
+ }
1341
+ }
1342
+ __name(captureLog2, "captureLog");
1343
+ function parseTimestamp(timestamp) {
1344
+ if (timestamp) {
1345
+ const ts = new Date(timestamp).getTime();
1346
+ if (!isNaN(ts)) {
1347
+ return ts / 1e3;
1348
+ }
1349
+ }
1350
+ return Date.now() / 1e3;
1351
+ }
1352
+ __name(parseTimestamp, "parseTimestamp");
1353
+
1194
1354
  // src/hono/utils.ts
1195
1355
  var import_handler = require("hono/utils/handler");
1196
1356
 
1197
1357
  // src/common/packageVersions.ts
1198
- var import_module = require("module");
1358
+ var import_node_module = require("module");
1199
1359
  var import_meta = {};
1200
1360
  function getPackageVersion(name) {
1201
1361
  const packageJsonPath = `${name}/package.json`;
@@ -1203,7 +1363,7 @@ function getPackageVersion(name) {
1203
1363
  return require(packageJsonPath).version || null;
1204
1364
  } catch (error) {
1205
1365
  try {
1206
- const _require = (0, import_module.createRequire)(import_meta.url);
1366
+ const _require = (0, import_node_module.createRequire)(import_meta.url);
1207
1367
  return _require(packageJsonPath).version || null;
1208
1368
  } catch (error2) {
1209
1369
  return null;
@@ -1305,84 +1465,92 @@ function useApitally(app, config) {
1305
1465
  }
1306
1466
  __name(useApitally, "useApitally");
1307
1467
  function getMiddleware(client) {
1468
+ const logsContext = new import_node_async_hooks.AsyncLocalStorage();
1469
+ if (client.requestLogger.config.captureLogs) {
1470
+ patchConsole(logsContext);
1471
+ patchWinston(logsContext);
1472
+ }
1308
1473
  return async (c, next) => {
1309
1474
  if (!client.isEnabled() || c.req.method.toUpperCase() === "OPTIONS") {
1310
1475
  await next();
1311
1476
  return;
1312
1477
  }
1313
- const timestamp = Date.now() / 1e3;
1314
- const startTime = import_perf_hooks.performance.now();
1315
- await next();
1316
- let response;
1317
- const responseTime = import_perf_hooks.performance.now() - startTime;
1318
- const [responseSize, newResponse] = await measureResponseSize(c.res);
1319
- const requestSize = parseContentLength(c.req.header("content-length"));
1320
- const consumer = getConsumer(c);
1321
- client.consumerRegistry.addOrUpdateConsumer(consumer);
1322
- client.requestCounter.addRequest({
1323
- consumer: consumer == null ? void 0 : consumer.identifier,
1324
- method: c.req.method,
1325
- path: c.req.routePath,
1326
- statusCode: c.res.status,
1327
- responseTime,
1328
- requestSize,
1329
- responseSize
1330
- });
1331
- response = newResponse;
1332
- if (c.res.status === 400) {
1333
- const [responseJson, newResponse2] = await getResponseJson(response);
1334
- const validationErrors = extractZodErrors(responseJson);
1335
- validationErrors.forEach((error) => {
1336
- client.validationErrorCounter.addValidationError({
1337
- consumer: consumer == null ? void 0 : consumer.identifier,
1338
- method: c.req.method,
1339
- path: c.req.routePath,
1340
- ...error
1341
- });
1342
- });
1343
- response = newResponse2;
1344
- }
1345
- if (c.error) {
1346
- client.serverErrorCounter.addServerError({
1478
+ await logsContext.run([], async () => {
1479
+ const timestamp = Date.now() / 1e3;
1480
+ const startTime = import_node_perf_hooks.performance.now();
1481
+ await next();
1482
+ let response;
1483
+ const responseTime = import_node_perf_hooks.performance.now() - startTime;
1484
+ const [responseSize, newResponse] = await measureResponseSize(c.res);
1485
+ const requestSize = parseContentLength(c.req.header("content-length"));
1486
+ const consumer = getConsumer(c);
1487
+ client.consumerRegistry.addOrUpdateConsumer(consumer);
1488
+ client.requestCounter.addRequest({
1347
1489
  consumer: consumer == null ? void 0 : consumer.identifier,
1348
1490
  method: c.req.method,
1349
1491
  path: c.req.routePath,
1350
- type: c.error.name,
1351
- msg: c.error.message,
1352
- traceback: c.error.stack || ""
1492
+ statusCode: c.res.status,
1493
+ responseTime,
1494
+ requestSize,
1495
+ responseSize
1353
1496
  });
1354
- }
1355
- if (client.requestLogger.enabled) {
1356
- let requestBody;
1357
- let responseBody;
1358
- let newResponse2 = response;
1359
- const requestContentType = c.req.header("content-type");
1360
- const responseContentType = c.res.headers.get("content-type");
1361
- if (client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType)) {
1362
- requestBody = Buffer.from(await c.req.arrayBuffer());
1363
- }
1364
- if (client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType)) {
1365
- [responseBody, newResponse2] = await getResponseBody(response);
1497
+ response = newResponse;
1498
+ if (c.res.status === 400) {
1499
+ const [responseJson, newResponse2] = await getResponseJson(response);
1500
+ const validationErrors = extractZodErrors(responseJson);
1501
+ validationErrors.forEach((error) => {
1502
+ client.validationErrorCounter.addValidationError({
1503
+ consumer: consumer == null ? void 0 : consumer.identifier,
1504
+ method: c.req.method,
1505
+ path: c.req.routePath,
1506
+ ...error
1507
+ });
1508
+ });
1366
1509
  response = newResponse2;
1367
1510
  }
1368
- client.requestLogger.logRequest({
1369
- timestamp,
1370
- method: c.req.method,
1371
- path: c.req.routePath,
1372
- url: c.req.url,
1373
- headers: convertHeaders(c.req.header()),
1374
- size: Number(requestSize),
1375
- consumer: consumer == null ? void 0 : consumer.identifier,
1376
- body: requestBody
1377
- }, {
1378
- statusCode: c.res.status,
1379
- responseTime: responseTime / 1e3,
1380
- headers: convertHeaders(c.res.headers),
1381
- size: responseSize,
1382
- body: responseBody
1383
- }, c.error);
1384
- }
1385
- c.res = response;
1511
+ if (c.error) {
1512
+ client.serverErrorCounter.addServerError({
1513
+ consumer: consumer == null ? void 0 : consumer.identifier,
1514
+ method: c.req.method,
1515
+ path: c.req.routePath,
1516
+ type: c.error.name,
1517
+ msg: c.error.message,
1518
+ traceback: c.error.stack || ""
1519
+ });
1520
+ }
1521
+ if (client.requestLogger.enabled) {
1522
+ let requestBody;
1523
+ let responseBody;
1524
+ let newResponse2 = response;
1525
+ const requestContentType = c.req.header("content-type");
1526
+ const responseContentType = c.res.headers.get("content-type");
1527
+ if (client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType)) {
1528
+ requestBody = Buffer.from(await c.req.arrayBuffer());
1529
+ }
1530
+ if (client.requestLogger.config.logResponseBody && client.requestLogger.isSupportedContentType(responseContentType)) {
1531
+ [responseBody, newResponse2] = await getResponseBody(response);
1532
+ response = newResponse2;
1533
+ }
1534
+ const logs = logsContext.getStore();
1535
+ client.requestLogger.logRequest({
1536
+ timestamp,
1537
+ method: c.req.method,
1538
+ path: c.req.routePath,
1539
+ url: c.req.url,
1540
+ headers: convertHeaders(c.req.header()),
1541
+ size: requestSize,
1542
+ consumer: consumer == null ? void 0 : consumer.identifier,
1543
+ body: requestBody
1544
+ }, {
1545
+ statusCode: c.res.status,
1546
+ responseTime: responseTime / 1e3,
1547
+ headers: convertHeaders(c.res.headers),
1548
+ size: responseSize,
1549
+ body: responseBody
1550
+ }, c.error, logs);
1551
+ }
1552
+ c.res = response;
1553
+ });
1386
1554
  };
1387
1555
  }
1388
1556
  __name(getMiddleware, "getMiddleware");