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
@@ -37,10 +37,11 @@ __export(middleware_exports, {
37
37
  useApitally: () => useApitally
38
38
  });
39
39
  module.exports = __toCommonJS(middleware_exports);
40
+ var import_node_async_hooks = require("async_hooks");
40
41
 
41
42
  // src/common/client.ts
42
- var import_crypto5 = require("crypto");
43
43
  var import_fetch_retry = __toESM(require("fetch-retry"), 1);
44
+ var import_node_crypto5 = require("crypto");
44
45
 
45
46
  // src/common/consumerRegistry.ts
46
47
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -100,7 +101,7 @@ var ConsumerRegistry = _ConsumerRegistry;
100
101
 
101
102
  // src/common/logging.ts
102
103
  var import_winston = require("winston");
103
- var getLogger = /* @__PURE__ */ __name(() => {
104
+ function getLogger() {
104
105
  return (0, import_winston.createLogger)({
105
106
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
106
107
  format: import_winston.format.combine(import_winston.format.colorize(), import_winston.format.timestamp(), import_winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -108,7 +109,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
108
109
  new import_winston.transports.Console()
109
110
  ]
110
111
  });
111
- }, "getLogger");
112
+ }
113
+ __name(getLogger, "getLogger");
112
114
 
113
115
  // src/common/paramValidation.ts
114
116
  function isValidClientId(clientId) {
@@ -210,11 +212,11 @@ var RequestCounter = _RequestCounter;
210
212
 
211
213
  // src/common/requestLogger.ts
212
214
  var import_async_lock = __toESM(require("async-lock"), 1);
213
- var import_buffer2 = require("buffer");
214
- var import_crypto3 = require("crypto");
215
- var import_fs2 = require("fs");
216
- var import_os2 = require("os");
217
- var import_path2 = require("path");
215
+ var import_node_buffer2 = require("buffer");
216
+ var import_node_crypto3 = require("crypto");
217
+ var import_node_fs2 = require("fs");
218
+ var import_node_os2 = require("os");
219
+ var import_node_path2 = require("path");
218
220
 
219
221
  // src/common/sentry.ts
220
222
  var sentry;
@@ -233,7 +235,7 @@ function getSentryEventId() {
233
235
  __name(getSentryEventId, "getSentryEventId");
234
236
 
235
237
  // src/common/serverErrorCounter.ts
236
- var import_crypto = require("crypto");
238
+ var import_node_crypto = require("crypto");
237
239
  var MAX_MSG_LENGTH = 2048;
238
240
  var MAX_STACKTRACE_LENGTH = 65536;
239
241
  var _ServerErrorCounter = class _ServerErrorCounter {
@@ -275,6 +277,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
275
277
  });
276
278
  this.errorCounts.clear();
277
279
  this.errorDetails.clear();
280
+ this.sentryEventIds.clear();
278
281
  return data;
279
282
  }
280
283
  getKey(serverError) {
@@ -286,7 +289,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
286
289
  serverError.msg.trim(),
287
290
  serverError.traceback.trim()
288
291
  ].join("|");
289
- return (0, import_crypto.createHash)("md5").update(hashInput).digest("hex");
292
+ return (0, import_node_crypto.createHash)("md5").update(hashInput).digest("hex");
290
293
  }
291
294
  };
292
295
  __name(_ServerErrorCounter, "ServerErrorCounter");
