This project is a demo websocket backend for mobile SDK integration.
It continuously emits fake events to:
- public channel
- private channel (auth required)
- presence channel (auth + room membership)
docker --version
docker compose versionIf these fail, install Docker Desktop (or Docker Engine + Compose plugin) and start Docker.
ddev versionIf this fails, install DDEV:
Required for this project:
- DDEV
>= 1.25.1
Upgrade command (script-based installs):
curl -fsSL https://ddev.com/install.sh | bashIf prompted for /usr/local/bin permissions, run it in your local terminal with sudo access.
cloudflared --versionIf this fails, install cloudflared:
- DDEV sharing docs: https://docs.ddev.com/en/stable/users/topics/sharing/#using-cloudflared
- Cloudflare install docs: https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/
Common install commands:
- macOS (Homebrew):
brew install cloudflared - Windows (winget):
winget install --id Cloudflare.cloudflared - Ubuntu/Debian: use Cloudflare's official APT steps in the docs above
git --versiongit clone https://github.com/adityaa-codes/echo-server echo-server
cd echo-serverRun:
ddev setupWhat ddev setup does:
ddev startddev composer installddev npm ciphp artisan key:generatephp artisan migrate --seedphp artisan optimize:clearddev restart- prints integration values via
ddev demo-info
ddev demo-upThis ensures daemons are running and prints mobile integration details.
ddev describeddev exec supervisorctl status reverb scheduler queue cloudflaredExpected: all required services show running.
ddev doctor-demoThis checks daemon state, broadcast auth route, and emits a demo event tick.
These users are auto-seeded:
demo1@example.com/password(userId1)demo2@example.com/password(userId2)demo3@example.com/password(userId3)
Run:
ddev demo-infoIt prints:
- Main URL
- Auth URL
- Reverb app ID and app key
- public websocket URL(s)
- channel names
- event names
- demo user credentials
- Public raw channel:
demo.public - Private raw channel:
private-demo.private.{userId} - Presence raw channel:
presence-demo.presence.{room}
Laravel Echo subscription forms:
channel('demo.public')private('demo.private.{userId}')join('demo.presence.{room}')
demo.public.tickdemo.private.tickdemo.presence.tick
- Relative:
/broadcasting/auth - Default full URL:
https://echo-server.ddev.site/broadcasting/auth
DDEV runs these as background daemons:
php artisan reverb:start --host=0.0.0.0 --port=9080php artisan schedule:workphp artisan queue:work redis --sleep=1 --tries=1
Scheduled emitter:
demo:broadcast-events --user-id=1 --room=main- interval: every second
- DDEV has
bind_all_interfaces: trueenabled. - For simulator/emulator, use values from
ddev demo-info. - For physical device:
- if
*.ddev.siteresolves, use that directly. - if not, use host machine LAN IP with exposed Reverb port.
- if
If DDEV commands fail with Docker socket errors, make sure Docker is running and your user can access Docker.
ddev restart
ddev exec supervisorctl status reverb scheduler queue cloudflared- confirm you are logged in with one of seeded users
- verify auth URL from
ddev demo-info - verify channel name includes correct
userId/room
- run
ddev doctor-demo - manually emit one tick:
ddev exec php artisan demo:broadcast-events --user-id=1 --room=main# full bootstrap
ddev setup
# start and print integration info
ddev demo-up
# diagnostics
ddev doctor-demo
# print all mobile integration values
ddev demo-info
# start a public cloudflared share URL
ddev share-cloudflared
# show URLs + ports
ddev describeddev share-cloudflaredThis generates a random public *.trycloudflare.com subdomain for sharing the server.
- Configure named tunnel token:
cp .ddev/.env.cloudflared.example .ddev/.env.cloudflared- Set
CLOUDFLARED_TUNNEL_TOKENandCLOUDFLARED_PUBLIC_URL. - Run:
ddev restart
ddev exec supervisorctl status cloudflared- public share URL
- auth path
/broadcasting/auth ddev demo-infooutput (app key, channels, events, demo users)
- Quick share: stop
ddev share-cloudflaredprocess (Ctrl+C). - Stable daemon tunnel: remove token from
.ddev/.env.cloudflaredand runddev restart.