امکانات
بخش سختِ بیدرنگ، از قبل در حال اجرا
یک قابلیت بیدرنگ کمی کد محصول است روی انبوهی از سازوکار تحویل: چه کسی مشترک است، چه کسی اجازه دارد، چه کسی هنوز آنجاست. PushCaster همان بخش دوم است.
کانالها
چهار نوع، و پیشوند همان قرارداد است
نام یک کانال رفتارش را تعیین میکند. پیشوند به کتابخانه میگوید که آیا باید از سرور شما اجازه بگیرد، آیا باید منتظر فهرست اعضا باشد، و آیا باید رمزگذاری کند.
| پیشوند | چه کسی میتواند مشترک شود | به چه درد میخورد | احراز |
|---|---|---|---|
| public | هر کسی که app key را داشته باشد. | وضعیت بیلد، نتیجهٔ زندهٔ بازی، خوراکهای عمومی. | ندارد |
| private- | سرور شما تصمیم میگیرد، برای هر مشترک جدا. | هر چیزی که به یک حساب یا یک منبع محدود باشد. | امضاشده |
| presence- | اجازهدار، و فهرست اعضا را هم میآورد. | اتاقها و نشستها، جایی که خودِ عضویت همان قابلیت است. | امضاشده |
| private-encrypted- | اجازهدار؛ پیلودها را کلاینتهای شما رمز میکنند. | پیلودهایی که باید برای ما هم ناخوانا بمانند. | امضاشده |
cache- رویدادهای زنده را تحویل میدهند اما وضعیت ذخیرهشده را دوباره پخش نمیکنند — نگاه کنید به تفاوتهای شناختهشده.
احراز دسترسی
سرور شما همچنان مرجع است
اشتراک در کانالهای private و presence را ما نمیدهیم. اپلیکیشن شما میدهد و جوابش را با app سکرت خودتان امضا میکند. ما امضا را بررسی میکنیم و همین.
- یک اندپوینتPOST /pusher/auth همان شکل درخواست و پاسخ را نگه میدارد.
- قاعدههای شمااینکه این سوکت اجازهٔ پیوستن به این کانال را دارد یا نه، پرسشی است که فقط شما میتوانید جوابش را بدهید.
- هویت در presenceهمان فراخوانی، شناسهٔ عضو و هر چیز دیگری را که باید بقیه ببینند برمیگرداند.
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 }, }), )})وبهوکها
آنچه لایهٔ سوکت میبیند، بکاند شما میشنود
حضور و عضویت فقط سر اتصال دیده میشوند. وبهوکها آنها را امضاشده برمیگردانند — تا وقتی اولین بیننده میآید کار را شروع کنید و وقتی آخرین نفر میرود متوقفش کنید.
| رویداد | کِی فعال میشود |
|---|---|
| channel_occupied | اولین مشترک به یک کانال خالی پیوست. |
| channel_vacated | آخرین مشترک رفت. |
| member_added | کسی به یک کانال از نوع presence پیوست. |
| member_removed | کسی از یک کانال از نوع presence رفت. |
| client_event | یک کلاینت رویدادی را مستقیم به یک کانال فرستاد. |
| cache_miss | از یک کانال از نوع cache وضعیتی خواسته شد که نداشت. |
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)})کتابخانهها
SDK اختصاصی PushCaster وجود ندارد، عمداً
PushCaster روی سیم به پروتکل Pusher Channels حرف میزند، پس کتابخانههای رسمی بدون تغییر با آن کار میکنند. نه بستهای از ما برای اضافهکردن، و نه چیزی که وقتی نسخهٔ تازه میدهیم بشکند.
- pusher-js
- Laravel Echo
- pusher/pusher-php-server
- pusher-http-node
- Python
- Go
- Ruby
- Java
- Android
- iOS
- Flutter
- Unity
خط نصب، کامل: npm i pusher-js.
زیرساخت
دو لایه، و کلاستری که خودتان انتخاب میکنید
تحویل روی لایهای جدا از صورتحساب و پیکربندی اجرا میشود، پس از کار افتادن control plane داشبورد را افت میدهد بیآنکه تحویل را قطع کند.
همین حالا در حال اجرا
- eu1غرب اروپا
- eu2مرکز اروپا
کلاسترها برای پیامرسانی دسترسپذیری بالا دارند و برای presence نه: اگر حافظهٔ presence از دست برود، presence و شمارش حاضران افت میکند در حالی که کانالهای public و private همچنان تحویل میدهند. بهتر است اینجا بخوانیدش تا بعداً کشفش کنید.
ببینید یک انتشار چه مسیری را طی میکند