إنشاء مشغلات الأحداث المخصصة والتعامل معها

باستخدام وظائف السحابة (الجيل الثاني)، يمكنك تشغيل الوظائف استجابة للأحداث المخصصة . هذه هي الأحداث التي يتم توفيرها بواسطة موفري أحداث خاصين أو إضافيين، على عكس أحداث 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 for 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)
    # ...