kuzzle 2.44.0 → 2.46.0-beta.1

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 (45) hide show
  1. package/check-node-version.js +1 -0
  2. package/lib/api/controllers/adminController.js +2 -1
  3. package/lib/api/controllers/authController.d.ts +1 -0
  4. package/lib/api/controllers/authController.js +2 -1
  5. package/lib/api/controllers/securityController.js +22 -20
  6. package/lib/api/funnel.js +30 -10
  7. package/lib/cluster/command.js +3 -2
  8. package/lib/cluster/idCardHandler.d.ts +1 -0
  9. package/lib/cluster/idCardHandler.js +2 -1
  10. package/lib/cluster/node.js +18 -19
  11. package/lib/cluster/subscriber.js +5 -3
  12. package/lib/core/backend/backend.d.ts +4 -6
  13. package/lib/core/backend/backend.js +25 -23
  14. package/lib/core/cache/cacheEngine.js +3 -1
  15. package/lib/core/network/accessLogger.js +3 -2
  16. package/lib/core/network/entryPoint.js +7 -7
  17. package/lib/core/network/protocols/httpwsProtocol.js +7 -7
  18. package/lib/core/network/protocols/mqttProtocol.js +3 -2
  19. package/lib/core/network/router.js +4 -3
  20. package/lib/core/plugin/pluginContext.d.ts +5 -0
  21. package/lib/core/plugin/pluginContext.js +8 -6
  22. package/lib/core/plugin/pluginsManager.js +13 -5
  23. package/lib/core/realtime/hotelClerk.d.ts +1 -0
  24. package/lib/core/realtime/hotelClerk.js +4 -3
  25. package/lib/core/realtime/notifier.js +2 -1
  26. package/lib/core/security/roleRepository.js +3 -2
  27. package/lib/core/security/securityLoader.js +5 -7
  28. package/lib/core/shared/store.d.ts +1 -0
  29. package/lib/core/shared/store.js +2 -1
  30. package/lib/core/statistics/statistics.js +3 -1
  31. package/lib/core/storage/storageEngine.js +6 -1
  32. package/lib/core/validation/validation.js +6 -5
  33. package/lib/kuzzle/Logger.d.ts +1 -1
  34. package/lib/kuzzle/Logger.js +7 -7
  35. package/lib/kuzzle/dumpGenerator.js +17 -16
  36. package/lib/kuzzle/internalIndexHandler.js +3 -1
  37. package/lib/kuzzle/kuzzle.js +6 -8
  38. package/lib/service/cache/redis.js +4 -0
  39. package/lib/service/storage/7/elasticsearch.d.ts +1 -0
  40. package/lib/service/storage/7/elasticsearch.js +11 -4
  41. package/lib/service/storage/8/elasticsearch.d.ts +1 -0
  42. package/lib/service/storage/8/elasticsearch.js +11 -4
  43. package/lib/service/storage/Elasticsearch.d.ts +1 -0
  44. package/lib/service/storage/Elasticsearch.js +1 -1
  45. package/package.json +19 -19
