Tworzenie reguł zdarzeń niestandardowych i ich obsługa

Dzięki Cloud Functions (2 generacji) możesz aktywować funkcje w odpowiedzi na zdarzenia niestandardowe. Są to zdarzenia dostarczane przez dostawców specjalnych lub dodatkowych w odróżnieniu od zdarzeń Firebase natywnie obsługiwanych przez pakiet SDK Firebase dla Cloud Functions. Dzięki regułom zdarzeń niestandardowych aplikacja może reagować na zdarzenia udostępniane przez rozszerzenia Firebase. Możesz też publikować własne zdarzenia niestandardowe i wyzwalać na nie funkcje.

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

Aktywowanie funkcji za pomocą zdarzeń niestandardowych

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

  1. Opublikuj odpowiednie zdarzenia w kanale Eventarc lub określ dostępne zdarzenia dostarczane przez zainstalowane rozszerzenie.
  2. W kodzie funkcji zasubskrybuj zdarzenia z kanału Eventarc za pomocą modułu obsługi zdarzeń.
  3. W tej funkcji przeanalizuj ładunek zwrócony w obiekcie CloudEvent i wykonaj dowolną niestandardową logikę, której wymaga Twoja aplikacja.

Na przykład gra może wysyłać powiadomienia do użytkowników, którzy dołączają do tabeli wyników lub opuszczają tabelę 10 najlepszych konkurentów. Ta aplikacja może publikować zdarzenia tablicy wyników w kanale domyślnym, a następnie obsługiwać je za pomocą funkcji wysyłającej użytkownikom kierowane powiadomienia push.

W innym przykładzie rozszerzenie ułatwiające aplikacjom przetwarzanie dużych obrazów może wywołać zdarzenie po zakończeniu zmiany rozmiaru obrazu. Aplikacje, które mają zainstalowane to rozszerzenie, mogą obsłużyć zdarzenie ukończenia, aktualizując linki w aplikacji tak, aby wskazywały zmienione wersje obrazu.

Publikowanie wydarzenia na kanale

Zdarzenia Eventarc są publikowane w kanałach. Kanały umożliwiają grupowanie powiązanych zdarzeń i zarządzanie uprawnieniami dostępu. Gdy zainstalujesz rozszerzenie lub wdrożysz funkcję, która przetwarza zdarzenia niestandardowe, Firebase automatycznie tworzy w regionie us-central1 kanał domyślny o nazwie firebase. Pakiet SDK Firebase Admin udostępnia podpakiet eventarc do publikowania w kanałach.

Aby opublikować zdarzenie z zaufanego serwera (lub innej funkcji), używając 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ć do ładunku zdarzenia pole source.

Obsługa zdarzeń niestandardowych

Możesz obsługiwać wszystkie zdarzenia niestandardowe, w tym zdarzenia rozszerzeń, za pomocą modułów obsługi onCustomEventPublished lub on_custom_event_published. Najpierw zaimportuj ten moduł obsługi z pakietu SDK Eventarc wraz z 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 przekaż nazwę zdarzenia, tak jak w przypadku 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
    });

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

Dla każdego konkretnego rozszerzenia ładunek zwrócony w obiekcie zdarzenia dostarcza danych, których możesz użyć do wykonania niestandardowej logiki w przepływie aplikacji. W takim przypadku funkcja używa pakietu Admin SDK, aby skopiować metadane o zmienionym rozmiarze obrazu do kolekcji w Cloud Firestore, uzyskać nazwę pliku z identyfikatora subject podanego przez zdarzenie i zapisać metadane z elementu data dostarczonego przez zdarzenie.

Publikowanie i obsługa zdarzeń w kanałach innych niż domyślne

Kanały niestandardowe mogą być przydatne, jeśli masz specjalne uprawnienia lub inne wymagania i nie chcesz, aby wszystkie zdarzenia były na tym samym poziomie widoczności i dostępu. Własne kanały możesz tworzyć w konsoli Google Cloud. Publikowanie i subskrybowanie wydarzeń musi odbywać się na tym samym kanale.

Jeśli zdarzenie niestandardowe jest publikowane w kanale innym niż domyślny, musisz podać ten kanał w kodzie funkcji. Jeśli na przykład chcesz obsługiwać zdarzenia, które są 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)
    # ...