Fonctionnalités
La partie difficile du realtime, déjà en fonctionnement
Une fonctionnalité realtime, c'est un peu de code produit posé sur beaucoup de machinerie de livraison : qui est abonné, qui a le droit, qui est encore là. PushCaster est cette seconde partie.
Channels
Quatre sortes, et le préfixe est le contrat
Le nom d'un channel décide de son comportement. Le préfixe indique à la bibliothèque s'il faut demander une autorisation à votre serveur, s'il faut attendre une liste de membres, et s'il faut chiffrer.
| Préfixe | Qui peut s'abonner | À quoi ça sert | Autorisation |
|---|---|---|---|
| public | Toute personne ayant l'app key. | État des builds, scores en direct, fils publics. | Aucune |
| private- | Votre serveur décide, abonné par abonné. | Tout ce qui est délimité à un compte ou à une ressource. | Signée |
| presence- | Autorisé, et porte la liste des membres. | Salles et sessions, où l'appartenance est la fonctionnalité. | Signée |
| private-encrypted- | Autorisé ; les payloads sont chiffrés par vos clients. | Des payloads qui doivent rester opaques pour nous aussi. | Signée |
cache- les channels livrent des events en direct mais ne rejouent pas d'état enregistré — voir différences connues.
Autorisation
Votre serveur reste l'autorité
Ce n'est pas nous qui accordons les abonnements private et presence. C'est votre application, et elle signe sa réponse avec votre app secret. Nous vérifions la signature, et rien d'autre.
- Un endpointPOST /pusher/auth conserve la forme de sa requête et de sa réponse.
- Vos règlesSavoir si ce socket peut rejoindre ce channel est une question à laquelle vous seul pouvez répondre.
- Identité dans presenceLe même appel renvoie le member id et ce que les autres membres doivent voir.
import Pusher from 'pusher'const pusher = new Pusher({ appId: process.env.PUSHCASTER_APP_ID, key: process.env.PUSHCASTER_KEY, secret: process.env.PUSHCASTER_SECRET, host: 'api-eu1.pushcaster.io', useTLS: true,})// Called by the client library whenever it subscribes to a// private-, presence- or private-encrypted- channel.app.post('/pusher/auth', (req, res) => { const { socket_id, channel_name } = req.body const user = req.session.user if (!user || !mayJoin(user, channel_name)) { return res.sendStatus(403) } res.send( pusher.authorizeChannel(socket_id, channel_name, { user_id: String(user.id), user_info: { name: user.name }, }), )})Webhooks
Ce que voit la couche sockets, votre backend l'entend
L'occupation et l'appartenance ne sont visibles qu'à la connexion. Les webhooks vous les renvoient, signées — pour lancer le travail quand arrive le premier spectateur et l'arrêter quand part le dernier.
| Event | Se déclenche quand |
|---|---|
| channel_occupied | Le premier abonné a rejoint un channel vide. |
| channel_vacated | Le dernier abonné est parti. |
| member_added | Quelqu'un a rejoint un channel presence. |
| member_removed | Quelqu'un a quitté un channel presence. |
| client_event | Un client a envoyé un event directement à un channel. |
| cache_miss | On a demandé à un channel cache un état qu'il ne détenait pas. |
app.post('/pushcaster/webhooks', (req, res) => { const hook = pusher.webhook({ headers: req.headers, rawBody: req.rawBody }) // The signature is computed with your app secret, so an // unsigned or mismatched delivery never reaches your logic. if (!hook.isValid()) return res.sendStatus(401) for (const event of hook.getEvents()) { if (event.name === 'channel_occupied') startFeed(event.channel) if (event.name === 'channel_vacated') stopFeed(event.channel) } res.sendStatus(200)})Bibliothèques
Il n'y a pas de SDK PushCaster, volontairement
PushCaster parle le protocole Pusher Channels sur le fil, les bibliothèques officielles fonctionnent donc avec lui sans modification. Aucun paquet de notre part à ajouter, et rien de notre part qui casse quand nous livrons.
- pusher-js
- Laravel Echo
- pusher/pusher-php-server
- pusher-http-node
- Python
- Go
- Ruby
- Java
- Android
- iOS
- Flutter
- Unity
Ligne d'installation, en entier : npm i pusher-js.
Infrastructure
Deux couches, et un cluster que vous choisissez
La livraison tourne sur une couche séparée de la facturation et de la configuration ; une panne du control plane dégrade donc le tableau de bord sans interrompre la livraison.
En fonctionnement
- eu1Europe Ouest
- eu2Europe Centrale
Les clusters sont hautement disponibles pour la messagerie et pas pour presence : si un stockage de presence est perdu, presence et l'occupation se dégradent tandis que les channels public et private continuent de livrer. Mieux vaut le lire ici que le découvrir plus tard.
Voyez le trajet d'un publish