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.
sqlnow participates in begin/end transaction flows — reusesmsg.transaction.connectionwhen wired inside abegin-transaction/end-transactionblock.sqlhandles Oracleq'...'alternative-quoting literals in the bind pre-scan (all delimiter styles:[],{},<>,(), same-character) so quoted content is not mistaken for bind variables.- Dependencies updated:
oci-sdkbumped to^2.129.0(root, oci-nodes).
db-connectionpool initialization race — in-flight promise guard prevents parallel pool creation under concurrent startup.db-connectionclose path now waits for in-flight pool creation before shutdown so redeploy/stop cannot leave a newly created pool unclosed.db-connectionstandalone connection leak — connection now closed if NLS/session init fails after connect.db-connectionpool fields now preserve driver defaults when left blank (blanks were coerced to0).db-connectionconfig-file auth path now resolves from runtime user home (~/.oci/config) instead of hardcoded/home/opc.create-asset,create-meter-reading,misc-transaction,subinventory-quantity-transfer— error handler now callsdone(err)correctly, fixing Catch node routing on failures.oci-config,oci-notification,oci-object-storage— concurrent async client/provider initialization deduplicated with in-flight promise guards.scm-servertoken cache no longer immediately invalidates whenexpires_inis under 30 seconds.dequeuecontinuous mode retry close handler no longer shadows the Node-REDdonecallback.iot-commandnow debounces temporary command status reset timers to avoid unbounded timer buildup under high command throughput.
iot-update-relationshipnode for updating OCI IoT digital twin relationship content via the control-plane REST API.db-connectionNLS/session settings —NLS_LANGUAGE,NLS_TERRITORY,TIME_ZONE,NLS_NUMERIC_CHARACTERS,NLS_DATE_FORMAT,NLS_TIMESTAMP_FORMAT,NLS_TIMESTAMP_TZ_FORMAT, andAdvanced (restricted)fields applyALTER SESSIONstatements after every new connection and use a tag fingerprint on pool connections to avoid redundant re-application.
delete-transactionacceptsmsg.modeto override the Delete Mode at runtime ("asset","meter","misc","subinventory","custom"); unrecognised mode values now fail fast with a clear error instead of silently routing to the wrong endpoint.iot-update-relationshipnow uses a single output for success and routes failures through Catch (done(err)), aligning error handling with the rest of the node set.- Dependency maintenance and packaging hardening:
fusion-scm-nodesnow usesaxios@^1.15.0;oci-nodesnow declaresmqttfor standalone installs; root andoci-nodesnow pinoci-sdkto2.128.0;db-nodesOCI SDK-family dependencies (oci-common,oci-identitydataplane) were upgraded to^120.2.0; installation docs now include explicitoracledbnative module reliability guidance. scm-lookup,get-ib-asset,get-meter-reading,get-organization-id—msg.*query value now takes precedence over the editor-configured value (previously config won when both were set).fusion-requestacceptsmsg.methodto override the configured HTTP method at runtime (case-insensitive).scm-servertoken refresh is now deduplicated — concurrent callers during expiry wait for a single in-flight fetch instead of each issuing their own request; token lifetime usesexpires_infrom the OAuth response (with a 30-second safety buffer), falling back to the configured Expiry Fallback whenexpires_inis absent; request timeout of 30 seconds added to prevent indefinite hangs.scm-serverenforces HTTPS on the Token URL at deploy time; required config fields (Hostname,API Version,Token URL,Scope) now raise a clear error on deploy if left blank.- SCM HTTP request nodes (
fusion-request,scm-lookup,create-asset,create-meter-reading,misc-transaction,subinventory-quantity-transfer,get-ib-asset,get-meter-reading,get-organization-id) now set a 30-second axios timeout to avoid indefinite hangs when upstream endpoints or proxies stall. scm-lookupquery values are now encoded withURLSearchParamsso special characters in query values cannot break the URL structure; custom URLs with existing query parameters are extended safely viaURL.searchParams.scm-lookupcustom mode now requires both Query Param and Query Value — the node errors immediately if either is missing or if both are absent.get-organization-id,get-ib-asset,get-meter-readinglookup queries now useURLSearchParamsencoding so special characters in parameter values cannot break query structure.delete-transactionnow uses a genericresourceIdfield/runtime override (msg.resourceId) across all delete modes, addscustommode with mode-drivenCustom URL, URL-encodes resource IDs in path construction, and applies a 30-second delete request timeout.- SCM nodes with an
Endpointpreview field now default toSelect SCM Server to preview endpointwhen no server is selected; delete/lookup editors keep the dedicated top-section layout and custom-mode/override paths show custom URL values. fusion-request,create-asset,create-meter-reading,misc-transaction, andsubinventory-quantity-transferno longer supportOverride URL; typed transaction nodes now always use their canonical SCM endpoint, and custom endpoint routing is done viafusion-requestwithTransaction Type = custom.fusion-requestcustom endpoint editor section now matchesdelete-transaction/scm-lookupUI patterns (Endpoint preview,Custom URLfield styling, andEnter Custom URL to preview endpointplaceholder behavior).- SCM UI labels now consistently use
Miscellaneous Transaction(instead ofMisc. Transaction) acrossfusion-request,delete-transaction, and related docs. delete-transactionandscm-lookupcustom URL fields now require a base endpoint with no query string; query params must be provided through node fields (Resource ID/Query Param+Query Value) instead of embedded inCustom URL.oci-notification—msg.topicOcidandmsg.titlenow take precedence over the editor-configured values (previously config won when both were set).- SCM and OCI action nodes now emit a consistent error contract on failures:
msg.erroris an object ({ message, code }), withcodeset tonullwhen no upstream code is available. get-ib-asset,get-meter-reading,get-organization-id— Override URL removed; endpoint is now fixed to the SCM Server configuration. Usescm-lookupin custom mode to query alternative endpoints.- SCM node editor consistency —
delete-transactionDelete Mode renamed to Delete Type;fusion-requestTransaction Type select width standardised to200px;get-organization-idOrganization Name label icon corrected tofa-hashtag; error status on write nodes changed from generic"failed"to action-specific text ("create failed","transaction failed","transfer failed","request failed");delete-transactionResource ID hint aligned to match sibling node phrasing. fusion-requestsuccess status changed from"success"to"sent";misc-transactionfrom"transaction complete"to"submitted";subinventory-quantity-transferfrom"transfer complete"to"transferred".- OCI action nodes (
oci-notification,oci-object-storage,oci-logging,oci-log-analytics,iot-send-command,iot-update-relationship) now use action-specific error status text ("publish failed","operation failed","ingest failed","upload failed","send failed","update failed") instead of the generic"failed". - DB action nodes (
sql,enqueue) now use action-specific error status text ("query failed","enqueue failed") instead of generic"error". delete-transactionendpoint preview now updates live as the Resource ID field is typed.iot-telemetry,iot-commandconnection error status changed from generic"error"to"connection error".- SCM action nodes (
create-asset,create-meter-reading,misc-transaction,subinventory-quantity-transfer,delete-transaction,scm-lookup,fusion-request,get-ib-asset,get-meter-reading,get-organization-id) — config-error status text lowercased ("No SCM server"→"no SCM server"); field-missing status text lowercased and made human-readable ("No SerialNumber"→"no serial number","No AssetNumber"→"no asset number","No Organization Name"→"no organization name","Missing URL"→"no custom URL"). sql— config-error and input-error status text lowercased ("No DB connection"→"no DB connection","No msg.sql"→"no msg.sql","No SQL provided"→"no SQL provided").- DB status-shape consistency:
sqlnow usesringfor pre-execution config/input validation failures anddotfor execution states/results;end-transactioncommit/rollback failure status now usesdot. smo-transformercomposite mode now re-validates required fields after fragment merge and keeps merged payloads pending until complete instead of emitting incomplete joined events.smo-transformercomposite mode now requiresentityCodeandeventTimefor incomplete fragments and fails fast when either is missing, preventingunknown_unknown_*key collisions.dequeueContinuous mode now supports optional DB reconnect/retry with fixed delay and configurable retry limit (0= unlimited) so transient DB failures no longer require a flow restart.enqueueoutput now emits onlymsg.count(when Output is enabled);msg.enqueuedwas removed to keep the output contract minimal.enqueuenow reusesmsg.transaction.connectionwhen present, so begin/end transaction controls final commit/rollback instead of enqueue auto-committing on its own connection.- Config nodes (
db-connection,oci-config,iot-config,scm-server) now support an optionalNamefield; node labels preferNamewhen set for clearer selectors. iot-confignow preserves QoS0on subscribe/re-subscribe and validates MQTT subscription patterns so invalid wildcard usage is rejected early.iot-configUse Proxy and Proxy URL fields removed — the OCI IoT Platform only supports MQTTS on port 8883 and does not support proxy connections.iot-commandandiot-telemetrynow preserve configured QoS0values (no fallback coercion to1).iot-update-relationshipnow includes optional editor fallback fields for relationship key/content and an in-editor runtime override tip formsg.*precedence.sqlBinds Mapping now provides a...JSONata editor button for JSONata source rows to improve expression authoring.iot-confignow exposes MQTT-style advanced connection settings forcleansession mode,keepalive,reconnectPeriod, andconnectTimeout.iot-confignow includes inline node help text covering connection/auth setup, advanced MQTT settings, and persistent-session guidance.iot-configadvanced numeric inputs now clamp in the editor to supported ranges for keepalive/reconnect/connect-timeout values.oci-configandscm-servernow include inline node help text describing auth/connection fields and usage guidance.enqueuepayload editor now uses a single...JSON editor button for JSON/ADT payload types, aligned with Node-RED editor patterns.sqlnow validates SQL placeholder/bind parity before execute and reports bind mismatches with a clear node status instead of raw Oracle bind errors.sqlEditor mode now blocks semicolon-chained multi-statement SQL before execute while still allowing anonymous PL/SQL blocks.begin-transactionnow refreshes timeout windows on reuse and records timeout lifecycle markers (timedOut,endedAt) for downstream outcome handling.end-transactionnow treats timed-out transactions as explicit errors for Catch routing and ignores duplicate end attempts with statusalready ended.db-connectioneditor converted from flat fieldsets to tabbed layout (Auth, Connection, Pool, NLS).db-connectionAdvanced (restricted)now enforces allowlisted session SQL (ALTER SESSION SET ...) with editor/runtime fail-fast validation and explicit length/statement limits.
iot-configsubscriber callback exceptions are now contained and logged instead of escaping the MQTT message handler.iot-configTest Connection endpoint now uses single-response guards/cleanup to avoid timeout/connect error response races.iot-configclose path now has a safety timeout so Node-RED shutdown does not hang if MQTT client end callbacks do not fire.iot-commandnow rejects invalid MQTT wildcard topic patterns at startup instead of attempting a broken subscription.iot-telemetrynow validatesmsg.qosoverrides and falls back to configured QoS when runtime override values are invalid.begin-transactionnow clears tracked timeout handles on node close/redeploy to prevent orphan timeout callbacks.end-transactionno longer attempts cleanup rollback on null/closed connections after timeout-driven close paths.create-asset,create-meter-reading,misc-transaction, andsubinventory-quantity-transfereditor endpoint previews now repopulate correctly when an SCM Server is selected.
db-connectionDriver Mode toggle (Thick / Thin), Wallet Path, Proxy User, and two new auth types: DB Token — Resource Principal and DB Token — Session Token.db-connectioninline help text for all auth types, connection options, and Test Connection behaviour.sqlrow-based Binds Mapping editor with source types (static, number, boolean, date, msg property, JSONata) and runtimemsg.bindssupport.dequeueContinuous mode — auto-starts on deploy, long-polls with no input trigger, immediate auto-commit. Transactional mode (default) is unchanged.enqueueDelivery Mode (Persistent / Buffered), Payload Type (JSON / RAW / ADT), single-object auto-wrap, and optional output port.dequeuePayload Type (JSON / RAW / ADT) with automatic ADT-to-plain-object conversion.
iot-configis now connection-only. Topic and QoS moved to individual node editors, following themqtt-broker/mqtt-in/mqtt-outpattern.iot-telemetryTopic and QoS fields added to editor. Topic falls back tomsg.topic;msg.qosoverrides QoS per message.iot-commandTopic (required) and QoS fields added to editor. Auto-acknowledge andmsg.sendResponse()removed — use a separate publish node to send responses.sqloutputs rows inmsg.payloadonly;msg.resultremoved.db-connectionauth type labels clarified (e.g. "Config File Auth" → "DB Token — Config File"). Existing nodes unaffected.
oci-configInstance/Resource Principal async builder not awaited — causedgetPassphrase is not a functionon Test Connection.- OCI service nodes (
oci-notification,oci-object-storage,oci-logging,oci-log-analytics,iot-send-command) passed a Promise instead of a resolved auth provider to SDK clients. dequeueADT NJS-106 crash — payload read afterconnection.close(). Fixed by extracting payloads before closing.dequeueContinuous mode hanging deploy shutdown with "Close timed out". Fixed with coordinatedconnection.break()stop path.db-connectionResource Principal and Session Token bypassed theextensionOciplugin (missing dispatch case / wrong key ID format). Both now implemented directly viaaccessTokencallback.iot-send-commandduration fields now validated as ISO 8601 before calling OCI;msg.responseEndpointonly set when Wait for Response is enabled.
oci-loggingnode for OCI Logging Ingestion (putLogs) to write events to OCI Custom Logsoci-log-analyticsnode files (oci-nodes/nodes/oci-log-analytics.html,oci-nodes/nodes/oci-log-analytics.js)oci-loggingnode files (oci-nodes/nodes/oci-logging.html,oci-nodes/nodes/oci-logging.js)oci-object-storagenode files (oci-nodes/nodes/oci-object-storage.html,oci-nodes/nodes/oci-object-storage.js)
- Updated OCI node documentation (installation guide, README, and node reference) to include
oci-object-storage,oci-loggingandoci-log-analytics
oci-loggingnow reports response status code from SDK response instead of hardcoded200- Added payload-size guard rails in
oci-loggingandoci-log-analyticsto reject oversized log records before API submission - Message-passing consistency updates in
db-nodes/nodes/sql.js,db-nodes/nodes/enqueue.js,db-nodes/nodes/dequeue.js,db-nodes/nodes/begin-transaction.js, andoci-nodes/nodes/iot-telemetry.jsto preserve upstreammsgproperties andmsg.transactioncontext where required
oci-configshared authentication node for OCI services (Config File, Instance Principal, Resource Principal, API Key)oci-notificationnode for publishing to OCI Notifications topics (email, Slack, PagerDuty, webhook, SMS, OCI Functions)iot-configMQTT connection node for the OCI IoT Platform (Basic and Certificate auth, persistent sessions, auto-reconnect)iot-telemetrynode for publishing device telemetry to the IoT Platformiot-commandnode for receiving commands from the IoT Platform with auto-acknowledgeiot-send-commandnode for sending commands to devices via the OCI REST API- Dequeue Mode dropdown on
dequeue(Remove, Browse, Locked) - Commit/Rollback action toggle on
end-transactionfor explicit error handling - Test Connection button on
iot-config
end-transactionnow supports Rollback action for error paths — wire success to commit, errors to rollbackdequeuemode changed from hardcoded Locked to configurable Remove
dequeuereturning the same message endlessly (was usingAQ_DEQ_MODE_LOCKEDinstead ofAQ_DEQ_MODE_REMOVE)end-transactioncommitting on error paths because flow doesn't stop after downstream failures
fusion-request,scm-lookup,begin-transaction,end-transaction,smo-transformer, anddelete-transactionnodes- 3-source payload mappings on all SCM transaction nodes (dequeued data, msg property, static value)
- Test Connection button on
db-connection - SQL Source dropdown on
sql(Editor / msg.sql) msg.payloadfallback onenqueue- URL override pattern and updated help text on all nodes
- Dequeue checkbox not saving, proxy not working on SCM nodes, transaction ID not set on delete, wrong endpoint on create-meter-reading, region field masked as password, documentation (node reference, best practices, installation guide, import examples, readme)
Initial release. Previously untagged code now retroactively tagged as baseline.
- DB nodes:
db-connection,begin-transaction,end-transaction,dequeue,enqueue,sql - SCM nodes:
scm-server,create-asset,create-meter-reading,misc-transaction,subinventory-quantity-transfer,get-ib-asset,get-meter-reading,get-organization-id - Documentation: node reference, best practices, installation guide, import examples, AQ setup guide