Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1035 commits
Select commit Hold shift + click to select a range
f25449e
test(nats): verify ACK dispatch using registered consumer deliveries
mbuckton Oct 12, 2026
d2563cc
fix(engine): clear cached retained identifier when removing retention
mbuckton Oct 12, 2026
fcdbe80
test(mqtt-sn): close UDP clients when interoperability tests fail
mbuckton Oct 12, 2026
d3f29d2
fix(stomp): enforce exact versions and case-sensitive headers, reject…
mbuckton Oct 12, 2026
e4ce568
test(stomp): cover exact versions, header case and subscription errors
mbuckton Oct 12, 2026
4a9e2e6
test(stomp): encode frame terminators correctly in new header tests
mbuckton Oct 12, 2026
64fed8f
test(stomp): keep original subscription on duplicate identifier
mbuckton Oct 12, 2026
386d002
fix(stomp): trim header names and values around colon separators
mbuckton Oct 12, 2026
3a52cfe
test(stomp): cover CRLF whitespace and malformed version offers
mbuckton Oct 12, 2026
1e6332d
fix(engine): restore namespace-first alias unsubscribe resolution
mbuckton Oct 12, 2026
ddd14c2
fix(mqtt): reject malformed encodings and invalid MQTT 5 negotiation
mbuckton Oct 12, 2026
b3112cf
test(mqtt): restore wire conformance and cover malformed MQTT 3/5 inputs
mbuckton Oct 12, 2026
e7c90eb
fix(mqtt): complete CONNECT property imports and DISCONNECT test acce…
mbuckton Oct 12, 2026
c148e50
fix(websocket): stop decoding after CLOSE and require CRLF upgrade
mbuckton Oct 12, 2026
cc6591f
test(websocket): enable MSG-370 conformance and cover CLOSE lifecycle
mbuckton Oct 12, 2026
825f993
test(amqp): enable AMQP 1.0 and JMS protocol conformance failures
mbuckton Oct 12, 2026
9bce9eb
feat(amqp): add incremental transport framing validation for MSG-397
mbuckton Oct 12, 2026
84efeec
fix(amqp): reject invalid transport frames and flush peer CLOSE befor…
mbuckton Oct 12, 2026
f6ac571
test(amqp): cover transport validation boundaries and SASL handoff
mbuckton Oct 12, 2026
5bc2b0e
fix(amqp): route unidentified producers and preserve exact JMS expiry
mbuckton Oct 12, 2026
e58d731
fix(amqp): advertise and map Qpid JMS delayed delivery
mbuckton Oct 12, 2026
03171ec
fix(amqp): preserve producer expiry from creation-time plus TTL
mbuckton Oct 12, 2026
8eb102c
test(amqp): cover anonymous sender routing, delayed delivery and exac…
mbuckton Oct 12, 2026
c91d2ac
fix(amqp): advance SCRAM SASL only on received input and emit outcome…
mbuckton Oct 12, 2026
3172afe
test(amqp): protect SCRAM input timing and single SASL outcome
mbuckton Oct 12, 2026
b0f5219
fix(amqp): bound decoded unsigned AMQP frame length before integer co…
mbuckton Oct 12, 2026
e1d9d02
test(mqtt): expose MQTT 3/5 subscription and UNSUBACK conformance gaps
mbuckton Oct 12, 2026
1a1d8fd
fix(mqtt): enforce SUBSCRIBE validation and MQTT 5 UNSUBACK reasons
mbuckton Oct 12, 2026
0b9aa21
test(mqtt): verify CONNACK 0x01 closure and mandatory UNSUBACK payload
mbuckton Oct 12, 2026
0bfd4ef
check for npe
mbuckton Oct 13, 2026
6cfa372
test(mqtt5): expose UNSUBACK identifier and property boundaries
mbuckton Oct 13, 2026
e9fbbde
test(mqtt): expose shared and Unicode SUBSCRIBE round-trip defects
mbuckton Oct 13, 2026
bdf23b8
fix(mqtt5): validate UNSUBACK values and count complete property headers
mbuckton Oct 13, 2026
2a17c18
fix(mqtt): preserve shared filters and UTF-8 SUBSCRIBE wire lengths
mbuckton Oct 13, 2026
33669ff
test(mqtt5): verify UNSUBACK payload and remaining-length boundaries
mbuckton Oct 13, 2026
5d0d0e1
test(mqtt5): preserve maximum subscription IDs and literal share pref…
mbuckton Oct 13, 2026
fac7a57
test(mqtt5): expose UNSUBACK allocation from an unavailable payload
mbuckton Oct 13, 2026
989adda
fix(mqtt5): reject truncated UNSUBACK payloads before allocation
mbuckton Oct 13, 2026
9c4c153
test(mqtt): verify version routing and close after partial CONNACK wr…
mbuckton Oct 13, 2026
db41855
test(amqp): expose freed sender links and erased parent sessions
mbuckton Oct 13, 2026
5a00d4d
test(network): cover connection rejection before selector registration
mbuckton Oct 13, 2026
d09076c
test(mqtt5): reject properties that cross their declared boundary
mbuckton Oct 13, 2026
eeeb4b5
fix(mqtt5): bound property decoding to the declared section
mbuckton Oct 13, 2026
8a67f8f
test(mqtt): expose coalesced input bypassing rejected CONNECT completion
mbuckton Oct 13, 2026
062aed7
fix(mqtt): route invalid versions and stop rejected connection input
mbuckton Oct 13, 2026
66371d2
fix(network): allow rejection before selector registration
mbuckton Oct 13, 2026
9d9bf79
fix(amqp): retain active sender links and parent sessions on detach
mbuckton Oct 13, 2026
d311311
test(stomp): verify duplicate subscriptions by object identity
mbuckton Oct 13, 2026
abd957e
test(stomp): identify sections for negotiation and lifecycle conformance
mbuckton Oct 13, 2026
3d008bb
test(websocket): reference HTTP handshake line termination requirements
mbuckton Oct 13, 2026
111126d
test(amqp): require detach acknowledgement without subscription context
mbuckton Oct 13, 2026
0d69655
fix(amqp): acknowledge detached links without subscription context
mbuckton Oct 13, 2026
23442e5
test(mqtt5): enable UNSUBACK wire conformance regression
mbuckton Oct 13, 2026
a3d12cc
test(amqp): reproduce expiry metadata mutation failures
mbuckton Oct 13, 2026
09dc206
fix(amqp): retain mutable expiry translation metadata
mbuckton Oct 13, 2026
30b4ad5
test(amqp): supply validator dependency in buffer ownership harness
mbuckton Oct 13, 2026
e01e50c
Merge remote-tracking branch 'origin/fix/MSG-374-udp-protocol-complia…
mbuckton Oct 13, 2026
40378dc
ci(jenkins): reset generated security and data before test blocks
mbuckton Oct 13, 2026
f8a21b7
ci(jenkins): limit test state cleanup to target data
mbuckton Oct 13, 2026
58e024e
match sync calls
mbuckton Oct 13, 2026
70a2d00
validate protocol configuration during MQTT-SN session initialization
mbuckton Oct 13, 2026
f63f5c7
chore(scripts): clarify shell checks and package ordering
mbuckton Oct 13, 2026
7bfa595
refactor(aggregator): combine equivalent wildcard branches
mbuckton Oct 13, 2026
30187a8
refactor(analytics): clarify quantile interpolation variables
mbuckton Oct 13, 2026
79b5f77
refactor(auth): simplify identity group mapping
mbuckton Oct 13, 2026
bc7fb6e
refactor(config): simplify configuration helpers and private constants
mbuckton Oct 13, 2026
ade49cb
refactor(dto): simplify schema configuration mapping
mbuckton Oct 13, 2026
b4b40f8
refactor(engine): simplify schema and persistence helpers
mbuckton Oct 13, 2026
af528d6
refactor(geospatial): retain record validation without redundant assi…
mbuckton Oct 13, 2026
cd4f99b
refactor(ha): make the existing heartbeat time zone explicit
mbuckton Oct 13, 2026
714c4e9
refactor(hardware): clarify serial port delegation
mbuckton Oct 13, 2026
69ba350
refactor(license): remove the unused CLI exception declaration
mbuckton Oct 13, 2026
7cfb918
refactor(network): clarify local names and equivalent expressions
mbuckton Oct 13, 2026
7f23514
refactor(amqp): clarify inbound frame validation
mbuckton Oct 13, 2026
03d1611
refactor(mqtt): simplify packet calculations and subscription constants
mbuckton Oct 13, 2026
5a4baea
refactor(nats): centralize JetStream response constants
mbuckton Oct 13, 2026
750dbf6
refactor(stomp): simplify supported-version token validation
mbuckton Oct 13, 2026
9cd51e8
refactor(websockets): clarify frame header sizing
mbuckton Oct 13, 2026
e5ab78e
refactor(rest): clarify cache and endpoint helpers
mbuckton Oct 13, 2026
c39755d
refactor(state): clarify twin and vehicle helper expressions
mbuckton Oct 13, 2026
1ec51a9
refactor(storage): clarify persistent counter helpers
mbuckton Oct 13, 2026
c6d9917
refactor(tools): simplify configuration lint and rendering helpers
mbuckton Oct 13, 2026
a2cfae6
refactor(utilities): clarify statistics implementations
mbuckton Oct 13, 2026
4b0dc20
refactor(test): clarify helper names and intentional callbacks
mbuckton Oct 13, 2026
b8f8b76
docs(quality): record the server SonarCloud cleanup review
mbuckton Oct 13, 2026
830fb9f
fix(engine): protect subscription contexts during teardown
mbuckton Oct 13, 2026
4c62ca0
fix(protocol): guard subscription teardown and session metadata
mbuckton Oct 13, 2026
b08ee84
fix(mqtt-sn): preserve queued delivery and identifier ownership
mbuckton Oct 13, 2026
91dbdc0
fix(nats): coordinate outbound registration with shutdown
mbuckton Oct 13, 2026
c0344d8
fix(satellite): validate modem command payload and format
mbuckton Oct 13, 2026
5526eba
fix(auth): close the database when store initialization fails
mbuckton Oct 13, 2026
beca5b2
fix(auth): close operation-owned token HTTP clients
mbuckton Oct 13, 2026
6249249
fix(ml): close operation-owned selector HTTP clients
mbuckton Oct 13, 2026
4c5dd0a
refactor(time): make the existing system time zone explicit
mbuckton Oct 13, 2026
53287fc
docs(quality): record reliability and lifetime ownership review
mbuckton Oct 13, 2026
1b82d2d
fix(state): stop managed components in reverse startup order
mbuckton Oct 13, 2026
a17b644
fix(engine): enforce topic wildcard level boundaries
mbuckton Oct 13, 2026
08b4fe2
fix(protocol): apply MQTT pull namespace substitution once
mbuckton Oct 13, 2026
4c57dc7
fix(mqtt): wait for accepted SUBACKs before establishing pull links
mbuckton Oct 13, 2026
f86c2b1
fix(network)!: derive MQTT bridge session IDs from namespace mappings
mbuckton Oct 13, 2026
a9350fc
test(mqtt): align SUBACK coverage with remote subscription tracking
mbuckton Oct 13, 2026
fcd5dc5
test(nats): always close clients after failed drain
mbuckton Oct 13, 2026
8d1ba05
test(mqtt): finish replay acknowledgements before disconnecting
mbuckton Oct 13, 2026
dbe7693
fix(protocol): handle empty MQTT-SN Will topic deletion
mbuckton Oct 13, 2026
64a8a4a
fix(protocol): decode MQTT-SN extended length headers consistently
mbuckton Oct 13, 2026
7c0d0eb
fix(network): ignore callbacks from superseded connection endpoints
mbuckton Oct 13, 2026
b1d234c
chore(quality): suppress reviewed Sonar noise
mbuckton Oct 13, 2026
3e98cd0
fix(config): compare REST timeout settings by value
mbuckton Oct 13, 2026
a8b25d8
perf(protocol): trim mapped topic separators in linear time
mbuckton Oct 13, 2026
2e700b8
perf(auth): reuse secure password randomness
mbuckton Oct 13, 2026
0a38dbe
test(server): order session and destination cleanup
mbuckton Oct 13, 2026
f1a0f5b
fix(downloads): enforce HTTPS redirects and fail on transfer errors
mbuckton Oct 13, 2026
63f0e43
fix(network): close transport attempts cancelled before publication
mbuckton Oct 13, 2026
241d3c4
fix(canbus): serialize writes and preserve replacement device ownership
mbuckton Oct 13, 2026
824beb5
fix(mqtt5): reject CONNACK without a connection session identity
mbuckton Oct 13, 2026
19379c9
fix(mqtt-sn): compare authenticated sender identifiers by content
mbuckton Oct 13, 2026
c0cc57b
fix(satellite): compare packed payloads by content
mbuckton Oct 13, 2026
9e87a04
refactor(config): remove unreachable missing configuration branch
mbuckton Oct 13, 2026
c731e3c
refactor(mqtt): remove unused publish lookup argument
mbuckton Oct 13, 2026
843ac7e
chore(satellite): document explicit outbound format validation
mbuckton Oct 13, 2026
0d1fd84
chore(network): document locked connection reference ownership
mbuckton Oct 13, 2026
5c7f545
refactor(mavlink): clarify parser factory thread confinement
mbuckton Oct 13, 2026
f49adab
chore(drone): document caller ownership of task extension state
mbuckton Oct 13, 2026
16d4d45
chore(rest): document local session caches and deferred permissions
mbuckton Oct 13, 2026
a96f041
refactor(network): extract reconnect transformation resolution
mbuckton Oct 13, 2026
c437147
refactor(protocol): separate inbound mapping match and destination as…
mbuckton Oct 13, 2026
57b206f
refactor(amqp): separate frame envelope and OPEN descriptor validation
mbuckton Oct 13, 2026
1adfec0
refactor(mqtt): separate topic filter and subscription option validation
mbuckton Oct 13, 2026
9633b0c
refactor(mqtt5): separate CONNECT validation and session initialization
mbuckton Oct 13, 2026
7e820c8
refactor(mqtt-sn): separate queued message acceptance and delivery ph…
mbuckton Oct 13, 2026
fff84b2
refactor(mqtt-sn): separate connectionless packet dispatch
mbuckton Oct 13, 2026
2d4b255
refactor(mqtt-sn): separate protected frame authentication and replay…
mbuckton Oct 13, 2026
ab9f516
refactor(mavlink): separate stream framing and per-frame routing
mbuckton Oct 13, 2026
cb2d6ba
refactor(storage): separate alias snapshot header and entry validation
mbuckton Oct 13, 2026
872b2d5
refactor(nats): separate archive seeding and consumer lifecycle phases
mbuckton Oct 13, 2026
457e968
refactor(nats): separate dispatch delivery and cleanup phases
mbuckton Oct 13, 2026
7ff406f
refactor(kpi): separate fault detection degradation and restoration
mbuckton Oct 13, 2026
1ccb31f
refactor(kpi): separate machine health and classification counters
mbuckton Oct 13, 2026
b8aecc5
fix(docker): enforce HTTPS for redirected downloads
mbuckton Oct 14, 2026
5ed4351
feat(storage): add bidirectional persistent packet identifier store
mbuckton Oct 14, 2026
35a4b3d
fix(storage): make packet identifier tests portable on Windows
mbuckton Oct 14, 2026
ed442da
test(storage): stress concurrent session packet identifier allocation
mbuckton Oct 14, 2026
3b6cc48
feat(storage): persist MQTT delivery stages and compact journals
mbuckton Oct 14, 2026
abf1902
feat(engine): own MQTT packet delivery state for persistent sessions
mbuckton Oct 14, 2026
0db3792
feat(protocol): recover MQTT and MQTT-SN outbound packet identifiers
mbuckton Oct 14, 2026
b4c5620
fix(mqtt-sn): guard retired QoS 2 engine acknowledgement callbacks
mbuckton Oct 14, 2026
a6e2f93
fix(mqtt-sn): gate PUBREL before submitting engine acknowledgements
mbuckton Oct 14, 2026
db26ad1
test(mqtt): align flow control assertions with delivery-aware packet …
mbuckton Oct 14, 2026
a1d616f
test(subscription): provide physical destination in lifecycle fixture
mbuckton Oct 14, 2026
becea70
fix(mqtt5): return packet identifier not found for unknown PUBREC
mbuckton Oct 14, 2026
7d89b7a
fix(engine): coalesce event-driven reaper work with a periodic fallback
mbuckton Oct 14, 2026
e9c101d
feat(engine): expose pending reaper work for coalesced scheduling
mbuckton Oct 14, 2026
1d7064d
test(engine): verify completion batches survive concurrent swaps
mbuckton Oct 14, 2026
3a56182
fix(subscription): preserve shared delivery key after context removal
mbuckton Oct 14, 2026
28d97f1
test(subscription): retain delivery key after shared context removal
mbuckton Oct 14, 2026
59f38de
test(engine): initialize reaper lock in constructor-bypassing fixture
mbuckton Oct 14, 2026
ff89a8b
test(subscription): supply shared delivery identity in flow-control f…
mbuckton Oct 14, 2026
bd5dbf7
fix(engine): move reaper rescheduling out of finally block
mbuckton Oct 14, 2026
7f1c471
fix(storage): evaluate journal compaction threshold as long
mbuckton Oct 14, 2026
b8b9b2f
fix(engine): preserve reaper processing failure when rescheduling fails
mbuckton Oct 14, 2026
55aa7f7
fix(storage): document ownership transfer for persistent delivery res…
mbuckton Oct 14, 2026
36f3fea
fix(storage): document ownership transfer for persistent delivery res…
mbuckton Oct 14, 2026
1686aa9
fix(engine): remove extra closing brace in reaper helper
mbuckton Oct 14, 2026
f80d1c5
refactor(session): remove redundant volatile from synchronized connec…
mbuckton Oct 15, 2026
83a36b0
refactor(subscription): snapshot volatile delivery coordinator for cl…
mbuckton Oct 15, 2026
3641440
refactor(subscription): snapshot volatile delivery coordinator for cl…
mbuckton Oct 15, 2026
f9215ea
docs: establish agreed MapsMessaging Java coding standards
mbuckton Oct 15, 2026
ddd3742
style: align delivery persistence code with MapsMessaging standards
mbuckton Oct 15, 2026
1d8bd1f
style: align delivery persistence code with MapsMessaging standards
mbuckton Oct 15, 2026
fa6dcd4
style: align delivery persistence code with MapsMessaging standards
mbuckton Oct 15, 2026
60b6312
style: use explicit types and expanded blocks in new protocol code
mbuckton Oct 15, 2026
34f3422
style: use explicit types and expanded blocks in new protocol code
mbuckton Oct 15, 2026
ff82e31
style: use explicit types and expanded blocks in new protocol code
mbuckton Oct 15, 2026
165774e
style: use explicit security identity type in JetStream adapter
mbuckton Oct 15, 2026
27f7095
style(mqtt-sn2): use explicit types and expanded delivery control flow
mbuckton Oct 15, 2026
299acff
style(mqtt-sn2): expand protection verifier conditionals
mbuckton Oct 15, 2026
f171f9d
style(mqtt-sn2): expand protocol validation branches
mbuckton Oct 15, 2026
8fba4d6
fix(style): use DTO type for JetStream subscription metadata iteration
mbuckton Oct 15, 2026
4881129
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
db6b71f
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
85a7e55
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
fc54fa9
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
1eed5ca
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
3349b9b
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
275b454
style(mqtt-sn2): expand packet codec control-flow blocks
mbuckton Oct 15, 2026
cf51f04
style(mqtt-sn2): expand codec conditions without logic changes
mbuckton Oct 15, 2026
5444586
style(mqtt-sn2): expand codec conditions without logic changes
mbuckton Oct 15, 2026
4f682ab
style(mqtt-sn2): expand codec conditions without logic changes
mbuckton Oct 15, 2026
a7a16aa
style(mqtt-sn2): expand lifecycle and protection conditions
mbuckton Oct 15, 2026
5c81fac
style(mqtt-sn2): expand lifecycle and protection conditions
mbuckton Oct 15, 2026
8b21e2f
style(mqtt-sn2): expand crypto provider conditions
mbuckton Oct 15, 2026
d5ccdbc
style(mqtt-sn2): expand crypto provider conditions
mbuckton Oct 15, 2026
56ad566
style(mqtt-sn2): expand crypto provider conditions
mbuckton Oct 15, 2026
9656543
style(mqtt-sn2): expand crypto provider conditions
mbuckton Oct 15, 2026
41f87cc
style(mqtt-sn2): expand protocol lifecycle guard blocks
mbuckton Oct 15, 2026
4cbaddb
style(mqtt-sn2): expand outgoing delivery guards
mbuckton Oct 15, 2026
f533226
style(mqtt-sn2): explicitly type protection payload and envelopes
mbuckton Oct 15, 2026
7f03e49
style(mqtt-sn2): use verified explicit counter and queue iterator types
mbuckton Oct 15, 2026
5a37f2f
style(mqtt-sn2): use verified explicit counter and queue iterator types
mbuckton Oct 15, 2026
51b9554
style(nats): use verified types in JetStream stream removal
mbuckton Oct 15, 2026
ff40dee
style(mqtt): explicitly type packet state and expand guards
mbuckton Oct 15, 2026
62beb16
style(mqtt): expand protocol guards
mbuckton Oct 15, 2026
45efcc0
style(mqtt): expand listener control flow
mbuckton Oct 15, 2026
1ad9ba1
style(mqtt): expand listener control flow
mbuckton Oct 15, 2026
3336f40
style(mqtt): expand listener control flow
mbuckton Oct 15, 2026
0e61eb0
style(mqtt): use explicit unsubscribe state types
mbuckton Oct 15, 2026
bb2eca5
style(mqtt): explicitly type PUBREL acknowledgement gate
mbuckton Oct 15, 2026
a919937
style(mqtt5): expand protocol and listener guard clauses
mbuckton Oct 15, 2026
cb5e747
style(mqtt5): expand protocol and listener guard clauses
mbuckton Oct 15, 2026
20637f0
style(mqtt5): expand protocol and listener guard clauses
mbuckton Oct 15, 2026
f634199
style(mqtt5): expand protocol and listener guard clauses
mbuckton Oct 15, 2026
a84d908
style(mqtt5): expand protocol and listener guard clauses
mbuckton Oct 15, 2026
c07d212
style(mqtt5): use verified explicit packet manager types
mbuckton Oct 15, 2026
c0f50ef
style(mqtt5): use verified explicit packet manager types
mbuckton Oct 15, 2026
b9c1f62
style(mqtt5): use verified explicit packet manager types
mbuckton Oct 15, 2026
026ce19
style(mqtt5): use verified explicit packet manager types
mbuckton Oct 15, 2026
6dae11c
style(mqtt5): use verified explicit packet manager types
mbuckton Oct 15, 2026
65cd10b
style(mqtt-sn1): expand packet and state guards
mbuckton Oct 15, 2026
d9eb569
style(engine): expand existing delivery and session guard blocks
mbuckton Oct 15, 2026
82c280d
style(engine): expand existing delivery and session guard blocks
mbuckton Oct 15, 2026
fcd916b
style(engine): expand existing delivery and session guard blocks
mbuckton Oct 15, 2026
38f12e3
style(engine): expand existing delivery and session guard blocks
mbuckton Oct 15, 2026
5367c16
style(engine): expand schema and session guards
mbuckton Oct 15, 2026
95d6085
style(engine): expand delivery cleanup and destination calls
mbuckton Oct 15, 2026
6198841
style(engine): expand delivery cleanup and destination calls
mbuckton Oct 15, 2026
1852afc
style(engine): expand delivery cleanup and destination calls
mbuckton Oct 15, 2026
90a6705
style(engine): expand delivery cleanup and destination calls
mbuckton Oct 15, 2026
0115e94
style(engine): use explicit recovered-delivery completion types
mbuckton Oct 15, 2026
1721801
style(engine): use explicit recovered-delivery completion types
mbuckton Oct 15, 2026
0bb3bdf
style(engine): standardize JetStream archive imports
mbuckton Oct 15, 2026
75c659c
style(engine): replace wildcard collection imports in destination set
mbuckton Oct 15, 2026
d103583
style: expand configuration and networking guard clauses
mbuckton Oct 15, 2026
4c9bc64
style: expand configuration and networking guard clauses
mbuckton Oct 15, 2026
a854979
style: expand configuration and networking guard clauses
mbuckton Oct 15, 2026
2ea3bd5
style: expand application and configuration guards
mbuckton Oct 15, 2026
e719111
style: expand application and configuration guards
mbuckton Oct 15, 2026
fd6a42a
style(engine): explicitly type delivery coordinator references
mbuckton Oct 15, 2026
e3cd628
style(engine): explicitly type delivery coordinator references
mbuckton Oct 15, 2026
b0161aa
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
a491eed
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
5150fcf
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
0ce3a52
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
88f53e9
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
c33220e
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
4f570c4
style: expand remaining confirmed control flow and exception handlers
mbuckton Oct 15, 2026
63b6fde
style(mqtt-sn2): use verified SASL configuration DTO type
mbuckton Oct 15, 2026
50498c0
style(mqtt): expand remaining packet manager exception handlers
mbuckton Oct 15, 2026
99ce43b
test(destination): cover MSG-413 reaper scheduling interleavings
mbuckton Oct 15, 2026
c868ddd
test(destination): run queued reapers independently of removal tasks
mbuckton Oct 15, 2026
e01ba4c
test(destination): propagate checked reaper test exception through Ca…
mbuckton Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 1 addition & 3 deletions .buildkite/start-unit-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ cd mapsmessaging_server

