Twórz i obsługuj niestandardowe wyzwalacze zdarzeń

Dzięki Cloud Functions (2. generacji) możesz uruchamiać funkcje w odpowiedzi na niestandardowe zdarzenia . Są to zdarzenia dostarczane przez specjalnych lub dodatkowych dostawców wydarzeń, w przeciwieństwie do zdarzeń Firebase natywnie obsługiwanych przez pakiet Firebase SDK dla Cloud Functions. Dzięki niestandardowym wyzwalaczom zdarzeń Twoja aplikacja może reagować na zdarzenia dostarczane przez rozszerzenia Firebase lub możesz publikować własne zdarzenia niestandardowe i uruchamiać funkcje w odpowiedzi na nie.

Wszystkie zdarzenia niestandardowe są zgodne z formatem zdarzeń CloudEvents JSON i są publikowane w Eventarc . Obowiązują opłaty za użytkowanie Eventarc.

Wyzwalaj funkcje za pomocą niestandardowych zdarzeń

Możesz publikować zdarzenia niestandardowe (lub uzyskiwać zdarzenia z rozszerzeń Firebase) i uruchamiać funkcje w odpowiedzi na te zdarzenia, wdrażając ten podstawowy przepływ:

  1. Opublikuj żądane zdarzenia na kanale Eventarc lub zidentyfikuj dostępne zdarzenia dostarczane przez zainstalowane rozszerzenie.
  2. W kodzie funkcji subskrybuj zdarzenia na kanale Eventarc za pomocą modułu obsługi zdarzeń.
  3. W tej funkcji przeanalizuj ładunek zwrócony w obiekcie CloudEvent i wykonaj dowolną niestandardową logikę wymaganą przez aplikację.

Na przykład aplikacja do gier może chcieć wysyłać powiadomienia do użytkowników, gdy wchodzą lub opuszczają ranking dziesięciu najlepszych konkurentów. Ta aplikacja może publikować zdarzenia w rankingach na kanale domyślnym, a następnie obsługiwać je za pomocą funkcji wysyłającej do użytkowników ukierunkowane powiadomienia push.

W innym przykładzie rozszerzenie zaprojektowane, aby pomóc aplikacjom przetwarzać duże obrazy, może wyemitować zdarzenie po zakończeniu zmiany rozmiaru obrazu. Aplikacje z zainstalowanym tym rozszerzeniem mogą obsłużyć zdarzenie zakończenia, aktualizując łącza w aplikacji tak, aby wskazywały wersje obrazu o zmienionym rozmiarze.

Opublikuj wydarzenie na kanale

Wydarzenia Eventarc są publikowane na kanałach . Kanały umożliwiają grupowanie powiązanych wydarzeń i zarządzanie uprawnieniami dostępu. Gdy instalujesz rozszerzenie lub wdrażasz funkcję korzystającą ze zdarzeń niestandardowych, Firebase automatycznie tworzy domyślny kanał o nazwie firebase w regionie us-central1 . Pakiet Firebase Admin SDK zapewnia podpakiet eventarc do publikowania na kanałach.

Aby opublikować wydarzenie z zaufanego serwera (lub innej funkcji) przy użyciu kanału domyślnego:

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

Oprócz automatycznego tworzenia kanału domyślnego Firebase ustawia zmienną środowiskową EVENTARC_CLOUD_EVENT_SOURCE , która określa źródło zdarzenia. Jeśli publikujesz zdarzenia poza Cloud Functions dla Firebase, musisz jawnie dodać pole source w ładunku zdarzenia.

Obsługuj zdarzenia niestandardowe

Możesz obsłużyć wszystkie zdarzenia niestandardowe, w tym zdarzenia rozszerzeń, za pomocą procedur obsługi onCustomEventPublished lub on_custom_event_published . Najpierw zaimportuj tę procedurę obsługi z pakietu Eventarc SDK wraz z pakietem SDK administratora Firebase:

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

Pyton

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

W kodzie funkcji przekaż nazwę zdarzenia, jak pokazano w przykładowej funkcji:

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

Pyton

@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

Dla każdego konkretnego rozszerzenia ładunek zwrócony w obiekcie zdarzenia udostępnia dane, których można użyć do wykonania niestandardowej logiki dla przepływu aplikacji. W tym przypadku funkcja używa pakietu Admin SDK do kopiowania metadanych dotyczących obrazu o zmienionym rozmiarze do kolekcji w Cloud Firestore, uzyskiwania nazwy pliku od subject podanego przez wydarzenie i zapisywania metadanych z data dostarczonych przez wydarzenie.

Publikuj i obsługuj wydarzenia na kanałach innych niż domyślne

Kanały niestandardowe mogą być przydatne w przypadkach, gdy masz specjalne potrzeby dotyczące uprawnień lub inne wymagania i nie chcesz tego samego poziomu widoczności i dostępu do wszystkich wydarzeń. Możesz tworzyć własne kanały za pomocą konsoli Google Cloud . Publikowanie i subskrybowanie wydarzeń musi odbywać się na tym samym kanale.

W przypadkach, gdy wydarzenie niestandardowe jest publikowane na kanale innym niż domyślny, musisz określić kanał w kodzie funkcji. Na przykład, jeśli chcesz obsługiwać zdarzenia publikowane w kanale innym niż domyślny dla lokalizacji us-west1 , musisz określić kanał w sposób pokazany na rysunku:

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

Pyton

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