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

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

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

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

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

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