Problem
Pusher signs presence channel auth as:
HMAC_SHA256("{socket_id}:{channel_name}:{channel_data}", app_secret)
isAuthorized in src/websocket.ts only ever signs socketId:channel:
const sha256 = generateHmacSHA256HexDigest(`${socketId}:${data.channel}`, String(import.meta.env.PUSHER_APP_SECRET))
return data.auth === `${import.meta.env.PUSHER_APP_KEY}:${sha256}`
Any unmodified Pusher auth backend (Laravel Broadcast::auth, pusher-http-node authorizeChannel, pusher-php-server presence_auth) includes channel_data in the signature, so BunPulse rejects every legitimate presence subscription. Presence channels currently only work if the backend implements BunPulse's non-standard signature — which defeats "drop-in replacement".
What's needed
Reference: Pusher auth signature spec
Problem
Pusher signs presence channel auth as:
isAuthorizedinsrc/websocket.tsonly ever signssocketId:channel:Any unmodified Pusher auth backend (Laravel
Broadcast::auth, pusher-http-nodeauthorizeChannel, pusher-php-serverpresence_auth) includeschannel_datain the signature, so BunPulse rejects every legitimate presence subscription. Presence channels currently only work if the backend implements BunPulse's non-standard signature — which defeats "drop-in replacement".What's needed
channel_datais present (presence channels), verify againstsocket_id:channel:channel_datausing the raw string as sent by the clientsocket_id:channelfor private channelsReference: Pusher auth signature spec