Package versions differ by binding — this release marks the repository state, not a uniform bump.
| Package | Version | Changed |
|---|---|---|
honker (Ruby)
| 0.6.0 | listeners |
honker (Elixir)
| 0.6.0 | listeners |
@russellthehippo/honker-node
| 0.5.0 | stream checkpoint fix |
honker, honker-core, honker-extension (crates.io)
| 0.5.0 | — |
honker (PyPI)
| 0.5.0 | — |
Honker (NuGet)
| 0.5.1 | — |
@russellthehippo/honker-bun
| 0.4.2 | — |
The loadable extension is unchanged; ext-v0.5.0 remains current for Go, C++, and anything loading it directly.
Node: stream checkpoints are interoperable again
Anyone using named stream consumers from Node should upgrade.
Every Node release through 0.4.6 passed the stream topic and consumer name to the extension in reverse order when saving and loading offsets. Node-to-Node resume was self-consistent, so this was invisible from Node alone — but a checkpoint written by Node was never visible to Python, Ruby, Rust, or any other binding, and vice versa. Publishing and explicit-offset reads were unaffected.
0.5.0 uses the shared (consumer, topic) key. On first access it migrates a 0.4.6 checkpoint automatically, after verifying the saved offset belongs to a retained event in that stream. A canonical row always wins when both key orders exist, and the old row is preserved.
State it cannot verify — an offset whose event was pruned or deleted, or a reversed-name collision — raises CheckpointMigrationError (HONKER_CHECKPOINT_MIGRATION_UNVERIFIABLE) rather than guessing at your resume position. Save an explicit offset to reset that consumer and continue.
Running 0.4.6 and 0.5.0 against the same consumer concurrently is not supported during the upgrade.
Ruby and Elixir: high-level listeners
Both bindings gain a channel-filtered, live-only listener, so all eleven bindings now expose the same shape:
db.listen("orders") do |notif|
puts notif.payload
end{:ok, sub} = Honker.listen(db, "orders")
receive do
{:honker_notification, notif} -> IO.inspect(notif.payload)
endOne update watcher fans out to every listener and legacy wait_for_update waiter, so no listener steals another's wake. Reads use dedicated connections, so fallback polling never exposes uncommitted rows. Listeners clean up on close and on database close; Elixir listeners also stop when their subscribing process exits.
The pub/sub guide has the full recipes.