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
@@ -216,9 +216,9 @@ var _TempGzipFile = class _TempGzipFile {
216
216
  this.writeStream.once("ready", resolve);
217
217
  this.writeStream.once("error", reject);
218
218
  });
219
- this.closedPromise = new Promise((resolve) => {
219
+ this.closedPromise = new Promise((resolve, reject) => {
220
220
  this.writeStream.once("close", resolve);
221
- this.writeStream.once("error", resolve);
221
+ this.writeStream.once("error", reject);
222
222
  });
223
223
  this.gzip = createGzip();
224
224
  this.gzip.pipe(this.writeStream);
@@ -368,7 +368,10 @@ var _RequestLogger = class _RequestLogger {
368
368
  hasSupportedContentType(headers) {
369
369
  var _a3;
370
370
  const contentType = (_a3 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a3[1];
371
- return contentType !== void 0 && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
371
+ return this.isSupportedContentType(contentType);
372
+ }
373
+ isSupportedContentType(contentType) {
374
+ return typeof contentType === "string" && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
372
375
  }
373
376
  maskQueryParams(search) {
374
377
  const params = new URLSearchParams(search);
@@ -396,8 +399,6 @@ var _RequestLogger = class _RequestLogger {
396
399
  }
397
400
  url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
398
401
  request.url = url.toString();
399
- request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
400
- response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
401
402
  if (!this.config.logRequestBody || !this.hasSupportedContentType(request.headers)) {
402
403
  request.body = void 0;
403
404
  } else if (request.body) {
@@ -430,6 +431,8 @@ var _RequestLogger = class _RequestLogger {
430
431
  }
431
432
  }
432
433
  }
434
+ request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
435
+ response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
433
436
  const item = {
434
437
  uuid: randomUUID2(),
435
438
  request: skipEmptyValues(request),
@@ -766,6 +769,7 @@ var _ApitallyClient = class _ApitallyClient {
766
769
  syncIntervalId;
767
770
  startupData;
768
771
  startupDataSent = false;
772
+ enabled = true;
769
773
  requestCounter;
770
774
  requestLogger;
771
775
  validationErrorCounter;
@@ -802,12 +806,16 @@ var _ApitallyClient = class _ApitallyClient {
802
806
  }
803
807
  return _ApitallyClient.instance;
804
808
  }
809
+ isEnabled() {
810
+ return this.enabled;
811
+ }
805
812
  static async shutdown() {
806
813
  if (_ApitallyClient.instance) {
807
814
  await _ApitallyClient.instance.handleShutdown();
808
815
  }
809
816
  }
810
817
  async handleShutdown() {
818
+ this.enabled = false;
811
819
  this.stopSync();
812
820
  await this.sendSyncData();
813
821
  await this.sendLogData();
@@ -907,7 +915,7 @@ var _ApitallyClient = class _ApitallyClient {
907
915
  async sendSyncData() {
908
916
  this.logger.debug("Synchronizing data with Apitally Hub");
909
917
  const newPayload = {
910
- time_offset: 0,
918
+ timestamp: Date.now() / 1e3,
911
919
  instance_uuid: this.instanceUuid,
912
920
  message_uuid: randomUUID3(),
913
921
  requests: this.requestCounter.getAndResetRequests(),
@@ -915,22 +923,16 @@ var _ApitallyClient = class _ApitallyClient {
915
923
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
916
924
  consumers: this.consumerRegistry.getAndResetUpdatedConsumers()
917
925
  };
918
- this.syncDataQueue.push([
919
- Date.now(),
920
- newPayload
921
- ]);
926
+ this.syncDataQueue.push(newPayload);
922
927
  let i = 0;
923
928
  while (this.syncDataQueue.length > 0) {
924
- const queueItem = this.syncDataQueue.shift();
925
- if (queueItem) {
926
- const [time, payload] = queueItem;
929
+ const payload = this.syncDataQueue.shift();
930
+ if (payload) {
927
931
  try {
928
- const timeOffset = Date.now() - time;
929
- if (timeOffset <= MAX_QUEUE_TIME) {
932
+ if (Date.now() - payload.timestamp * 1e3 <= MAX_QUEUE_TIME) {
930
933
  if (i > 0) {
931
934
  await this.randomDelay();
932
935
  }
933
- payload.time_offset = timeOffset / 1e3;
934
936
  await this.sendData("sync", payload);
935
937
  i += 1;
936
938
  }
@@ -940,7 +942,7 @@ var _ApitallyClient = class _ApitallyClient {
940
942
  this.logger.debug("Error while synchronizing data with Apitally Hub (will retry)", {
941
943
  error
942
944
  });
943
- this.syncDataQueue.push(queueItem);
945
+ this.syncDataQueue.push(payload);
944
946
  break;
945
947
  }
946
948
  }
@@ -997,6 +999,7 @@ var _ApitallyClient = class _ApitallyClient {
997
999
  if (error instanceof HTTPError) {
998
1000
  if (error.response.status === 404) {
999
1001
  this.logger.error(`Invalid Apitally client ID: '${this.clientId}'`);
1002
+ this.enabled = false;
1000
1003
  this.stopSync();
1001
1004
  return true;
1002
1005
  }
@@ -1008,7 +1011,7 @@ var _ApitallyClient = class _ApitallyClient {
1008
1011
  return false;
1009
1012
  }
1010
1013
  async randomDelay() {
1011
- const delay = 100 + Math.random() * 200;
1014
+ const delay = 100 + Math.random() * 400;
1012
1015
  await new Promise((resolve) => setTimeout(resolve, delay));
1013
1016
  }
1014
1017
  };
@@ -1171,6 +1174,10 @@ var useApitally = /* @__PURE__ */ __name((app, config) => {
1171
1174
  var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1172
1175
  let errorHandlerConfigured = false;
1173
1176
  return (req, res, next) => {
1177
+ if (!client.isEnabled()) {
1178
+ next();
1179
+ return;
1180
+ }
1174
1181
  if (!errorHandlerConfigured) {
1175
1182
  app.use((err, req2, res2, next2) => {
1176
1183
  res2.locals.serverError = err;
@@ -1182,7 +1189,10 @@ var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1182
1189
  const startTime = performance.now();
1183
1190
  const originalSend = res.send;
1184
1191
  res.send = (body) => {
1185
- res.locals.body = body;
1192
+ const contentType = res.get("content-type");
1193
+ if (client.requestLogger.isSupportedContentType(contentType)) {
1194
+ res.locals.body = body;
1195
+ }
1186
1196
  return originalSend.call(res, body);
1187
1197
  };
1188
1198
  res.on("finish", () => {