Changelog
View SourceAll notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.4.0 - 2026-10-25
Rebus can now serve D-Bus as well as call it: applications can export objects, answer method calls and own bus names. Unix file descriptors arrive as handles that close themselves, and passing them is opt-in.
Added
- Services.
Rebus.Serviceexports objects described byRebus.Interfacedeclarations and sends each validated method call to a handler process.use Rebus.Objectruns an exported object as a GenServer. Exported objects answerPropertiesandIntrospectable, sobusctl,gdbusandd-feetcan find and describe them, andRebus.Service.emit/6andRebus.Service.properties_changed/6send typed signals. See the Exporting objects guide. Rebus.Bus.request_name/4andRebus.Bus.release_name/3own well-known bus names and notify the owner when a name is acquired or lost.Rebus.unique_name/1returns a connection's unique bus name.Rebus.connect/2takes:max_pending_callsand:max_message_sizeto bound inbound work.- Precompiled descriptor-passing libraries for x86_64 and aarch64 Linux
(glibc and musl) and macOS. Other targets build from source with
makeand a C++17 compiler.
Changed
- Breaking: Unix file descriptor passing is opt-in with
config :rebus, unix_fds: true. Without it, Rebus is pure Elixir. See Enabling descriptor passing. - Breaking: descriptors are
Rebus.UnixFDhandles rather than raw numbers. A handle closes its descriptor exactly once, when it is closed, when its owner exits or when it is garbage collected. UseRebus.UnixFD.with_fd/2to work with the number. - Breaking:
Rebus.call/3returns a D-Bus error reply as{:error, {:dbus_error, message}}. - Calls to a path with nothing exported are answered with
UnknownObject. - A failed match-rule cleanup no longer closes the connection. Rebus sends a
:rebus_match_uncertainnotice instead.
Fixed
- Fixes to connection setup timeouts,
EXTERNALauthentication and descriptor handling on macOS.
0.3.0 - 2026-09-06
Rebus 0.3 expands the client API for method calls, signal subscriptions, descriptor passing, and authenticated bus or peer connections. It includes several breaking corrections to public results and wire handling.
Added
- Added
Rebus.call/3,Rebus.send/2,Rebus.send/3, andRebus.close/1for client operations and explicit connection lifetime management. Connections are supervised, outlive their creator by default, and can instead follow anowner: pid. - Added structured signal subscriptions with
Rebus.MatchRule,Rebus.add_match/3, andRebus.remove_match/3, including recovery when a timed-out bus operation leaves the rule's state uncertain. - Added Unix file descriptor passing on Linux and macOS local sockets. Senders
retain ownership of outbound descriptors; callers own received reply
descriptors and close them with
Rebus.UnixFD.close/1. - Added
DBUS_COOKIE_SHA1authentication, opt-inANONYMOUSauthentication, ordered D-Bus address lists, Unix and TCP addresses, and server-GUID checks.
Changed
- Bare version tags now publish the corresponding package and documentation to Hex after the test suite passes.
- Breaking: calls now return the complete reply as
{:ok, message}or a complete D-Bus error reply as{:error, message}; operation errors and signal-handler registration results also use the new documented shapes. - Breaking: message construction and validation now use structured atom or tuple reasons and reject invalid bodies, signatures, headers, and D-Bus names that earlier versions accepted.
- Breaking: decoding rejects invalid Boolean values and non-zero alignment
padding, and special doubles are represented as
:infinity,:negative_infinity, and:nan. - Breaking:
Rebus.connect/2is now the supported connection constructor, waits for bus registration before returning, and reports authentication and registered-name failures with the new documented results;connect!/2now raisesArgumentErroron failure. - Breaking: Rebus now requires Elixir 1.18 or later.
- Connections now answer
org.freedesktop.DBus.Peercalls and reject other inbound method calls withUnknownMethod.
Removed
- Breaking: removed Windows support. Rebus supports Linux and macOS.
Fixed
- Corrected array lengths, fragmented-message handling, connection failure paths, body-encoding failures, timed-out reply cleanup, well-known names containing hyphens, and standard system/session bus address fallbacks.
0.2.0 - 2025-11-21
Added
Rebus.connect/2accepts the:systemand:sessionbus aliases, resolving the system bus from the:rebus, :system_bus_addressapplication setting and the session bus fromDBUS_SESSION_BUS_ADDRESS.Rebus.connect!/2, which raises instead of returning{:error, reason}.Rebus.Message.signature/1for reading a message's body signature.
Changed
Rebus.Messageno longer carries a separate:signaturestruct field; the signature is stored inheader_fieldsand set automatically when a body is present.
0.1.1 - 2025-11-04
Fixed
- Corrected errors in the public API documentation.
0.1.0 - 2025-11-04
Added
- Initial release: D-Bus message encoder, decoder and wire-format types, message construction and validation, and a supervised bus connection with signal handlers.