ایجاد و رسیدگی به محرک های رویداد سفارشی

با توابع ابری (نسل دوم)، می‌توانید عملکردها را در پاسخ به رویدادهای سفارشی فعال کنید. اینها رویدادهایی هستند که توسط ارائه دهندگان رویداد ویژه یا اضافی ارائه می شوند، برخلاف رویدادهای Firebase که به طور بومی توسط Firebase SDK برای توابع ابری پشتیبانی می شوند. از طریق راه‌اندازهای رویداد سفارشی، برنامه شما می‌تواند به رویدادهای ارائه‌شده توسط برنامه‌های افزودنی Firebase پاسخ دهد، یا می‌توانید رویدادهای سفارشی خود را منتشر کنید و عملکردهایی را در پاسخ به آن‌ها فعال کنید.

همه رویدادهای سفارشی با قالب رویداد CloudEvents JSON مطابقت دارند و در Eventarc منتشر می‌شوند. هزینه های استفاده از Eventarc اعمال می شود.

توابع را با رویدادهای سفارشی فعال کنید

می‌توانید رویدادهای سفارشی را منتشر کنید (یا رویدادها را از برنامه‌های افزودنی Firebase دریافت کنید) و توابع را در پاسخ به آن رویدادها با اجرای این جریان اصلی راه‌اندازی کنید:

  1. رویدادهای مورد نظر را در یک کانال Eventarc منتشر کنید یا رویدادهای موجود را که توسط افزونه ای که نصب کرده اید ارائه شده است شناسایی کنید.
  2. در کد تابع خود، با یک کنترل کننده رویداد در رویدادهای کانال Eventarc مشترک شوید.
  3. در تابع، محموله بازگشتی در شی 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 . . .'
    }
});

علاوه بر ایجاد خودکار کانال پیش‌فرض، Firebase متغیر محیطی EVENTARC_CLOUD_EVENT_SOURCE را تنظیم می‌کند که منبع رویداد را مشخص می‌کند. اگر رویدادهایی را خارج از Cloud Functions برای Firebase منتشر می‌کنید، باید صریحاً قسمت source را به بار رویداد خود اضافه کنید.

رویدادهای سفارشی را مدیریت کنید

می‌توانید همه رویدادهای سفارشی، از جمله رویدادهای برنامه‌های افزودنی را با کنترل‌کننده‌های onCustomEventPublished یا on_custom_event_published مدیریت کنید. ابتدا این کنترلر را از Eventarc SDK به همراه Firebase Admin SDK وارد کنید:

Node.js

const {onCustomEventPublished} = require("firebase-functions/v2/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

در کد تابع خود، نام رویداد را همانطور که برای تابع مثال نشان داده شده است، وارد کنید:

Node.js

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

برای هر برنامه افزودنی خاص، باری که در شی رویداد بازگردانده می شود، داده هایی را ارائه می دهد که می توانید از آنها برای اجرای منطق سفارشی برای جریان برنامه خود استفاده کنید. در این مورد، تابع از Admin SDK برای کپی کردن ابرداده های مربوط به تصویر تغییر اندازه در مجموعه ای در Cloud Firestore، به دست آوردن نام فایل از subject ارائه شده توسط رویداد، و ذخیره ابرداده از data ارائه شده توسط رویداد استفاده می کند.

انتشار و مدیریت رویدادها در کانال های غیر پیش فرض

کانال‌های سفارشی می‌توانند برای مواردی مفید باشند که نیاز به مجوز خاص یا سایر الزامات دارید و سطح دید و دسترسی یکسانی برای همه رویدادها نمی‌خواهید. می توانید کانال های خود را با استفاده از کنسول Google Cloud ایجاد کنید. انتشار و عضویت رویدادها باید در همین کانال انجام شود.

در مواردی که یک رویداد سفارشی در یک کانال غیر پیش‌فرض منتشر می‌شود، باید کانال را در کد تابع خود مشخص کنید. برای مثال، اگر می‌خواهید رویدادهایی را که در یک کانال غیر پیش‌فرض برای مکان us-west1 منتشر می‌شوند مدیریت کنید، باید کانال را مطابق شکل مشخص کنید:

Node.js

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)
    # ...