ulimit -a

git clone https://github.com/eclipse/paho.mqtt.testing.git

mvn clean test -Dpython_command=python3 -Dcom.datastax.driver.FORCE_NIO=true -Ddebug_domain=false -Psnapshot
mvn clean test -Dcom.datastax.driver.FORCE_NIO=true -Ddebug_domain=false -Psnapshot

# Extract test results
RESULTS_DIR="$HOME/mapsmessaging-test-results"
Expand Down
112 changes: 112 additions & 0 deletions CODING_STANDARDS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# MapsMessaging Java Coding Standards

**Status:** Agreed
**Scope:** Java production code, tests, and supporting infrastructure in MapsMessaging.
**Baseline:** The Java version configured by the repository build. Do not introduce features requiring a newer language level.

## Principles and scope

New code should look and behave as though it belongs in the existing MapsMessaging codebase. Prioritise correctness, clarity, maintainability, and predictable runtime behaviour over brevity or individual preferences.

Apply these standards to new code and code being substantively modified. Follow surrounding conventions where they do not contradict this document. Do not reformat the entire repository or unrelated sections of a file. Keep cosmetic-only changes in separate commits from behavioural changes.

## Explicit types

Do **not** use Java local-variable type inference (`var`) in production code or tests, including enhanced loops and local declarations. State the type explicitly and prefer interfaces when appropriate.

