W Cloud Functions (2 generacji) możesz aktywować funkcje w odpowiedzi na zdarzenia niestandardowe. Są to zdarzenia dostarczane przez specjalnych lub dodatkowych dostawców zdarzeń, w przeciwieństwie do zdarzeń Firebase, które są natywnie obsługiwane przez pakiet SDK Firebase dla Cloud Functions. Dzięki regułom zdarzeń niestandardowych Twoja aplikacja może reagować na zdarzenia dostarczane przez Firebase Extensions. Możesz też publikować własne zdarzenia niestandardowe i wywoływać funkcje w odpowiedzi na nie.
Wszystkie zdarzenia niestandardowe są zgodne z formatem zdarzeń CloudEvents JSON 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ń w Firebase) i aktywować funkcje w odpowiedzi na te zdarzenia, wdrażając ten podstawowy proces:
- Opublikuj wybrane zdarzenia w kanale Eventarc lub zidentyfikuj 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 gra mobilna może wysyłać powiadomienia do użytkowników, gdy wejdą na listę 10 najlepszych graczy w tabeli wyników lub z niej wypadną. Ta aplikacja może publikować zdarzenia z tabeli wyników w kanale domyślnym, a następnie obsługiwać je w funkcji, która wysyła ukierunkowane powiadomienia push do użytkowników.
W innym przykładzie rozszerzenie, które pomaga aplikacjom przetwarzać duże obrazy, może wygenerować 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 wersje obrazu o zmienionym rozmiarze.
Publikowanie zdarzenia w 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 wykorzystuje zdarzenia niestandardowe, Firebase automatycznie utworzy domyślny kanał o nazwie firebase w regionie us-central1. Firebase Admin SDK zawiera podpakiet eventarc do publikowania na kanałach.
Aby opublikować zdarzenie z zaufanego serwera (lub innej funkcji) przy użyciu 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 for Firebase, musisz wyraźnie 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/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ł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 zwracany w obiekcie zdarzenia zawiera dane, których możesz użyć do wykonania niestandardowej logiki w przepływie aplikacji. W tym przypadku funkcja używa Admin SDK do skopiowania metadanych dotyczących obrazu o zmienionym rozmiarze do kolekcji w Cloud Firestore, pobierając nazwę pliku z subject dostarczonego przez zdarzenie i zapisując metadane z data dostarczonego przez zdarzenie.
Publikowanie i obsługa zdarzeń w kanałach innych niż domyślne
Kanały niestandardowe mogą być przydatne, gdy masz specjalne wymagania dotyczące uprawnień lub inne wymagania i nie chcesz, aby wszystkie zdarzenia 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 w 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 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)
# ...