Tworzenie i obsługa reguł zdarzeń niestandardowych

Dzięki Cloud Functions (2 generacji) możesz uruchamiać funkcje w odpowiedzi na niestandardowe zdarzenia. Są to zdarzenia udostępniane przez specjalnych lub dodatkowych dostawców zdarzeń, w przeciwieństwie do zdarzeń Firebase obsługiwanych natywnie przez pakiet SDK Firebase dla Cloud Functions. Za pomocą reguł zdarzeń niestandardowych aplikacja może reagować na zdarzenia udostępniane przez Firebase Extensions. Możesz też publikować własne zdarzenia niestandardowe i funkcję reguły w odpowiedzi na te zdarzenia.

Wszystkie zdarzenia niestandardowe są zgodne z formatem zdarzenia JSON CloudEvents i są publikowane w Eventarc. Eventarc opłaty za korzystanie.

Uruchamianie funkcji za pomocą zdarzeń niestandardowych

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

  1. Opublikuj odpowiednie zdarzenia w kanale Eventarc lub określ dostępne zdarzenia udostępniane przez zainstalowane rozszerzenie.
  2. W kodzie funkcji zasubskrybuj zdarzenia na kanale Eventarc za pomocą modułu obsługi zdarzeń.
  3. W ramach tej funkcji przeanalizuj ładunek zwrócony w obiekcie CloudEvent i wykonaj dowolną logikę niestandardową wymaganą przez Twoją aplikację.

Na przykład aplikacja z grą może wysyłać powiadomienia do użytkowników, gdy wchodzą na listę liderów lub ją opuszczają. Ta aplikacja może publikować zdarzenia z tablicy liderów w kanale domyślnym, a potem obsługiwać je w funkcji, która wysyła do użytkowników ukierunkowane powiadomienia push.

Innym przykładem jest rozszerzenie, które pomaga aplikacjom przetwarzać duże obrazy. Może ono emitować zdarzenie po zakończeniu zmiany rozmiaru obrazu. Aplikacje z zainstalowanym tym rozszerzeniem mogły obsługiwać zdarzenie ukończenia, aktualizując linki w aplikacji, aby wskazywały one wersje obrazu o zmienionym rozmiarze.

Publikowanie zdarzenia na kanale

Zdarzenia Eventarc są publikowane w kanałach. Kanały to sposób grupowania powiązanych zdarzeń i zarządzania uprawnieniami dostępu. Gdy instalujesz rozszerzenie lub wdrażasz funkcję, która korzysta z zdarzeń niestandardowych, Firebase automatycznie tworzy kanał domyślny o nazwie firebase w regionie us-central1. Firebase Admin SDK zawiera podpakiet eventarc przeznaczony do publikowania na kanałach.

Aby opublikować zdarzenie z zaufanego serwera (lub innej funkcji) za pomocą 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 utworzenia 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 for Firebase, musisz wyraźnie dodać pole source w załadowaniu zdarzenia.

Obsługa zdarzeń niestandardowych

Wszystkie zdarzenia niestandardowe, w tym zdarzenia rozszerzeń, możesz obsługiwać za pomocą metod obsługi onCustomEventPublished lub on_custom_event_published. Najpierw zaimportuj z pakietu SDK Eventarc ten moduł obsługi wraz z tymi elementami: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

W kodzie funkcji podaj nazwę zdarzenia, jak w przykładzie:

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

W przypadku każdego konkretnego rozszerzenia ładunek zwrócony w obiekcie zdarzenia zawiera dane, których możesz używać do wykonywania niestandardowej logiki w ramach przepływu aplikacji. W tym przypadku funkcja używa funkcji Admin SDK do kopiowania metadanych obrazu o zmienionym rozmiarze do kolekcji w Cloud Firestore, pobierając nazwę pliku z subject podanego przez zdarzenie i zapisując metadane z data podanego przez zdarzenie.

publikować i obsługiwać zdarzenia na kanałach innych niż domyślne.

Kanały niestandardowe mogą być przydatne w przypadkach, gdy potrzebujesz specjalnych uprawnień lub innych wymagań i nie chcesz mieć takiego samego poziomu widoczności ani dostępu do wszystkich zdarzeń. Możesz tworzyć własne kanały za pomocą konsoli Google Cloud. Publikowanie i subskrybowanie zdarzeń musi odbywać się na tym samym kanale.

Jeśli zdarzenie niestandardowe jest publikowane na kanale innym niż domyślny, musisz określić kanał w kodzie funkcji. Jeśli np. chcesz obsługiwać zdarzenia publikowane w kanale innym niż domyślny dla lokalizacji us-west1, musisz określić kanał w ten sposób:

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