@@ -36,6 +36,7 @@ const kerror = require("../kerror");
36
36
  class DumpGenerator {
37
37
  constructor() {
38
38
  this._dump = false;
39
+ this.logger = global.kuzzle.log.child("dump:dumpGenerator");
39
40
  }
40
41
 
41
42
  /**
@@ -59,8 +60,8 @@ class DumpGenerator {
59
60
  .substring(0, 200),
60
61
  );
61
62
 
62
- global.kuzzle.log.info("=".repeat(79));
63
- global.kuzzle.log.info(`Generating dump in ${dumpPath}`);
63
+ this.logger.info("=".repeat(79));
64
+ this.logger.info(`Generating dump in ${dumpPath}`);
64
65
  this._cleanUpHistory();
65
66
  try {
66
67
  fs.mkdirSync(dumpPath, { recursive: true });
@@ -69,12 +70,12 @@ class DumpGenerator {
69
70
  ? "Dump directory already exists. Skipping.."
70
71
  : `Unable to create dump folder: ${e.message}`;
71
72
 
72
- global.kuzzle.log.error(message);
73
+ this.logger.error(message);
73
74
  throw new Error(message);
74
75
  }
75
76
 
76
77
  // dump kuzzle information
77
- global.kuzzle.log.info("> dumping kuzzle configuration");
78
+ this.logger.info("> dumping kuzzle configuration");
78
79
  fs.writeFileSync(
79
80
  path.join(dumpPath, "kuzzle.json"),
80
81
  JSON.stringify(
@@ -88,7 +89,7 @@ class DumpGenerator {
88
89
  );
89
90
 
90
91
  // dump plugins configuration
91
- global.kuzzle.log.info("> dumping plugins configuration");
92
+ this.logger.info("> dumping plugins configuration");
92
93
  fs.writeFileSync(
93
94
  path.join(dumpPath, "plugins.json"),
94
95
  JSON.stringify(
@@ -99,7 +100,7 @@ class DumpGenerator {
99
100
  );
100
101
 
101
102
  // dump Node.js configuration
102
- global.kuzzle.log.info("> dumping Node.js configuration");
103
+ this.logger.info("> dumping Node.js configuration");
103
104
  fs.writeFileSync(
104
105
  path.join(dumpPath, "nodejs.json"),
105
106
  JSON.stringify(
@@ -117,7 +118,7 @@ class DumpGenerator {
117
118
  );
118
119
 
119
120
  // dump os configuration
120
- global.kuzzle.log.info("> dumping os configuration");
121
+ this.logger.info("> dumping os configuration");
121
122
  fs.writeFileSync(
122
123
  path.join(dumpPath, "os.json"),
123
124
  JSON.stringify(
@@ -138,7 +139,7 @@ class DumpGenerator {
138
139
  );
139
140
 
140
141
  // core-dump
141
- global.kuzzle.log.info("> generating core-dump");
142
+ this.logger.info("> generating core-dump");
142
143
  dumpme(global.kuzzle.config.dump.gcore || "gcore", `${dumpPath}/core`);
143
144
 
144
145
  // Gzip the core
@@ -158,7 +159,7 @@ class DumpGenerator {
158
159
  try {
159
160
  fs.unlinkSync(corefiles[0]);
160
161
  } catch (e) {
161
- global.kuzzle.log.warn(
162
+ this.logger.warn(
162
163
  `> unable to clean up core file ${corefiles[0]}`,
163
164
  );
164
165
  }
@@ -166,18 +167,18 @@ class DumpGenerator {
166
167
  }),
167
168
  );
168
169
  } else {
169
- global.kuzzle.log.warn("> could not generate dump");
170
+ this.logger.warn("> could not generate dump");
170
171
  }
171
172
  } catch (error) {
172
- global.kuzzle.log.error(error);
173
+ this.logger.error(error);
173
174
  }
174
175
 
175
176
  // copy node binary
176
- global.kuzzle.log.info("> copy node binary");
177
+ this.logger.info("> copy node binary");
177
178
  fs.copyFileSync(process.execPath, path.join(dumpPath, "node"));
178
179
 
179
180
  // dumping Kuzzle's stats
180
- global.kuzzle.log.info("> dumping kuzzle's stats");
181
+ this.logger.info("> dumping kuzzle's stats");
181
182
  const statistics = await global.kuzzle.statistics.getAllStats(
182
183
  new Request({ action: "getAllStats", controller: "statistics" }),
183
184
  );
@@ -187,11 +188,11 @@ class DumpGenerator {
187
188
  JSON.stringify(statistics.hits, null, " ").concat("\n"),
188
189
  );
189
190
 
190
- global.kuzzle.log.info("Done.");
191
- global.kuzzle.log.info(
191
+ this.logger.info("Done.");
192
+ this.logger.info(
192
193
  "[ℹ] You can send the folder to the kuzzle core team at support@kuzzle.io",
193
194
  );
194
- global.kuzzle.log.info("=".repeat(79));
195
+ this.logger.info("=".repeat(79));
195
196
 
196
197
  this._dump = false;
197
198
  return dumpPath;
@@ -92,6 +92,8 @@ class InternalIndexHandler extends Store {
92
92
  this._BOOTSTRAP_DONE_ID = `${this.index}.done`;
93
93
  this._DATAMODEL_VERSION_ID = "internalIndex.dataModelVersion";
94
94
  this._JWT_SECRET_ID = "security.jwt.secret";
95
+
96
+ this.logger = global.kuzzle.log.child("internalIndexHandler");
95
97
  }
96
98
 
97
99
  /**
@@ -219,7 +221,7 @@ class InternalIndexHandler extends Store {
219
221
  );
220
222
  }
221
223
 
222
- global.kuzzle.log.warn(
224
+ this.logger.warn(
223
225
  "[!] Kuzzle is using a generated seed for authentication. This is suitable for development but should NEVER be used in production. See https://docs.kuzzle.io/core/2/guides/getting-started/deploy-your-application/",
224
226
  );
225
227
  }
@@ -73,7 +73,6 @@ const kerror = __importStar(require("../kerror"));
73
73
  const asyncStore_1 = __importDefault(require("../util/asyncStore"));
74
74
  const crypto_1 = require("../util/crypto");
75
75
  const mutex_1 = require("../util/mutex");
76
- const name_generator_1 = require("../util/name-generator");
77
76
  const dumpGenerator_1 = __importDefault(require("./dumpGenerator"));
78
77
  const KuzzleEventEmitter_1 = __importDefault(require("./event/KuzzleEventEmitter"));
79
78
  const internalIndexHandler_1 = __importDefault(require("./internalIndexHandler"));
@@ -152,7 +151,7 @@ class Kuzzle extends KuzzleEventEmitter_1.default {
152
151
  await this.internalIndex.init();
153
152
  await new security_1.default().init();
154
153
  // This will init the cluster module if enabled
155
- this.id = await this.initKuzzleNode();
154
+ await this.initKuzzleNode();
156
155
  this.vault = vault_1.default.load(options.vaultKey, options.secretsFile);
157
156
  await this.validation.init();
158
157
  await this.tokenManager.init();
@@ -165,7 +164,6 @@ class Kuzzle extends KuzzleEventEmitter_1.default {
165
164
  await this.debugger.init();
166
165
  this.pluginsManager.application = application;
167
166
  const pluginImports = await this.pluginsManager.init(options.plugins);
168
- this.log.info(`[✔] Successfully loaded ${this.pluginsManager.loadedPlugins.length} plugins: ${this.pluginsManager.loadedPlugins.join(", ")}`);
169
167
  const imports = lodash_1.default.merge({}, pluginImports, options.import);
170
168
  // Authentification plugins must be loaded before users import to avoid
171
169
  // credentials related error which would prevent Kuzzle from starting
@@ -181,7 +179,7 @@ class Kuzzle extends KuzzleEventEmitter_1.default {
181
179
  await this.pipe("kuzzle:state:live");
182
180
  await this.entryPoint.startListening();
183
181
  await this.pipe("kuzzle:state:ready");
184
- this.log.info(`[✔] Kuzzle ${this.version} is ready (node name: ${this.id})`);
182
+ this.log.info(`[✔] Kuzzle ${this.version} is ready (node name: ${global.nodeId})`);
185
183
  // @deprecated
186
184
  this.emit("core:kuzzleStart", "Kuzzle is ready to accept requests");
187
185
  this._state = kuzzleStateEnum_1.default.RUNNING;
@@ -197,16 +195,13 @@ class Kuzzle extends KuzzleEventEmitter_1.default {
197
195
  * This will init the cluster if it's enabled.
198
196
  */
199
197
  async initKuzzleNode() {
200
- let id;
201
198
  if (this.config.cluster.enabled) {
202
- id = await new cluster_1.default().init();
199
+ await new cluster_1.default().init();
203
200
  this.log.info("[✔] Cluster initialized");
204
201
  }
205
202
  else {
206
- id = name_generator_1.NameGenerator.generateRandomName({ prefix: "knode" });
207
203
  this.log.info("[X] Cluster disabled: single node mode.");
208
204
  }
209
- return id;
210
205
  }
211
206
  /**
212
207
  * Gracefully exits after processing remaining requests
@@ -226,6 +221,9 @@ class Kuzzle extends KuzzleEventEmitter_1.default {
226
221
  await bluebird_1.default.delay(1000);
227
222
  }
228
223
  this.log.info("Halted.");
224
+ // flush both application and Kuzzle core loggers before leaving (Could happen even if some core/application components are not initialized)
225
+ await this?.log?.flush?.();
226
+ await this?.pluginsManager?.application?.log?.flush?.();
229
227
  process.exit(0);
230
228
  }
231
229
  /**
@@ -43,6 +43,10 @@ class Redis extends Service {
43
43
  this.commands = {};
44
44
  this.adapterName = name;
45
45
  this.pingIntervalID = null;
46
+
47
+ this.logger = global.kuzzle.log.child // It means we're in the main Kuzzle process
48
+ ? global.kuzzle.log.child("services:cache:redis")
49
+ : global.kuzzle.log;
46
50
  }
47
51
 
48
52
  /**
@@ -24,6 +24,7 @@ export declare class ES7 {
24
24
  maxScrollDuration: number;
25
25
  scrollTTL: number;
26
26
  _config: any;
27
+ private readonly logger;
27
28
  constructor(config: any, scope?: storeScopeEnum);
28
29
  get scope(): storeScopeEnum;
29
30
  /**
@@ -99,6 +99,7 @@ let esState = esStateEnum.NONE;
99
99
  */
100
100
  class ES7 {
101
101
  constructor(config, scope = storeScopeEnum_1.storeScopeEnum.PUBLIC) {
102
+ this.logger = global.kuzzle.log.child("service:storage:elasticsearch:7");
102
103
  this._config = config;
103
104
  this._scope = scope;
104
105
  this._indexPrefix =
@@ -151,7 +152,7 @@ class ES7 {
151
152
  }
152
153
  if (global.NODE_ENV !== "development" &&
153
154
  this._config.commonMapping.dynamic === "true") {
154
- global.kuzzle.log.warn([
155
+ this.logger.warn([
155
156
  "Your dynamic mapping policy is set to 'true' for new fields.",
156
157
  "Elasticsearch will try to automatically infer mapping for new fields, and those cannot be changed afterward.",
157
158
  'See the "services.storageEngine.commonMapping.dynamic" option in the kuzzlerc configuration file to change this value.',
@@ -2328,6 +2329,9 @@ class ES7 {
2328
2329
  _processExtract(prepareMUpsert, prepareMGet, metadata, document, extractedDocuments, documentsToGet) {
2329
2330
  let extractedDocument;
2330
2331
  if (prepareMUpsert) {
2332
+ if (document.changes !== undefined && document.changes !== null) {
2333
+ delete document.changes._kuzzle_info;
2334
+ }
2331
2335
  extractedDocument = {
2332
2336
  _source: {
2333
2337
  // Do not use destructuring, it's 10x slower
@@ -2337,6 +2341,9 @@ class ES7 {
2337
2341
  };
2338
2342
  }
2339
2343
  else {
2344
+ if (document.body !== undefined && document.body !== null) {
2345
+ delete document.body._kuzzle_info;
2346
+ }
2340
2347
  extractedDocument = {
2341
2348
  // Do not use destructuring, it's 10x slower
2342
2349
  _source: Object.assign({}, metadata, document.body),
@@ -2768,7 +2775,7 @@ class ES7 {
2768
2775
  return;
2769
2776
  }
2770
2777
  esState = esStateEnum.AWAITING;
2771
- global.kuzzle.log.info("[ℹ] Trying to connect to Elasticsearch...");
2778
+ this.logger.info("[ℹ] Trying to connect to Elasticsearch...");
2772
2779
  while (esState !== esStateEnum.OK) {
2773
2780
  try {
2774
2781
  // Wait for at least 1 shard to be initialized
@@ -2776,11 +2783,11 @@ class ES7 {
2776
2783
  wait_for_no_initializing_shards: true,
2777
2784
  });
2778
2785
  if (health.body.number_of_pending_tasks === 0) {
2779
- global.kuzzle.log.info("[✔] Elasticsearch is ready");
2786
+ this.logger.info("[✔] Elasticsearch is ready");
2780
2787
  esState = esStateEnum.OK;
2781
2788
  }
2782
2789
  else {
2783
- global.kuzzle.log.info(`[ℹ] Still waiting for Elasticsearch: ${health.body.number_of_pending_tasks} cluster tasks remaining`);
2790
+ this.logger.info(`[ℹ] Still waiting for Elasticsearch: ${health.body.number_of_pending_tasks} cluster tasks remaining`);
2784
2791
  await bluebird_1.default.delay(1000);
2785
2792
  }
2786
2793
  }
@@ -23,6 +23,7 @@ export declare class ES8 {
23
23
  maxScrollDuration: number;
24
24
  scrollTTL: number;
25
25
  _config: any;
26
+ private readonly logger;
26
27
  constructor(config: any, scope?: storeScopeEnum);
27
28
  get scope(): storeScopeEnum;
28
29
  /**
@@ -99,6 +99,7 @@ let esState = esStateEnum.NONE;
99
99
  */
100
100
  class ES8 {
101
101
  constructor(config, scope = storeScopeEnum_1.storeScopeEnum.PUBLIC) {
102
+ this.logger = global.kuzzle.log.child("service:storage:elasticsearch:8");
102
103
  this._config = config;
103
104
  this._scope = scope;
104
105
  this._indexPrefix =
@@ -151,7 +152,7 @@ class ES8 {
151
152
  }
152
153
  if (global.NODE_ENV !== "development" &&
153
154
  this._config.commonMapping.dynamic === "true") {
154
- global.kuzzle.log.warn([
155
+ this.logger.warn([
155
156
  "Your dynamic mapping policy is set to 'true' for new fields.",
156
157
  "Elasticsearch will try to automatically infer mapping for new fields, and those cannot be changed afterward.",
157
158
  'See the "services.storageEngine.commonMapping.dynamic" option in the kuzzlerc configuration file to change this value.',
@@ -2321,6 +2322,9 @@ class ES8 {
2321
2322
  _processExtract(prepareMUpsert, prepareMGet, metadata, document, extractedDocuments, documentsToGet) {
2322
2323
  let extractedDocument;
2323
2324
  if (prepareMUpsert) {
2325
+ if (document.changes !== undefined && document.changes !== null) {
2326
+ delete document.changes._kuzzle_info;
2327
+ }
2324
2328
  extractedDocument = {
2325
2329
  _source: {
2326
2330
  // Do not use destructuring, it's 10x slower
@@ -2330,6 +2334,9 @@ class ES8 {
2330
2334
  };
2331
2335
  }
2332
2336
  else {
2337
+ if (document.body !== undefined && document.body !== null) {
2338
+ delete document.body._kuzzle_info;
2339
+ }
2333
2340
  extractedDocument = {
2334
2341
  // Do not use destructuring, it's 10x slower
2335
2342
  _source: Object.assign({}, metadata, document.body),
@@ -2758,7 +2765,7 @@ class ES8 {
2758
2765
  return;
2759
2766
  }
2760
2767
  esState = esStateEnum.AWAITING;
2761
- global.kuzzle.log.info("[ℹ] Trying to connect to Elasticsearch...");
2768
+ this.logger.info("[ℹ] Trying to connect to Elasticsearch...");
2762
2769
  while (esState !== esStateEnum.OK) {
2763
2770
  try {
2764
2771
  // Wait for at least 1 shard to be initialized
@@ -2766,11 +2773,11 @@ class ES8 {
2766
2773
  wait_for_no_initializing_shards: true,
2767
2774
  });
2768
2775
  if (health.number_of_pending_tasks === 0) {
2769
- global.kuzzle.log.info("[✔] Elasticsearch is ready");
2776
+ this.logger.info("[✔] Elasticsearch is ready");
2770
2777
  esState = esStateEnum.OK;
2771
2778
  }
2772
2779
  else {
2773
- global.kuzzle.log.info(`[ℹ] Still waiting for Elasticsearch: ${health.number_of_pending_tasks} cluster tasks remaining`);
2780
+ this.logger.info(`[ℹ] Still waiting for Elasticsearch: ${health.number_of_pending_tasks} cluster tasks remaining`);
2774
2781
  await bluebird_1.default.delay(1000);
2775
2782
  }
2776
2783
  }
@@ -2,6 +2,7 @@ import Service from "../service";
2
2
  import { storeScopeEnum } from "../../core/storage/storeScopeEnum";
3
3
  export declare class Elasticsearch extends Service {
4
4
  client: any;
5
+ private readonly logger;
5
6
  constructor(config: any, scope?: storeScopeEnum);
6
7
  static buildClient(config: any, version?: "7" | "8"): any;
7
8
  _initSequence(): Promise<void>;
@@ -13,7 +13,7 @@ const storeScopeEnum_1 = require("../../core/storage/storeScopeEnum");
13
13
  class Elasticsearch extends service_1.default {
14
14
  constructor(config, scope = storeScopeEnum_1.storeScopeEnum.PUBLIC) {
15
15
  super("elasticsearch", config);
16
- global.kuzzle.log.info(`[ℹ] Elasticsearch configuration is set to major version : ${config.majorVersion}`);
16
+ this.logger = global.kuzzle.log.child("service:storage:elasticsearch");
17
17
  if (config.majorVersion === "7") {
18
18
  this.client = new elasticsearch_1.ES7(config, scope);
19
19
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kuzzle",
3
3
  "author": "The Kuzzle Team <support@kuzzle.io>",
4
- "version": "2.44.0",
4
+ "version": "2.46.0-beta.1",
5
5
  "description": "Kuzzle is an open-source solution that handles all the data management through a secured API, with a large choice of protocols.",
6
6
  "bin": "bin/start-kuzzle-server",
7
7
  "scripts": {
@@ -33,21 +33,21 @@
33
33
  "bluebird": "3.7.2",
34
34
  "cli-color": "2.0.4",
35
35
  "cookie": "1.0.2",
36
- "debug": "4.4.1",
36
+ "debug": "4.4.3",
37
37
  "denque": "2.1.0",
38
38
  "didyoumean": "1.2.2",
39
39
  "dumpme": "2.0.0",
40
40
  "eventemitter3": "5.0.1",
41
- "inquirer": "12.8.2",
42
- "ioredis": "5.6.1",
41
+ "inquirer": "12.9.6",
42
+ "ioredis": "5.8.0",
43
43
  "js-yaml": "4.1.0",
44
44
  "json-stable-stringify": "1.3.0",
45
45
  "json2yaml": "1.1.0",
46
46
  "jsonwebtoken": "9.0.2",
47
47
  "koncorde": "4.6.0",
48
- "kuzzle-logger": "1.3.0",
48
+ "kuzzle-logger": "1.4.0",
49
49
  "kuzzle-plugin-auth-passport-local": "6.4.1",
50
- "kuzzle-sdk": ">=7.15.0",
50
+ "kuzzle-sdk": ">=7.15.1",
51
51
  "kuzzle-vault": "2.1.0",
52
52
  "lodash": "4.17.21",
53
53
  "long": "5.3.2",
@@ -59,9 +59,9 @@
59
59
  "pino-caller": "4.0.0",
60
60
  "pino-elasticsearch": "8.1.0",
61
61
  "pino-loki": "2.6.0",
62
- "pino-pretty": "13.0.0",
62
+ "pino-pretty": "13.1.1",
63
63
  "pino-transport-ecs": "1.1.0",
64
- "protobufjs": "7.5.3",
64
+ "protobufjs": "7.5.4",
65
65
  "rc": "1.2.8",
66
66
  "sdk-es7": "npm:@elastic/elasticsearch@7.13.0",
67
67
  "sdk-es8": "npm:@elastic/elasticsearch@8.17.1",
@@ -82,9 +82,9 @@
82
82
  "url": "git://github.com/kuzzleio/kuzzle.git"
83
83
  },
84
84
  "devDependencies": {
85
- "@commitlint/cli": "19.8.1",
86
- "@commitlint/config-conventional": "19.8.1",
87
- "@jest/globals": "30.0.5",
85
+ "@commitlint/cli": "20.0.0",
86
+ "@commitlint/config-conventional": "20.0.0",
87
+ "@jest/globals": "30.1.2",
88
88
  "@types/bluebird": "3.5.42",
89
89
  "@types/cookie": "1.0.0",
90
90
  "@types/jest": "30.0.0",
@@ -96,10 +96,10 @@
96
96
  "cucumber": "6.0.7",
97
97
  "cz-conventional-changelog": "3.3.0",
98
98
  "eslint-plugin-kuzzle": "0.0.14",
99
- "jest": "30.0.5",
100
- "mocha": "11.7.1",
99
+ "jest": "30.1.3",
100
+ "mocha": "11.7.2",
101
101
  "mock-require": "3.0.3",
102
- "mqtt": "5.13.3",
102
+ "mqtt": "5.14.1",
103
103
  "nyc": "17.1.0",
104
104
  "request": "2.88.2",
105
105
  "request-promise": "4.2.6",
@@ -109,16 +109,16 @@
109
109
  "should-sinon": "0.0.6",
110
110
  "sinon": "21.0.0",
111
111
  "strip-json-comments": "https://github.com/sindresorhus/strip-json-comments/archive/refs/tags/v3.1.1.tar.gz",
112
- "ts-jest": "29.4.0",
112
+ "ts-jest": "29.4.4",
113
113
  "ts-node": "10.9.2",
114
- "tsx": "4.20.3",
115
- "typescript": "5.3.2",
116
- "yaml": "2.8.0"
114
+ "tsx": "4.20.6",
115
+ "typescript": "5.4.5",
116
+ "yaml": "2.8.1"
117
117
  },
118
118
  "engines": {
119
119
  "node": ">=18.0.0 <23.0.0"
120
120
  },
121
- "packageManager": "npm@11.4.2",
121
+ "packageManager": "npm@11.6.1",
122
122
  "engineStrict": true,
123
123
  "license": "Apache-2.0",
124
124
  "files": [