@ti-engine/core 1.6.1 → 1.7.2

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 (33) hide show
  1. package/CHANGELOG.md +383 -364
  2. package/LICENSE.md +321 -321
  3. package/README.md +597 -548
  4. package/bin/localization/labels.json +122 -122
  5. package/bin/settings.json +41 -41
  6. package/bin/start-instance.js +164 -156
  7. package/components/auditing.js +191 -191
  8. package/components/connection-observer.js +72 -72
  9. package/components/definitions.types.js +248 -248
  10. package/components/exchange/default/default-message-exchange.js +136 -136
  11. package/components/exchange/default/default-message-receiver.js +101 -101
  12. package/components/exchange/default/default-message-sender.js +100 -100
  13. package/components/exchange/message-dispatcher.js +168 -168
  14. package/components/exchange/message-exchange.js +449 -449
  15. package/components/exchange/message-handler.js +235 -234
  16. package/components/exchange/message-memory-cache.js +190 -190
  17. package/components/exchange/message-observer.js +126 -126
  18. package/components/exchange/message-receiver.js +181 -181
  19. package/components/exchange/message-sender.js +143 -143
  20. package/components/exchange/message-tracer.js +212 -212
  21. package/components/service-caller.js +370 -370
  22. package/components/service-consumer.js +131 -131
  23. package/components/service-executor.js +278 -278
  24. package/components/service-instance.js +316 -316
  25. package/components/service-provider.js +251 -251
  26. package/integrations/redis-integration.js +591 -591
  27. package/package.json +89 -90
  28. package/utils/cache.js +772 -772
  29. package/utils/config.js +103 -103
  30. package/utils/exceptions.js +368 -368
  31. package/utils/localization.js +298 -298
  32. package/utils/logger.js +82 -82
  33. package/utils/tools.js +632 -632
