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
@@ -238,9 +238,9 @@ var _TempGzipFile = class _TempGzipFile {
238
238
  this.writeStream.once("ready", resolve);
239
239
  this.writeStream.once("error", reject);
240
240
  });
241
- this.closedPromise = new Promise((resolve) => {
241
+ this.closedPromise = new Promise((resolve, reject) => {
242
242
  this.writeStream.once("close", resolve);
243
- this.writeStream.once("error", resolve);
243
+ this.writeStream.once("error", reject);
244
244
  });
245
245
  this.gzip = (0, import_zlib.createGzip)();
246
246
  this.gzip.pipe(this.writeStream);
@@ -390,7 +390,10 @@ var _RequestLogger = class _RequestLogger {
390
390
  hasSupportedContentType(headers) {
391
391
  var _a2;
392
392
  const contentType = (_a2 = headers.find(([k]) => k.toLowerCase() === "content-type")) == null ? void 0 : _a2[1];
393
- return contentType !== void 0 && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
393
+ return this.isSupportedContentType(contentType);
394
+ }
395
+ isSupportedContentType(contentType) {
396
+ return typeof contentType === "string" && ALLOWED_CONTENT_TYPES.some((t) => contentType.startsWith(t));
394
397
  }
395
398
  maskQueryParams(search) {
396
399
  const params = new URLSearchParams(search);
@@ -418,8 +421,6 @@ var _RequestLogger = class _RequestLogger {
418
421
  }
419
422
  url.search = this.config.logQueryParams ? this.maskQueryParams(url.search) : "";
420
423
  request.url = url.toString();
421
- request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
422
- response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
423
424
  if (!this.config.logRequestBody || !this.hasSupportedContentType(request.headers)) {
424
425
  request.body = void 0;
425
426
  } else if (request.body) {
@@ -452,6 +453,8 @@ var _RequestLogger = class _RequestLogger {
452
453
  }
453
454
  }
454
455
  }
456
+ request.headers = this.config.logRequestHeaders ? this.maskHeaders(request.headers) : [];
457
+ response.headers = this.config.logResponseHeaders ? this.maskHeaders(response.headers) : [];
455
458
  const item = {
456
459
  uuid: (0, import_crypto2.randomUUID)(),
457
460
  request: skipEmptyValues(request),
@@ -788,6 +791,7 @@ var _ApitallyClient = class _ApitallyClient {
788
791
  syncIntervalId;
789
792
  startupData;
790
793
  startupDataSent = false;
794
+ enabled = true;
791
795
  requestCounter;
792
796
  requestLogger;
793
797
  validationErrorCounter;
@@ -824,12 +828,16 @@ var _ApitallyClient = class _ApitallyClient {
824
828
  }
825
829
  return _ApitallyClient.instance;
826
830
  }
831
+ isEnabled() {
832
+ return this.enabled;
833
+ }
827
834
  static async shutdown() {
828
835
  if (_ApitallyClient.instance) {
829
836
  await _ApitallyClient.instance.handleShutdown();
830
837
  }
831
838
  }
832
839
  async handleShutdown() {
840
+ this.enabled = false;
833
841
  this.stopSync();
834
842
  await this.sendSyncData();
835
843
  await this.sendLogData();
@@ -929,7 +937,7 @@ var _ApitallyClient = class _ApitallyClient {
929
937
  async sendSyncData() {
930
938
  this.logger.debug("Synchronizing data with Apitally Hub");
931
939
  const newPayload = {
932
- time_offset: 0,
940
+ timestamp: Date.now() / 1e3,
933
941
  instance_uuid: this.instanceUuid,
934
942
  message_uuid: (0, import_crypto5.randomUUID)(),
935
943
  requests: this.requestCounter.getAndResetRequests(),
@@ -937,22 +945,16 @@ var _ApitallyClient = class _ApitallyClient {
937
945
  server_errors: this.serverErrorCounter.getAndResetServerErrors(),
938
946
  consumers: this.consumerRegistry.getAndResetUpdatedConsumers()
939
947
  };
940
- this.syncDataQueue.push([
941
- Date.now(),
942
- newPayload
943
- ]);
948
+ this.syncDataQueue.push(newPayload);
944
949
  let i = 0;
945
950
  while (this.syncDataQueue.length > 0) {
946
- const queueItem = this.syncDataQueue.shift();
947
- if (queueItem) {
948
- const [time, payload] = queueItem;
951
+ const payload = this.syncDataQueue.shift();
952
+ if (payload) {
949
953
  try {
950
- const timeOffset = Date.now() - time;
951
- if (timeOffset <= MAX_QUEUE_TIME) {
954
+ if (Date.now() - payload.timestamp * 1e3 <= MAX_QUEUE_TIME) {
952
955
  if (i > 0) {
953
956
  await this.randomDelay();
954
957
  }
955
- payload.time_offset = timeOffset / 1e3;
956
958
  await this.sendData("sync", payload);
957
959
  i += 1;
958
960
  }
@@ -962,7 +964,7 @@ var _ApitallyClient = class _ApitallyClient {
962
964
  this.logger.debug("Error while synchronizing data with Apitally Hub (will retry)", {
963
965
  error
964
966
  });
965
- this.syncDataQueue.push(queueItem);
967
+ this.syncDataQueue.push(payload);
966
968
  break;
967
969
  }
968
970
  }
@@ -1019,6 +1021,7 @@ var _ApitallyClient = class _ApitallyClient {
1019
1021
  if (error instanceof HTTPError) {
1020
1022
  if (error.response.status === 404) {
1021
1023
  this.logger.error(`Invalid Apitally client ID: '${this.clientId}'`);
1024
+ this.enabled = false;
1022
1025
  this.stopSync();
1023
1026
  return true;
1024
1027
  }
@@ -1030,7 +1033,7 @@ var _ApitallyClient = class _ApitallyClient {
1030
1033
  return false;
1031
1034
  }
1032
1035
  async randomDelay() {
1033
- const delay = 100 + Math.random() * 200;
1036
+ const delay = 100 + Math.random() * 400;
1034
1037
  await new Promise((resolve) => setTimeout(resolve, delay));
1035
1038
  }
1036
1039
  };
@@ -1194,6 +1197,10 @@ var useApitally = /* @__PURE__ */ __name((app, config) => {
1194
1197
  var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1195
1198
  let errorHandlerConfigured = false;
1196
1199
  return (req, res, next) => {
1200
+ if (!client.isEnabled()) {
1201
+ next();
1202
+ return;
1203
+ }
1197
1204
  if (!errorHandlerConfigured) {
1198
1205
  app.use((err, req2, res2, next2) => {
1199
1206
  res2.locals.serverError = err;
@@ -1205,7 +1212,10 @@ var getMiddleware = /* @__PURE__ */ __name((app, client) => {
1205
1212
  const startTime = import_perf_hooks.performance.now();
1206
1213
  const originalSend = res.send;
1207
1214
  res.send = (body) => {
1208
- res.locals.body = body;
1215
+ const contentType = res.get("content-type");
1216
+ if (client.requestLogger.isSupportedContentType(contentType)) {
1217
+ res.locals.body = body;
1218
+ }
1209
1219
  return originalSend.call(res, body);
1210
1220
  };
1211
1221
  res.on("finish", () => {