Funciones
La parte difícil del realtime, ya en marcha
Una función realtime es un poco de código de producto sobre mucha maquinaria de entrega: quién está suscrito, quién tiene permiso, quién sigue ahí. PushCaster es esa segunda parte.
Channels
Cuatro tipos, y el prefijo es el contrato
El nombre de un channel decide cómo se comporta. El prefijo le dice a la librería si debe pedir autorización a su servidor, si debe esperar una lista de miembros y si debe cifrar.
| Prefijo | Quién puede suscribirse | Para qué sirve | Autorización |
|---|---|---|---|
| public | Cualquiera que tenga la app key. | Estado de compilaciones, marcadores en vivo, feeds públicos. | Ninguna |
| private- | Su servidor decide, suscriptor a suscriptor. | Cualquier cosa acotada a una cuenta o a un recurso. | Firmada |
| presence- | Autorizado, y trae la lista de miembros. | Salas y sesiones, donde la pertenencia es la función. | Firmada |
| private-encrypted- | Autorizado; los payloads los cifran sus clientes. | Payloads que también deben quedar opacos para nosotros. | Firmada |
cache- los channels entregan events en vivo pero no reproducen estado guardado — vea diferencias conocidas.
Autorización
Su servidor sigue siendo la autoridad
Nosotros no concedemos las suscripciones private ni presence. Las concede su aplicación, y firma su respuesta con su app secret. Nosotros verificamos la firma y nada más.
- Un endpointPOST /pusher/auth conserva la forma de su petición y de su respuesta.
- Sus reglasSi este socket puede entrar en este channel es una pregunta que solo puede responder usted.
- Identidad en presenceLa misma llamada devuelve el member id y lo que los demás miembros deban ver.
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
Lo que ve la capa de sockets, lo oye su backend
La ocupación y la pertenencia solo son visibles en la conexión. Los webhooks se las devuelven, firmadas, para que empiece a trabajar cuando llega el primer espectador y pare cuando se va el último.
| Event | Se dispara cuando |
|---|---|
| channel_occupied | El primer suscriptor entró en un channel vacío. |
| channel_vacated | Se fue el último suscriptor. |
| member_added | Alguien entró en un channel presence. |
| member_removed | Alguien salió de un channel presence. |
| client_event | Un cliente envió un event directamente a un channel. |
| cache_miss | Se pidió a un channel cache un estado que no tenía. |
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)})Librerías
No hay SDK de PushCaster, a propósito
PushCaster habla el protocolo Pusher Channels en el cable, así que las librerías oficiales funcionan con él sin modificar. Ningún paquete nuestro que añadir y nada nuestro que se rompa cuando publicamos.
- pusher-js
- Laravel Echo
- pusher/pusher-php-server
- pusher-http-node
- Python
- Go
- Ruby
- Java
- Android
- iOS
- Flutter
- Unity
Línea de instalación, completa: npm i pusher-js.
Infraestructura
Dos capas, y un cluster que usted elige
La entrega corre en una capa separada de la facturación y la configuración, así que una caída del control plane degrada el panel sin interrumpir la entrega.
En marcha ahora
- eu1Europa Oeste
- eu2Europa Central
Los clusters son de alta disponibilidad para la mensajería y no para presence: si se pierde un almacén de presence, presence y la ocupación se degradan mientras los channels public y private siguen entregando. Mejor leerlo aquí que descubrirlo después.
Vea el recorrido de un publish