Releases: webpatser/resonate
Release list
v0.4.0
Completes the plugin connection lifecycle. v0.3.0 shipped onSubscribe but no onUnsubscribe, and PluginContext::connectionsOn() (read) with no write-side counterpart. A plugin could see a connection join a channel but not leave one short of a full disconnect, and could not evict a connection from a single channel without terminating the whole socket. Both gaps are now closed.
Added
ConnectionLifecycle::onUnsubscribe(Connection, Channel)- fires when a connection leaves a channel via the explicitpusher:unsubscribeevent.PluginManager::notifyUnsubscribe()- exception-isolated fan-out for the new hook.PluginContext::unsubscribe(Connection, string $channel)- removes a connection from one channel, leaving the socket and its other subscriptions intact. A direct action; it does not itself emitonUnsubscribe.
Changed
ConnectionLifecyclegains a fourth method,onUnsubscribe. Breaking for existing implementers of the interface; the plugin system is one release old, so the contract is completed before it settles.EventHandler::unsubscribe()fires theonUnsubscribelifecycle hook after removing the connection from the channel. A closing connection is still reported once throughonClose, not as one unsubscribe per channel.
Suite grows to 317 tests.
v0.3.0
Server-side plugin API. Resonate stays a product-agnostic Pusher relay, but a host application can now load ServerPlugin classes into the server process to intercept messages, observe the connection lifecycle, and run periodic ticks on the event loop. Ordinary Pusher traffic is unaffected: when every plugin returns Relay, routing is byte-identical to before.
Added
Webpatser\Resonate\Pluginsnamespace:ServerPluginmarker contract plus theMessageInterceptor,ConnectionLifecycle, andTickSchedulercapability interfaces.MessageDispositionenum (Handled/Rejected/Relay) returned by interceptors.PluginManager- capability-indexed registry; every fan-out call is exception-isolated so a plugin error cannot break the core.PluginContext- the API handed to plugins at boot:sendTo(),broadcast()(scaling-aware),terminate(),connectionsOn(), plusapplication()/applications().- Per-connection plugin state bag on the
Connectioncontract:setState(),state(),hasState(),forgetState(). - New config key
reverb.servers.reverb.plugins, an array ofServerPluginclass names resolved through the container. Scheduler(Webpatser\Resonate\Scheduling\Scheduler) - a thin layer over the Revolt event loop. Every task runs inside a fiber and is exception-isolated, named for logging, and cancellable.
Changed
Server::message()runs the interceptor chain after validation and before thepusher:/client-*split;Server::open()/close()andEventHandler::afterSubscribe()fire the lifecycle hooks.- A message a plugin marks
HandledorRejectedno longer fires theMessageReceivedevent or logsMessage Handled; both are now scoped to traffic the core actually routed (Relay). StartServerregisters all periodic work through theSchedulerinstead of bareEventLoop::repeatcalls, so every task is fiber-wrapped and exception-isolated. Periodic tasks are cancelled when the server begins to drain or stop.
Docs
- New
docs/plugins.md- a full setup walkthrough with a worked plugin implementing all three capabilities.
Suite grows to 313 tests.
v0.1.1: rename artisan commands to resonate:*
Changed (breaking)
- Artisan commands renamed from
reverb:start/reverb:restart/reverb:installtoresonate:start/resonate:restart/resonate:install. Update supervisor / systemd / Docker entrypoints accordingly. Thelaravel:reverb:restartcache key is unchanged, so running Resonate servers still pick up restart signals from any existing tooling.
v0.1.0: initial release
Changelog
All notable changes to webpatser/resonate are documented here.
v0.1.0 - 2026-05-16
Initial public release. Fiber-based drop-in replacement for Laravel Reverb on webpatser/fledge-fiber.
- Pusher wire protocol with byte-exact JSON framing (public, private, presence, cache, private-cache, presence-cache channels; client events; rate limiting; connection limits; origin verification).
- Full Pusher-compatible HTTP REST API (events, batch events, channels, channel, channel users, connections, user termination, health check) with the original HMAC signature canonicalization.
- Horizontal scaling via Redis pub/sub on fledge-fiber's async Redis. Pure JSON envelopes, no
serialize(). Cross-nodemessage/terminate/metricspropagation. reverb:start,reverb:restart,reverb:installartisan commands; PID file; signal handling; restart-cache poll; periodic prune / ping; Pulse and Telescope ingest timers.- Pulse recorders + Livewire dashboard components (
reverb.connections,reverb.messages).