```java
DeliveryStateCoordinator coordinator = deliveryStateCoordinator;
List<Integer> packetIds = new ArrayList<>();
Map<Integer, Message> messages = new HashMap<>();
```

## Formatting and control flow

- Use two-space indentation and spaces rather than tabs.
- Use a **soft target of 180 columns**. Do not wrap merely because a line exceeds that target by one or a few characters. Break lines where it improves comprehension, not to meet a mechanical threshold.
- Put opening braces on the same line as the statement or declaration.
- Use braces for all `if`, `else`, `for`, `while`, `do`, and other control-flow bodies, even one-statement bodies.
- Expand `try`, `catch`, `finally`, and conditional blocks across multiple lines. Do not compress multiple independent statements onto one line.
- Use consistent spacing around operators, after commas, and between logical sections. Avoid drive-by formatting of unrelated code.

```java
if (message == null) {
return;
}

try {
processMessage(message);
} catch (IOException exception) {
logger.error("Unable to process message", exception);
throw exception;
}
```

## Imports and naming

Use normal imports and simple type names. Avoid fully qualified Java class names inside method bodies unless needed to disambiguate types. Prefer explicit imports to wildcard imports in new code.

Give classes, fields, methods, parameters, and local variables descriptive names. Avoid unclear one-letter names and unnecessary abbreviations. Conventional, tightly scoped identifiers are acceptable where unambiguous. Preserve established public API names and recognised protocol terminology.

