apitally 0.11.3 → 0.11.5

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 (73) hide show
  1. package/README.md +25 -12
  2. package/dist/common/client.cjs +21 -18
  3. package/dist/common/client.cjs.map +1 -1
  4. package/dist/common/client.d.cts +2 -0
  5. package/dist/common/client.d.ts +2 -0
  6. package/dist/common/client.js +21 -18
  7. package/dist/common/client.js.map +1 -1
  8. package/dist/common/consumerRegistry.cjs.map +1 -1
  9. package/dist/common/consumerRegistry.js.map +1 -1
  10. package/dist/common/logging.cjs.map +1 -1
  11. package/dist/common/logging.js.map +1 -1
  12. package/dist/common/packageVersions.cjs.map +1 -1
  13. package/dist/common/packageVersions.js.map +1 -1
  14. package/dist/common/paramValidation.cjs.map +1 -1
  15. package/dist/common/paramValidation.js.map +1 -1
  16. package/dist/common/requestCounter.cjs.map +1 -1
  17. package/dist/common/requestCounter.js.map +1 -1
  18. package/dist/common/requestLogger.cjs +8 -5
  19. package/dist/common/requestLogger.cjs.map +1 -1
  20. package/dist/common/requestLogger.d.cts +1 -0
  21. package/dist/common/requestLogger.d.ts +1 -0
  22. package/dist/common/requestLogger.js +8 -5
  23. package/dist/common/requestLogger.js.map +1 -1
  24. package/dist/common/serverErrorCounter.cjs.map +1 -1
  25. package/dist/common/serverErrorCounter.js.map +1 -1
  26. package/dist/common/tempGzipFile.cjs +2 -2
  27. package/dist/common/tempGzipFile.cjs.map +1 -1
  28. package/dist/common/tempGzipFile.js +2 -2
  29. package/dist/common/tempGzipFile.js.map +1 -1
  30. package/dist/common/types.cjs.map +1 -1
  31. package/dist/common/types.d.cts +1 -1
  32. package/dist/common/types.d.ts +1 -1
  33. package/dist/common/validationErrorCounter.cjs.map +1 -1
  34. package/dist/common/validationErrorCounter.js.map +1 -1
  35. package/dist/express/index.cjs +29 -19
  36. package/dist/express/index.cjs.map +1 -1
  37. package/dist/express/index.js +29 -19
  38. package/dist/express/index.js.map +1 -1
  39. package/dist/express/middleware.cjs +29 -19
  40. package/dist/express/middleware.cjs.map +1 -1
  41. package/dist/express/middleware.js +29 -19
  42. package/dist/express/middleware.js.map +1 -1
  43. package/dist/express/utils.cjs.map +1 -1
  44. package/dist/express/utils.js.map +1 -1
  45. package/dist/fastify/index.cjs +26 -20
  46. package/dist/fastify/index.cjs.map +1 -1
  47. package/dist/fastify/index.js +26 -20
  48. package/dist/fastify/index.js.map +1 -1
  49. package/dist/fastify/plugin.cjs +26 -20
  50. package/dist/fastify/plugin.cjs.map +1 -1
  51. package/dist/fastify/plugin.js +26 -20
  52. package/dist/fastify/plugin.js.map +1 -1
  53. package/dist/hono/index.cjs +27 -19
  54. package/dist/hono/index.cjs.map +1 -1
  55. package/dist/hono/index.js +27 -19
  56. package/dist/hono/index.js.map +1 -1
  57. package/dist/hono/middleware.cjs +27 -19
  58. package/dist/hono/middleware.cjs.map +1 -1
  59. package/dist/hono/middleware.js +27 -19
  60. package/dist/hono/middleware.js.map +1 -1
  61. package/dist/koa/index.cjs +25 -18
  62. package/dist/koa/index.cjs.map +1 -1
  63. package/dist/koa/index.js +25 -18
  64. package/dist/koa/index.js.map +1 -1
  65. package/dist/koa/middleware.cjs +25 -18
  66. package/dist/koa/middleware.cjs.map +1 -1
  67. package/dist/koa/middleware.js +25 -18
  68. package/dist/koa/middleware.js.map +1 -1
  69. package/dist/nestjs/index.cjs +29 -19
  70. package/dist/nestjs/index.cjs.map +1 -1
  71. package/dist/nestjs/index.js +29 -19
  72. package/dist/nestjs/index.js.map +1 -1
  73. package/package.json +1 -1
@@ -242,9 +242,9 @@ var _TempGzipFile = class _TempGzipFile {
242
242
  this.writeStream.once("ready", resolve);
243
243
  this.writeStream.once("error", reject);
244
244
  });
