apitally 0.18.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/README.md +71 -44
  2. package/dist/adonisjs/configure.cjs +2 -2
  3. package/dist/adonisjs/configure.cjs.map +1 -1
  4. package/dist/adonisjs/configure.js.map +1 -1
  5. package/dist/adonisjs/index.cjs +2 -2
  6. package/dist/adonisjs/index.cjs.map +1 -1
  7. package/dist/adonisjs/index.d.cts +2 -2
  8. package/dist/adonisjs/index.d.ts +2 -2
  9. package/dist/adonisjs/index.js.map +1 -1
  10. package/dist/adonisjs/middleware.cjs +107 -84
  11. package/dist/adonisjs/middleware.cjs.map +1 -1
  12. package/dist/adonisjs/middleware.d.cts +2 -2
  13. package/dist/adonisjs/middleware.d.ts +2 -2
  14. package/dist/adonisjs/middleware.js +106 -83
  15. package/dist/adonisjs/middleware.js.map +1 -1
  16. package/dist/adonisjs/provider.cjs +4765 -62
  17. package/dist/adonisjs/provider.cjs.map +1 -1
  18. package/dist/adonisjs/provider.d.cts +7 -4
  19. package/dist/adonisjs/provider.d.ts +7 -4
  20. package/dist/adonisjs/provider.js +4743 -17
  21. package/dist/adonisjs/provider.js.map +1 -1
  22. package/dist/common/client.cjs +64 -42
  23. package/dist/common/client.cjs.map +1 -1
  24. package/dist/common/client.d.cts +2 -2
  25. package/dist/common/client.d.ts +2 -2
  26. package/dist/common/client.js +33 -11
  27. package/dist/common/client.js.map +1 -1
  28. package/dist/common/consumerRegistry.d.cts +2 -2
  29. package/dist/common/consumerRegistry.d.ts +2 -2
  30. package/dist/common/headers.cjs.map +1 -1
  31. package/dist/common/headers.d.cts +1 -1
  32. package/dist/common/headers.d.ts +1 -1
  33. package/dist/common/headers.js.map +1 -1
  34. package/dist/common/logging.cjs +3 -2
  35. package/dist/common/logging.cjs.map +1 -1
  36. package/dist/common/logging.d.cts +1 -1
  37. package/dist/common/logging.d.ts +1 -1
  38. package/dist/common/logging.js +3 -2
  39. package/dist/common/logging.js.map +1 -1
  40. package/dist/common/packageVersions.cjs +2 -2
  41. package/dist/common/packageVersions.cjs.map +1 -1
  42. package/dist/common/packageVersions.js.map +1 -1
  43. package/dist/common/requestCounter.d.cts +2 -2
  44. package/dist/common/requestCounter.d.ts +2 -2
  45. package/dist/common/requestLogger.cjs +57 -33
  46. package/dist/common/requestLogger.cjs.map +1 -1
  47. package/dist/common/requestLogger.d.cts +12 -5
  48. package/dist/common/requestLogger.d.ts +12 -5
  49. package/dist/common/requestLogger.js +30 -6
  50. package/dist/common/requestLogger.js.map +1 -1
  51. package/dist/common/response.cjs +12 -6
  52. package/dist/common/response.cjs.map +1 -1
  53. package/dist/common/response.d.cts +3 -3
  54. package/dist/common/response.d.ts +3 -3
  55. package/dist/common/response.js +12 -6
  56. package/dist/common/response.js.map +1 -1
  57. package/dist/common/serverErrorCounter.cjs +3 -2
  58. package/dist/common/serverErrorCounter.cjs.map +1 -1
  59. package/dist/common/serverErrorCounter.d.cts +2 -2
  60. package/dist/common/serverErrorCounter.d.ts +2 -2
  61. package/dist/common/serverErrorCounter.js +1 -0
  62. package/dist/common/serverErrorCounter.js.map +1 -1
  63. package/dist/common/tempGzipFile.cjs +15 -14
  64. package/dist/common/tempGzipFile.cjs.map +1 -1
  65. package/dist/common/tempGzipFile.d.cts +1 -1
  66. package/dist/common/tempGzipFile.d.ts +1 -1
  67. package/dist/common/tempGzipFile.js +3 -2
  68. package/dist/common/tempGzipFile.js.map +1 -1
  69. package/dist/common/types.d.cts +2 -2
  70. package/dist/common/types.d.ts +2 -2
  71. package/dist/common/validationErrorCounter.cjs +4 -4
  72. package/dist/common/validationErrorCounter.cjs.map +1 -1
  73. package/dist/common/validationErrorCounter.d.cts +2 -2
  74. package/dist/common/validationErrorCounter.d.ts +2 -2
  75. package/dist/common/validationErrorCounter.js +2 -2
  76. package/dist/common/validationErrorCounter.js.map +1 -1
  77. package/dist/elysia/index.cjs +1582 -0
  78. package/dist/elysia/index.cjs.map +1 -0
  79. package/dist/elysia/index.d.cts +9 -0
  80. package/dist/elysia/index.d.ts +9 -0
  81. package/dist/elysia/index.js +1552 -0
  82. package/dist/elysia/index.js.map +1 -0
  83. package/dist/elysia/plugin.cjs +1576 -0
  84. package/dist/elysia/plugin.cjs.map +1 -0
  85. package/dist/elysia/plugin.d.cts +53 -0
  86. package/dist/elysia/plugin.d.ts +53 -0
  87. package/dist/elysia/plugin.js +1552 -0
  88. package/dist/elysia/plugin.js.map +1 -0
  89. package/dist/elysia/utils.cjs +98 -0
  90. package/dist/elysia/utils.cjs.map +1 -0
  91. package/dist/elysia/utils.d.cts +12 -0
  92. package/dist/elysia/utils.d.ts +12 -0
  93. package/dist/elysia/utils.js +78 -0
  94. package/dist/elysia/utils.js.map +1 -0
  95. package/dist/express/index.cjs +4997 -169
  96. package/dist/express/index.cjs.map +1 -1
  97. package/dist/express/index.d.cts +2 -2
  98. package/dist/express/index.d.ts +2 -2
  99. package/dist/express/index.js +4969 -120
  100. package/dist/express/index.js.map +1 -1
  101. package/dist/express/middleware.cjs +4997 -169
  102. package/dist/express/middleware.cjs.map +1 -1
  103. package/dist/express/middleware.d.cts +2 -2
  104. package/dist/express/middleware.d.ts +2 -2
  105. package/dist/express/middleware.js +4969 -120
  106. package/dist/express/middleware.js.map +1 -1
  107. package/dist/fastify/index.cjs +4926 -72
  108. package/dist/fastify/index.cjs.map +1 -1
  109. package/dist/fastify/index.d.cts +3 -2
  110. package/dist/fastify/index.d.ts +3 -2
  111. package/dist/fastify/index.js +4899 -24
  112. package/dist/fastify/index.js.map +1 -1
  113. package/dist/fastify/plugin.cjs +4926 -72
  114. package/dist/fastify/plugin.cjs.map +1 -1
  115. package/dist/fastify/plugin.d.cts +8 -3
  116. package/dist/fastify/plugin.d.ts +8 -3
  117. package/dist/fastify/plugin.js +4899 -24
  118. package/dist/fastify/plugin.js.map +1 -1
  119. package/dist/h3/index.cjs +235 -57
  120. package/dist/h3/index.cjs.map +1 -1
  121. package/dist/h3/index.d.cts +2 -2
  122. package/dist/h3/index.d.ts +2 -2
  123. package/dist/h3/index.js +200 -22
  124. package/dist/h3/index.js.map +1 -1
  125. package/dist/h3/plugin.cjs +235 -57
  126. package/dist/h3/plugin.cjs.map +1 -1
  127. package/dist/h3/plugin.d.cts +6 -4
  128. package/dist/h3/plugin.d.ts +6 -4
  129. package/dist/h3/plugin.js +200 -22
  130. package/dist/h3/plugin.js.map +1 -1
  131. package/dist/h3/utils.cjs +2 -2
  132. package/dist/h3/utils.cjs.map +1 -1
  133. package/dist/h3/utils.js.map +1 -1
  134. package/dist/hono/index.cjs +295 -118
  135. package/dist/hono/index.cjs.map +1 -1
  136. package/dist/hono/index.d.cts +2 -2
  137. package/dist/hono/index.d.ts +2 -2
  138. package/dist/hono/index.js +261 -84
  139. package/dist/hono/index.js.map +1 -1
  140. package/dist/hono/middleware.cjs +295 -118
  141. package/dist/hono/middleware.cjs.map +1 -1
  142. package/dist/hono/middleware.d.cts +2 -2
  143. package/dist/hono/middleware.d.ts +2 -2
  144. package/dist/hono/middleware.js +261 -84
  145. package/dist/hono/middleware.js.map +1 -1
  146. package/dist/hono/utils.cjs +2 -2
  147. package/dist/hono/utils.cjs.map +1 -1
  148. package/dist/hono/utils.d.cts +2 -2
  149. package/dist/hono/utils.d.ts +2 -2
  150. package/dist/hono/utils.js.map +1 -1
  151. package/dist/koa/index.cjs +280 -107
  152. package/dist/koa/index.cjs.map +1 -1
  153. package/dist/koa/index.d.cts +2 -2
  154. package/dist/koa/index.d.ts +2 -2
  155. package/dist/koa/index.js +244 -71
  156. package/dist/koa/index.js.map +1 -1
  157. package/dist/koa/middleware.cjs +278 -107
  158. package/dist/koa/middleware.cjs.map +1 -1
  159. package/dist/koa/middleware.d.cts +2 -2
  160. package/dist/koa/middleware.d.ts +2 -2
  161. package/dist/koa/middleware.js +244 -71
  162. package/dist/koa/middleware.js.map +1 -1
  163. package/dist/loggers/console.cjs +69 -0
  164. package/dist/loggers/console.cjs.map +1 -0
  165. package/dist/loggers/console.d.cts +9 -0
  166. package/dist/loggers/console.d.ts +9 -0
  167. package/dist/loggers/console.js +46 -0
  168. package/dist/loggers/console.js.map +1 -0
  169. package/dist/loggers/index.cjs +4837 -0
  170. package/dist/loggers/index.cjs.map +1 -0
  171. package/dist/loggers/index.d.cts +9 -0
  172. package/dist/loggers/index.d.ts +9 -0
  173. package/dist/loggers/index.js +4826 -0
  174. package/dist/loggers/index.js.map +1 -0
  175. package/dist/loggers/nestjs.cjs +135 -0
  176. package/dist/loggers/nestjs.cjs.map +1 -0
  177. package/dist/loggers/nestjs.d.cts +9 -0
  178. package/dist/loggers/nestjs.d.ts +9 -0
  179. package/dist/loggers/nestjs.js +100 -0
  180. package/dist/loggers/nestjs.js.map +1 -0
  181. package/dist/loggers/pino.cjs +4669 -0
  182. package/dist/loggers/pino.cjs.map +1 -0
  183. package/dist/loggers/pino.d.cts +9 -0
  184. package/dist/loggers/pino.d.ts +9 -0
  185. package/dist/loggers/pino.js +4661 -0
  186. package/dist/loggers/pino.js.map +1 -0
  187. package/dist/loggers/utils.cjs +66 -0
  188. package/dist/loggers/utils.cjs.map +1 -0
  189. package/dist/loggers/utils.d.cts +6 -0
  190. package/dist/loggers/utils.d.ts +6 -0
  191. package/dist/loggers/utils.js +42 -0
  192. package/dist/loggers/utils.js.map +1 -0
  193. package/dist/loggers/winston.cjs +135 -0
  194. package/dist/loggers/winston.cjs.map +1 -0
  195. package/dist/loggers/winston.d.cts +9 -0
  196. package/dist/loggers/winston.d.ts +9 -0
  197. package/dist/loggers/winston.js +100 -0
  198. package/dist/loggers/winston.js.map +1 -0
  199. package/dist/nestjs/index.cjs +5448 -542
  200. package/dist/nestjs/index.cjs.map +1 -1
  201. package/dist/nestjs/index.d.cts +2 -2
  202. package/dist/nestjs/index.d.ts +2 -2
  203. package/dist/nestjs/index.js +5364 -460
  204. package/dist/nestjs/index.js.map +1 -1
  205. package/package.json +26 -4
