Benutzerdefinierte Ereignistrigger erstellen und verarbeiten

Mit Cloud Functions (2. Generation) können Sie Funktionen als Reaktion auf benutzerdefinierte Ereignisse auslösen. Diese Ereignisse werden von speziellen oder zusätzlichen Ereignisanbietern im Gegensatz zu den Firebase-Ereignissen bereitgestellt, die vom Firebase SDK für Cloud Functions nativ unterstützt werden. Über Trigger für benutzerdefinierte Ereignisse kann Ihre App auf Ereignisse reagieren, die von Firebase Extensions bereitgestellt werden. Sie können auch eigene benutzerdefinierte Ereignisse veröffentlichen und Funktionen als Reaktion darauf auslösen.

Alle benutzerdefinierten Ereignisse entsprechen dem CloudEvents-JSON-Ereignisformat und werden in Eventarc veröffentlicht. Für Eventarc fallen Nutzungsgebühren an.

Funktionen mit benutzerdefinierten Ereignissen auslösen

Sie können benutzerdefinierte Ereignisse veröffentlichen (oder Ereignisse aus Firebase-Erweiterungen abrufen) und Funktionen als Reaktion auf diese Ereignisse auslösen, indem Sie diesen grundlegenden Ablauf implementieren:

  1. Veröffentlichen Sie die gewünschten Ereignisse in einem Eventarc-Kanal oder ermitteln Sie verfügbare Ereignisse, die von einer installierten Erweiterung bereitgestellt werden.
  2. Abonnieren Sie in Ihrem Funktionscode Ereignisse im Eventarc-Kanal mit einem Ereignishandler.
  3. Parsen Sie in der Funktion die im CloudEvent-Objekt zurückgegebene Nutzlast und führen Sie die benutzerdefinierte Logik aus, die für Ihre App erforderlich ist.

Eine Spiele-App könnte beispielsweise Benachrichtigungen an Nutzer senden, wenn sie die Top 10 der Bestenliste erreichen oder verlassen. Diese App könnte Bestenlisteneinträge im Standardchannel veröffentlichen und das Ereignis dann in einer Funktion verarbeiten, die gezielte Push-Benachrichtigungen an Nutzer sendet.

In einem anderen Beispiel gibt eine Erweiterung, die Apps bei der Verarbeitung großer Bilder unterstützt, möglicherweise ein Ereignis aus, wenn die Größenanpassung des Bildes abgeschlossen ist. Apps, in denen diese Erweiterung installiert ist, können das Abschlussereignis verarbeiten, indem sie Links in der App aktualisieren, damit sie auf die angepassten Versionen des Bildes verweisen.

Termin in einem Kanal veröffentlichen

Eventarc-Ereignisse werden in Kanälen veröffentlicht. Mit Channels können Sie ähnliche Ereignisse gruppieren und Zugriffsberechtigungen verwalten. Wenn Sie eine Erweiterung installieren oder eine Funktion bereitstellen, die benutzerdefinierte Ereignisse verwendet, erstellt Firebase automatisch einen Standardchannel mit dem Namen firebase in der Region us-central1. Das Firebase Admin SDK bietet ein eventarc-Unterpaket für die Veröffentlichung in Channels.

So veröffentlichen Sie ein Ereignis von einem vertrauenswürdigen Server (oder einer anderen Funktion) über den Standardkanal:

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 . . .'
    }
});

Zusätzlich zum automatischen Erstellen des Standardchannels legt Firebase die Umgebungsvariable EVENTARC_CLOUD_EVENT_SOURCE fest, die die Quelle des Ereignisses angibt. Wenn Sie Ereignisse außerhalb von Cloud Functions for Firebase veröffentlichen, müssen Sie das Feld source explizit in die Nutzlast Ihres Ereignisses einfügen.

Benutzerdefinierte Ereignisse verarbeiten

Sie können alle benutzerdefinierten Ereignisse, einschließlich Erweiterungsereignisse, mit den Handlern onCustomEventPublished oder on_custom_event_published verarbeiten. Importieren Sie zuerst diesen Handler aus dem Eventarc SDK zusammen mit 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");

Python

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

Übergeben Sie in Ihrem Funktionscode den Ereignisnamen, wie im Beispiel für die Funktion gezeigt:

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
    });

Python

@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

Für jede Erweiterung enthält die im Ereignisobjekt zurückgegebene Nutzlast Daten, mit denen Sie benutzerdefinierte Logik für Ihren Anwendungsablauf ausführen können. In diesem Fall kopiert die Funktion mit Admin SDK Metadaten zum skalierten Bild in eine Sammlung in Cloud Firestore. Der Dateiname wird aus dem von der Ereignisquelle bereitgestellten subject abgerufen und Metadaten aus dem von der Ereignisquelle bereitgestellten data werden gespeichert.

Ereignisse auf nicht standardmäßigen Kanälen veröffentlichen und verarbeiten

Benutzerdefinierte Channels können nützlich sein, wenn Sie spezielle Berechtigungen oder andere Anforderungen haben und nicht für alle Ereignisse dieselbe Sichtbarkeit und denselben Zugriff benötigen. Sie können Ihre eigenen Channels über die Google Cloud Console erstellen. Das Veröffentlichen und Abonnieren von Ereignissen muss über denselben Kanal erfolgen.

Wenn ein benutzerdefiniertes Ereignis auf einem nicht standardmäßigen Channel veröffentlicht wird, müssen Sie den Channel in Ihrem Funktionscode angeben. Wenn Sie beispielsweise Ereignisse verarbeiten möchten, die in einem nicht standardmäßigen Channel für den Standort us-west1 veröffentlicht werden, müssen Sie den Channel wie folgt angeben:

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) => { ... });

Python

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