245
- this.closedPromise = new Promise((resolve) => {
245
+ this.closedPromise = new Promise((resolve, reject) => {
246
246
  this.writeStream.once("close", resolve);
247
- this.writeStream.once("error", resolve);
247
+ this.writeStream.once("error", reject);
248
248
  });
249
249
  this.gzip = (0, import_zlib.createGzip)();
250
250
  this.gzip.pipe(this.writeStream);
@@ -394,7 +394,10 @@ var _RequestLogger = class _RequestLogger {
394
394
  hasSupportedContentType(headers) {
395
395
  var _a3;
396
396
  const contentType = (_a3 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a3[1];
397
- return contentType !== void 0 && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
397
+ return this.isSupportedContentType(contentType);
398
+ }
399
+ isSupportedContentType(contentType) {
400
+ return typeof contentType === "string" && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
398
401
  }
399
402
  maskQueryParams(search) {
400
403
  const params = new URLSearchParams(search);
@@ -422,8 +425,6 @@ var _RequestLogger = class _RequestLogger {
422
425
  }
423
426
  url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
424
427
  request.url = url.toString();
425
- request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
426
- response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
427
428
  if (!this.config.logRequestBody || !this.hasSupportedContentType(request.headers)) {
428
429
  request.body = void 0;
429
430
  } else if (request.body) {
@@ -456,6 +457,8 @@ var _RequestLogger = class _RequestLogger {
456
457
  }
457
458
  }
458
459
  }
460
+ request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
461
+ response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
459
462
  const item = {
460
463
  uuid: (0, import_crypto2.randomUUID)(),
461
464
  request: skipEmptyValues(request),
@@ -792,6 +795,7 @@ var _ApitallyClient = class _ApitallyClient {
792
795
  syncIntervalId;
793
796
  startupData;
794
797
  startupDataSent = false;
798
+ enabled = true;
795
799
  requestCounter;
796
800
  requestLogger;
797
801
  validationErrorCounter;
@@ -828,12 +832,16 @@ var _ApitallyClient = class _ApitallyClient {
828
832
  }
829
833
  return _ApitallyClient.instance;
830
834
  }
835
+ isEnabled() {
836
+ return this.enabled;
837
+ }
831
838
  static async shutdown() {
832
839
  if (_ApitallyClient.instance) {
833
840
  await _ApitallyClient.instance.handleShutdown();
834
841
  }
835
842
  }
836
843
  async handleShutdown() {
844
+ this.enabled = false;
837
845
  this.stopSync();
838
846
  await this.sendSyncData();
839
847
  await this.sendLogData();
@@ -933,7 +941,7 @@ var _ApitallyClient = class _ApitallyClient {
933
941
  async sendSyncData() {
934
942
  this.logger.debug("Synchronizing data with Apitally Hub");
935
943
  const newPayload = {
936
- time_offset: 0,
944
+ timestamp: Date.now() / 1e3,
937
945
  instance_uuid: this.instanceUuid,
938
946
  message_uuid: (0, import_crypto5.randomUUID)(),
939
947
  requests: this.requestCounter.getAndResetRequests(),
@@ -941,22 +949,16 @@ var _ApitallyClient = class _ApitallyClient {
941
949
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
942
950
  consumers: this.consumerRegistry.getAndResetUpdatedConsumers()
943
951
  };
944
- this.syncDataQueue.push([
945
- Date.now(),
946
- newPayload
947
- ]);
952
+ this.syncDataQueue.push(newPayload);
948
953
  let i = 0;
949
954
  while (this.syncDataQueue.length > 0) {
950
- const queueItem = this.syncDataQueue.shift();
951
- if (queueItem) {
952
- const [time, payload] = queueItem;
955
+ const payload = this.syncDataQueue.shift();
956
+ if (payload) {
953
957
  try {
954
- const timeOffset = Date.now() - time;
955
- if (timeOffset <= MAX_QUEUE_TIME) {
958
+ if (Date.now() - payload.timestamp * 1e3 <= MAX_QUEUE_TIME) {
956
959
  if (i > 0) {
957
960
  await this.randomDelay();
958
961
  }
959
- payload.time_offset = timeOffset / 1e3;
960
962
  await this.sendData("sync", payload);
961
963
  i += 1;
962
964
  }
@@ -966,7 +968,7 @@ var _ApitallyClient = class _ApitallyClient {
966
968
  this.logger.debug("Error while synchronizing data with Apitally Hub (will retry)", {
967
969
  error
968
970
  });
969
- this.syncDataQueue.push(queueItem);
971
+ this.syncDataQueue.push(payload);
970
972
  break;
971
973
  }
972
974
  }
@@ -1023,6 +1025,7 @@ var _ApitallyClient = class _ApitallyClient {
1023
1025
  if (error instanceof HTTPError) {
1024
1026
  if (error.response.status === 404) {
1025
1027
  this.logger.error(`Invalid Apitally client ID: '${this.clientId}'`);
1028
+ this.enabled = false;
1026
1029
  this.stopSync();
1027
1030
  return true;
1028
1031
  }
@@ -1034,7 +1037,7 @@ var _ApitallyClient = class _ApitallyClient {
1034
1037
  return false;
1035
1038
  }
1036
1039
  async randomDelay() {
1037
- const delay = 100 + Math.random() * 200;
1040
+ const delay = 100 + Math.random() * 400;
1038
1041
  await new Promise((resolve) => setTimeout(resolve, delay));
1039
1042
  }
1040
1043
  };
@@ -1198,6 +1201,10 @@ var useApitally = /* @__PURE__ */ __name((app, config) => {
1198
1201
  var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1199
1202
  let errorHandlerConfigured = false;
1200
1203
  return (req, res, next) => {
1204
+ if (!client.isEnabled()) {
1205
+ next();
1206
+ return;
1207
+ }
1201
1208
  if (!errorHandlerConfigured) {
1202
1209
  app.use((err, req2, res2, next2) => {
1203
1210
  res2.locals.serverError = err;
@@ -1209,7 +1216,10 @@ var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1209
1216
  const startTime = import_perf_hooks.performance.now();
1210
1217
  const originalSend = res.send;
1211
1218
  res.send = (body) => {
1212
- res.locals.body = body;
1219
+ const contentType = res.get("content-type");
1220
+ if (client.requestLogger.isSupportedContentType(contentType)) {
1221
+ res.locals.body = body;
1222
+ }
1213
1223
  return originalSend.call(res, body);
1214
1224
  };
1215
1225
  res.on("finish", () => {