W przypadku funkcji Cloud Functions (2 generacji) możesz wywoływać funkcje w odpowiedzi na niestandardowe zdarzenia. Są to zdarzenia dostarczane przez specjalnych lub dodatkowych dostawców zdarzeń, w przeciwieństwie do zdarzeń Firebase natywnie obsługiwanych przez Firebase pakiet SDK Cloud Functions. Za pomocą reguł opartych na zdarzeniach niestandardowych aplikacja może reagować na zdarzenia dostarczane przez Firebase Extensions. Możesz też publikować własne zdarzenia niestandardowe i uruchamiać w odpowiedzi na nie funkcje.
Wszystkie zdarzenia niestandardowe są zgodne z formatem zdarzeń JSON CloudEvents i publikowane w Eventarc. Eventarc Opłaty za korzystanie.
Aktywowanie funkcji za pomocą zdarzeń niestandardowych
Możesz publikować zdarzenia niestandardowe (lub uzyskiwać zdarzenia z rozszerzeń Firebase) i wywoływać funkcje w odpowiedzi na te zdarzenia, wdrażając ten podstawowy proces:
- Opublikuj wybrane zdarzenia w kanale Eventarc lub określ dostępne zdarzenia dostarczane przez zainstalowane rozszerzenie.
- W kodzie funkcji zasubskrybuj zdarzenia w kanale Eventarc za pomocą modułu obsługi zdarzeń.
- W funkcji przeanalizuj ładunek zwrócony w obiekcie CloudEvent i wykonaj dowolną logikę niestandardową wymaganą przez aplikację.
Na przykład aplikacja do gier może chcieć wysyłać powiadomienia do użytkowników, gdy wchodzą oni do pierwszej dziesiątki najlepszych graczy lub z niej wychodzą. Aplikacja może publikować zdarzenia związane z tablicą wyników na kanale domyślnym, a następnie obsługiwać zdarzenie w funkcji, która wysyła do użytkowników ukierunkowane powiadomienia push.
Innym przykładem może być rozszerzenie zaprojektowane, aby pomagać aplikacjom w przetwarzaniu dużych obrazów. Może ono emitować zdarzenie po zakończeniu zmiany rozmiaru obrazu. Aplikacje z zainstalowanym tym rozszerzeniem mogą obsługiwać zdarzenie zakończenia, aktualizując linki w aplikacji, aby wskazywały zmienione rozmiary 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 korzysta ze zdarzeń niestandardowych, Firebase automatycznie utworzy domyślny kanał o nazwie firebase
w regionie us-central1
. Firebase Admin SDK udostępnia eventarc
pakiet podrzędny 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 tworzenia domyślnego kanału Firebase ustawia zmienną środowiskową EVENTARC_CLOUD_EVENT_SOURCE
, która określa źródło zdarzenia. Jeśli publikujesz wydarzenia poza Cloud Functions for Firebase, musisz jawnie dodać pole source
w ładunku zdarzenia.
Obsługa zdarzeń niestandardowych
Wszystkie zdarzenia niestandardowe, w tym zdarzenia rozszerzeń, możesz obsługiwać za pomocą modułów obsługi onCustomEventPublished
lub on_custom_event_published
. Najpierw zaimportuj ten moduł obsługi z pakietu Eventarc SDK 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, jak pokazano w przykładzie 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 zwracany w obiekcie zdarzenia zawiera dane, których możesz używać do wykonywania niestandardowej logiki w przepływie aplikacji. W tym przypadku funkcja używa Admin SDK do skopiowania metadanych dotyczących zmienionego rozmiaru obrazu do kolekcji w Cloud Firestore, pobierając nazwę pliku z subject
dostarczonego przez zdarzenie i zapisując metadane z data
dostarczonego przez zdarzenie.
Publikowanie zdarzeń w kanałach innych niż domyślne i obsługiwanie ich
Kanały niestandardowe mogą być przydatne w przypadkach, gdy masz specjalne potrzeby dotyczące uprawnień lub inne wymagania i nie chcesz, aby wszystkie wydarzenia miały ten sam poziom widoczności i dostępu. 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 na przykład chcesz obsługiwać zdarzenia publikowane w kanale innym niż domyślny dla lokalizacji us-west1
, musisz określić kanał w sposób pokazany poniżej:
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)
# ...