Backend — Laravel (PHP)
use Illuminate\Support\Facades\Http;
// 1. Mint a token for a logged-in user
$response = Http::withHeaders([
'X-App-Key' => config('websockets.app_key'),
'X-App-Secret' => config('websockets.app_secret'),
])->post(config('websockets.host') . '/auth/get-token', [
'user_id' => (string) $user->id,
'user_info' => ['name' => $user->name],
'channels' => ['chat-general', "private-user-{$user->id}"],
]);
$token = $response->json('token');
// 2. Broadcast an event
Http::withHeaders([
'X-App-Key' => config('websockets.app_key'),
'X-App-Secret' => config('websockets.app_secret'),
])->post(
config('websockets.host') . '/apps/' . config('websockets.app_key') . '/events',
[
'channel' => 'chat-general',
'event' => 'post.created',
'data' => ['post' => $post->toArray()],
]
);
Backend — Node.js
const fetch = require('node-fetch'); // or native fetch on Node 18+
async function mintToken(userId, channels) {
const res = await fetch(`${WS_HOST}/auth/get-token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-App-Key': process.env.WS_APP_KEY,
'X-App-Secret': process.env.WS_APP_SECRET,
},
body: JSON.stringify({
user_id: String(userId),
channels,
}),
});
if (!res.ok) throw new Error(`token mint failed: ${res.status}`);
return (await res.json()).token;
}
async function broadcast(channel, event, data) {
await fetch(`${WS_HOST}/apps/${process.env.WS_APP_KEY}/events`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-App-Key': process.env.WS_APP_KEY,
'X-App-Secret': process.env.WS_APP_SECRET,
},
body: JSON.stringify({ channel, event, data }),
});
}
Frontend — Browser
<script src="https://cdn.socket.io/4.8.1/socket.io.min.js"></script>
<script>
// tokenFromBackend came via your app's own page / API
const socket = io(`https://your-domain.com/${APP_KEY}`, {
auth: { token: tokenFromBackend }
});
socket.on('connect', () => console.log('connected', socket.id));
socket.on('connect_error', (e) => console.error(e.message));
// Listen for server broadcasts
socket.on('post.created', (payload) => {
console.log('new post in', payload.channel, payload.data);
});
// Send to a channel
document.getElementById('send').onclick = () => {
socket.emit('client-event', {
channel: 'chat-general',
event: 'message',
data: 'Hello!'
});
};
</script>
cURL
# Mint a token
curl -X POST https://your-domain.com/auth/get-token \
-H "Content-Type: application/json" \
-H "X-App-Key: aafq136csrjlqbos28vu" \
-H "X-App-Secret: <app-secret>" \
-d '{
"user_id": "user-123",
"user_info": { "name": "Jane" },
"channels": ["chat-general"]
}'
# Broadcast
curl -X POST https://your-domain.com/apps/aafq136csrjlqbos28vu/events \
-H "Content-Type: application/json" \
-H "X-App-Key: aafq136csrjlqbos28vu" \
-H "X-App-Secret: <app-secret>" \
-d '{
"channel": "chat-general",
"event": "message",
"data": "Hello everyone!"
}'