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