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

با Cloud Functions (نسل دوم)، می‌توانید توابع را در پاسخ به رویدادهای سفارشی راه‌اندازی کنید. این‌ها رویدادهایی هستند که توسط ارائه‌دهندگان رویداد ویژه یا اضافی ارائه می‌شوند، درمقایسه با رویدادهای Firebase که به‌طور بومی توسط «کیت توسعه نرم‌افزار Firebase برای 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» به‌همراه 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)
    # ...