צור וטפל בטריגרים של אירועים מותאמים אישית

עם פונקציות ענן (דור שני), אתה יכול להפעיל פונקציות בתגובה לאירועים מותאמים אישית . אלו הם אירועים המסופקים על ידי ספקי אירועים מיוחדים או נוספים, בניגוד לאירועי Firebase הנתמכים באופן מקורי על ידי Firebase SDK for Cloud Functions. באמצעות מפעילי אירועים מותאמים אישית, האפליקציה שלך יכולה להגיב לאירועים שסופקו על ידי תוספי Firebase, או שאתה יכול לפרסם אירועים מותאמים אישית משלך ופונקציות הפעלה בתגובה להם.

כל האירועים המותאמים אישית תואמים את פורמט האירועים JSON של CloudEvents ומתפרסמים ב- Eventarc . חלים דמי שימוש ב-Eventarc.

הפעל פונקציות עם אירועים מותאמים אישית

אתה יכול לפרסם אירועים מותאמים אישית (או להשיג אירועים מתוספי Firebase) ולהפעיל פונקציות בתגובה לאותם אירועים על ידי יישום הזרימה הבסיסית הזו:

  1. פרסם את האירועים הרצויים בערוץ Eventarc, או זהה אירועים זמינים שסופקו על ידי הרחבה שהתקנת.
  2. בקוד הפונקציה שלך, הירשם לאירועים בערוץ Eventarc עם מטפל באירועים.
  3. בפונקציה, נתח את המטען שהוחזר באובייקט CloudEvent ובצע את כל ההיגיון המותאם אישית שהאפליקציה שלך דורשת.

לדוגמה, אפליקציית משחק עשויה לרצות לשלוח התראות למשתמשים כשהם נכנסים או יוצאים מלוח ה-leaderboard של עשרת המתחרים המובילים. אפליקציה זו יכולה לפרסם אירועי Leaderboard לערוץ ברירת המחדל, ולאחר מכן לטפל באירוע בפונקציה ששולחת הודעות דחיפה ממוקדות למשתמשים.

בדוגמה אחרת, הרחבה שנועדה לעזור לאפליקציות לעבד תמונות גדולות עשויה לשדר אירוע עם השלמת שינוי גודל התמונה. אפליקציות שמותקנת בהן תוסף זה יוכלו להתמודד עם אירוע ההשלמה על ידי עדכון קישורים באפליקציה כדי להצביע על גרסאות ששנו את גודל התמונה.

פרסם אירוע בערוץ

אירועי 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

עבור כל הרחבה מסוימת, המטען המוחזר באובייקט האירוע מספק נתונים שבהם תוכל להשתמש כדי לבצע לוגיקה מותאמת אישית עבור זרימת היישום שלך. במקרה זה, הפונקציה משתמשת ב-SDK של Admin כדי להעתיק מטא-נתונים על התמונה שגודלה שונה לאוסף ב-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)
    # ...