@@ -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
  });
@@ -726,6 +741,9 @@ var _RequestLogger = class _RequestLogger {
726
741
  __name(_RequestLogger, "RequestLogger");
727
742
  var RequestLogger = _RequestLogger;
728
743
  function convertHeaders(headers) {
744
+ if (!headers) {
745
+ return [];
746
+ }
729
747
  if (headers instanceof Headers) {
730
748
  return Array.from(headers.entries());
731
749
  }
@@ -757,18 +775,26 @@ __name(matchPatterns, "matchPatterns");
757
775
  function skipEmptyValues(data) {
758
776
  return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
759
777
  if (v == null || Number.isNaN(v)) return false;
760
- if (Array.isArray(v) || import_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
778
+ if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
761
779
  return v.length > 0;
762
780
  }
763
781
  return true;
764
782
  }));
765
783
  }
766
784
  __name(skipEmptyValues, "skipEmptyValues");
785
+ function truncateLogMessage(msg) {
786
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
787
+ const suffix = "... (truncated)";
788
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
789
+ }
790
+ return msg;
791
+ }
792
+ __name(truncateLogMessage, "truncateLogMessage");
767
793
  function checkWritableFs() {
768
794
  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);
795
+ const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
796
+ (0, import_node_fs2.writeFileSync)(testPath, "test");
797
+ (0, import_node_fs2.unlinkSync)(testPath);
772
798
  return true;