@@ -319,12 +322,13 @@ function truncateExceptionStackTrace(stack) {
319
322
  __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
320
323
 
321
324
  // src/common/tempGzipFile.ts
322
- var import_buffer = require("buffer");
323
- var import_crypto2 = require("crypto");
324
- var import_fs = require("fs");
325
- var import_os = require("os");
326
- var import_path = require("path");
327
- var import_zlib = require("zlib");
325
+ var import_node_buffer = require("buffer");
326
+ var import_node_crypto2 = require("crypto");
327
+ var import_node_fs = require("fs");
328
+ var import_promises = require("fs/promises");
329
+ var import_node_os = require("os");
330
+ var import_node_path = require("path");
331
+ var import_node_zlib = require("zlib");
328
332
  var _TempGzipFile = class _TempGzipFile {
329
333
  uuid;
330
334
  filePath;
@@ -333,9 +337,9 @@ var _TempGzipFile = class _TempGzipFile {
333
337
  readyPromise;
334
338
  closedPromise;
335
339
  constructor() {
336
- this.uuid = (0, import_crypto2.randomUUID)();
337
- this.filePath = (0, import_path.join)((0, import_os.tmpdir)(), `apitally-${this.uuid}.gz`);
338
- this.writeStream = (0, import_fs.createWriteStream)(this.filePath);
340
+ this.uuid = (0, import_node_crypto2.randomUUID)();
341
+ this.filePath = (0, import_node_path.join)((0, import_node_os.tmpdir)(), `apitally-${this.uuid}.gz`);
342
+ this.writeStream = (0, import_node_fs.createWriteStream)(this.filePath);
339
343
  this.readyPromise = new Promise((resolve, reject) => {
340
344
  this.writeStream.once("ready", resolve);
341
345
  this.writeStream.once("error", reject);
@@ -344,7 +348,7 @@ var _TempGzipFile = class _TempGzipFile {
344
348
  this.writeStream.once("close", resolve);
345
349
  this.writeStream.once("error", reject);
346
350
  });
347
- this.gzip = (0, import_zlib.createGzip)();
351
+ this.gzip = (0, import_node_zlib.createGzip)();
348
352
  this.gzip.pipe(this.writeStream);
349
353
  }
350
354
  get size() {
@@ -353,9 +357,9 @@ var _TempGzipFile = class _TempGzipFile {
353
357
  async writeLine(data) {
354
358
  await this.readyPromise;
355
359
  return new Promise((resolve, reject) => {
356
- this.gzip.write(import_buffer.Buffer.concat([
360
+ this.gzip.write(import_node_buffer.Buffer.concat([
357
361
  data,
358
- import_buffer.Buffer.from("\n")
362
+ import_node_buffer.Buffer.from("\n")
359
363
  ]), (error) => {
360
364
  if (error) {
361
365
  reject(error);
@@ -367,7 +371,7 @@ var _TempGzipFile = class _TempGzipFile {
367
371
  }
368
372
  async getContent() {
369
373
  return new Promise((resolve, reject) => {
370
- (0, import_fs.readFile)(this.filePath, (error, data) => {
374
+ (0, import_node_fs.readFile)(this.filePath, (error, data) => {
371
375
  if (error) {
372
376
  reject(error);
373
377
  } else {
@@ -386,7 +390,7 @@ var _TempGzipFile = class _TempGzipFile {
386
390
  }
387
391
  async delete() {
388
392
  await this.close();
389
- (0, import_fs.unlinkSync)(this.filePath);
393
+ await (0, import_promises.unlink)(this.filePath);
390
394
  }
391
395
  };
392
396
  __name(_TempGzipFile, "TempGzipFile");
@@ -397,8 +401,9 @@ var MAX_BODY_SIZE = 5e4;
397
401
  var MAX_FILE_SIZE = 1e6;
398
402
  var MAX_FILES = 50;
399
403
  var MAX_PENDING_WRITES = 100;
400
- var BODY_TOO_LARGE = import_buffer2.Buffer.from("<body too large>");
401
- var BODY_MASKED = import_buffer2.Buffer.from("<masked>");
404
+ var MAX_LOG_MSG_LENGTH = 2048;
405
+ var BODY_TOO_LARGE = import_node_buffer2.Buffer.from("<body too large>");
406
+ var BODY_MASKED = import_node_buffer2.Buffer.from("<masked>");
402
407
  var MASKED = "******";
403
408
  var ALLOWED_CONTENT_TYPES = [
404
409
  "application/json",
@@ -453,6 +458,7 @@ var DEFAULT_CONFIG = {
453
458
  logResponseHeaders: true,
454
459
  logResponseBody: false,
455
460
  logException: true,
461
+ captureLogs: false,
456
462
  maskQueryParams: [],
457
463
  maskHeaders: [],
458
464
  maskBodyFields: [],
@@ -595,7 +601,7 @@ var _RequestLogger = class _RequestLogger {
595
601
  try {
596
602
  const parsedBody = JSON.parse(bodyData.toString());
597
603
  const maskedBody = this.maskBody(parsedBody);
598
- item[key].body = import_buffer2.Buffer.from(JSON.stringify(maskedBody));
604
+ item[key].body = import_node_buffer2.Buffer.from(JSON.stringify(maskedBody));
599
605
  } catch {
600
606
  }
601
607
  }
@@ -607,7 +613,7 @@ var _RequestLogger = class _RequestLogger {
607
613
  item.request.url = url.toString();
608
614
  return item;
609
615
  }
610
- logRequest(request, response, error) {
616
+ logRequest(request, response, error, logs) {
611
617
  var _a2, _b, _c;
612
618
  if (!this.enabled || this.suspendUntil !== null) return;
613
619
  const url = new URL(request.url);
@@ -629,7 +635,7 @@ var _RequestLogger = class _RequestLogger {
629
635
  response.size = void 0;
630
636
  }
631
637
  const item = {
632
- uuid: (0, import_crypto3.randomUUID)(),
638
+ uuid: (0, import_node_crypto3.randomUUID)(),
633
639
  request,
634
640
  response,
635
641
  exception: error && this.config.logException ? {
@@ -639,6 +645,14 @@ var _RequestLogger = class _RequestLogger {
639
645
  sentryEventId: getSentryEventId()
640
646
  } : void 0
641
647
  };
648
+ if (logs && logs.length > 0) {
649
+ item.logs = logs.map((log) => ({
650
+ timestamp: log.timestamp,
651
+ logger: log.logger,
652
+ level: log.level,
653
+ message: truncateLogMessage(log.message)
654
+ }));
655
+ }
642
656
  this.pendingWrites.push(item);
643
657
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
644
658
  this.pendingWrites.shift();
@@ -660,7 +674,8 @@ var _RequestLogger = class _RequestLogger {
660
674
  uuid: item.uuid,
661
675
  request: skipEmptyValues(item.request),
662
676
  response: skipEmptyValues(item.response),
663
- exception: item.exception
677
+ exception: item.exception,
678
+ logs: item.logs
664
679
  };
665
680
  [
666
681
  finalItem.request.body,
@@ -672,7 +687,7 @@ var _RequestLogger = class _RequestLogger {
672
687
  };
673
688
  }
674
689
  });
675
- await this.currentFile.writeLine(import_buffer2.Buffer.from(JSON.stringify(finalItem)));
690
+ await this.currentFile.writeLine(import_node_buffer2.Buffer.from(JSON.stringify(finalItem)));
676
691
  }
677
692
  }
678
693
  });
@@ -724,6 +739,9 @@ var _RequestLogger = class _RequestLogger {
724
739
  __name(_RequestLogger, "RequestLogger");
725
740
  var RequestLogger = _RequestLogger;
726
741
  function convertHeaders(headers) {
742
+ if (!headers) {
743
+ return [];
744
+ }
727
745
  if (headers instanceof Headers) {
728
746
  return Array.from(headers.entries());
729
747
  }
@@ -753,13 +771,13 @@ function convertBody(body, contentType) {
753
771
  try {
754
772
  if (contentType.startsWith("application/json")) {
755
773
  if (isValidJsonString(body)) {
756
- return import_buffer2.Buffer.from(body);
774
+ return import_node_buffer2.Buffer.from(body);
757
775
  } else {
758
- return import_buffer2.Buffer.from(JSON.stringify(body));
776
+ return import_node_buffer2.Buffer.from(JSON.stringify(body));
759
777
  }
760
778
  }
761
779
  if (contentType.startsWith("text/") && typeof body === "string") {
762
- return import_buffer2.Buffer.from(body);
780
+ return import_node_buffer2.Buffer.from(body);
763
781
  }
764
782
  } catch (error) {
765
783
  return;
@@ -787,18 +805,26 @@ __name(matchPatterns, "matchPatterns");
787
805
  function skipEmptyValues(data) {
788
806
  return Object.fromEntries(Object.entries(data).filter(([_, v]) => {
789
807
  if (v == null || Number.isNaN(v)) return false;
790
- if (Array.isArray(v) || import_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
808
+ if (Array.isArray(v) || import_node_buffer2.Buffer.isBuffer(v) || typeof v === "string") {
791
809
  return v.length > 0;
792
810
  }
793
811
  return true;
794
812
  }));
795
813
  }
796
814
  __name(skipEmptyValues, "skipEmptyValues");
815
+ function truncateLogMessage(msg) {
816
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
817
+ const suffix = "... (truncated)";
818
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
819
+ }
820
+ return msg;
821
+ }
822
+ __name(truncateLogMessage, "truncateLogMessage");
797
823
  function checkWritableFs() {
798
824
  try {
799
- const testPath = (0, import_path2.join)((0, import_os2.tmpdir)(), `apitally-${(0, import_crypto3.randomUUID)()}`);
800
- (0, import_fs2.writeFileSync)(testPath, "test");
801
- (0, import_fs2.unlinkSync)(testPath);
825
+ const testPath = (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), `apitally-${(0, import_node_crypto3.randomUUID)()}`);
826
+ (0, import_node_fs2.writeFileSync)(testPath, "test");
827
+ (0, import_node_fs2.unlinkSync)(testPath);
802
828
  return true;
803
829
  } catch (error) {
804
830
  return false;
@@ -807,7 +833,7 @@ function checkWritableFs() {
807
833
  __name(checkWritableFs, "checkWritableFs");
808
834
 
809
835
  // src/common/validationErrorCounter.ts
810
- var import_crypto4 = require("crypto");
836
+ var import_node_crypto4 = require("crypto");
811
837
  var _ValidationErrorCounter = class _ValidationErrorCounter {
812
838
  errorCounts;
813
839
  errorDetails;
@@ -831,7 +857,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
831
857
  consumer: validationError.consumer || null,
832
858
  method: validationError.method,
833
859
  path: validationError.path,
834
- loc: validationError.loc.split("."),
860
+ loc: validationError.loc.split(".").filter(Boolean),
835
861
  msg: validationError.msg,
836
862
  type: validationError.type,
837
863
  error_count: count
@@ -847,11 +873,11 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
847
873
  validationError.consumer || "",
848
874
  validationError.method.toUpperCase(),
849
875
  validationError.path,
850
- validationError.loc,
876
+ validationError.loc.split(".").filter(Boolean),
851
877
  validationError.msg.trim(),
852
878
  validationError.type
853
879
  ].join("|");
854
- return (0, import_crypto4.createHash)("md5").update(hashInput).digest("hex");
880
+ return (0, import_node_crypto4.createHash)("md5").update(hashInput).digest("hex");
855
881
  }
856
882
  };
857
883
  __name(_ValidationErrorCounter, "ValidationErrorCounter");
@@ -902,7 +928,7 @@ var _ApitallyClient = class _ApitallyClient {
902
928
  _ApitallyClient.instance = this;
903
929
  this.clientId = clientId;
904
930
  this.env = env;
905
- this.instanceUuid = (0, import_crypto5.randomUUID)();
931
+ this.instanceUuid = (0, import_node_crypto5.randomUUID)();
906
932
  this.syncDataQueue = [];
907
933
  this.requestCounter = new RequestCounter();
908
934
  this.requestLogger = new RequestLogger(requestLogging ?? requestLoggingConfig);
@@ -1008,7 +1034,7 @@ var _ApitallyClient = class _ApitallyClient {
1008
1034
  this.logger.debug("Sending startup data to Apitally Hub");
1009
1035
  const payload = {
1010
1036
  instance_uuid: this.instanceUuid,
1011
- message_uuid: (0, import_crypto5.randomUUID)(),
1037
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
1012
1038
  ...this.startupData
1013
1039
  };
1014
1040
  try {
@@ -1030,7 +1056,7 @@ var _ApitallyClient = class _ApitallyClient {
1030
1056
  const newPayload = {
1031
1057
  timestamp: Date.now() / 1e3,
1032
1058
  instance_uuid: this.instanceUuid,
1033
- message_uuid: (0, import_crypto5.randomUUID)(),
1059
+ message_uuid: (0, import_node_crypto5.randomUUID)(),
1034
1060
  requests: this.requestCounter.getAndResetRequests(),
1035
1061
  validation_errors: this.validationErrorCounter.getAndResetValidationErrors(),
1036
1062
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
@@ -1133,7 +1159,7 @@ __publicField(_ApitallyClient, "instance");
1133
1159
  var ApitallyClient = _ApitallyClient;
1134
1160
 
1135
1161
  // src/common/packageVersions.ts
1136
- var import_module = require("module");
1162
+ var import_node_module = require("module");
1137
1163
  var import_meta = {};
1138
1164
  function getPackageVersion(name) {
1139
1165
  const packageJsonPath = `${name}/package.json`;
@@ -1141,7 +1167,7 @@ function getPackageVersion(name) {
1141
1167
  return require(packageJsonPath).version || null;
1142
1168
  } catch (error) {
1143
1169
  try {
1144
- const _require = (0, import_module.createRequire)(import_meta.url);
1170
+ const _require = (0, import_node_module.createRequire)(import_meta.url);
1145
1171
  return _require(packageJsonPath).version || null;
1146
1172
  } catch (error2) {
1147
1173
  return null;
@@ -1150,6 +1176,143 @@ function getPackageVersion(name) {
1150
1176
  }
1151
1177
  __name(getPackageVersion, "getPackageVersion");
1152
1178
 
1179
+ // src/loggers/console.ts
1180
+ var import_node_util = require("util");
1181
+ var MAX_BUFFER_SIZE = 1e3;
1182
+ var isPatched = false;
1183
+ var globalLogsContext;
1184
+ function patchConsole(logsContext) {
1185
+ globalLogsContext = logsContext;
1186
+ if (isPatched) {
1187
+ return;
1188
+ }
1189
+ const logMethods = [
1190
+ "log",
1191
+ "warn",
1192
+ "error",
1193
+ "info",
1194
+ "debug"
1195
+ ];
1196
+ logMethods.forEach((method) => {
1197
+ const originalMethod = console[method];
1198
+ console[method] = function(...args) {
1199
+ captureLog(method, args);
1200
+ return originalMethod.apply(console, args);
1201
+ };
1202
+ });
1203
+ isPatched = true;
1204
+ }
1205
+ __name(patchConsole, "patchConsole");
1206
+ function captureLog(level, args) {
1207
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1208
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1209
+ logs.push({
1210
+ timestamp: Date.now() / 1e3,
1211
+ logger: "console",
1212
+ level,
1213
+ message: (0, import_node_util.format)(...args)
1214
+ });
1215
+ }
1216
+ }
1217
+ __name(captureLog, "captureLog");
1218
+
1219
+ // src/loggers/utils.ts
1220
+ var import_node_util2 = require("util");
1221
+ function formatMessage(message, ...args) {
1222
+ return [
1223
+ message,
1224
+ ...args
1225
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1226
+ }
1227
+ __name(formatMessage, "formatMessage");
1228
+ function removeKeys(obj, keys) {
1229
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1230
+ }
1231
+ __name(removeKeys, "removeKeys");
1232
+ function formatArg(arg) {
1233
+ if (typeof arg === "string") {
1234
+ return arg.trim();
1235
+ }
1236
+ if (arg instanceof Error) {
1237
+ return (0, import_node_util2.format)(arg).trim();
1238
+ }
1239
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1240
+ return "";
1241
+ }
1242
+ try {
1243
+ return JSON.stringify(arg);
1244
+ } catch {
1245
+ return (0, import_node_util2.format)(arg).trim();
1246
+ }
1247
+ }
1248
+ __name(formatArg, "formatArg");
1249
+ function isEmptyObject(obj) {
1250
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1251
+ }
1252
+ __name(isEmptyObject, "isEmptyObject");
1253
+
1254
+ // src/loggers/pino.ts
1255
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1256
+
1257
+ // src/loggers/winston.ts
1258
+ var MAX_BUFFER_SIZE2 = 1e3;
1259
+ var isPatched2 = false;
1260
+ var globalLogsContext2;
1261
+ async function patchWinston(logsContext) {
1262
+ var _a2, _b;
1263
+ globalLogsContext2 = logsContext;
1264
+ if (isPatched2) {
1265
+ return;
1266
+ }
1267
+ try {
1268
+ const loggerModule = await import("winston/lib/winston/logger.js");
1269
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1270
+ const originalWrite = loggerModule.default.prototype.write;
1271
+ loggerModule.default.prototype.write = function(info) {
1272
+ captureLog2(info);
1273
+ return originalWrite.call(this, info);
1274
+ };
1275
+ }
1276
+ } catch {
1277
+ }
1278
+ isPatched2 = true;
1279
+ }
1280
+ __name(patchWinston, "patchWinston");
1281
+ function captureLog2(info) {
1282
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1283
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1284
+ return;
1285
+ }
1286
+ try {
1287
+ const rest = removeKeys(info, [
1288
+ "timestamp",
1289
+ "level",
1290
+ "message",
1291
+ "splat"
1292
+ ]);
1293
+ const formattedMessage = formatMessage(info.message, rest);
1294
+ if (formattedMessage) {
1295
+ logs.push({
1296
+ timestamp: parseTimestamp(info.timestamp),
1297
+ level: info.level || "info",
1298
+ message: formattedMessage.trim()
1299
+ });
1300
+ }
1301
+ } catch (e) {
1302
+ }
1303
+ }
1304
+ __name(captureLog2, "captureLog");
1305
+ function parseTimestamp(timestamp) {
1306
+ if (timestamp) {
1307
+ const ts = new Date(timestamp).getTime();
1308
+ if (!isNaN(ts)) {
1309
+ return ts / 1e3;
1310
+ }
1311
+ }
1312
+ return Date.now() / 1e3;
1313
+ }
1314
+ __name(parseTimestamp, "parseTimestamp");
1315
+
1153
1316
  // src/koa/middleware.ts
1154
1317
  function useApitally(app, config) {
1155
1318
  const client = new ApitallyClient(config);
@@ -1167,77 +1330,85 @@ function useApitally(app, config) {
1167
1330
  }
1168
1331
  __name(useApitally, "useApitally");
1169
1332
  function getMiddleware(client) {
1333
+ const logsContext = new import_node_async_hooks.AsyncLocalStorage();
1334
+ if (client.requestLogger.config.captureLogs) {
1335
+ patchConsole(logsContext);
1336
+ patchWinston(logsContext);
1337
+ }
1170
1338
  return async (ctx, next) => {
1171
- var _a2;
1172
1339
  if (!client.isEnabled() || ctx.request.method.toUpperCase() === "OPTIONS") {
1173
1340
  await next();
1174
1341
  return;
1175
1342
  }
1176
- let path;
1177
- let statusCode;
1178
- let serverError;
1179
- const startTime = performance.now();
1180
- try {
1181
- await next();
1182
- } catch (error) {
1183
- path = getPath(ctx);
1184
- statusCode = error.statusCode || error.status || 500;
1185
- if (path && statusCode === 500 && error instanceof Error) {
1186
- serverError = error;
1187
- client.serverErrorCounter.addServerError({
1188
- consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
1189
- method: ctx.request.method,
1190
- path,
1191
- type: error.name,
1192
- msg: error.message,
1193
- traceback: error.stack || ""
1194
- });
1195
- }
1196
- throw error;
1197
- } finally {
1198
- const responseTime = performance.now() - startTime;
1199
- const consumer = getConsumer(ctx);
1200
- client.consumerRegistry.addOrUpdateConsumer(consumer);
1201
- if (!path) {
1343
+ await logsContext.run([], async () => {
1344
+ var _a2;
1345
+ let path;
1346
+ let statusCode;
1347
+ let serverError;
1348
+ const startTime = performance.now();
1349
+ try {
1350
+ await next();
1351
+ } catch (error) {
1202
1352
  path = getPath(ctx);
1203
- }
1204
- if (path) {
1205
- try {
1206
- client.requestCounter.addRequest({
1207
- consumer: consumer == null ? void 0 : consumer.identifier,
1353
+ statusCode = error.statusCode || error.status || 500;
1354
+ if (path && statusCode === 500 && error instanceof Error) {
1355
+ serverError = error;
1356
+ client.serverErrorCounter.addServerError({
1357
+ consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
1208
1358
  method: ctx.request.method,
1209
1359
  path,
1210
- statusCode: statusCode || ctx.response.status,
1211
- responseTime,
1212
- requestSize: ctx.request.length,
1213
- responseSize: ctx.response.length
1214
- });
1215
- } catch (error) {
1216
- client.logger.error("Error while logging request in Apitally middleware.", {
1217
- context: ctx,
1218
- error
1360
+ type: error.name,
1361
+ msg: error.message,
1362
+ traceback: error.stack || ""
1219
1363
  });
1220
1364
  }
1365
+ throw error;
1366
+ } finally {
1367
+ const responseTime = performance.now() - startTime;
1368
+ const consumer = getConsumer(ctx);
1369
+ client.consumerRegistry.addOrUpdateConsumer(consumer);
1370
+ if (!path) {
1371
+ path = getPath(ctx);
1372
+ }
1373
+ if (path) {
1374
+ try {
1375
+ client.requestCounter.addRequest({
1376
+ consumer: consumer == null ? void 0 : consumer.identifier,
1377
+ method: ctx.request.method,
1378
+ path,
1379
+ statusCode: statusCode || ctx.response.status,
1380
+ responseTime,
1381
+ requestSize: ctx.request.length,
1382
+ responseSize: ctx.response.length
1383
+ });
1384
+ } catch (error) {
1385
+ client.logger.error("Error while logging request in Apitally middleware.", {
1386
+ context: ctx,
1387
+ error
1388
+ });
1389
+ }
1390
+ }
1391
+ if (client.requestLogger.enabled) {
1392
+ const logs = logsContext.getStore();
1393
+ client.requestLogger.logRequest({
1394
+ timestamp: Date.now() / 1e3,
1395
+ method: ctx.request.method,
1396
+ path,
1397
+ url: ctx.request.href,
1398
+ headers: convertHeaders(ctx.request.headers),
1399
+ size: ctx.request.length,
1400
+ consumer: consumer == null ? void 0 : consumer.identifier,
1401
+ body: convertBody(ctx.request.body, ctx.request.get("content-type"))
1402
+ }, {
1403
+ statusCode: statusCode || ctx.response.status,
1404
+ responseTime: responseTime / 1e3,
1405
+ headers: convertHeaders(ctx.response.headers),
1406
+ size: ctx.response.length,
1407
+ body: convertBody(ctx.response.body, ctx.response.get("content-type"))
1408
+ }, serverError, logs);
1409
+ }
1221
1410
  }
1222
- if (client.requestLogger.enabled) {
1223
- client.requestLogger.logRequest({
1224
- timestamp: Date.now() / 1e3,
1225
- method: ctx.request.method,
1226
- path,
1227
- url: ctx.request.href,
1228
- headers: convertHeaders(ctx.request.headers),
1229
- size: ctx.request.length,
1230
- consumer: consumer == null ? void 0 : consumer.identifier,
1231
- body: convertBody(ctx.request.body, ctx.request.get("content-type"))
1232
- }, {
1233
- statusCode: statusCode || ctx.response.status,
1234
- responseTime: responseTime / 1e3,
1235
- headers: convertHeaders(ctx.response.headers),
1236
- size: ctx.response.length,
1237
- body: convertBody(ctx.response.body, ctx.response.get("content-type"))
1238
- }, serverError);
1239
- }
1240
- }
1411
+ });
1241
1412
  };
1242
1413
  }
1243
1414
  __name(getMiddleware, "getMiddleware");