Erstellen und verarbeiten Sie benutzerdefinierte Ereignisauslöser

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

Alle benutzerdefinierten Ereignisse entsprechen dem JSON-Ereignisformat von CloudEvents und werden auf Eventarc veröffentlicht. Es fallen Eventarc- Nutzungsgebühren an.

Triggerfunktionen mit benutzerdefinierten Ereignissen

Sie können benutzerdefinierte Ereignisse veröffentlichen (oder Ereignisse von 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 auf einem Eventarc-Kanal oder identifizieren Sie verfügbare Ereignisse, die von einer von Ihnen installierten Erweiterung bereitgestellt werden.
  2. Abonnieren Sie in Ihrem Funktionscode Ereignisse auf dem Eventarc-Kanal mit einem Ereignishandler.
  3. Analysieren Sie in der Funktion die im CloudEvent-Objekt zurückgegebene Nutzlast und führen Sie die benutzerdefinierte Logik aus, die Ihre App benötigt.

Beispielsweise möchte eine Spiele-App möglicherweise Benachrichtigungen an Benutzer senden, wenn sie die Bestenliste der zehn besten Konkurrenten betreten oder verlassen. Diese App könnte Bestenlistenereignisse im Standardkanal veröffentlichen und das Ereignis dann in einer Funktion verarbeiten, die gezielte Push-Benachrichtigungen an Benutzer sendet.

In einem anderen Beispiel könnte eine Erweiterung, die Apps bei der Verarbeitung großer Bilder unterstützen soll, nach Abschluss der Bildgrößenänderung ein Ereignis ausgeben. Apps mit dieser installierten Erweiterung könnten das Abschlussereignis verarbeiten, indem sie Links in der App aktualisieren, sodass sie auf Versionen des Bildes mit geänderter Größe verweisen.

Veröffentlichen Sie ein Ereignis in einem Kanal

Eventarc-Ereignisse werden in Kanälen veröffentlicht. Kanäle sind eine Möglichkeit, verwandte Ereignisse zu gruppieren und Zugriffsberechtigungen zu verwalten. Wenn Sie eine Erweiterung installieren oder eine Funktion bereitstellen, die benutzerdefinierte Ereignisse nutzt, erstellt Firebase automatisch einen Standardkanal namens firebase in der Region us-central1 . Das Firebase Admin SDK stellt ein eventarc Unterpaket für die Veröffentlichung auf Kanälen bereit.

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 zur automatischen Erstellung des Standardkanals 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 source explizit zu Ihrer Ereignisnutzlast hinzufügen.

Behandeln Sie benutzerdefinierte Ereignisse

Sie können alle benutzerdefinierten Ereignisse, einschließlich Erweiterungsereignisse, mit den Handlern onCustomEventPublished oder on_custom_event_published verarbeiten. Importieren Sie zunächst diesen Handler aus dem Eventarc SDK zusammen mit dem 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 für die Beispielfunktion 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 einzelne Erweiterung stellt die im Ereignisobjekt zurückgegebene Nutzlast Daten bereit, die Sie zum Ausführen benutzerdefinierter Logik für Ihren Anwendungsablauf verwenden können. In diesem Fall verwendet die Funktion das Admin SDK, um Metadaten über das in der Größe geänderte Bild in eine Sammlung in Cloud Firestore zu kopieren, wobei der Dateiname aus dem vom Ereignis bereitgestellten subject abgerufen wird und Metadaten aus den vom Ereignis bereitgestellten data gespeichert werden.

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

Benutzerdefinierte Kanäle können in Fällen nützlich sein, in denen Sie besondere Berechtigungsanforderungen oder andere Anforderungen haben und nicht für alle Ereignisse das gleiche Maß an Sichtbarkeit und Zugriff wünschen. Mit der Google Cloud Console können Sie Ihre eigenen Kanäle erstellen. Das Veröffentlichen und Abonnieren von Veranstaltungen muss auf demselben Kanal erfolgen.

In Fällen, in denen ein benutzerdefiniertes Ereignis auf einem nicht standardmäßigen Kanal veröffentlicht wird, müssen Sie den Kanal in Ihrem Funktionscode angeben. Wenn Sie beispielsweise Ereignisse verarbeiten möchten, die in einem nicht standardmäßigen Kanal für den Standort us-west1 veröffentlicht werden, müssen Sie den Kanal wie gezeigt 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)
    # ...