45 lines
2.7 KiB
Markdown
45 lines
2.7 KiB
Markdown
# Realtime Messaging
|
|
|
|
Skinbase Nova messaging now uses Laravel Reverb, Laravel Broadcasting, Laravel Echo, Redis-backed queues, and Laravel Horizon for queue visibility.
|
|
|
|
## v2 capabilities
|
|
|
|
- Presence is exposed through a global `presence-messaging` channel for inbox-level online state.
|
|
- Conversation presence still uses the per-thread presence channel so the header can show who is actively viewing the room.
|
|
- Typing indicators remain ephemeral and Redis-backed.
|
|
- Read markers are stored on conversation participants and expanded into `message_reads` for durable receipts.
|
|
- The conversation list response now includes `summary.unread_total` for global badge consumers.
|
|
- Reconnect recovery uses `GET /api/messages/{conversation_id}/delta?after_message_id=...`.
|
|
- Presence heartbeats use `POST /api/messages/presence/heartbeat` and are intended only to support offline fallback notification logic plus server-side presence awareness.
|
|
|
|
## Local setup
|
|
|
|
1. Set the Reverb, Redis, messaging, and Horizon values in `.env`.
|
|
2. Run `php artisan migrate`.
|
|
3. Run `npm install` if dependencies are not installed.
|
|
4. Start the websocket server with `php artisan reverb:start --host=0.0.0.0 --port=8080`.
|
|
5. Start queue workers with `php artisan queue:work redis --queue=broadcasts,notifications,default --tries=1`.
|
|
6. Start the frontend with `npm run dev` or build assets with `npm run build`.
|
|
|
|
## Horizon
|
|
|
|
- Horizon is installed for production queue monitoring and uses dedicated supervisors for `broadcasts` and `notifications` alongside the default queue.
|
|
- The scheduler now runs `php artisan horizon:snapshot` every five minutes so the dashboard records queue metrics.
|
|
- On Windows development machines, Horizon itself cannot run because PHP lacks `ext-pcntl` and `ext-posix`; that limitation does not affect Linux production deployments.
|
|
- Use `php artisan horizon` on Linux-based environments and keep the dashboard behind the `viewHorizon` gate.
|
|
|
|
## Production notes
|
|
|
|
- Use `BROADCAST_CONNECTION=reverb` and `QUEUE_CONNECTION=redis`.
|
|
- Keep `MESSAGING_REALTIME=true` only when Reverb is configured and reachable from the browser.
|
|
- Terminate TLS in Nginx and proxy websocket traffic to the Reverb process.
|
|
- Run `php artisan reverb:start` and `php artisan horizon` under Supervisor or systemd.
|
|
- The chat UI falls back to HTTP polling only when realtime is disabled in config.
|
|
- Database notification fallback now only runs for recipients who are not marked online in messaging presence.
|
|
|
|
## Reconnect model
|
|
|
|
- The conversation view loads once via HTTP.
|
|
- Live message, read, typing, and conversation summary updates arrive over websocket channels.
|
|
- When the socket reconnects, the client requests deltas from the explicit `delta` endpoint and merges them idempotently by message id, UUID, and client temp id.
|