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

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

همه رویدادهای سفارشی با قالب رویداد 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 for Firebase منتشر می‌کنید، باید فیلد source را به‌طور صریح در بار داده رویدادتان اضافه کنید.

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

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

Node.js

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

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

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