Tworzenie i obsługa reguł zdarzeń niestandardowych

Dzięki Cloud Functions (2 generacji) możesz aktywować funkcje w odpowiedzi na niestandardowe wydarzenia. Są to wydarzenia organizowane przez organizatorów wydarzeń specjalnych lub dodatkowych, a nie zdarzeń Firebase natywnie obsługiwanych przez pakiet SDK Firebase dla Cloud Functions. Za pomocą reguł zdarzeń niestandardowych aplikacja może reagować na zdarzenia dostarczane przez Rozszerzenia w Firebase, ale możesz też opublikować własne zdarzeń i uruchamiać na nie funkcje.

Wszystkie zdarzenia niestandardowe są zgodne z Format zdarzenia JSON CloudEvents i są publikowane w Eventarc. Eventarc, Obowiązują opłaty za korzystanie.

Aktywowanie funkcji za pomocą zdarzeń niestandardowych

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

  1. Opublikuj odpowiednie zdarzenia w kanale Eventarc lub wskaż 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 funkcji przeanalizuj ładunek zwrócony w CloudEvent i wykonuje dowolne niestandardowe funkcje logiczne wymagane przez aplikację.

Na przykład gra może wysyłać powiadomienia użytkownikom, którzy wchodzą do gry lub opuścić tabelę wyników 10 najlepszych konkurentów. Ta aplikacja może być publikowana zdarzeń z tablicy wyników na domyślny kanał, a potem obsługując zdarzenie w wysyłająca kierowane powiadomienia push do użytkowników.

W innym Na przykład rozszerzenie ułatwiające aplikacjom przetwarzanie dużych obrazów może generować po zmianie rozmiaru obrazu. Zainstalowano aplikacje z tym rozszerzeniem może obsłużyć zdarzenie ukończenia, aktualizując linki w aplikacji tak, by wskazywały powiększone wersje obrazu.

Publikowanie wydarzenia na kanale

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

Aby opublikować zdarzenie z zaufanego serwera (lub innej funkcji) za pomocą kanał domyślny:

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 zmienna środowiskowa EVENTARC_CLOUD_EVENT_SOURCE, która określa źródło zdarzenia. Jeśli publikujesz zdarzenia poza Cloud Functions dla Firebase, musisz dodać do ładunku zdarzenia pole source.

Obsługa zdarzeń niestandardowych

Za pomocą parametru onCustomEventPublished lub on_custom_event_published modułów obsługi. Najpierw zaimportuj ten moduł obsługi z pakietu SDK Eventarc wraz z Pakiet SDK Firebase Admin:

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 rozszerzenia ładunek zwrócony w obiekcie zdarzenia zapewnia których możesz używać do realizacji logiki w swoim przepływie aplikacji. W tym funkcja korzysta z pakietu Admin SDK, aby skopiować metadane o zmienionych rozmiarach do kolekcji w Cloud Firestore, uzyskując nazwę pliku z Pole subject dostarczone przez zdarzenie i zapisywanie metadanych z podanego przez data źródła przez wydarzenie.

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

Kanały niestandardowe mogą być przydatne w przypadkach, gdy musisz uzyskać specjalne uprawnienia lub innych wymagań, a nie chcą mieć tego samego poziomu widoczności i dostępu dla wszystkich zdarzeń. Możesz tworzyć własne kanały za pomocą Konsola Google Cloud. Publikowanie i subskrybowanie wydarzeń musi odbywać się na tym samym kanale.

Jeśli zdarzenie niestandardowe zostało opublikowane na kanale innym niż domyślny, musisz podać kanał w kodzie funkcji. Jeśli na przykład chcą obsługiwać zdarzenia, które są publikowane w kanale innym niż domyślny w przypadku us-west1, musisz określić kanał w następujący 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)
    # ...