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
@@ -9,9 +9,12 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
9
9
  });
10
10
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
11
 
12
+ // src/koa/middleware.ts
13
+ import { AsyncLocalStorage } from "async_hooks";
14
+
12
15
  // src/common/client.ts
13
- import { randomUUID as randomUUID3 } from "crypto";
14
16
  import fetchRetry from "fetch-retry";
17
+ import { randomUUID as randomUUID3 } from "crypto";
15
18
 
16
19
  // src/common/consumerRegistry.ts
17
20
  var consumerFromStringOrObject = /* @__PURE__ */ __name((consumer) => {
@@ -71,7 +74,7 @@ var ConsumerRegistry = _ConsumerRegistry;
71
74
 
72
75
  // src/common/logging.ts
73
76
  import { createLogger, format, transports } from "winston";
74
- var getLogger = /* @__PURE__ */ __name(() => {
77
+ function getLogger() {
75
78
  return createLogger({
76
79
  level: process.env.APITALLY_DEBUG ? "debug" : "warn",
77
80
  format: format.combine(format.colorize(), format.timestamp(), format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`)),
@@ -79,7 +82,8 @@ var getLogger = /* @__PURE__ */ __name(() => {
79
82
  new transports.Console()
80
83
  ]
81
84
  });
82
- }, "getLogger");
85
+ }
86
+ __name(getLogger, "getLogger");
83
87
 
84
88
  // src/common/paramValidation.ts
85
89
  function isValidClientId(clientId) {
@@ -183,7 +187,7 @@ var RequestCounter = _RequestCounter;
183
187
  import AsyncLock from "async-lock";
184
188
  import { Buffer as Buffer3 } from "buffer";
185
189
  import { randomUUID as randomUUID2 } from "crypto";
186
- import { unlinkSync as unlinkSync2, writeFileSync } from "fs";
190
+ import { unlinkSync, writeFileSync } from "fs";
187
191
  import { tmpdir as tmpdir2 } from "os";
188
192
  import { join as join2 } from "path";
189
193
 
@@ -246,6 +250,7 @@ var _ServerErrorCounter = class _ServerErrorCounter {
246
250
  });
247
251
  this.errorCounts.clear();
248
252
  this.errorDetails.clear();
253
+ this.sentryEventIds.clear();
249
254
  return data;
250
255
  }
251
256
  getKey(serverError) {
@@ -292,7 +297,8 @@ __name(truncateExceptionStackTrace, "truncateExceptionStackTrace");
292
297
  // src/common/tempGzipFile.ts
293
298
  import { Buffer as Buffer2 } from "buffer";
294
299
  import { randomUUID } from "crypto";
295
- import { createWriteStream, readFile, unlinkSync } from "fs";
300
+ import { createWriteStream, readFile } from "fs";
301
+ import { unlink } from "fs/promises";
296
302
  import { tmpdir } from "os";
297
303
  import { join } from "path";
298
304
  import { createGzip } from "zlib";
@@ -357,7 +363,7 @@ var _TempGzipFile = class _TempGzipFile {
357
363
  }
358
364
  async delete() {
359
365
  await this.close();
360
- unlinkSync(this.filePath);
366
+ await unlink(this.filePath);
361
367
  }
362
368
  };
363
369
  __name(_TempGzipFile, "TempGzipFile");
@@ -368,6 +374,7 @@ var MAX_BODY_SIZE = 5e4;
368
374
  var MAX_FILE_SIZE = 1e6;
369
375
  var MAX_FILES = 50;
370
376
  var MAX_PENDING_WRITES = 100;
377
+ var MAX_LOG_MSG_LENGTH = 2048;
371
378
  var BODY_TOO_LARGE = Buffer3.from("<body too large>");
372
379
  var BODY_MASKED = Buffer3.from("<masked>");
373
380
  var MASKED = "******";
@@ -424,6 +431,7 @@ var DEFAULT_CONFIG = {
424
431
  logResponseHeaders: true,
425
432
  logResponseBody: false,
426
433
  logException: true,
434
+ captureLogs: false,
427
435
  maskQueryParams: [],
428
436
  maskHeaders: [],
429
437
  maskBodyFields: [],
@@ -578,7 +586,7 @@ var _RequestLogger = class _RequestLogger {
578
586
  item.request.url = url.toString();
579
587
  return item;
580
588
  }
581
- logRequest(request, response, error) {
589
+ logRequest(request, response, error, logs) {
582
590
  var _a2, _b, _c;
583
591
  if (!this.enabled || this.suspendUntil !== null) return;
584
592
  const url = new URL(request.url);
@@ -610,6 +618,14 @@ var _RequestLogger = class _RequestLogger {
610
618
  sentryEventId: getSentryEventId()
611
619
  } : void 0
612
620
  };
621
+ if (logs && logs.length > 0) {
622
+ item.logs = logs.map((log) => ({
623
+ timestamp: log.timestamp,
624
+ logger: log.logger,
625
+ level: log.level,
626
+ message: truncateLogMessage(log.message)
627
+ }));
628
+ }
613
629
  this.pendingWrites.push(item);
614
630
  if (this.pendingWrites.length > MAX_PENDING_WRITES) {
615
631
  this.pendingWrites.shift();
@@ -631,7 +647,8 @@ var _RequestLogger = class _RequestLogger {
631
647
  uuid: item.uuid,
632
648
  request: skipEmptyValues(item.request),
633
649
  response: skipEmptyValues(item.response),
634
- exception: item.exception
650
+ exception: item.exception,
651
+ logs: item.logs
635
652
  };
636
653
  [
637
654
  finalItem.request.body,
@@ -695,6 +712,9 @@ var _RequestLogger = class _RequestLogger {
695
712
  __name(_RequestLogger, "RequestLogger");
696
713
  var RequestLogger = _RequestLogger;
697
714
  function convertHeaders(headers) {
715
+ if (!headers) {
716
+ return [];
717
+ }
698
718
  if (headers instanceof Headers) {
699
719
  return Array.from(headers.entries());
700
720
  }
@@ -765,11 +785,19 @@ function skipEmptyValues(data) {
765
785
  }));
766
786
  }
767
787
  __name(skipEmptyValues, "skipEmptyValues");
788
+ function truncateLogMessage(msg) {
789
+ if (msg.length > MAX_LOG_MSG_LENGTH) {
790
+ const suffix = "... (truncated)";
791
+ return msg.slice(0, MAX_LOG_MSG_LENGTH - suffix.length) + suffix;
792
+ }
793
+ return msg;
794
+ }
795
+ __name(truncateLogMessage, "truncateLogMessage");
768
796
  function checkWritableFs() {
769
797
  try {
770
798
  const testPath = join2(tmpdir2(), `apitally-${randomUUID2()}`);
771
799
  writeFileSync(testPath, "test");
772
- unlinkSync2(testPath);
800
+ unlinkSync(testPath);
773
801
  return true;
774
802
  } catch (error) {
775
803
  return false;
@@ -802,7 +830,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
802
830
  consumer: validationError.consumer || null,
803
831
  method: validationError.method,
804
832
  path: validationError.path,
805
- loc: validationError.loc.split("."),
833
+ loc: validationError.loc.split(".").filter(Boolean),
806
834
  msg: validationError.msg,
807
835
  type: validationError.type,
808
836
  error_count: count
@@ -818,7 +846,7 @@ var _ValidationErrorCounter = class _ValidationErrorCounter {
818
846
  validationError.consumer || "",
819
847
  validationError.method.toUpperCase(),
820
848
  validationError.path,
821
- validationError.loc,
849
+ validationError.loc.split(".").filter(Boolean),
822
850
  validationError.msg.trim(),
823
851
  validationError.type
824
852
  ].join("|");
@@ -1120,6 +1148,143 @@ function getPackageVersion(name) {
1120
1148
  }
1121
1149
  __name(getPackageVersion, "getPackageVersion");
1122
1150
 
1151
+ // src/loggers/console.ts
1152
+ import { format as format2 } from "util";
1153
+ var MAX_BUFFER_SIZE = 1e3;
1154
+ var isPatched = false;
1155
+ var globalLogsContext;
1156
+ function patchConsole(logsContext) {
1157
+ globalLogsContext = logsContext;
1158
+ if (isPatched) {
1159
+ return;
1160
+ }
1161
+ const logMethods = [
1162
+ "log",
1163
+ "warn",
1164
+ "error",
1165
+ "info",
1166
+ "debug"
1167
+ ];
1168
+ logMethods.forEach((method) => {
1169
+ const originalMethod = console[method];
1170
+ console[method] = function(...args) {
1171
+ captureLog(method, args);
1172
+ return originalMethod.apply(console, args);
1173
+ };
1174
+ });
1175
+ isPatched = true;
1176
+ }
1177
+ __name(patchConsole, "patchConsole");
1178
+ function captureLog(level, args) {
1179
+ const logs = globalLogsContext == null ? void 0 : globalLogsContext.getStore();
1180
+ if (logs && logs.length < MAX_BUFFER_SIZE) {
1181
+ logs.push({
1182
+ timestamp: Date.now() / 1e3,
1183
+ logger: "console",
1184
+ level,
1185
+ message: format2(...args)
1186
+ });
1187
+ }
1188
+ }
1189
+ __name(captureLog, "captureLog");
1190
+
1191
+ // src/loggers/utils.ts
1192
+ import { format as format3 } from "util";
1193
+ function formatMessage(message, ...args) {
1194
+ return [
1195
+ message,
1196
+ ...args
1197
+ ].map(formatArg).filter((arg) => arg !== "").join("\n");
1198
+ }
1199
+ __name(formatMessage, "formatMessage");
1200
+ function removeKeys(obj, keys) {
1201
+ return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
1202
+ }
1203
+ __name(removeKeys, "removeKeys");
1204
+ function formatArg(arg) {
1205
+ if (typeof arg === "string") {
1206
+ return arg.trim();
1207
+ }
1208
+ if (arg instanceof Error) {
1209
+ return format3(arg).trim();
1210
+ }
1211
+ if (arg === void 0 || arg === null || isEmptyObject(arg)) {
1212
+ return "";
1213
+ }
1214
+ try {
1215
+ return JSON.stringify(arg);
1216
+ } catch {
1217
+ return format3(arg).trim();
1218
+ }
1219
+ }
1220
+ __name(formatArg, "formatArg");
1221
+ function isEmptyObject(obj) {
1222
+ return obj !== null && typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype && Object.keys(obj).length === 0;
1223
+ }
1224
+ __name(isEmptyObject, "isEmptyObject");
1225
+
1226
+ // src/loggers/pino.ts
1227
+ var originalStreamSym = Symbol.for("apitally.originalStream");
1228
+
1229
+ // src/loggers/winston.ts
1230
+ var MAX_BUFFER_SIZE2 = 1e3;
1231
+ var isPatched2 = false;
1232
+ var globalLogsContext2;
1233
+ async function patchWinston(logsContext) {
1234
+ var _a2, _b;
1235
+ globalLogsContext2 = logsContext;
1236
+ if (isPatched2) {
1237
+ return;
1238
+ }
1239
+ try {
1240
+ const loggerModule = await import("winston/lib/winston/logger.js");
1241
+ if ((_b = (_a2 = loggerModule.default) == null ? void 0 : _a2.prototype) == null ? void 0 : _b.write) {
1242
+ const originalWrite = loggerModule.default.prototype.write;
1243
+ loggerModule.default.prototype.write = function(info) {
1244
+ captureLog2(info);
1245
+ return originalWrite.call(this, info);
1246
+ };
1247
+ }
1248
+ } catch {
1249
+ }
1250
+ isPatched2 = true;
1251
+ }
1252
+ __name(patchWinston, "patchWinston");
1253
+ function captureLog2(info) {
1254
+ const logs = globalLogsContext2 == null ? void 0 : globalLogsContext2.getStore();
1255
+ if (!logs || !info || logs.length >= MAX_BUFFER_SIZE2) {
1256
+ return;
1257
+ }
1258
+ try {
1259
+ const rest = removeKeys(info, [
1260
+ "timestamp",
1261
+ "level",
1262
+ "message",
1263
+ "splat"
1264
+ ]);
1265
+ const formattedMessage = formatMessage(info.message, rest);
1266
+ if (formattedMessage) {
1267
+ logs.push({
1268
+ timestamp: parseTimestamp(info.timestamp),
1269
+ level: info.level || "info",
1270
+ message: formattedMessage.trim()
1271
+ });
1272
+ }
1273
+ } catch (e) {
1274
+ }
1275
+ }
1276
+ __name(captureLog2, "captureLog");
1277
+ function parseTimestamp(timestamp) {
1278
+ if (timestamp) {
1279
+ const ts = new Date(timestamp).getTime();
1280
+ if (!isNaN(ts)) {
1281
+ return ts / 1e3;
1282
+ }
1283
+ }
1284
+ return Date.now() / 1e3;
1285
+ }
1286
+ __name(parseTimestamp, "parseTimestamp");
1287
+
1123
1288
  // src/koa/middleware.ts
1124
1289
  function useApitally(app, config) {
1125
1290
  const client = new ApitallyClient(config);
@@ -1137,77 +1302,85 @@ function useApitally(app, config) {
1137
1302
  }
1138
1303
  __name(useApitally, "useApitally");
1139
1304
  function getMiddleware(client) {
1305
+ const logsContext = new AsyncLocalStorage();
1306
+ if (client.requestLogger.config.captureLogs) {
1307
+ patchConsole(logsContext);
1308
+ patchWinston(logsContext);
1309
+ }
1140
1310
  return async (ctx, next) => {
1141
- var _a2;
1142
1311
  if (!client.isEnabled() || ctx.request.method.toUpperCase() === "OPTIONS") {
1143
1312
  await next();
1144
1313
  return;
1145
1314
  }
1146
- let path;
1147
- let statusCode;
1148
- let serverError;
1149
- const startTime = performance.now();
1150
- try {
1151
- await next();
1152
- } catch (error) {
1153
- path = getPath(ctx);
1154
- statusCode = error.statusCode || error.status || 500;
1155
- if (path && statusCode === 500 && error instanceof Error) {
1156
- serverError = error;
1157
- client.serverErrorCounter.addServerError({
1158
- consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
1159
- method: ctx.request.method,
1160
- path,
1161
- type: error.name,
1162
- msg: error.message,
1163
- traceback: error.stack || ""
1164
- });
1165
- }
1166
- throw error;
1167
- } finally {
1168
- const responseTime = performance.now() - startTime;
1169
- const consumer = getConsumer(ctx);
1170
- client.consumerRegistry.addOrUpdateConsumer(consumer);
1171
- if (!path) {
1315
+ await logsContext.run([], async () => {
1316
+ var _a2;
1317
+ let path;
1318
+ let statusCode;
1319
+ let serverError;
1320
+ const startTime = performance.now();
1321
+ try {
1322
+ await next();
1323
+ } catch (error) {
1172
1324
  path = getPath(ctx);
1173
- }
1174
- if (path) {
1175
- try {
1176
- client.requestCounter.addRequest({
1177
- consumer: consumer == null ? void 0 : consumer.identifier,
1325
+ statusCode = error.statusCode || error.status || 500;
1326
+ if (path && statusCode === 500 && error instanceof Error) {
1327
+ serverError = error;
1328
+ client.serverErrorCounter.addServerError({
1329
+ consumer: (_a2 = getConsumer(ctx)) == null ? void 0 : _a2.identifier,
1178
1330
  method: ctx.request.method,
1179
1331
  path,
1180
- statusCode: statusCode || ctx.response.status,
1181
- responseTime,
1182
- requestSize: ctx.request.length,
1183
- responseSize: ctx.response.length
1184
- });
1185
- } catch (error) {
1186
- client.logger.error("Error while logging request in Apitally middleware.", {
1187
- context: ctx,
1188
- error
1332
+ type: error.name,
1333
+ msg: error.message,
1334
+ traceback: error.stack || ""
1189
1335
  });
1190
1336
  }
1337
+ throw error;
1338
+ } finally {
1339
+ const responseTime = performance.now() - startTime;
1340
+ const consumer = getConsumer(ctx);
1341
+ client.consumerRegistry.addOrUpdateConsumer(consumer);
1342
+ if (!path) {
1343
+ path = getPath(ctx);
1344
+ }
1345
+ if (path) {
1346
+ try {
1347
+ client.requestCounter.addRequest({
1348
+ consumer: consumer == null ? void 0 : consumer.identifier,
1349
+ method: ctx.request.method,
1350
+ path,
1351
+ statusCode: statusCode || ctx.response.status,
1352
+ responseTime,
1353
+ requestSize: ctx.request.length,
1354
+ responseSize: ctx.response.length
1355
+ });
1356
+ } catch (error) {
1357
+ client.logger.error("Error while logging request in Apitally middleware.", {
1358
+ context: ctx,
1359
+ error
1360
+ });
1361
+ }
1362
+ }
1363
+ if (client.requestLogger.enabled) {
1364
+ const logs = logsContext.getStore();
1365
+ client.requestLogger.logRequest({
1366
+ timestamp: Date.now() / 1e3,
1367
+ method: ctx.request.method,
1368
+ path,
1369
+ url: ctx.request.href,
1370
+ headers: convertHeaders(ctx.request.headers),
1371
+ size: ctx.request.length,
1372
+ consumer: consumer == null ? void 0 : consumer.identifier,
1373
+ body: convertBody(ctx.request.body, ctx.request.get("content-type"))
1374
+ }, {
1375
+ statusCode: statusCode || ctx.response.status,
1376
+ responseTime: responseTime / 1e3,
1377
+ headers: convertHeaders(ctx.response.headers),
1378
+ size: ctx.response.length,
1379
+ body: convertBody(ctx.response.body, ctx.response.get("content-type"))
1380
+ }, serverError, logs);
1381
+ }
1191
1382
  }
1192
- if (client.requestLogger.enabled) {
1193
- client.requestLogger.logRequest({
1194
- timestamp: Date.now() / 1e3,
1195
- method: ctx.request.method,
1196
- path,
1197
- url: ctx.request.href,
1198
- headers: convertHeaders(ctx.request.headers),
1199
- size: ctx.request.length,
1200
- consumer: consumer == null ? void 0 : consumer.identifier,
1201
- body: convertBody(ctx.request.body, ctx.request.get("content-type"))
1202
- }, {
1203
- statusCode: statusCode || ctx.response.status,
1204
- responseTime: responseTime / 1e3,
1205
- headers: convertHeaders(ctx.response.headers),
1206
- size: ctx.response.length,
1207
- body: convertBody(ctx.response.body, ctx.response.get("content-type"))
1208
- }, serverError);
1209
- }
1210
- }
1383
+ });
1211
1384
  };
1212
1385
  }
1213
1386
  __name(getMiddleware, "getMiddleware");