Özellikler
Realtime'ın zor kısmı, çoktan çalışıyor
Bir realtime özelliği, bir tutam ürün kodunun altında duran koca bir teslim mekanizmasıdır: kim abone, kimin izni var, kim hâlâ orada. PushCaster işte o ikinci kısımdır.
Channel'lar
Dört tür ve sözleşme, önekin kendisi
Bir kanal'ın adı nasıl davranacağını belirler. Önek kütüphaneye, sunucunuzdan yetki isteyip istemeyeceğini, bir üye listesi bekleyip beklemeyeceğini ve şifreleyip şifrelemeyeceğini söyler.
| Önek | Kim abone olabilir | Ne işe yarar | Yetki |
|---|---|---|---|
| public | App key'i olan herkes. | Derleme durumu, canlı skorlar, herkese açık akışlar. | Yok |
| private- | Sunucunuz abone bazında karar verir. | Bir hesaba veya bir kaynağa sınırlanmış her şey. | İmzalı |
| presence- | Yetkili ve üye listesini taşır. | Üyeliğin kendisinin özellik olduğu odalar ve oturumlar. | İmzalı |
| private-encrypted- | Yetkili; payload'ları istemcileriniz şifreler. | Bize karşı da kapalı kalması gereken payload'lar. | İmzalı |
cache- kanal'ları canlı olay teslim eder ama saklanmış durumu yeniden oynatmaz — bkz. bilinen farklar.
Yetkilendirme
Yetki sunucunuzda kalır
private ve presence aboneliklerini biz vermeyiz. Uygulamanız verir ve yanıtını sizin app secret'inizle imzalar. Biz imzayı doğrularız, başka bir şey yapmayız.
- Tek endpointPOST /pusher/auth istek ve yanıt biçimini korur.
- Sizin kurallarınızBu socket'in bu kanal'a katılıp katılamayacağı, yalnızca sizin yanıtlayabileceğiniz bir sorudur.
- presence kimliğiAynı çağrı member id'yi ve diğer üyelerin görmesi gereken her şeyi döndürür.
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 }, }), )})Webhook'lar
Socket katmanının gördüğünü backend'iniz duyar
Doluluk ve üyelik yalnızca bağlantıda görünür. Webhook'lar bunları imzalı olarak geri gönderir — böylece ilk izleyici geldiğinde işe başlayıp sonuncusu ayrıldığında durabilirsiniz.
| Event | Ne zaman tetiklenir |
|---|---|
| channel_occupied | İlk abone boş bir kanal'a katıldığında. |
| channel_vacated | Son abone ayrıldığında. |
| member_added | Biri bir presence kanal'ına katıldığında. |
| member_removed | Biri bir presence kanal'ından ayrıldığında. |
| client_event | Bir istemci doğrudan bir kanal'a olay gönderdiğinde. |
| cache_miss | Bir cache kanal'ından, elinde olmayan bir durum istendiğinde. |
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)})Kütüphaneler
PushCaster SDK'si yok, bilerek
PushCaster telde Pusher Channels protokolünü konuşur; resmî kütüphaneler onunla değiştirilmeden çalışır. Eklenecek bir paketimiz yok ve sürüm çıkardığımızda bozulacak bir şeyimiz de yok.
- pusher-js
- Laravel Echo
- pusher/pusher-php-server
- pusher-http-node
- Python
- Go
- Ruby
- Java
- Android
- iOS
- Flutter
- Unity
Kurulum satırı, tam hâliyle: npm i pusher-js.
Altyapı
İki katman ve seçtiğiniz bir küme
Teslim, faturalandırma ve yapılandırmadan ayrı bir katmanda çalışır; bu yüzden bir control plane kesintisi teslimi kesmeden panoyu zayıflatır.
Şu anda çalışıyor
- eu1Batı Avrupa
- eu2Orta Avrupa
Cluster'lar mesajlaşma için yüksek erişilebilirliğe sahiptir, presence için değil: bir presence deposu kaybolursa presence ve doluluk zayıflar, public ve private kanal'lar teslim etmeye devam eder. Bunu burada okumak, sonradan keşfetmekten iyidir.
Bir publish'in yolculuğunu görün