Repository navigation
Releases
Releases · frenzox/mercurio
recado-v0.3.0
Added
- (server) [breaking] start brokers through Server::builder
- (cli) log in with SCRAM-SHA-256 in recado and mercurioctl
- (client) make subscriptions again after a reconnect without session
- (cli) add --ws and --ws-path to the shared connect arguments
- (client) trust the OS certificate store and take a rustls config
- (client) [breaking] mark public structs and struct-like variants non_exhaustive
- (cli) print shell completion scripts with a completions command
- (cli) log in with a client certificate using --cert and --key
- (recado) give pub the will options sub has
- (recado) publish one message per line of standard input with pub -l
- (recado) add sub -C/--count and -W/--timeout for scripts
- (recado) take correlation data as hex with --correlation-data-hex
- (recado) print messages as JSON lines with sub --format json
- (cli) read the login password from a variable or a prompt in both tools
Fixed
- (recado) report why the client gave up reconnecting
- (recado) [breaking] refuse -c without -i for every protocol version
- (recado) report arguments the client refuses as usage errors
- (recado) make up a client id where MQTT 3 refuses an empty one
- (recado) disconnect cleanly on SIGTERM in sub
- (recado) publish and print binary payloads byte for byte
- (recado) [breaking] refuse unknown --protocol-version values
- (recado) [breaking] fail on refused subscriptions and lost connections
- (recado) send log output to standard error
- (client) [breaking] turn TLS on when a CA or client certificate is set
Other
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- drop the unused tracing dependency from recado
- move recado to base64 0.23
- Merge branch 'master' into refactor/codec-api
- describe SCRAM-SHA-256 logins
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (recado,mercurioctl) drop direct mercurio-core and bytes dependencies
- (recado) give pub and sub their own modules and argument structs
mercuriod-v0.5.0
Added
- (server) [breaking] start brokers through Server::builder
- (server) [breaking] hand a departed share member's messages to its group
- (auth) [breaking] let a failed authentication tell the client why
- (plugin) [breaking] name the mount point of an expired session in WIT 0.2
- (server) disconnect clients that stay over their publish rate
- (mercurioctl) name the mount point of a client
- (server) [breaking] give each mount point its own client id space
- (mercuriod) reload the HTTP auth certificate files
- (server) limit publish rates per client and connection rates per listener
- (server) [breaking] ban addresses that keep failing to log in
- (server) per-listener limits and user names as client ids
- (server) choose how shared subscriptions pick their member
- (mercuriod) store SCRAM-SHA-256 keys with passwords and offer SCRAM
- (server) [breaking] cap sessions and let mercuriod sessions expire after a week
- (server) let a full queue drop its oldest messages instead
- (plugin) [breaking] hand plugins their settings as a Config with get and require
- (plugin) let WebAssembly plugins publish messages
- (plugin) [breaking] move the WebAssembly plugin interface to 0.2
- (http-auth) add a superuser endpoint
- (http-auth) verify endpoints with a custom CA and a client certificate
- (mercuriod) configure bridge sessions, remote state and counters
- (mercuriod) [breaking] notify systemd of readiness and run as Type=notify
- (mercuriod) import mosquitto's dynamic-security.json
- (dynsec) add modifyClient, modifyGroup and modifyRole
- (server) serve /healthz and Prometheus /metrics on WebSocket listeners
- (dynsec) [breaking] check roles and groups in mosquitto's priority order
- (server) [breaking] keep $SYS retained messages in memory
- (server) choose how far client CRLs reach and what they must cover
- (server) serve a caller-supplied rustls configuration
- (server) accept clients without a certificate where it is optional
- (server) [breaking] count messages the broker drops, by cause and per client
- (server) [breaking] reload TLS certificates without a restart
- (client) [breaking] let the connector open the stream asynchronously
- (mercuriod) add --check and validate everything before binding
- (mercuriod) give Unix socket listeners a mode and a group
- (mercuriod) [breaking] make plugin_timeout and the tick interval configurable
- (client) [breaking] take connect_timeout as a Duration
- (mercuriod) back off exponentially between bridge connection attempts
- (client) [breaking] add manual acknowledgement of received messages
- (storage) [breaking] make the PostgreSQL pool size and wait configurable
- (mercuriod) disconnect clients a dynamic security change concerns
- (mercuriod) warn when HTTP auth sends passwords in clear
- (mercuriod) bind a dynamic security client to its clientid
Fixed
- (mercuriod) let plugin publishes wait for the broker to serve
- (mercuriod) check bridges with --check and before binding
- (storage) version the SQLite schema and keep one broker per database
- (mercuriod) keep bridge acknowledgements across cancelled forwarding
- (server) store a client whole again after a batch is given up
- (server) [breaking] keep the queues of connected persistent sessions in storage
- (storage) [breaking] store subscription changes one at a time
- (server) [breaking] require proxy_from with proxy_protocol on TCP listeners
- (server) [breaking] refuse unknown admin arguments and log who changes things
- (server) [breaking] let enhanced authentication send final data on success
- (mercuriod) refuse to take over an admin socket another process serves
- (server) [breaking] require the mqtt subprotocol and add allowed_origins
- (server) [breaking] decide $CONTROL publishes with a hook of their own
- (mercuriod) never let a plugin's sockets listen
- (mercuriod) cap a plugin copy's memory across all its memories
- (mercuriod) count calls the broker cancels as plugin failures
- (mercuriod) [breaking] refuse password file entries that are not hashes
- (recado) report arguments the client refuses as usage errors
- (mercuriod) [breaking] forward bridged QoS 1 and 2 messages at least once
- (mercuriod) [breaking] refuse bridge settings that collide or can't work
- (mercuriod) give dynsec-init's file to the owner of its directory
- (storage) [breaking] require TLS for remote PostgreSQL and when a CA is set
- (mercuriod) install config.toml readable by root and mercurio only
- (mercuriod) raise the unit's file limit and tighten its sandbox
- (mercuriod) reconnect to syslog after the daemon restarts
- (mercuriod) keep a starting broker alive on SIGHUP
- (mercuriod) [breaking] deny all access to user names dynsec has no client for
- (server) [breaking] count connections per address before handshakes, IPv6 by /64
- (mercuriod) make unknown dynsec users cost a password check
- (mercuriod) bound HTTP auth requests and share identical ones
- (mercuriod) [breaking] refuse role and group priorities dynsec does not apply
- (server) [breaking] cap CONNECT at 64 KiB until the client is authenticated
- (mercuriod) stop caching HTTP auth failures as denials
- (mercuriod) flush the dynamic security file to disk before renaming it
- (mercuriod) apply setDefaultACLAccess only when every entry is valid
- (mercuriod) bring bridges back when this broker drops their connection
- (mercuriod) name the file and table in configuration errors
- (server) [breaking] check sent credentials even when auth is not required
- (mercurio-server) bound socket writes and the client id takeover wait
- (server) [breaking] cap unacknowledged messages per client with max_inflight
- (mercuriod) keep other users when passwd cannot read the password file
- check that a granted filter covers the filter a client subscribes to
- (mercuriod) [breaking] refuse authentication settings while auth is disabled
- (storage) open SQLite databases in WAL mode
- (mercuriod) [breaking] refuse configuration keys the daemon does not know
- (mercuriod) keep $CONTROL closed under a permissive dynsec default
Other
- Merge branch 'build/rand-argon2'
- Merge branch 'feat/mount-point-client-ids'
- (mercuriod) bump argon2 to 0.6
- (server) drop rand for getrandom and std's RandomState
- Merge branch 'chore/workspace-manifests'
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- move mercuriod to toml 1
- Merge branch 'master' into refactor/codec-api
- Merge branch 'fix/storage-read'
- Merge branch 'feat/limits'
- Merge branch 'feat/scram'
- Merge branch 'feat/plugin-interface-0.2'
- (server) format the limits work and satisfy clippy
- describe SCRAM-SHA-256 logins
- (mercuriod) keep the plugin panic log test from losing its log lines
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (mercuriod) allow for the refill while a publish flood test runs
- (plugin) describe interface 0.2 and what changes for 0.1 plugins
- (core) [breaking] give reason code 0x00 a single variant
- (server) [breaking] report storage health under one $SYS prefix
- Merge branch 'feat/client-features'
- Merge branch 'feat/auth-backends'
- Merge branch 'fix/durability'
- Merge branch 'feat/observability'
- (plugins) give every plugin crate its own workspace
- Merge branch 'feat/tls-reload'
- Merge branch 'feat/client-api'
- Merge branch 'fix/auth-admin'
- Merge branch 'fix/edge'
- (mercuriod) name ureq as the client that sends URL user info
- Merge branch 'fix/client-reconnect-bridge'
- Merge branch 'fix/dynsec'
- Merge branch 'fix/postgres'
- Merge branch 'fix/httpauth-packaging'
- Merge branch 'chore/ci-release-docs'
- (mercuriod) describe HTTP auth failures, limits and https use
- (mercuriod) correct the user_url client id and auto_id_prefix notes
- (mercuriod) list the plugin keys in the sample config and README
- Merge remote-tracking branch 'origin/master'
- Merge branch 'fix/client-event-loop'
- Merge branch 'fix/conn-loop-hardening'
- Merge branch 'fix/daemon-config'
- Merge branch 'fix/session-limits'
- Merge branch 'fix/authorization'
mercurioctl-v0.2.0
Added
- (server) [breaking] start brokers through Server::builder
- (admin) filter listClients by mount point
- (mercurioctl) name the mount point of a client
- (server) report the plugin interface a WASM plugin was built for
- (mercuriod) configure bridge sessions, remote state and counters
- (client) add a request/response helper and use it in mercurioctl
- (dynsec) add modifyClient, modifyGroup and modifyRole
- (dynsec) [breaking] check roles and groups in mosquitto's priority order
- (cli) add --ws and --ws-path to the shared connect arguments
- (server) [breaking] count messages the broker drops, by cause and per client
- (client) trust the OS certificate store and take a rustls config
- (client) [breaking] mark public structs and struct-like variants non_exhaustive
- (mercurioctl) [breaking] print failures as JSON on standard error with --json
- (mercurioctl) [breaking] confirm deleting retained messages by filter and sessions
- (mercurioctl) read new client passwords from a file or standard input
- (cli) print shell completion scripts with a completions command
- (cli) log in with a client certificate using --cert and --key
- (cli) read the login password from a variable or a prompt in both tools
Fixed
- (mercurioctl) spot a refused admin socket by its error kind
- (client) [breaking] turn TLS on when a CA or client certificate is set
Other
- Merge branch 'feat/mount-point-client-ids'
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- Merge branch 'feat/scram'
- Merge branch 'feat/plugin-interface-0.2'
- describe SCRAM-SHA-256 logins
- Merge branch 'feat/client-features'
- Merge branch 'feat/auth-backends'
- Merge branch 'feat/observability'
- (recado,mercurioctl) drop direct mercurio-core and bytes dependencies
mercurio-storage-v0.4.0
Added
- (server) [breaking] start brokers through Server::builder
- (server) [breaking] hand a departed share member's messages to its group
- (storage) [breaking] key stored client state by mount point and client id
- (core) [breaking] make encoding fallible and refuse what peers must reject
- (storage) [breaking] make the PostgreSQL pool size and wait configurable
- (storage) [breaking] tell fenced and transient storage failures apart
Fixed
- (storage) fail every undecodable stored value the same way
- (storage) version the SQLite schema and keep one broker per database
- (server) [breaking] keep the queues of connected persistent sessions in storage
- (storage) [breaking] store subscription changes one at a time
- (server) [breaking] keep incoming QoS 2 state and record it only once accepted
- (storage) [breaking] keep RETAIN and the expiry deadline of in-flight messages
- (storage) keep a PostgreSQL standby waiting and its schema hands off
- (storage) [breaking] require TLS for remote PostgreSQL and when a CA is set
- (storage) open SQLite databases in WAL mode
- (storage) roll back the SQLite transaction when COMMIT fails
Other
- Merge branch 'feat/mount-point-client-ids'
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- depend on webpki-roots 1 in the client and storage
- Merge branch 'master' into refactor/codec-api
- (storage) [breaking] restore stored sessions in pages with one query per table
- (storage) [breaking] look retained messages up by topic range, a page at a time
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (storage) [breaking] make apply the only write and share one conformance suite
mercurio-server-v0.6.0
Added
- (server) [breaking] start brokers through Server::builder
- (server) add with_* setters to the configuration structs
- (server) [breaking] type the TLS and listener configuration errors
- (server) [breaking] hand a departed share member's messages to its group
- (auth) [breaking] let a failed authentication tell the client why
- (admin) filter listClients by mount point
- (server) disconnect clients that stay over their publish rate
- (server) [breaking] give each mount point its own client id space
- (storage) [breaking] key stored client state by mount point and client id
- (server) limit publish rates per client and connection rates per listener
- (server) [breaking] ban addresses that keep failing to log in
- (core) [breaking] make encoding fallible and refuse what peers must reject
- (server) per-listener limits and user names as client ids
- (server) choose how shared subscriptions pick their member
- (server) [breaking] cap sessions and let mercuriod sessions expire after a week
- (server) add a built-in SCRAM-SHA-256 enhanced auth mechanism
- (server) let a full queue drop its oldest messages instead
- (server) report the plugin interface a WASM plugin was built for
- (server) [breaking] tell plugins which connection a client came in on
- (server) serve /healthz and Prometheus /metrics on WebSocket listeners
- (server) [breaking] keep $SYS retained messages in memory
- (server) choose how far client CRLs reach and what they must cover
- (server) serve a caller-supplied rustls configuration
- (server) accept clients without a certificate where it is optional
- (server) [breaking] count messages the broker drops, by cause and per client
- (server) [breaking] reload TLS certificates without a restart
- (storage) [breaking] tell fenced and transient storage failures apart
Fixed
- (server) substitute ACL pattern identities in one pass
- (server) [breaking] end every task of a stopped broker with Server::run
- (server) read a waiting packet before expiring the keep-alive
- (server) store MQTT 3.x sessions with their configured expiry
- (server) keep only the CONNECT settings a session reads later
- (server) store a starting session's own expiry when reconciling
- (server) keep a restored will stored until it is published
- (server) keep a delayed will due when a takeover is abandoned
- (server) unsubscribe a removed session even if its removal is cancelled
- (server) set aside stored sessions that can't be read at restore
- (server) stop blaming the previous connection when admissions are full
- (storage) version the SQLite schema and keep one broker per database
- (server) store a client whole again after a batch is given up
- (server) name the crypto provider for the client certificate verifier
- (server) [breaking] keep the queues of connected persistent sessions in storage
- (storage) [breaking] store subscription changes one at a time
- (server) [breaking] keep incoming QoS 2 state and record it only once accepted
- (storage) [breaking] keep RETAIN and the expiry deadline of in-flight messages
- (server) [breaking] publish the will when a client disconnects with an error
- (server) [breaking] compare built-in plaintext passwords in constant time
- (server) refuse wildcard mount points and misplaced WebSocket settings
- (server) hold WebSocket clients to the CONNECT size before auth
- (server) [breaking] require proxy_from with proxy_protocol on TCP listeners
- (server) [breaking] refuse unknown admin arguments and log who changes things
- (server) [breaking] let enhanced authentication send final data on success
- (server) [breaking] require the mqtt subprotocol and add allowed_origins
- (server) [breaking] decide $CONTROL publishes with a hook of their own
- (server) leave a session to expire when its takeover is abandoned
- (server) log client-caused connection failures below error
- (server) record a session's expiry before giving its client id back
- (server) set TCP_NODELAY, keepalive and TCP_USER_TIMEOUT on accept
- (server) let go of a claim and its admission when start is abandoned
- (server) stream http_dir files under their own timeout and limit
- (server) exempt in-process connections from max_connections
- (server) give the client id back when a connection lease is dropped
- (server) [breaking] close banned clients with Administrative Action
- (server) check the client's packet size limit after topic aliasing
- (server) hold resumed retransmissions to the client's new limits
- (server) send every retained message to a new subscription in pages
- (server) keep storage reads out of the session manager's lock
- (server) free the client id when stacked takeovers all give up
- (server) end connections still connecting when the server shuts down
- (server) give the client id back when a session fails to start
- (server) [breaking] count connections per address before handshakes, IPv6 by /64
- (server) [breaking] end an expiry-0 session even when a takeover waits
- (server) make room in a full queue by dropping expired messages
- (server) [breaking] cap CONNECT at 64 KiB until the client is authenticated
- (server) send shared subscription messages to members that can take them
- (server) give up a queued login once its connect time is up
- (mercurio-server) refuse banned addresses before any handshake
- (server) cap the session expiry a DISCONNECT asks for
- (server) [breaking] check sent credentials even when auth is not required
- (mercurio-server) bound socket writes and the client id takeover wait
- (server) free superseded will-delay and session-expiry timers at once
- (server) [breaking] cap unacknowledged messages per client with max_inflight
- (server) [breaking] refuse a client id that belongs to another owner's session
- check that a granted filter covers the filter a client subscribes to
Other
- Merge branch 'refactor/server-structure'
- (server) replace SessionManagerDropGuard with a constructor
- (server) move the session manager's tests to their own file
- (server) move address limits and publish pacing out of server/
- (server) move the broker's configuration types to server/config.rs
- (server) have acknowledgements hand back their storage writes
- (server) give a session's in-flight messages their own type
- (server) move subscription handling to session/subscriptions.rs
- (server) move outbound delivery to session/outbound.rs
- (server) move inbound publish handling to session/inbound.rs
- (server) move retained delivery to session/retained.rs
- (server) move session presence to session/presence.rs
- (server) move the session's will handling to session/will.rs
- (server) move the session tests out of session.rs
- (server) drop unreachable ack persistence and restore stray docs
- (server) [breaking] give the broker its own error type
- Merge branch 'build/rand-argon2'
- Merge branch 'feat/mount-point-client-ids'
- (server) wait for a crashed broker to let go of its database
- (server) drop rand for getrandom and std's RandomState
- Merge branch 'chore/workspace-manifests'
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- ask tokio only for the features mercurio-server uses
- (mercurio-server) drop the keep-alive from the write timeout test
- move mercurio-client and mercurio-server to thiserror 2
- Merge branch 'master' into refactor/codec-api
- Merge branch 'fix/storage-read'
- Merge branch 'feat/limits'
- Merge branch 'feat/scram'
- Merge branch 'feat/plugin-interface-0.2'
- (server) format the limits work and satisfy clippy
- (core) [breaking] check Variable Byte Integer and identifier ranges
- (storage) [breaking] restore stored sessions in pages with one query per table
- (storage) [breaking] look retained messages up by topic range, a page at a time
- (packets) [breaking] pass the protocol version to every encode and decode
- (packets) [breaking] derive CONNECT flags from the payload
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (core) [breaking] rename Error::MQTTReasonCode to Error::Reason
- (storage) [breaking] make apply the only write and share one conformance suite
- (core) [breaking] give reason code 0x00 a single variant
- (server) [breaking] report storage health under one $SYS prefix
- Merge branch 'fix/durability'
- (server) let the drop counter test's plugin grant admin commands
- Merge branch 'feat/observability'
- (server) let a writer held by a journal wait without polling
- Merge branch 'feat/tls-reload'
- (server) add a test PKI for TLS integration tests
- Merge branch 'fix/auth-admin'
- Merge branch 'fix/edge'
- Merge branch 'fix/session-manager-cancellation'
- Merge branch 'fix/delivery'
- Merge branch 'fix/session-manager'
- Merge branch 'fix/postgres'
- Merge branch 'fix/conn-loop-hardening'
- Merge branch 'fix/session-limits'
- Merge branch 'fix/authorization'
mercurio-plugin-v0.3.0
Added
- (auth) [breaking] let a failed authentication tell the client why
- (plugin) [breaking] name the mount point of an expired session in WIT 0.2
- (plugin) [breaking] hand plugins their settings as a Config with get and require
- (plugin) [breaking] move the WebAssembly plugin interface to 0.2
Fixed
- (server) [breaking] decide $CONTROL publishes with a hook of their own
Other
- Merge branch 'chore/workspace-manifests'
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- (plugin) say which SDK releases speak which interface
- (plugin) describe interface 0.2 and what changes for 0.1 plugins
mercurio-packets-v0.3.0
Added
- (core) [breaking] make encoding fallible and refuse what peers must reject
- (packets) derive Clone on every packet and add packet_type()
Fixed
- (packets) accept DUP on PUBREL, SUBSCRIBE and UNSUBSCRIBE in MQTT 3.1
- (packets) [breaking] refuse reason codes their packet type does not list
- (packets) [breaking] refuse an MQTT 3.x SUBACK without return codes
- (packets) [breaking] refuse packet identifier 0 in every packet that carries one
- (packets) [breaking] refuse Authentication Data without Authentication Method
- (core) [breaking] require every Encoder to compute its encoded size
- (packets) [breaking] make the per-packet decoders safe to call on any input
Other
- Merge branch 'chore/workspace-manifests'
- (packets) copy payloads and binary data as slices when encoding
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- (packets) [breaking] keep property decoding helpers private
- (core) [breaking] check Variable Byte Integer and identifier ranges
- (packets) [breaking] pass the protocol version to every encode and decode
- (packets) [breaking] derive CONNECT flags from the payload
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (core) [breaking] rename Error::MQTTReasonCode to Error::Reason
- (core) [breaking] give reason code 0x00 a single variant
- (packets) decode every property list through one helper
- build the core and packets tests without std
mercurio-core-v0.3.0
Added
- (server) [breaking] hand a departed share member's messages to its group
- (core) [breaking] make encoding fallible and refuse what peers must reject
- (packets) derive Clone on every packet and add packet_type()
Fixed
- (packets) [breaking] refuse reason codes their packet type does not list
- (packets) [breaking] refuse Authentication Data without Authentication Method
- (core) [breaking] refuse Variable Byte Integers longer than their value needs
- (core) [breaking] require every Encoder to compute its encoded size
- check that a granted filter covers the filter a client subscribes to
Other
- (server) [breaking] give the broker its own error type
- Merge branch 'chore/workspace-manifests'
- (packets) copy payloads and binary data as slices when encoding
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- (packets) [breaking] keep property decoding helpers private
- (core) [breaking] check Variable Byte Integer and identifier ranges
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (core) [breaking] rename Error::MQTTReasonCode to Error::Reason
- (core) [breaking] give reason code 0x00 a single variant
- (packets) decode every property list through one helper
- build the core and packets tests without std
mercurio-client-v0.5.0
Added
- (server) [breaking] start brokers through Server::builder
- (auth) [breaking] let a failed authentication tell the client why
- (core) [breaking] make encoding fallible and refuse what peers must reject
- (cli) log in with SCRAM-SHA-256 in recado and mercurioctl
- (client) add a SCRAM-SHA-256 authenticator
- (client) add a request/response helper and use it in mercurioctl
- (client) follow Server References with a hop limit
- (client) make subscriptions again after a reconnect without session
- (client) send repeated topics as outbound topic aliases
- (cli) add --ws and --ws-path to the shared connect arguments
- (client) send DISCONNECT with a reason and session expiry
- (client) [breaking] expose the client id and what CONNACK settled
- (client) add a WebSocket transport behind a websocket feature
- (client) [breaking] let the connector open the stream asynchronously
- (client) trust the OS certificate store and take a rustls config
- (client) put TLS behind a default-on tls feature
- (client) [breaking] mark public structs and struct-like variants non_exhaustive
- (client) re-export the foreign types its public API uses
- (client) [breaking] keep error sources and tell transient errors apart
- (client) [breaking] take connect_timeout as a Duration
- (client) start publishes without waiting for the previous one
- (client) [breaking] add manual acknowledgement of received messages
- (client) [breaking] back off exponentially with jitter between reconnections
- (client) end with a Stopped event when reconnecting gives up
- (cli) log in with a client certificate using --cert and --key
- (cli) read the login password from a variable or a prompt in both tools
Fixed
- (mercuriod) check bridges with --check and before binding
- (server) name the crypto provider for the client certificate verifier
- (server) [breaking] let enhanced authentication send final data on success
- (server) set TCP_NODELAY, keepalive and TCP_USER_TIMEOUT on accept
- (client) [breaking] cap inbound packets at 1 MiB and refuse them from the header
- (client) [breaking] validate topics, filters and subscription ids before sending
- (client) refuse a CONNACK with Session Present after a clean start
- (client) check Maximum QoS and Retain Available for queued publishes
- (client) fail a resent publish the broker's new size limit refuses
- (client) keep reconnecting through transient CONNACK refusals
- (client) [breaking] bound every socket write and treat a stalled one as lost
- (recado) make up a client id where MQTT 3 refuses an empty one
- (client) do not time out the broker for a stall of the client itself
- (client) fail a pending re-authentication when the connection drops
- (client) [breaking] turn TLS on when a CA or client certificate is set
- (client) keep the event loop running while the event queue is full
- (client) disconnect when the last client handle is dropped
Other
- Merge branch 'chore/workspace-manifests'
- share one lint configuration across the workspace
- inherit shared package metadata from [workspace.package]
- declare shared third-party dependencies once for the workspace
- depend on webpki-roots 1 in the client and storage
- move mercurio-client and mercurio-server to thiserror 2
- Merge branch 'master' into refactor/codec-api
- (core) [breaking] check Variable Byte Integer and identifier ranges
- (packets) [breaking] pass the protocol version to every encode and decode
- (packets) [breaking] derive CONNECT flags from the payload
- (core) [breaking] replace QoS and RetainHandling Invalid with TryFrom
- (core) [breaking] give reason code 0x00 a single variant
- Merge branch 'feat/client-features'
- Merge branch 'feat/client-api'
- Merge branch 'fix/auth-admin'
- (client) drop the unused tokio-util dependency
- Merge branch 'fix/client-reconnect-bridge'
- (client) list backoff and manual acknowledgement among the features
- (client) format the tests added for the reconnect and limit fixes
recado-v0.2.4
Added
- (recado) connect through Unix sockets with --unix
Other
- point the READMEs at mercurioctl and the admin guide