## Methods, features, and class organisation

Create focused helper methods when they clarify a meaningful operation, express a domain concept, reduce duplication, or make resource ownership or control flow easier to understand. Do not introduce trivial wrappers solely to shorten methods. Keep related lifecycle operations grouped.

Modern Java features such as records, switch expressions, pattern matching, and text blocks are permitted where they improve readability and remain compatible with the configured Java version. Prefer loops over streams when ordering, mutation, exceptions, or debugging are clearer with a loop. Do not use `var`.

Use Lombok consistently with surrounding code; do not add it indiscriminately.

## Defensive programming

**Agreed policy:** Validate aggressively at external and untrusted boundaries, but rely on explicit, enforced contracts inside the application.

- Validate network/protocol input, configuration, persisted state, and other externally controlled values.
- Establish internal invariants through constructors, API contracts, and appropriate state transitions.
- Do not scatter redundant null checks and arbitrary defaults through internal code to hide broken invariants.
- Use explicit failures for violated internal contracts rather than silently continuing with invalid state. Choose a meaningful exception type and preserve context.
- Use fallback behaviour only when it is part of a defined protocol, compatibility, or recovery contract.
- Differentiate malformed external input (which should normally be handled and isolated) from programmer errors (which should remain visible).
- Do not add defensive branches merely to satisfy static analysis if they weaken the stated contract.