773
799
  } catch (error) {
774
800
  return false;
@@ -777,7 +803,7 @@ function checkWritableFs() {
777
803
  __name(checkWritableFs, "checkWritableFs");
778
804
 
779
805
  // src/common/validationErrorCounter.ts
780
- var import_crypto4 = require("crypto");
806
+ var import_node_crypto4 = require("crypto");
781
807
  var _ValidationErrorCounter = class _ValidationErrorCounter {
782
808
  errorCounts;
783
809
  errorDetails;
@@ -801,7 +827,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
801
827
  consumer: validationError.consumer || null,
802
828
  method: validationError.method,
803
829
  path: validationError.path,
804
- loc: validationError.loc.split("."),
830
+ loc: validationError.loc.split(".").filter(Boolean),
805
831
  msg: validationError.msg,
806
832
  type: validationError.type,
807
833
  error_count: count
@@ -817,11 +843,11 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
817
843
  validationError.consumer || "",
818
844
  validationError.method.toUpperCase(),
819
845
  validationError.path,
820
- validationError.loc,
846
+ validationError.loc.split(".").filter(Boolean),
821
847
  validationError.msg.trim(),
822
848
  validationError.type
823
849
  ].join("|");
824
- return (0, import_crypto4.createHash)("md5").update(hashInput).digest("hex");
850
+ return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
825
851
  }
826
852
  };
