apitally 0.18.1 → 0.20.0

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