package/CHANGELOG.md CHANGED
@@ -1,365 +1,384 @@
1
- # ti-engine changelog
2
-
3
- This document contains the list of changes made to the framework. The format is based on the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification.
4
-
5
- ## Version 1.6.1
6
-
7
- * build(deps): update `@dotenvx/dotenvx` from ^1.73.1 to ^1.75.1
8
- * build(deps): remove `zeromq` as optional dependency
9
-
10
- ## Version 1.6.0
11
-
12
- * refactor(exchange)!: replace the blake2 keyed hash with native `node:crypto` HMAC-SHA256 in the message integrity check
13
- * build(deps)!: remove the `blake2` native addon dependency (no longer builds on Node 26; replaced by the built-in `node:crypto`)
14
- * fix(exchange): use a constant-time comparison for the message security hash
15
- * fix(exchange): ship an empty default `securityHashKey` and warn (once) when the security hash is enabled with a missing/default key
16
- * test(exchange): add the first core test suite — message-hash determinism, tamper detection, and the constant-time comparison
17
-
18
- > **BREAKING (wire):** the message security hash changes from keyed-BLAKE2b (128 hex) to HMAC-SHA256 (64 hex). Old and new core versions produce mutually incompatible hashes. When upgrading across this version with `securityHashEnabled=true`, redeploy all services together — recommended order: set `securityHashEnabled=false` everywhere → deploy the new core to all services → re-enable. HMAC also accepts keys of any length (custom keys >64 bytes that previously failed under blake2b now work). The default `securityHashKey` is now empty: set `TI_MESSAGE_EXCHANGE_SECURITY_HASH_KEY` in any real deployment, otherwise tamper protection is ineffective.
19
-
20
- ## Version 1.5.1
21
-
22
- * build(deps): update `@dotenvx/dotenvx` from ^1.66.0 to ^1.73.1
23
- * build(deps): update `ioredis` from ^5.10.1 to ^5.11.1
24
-
25
- ## Version 1.5.0
26
-
27
- * feat(exceptions): add `E_APP_RESOURCE_ALREADY_EXISTS` (5006) for resource-creation conflicts; intended to be raised with HTTP `409`
28
-
29
- ## Version 1.4.6
30
-
31
- * build(deps): update `@dotenvx/dotenvx` from ^1.65.0 to ^1.66.0
32
-
33
- ## Version 1.4.5
34
-
35
- * feat(cache): add array-based path support to all `*JSON` methods passing an array of strings as `path` treats each element as a literal key name using bracket notation, preventing misinterpretation of key names containing dots or other JSONPath special characters
36
-
37
- ## Version 1.4.4
38
-
39
- * build(deps): update `@dotenvx/dotenvx` from ^1.60.0 to ^1.65.0
40
-
41
- ## Version 1.4.3
42
-
43
- * build(deps): update `@dotenvx/dotenvx` from ^1.59.1 to ^1.60.0
44
-
45
- ## Version 1.4.2
46
-
47
- * build(deps): update `@dotenvx/dotenvx` from ^1.55.1 to ^1.59.1
48
- * build(deps): update `ioredis` from ^5.10.0 to ^5.10.1
49
- * build(deps): update `lodash` from ^4.17.23 to ^4.18.1
50
-
51
- ## Version 1.4.1
52
-
53
- * build(deps): update `@dotenvx/dotenvx` from ^1.54.1 to ^1.55.1
54
-
55
- ## Version 1.4.0
56
-
57
- * feat(redis integration): implement support for `JSON.MERGE` and `JSON.MGET` commands
58
- * feat(cache): add `editJSON` method
59
- * feat(cache): implement consistent RedisJSON path handling and uniform error wrapping
60
- * feat(exceptions): add new standardized exception code `E_GEN_NOT_IMPLEMENTED` to use for cases where a feature is not yet implemented
61
- * feat(exceptions): add new optional, flexible parameter `httpCode` to the `raise` method
62
- * refactor(exceptions)!: rename the exception class from `Exception` to `TiException` in all referred places
63
- * refactor(definitions): move all object definitions to a new `definitions.types.js` file
64
- * refactor(gcloud integration)!: remove file `gcloud-integration.js` and all related functionality (as it was obsolete and a security vulnerability)
65
- * fix(cache): fix a bug where RedisJSON methods would return `E_GEN_FEATURE_UNSUPPORTED` error while discarding the details of that error
66
- * fix(config): fix the ENV `TI_LOCALIZATION_LABELS_PATH` to properly support multiple paths to label files
67
- * build(deps): update `@dotenvx/dotenvx` from ^1.52.0 to ^1.54.1
68
- * build(deps): update `ioredis` from ^5.9.2 to ^5.10.0
69
- * build(deps)!: remove `@google-cloud/error-reporting`
70
-
71
- ## Version 1.3.14
72
-
73
- * build(deps): update `@dotenvx/dotenvx` from ^1.51.1 to ^1.52.0
74
- * build(deps): update `blake2` from ^5.0.0 to ^5.0.1
75
- * build(deps): update `ioredis` from ^5.8.2 to ^5.9.2
76
- * build(deps): update `lodash` from ^4.17.21 to ^4.17.23
77
- * build(engines): update Node.js requirement from >=18.0.0 to >=20.0.0
78
-
79
- ## Version 1.3.13
80
-
81
- * feat(exceptions): add new exception code `E_GEN_UNALLOWED_OVERRIDE` (1009) for detecting attempts to override protected or private methods/properties
82
- * feat(auditing): enhance console data formatting with recursive, depth-limited formatting (max depth: 5), circular reference detection and handling, improved readability for nested objects and multi-line strings, and proper indentation and prefixing for structured output
83
- * fix(start instance): modified `start-instance.js` to initialize serviceConfig as undefined instead of an empty object when `TI_INSTANCE_CONFIG` environment variable is not provided
84
- * build(npm): update npm dependencies to their latest versions
85
-
86
- ## Version 1.3.12
87
-
88
- * feat(exceptions): add new exception code `E_COM_SERVICE_EXEC_FAILED`
89
- * feat(localization): add new public method `getAllLabels`
90
- * feat(localization): use new `deepFreeze` method to freeze all label trees
91
- * feat(tools): add new public method `deepFreeze` for freezing an object and all its sub-objects recursively
92
- * feat(config): use new `deepFreeze` method to freeze all configuration settings
93
- * docs: add more information about the `localization` module in `README.md` file
94
- * build(npm): update npm dependencies to their latest versions
95
-
96
- ## Version 1.3.11
97
-
98
- * feat(tools): add `arrayUniques` method to the tools module that helps extract only the unique array values
99
- * fix(start instance): fix `undefined` instance ID in the log message about starting the instance
100
-
101
- ## Version 1.3.10
102
-
103
- * chore: fix various minor issues reported by the linter
104
- * build(npm): add more information and options to the `package.json` file
105
- * docs: add some JSDoc descriptions to classes and methods
106
-
107
- ## Version 1.3.9
108
-
109
- * feat(exceptions): add new exception code `E_GEN_NOT_INITIALIZED`
110
- * docs: fix image links in the `README.md` file
111
-
112
- ## Version 1.3.8
113
-
114
- * fix(tester): fix the relative paths of various files in the tester service. The configuration now assumes that the working directory is the root of the tester package instead of the repository itself
115
- * build(npm): update npm dependencies to their latest versions
116
- * docs: fix some outdated information in the `README.md` file and add some more details
117
-
118
- ## Version 1.3.7
119
-
120
- * feat(exceptions): add new exception code `E_SEC_UNRECOGNIZED_AUTH_METHOD`
121
- * fix(config): fix potential issue with `TI_GCLOUD_ENABLED` parsing as boolean
122
- * docs: adjust some of the JSDoc descriptions and definitions
123
-
124
- ## Version 1.3.6
125
-
126
- * feat(exceptions): add new exception code `E_GEN_INVALID_ARGUMENT_TYPE`
127
- * feat(exceptions): add public enum with all HTTP codes exported as `httpCode` and typedef `TiHttpCode`. Use it as the type for the `httpCode` exception property
128
- * feat(tools): add `description` property to enum objects
129
- * feat(tools): add `contains` property to enum objects
130
- * feat(tools)!: change enum factory behavior to create a copy of the seed object instead of modifying it (may break code relying on seed object mutation)
131
- * refactor(exceptions): invalid `httpCode` inputs are coerced to `undefined`; `Exception.asJSON` includes `httpCode` only when defined
132
- * refactor(tools): deprecate method `getEnumName` in favor of `enum.name`; removal planned for 1.4.0
133
- * refactor(tools)!: remove method `createCSVFile` as it is unnecessary for the framework's operation. It also eliminates the dependency from `fs-extra` package
134
- * refactor(tools)!: disallow reserved keys as enum names; make enum properties non-enumerable and freeze the enum object to enforce immutability (may affect code relying on enumeration/extension)
135
- * fix(tools): fix a bug in the `RetryPolicy` class that caused the `maxAttempts` property to be ignored
136
- * build(npm): update npm dependencies to their latest versions
137
- * build(npm): remove `fs-extra` package as it is not used by the framework
138
- * build(npm)!: bump the minimum supported Node.js version to 18.0.0
139
-
140
- ## Version 1.3.5
141
-
142
- * fix(redis integration): fix a duplicated log entry on connection ready event if multiple observers are registered
143
- * feat(service caller)!: change log level of error result in `process` method from `ERROR` to `DEBUG`. Implementers are expected to handle this and decide if the error should be propagated further or not
144
- * docs: update and fix various issues with the `README.md` file
145
-
146
- ## Version 1.3.4
147
-
148
- * fix(service instance): fix the way `ServiceConfiguration` is propagated via child classes and remove unnecessary defaults. Also update the relevant JSDoc
149
-
150
- ## Version 1.3.3
151
-
152
- * feat(exceptions): add new parameter `includeData` to `Exception.asJSON` method which allows the exclusion of the data parameter from the returned JSON
153
- * feat(exceptions): remove several excessive exception codes that were unlikely to be used
154
- * fix(localization): add several missing exception labels
155
-
156
- ## Version 1.3.2
157
-
158
- * feat(exceptions): add a set of new exception codes for the needs of any wrapping `web-server` standard communication
159
- * feat(exception)!: change the default prefix path for exception labels to `system.exceptions.`
160
- * feat(localization): add an Enum list of all language codes based on ISO 639-1 standard
161
- * feat(localization): add an option to the `getLabel` method to provide the language code to use for localization. If not provided, the system will use the language code from the `localization.language` setting
162
- * feat(localization)!: change the default structure of system labels from `labels.general.[...]` to `system.[...]`
163
- * refactor(localization): add typedefs and JSDoc structure for the objects used in localization
164
- * refactor(exceptions): refactor and fix various JSDoc descriptions
165
- * refactor(auditing): change the type name of `LogEntry` to `TiLogEntry` and fix some JSDoc descriptions
166
- * fix(exceptions): fix an issue which caused the exception to disregard the `description` value sent in the constructor and use the default one instead
167
- * fix(config): fix an issue with the `TI_LOCALIZATION_LABELS_PATH` variable not respecting that the underlying setting expected an array. Now it is expected to be a single path and it will be wrapped into an array automatically
168
- * fix(auditing): fix a potential problem with setting the log entry reporter from an ENV variable; instead, the system will now use the `ServiceInstance.instanceID` property
169
-
170
- ## Version 1.3.1
171
-
172
- * feat(service caller): refactor the entire service call execution flow for clarity and better performance
173
- * feat(service caller): create a new private class `ServiceCallProcessor` to handle individual service calls in a contained scope
174
- * feat(message observer): add new property `priority` to the message observer class. It is used to determine the order in which the observers are notified about the messages
175
- * feat(message observer)!: change method `onMessage` to now return the message it received. This allows for the message to be modified before it is passed to the next observer based on `priority`
176
- * feat(message handler)!: change method `onMessage` to `notifyMessageObservers` for clarity. It now implements the `MessageObserver` functionality for prioritization and message modification
177
- * fix(service caller): fix an issue which did not allow for a service call to be marked as completed thus being entered into the trace log as still pending
178
- * fix(redis integration): remove hardcoded `#retryMaxAttempts` value in `#setupClient` method
179
- * fix(redis integration): fix an issue which was setting the client status to `DISCONNECTED` during a normal shut down procedure
180
-
181
- ## Version 1.3.0
182
-
183
- * feat(redis integration)!: change `reconnectOnError` behavior to also resubmit the failed command in case the error was of type `READONLY`
184
- * feat(redis integration): improve the reliability and usage of the event notification mechanism for connection observers
185
- * feat(redis integration): implement listener to the `end` event on Redis connection to capture when connection can no longer be recovered
186
- * feat(redis integration): notify connection observers `onConnectionLost` event
187
- * feat(redis integration): add redis client platform-specific status. It is used internally by the platform and can also be accessed via `redisClient.clientStatus` property
188
- * feat(connection observer): add new event handler `onConnectionLost` that will be invoked when the observed connection is irrevocably lost
189
- * feat(cache)!: implement `onConnectionLost` handler that will cause the service instance to immediately stop since it cannot work without the cache
190
- * fix(service caller): fix multiple promise reject condition when a service call timed out and the service handler still attempted to complete with subsequent error
191
- * fix(service instance): limit health check reporting to one attempt at a time to avoid unnecessary cache requests and log spam
192
- * fix(redis integration): fix a multiple promise resolve condition on Redis `reconnect` event
193
- * fix(redis integration): fix broken event propagation on `disrupted` events to some connection observers
194
-
195
- ## Version 1.2.5
196
-
197
- * feat(cache): extend method `expireValue` to work with has set fields as well
198
-
199
- ## Version 1.2.4
200
-
201
- * feat(cache): expose the cache module as export in `package.json`
202
- * feat(cache): add method `hashDeleteField` to remove a hash-set field. This implements the `hdel` Redis command
203
- * fix(tools): optimize method `stringifyJSON` not to call unnecessary decycling of the value if it's not an object
204
- * fix(cache): replace `hmset` with `hset` Redis command in both methods that set hash-set values. Also remove unnecessary `_.isObjectLike` call in `hashSetFields` method
205
-
206
- ## Version 1.2.3
207
-
208
- * feat(start instance): add support for providing a custom path to the `.env` file to be used at service startup as process argument. Accepted arguments are `--env`, `--env-file`, `--dotenv`, `--dotenv-path`, and `-e`. The path itself should be relative to the working directory and should include the file name
209
-
210
- ## Version 1.2.2
211
-
212
- * feat(start instance): change package `dotenv` to `@dotenvx/dotenvx` for loading of ENV variables. The new package supports encrypting the ENV variables. For more information see https://dotenvx.com/docs/
213
-
214
- ## Version 1.2.1
215
-
216
- * feat(localization): add support for adding custom labels to the localization system. These have to follow the same format as the system labels
217
- * docs: add section about localization to the `README.md` file
218
-
219
- ## Version 1.2.0
220
-
221
- * feat(config)!: change the setting `localization.labelsPath` to be an array of strings. It can now be used to supply any additional custom labels in one or more files to the framework
222
- * feat(message memory cache): implement graceful exception handling during shut down procedure in `receiveMessage` and `sendMessage` methods
223
- * fix(default message sender): add missing initialization of the memory cache on enable
224
- * fix(default message receiver): add missing initialization of the memory cache on enable
225
- * fix(message receiver): ensure `receive` method is no longer called recursively when the receiver has been disabled
226
- * fix(redis integration)!: change the way the Redis client is initialized as the previous sequence was leaving unresolved promises and in some cases failed to fetch the Redis server settings. Also, it will now notify the listeners only once when the server settings are fetched and the connection is ready to be used
227
- * fix(localization)!: change the way system labels are loaded as the previous implementation could cause a critical startup error if the working dir was different from expected
228
- * fix(package): add the missing main export to the `start-instance.js` script. Without it was impossible to start the framework in specific cases like in a workspaces repository
229
- * fix(message tracer): exclude `E_GEN_FEATURE_UNSUPPORTED` exception from the initialization of the message tracer exception handler
230
- * fix(service executor)!: change the individual service registration process to ensure service registration does actually happen before the service provider finishes its initialization
231
-
232
- ## Version 1.1.10
233
-
234
- * fix(cache): fix redis client creation sequence. It is now created inside the constructor as intended. It still needs to be initialized explicitly using the `initialize` method.
235
-
236
- ## Version 1.1.9
237
-
238
- * feat(redis integration)!: change the way the `redis` client is initialized. Instead of happening automatically on class instantiation, it is now initialized on demand using the `initialize` method.
239
- * feat(cache): change the way the main cache instance is initialized in compliance with the new redis integration
240
- * feat(message memory cache)!: change the way the message memory cache is initialized in compliance with the new redis integration. The `initialize` method needs to be called explicitly to initialize the cache instance before it can be used.
241
- * fix(message dispatcher): fix the way the `messageExchange` is initialized in the `MessageDispatcher` class (was not returning a promise)
242
-
243
- ## Version 1.1.8
244
-
245
- * feat(auditing): change export of the singleton class in an `instance` variable for consistency and clarity
246
- * feat(message dispatcher): change export of the singleton class in an `instance` variable for consistency and clarity
247
- * feat(cache): change export of the singleton class in an `instance` variable for consistency and clarity
248
- * feat(service executor): implement service registration retry policy
249
-
250
- ## Version 1.1.7
251
-
252
- * feat(start instance): add support for the detection of `SIGBREAK` events and graceful shutdown on Windows
253
- * feat(service instance)!: prevent the initialization of multiple `ServiceInstance` within the same process
254
- * feat(message tracer)!: covert to singleton instance and add initialization method
255
- * feat(message dispatcher): initialize the message tracer on start before message exchange is enabled
256
- * fix(message tracer): optimize `recordTraceEntry` to not call set JSON command on every request
257
- * fix(gcloud integration): fix the bool conversion of the `TI_GCLOUD_ENABLED` ENV variable
258
- * fix(redis integration): update links to official commands documentation
259
-
260
- ## Version 1.1.6
261
-
262
- * feat(start instance): add fail-fast mode as default behavior on promise unhandled rejections
263
- * feat(start instance): implement functionality to derive safe default service domain name when none is provided in the configuration
264
- * feat(config): add support for new ENV variable `TI_FAIL_FAST_ON_UNHANDLED_OFF` that controls the fail-fast mode
265
- * feat(service instance): ensure instance ID naming standard is followed when creating new instances and no ID is provided in the configuration
266
- * feat(redis integration): marked command `hmset` as deprecated (according to official documentation)
267
- * feat(redis integration)!: change redis client default behavior: set to automatically resend all pending commands on connection recovery with no limit on the retry attempts. This behavior cannot be changed. Arguments `autoRetryUnfulfilled` and `maxRetries` have been removed from the constructor
268
- * feat(redis integration)!: add options to configure redis connection retry policy. This can be controlled with two new arguments in the constructor `retryMaxIntervalMs` and `retryMaxAttempts`.
269
- * feat(redis integration)!: improve and extend the behavior of pub/sub implementation functionality. The `subscribeCommand` method can now only subscribe once to the same channel. The client instance will keep a map of all channels it has subscribed to. To unsubscribe, use the `unsubscribeCommand` method
270
- * feat(redis integration): add a `shutDown` method to gracefully close a redis connection. This is now used on instance shut down sequence as well as in the default message sender and receiver implementations
271
- * fix(start instance): fix the logging of reason for unhandled rejections and multiple resolves
272
- * fix(service instance): use the static service domain name to initialize the health check instead of the ENV variable
273
- * fix(redis integration): add detection of ReJSON2 in the verification of JSON support in the redis server
274
- * build(npm): update npm dependencies to their latest versions
275
- * docs: add section about ENV variables to the `README.md` file
276
-
277
- ## Version 1.1.5
278
-
279
- * fix(service instance): add overrides of the `reportHealthy` method in `ServiceConsumer` and `ServiceProvider` classes
280
- * fix(tester): implement `reportHealthy` method
281
- * docs(license): add a `LICENSE` file
282
- * docs(license): change all licensing information in source files to GNU 3.0
283
- * docs: improve the information in `README.md` file
284
-
285
- ## Version 1.1.4
286
-
287
- * feat(service instance): expose method `reportHealthy` and mark it as virtual to allow for overrides with custom health status reporting logic
288
-
289
- ## Version 1.1.3
290
-
291
- * feat(config)!: removed ENV variable `TI_OPERATION_MODE` as it was duplicating the practical purpose of `NODE_ENV`
292
- * feat(config)!: setting `OPERATION_MODE` is now initialized by the `NODE_ENV` ENV variable (if provided)
293
- * feat(service instance): show application operation mode in log at successful startup
294
- * docs: add more sections and information in `README.md`
295
-
296
- ## Version 1.1.2
297
-
298
- * feat(localization): add new functionality for localization based on labels and system language. It is currently utilized by the `exceptions` module for localizing the exception descriptions. The new `localization` module can also be accessed externally in the implementing application's files via standard import
299
- * feat(config): add new setting `localization.labelsPath` that specifies the file path for the localization labels
300
- * feat(config): add new setting `localization.language` that specifies the language to be used for the labels
301
- * feat(config): add new ENV variable `TI_LOCALIZATION_LABELS_PATH` that controls the `localization.labelsPath` setting
302
- * feat(config): add new ENV variable `TI_LOCALIZATION_LANGUAGE` that controls the `localization.language` setting
303
- * feat(logger): log exception label instead of system-level description
304
- * fix(start instance): fix the order of ENV loading in the `start-instance.js` script. It will now properly load the `.env` file first and then proceed with any configuration overrides in `config` module
305
- * fix(service provider): normalize service file paths on dynamic service handler loading
306
- * build(npm): update npm dependencies to their latest versions
307
-
308
- ## Version 1.1.1
309
-
310
- * feat(config): add new ENV variable `TI_AUDITING_LOG_DETAILS` that controls the `auditing.logDetails` setting
311
- * feat(service provider): add a method that returns a list of the currently registered services
312
- * feat(tester service): improved the structure, configuration, and inline docs of tester service
313
- * fix(logger): fix the way Exception is logged when it's a part of the main logging data object
314
- * docs(readme): expanded the general documentation in `README.md` with a new section and improved many of the older sections
315
- * docs: improved some of the JSDoc definitions across the framework
316
-
317
- ## Version 1.1.0
318
-
319
- * feat(redis integration): implement better process for fetching and storing the remote Redis server settings and enabled features
320
- * feat(redis integration): add getter method `serverVersion` that returns the Redis server version
321
- * feat(redis integration): add support for RedisJSON functionality
322
- * feat(redis integration): add getter method `isJSONSupported` to verify if this module is enabled/supported in Redis server
323
- * feat(redis integration): add separate enum for override modes `TiRedisOverrideMode`
324
- * feat(redis integration): add support for executing any single command in Redis that is otherwise unsupported by the underlying framework. Use method `callCommand` for that in case you need to access something more exotic or currently unimplemented
325
- * feat(cache): add support for working with JSON values. Currently supporting operations `set`, `get`, and `append array` with more coming in future versions
326
- * feat(cache): add support for setting manual expiration of values
327
- * feat(message tracer): change log level of trace entries from `DEBUG` to `NOTICE` for all events
328
- * feat(message tracer): add functionality for storing the trace entries in the `cache` in JSON format. This is the default behavior and will always work. Traces can later be retrieved from the `cache` for further processing by specialized application
329
- * feat(message tracer): add new property `traceTimestamp` to the trace entries as it may differ from the actual message timestamp
330
- * feat(config): add new setting `messageExchange.traceExpirationTime` that controls the preservation time for all trace entries. Default is one hour and will be refreshed every time a new trace is generated. Setting this to `0` will disable
331
- expiration altogether
332
- * feat(config): add new setting `messageExchange.traceRepository` that specifies the name of the key in `cache` that will store the trace entries. The default one should be sufficient for most cases
333
- * feat(config): change default of setting `messageExchange.traceLogEnabled` to `false`. With this change trace entries will not be written to the standard log output
334
- * feat(exceptions): add new exception code `1006` as `E_GEN_FEATURE_UNSUPPORTED` to indicate functionality that is unsupported by the system or integrated application
335
- * refactor(config)!: correct the name of the ENV variable controlling `memoryCache.user` to `TI_MEMORY_CACHE_USER` from previous `MEMORY_CACHE_USER`
336
- * build(npm): update npm development dependencies to their latest versions
337
- * docs: update some JSDoc types and other entries to reflect the current state of the code
338
-
339
- ## Version 1.0.14
340
-
341
- * feat(message exchange): improve the behavior of `onConnectionRecovered` and `onConnectionDisrupted` events in modules `cache`, `message-handler` and `service-executor` to prevent cross-activation or deactivation
342
- * feat(redis integration): improve Redis integration for greater stability, support of Redis Cloud, and support for Redis 7
343
- * feat(config): enable setting `auditing.logDetails` by default for all logs
344
- * docs: update general documentation
345
-
346
- ## Version 1.0.13
347
-
348
- * build(npm): update npm dependencies to their latest versions
349
-
350
- ## Version 1.0.12
351
-
352
- * build(npm): update npm dependencies to their latest versions
353
-
354
- ## Version 1.0.11
355
-
356
- * feat(message exchange): implement message tampering and insertion protection
357
- * feat(config): provide option to turn on/off the message tampering and insertion protection
358
- * feat(config): provide option to turn on/off message tracing
359
- * build(npm): update npm dependencies to their latest versions
360
- * refactor(config)!: rename all environment variables that set configuration settings to match their related setting
361
- * docs: add a change log
362
-
363
- ## Version 1.0.0
364
-
1
+ # ti-engine changelog
2
+
3
+ This document contains the list of changes made to the framework. The format is based on the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification.
4
+
5
+ ## Version 1.7.2
6
+
7
+ No functional change the framework code is what `1.7.1` shipped. The version exists to exercise the automated npm publish that replaced the release-triggered workflow, and to prove this package's own trusted publisher configuration on npmjs.com: OIDC trust is granted per package, so it is only ever validated by an actual publish of that package.
8
+
9
+ * build(release): bump package version from `1.7.1` to `1.7.2`
10
+
11
+ ## Version 1.7.1
12
+
13
+ * fix(exchange): preserve a configured-but-falsy `securityHashKey` only a truly absent (`null`/`undefined`) value falls back to the empty key, so a configured `0`/`false` is no longer silently downgraded to the insecure empty-key path (PR #83, CodeRabbit)
14
+ * build(release): bump package version from `1.7.0` to `1.7.1`
15
+
16
+ ## Version 1.7.0
17
+
18
+ * refactor(core)!: load the `.env` file via native `process.loadEnvFile` instead of `@dotenvx/dotenvx`
19
+ * build(deps)!: remove the `@dotenvx/dotenvx` dependency — core now has three runtime dependencies (`ioredis`, `lodash`, `node-schedule`)
20
+ * build(core)!: raise the minimum Node.js version to `>=20.12.0` (required for `process.loadEnvFile`)
21
+
22
+ > The native loader matches the prior behavior: a missing `.env` file is tolerated (ENOENT is ignored, as with the previous `quiet: true`) and existing environment variables are not overridden. The `--env` / `--env-file` / `--dotenv` / `--dotenv-path` / `-e` CLI aliases for choosing the env-file path are unchanged. Encrypted `.env` files (a dotenvx-only feature this framework never used) are not supported. Consumers on Node 20.0–20.11 must upgrade to Node ≥ 20.12.
23
+
24
+ ## Version 1.6.1
25
+
26
+ * build(deps): update `@dotenvx/dotenvx` from ^1.73.1 to ^1.75.1
27
+ * build(deps): remove `zeromq` as optional dependency
28
+
29
+ ## Version 1.6.0
30
+
31
+ * refactor(exchange)!: replace the blake2 keyed hash with native `node:crypto` HMAC-SHA256 in the message integrity check
32
+ * build(deps)!: remove the `blake2` native addon dependency (no longer builds on Node 26; replaced by the built-in `node:crypto`)
33
+ * fix(exchange): use a constant-time comparison for the message security hash
34
+ * fix(exchange): ship an empty default `securityHashKey` and warn (once) when the security hash is enabled with a missing/default key
35
+ * test(exchange): add the first core test suitemessage-hash determinism, tamper detection, and the constant-time comparison
36
+
37
+ > **BREAKING (wire):** the message security hash changes from keyed-BLAKE2b (128 hex) to HMAC-SHA256 (64 hex). Old and new core versions produce mutually incompatible hashes. When upgrading across this version with `securityHashEnabled=true`, redeploy all services together — recommended order: set `securityHashEnabled=false` everywhere → deploy the new core to all services → re-enable. HMAC also accepts keys of any length (custom keys >64 bytes that previously failed under blake2b now work). The default `securityHashKey` is now empty: set `TI_MESSAGE_EXCHANGE_SECURITY_HASH_KEY` in any real deployment, otherwise tamper protection is ineffective.
38
+
39
+ ## Version 1.5.1
40
+
41
+ * build(deps): update `@dotenvx/dotenvx` from ^1.66.0 to ^1.73.1
42
+ * build(deps): update `ioredis` from ^5.10.1 to ^5.11.1
43
+
44
+ ## Version 1.5.0
45
+
46
+ * feat(exceptions): add `E_APP_RESOURCE_ALREADY_EXISTS` (5006) for resource-creation conflicts; intended to be raised with HTTP `409`
47
+
48
+ ## Version 1.4.6
49
+
50
+ * build(deps): update `@dotenvx/dotenvx` from ^1.65.0 to ^1.66.0
51
+
52
+ ## Version 1.4.5
53
+
54
+ * feat(cache): add array-based path support to all `*JSON` methods — passing an array of strings as `path` treats each element as a literal key name using bracket notation, preventing misinterpretation of key names containing dots or other JSONPath special characters
55
+
56
+ ## Version 1.4.4
57
+
58
+ * build(deps): update `@dotenvx/dotenvx` from ^1.60.0 to ^1.65.0
59
+
60
+ ## Version 1.4.3
61
+
62
+ * build(deps): update `@dotenvx/dotenvx` from ^1.59.1 to ^1.60.0
63
+
64
+ ## Version 1.4.2
65
+
66
+ * build(deps): update `@dotenvx/dotenvx` from ^1.55.1 to ^1.59.1
67
+ * build(deps): update `ioredis` from ^5.10.0 to ^5.10.1
68
+ * build(deps): update `lodash` from ^4.17.23 to ^4.18.1
69
+
70
+ ## Version 1.4.1
71
+
72
+ * build(deps): update `@dotenvx/dotenvx` from ^1.54.1 to ^1.55.1
73
+
74
+ ## Version 1.4.0
75
+
76
+ * feat(redis integration): implement support for `JSON.MERGE` and `JSON.MGET` commands
77
+ * feat(cache): add `editJSON` method
78
+ * feat(cache): implement consistent RedisJSON path handling and uniform error wrapping
79
+ * feat(exceptions): add new standardized exception code `E_GEN_NOT_IMPLEMENTED` to use for cases where a feature is not yet implemented
80
+ * feat(exceptions): add new optional, flexible parameter `httpCode` to the `raise` method
81
+ * refactor(exceptions)!: rename the exception class from `Exception` to `TiException` in all referred places
82
+ * refactor(definitions): move all object definitions to a new `definitions.types.js` file
83
+ * refactor(gcloud integration)!: remove file `gcloud-integration.js` and all related functionality (as it was obsolete and a security vulnerability)
84
+ * fix(cache): fix a bug where RedisJSON methods would return `E_GEN_FEATURE_UNSUPPORTED` error while discarding the details of that error
85
+ * fix(config): fix the ENV `TI_LOCALIZATION_LABELS_PATH` to properly support multiple paths to label files
86
+ * build(deps): update `@dotenvx/dotenvx` from ^1.52.0 to ^1.54.1
87
+ * build(deps): update `ioredis` from ^5.9.2 to ^5.10.0
88
+ * build(deps)!: remove `@google-cloud/error-reporting`
89
+
90
+ ## Version 1.3.14
91
+
92
+ * build(deps): update `@dotenvx/dotenvx` from ^1.51.1 to ^1.52.0
93
+ * build(deps): update `blake2` from ^5.0.0 to ^5.0.1
94
+ * build(deps): update `ioredis` from ^5.8.2 to ^5.9.2
95
+ * build(deps): update `lodash` from ^4.17.21 to ^4.17.23
96
+ * build(engines): update Node.js requirement from >=18.0.0 to >=20.0.0
97
+
98
+ ## Version 1.3.13
99
+
100
+ * feat(exceptions): add new exception code `E_GEN_UNALLOWED_OVERRIDE` (1009) for detecting attempts to override protected or private methods/properties
101
+ * feat(auditing): enhance console data formatting with recursive, depth-limited formatting (max depth: 5), circular reference detection and handling, improved readability for nested objects and multi-line strings, and proper indentation and prefixing for structured output
102
+ * fix(start instance): modified `start-instance.js` to initialize serviceConfig as undefined instead of an empty object when `TI_INSTANCE_CONFIG` environment variable is not provided
103
+ * build(npm): update npm dependencies to their latest versions
104
+
105
+ ## Version 1.3.12
106
+
107
+ * feat(exceptions): add new exception code `E_COM_SERVICE_EXEC_FAILED`
108
+ * feat(localization): add new public method `getAllLabels`
109
+ * feat(localization): use new `deepFreeze` method to freeze all label trees
110
+ * feat(tools): add new public method `deepFreeze` for freezing an object and all its sub-objects recursively
111
+ * feat(config): use new `deepFreeze` method to freeze all configuration settings
112
+ * docs: add more information about the `localization` module in `README.md` file
113
+ * build(npm): update npm dependencies to their latest versions
114
+
115
+ ## Version 1.3.11
116
+
117
+ * feat(tools): add `arrayUniques` method to the tools module that helps extract only the unique array values
118
+ * fix(start instance): fix `undefined` instance ID in the log message about starting the instance
119
+
120
+ ## Version 1.3.10
121
+
122
+ * chore: fix various minor issues reported by the linter
123
+ * build(npm): add more information and options to the `package.json` file
124
+ * docs: add some JSDoc descriptions to classes and methods
125
+
126
+ ## Version 1.3.9
127
+
128
+ * feat(exceptions): add new exception code `E_GEN_NOT_INITIALIZED`
129
+ * docs: fix image links in the `README.md` file
130
+
131
+ ## Version 1.3.8
132
+
133
+ * fix(tester): fix the relative paths of various files in the tester service. The configuration now assumes that the working directory is the root of the tester package instead of the repository itself
134
+ * build(npm): update npm dependencies to their latest versions
135
+ * docs: fix some outdated information in the `README.md` file and add some more details
136
+
137
+ ## Version 1.3.7
138
+
139
+ * feat(exceptions): add new exception code `E_SEC_UNRECOGNIZED_AUTH_METHOD`
140
+ * fix(config): fix potential issue with `TI_GCLOUD_ENABLED` parsing as boolean
141
+ * docs: adjust some of the JSDoc descriptions and definitions
142
+
143
+ ## Version 1.3.6
144
+
145
+ * feat(exceptions): add new exception code `E_GEN_INVALID_ARGUMENT_TYPE`
146
+ * feat(exceptions): add public enum with all HTTP codes exported as `httpCode` and typedef `TiHttpCode`. Use it as the type for the `httpCode` exception property
147
+ * feat(tools): add `description` property to enum objects
148
+ * feat(tools): add `contains` property to enum objects
149
+ * feat(tools)!: change enum factory behavior to create a copy of the seed object instead of modifying it (may break code relying on seed object mutation)
150
+ * refactor(exceptions): invalid `httpCode` inputs are coerced to `undefined`; `Exception.asJSON` includes `httpCode` only when defined
151
+ * refactor(tools): deprecate method `getEnumName` in favor of `enum.name`; removal planned for 1.4.0
152
+ * refactor(tools)!: remove method `createCSVFile` as it is unnecessary for the framework's operation. It also eliminates the dependency from `fs-extra` package
153
+ * refactor(tools)!: disallow reserved keys as enum names; make enum properties non-enumerable and freeze the enum object to enforce immutability (may affect code relying on enumeration/extension)
154
+ * fix(tools): fix a bug in the `RetryPolicy` class that caused the `maxAttempts` property to be ignored
155
+ * build(npm): update npm dependencies to their latest versions
156
+ * build(npm): remove `fs-extra` package as it is not used by the framework
157
+ * build(npm)!: bump the minimum supported Node.js version to 18.0.0
158
+
159
+ ## Version 1.3.5
160
+
161
+ * fix(redis integration): fix a duplicated log entry on connection ready event if multiple observers are registered
162
+ * feat(service caller)!: change log level of error result in `process` method from `ERROR` to `DEBUG`. Implementers are expected to handle this and decide if the error should be propagated further or not
163
+ * docs: update and fix various issues with the `README.md` file
164
+
165
+ ## Version 1.3.4
166
+
167
+ * fix(service instance): fix the way `ServiceConfiguration` is propagated via child classes and remove unnecessary defaults. Also update the relevant JSDoc
168
+
169
+ ## Version 1.3.3
170
+
171
+ * feat(exceptions): add new parameter `includeData` to `Exception.asJSON` method which allows the exclusion of the data parameter from the returned JSON
172
+ * feat(exceptions): remove several excessive exception codes that were unlikely to be used
173
+ * fix(localization): add several missing exception labels
174
+
175
+ ## Version 1.3.2
176
+
177
+ * feat(exceptions): add a set of new exception codes for the needs of any wrapping `web-server` standard communication
178
+ * feat(exception)!: change the default prefix path for exception labels to `system.exceptions.`
179
+ * feat(localization): add an Enum list of all language codes based on ISO 639-1 standard
180
+ * feat(localization): add an option to the `getLabel` method to provide the language code to use for localization. If not provided, the system will use the language code from the `localization.language` setting
181
+ * feat(localization)!: change the default structure of system labels from `labels.general.[...]` to `system.[...]`
182
+ * refactor(localization): add typedefs and JSDoc structure for the objects used in localization
183
+ * refactor(exceptions): refactor and fix various JSDoc descriptions
184
+ * refactor(auditing): change the type name of `LogEntry` to `TiLogEntry` and fix some JSDoc descriptions
185
+ * fix(exceptions): fix an issue which caused the exception to disregard the `description` value sent in the constructor and use the default one instead
186
+ * fix(config): fix an issue with the `TI_LOCALIZATION_LABELS_PATH` variable not respecting that the underlying setting expected an array. Now it is expected to be a single path and it will be wrapped into an array automatically
187
+ * fix(auditing): fix a potential problem with setting the log entry reporter from an ENV variable; instead, the system will now use the `ServiceInstance.instanceID` property
188
+
189
+ ## Version 1.3.1
190
+
191
+ * feat(service caller): refactor the entire service call execution flow for clarity and better performance
192
+ * feat(service caller): create a new private class `ServiceCallProcessor` to handle individual service calls in a contained scope
193
+ * feat(message observer): add new property `priority` to the message observer class. It is used to determine the order in which the observers are notified about the messages
194
+ * feat(message observer)!: change method `onMessage` to now return the message it received. This allows for the message to be modified before it is passed to the next observer based on `priority`
195
+ * feat(message handler)!: change method `onMessage` to `notifyMessageObservers` for clarity. It now implements the `MessageObserver` functionality for prioritization and message modification
196
+ * fix(service caller): fix an issue which did not allow for a service call to be marked as completed thus being entered into the trace log as still pending
197
+ * fix(redis integration): remove hardcoded `#retryMaxAttempts` value in `#setupClient` method
198
+ * fix(redis integration): fix an issue which was setting the client status to `DISCONNECTED` during a normal shut down procedure
199
+
200
+ ## Version 1.3.0
201
+
202
+ * feat(redis integration)!: change `reconnectOnError` behavior to also resubmit the failed command in case the error was of type `READONLY`
203
+ * feat(redis integration): improve the reliability and usage of the event notification mechanism for connection observers
204
+ * feat(redis integration): implement listener to the `end` event on Redis connection to capture when connection can no longer be recovered
205
+ * feat(redis integration): notify connection observers `onConnectionLost` event
206
+ * feat(redis integration): add redis client platform-specific status. It is used internally by the platform and can also be accessed via `redisClient.clientStatus` property
207
+ * feat(connection observer): add new event handler `onConnectionLost` that will be invoked when the observed connection is irrevocably lost
208
+ * feat(cache)!: implement `onConnectionLost` handler that will cause the service instance to immediately stop since it cannot work without the cache
209
+ * fix(service caller): fix multiple promise reject condition when a service call timed out and the service handler still attempted to complete with subsequent error
210
+ * fix(service instance): limit health check reporting to one attempt at a time to avoid unnecessary cache requests and log spam
211
+ * fix(redis integration): fix a multiple promise resolve condition on Redis `reconnect` event
212
+ * fix(redis integration): fix broken event propagation on `disrupted` events to some connection observers
213
+
214
+ ## Version 1.2.5
215
+
216
+ * feat(cache): extend method `expireValue` to work with has set fields as well
217
+
218
+ ## Version 1.2.4
219
+
220
+ * feat(cache): expose the cache module as export in `package.json`
221
+ * feat(cache): add method `hashDeleteField` to remove a hash-set field. This implements the `hdel` Redis command
222
+ * fix(tools): optimize method `stringifyJSON` not to call unnecessary decycling of the value if it's not an object
223
+ * fix(cache): replace `hmset` with `hset` Redis command in both methods that set hash-set values. Also remove unnecessary `_.isObjectLike` call in `hashSetFields` method
224
+
225
+ ## Version 1.2.3
226
+
227
+ * feat(start instance): add support for providing a custom path to the `.env` file to be used at service startup as process argument. Accepted arguments are `--env`, `--env-file`, `--dotenv`, `--dotenv-path`, and `-e`. The path itself should be relative to the working directory and should include the file name
228
+
229
+ ## Version 1.2.2
230
+
231
+ * feat(start instance): change package `dotenv` to `@dotenvx/dotenvx` for loading of ENV variables. The new package supports encrypting the ENV variables. For more information see https://dotenvx.com/docs/
232
+
233
+ ## Version 1.2.1
234
+
235
+ * feat(localization): add support for adding custom labels to the localization system. These have to follow the same format as the system labels
236
+ * docs: add section about localization to the `README.md` file
237
+
238
+ ## Version 1.2.0
239
+
240
+ * feat(config)!: change the setting `localization.labelsPath` to be an array of strings. It can now be used to supply any additional custom labels in one or more files to the framework
241
+ * feat(message memory cache): implement graceful exception handling during shut down procedure in `receiveMessage` and `sendMessage` methods
242
+ * fix(default message sender): add missing initialization of the memory cache on enable
243
+ * fix(default message receiver): add missing initialization of the memory cache on enable
244
+ * fix(message receiver): ensure `receive` method is no longer called recursively when the receiver has been disabled
245
+ * fix(redis integration)!: change the way the Redis client is initialized as the previous sequence was leaving unresolved promises and in some cases failed to fetch the Redis server settings. Also, it will now notify the listeners only once when the server settings are fetched and the connection is ready to be used
246
+ * fix(localization)!: change the way system labels are loaded as the previous implementation could cause a critical startup error if the working dir was different from expected
247
+ * fix(package): add the missing main export to the `start-instance.js` script. Without it was impossible to start the framework in specific cases like in a workspaces repository
248
+ * fix(message tracer): exclude `E_GEN_FEATURE_UNSUPPORTED` exception from the initialization of the message tracer exception handler
249
+ * fix(service executor)!: change the individual service registration process to ensure service registration does actually happen before the service provider finishes its initialization
250
+
251
+ ## Version 1.1.10
252
+
253
+ * fix(cache): fix redis client creation sequence. It is now created inside the constructor as intended. It still needs to be initialized explicitly using the `initialize` method.
254
+
255
+ ## Version 1.1.9
256
+
257
+ * feat(redis integration)!: change the way the `redis` client is initialized. Instead of happening automatically on class instantiation, it is now initialized on demand using the `initialize` method.
258
+ * feat(cache): change the way the main cache instance is initialized in compliance with the new redis integration
259
+ * feat(message memory cache)!: change the way the message memory cache is initialized in compliance with the new redis integration. The `initialize` method needs to be called explicitly to initialize the cache instance before it can be used.
260
+ * fix(message dispatcher): fix the way the `messageExchange` is initialized in the `MessageDispatcher` class (was not returning a promise)
261
+
262
+ ## Version 1.1.8
263
+
264
+ * feat(auditing): change export of the singleton class in an `instance` variable for consistency and clarity
265
+ * feat(message dispatcher): change export of the singleton class in an `instance` variable for consistency and clarity
266
+ * feat(cache): change export of the singleton class in an `instance` variable for consistency and clarity
267
+ * feat(service executor): implement service registration retry policy
268
+
269
+ ## Version 1.1.7
270
+
271
+ * feat(start instance): add support for the detection of `SIGBREAK` events and graceful shutdown on Windows
272
+ * feat(service instance)!: prevent the initialization of multiple `ServiceInstance` within the same process
273
+ * feat(message tracer)!: covert to singleton instance and add initialization method
274
+ * feat(message dispatcher): initialize the message tracer on start before message exchange is enabled
275
+ * fix(message tracer): optimize `recordTraceEntry` to not call set JSON command on every request
276
+ * fix(gcloud integration): fix the bool conversion of the `TI_GCLOUD_ENABLED` ENV variable
277
+ * fix(redis integration): update links to official commands documentation
278
+
279
+ ## Version 1.1.6
280
+
281
+ * feat(start instance): add fail-fast mode as default behavior on promise unhandled rejections
282
+ * feat(start instance): implement functionality to derive safe default service domain name when none is provided in the configuration
283
+ * feat(config): add support for new ENV variable `TI_FAIL_FAST_ON_UNHANDLED_OFF` that controls the fail-fast mode
284
+ * feat(service instance): ensure instance ID naming standard is followed when creating new instances and no ID is provided in the configuration
285
+ * feat(redis integration): marked command `hmset` as deprecated (according to official documentation)
286
+ * feat(redis integration)!: change redis client default behavior: set to automatically resend all pending commands on connection recovery with no limit on the retry attempts. This behavior cannot be changed. Arguments `autoRetryUnfulfilled` and `maxRetries` have been removed from the constructor
287
+ * feat(redis integration)!: add options to configure redis connection retry policy. This can be controlled with two new arguments in the constructor `retryMaxIntervalMs` and `retryMaxAttempts`.
288
+ * feat(redis integration)!: improve and extend the behavior of pub/sub implementation functionality. The `subscribeCommand` method can now only subscribe once to the same channel. The client instance will keep a map of all channels it has subscribed to. To unsubscribe, use the `unsubscribeCommand` method
289
+ * feat(redis integration): add a `shutDown` method to gracefully close a redis connection. This is now used on instance shut down sequence as well as in the default message sender and receiver implementations
290
+ * fix(start instance): fix the logging of reason for unhandled rejections and multiple resolves
291
+ * fix(service instance): use the static service domain name to initialize the health check instead of the ENV variable
292
+ * fix(redis integration): add detection of ReJSON2 in the verification of JSON support in the redis server
293
+ * build(npm): update npm dependencies to their latest versions
294
+ * docs: add section about ENV variables to the `README.md` file
295
+
296
+ ## Version 1.1.5
297
+
298
+ * fix(service instance): add overrides of the `reportHealthy` method in `ServiceConsumer` and `ServiceProvider` classes
299
+ * fix(tester): implement `reportHealthy` method
300
+ * docs(license): add a `LICENSE` file
301
+ * docs(license): change all licensing information in source files to GNU 3.0
302
+ * docs: improve the information in `README.md` file
303
+
304
+ ## Version 1.1.4
305
+
306
+ * feat(service instance): expose method `reportHealthy` and mark it as virtual to allow for overrides with custom health status reporting logic
307
+
308
+ ## Version 1.1.3
309
+
310
+ * feat(config)!: removed ENV variable `TI_OPERATION_MODE` as it was duplicating the practical purpose of `NODE_ENV`
311
+ * feat(config)!: setting `OPERATION_MODE` is now initialized by the `NODE_ENV` ENV variable (if provided)
312
+ * feat(service instance): show application operation mode in log at successful startup
313
+ * docs: add more sections and information in `README.md`
314
+
315
+ ## Version 1.1.2
316
+
317
+ * feat(localization): add new functionality for localization based on labels and system language. It is currently utilized by the `exceptions` module for localizing the exception descriptions. The new `localization` module can also be accessed externally in the implementing application's files via standard import
318
+ * feat(config): add new setting `localization.labelsPath` that specifies the file path for the localization labels
319
+ * feat(config): add new setting `localization.language` that specifies the language to be used for the labels
320
+ * feat(config): add new ENV variable `TI_LOCALIZATION_LABELS_PATH` that controls the `localization.labelsPath` setting
321
+ * feat(config): add new ENV variable `TI_LOCALIZATION_LANGUAGE` that controls the `localization.language` setting
322
+ * feat(logger): log exception label instead of system-level description
323
+ * fix(start instance): fix the order of ENV loading in the `start-instance.js` script. It will now properly load the `.env` file first and then proceed with any configuration overrides in `config` module
324
+ * fix(service provider): normalize service file paths on dynamic service handler loading
325
+ * build(npm): update npm dependencies to their latest versions
326
+
327
+ ## Version 1.1.1
328
+
329
+ * feat(config): add new ENV variable `TI_AUDITING_LOG_DETAILS` that controls the `auditing.logDetails` setting
330
+ * feat(service provider): add a method that returns a list of the currently registered services
331
+ * feat(tester service): improved the structure, configuration, and inline docs of tester service
332
+ * fix(logger): fix the way Exception is logged when it's a part of the main logging data object
333
+ * docs(readme): expanded the general documentation in `README.md` with a new section and improved many of the older sections
334
+ * docs: improved some of the JSDoc definitions across the framework
335
+
336
+ ## Version 1.1.0
337
+
338
+ * feat(redis integration): implement better process for fetching and storing the remote Redis server settings and enabled features
339
+ * feat(redis integration): add getter method `serverVersion` that returns the Redis server version
340
+ * feat(redis integration): add support for RedisJSON functionality
341
+ * feat(redis integration): add getter method `isJSONSupported` to verify if this module is enabled/supported in Redis server
342
+ * feat(redis integration): add separate enum for override modes `TiRedisOverrideMode`
343
+ * feat(redis integration): add support for executing any single command in Redis that is otherwise unsupported by the underlying framework. Use method `callCommand` for that in case you need to access something more exotic or currently unimplemented
344
+ * feat(cache): add support for working with JSON values. Currently supporting operations `set`, `get`, and `append array` with more coming in future versions
345
+ * feat(cache): add support for setting manual expiration of values
346
+ * feat(message tracer): change log level of trace entries from `DEBUG` to `NOTICE` for all events
347
+ * feat(message tracer): add functionality for storing the trace entries in the `cache` in JSON format. This is the default behavior and will always work. Traces can later be retrieved from the `cache` for further processing by specialized application
348
+ * feat(message tracer): add new property `traceTimestamp` to the trace entries as it may differ from the actual message timestamp
349
+ * feat(config): add new setting `messageExchange.traceExpirationTime` that controls the preservation time for all trace entries. Default is one hour and will be refreshed every time a new trace is generated. Setting this to `0` will disable
350
+ expiration altogether
351
+ * feat(config): add new setting `messageExchange.traceRepository` that specifies the name of the key in `cache` that will store the trace entries. The default one should be sufficient for most cases
352
+ * feat(config): change default of setting `messageExchange.traceLogEnabled` to `false`. With this change trace entries will not be written to the standard log output
353
+ * feat(exceptions): add new exception code `1006` as `E_GEN_FEATURE_UNSUPPORTED` to indicate functionality that is unsupported by the system or integrated application
354
+ * refactor(config)!: correct the name of the ENV variable controlling `memoryCache.user` to `TI_MEMORY_CACHE_USER` from previous `MEMORY_CACHE_USER`
355
+ * build(npm): update npm development dependencies to their latest versions
356
+ * docs: update some JSDoc types and other entries to reflect the current state of the code
357
+
358
+ ## Version 1.0.14
359
+
360
+ * feat(message exchange): improve the behavior of `onConnectionRecovered` and `onConnectionDisrupted` events in modules `cache`, `message-handler` and `service-executor` to prevent cross-activation or deactivation
361
+ * feat(redis integration): improve Redis integration for greater stability, support of Redis Cloud, and support for Redis 7
362
+ * feat(config): enable setting `auditing.logDetails` by default for all logs
363
+ * docs: update general documentation
364
+
365
+ ## Version 1.0.13
366
+
367
+ * build(npm): update npm dependencies to their latest versions
368
+
369
+ ## Version 1.0.12
370
+
371
+ * build(npm): update npm dependencies to their latest versions
372
+
373
+ ## Version 1.0.11
374
+
375
+ * feat(message exchange): implement message tampering and insertion protection
376
+ * feat(config): provide option to turn on/off the message tampering and insertion protection
377
+ * feat(config): provide option to turn on/off message tracing
378
+ * build(npm): update npm dependencies to their latest versions
379
+ * refactor(config)!: rename all environment variables that set configuration settings to match their related setting
380
+ * docs: add a change log
381
+
382
+ ## Version 1.0.0
383
+
365
384
  * feat: create initial version of the framework