facile-it/crossbar-http-publisher-bundle
Symfony bundle for publishing WAMP events to a Crossbar router over HTTP, letting PHP apps push real-time messages without maintaining a persistent WebSocket connection. Configure the publisher through Symfony services and start broadcasting quickly.
Architecture fit — primary finding unchanged: this is not a Laravel package. facile-it/crossbar-http-publisher-bundle is a Symfony bundle. It ships a Bundle class, a DependencyInjection/*Extension with a Configuration tree, and service wiring consumed by Symfony's container compiler passes. None of that executes under Laravel's container lifecycle. There is no service provider, no facade, no publishable config, and no Laravel-tagged release. Treat this as a reference implementation, not a dependency.
What release 2.1.0 changes — and what it does not. The 2.1.0 notes are narrow: added support for Guzzle 7, deprecated support for Guzzle 5 and 6. There is no Laravel service provider, no facade, no config stub, no framework-agnostic core extraction, and no change to the Symfony DI surface. The framework-mismatch finding is untouched, and the adoption verdict therefore stands. Two secondary observations are worth recording:
symfony/http-client implementation — the earlier assessment's "Symfony HttpClient → Http facade" mapping was directionally right but imprecise. This is materially good news for us: Laravel's Illuminate\Support\Facades\Http is Guzzle 7 under the hood, so a reimplementation runs on the same transport generation the bundle now targets. Request signing, header handling, timeout, and retry semantics can be reasoned about with near-parity, and the Guzzle 7 requirement aligns exactly with Laravel 10/11/12's own dependency floor.The Guzzle 5/6 deprecation is irrelevant to our decision, because we are not installing the package. It would only matter to an existing Symfony consumer pinned to an older Guzzle — a population we are not in. It is a forward-looking hygiene change, not a breaking change for anyone on a modern stack.
What the package actually does remains narrow and replicable: it takes a topic plus args/kwargs, serializes them, and issues an HTTP POST to a Crossbar router's HTTP Publisher endpoint using the publisher's public key and secret (HMAC-signed request, per Crossbar's HTTP Publisher auth contract). That is an Http::withHeaders()->post() call plus a signing helper — roughly 80–150 lines to reproduce idiomatically in Laravel.
Integration feasibility: high, and marginally better than at first assessment. The protocol surface is small and stable; the transport is now confirmed as Guzzle 7, matching our own. Reimplementation risk stays low and bounded. The real cost is not code, it is protocol literacy — WAMP topic naming, args vs kwargs semantics, and the router-side publisher registration that must exist before your first publish succeeds.
Technical risk profile (revised)
| Risk | Severity | Notes |
|---|---|---|
| Framework mismatch | High | Symfony DI extension is inert in Laravel; 2.1.0 does nothing to address this |
| Adoption / bus factor | Medium-High | ~10 stars, 0 dependents, effectively single-maintainer; no downstream usage to surface regressions |
| Abandonment | Medium-Low (was Medium) | 2.1.0 demonstrates continued maintenance and dependency hygiene; still low-volume, still one maintainer |
| Delivery semantics | Medium | HTTP Publisher is fire-and-forget; no ack of subscriber delivery, no durable queue |
| Vendor coupling | Low-Medium | Crossbar is niche; if the router is replaced, the adapter is throwaway |
| Transport parity | Low (new row) | Bundle and Laravel Http both target Guzzle 7; no behavioural gap to bridge at the transport layer |
| License | None | Apache-2.0 is permissive; attribution only |
Key questions to resolve before commitment (unchanged — 2.1.0 answers none of them)
Stack fit. Laravel is a stronger host for this than Symfony would be: Illuminate\Support\Facades\Http (Guzzle 7-backed) covers transport, config/ covers configuration, the container covers binding, and the queue covers durability. Everything the bundle provides maps to a first-class Laravel primitive — and 2.1.0's Guzzle 7 floor now matches our runtime exactly, so there is no version negotiation to perform.
Recommended shape (do not port the bundle):
config/crossbar.php — base_url, realm, publisher_key, publisher_secret, timeout, retry, queue.CrossbarPublisher interface with a single publish(string $topic, array $args = [], array $kwargs = []): void method — this is the seam that keeps us vendor-neutral.HttpCrossbarPublisher implementation using the HTTP client, with signing isolated in a small RequestSigner class so it is unit-testable in isolation.CrossbarServiceProvider binding the interface as a singleton; optional Crossbar facade for ergonomics.PublishEventJob (queued, tries/backoff configured) so publishes never block a request cycle.Migration path from the bundle's concepts. The mapping is mechanical and can be done in a single sitting:
| Bundle concept | Laravel equivalent |
|---|---|
crossbar_http_publisher config tree |
config/crossbar.php + config()->get() |
| DI extension / service definition | ServiceProvider::register() |
| Injected publisher service | Interface binding + constructor injection |
| Bundle event listeners | Laravel events / listeners |
| Guzzle 7 client (2.1.0) | Http facade or injected Illuminate\Http\Client\Factory |
Compatibility notes. Target PHP 8.2+ and Laravel 10/11/12; the bundle's own constraint set is irrelevant since we are not installing it — though it is now reassuringly convergent with ours on Guzzle. Confirm the Crossbar HTTP Publisher endpoint version on the router (v1 vs v2 routers differ in auth header handling). If we ever add a Symfony service to the estate, the adapter interface ports unchanged — this remains the main benefit of owning the seam.
Sequencing (suggested, ~2 sprints — unchanged by 2.1.0)
curl to confirm signing, headers, and payload shape. This de-risks 80% of the unknowns.Maintenance. Low and ours. We own ~150 lines instead of inheriting a low-traffic third-party bundle — a net positive. 2.1.0 slightly softens the counter-argument: the upstream is demonstrably alive and tracking Guzzle majors, so if we had adopted it we would not be stranded. But "not stranded" is not the same as "supported," and we still would not get upstream protocol changes as composer updates; we must watch Crossbar release notes ourselves. Pin the router version in infrastructure-as-code so protocol drift is a deliberate decision rather than a surprise.
Support. Community support is effectively absent: a Symfony-focused maintainer, ~10 stars, no dependents, no Stack Overflow corpus. 2.1.0 does not change this — a changelog entry is not a support channel. Internal documentation is mandatory, not optional: a short runbook covering topic naming conventions, credential rotation, and "what to do when publishes fail" is the difference between a 15-minute and a 4-hour incident.
Scaling. The HTTP Publisher path is synchronous per request and offers no broker-side buffering — Crossbar accepts the publish and fans out; it does not queue for offline subscribers. Throughput is bounded by HTTP round-trip latency against the router. Mitigations:
Failure modes to design for explicitly
Ramp-up. A PHP developer unfamiliar with WAMP needs roughly half a day on concepts (realm, topic, pub/sub vs RPC, publisher registration) and one day pairing on the adapter to be productive. The bundle itself teaches little — it is thin — so onboarding effort is concentrated on Crossbar, not on this package. Guzzle 7 familiarity, which any Laravel developer already has, now covers the transport layer outright. Budget accordingly: the router is the system to learn, and the router is where the operational risk actually lives.
Verdict — unchanged, with one note. Do not adopt the dependency; adopt the pattern. Release 2.1.0 is a routine dependency-hygiene release: it improves the package's maintenance optics and confirms Guzzle 7, which happens to be the exact transport Laravel's HTTP client uses — but it introduces no Laravel affordance, no framework-agnostic core, and no change to the Symfony coupling that blocks installation. The package still scores low on ecosystem signals (0 dependents, single maintainer, framework mismatch) and high on opportunity, because the problem remains under-served: nobody has built the Laravel equivalent. A small owned adapter behind a stable interface is cheaper, safer, and more debuggable than any attempt to shoehorn a Symfony bundle into a Laravel application. Re-evaluate only if a future release ships a framework-agnostic core or an official Laravel service provider.
How can I help you explore Laravel packages today?