با Cloud Functions (نسل دوم)، میتوانید توابع را در پاسخ به رویدادهای سفارشی فعال کنید. اینها رویدادهایی هستند که توسط ارائهدهندگان رویداد ویژه یا اضافی ارائه میشوند، برخلاف رویدادهای فایربیس که بهطور بومی توسط Firebase SDK برای Cloud Functions پشتیبانی میشوند. از طریق محرکهای رویداد سفارشی، برنامه شما میتواند به رویدادهای ارائه شده توسط Firebase Extensions پاسخ دهد، یا میتوانید رویدادهای سفارشی خود را منتشر کنید و توابع را در پاسخ به آنها فعال کنید.
تمام رویدادهای سفارشی با فرمت رویداد CloudEvents JSON مطابقت دارند و در Eventarc منتشر میشوند. هزینه استفاده از Eventarc اعمال میشود.
توابع را با رویدادهای سفارشی فعال کنید
شما میتوانید رویدادهای سفارشی را منتشر کنید (یا رویدادها را از افزونههای Firebase دریافت کنید) و با پیادهسازی این جریان اساسی، توابع را در پاسخ به آن رویدادها فعال کنید:
- رویدادهای مورد نظر را در یک کانال Eventarc منتشر کنید، یا رویدادهای موجود ارائه شده توسط افزونهای که نصب کردهاید را شناسایی کنید.
- در کد تابع خود، با استفاده از یک کنترلکننده رویداد، در رویدادهای کانال Eventarc مشترک شوید.
- در تابع، payload برگردانده شده در شیء CloudEvent را تجزیه کنید و هر منطق سفارشی که برنامه شما نیاز دارد را اجرا کنید.
برای مثال، یک اپلیکیشن بازی ممکن است بخواهد هنگام ورود یا خروج کاربران از جدول امتیازات ده رقیب برتر، اعلانهایی را برای آنها ارسال کند. این اپلیکیشن میتواند رویدادهای جدول امتیازات را در کانال پیشفرض منتشر کند و سپس این رویداد را در تابعی مدیریت کند که اعلانهای فوری هدفمند را برای کاربران ارسال میکند.
در مثالی دیگر، افزونهای که برای کمک به برنامهها در پردازش تصاویر بزرگ طراحی شده است، ممکن است رویدادی را در زمان تکمیل تغییر اندازه تصویر منتشر کند. برنامههایی که این افزونه را نصب دارند، میتوانند با بهروزرسانی لینکها در برنامه برای اشاره به نسخههای تغییر اندازه یافته تصویر، رویداد تکمیل را مدیریت کنند.
انتشار رویداد در کانال
رویدادهای Eventarc در کانالها منتشر میشوند. کانالها راهی برای گروهبندی رویدادهای مرتبط و مدیریت مجوزهای دسترسی هستند. وقتی افزونهای نصب میکنید یا تابعی را پیادهسازی میکنید که رویدادهای سفارشی را مصرف میکند، Firebase بهطور خودکار یک کانال پیشفرض به نام firebase
در ناحیه us-central1
ایجاد میکند. Firebase Admin SDK یک زیربسته eventarc
برای انتشار در کانالها ارائه میدهد.
برای انتشار یک رویداد از یک سرور قابل اعتماد (یا یک تابع دیگر) با استفاده از کانال پیشفرض:
import {getEventarc} from 'firebase-admin/eventarc';
getEventarc().channel().publish({
type: 'achieved-leaderboard',
subject: 'Welcome to the top 10',
data: {
message: 'You have achieved the nth position in our leaderboard! To see . . .'
}
});
علاوه بر ایجاد خودکار کانال پیشفرض، فایربیس متغیر محیطی EVENTARC_CLOUD_EVENT_SOURCE
را تنظیم میکند که منبع رویداد را مشخص میکند. اگر رویدادهایی را خارج از Cloud Functions for Firebase منتشر میکنید، باید صریحاً فیلد source
در payload رویداد خود اضافه کنید.
مدیریت رویدادهای سفارشی
شما میتوانید تمام رویدادهای سفارشی، از جمله رویدادهای افزونهها، را با هندلرهای onCustomEventPublished
یا on_custom_event_published
مدیریت کنید. ابتدا، این هندلر را از Eventarc SDK به همراه Firebase Admin SDK وارد کنید:
نود جی اس
const {onCustomEventPublished} = require("firebase-functions/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");
پایتون
from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn
در کد تابع خود، نام رویداد را همانطور که برای تابع مثال نشان داده شده است، وارد کنید:
نود جی اس
exports.onimageresized = onCustomEventPublished(
"firebase.extensions.storage-resize-images.v1.complete",
(event) => {
logger.info("Received image resize completed event", event);
// For example, write resized image details into Firestore.
return getFirestore()
.collection("images")
.doc(event.subject.replace("/", "_")) // original file path
.set(event.data); // resized images paths and sizes
});
پایتون
@eventarc_fn.on_custom_event_published(
event_type="firebase.extensions.storage-resize-images.v1.complete")
def onimageresized(event: eventarc_fn.CloudEvent) -> None:
print("Received image resize completed event: ", event.type)
if not isinstance(event.subject, str):
print("No 'subject' data.")
return
# For example, write resized image details into Firestore.
firestore_client: google.cloud.firestore.Client = firestore.client()
collection = firestore_client.collection("images")
doc = collection.document(event.subject.replace("/", "_")) # original file path
doc.set(event.data) # resized images paths and sizes
برای هر افزونه خاص، payload برگردانده شده در شیء رویداد، دادههایی را ارائه میدهد که میتوانید برای انجام منطق سفارشی برای جریان برنامه خود از آنها استفاده کنید. در این حالت، تابع از Admin SDK برای کپی کردن ابردادههای مربوط به تصویر تغییر اندازه داده شده به مجموعهای در Cloud Firestore استفاده میکند، نام فایل را از subject
ارائه شده توسط رویداد دریافت میکند و ابردادهها را از data
ارائه شده توسط رویداد ذخیره میکند.
انتشار و مدیریت رویدادها در کانالهای غیر پیشفرض
کانالهای سفارشی میتوانند برای مواردی که نیازهای مجوز ویژه یا سایر الزامات را دارید و نمیخواهید سطح دید و دسترسی یکسانی برای همه رویدادها داشته باشید، مفید باشند. میتوانید کانالهای خود را با استفاده از کنسول Google Cloud ایجاد کنید. انتشار و اشتراک رویدادها باید در همان کانال انجام شود.
در مواردی که یک رویداد سفارشی در یک کانال غیر پیشفرض منتشر میشود، باید کانال را در کد تابع خود مشخص کنید. برای مثال، اگر میخواهید رویدادهایی را که در یک کانال غیر پیشفرض برای مکان us-west1
منتشر میشوند، مدیریت کنید، باید کانال را مطابق شکل زیر مشخص کنید:
نود جی اس
import { onCustomEventPublished } from "firebase-functions/v2/eventarc";
export const func = onCustomEventPublished(
{
eventType: "firebase.extensions.storage-resize-images.v1.complete",
channel: "locations/us-west1/channels/firebase",
region: "us-west1",
},
(event) => { ... });
پایتون
@eventarc_fn.on_custom_event_published(
event_type="firebase.extensions.storage-resize-images.v1.complete",
channel="locations/us-west1/channels/firebase",
region="us-west1")
def onimageresizedwest(event: eventarc_fn.CloudEvent) -> None:
print("Received image resize completed event: ", event.type)
# ...