All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Note: Some version numbers may be skipped to align feature set with the Java version.
N/A
N/A
Bugfix: The input data mapping behavior for regular task and subflow was inconsistent. Earlier, subflow's input data mapping requires the user to add a "body" namespace.
This release makes subflow executes like a regular task so that the input payload can be mapped to the input argument of the first task of a subflow without requiring a redundant "body" namespace.
Input headers (namespace input.header) are also mapped correctly to the first task of a subflow.
Updated unit tests to demonstrate the consistent input data mapping behavior for subflows.
Chapter 4 of developer guide is also updated.
Validation logic to filter out CR/LF for headers, cookies and session info when creating an AsyncHttpRequest from a map. For example, when using the "AsyncHttpClient by configuration" method, the AsyncHttpRequest is created by a map of key-values. The additional validation prevents creating headers and cookies with CR/LF accidentially.
Support runtime string substitution using a model variable.
StringBuilder class for easy concatenation of strings and other primitives into a single string.
N/A
Streamlined subflow routing in TaskExecutor of the event-script-engine. Changed subflow RPC call to asynchronous callback for performance optimization.
To reduce ambiguity in event script configuration, created an alias for model.parent. namespace as model.root.
The alias is implemented using a memory reference for lowest memory and processing overheads.
N/A
CompileFlows and TaskExecutor classes are updated to support the model.root. namespace alias.
Support json file from classpath and local file system in input data mapping
N/A
N/A
N/A
N/A
Rename "test" folder to "tests"
- util.portReady(host, port) API to test if an external server is available
- Minimalist Kafka Flow adapter for inbound and outbound messages
- Kafka emulator for unit tests
- "Pseudo annotation" for unit tests
N/A
TypeScriptClassScanner updated to support preloader generation for the test folder
- Support file "append" mode in output data mapping
- Dynamic fork-n-join feature for parallel processing of a list of elements by multiple instances of the same task
N/A
Improve CompileFlow error message. The new error message will tell where the error comes from.
Worked example and template to encapsulate worker thread as a composable function
N/A
N/A
N/A
N/A
Comprehensive refactoring applies to both JavaScript and TypeScript in the whole project to comply with SonarQube's complexity recommendation of 15.
Complex code blocks are decomposed into multiple smaller methods to improve readability.
Singleton constructors are updated with the JavaScript's native double question mark to check for null and undefined value.
Regression tests validated.
N/A
The "npm run pull" command is no longer required
Improved negate type mapping logic
- "Empty array index" syntax in data mapping to append an element to an array in a dataset
- Allow text constant in data mapping to contain any characters including the mapping signature "->"
N/A
Bugfix for certain edge cases in detecting a non-exist key in a MultiLevelMap
- dynamic model variable as index to address an array element (support LHS and RHS mapping)
- supports library resource file discovery in the configuration management system
- updated documentation of configuration management in Appendix-I of developer guide
N/A
N/A
- support of "flows" in the "modules.autostart" feature
- "length" type matching feature
- "dynamic model variables in for-loop" - model variable in comparator's left and/or right hand sides
N/A
Simplified configuration management system to support using the "test/resources" folder to override the "src/resources" folder during unit tests.
Automatically start main composable modules and libaries: When ComposableLoader initializes, it sends start commands to configured "main application" or "library" modules.
N/A
N/A
N/A
examples subproject
update vitest.config.ts
vitest
jest
minor adjustment in unit tests for vitest syntax
Express static file handler
- REST automation static file handler
- Custom MIME type configuration
N/A
- Support "matrix parameters" and "hash parameters" in HTTP request URI in platform-core
- Exported the FlowExecutor class in index.ts
N/A
- Bugfix for pipeline that contains only one task
- Rename variable 'flow' to 'template' in FlowInstance
- Apply path traversal avoidance using the Utility's getDecodedUri(path) method to each incoming HTTP request
Support 'Classpath' parameter in LHS of output data mapping
HTML escape characters in URI path handling in AsyncHttpClient
N/A
-
getError() method added in EventEnvelope to return encoded error message. This is required for distributed trace processing and proper error handling of subflows.
-
Generic resilience handler with alternative path and backoff features
N/A
Delete file when mapping a null value from the LHS to the RHS that is defined as a file, thus allowing clearing of temporary data files in a flow.
N/A
N/A
For security, the parent state machine (namespace "model.parent") is a protected resource. It can only be shared by the primary flow and all sub-flow instances that are instantiated from it.
N/A
Dependency for "execa" is not required
All sub-flows instantiated from a primary flow can access the same parent state machine using the "model.parent" namespace
- Support flow and function for external state machine
- Parent state machine for sub-flow
- Validation rules to reject access to the whole model or parent namespace
N/A
N/A
- simple type matching feature is extended with a new string 'concat' method
- default REST endpoints for /api/event and actuator services
N/A
- Sort REST endpoints for orderly loading
- Drop "async.http.request" RPC traces to reduce observability noise
Support scanning of TypeScript source file and compiled JavaScript files with class scanners (TypeScriptClassScanner and JavaScriptClassScanner)
N/A
preloader.js and developer guide updated
N/A
N/A
- Improved class scanner and loader
- Filter out event metadata to propagate as HTTP response headers
- Extract version from package.json to override info.app.version in application.yml
- Fork-n-Join parallel RPC request API in PostOffice
N/A
Updated Developer Guide's Chapter 5 to describe publishing mercury-composable core library to enterprise npm artifactory
- Log application initialization time
- Two additional actuator endpoints (/info/routes and /env)
N/A
- use different route names for various actuator services to avoid hardcode of URLs
- bugfix for Singleton pattern
Actuator REST endpoints are now configurable in rest.yaml
N/A
Update actuator services to serve REST requests directly
N/A
N/A
Update Actuator function and REST automation's static HTML file handler to address 2 security vulnerabilities reported by a Snyk scan.
- uuid v4 generator in the "simple type matching" feature
- event annotation feature
- tagging feature in the EventEnvelope
The "extra" field has been retired from EventEnvelope
Filter out protected metadata from RPC response to user functions (my_route, my_instance, my_trace_id, my_trace_path)
N/A
N/A
endFlow method of TaskExecutor sends event to distributed trace instead of logging
Added log.always feature in logger
N/A
Update distributed trace function to log in "always" mode
Add 3-part syntax for Event Script's data mapping processing.
Supports the following data mapping syntax:
- LHS -> RHS
- LHS -> model.variable -> RHS
N/A
- Make input event immutable to PostOffice's send and request API
- Consistent temporary stream folder name for Java and Node.js under /tmp/composable
Support of negate operator of a model value in event script added to the "simple type matching" feature
N/A
N/A
N/A
N/A
For consistency with the Composable Java version, do not use pretty JSON print when log.format=text
N/A
N/A
reconfigure logger to json or compact format early when app starts
This is a milestone release for consistent features and behaviors between Java and Node.js versions
- Composable methodology in developer guide
- Event Script engine for event choreography
- Composable example application
N/A
N/A
- Composable class scanner for the source folder
- Added "web.component.scan" parameter to support scanning of dependency libaries
N/A
N/A
AppConfig will resolve key-values from system properties and environment variables at startup
Eliminate preload.yaml configuration file
- Streamlined configuration management
- Updated preload annotation for developer to define concurrency
Support parsing of multiple environment variables and base system properties for a single key-value in Config Reader.
N/A
- Improved environment variable parsing logic and detection of config loops.
- Compatibility with Unix, Mac and Windows OS
Upgraded to sync with Mercury-Composable for the foundation event-driven and Event-over-HTTP design. Tested with Node.js version 22.12.0 (LTS). Backward compatible to version 20.18.1 (LTS).
Event-over-HTTP compatibility tests conducted with Mercury-Composable version 4.0.32.
N/A
N/A
- Refactored Event-over-HTTP to use standardized HTTP headers X-Stream-Id and X-Ttl
- Updated OSS dependencies to latest version
- Configured for EsLint version 9.16.0
Ported composable core features from Mercury 3.0 Java version
- Unit and end-to-end tests for Mercury 3.0 Node.js and for the example app project.
- For backward compatibility, added optional "setupMiddleware" method in the rest-automation module.
Threshold feature in REST automation
N/A
Minimal viable product
N/A
N/A