## Concurrency and lifecycle

Document important ownership, synchronization, reference publication, callback, shutdown, recovery, and replacement assumptions where they are not obvious.

Use `volatile` for visibility and safe publication when appropriate; it does not make compound operations atomic or mutable referents thread-safe. Use synchronization, atomic types, and concurrent collections only when they provide the actual required guarantees. Read a changeable reference once into a local variable if a null check and later operation must act on the same object.

Prefer invoking externally supplied callbacks outside internal locks when safe. Capture the necessary state under lock, preserve lifecycle semantics, and test ordering, closure, recovery, and replacement paths.

## Exceptions and resources

Preserve original exceptions and their causes. Never silently swallow meaningful operational errors or mask the primary exception during cleanup. Use explicit error handling at a level where the failure can be handled meaningfully.

Prefer try-with-resources for locally owned resources. When ownership transfers to a longer-lived component, document the hand-off and close the resource on failed initialization. Never close a resource after a successful ownership transfer merely to satisfy a static-analysis warning.

## Tests

Prefer constructor-valid instances, existing test builders, and reusable fixtures for stateful components. Mock external collaborators as needed, but avoid partial mocks that bypass essential initialization (including `CALLS_REAL_METHODS`) unless specifically justified and fully initialized.

Tests should verify observable behaviour and preserve meaningful assertions. Regression tests should reproduce the defect and verify the fix; do not disable or weaken failing tests to make a build green.

