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
@@ -212,9 +212,9 @@ var _TempGzipFile = class _TempGzipFile {
212
212
  this.writeStream.once("ready", resolve);
213
213
  this.writeStream.once("error", reject);
214
214
  });
215
- this.closedPromise = new Promise((resolve) => {
215
+ this.closedPromise = new Promise((resolve, reject) => {
216
216
  this.writeStream.once("close", resolve);
217
- this.writeStream.once("error", resolve);
217
+ this.writeStream.once("error", reject);
218
218
  });
219
219
  this.gzip = createGzip();
220
220
  this.gzip.pipe(this.writeStream);
@@ -364,7 +364,10 @@ var _RequestLogger = class _RequestLogger {
364
364
  hasSupportedContentType(headers) {
365
365
  var _a2;
366
366
  const contentType = (_a2 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a2[1];
367
- return contentType !== void 0 && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
367
+ return this.isSupportedContentType(contentType);
368
+ }
369
+ isSupportedContentType(contentType) {
370
+ return typeof contentType === "string" && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
368
371
  }
369
372
  maskQueryParams(search) {
370
373
  const params = new URLSearchParams(search);
@@ -392,8 +395,6 @@ var _RequestLogger = class _RequestLogger {
392
395
  }
393
396
  url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
394
397
  request.url = url.toString();
395
- request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
396
- response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
397
398
  if (!this.config.logRequestBody || !this.hasSupportedContentType(request.headers)) {
398
399
  request.body = void 0;
399
400
  } else if (request.body) {
@@ -426,6 +427,8 @@ var _RequestLogger = class _RequestLogger {
426
427
  }
427
428
  }
428
429
  }
430
+ request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
431
+ response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
429
432
  const item = {
430
433
  uuid: randomUUID2(),
431
434
  request: skipEmptyValues(request),
@@ -762,6 +765,7 @@ var _ApitallyClient = class _ApitallyClient {
762
765
  syncIntervalId;
763
766
  startupData;
764
767
  startupDataSent = false;
768
+ enabled = true;
765
769
  requestCounter;
766
770
  requestLogger;
767
771
  validationErrorCounter;
@@ -798,12 +802,16 @@ var _ApitallyClient = class _ApitallyClient {
798
802
  }
799
803
  return _ApitallyClient.instance;
800
804
  }
805
+ isEnabled() {
806
+ return this.enabled;
807
+ }
801
808
  static async shutdown() {
802
809
  if (_ApitallyClient.instance) {
803
810
  await _ApitallyClient.instance.handleShutdown();
804
811
  }
805
812
  }
806
813
  async handleShutdown() {
814
+ this.enabled = false;
807
815
  this.stopSync();
808
816
  await this.sendSyncData();
809
817
  await this.sendLogData();
@@ -903,7 +911,7 @@ var _ApitallyClient = class _ApitallyClient {
903
911
  async sendSyncData() {
904
912
  this.logger.debug("Synchronizing data with Apitally Hub");
905
913
  const newPayload = {
906
- time_offset: 0,
914
+ timestamp: Date.now() / 1e3,
907
915
  instance_uuid: this.instanceUuid,
908
916
  message_uuid: randomUUID3(),
909
917
  requests: this.requestCounter.getAndResetRequests(),
@@ -911,22 +919,16 @@ var _ApitallyClient = class _ApitallyClient {
911
919
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
912
920
  consumers: this.consumerRegistry.getAndResetUpdatedConsumers()
913
921
  };
914
- this.syncDataQueue.push([
915
- Date.now(),
916
- newPayload
917
- ]);
922
+ this.syncDataQueue.push(newPayload);
918
923
  let i = 0;
919
924
  while (this.syncDataQueue.length > 0) {
920
- const queueItem = this.syncDataQueue.shift();
921
- if (queueItem) {
922
- const [time, payload] = queueItem;
925
+ const payload = this.syncDataQueue.shift();
926
+ if (payload) {
923
927
  try {
924
- const timeOffset = Date.now() - time;
925
- if (timeOffset <= MAX_QUEUE_TIME) {
928
+ if (Date.now() - payload.timestamp * 1e3 <= MAX_QUEUE_TIME) {
926
929
  if (i > 0) {
927
930
  await this.randomDelay();
928
931
  }
929
- payload.time_offset = timeOffset / 1e3;
930
932
  await this.sendData("sync", payload);
931
933
  i += 1;
932
934
  }
@@ -936,7 +938,7 @@ var _ApitallyClient = class _ApitallyClient {
936
938
  this.logger.debug("Error while synchronizing data with Apitally Hub (will retry)", {
937
939
  error
938
940
  });
939
- this.syncDataQueue.push(queueItem);
941
+ this.syncDataQueue.push(payload);
940
942
  break;
941
943
  }
942
944
  }
@@ -993,6 +995,7 @@ var _ApitallyClient = class _ApitallyClient {
993
995
  if (error instanceof HTTPError) {
994
996
  if (error.response.status === 404) {
995
997
  this.logger.error(`Invalid Apitally client ID: '${this.clientId}'`);
998
+ this.enabled = false;
996
999
  this.stopSync();
997
1000
  return true;
998
1001
  }
@@ -1004,7 +1007,7 @@ var _ApitallyClient = class _ApitallyClient {
1004
1007
  return false;
1005
1008
  }
1006
1009
  async randomDelay() {
1007
- const delay = 100 + Math.random() * 200;
1010
+ const delay = 100 + Math.random() * 400;
1008
1011
  await new Promise((resolve) => setTimeout(resolve, delay));
1009
1012
  }
1010
1013
  };
@@ -1167,6 +1170,10 @@ var useApitally = /* @__PURE__ */ __name((app, config) => {
1167
1170
  var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1168
1171
  let errorHandlerConfigured = false;
1169
1172
  return (req, res, next) => {
1173
+ if (!client.isEnabled()) {
1174
+ next();
1175
+ return;
1176
+ }
1170
1177
  if (!errorHandlerConfigured) {
1171
1178
  app.use((err, req2, res2, next2) => {
1172
1179
  res2.locals.serverError = err;
@@ -1178,7 +1185,10 @@ var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1178
1185
  const startTime = performance.now();
1179
1186
  const originalSend = res.send;
1180
1187
  res.send = (body) => {
1181
- res.locals.body = body;
1188
+ const contentType = res.get("content-type");
1189
+ if (client.requestLogger.isSupportedContentType(contentType)) {
1190
+ res.locals.body = body;
1191
+ }
1182
1192
  return originalSend.call(res, body);
1183
1193
  };
1184
1194
  res.on("finish", () => {