827
853
  __name(_ValidationErrorCounter, "ValidationErrorCounter");
@@ -872,7 +898,7 @@ var _ApitallyClient = class _ApitallyClient {
872
898
  _ApitallyClient.instance = this;
873
899
  this.clientId = clientId;
874
900
  this.env = env;
875
- this.instanceUuid = (0, import_crypto5.randomUUID)();
901
+ this.instanceUuid = (0, import_node_crypto5.randomUUID)();
876
902
  this.syncDataQueue = [];
877
903
  this.requestCounter = new RequestCounter();
878
904
  this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
@@ -978,7 +1004,7 @@ var _ApitallyClient = class _ApitallyClient {
978
1004
  this.logger.debug("Sending startup data to Apitally Hub");
979
1005
  const payload = {
980
1006
  instance_uuid: this.instanceUuid,
981
- message_uuid: (0, import_crypto5.randomUUID)(),
1007
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
982
1008
  ...this.startupData
983
1009
  };
984
1010
  try {
@@ -1000,7 +1026,7 @@ var _ApitallyClient = class _ApitallyClient {
1000
1026
  const newPayload = {
1001
1027
  timestamp: Date.now() / 1e3,
1002
1028
  instance_uuid: this.instanceUuid,
1003
- message_uuid: (0, import_crypto5.randomUUID)(),
1029
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
1004
1030
  requests: this.requestCounter.getAndResetRequests(),
1005
1031
  validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
1006
1032
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
@@ -1129,8 +1155,11 @@ function mergeHeaders(base, merge) {
1129
1155
  __name(mergeHeaders, "mergeHeaders");
1130
1156
 
1131
1157
  // src/common/response.ts
1132
- async function measureResponseSize(response) {
1133
- const [newResponse1, newResponse2] = await teeResponse(response);
1158
+ async function measureResponseSize(response, tee = true) {
1159
+ const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
1160
+ response,
1161
+ response
1162
+ ];
1134
1163
  let size = 0;
1135
1164
  if (newResponse2.body) {
1136
1165
  let done = false;
@@ -1149,8 +1178,11 @@ async function measureResponseSize(response) {
1149
1178
  ];
1150
1179
  }
1151
1180
  __name(measureResponseSize, "measureResponseSize");
1152
- async function getResponseBody(response) {
1153
- const [newResponse1, newResponse2] = await teeResponse(response);
1181
+ async function getResponseBody(response, tee = true) {
1182
+ const [newResponse1, newResponse2] = tee ? teeResponse(response) : [
1183
+ response,
1184
+ response
1185
+ ];
1154
1186
  const responseBuffer = Buffer.from(await newResponse2.arrayBuffer());
1155
1187
  return [
1156
1188
  responseBuffer,
@@ -1158,7 +1190,7 @@ async function getResponseBody(response) {
1158
1190
  ];
1159
1191
  }
1160
1192
  __name(getResponseBody, "getResponseBody");
1161
- async function teeResponse(response) {
1193
+ function teeResponse(response) {
1162
1194
  if (!response.body) {
1163
1195
  return [
1164
1196
  response,
@@ -1183,8 +1215,145 @@ async function teeResponse(response) {
1183
1215
  }
1184
1216
  __name(teeResponse, "teeResponse");
1185
1217
 
1218
+ // src/loggers/console.ts
1219
+ var import_node_util = require("util");
1220
+ var MAX_BUFFER_SIZE = 1e3;
1221
+ var isPatched = false;
1222
+ var globalLogsContext;
1223
+ function patchConsole(logsContext) {
1224
+ globalLogsContext = logsContext;
1225
+ if (isPatched) {
1226
+ return;
1227
+ }
1228
+ const logMethods = [
1229
+ "log",
1230
+ "warn",
1231
+ "error",
1232
+ "info",
1233
+ "debug"
1234
+ ];
1235
+ logMethods.forEach((method) => {
1236
+ const originalMethod = console[method];
1237
+ console[method] = function(...args) {
1238
+ captureLog(method, args);
1239
+ return originalMethod.apply(console, args);
1240
+ };
1241
+ });
1242
+ isPatched = true;
1243
+ }
1244
+ __name(patchConsole, "patchConsole");
1245
+ function captureLog(level, args) {
1246
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1247
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1248
+ logs.push({
1249
+ timestamp: Date.now() / 1e3,
1250
+ logger: "console",
1251
+ level,
1252
+ message: (0, import_node_util.format)(...args)
1253
+ });
1254
+ }
1255
+ }
1256
+ __name(captureLog, "captureLog");
1257
+
1258
+ // src/loggers/utils.ts
1259
+ var import_node_util2 = require("util");
1260
+ function formatMessage(message, ...args) {
1261
+ return [
1262
+ message,
1263
+ ...args
1264
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1265
+ }
1266
+ __name(formatMessage, "formatMessage");
1267
+ function removeKeys(obj, keys) {
1268
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1269
+ }
1270
+ __name(removeKeys, "removeKeys");
1271
+ function formatArg(arg) {
1272
+ if (typeof arg === "string") {
1273
+ return arg.trim();
1274
+ }
1275
+ if (arg instanceof Error) {
1276
+ return (0, import_node_util2.format)(arg).trim();
1277
+ }
1278
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1279
+ return "";
1280
+ }
1281
+ try {
1282
+ return JSON.stringify(arg);
1283
+ } catch {
1284
+ return (0, import_node_util2.format)(arg).trim();
1285
+ }
1286
+ }
1287
+ __name(formatArg, "formatArg");
1288
+ function isEmptyObject(obj) {
1289
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1290
+ }
1291
+ __name(isEmptyObject, "isEmptyObject");
1292
+
1293
+ // src/loggers/pino.ts
1294
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1295
+
1296
+ // src/loggers/winston.ts
1297
+ var MAX_BUFFER_SIZE2 = 1e3;
1298
+ var isPatched2 = false;
1299
+ var globalLogsContext2;
1300
+ async function patchWinston(logsContext) {
1301
+ var _a2, _b;
1302
+ globalLogsContext2 = logsContext;
1303
+ if (isPatched2) {
1304
+ return;
1305
+ }
1306
+ try {
1307
+ const loggerModule = await import("winston/lib/winston/logger.js");
1308
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1309
+ const originalWrite = loggerModule.default.prototype.write;
1310
+ loggerModule.default.prototype.write = function(info) {
1311
+ captureLog2(info);
1312
+ return originalWrite.call(this, info);
1313
+ };
1314
+ }
1315
+ } catch {
1316
+ }
1317
+ isPatched2 = true;
1318
+ }
1319
+ __name(patchWinston, "patchWinston");
1320
+ function captureLog2(info) {
1321
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1322
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1323
+ return;
1324
+ }
1325
+ try {
1326
+ const rest = removeKeys(info, [
1327
+ "timestamp",
1328
+ "level",
1329
+ "message",
1330
+ "splat"
1331
+ ]);
1332
+ const formattedMessage = formatMessage(info.message, rest);
1333
+ if (formattedMessage) {
1334
+ logs.push({
1335
+ timestamp: parseTimestamp(info.timestamp),
1336
+ level: info.level || "info",
1337
+ message: formattedMessage.trim()
1338
+ });
1339
+ }
1340
+ } catch (e) {
1341
+ }
1342
+ }
1343
+ __name(captureLog2, "captureLog");
1344
+ function parseTimestamp(timestamp) {
1345
+ if (timestamp) {
1346
+ const ts = new Date(timestamp).getTime();
1347
+ if (!isNaN(ts)) {
1348
+ return ts / 1e3;
1349
+ }
1350
+ }
1351
+ return Date.now() / 1e3;
1352
+ }
1353
+ __name(parseTimestamp, "parseTimestamp");
1354
+
1186
1355
  // src/common/packageVersions.ts
1187
- var import_module = require("module");
1356
+ var import_node_module = require("module");
1188
1357
  var import_meta = {};
1189
1358
  function getPackageVersion(name) {
1190
1359
  const packageJsonPath = `${name}/package.json`;
@@ -1192,7 +1361,7 @@ function getPackageVersion(name) {
1192
1361
  return require(packageJsonPath).version || null;
1193
1362
  } catch (error) {
1194
1363
  try {
1195
- const _require = (0, import_module.createRequire)(import_meta.url);
1364
+ const _require = (0, import_node_module.createRequire)(import_meta.url);
1196
1365
  return _require(packageJsonPath).version || null;
1197
1366
  } catch (error2) {
1198
1367
  return null;
@@ -1251,11 +1420,14 @@ function getAppInfo(h3, appVersion) {
1251
1420
  __name(getAppInfo, "getAppInfo");
1252
1421
 
1253
1422
  // src/h3/plugin.ts
1423
+ var REQUEST_TIMESTAMP_SYMBOL = Symbol("apitally.requestTimestamp");
1424
+ var REQUEST_BODY_SYMBOL = Symbol("apitally.requestBody");
1254
1425
  var jsonHeaders = new Headers({
1255
1426
  "content-type": "application/json;charset=UTF-8"
1256
1427
  });
1257
1428
  var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
1258
1429
  const client = new ApitallyClient(config);
1430
+ const logsContext = new import_node_async_hooks.AsyncLocalStorage();
1259
1431
  const setStartupData = /* @__PURE__ */ __name((attempt = 1) => {
1260
1432
  const appInfo = getAppInfo(app, config.appVersion);
1261
1433
  if (appInfo.paths.length > 0 || attempt >= 10) {
@@ -1265,13 +1437,17 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
1265
1437
  }
1266
1438
  }, "setStartupData");
1267
1439
  setTimeout(() => setStartupData(), 500);
1440
+ if (client.requestLogger.config.captureLogs) {
1441
+ patchConsole(logsContext);
1442
+ patchWinston(logsContext);
1443
+ }
1268
1444
  const handleResponse = /* @__PURE__ */ __name(async (event, response, error) => {
1269
1445
  var _a2, _b;
1270
1446
  if (event.req.method.toUpperCase() === "OPTIONS") {
1271
1447
  return response;
1272
1448
  }
1273
- const startTime = event.context._apitallyRequestTimestamp;
1274
- const responseTime = startTime ? import_perf_hooks.performance.now() - startTime : 0;
1449
+ const startTime = event.context[REQUEST_TIMESTAMP_SYMBOL];
1450
+ const responseTime = startTime ? import_node_perf_hooks.performance.now() - startTime : 0;
1275
1451
  const path = (_a2 = event.context.matchedRoute) == null ? void 0 : _a2.route;
1276
1452
  const statusCode = (response == null ? void 0 : response.status) || (error == null ? void 0 : error.status) || 500;
1277
1453
  const requestSize = parseContentLength(event.req.headers.get("content-length"));
@@ -1325,33 +1501,35 @@ var apitallyPlugin = (0, import_h3.definePlugin)((app, config) => {
1325
1501
  } else if (error && client.requestLogger.config.logResponseBody) {
1326
1502
  responseBody = Buffer.from(JSON.stringify(error.toJSON()));
1327
1503
  }
1504
+ const logs = logsContext.getStore();
1328
1505
  client.requestLogger.logRequest({
1329
1506
  timestamp: (Date.now() - responseTime) / 1e3,
1330
1507
  method: event.req.method,
1331
1508
  path,
1332
1509
  url: event.req.url,
1333
1510
  headers: convertHeaders(Object.fromEntries(event.req.headers.entries())),
1334
- size: Number(requestSize),
1511
+ size: requestSize,
1335
1512
  consumer: consumer == null ? void 0 : consumer.identifier,
1336
- body: event.context._apitallyRequestBody
1513
+ body: event.context[REQUEST_BODY_SYMBOL]
1337
1514
  }, {
1338
1515
  statusCode,
1339
1516
  responseTime: responseTime / 1e3,
1340
1517
  headers: convertHeaders(Object.fromEntries(responseHeaders.entries())),
1341
1518
  size: responseSize,
1342
1519
  body: responseBody
1343
- });
1520
+ }, (error == null ? void 0 : error.cause) instanceof Error ? error.cause : void 0, logs);
1344
1521
  }
1345
1522
  return newResponse;
1346
1523
  }, "handleResponse");
1347
1524
  app.use((0, import_h3.onRequest)(async (event) => {
1348
- event.context._apitallyRequestTimestamp = import_perf_hooks.performance.now();
1525
+ logsContext.enterWith([]);
1526
+ event.context[REQUEST_TIMESTAMP_SYMBOL] = import_node_perf_hooks.performance.now();
1349
1527
  const requestContentType = event.req.headers.get("content-type");
1350
1528
  const requestSize = parseContentLength(event.req.headers.get("content-length")) ?? 0;
1351
1529
  if (client.requestLogger.enabled && client.requestLogger.config.logRequestBody && client.requestLogger.isSupportedContentType(requestContentType) && requestSize <= client.requestLogger.maxBodySize) {
1352
1530
  const clonedRequest = event.req.clone();
1353
1531
  const requestBody = Buffer.from(await clonedRequest.arrayBuffer());
1354
- event.context._apitallyRequestBody = requestBody;
1532
+ event.context[REQUEST_BODY_SYMBOL] = requestBody;
1355
1533
  }
1356
1534
  })).use((0, import_h3.onResponse)((response, event) => {
1357
1535
  if (client.isEnabled()) {