Use established test data locations such as `target` or `target/data`. For concurrent behaviour, test lifecycle, ordering, and completion rather than depending solely on fixed sleeps.

## Comments and documentation

Explain purpose, non-obvious decisions, invariants, ownership, compatibility requirements, and concurrency contracts. Do not narrate self-explanatory statements. Write Javadoc for public APIs and complex contracts where useful. Preserve the existing source licensing and copyright conventions.

## Static analysis

Treat SonarCloud and other static-analysis results as findings to investigate, not automatic proof of defects. Fix actual issues. For justified false positives, use a narrowly scoped suppression or accepted finding with a concise technical explanation. Do not distort working architecture merely to achieve a passing grade.

## Changes, commits, and validation

- Keep formatting-only refactors separate from behaviour changes. Preserve interfaces, execution order, exceptions, concurrency, and lifecycle semantics when formatting.
- Keep commits focused and use the repository's established commit-message and Jira-reference conventions.
- Inspect diffs for accidental unrelated changes.
- Verify compilation and run focused tests for relevant changes; run broader regression suites when warranted.
- Report tests and builds as passing only when results have been observed.
- Do not create branches, Jira issues, run Jenkins, or merge without the required approval.

## Adoption

These standards govern future and substantively modified Java code. Clean up existing code gradually when touching the relevant area; do not initiate a repository-wide reformat. If an existing public interface or compatibility requirement conflicts with a style preference, preserve behaviour and document the exception.
14 changes: 10 additions & 4 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,16 @@ def runBlock = { String stageName ->
echo "${stageName}: running ${selectedTests.size()} test classes"

def selector = selectedTests.join(",")
sh """#!/bin/bash
set -euo pipefail
mvn clean test -Dtest='${selector}' ${mavenCommon}
"""
// Start each block with fresh authentication and data state.
// Keep MAPS_DATA inside this workspace even if the agent defines it globally.
def testDataDirectory = "${pwd()}/target/data"
withEnv(["MAPS_DATA=${testDataDirectory}"]) {
sh """#!/bin/bash
set -euo pipefail
rm -rf -- target/data
mvn clean test -DMAPS_DATA='${testDataDirectory}' -Dtest='${selector}' ${mavenCommon}
"""
}
}

