Tworzenie i obsługa reguł zdarzeń niestandardowych

Dzięki Cloud Functions (2 generacji) możesz uruchamiać funkcje w odpowiedzi na niestandardowe zdarzenia. Są to wydarzenia organizowane przez organizatorów wydarzeń specjalnych lub dodatkowych, w porównaniu ze zdarzeniami Firebase natywnie obsługiwanymi przez pakiet Firebase SDK 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 zdarzenia w odpowiedzi na te zdarzenia.

Wszystkie zdarzenia niestandardowe są zgodne z formatem zdarzenia JSON CloudEvents i publikowane w Eventarc. Eventarc Obowiązują 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 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 ramach tej funkcji przeanalizuj ładunek zwrócony w obiekcie CloudEvent i wykonaj dowolną logikę niestandardową wymaganą przez Twoją 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 która wysyła użytkownikom kierowane powiadomienia push.

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

W przypadku każdego rozszerzenia ładunek zwrócony w obiekcie zdarzenia zawiera dane, których możesz używać do wykonywania niestandardowej logiki w ramach przepływu danych w 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 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ą konsoli Google Cloud. Publikowanie i subskrybowanie wydarzeń 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 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)
    # ...