Aller au contenu

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.

Types de channel, qui peut s'abonner, à quoi ils servent, et comment un abonnement est autorisé
PréfixeQui peut s'abonnerÀ quoi ça sertAutorisation
publicToute 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.
routes/pusher-auth.js
js
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.

Types d'event webhook et moment de déclenchement
EventSe déclenche quand
channel_occupiedLe premier abonné a rejoint un channel vide.
channel_vacatedLe dernier abonné est parti.
member_addedQuelqu'un a rejoint un channel presence.
member_removedQuelqu'un a quitté un channel presence.
client_eventUn client a envoyé un event directement à un channel.
cache_missOn a demandé à un channel cache un état qu'il ne détenait pas.
routes/webhooks.js
js
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

Créez une application et connectez un client.

Support