stage("${stageName} - JUnit") {
Expand Down
34 changes: 34 additions & 0 deletions docs/protocols/mqtt-sn-2-csd01-review-status.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# MQTT-SN 2.0 CSD01 architecture and interoperability status

Reference: MQTT-SN 2.0 CSD01 (August 2026), OASIS source revision `0dae5066d123d068ddca2ddb861ce8858aafee92`.

Tracking: MSG-324. This document distinguishes implementation changes from executed validation. **It is not a declaration of full CSD01 conformance.**

| Requirement | CSD01 trace | Implementation status | Validation still required |
| --- | --- | --- | --- |
| Dual-version sessionless PUBWOS safety | §3.6, topic-alias clauses | Unprotected predefined-alias form rejected on shared dual-version listener; direct-topic form retained | MQTT-SN 1.2 colliding SUBSCRIBE and allowed/unallowed PUBWOS integration tests |
| Protected sender/Client ID session isolation | §3.17-3 to §3.17-5 | Protection decoder carries the verified sender; MAPS session key combines sender and wire Client ID; mismatched subsequent packets fail closed | Two-sender/two-Client-ID, reconnect, replay and authentication-failure integration tests |
| Outbound persistent QoS 1/2 recovery | §4.1.1, §4.4.1-1 | **Not implemented.** The outgoing manager still retains the original protocol's in-flight callbacks and packet state. | Durable session-scoped state, three QoS stages, Clean Start, expiry and restart |
| Existing virtual-connection CONNECT takeover | §4.14-4 | A verified CONNECT replaces the old v2 protocol context; close and failed-start cleanup now check protocol identity before removing a virtual connection | Connected/asleep/awake takeover and Will/session-expiry lifecycle tests |
| Malformed/protocol error removes connection | §4.12.1-2, §4.12.2-1 | Established v2 IOException path closes and removes the affected virtual connection; v1.2 path unchanged | Malformed frame/state-transition and multi-client isolation tests |
| Duplicate QoS 2 PUBREL | §4.3.4-12 | Committed identifiers and PUBCOMP-write-pending identifiers guard one MAPS transaction commit; completed transaction references now leave the protocol map after PUBCOMP write completion | Concurrent duplicate before PUBCOMP callback; after-completion protected UDP regression added but not executed |
| Sleeping-message enqueue/wake race | §3.15, §4 wake semantics | ASLEEP/AWAKE state decisions and queue insertion coordinate under the queue monitor; network delivery is outside that monitor | Deterministic latches/barriers test, ordering and Remaining Messages accounting |
| Post-CONNACK enhanced-authentication reauthentication | §4.11.1.1 | **Not supported.** Lifecycle currently permits AUTH only during initial authentication, not after CONNECT completes. Do not claim complete enhanced-authentication support. | Specification/product decision before implementation |
| MQTT-SN 1.2 interoperability | 1.2 standard | Shared listener and legacy 1.2 path retained | MQTT-SN 1.2 full regression suite |
| Protection schemes and negative interoperability | §3.17 | Previously passed 15 reference-client protection schemes, before this change block | Re-run after current modifications, including identity and reconnect cases |

## Cleanup and deployment gates

The obsolete `MQTT_SNProtocolV2`, `PacketFactoryV2`, and the legacy v2 packet/state/listener hierarchy have been removed (32 files). The active `MqttSn2Protocol`, its CSD01 codecs, security providers and the MQTT-SN 1.2 implementation are retained. Compile and regression-test the removals before merging; absence of references in repository searches is not proof of runtime compatibility.

Format all remaining active Java sources using the repository's Google Java conventions with a 180-character line limit, and use the standard Maps Messaging copyright/license header. Formatting must not alter packet handling or protocol semantics.

Do not merge, change Jira status, claim full CSD01 conformance, or queue Jenkins until local 1.2 and 2.0 regression tests are confirmed. A green pre-change Jenkins run does not validate these changes.

## Outstanding MSG-324 correctness gates (11 October 2026)

- **Outbound QoS persistence:** Still outstanding. The protocol-instance delivery queue and callback references must be integrated with MAPS session persistence before recovery can be claimed.
- **Negative acknowledgements:** Terminal PUBACK, PUBREC rejection, and PUBCOMP now resolve the MAPS delivery completion callback exactly once, whether positive or negative. The unit assertions have been updated; protocol-level transaction ACK/rollback sequencing still requires integration validation.
- **QoS 2 packet identifier lifecycle:** Completed IDs remain in a finite (16-bit) set until fresh non-DUP reuse or protocol close; verify reconnect, bounded retention and rollback semantics. The completed transaction object is now removed from the local map on PUBCOMP completion.
- **Asynchronous ownership:** Address-scoped virtual connection removal is now guarded by protocol identity; asynchronous session creation and pending destination callbacks still need race tests.
- **Build gate:** No compile or targeted MQTT-SN 1.2/2.0 suite was executed for this change block; Jenkins must remain unqueued until these items are resolved.
64 changes: 64 additions & 0 deletions docs/protocols/mqtt-sn-2-protection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# MQTT-SN 2.0 protection (CSD01)

MQTT-SN 2.0 protection uses Java ServiceLoader implementations of
`MqttSn2CryptoProvider`, the Authentication library's
`SecretKeyManager`, and the durable indexed counter store.

## Configuration

The MQTT-SN protocol configuration may contain a private `protection`
section (it is deliberately not exposed in the REST protocol DTO).

```yaml
protection:
enabled: true
senderIdentifier: "0011223344556677"
outboundScheme: 0x48
acceptedSchemes: "0x48,0x49"
counterDirectory: "/opt/maps_data/mqtt-sn/protection"
keyEntryPasswordEnv: "MQTT_SN_KEY_ENTRY_PASSWORD"
keyStore:
type: JCEKS
store: file
path: "/opt/maps_data/security/mqtt-sn.jceks"
passphrase: "<resolve through existing secure configuration>"
senderAliases:
"0011223344556677:72": "gateway-aes-256"
"aabbccddeeff0011:72": "sensor-aes-256"
```

This block is nested inside the MQTT-SN protocol configuration, not at the
top level of the server configuration. Set the named environment variable in
the server process to the **key-entry** password. The keystore passphrase is
loaded by the existing Authentication `KeyStoreManager` configuration.
Do not place a real passphrase into source-controlled configuration files.
Sender identifiers must be 8 octets, hex encoded, with lowercase keys in
`senderAliases`; suffix is the decimal scheme identifier.

An endpoint fails initialization when a selected ServiceLoader provider,
outbound key, or durable counter store is unavailable. Registration for UDP
reads takes place only after successful protection initialization.

## Supported scheme families

* `0x00`, `0x01`: HMAC-SHA256 / HMAC-SHA3-256
* `0x40`–`0x45`: AES-CCM 64/128 tag, 128/192/256 keys (Bouncy Castle)
* `0x46`–`0x48`: AES-GCM 128/192/256 keys
* `0x49`: ChaCha20-Poly1305

Providers are discovered through the standard
`META-INF/services/...MqttSn2CryptoProvider` resource. Discovery is not
authorization: only `acceptedSchemes` are enabled on the endpoint.

The encryption nonce is derived from SHA-256 of the serialized envelope
prefix. Authenticate/decrypt and validate the inner packet **before**
advancing durable replay state. Outgoing counters use durable block
reservations; unused values are discarded across restart.

## Validation before deployment

Do not enable on production endpoints until the server has compiled against
`authentication_library:3.0.3-SNAPSHOT`, focused provider and envelope
tests have passed, and independent interop vectors have confirmed
CSD01 nonce/tag handling. The sender/security association must have a
well-defined key rotation and counter continuity policy.
Loading
Loading