Dzięki funkcji Cloud Functions (2 generacji) możesz uruchamiać funkcje w odpowiedzi na niestandardowe zdarzenia. Są to zdarzenia udostępniane przez specjalnych lub dodatkowych dostawców zdarzeń, w przeciwieństwie do zdarzeń Firebase obsługiwanych natywnie przez pakiet SDK Firebase dla Cloud Functions. Za pomocą reguł zdarzeń niestandardowych Twoja aplikacja może odpowiadać na zdarzenia dostarczane przez Firebase Extensions. Możesz też publikować własne zdarzenia niestandardowe i uruchamiać na nie funkcje.
Wszystkie zdarzenia niestandardowe są zgodne z formatem zdarzenia JSON CloudEvents i publikowane w Eventarc. Eventarc 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:
- Opublikuj odpowiednie zdarzenia w kanale Eventarc lub określ dostępne zdarzenia dostarczane przez zainstalowane rozszerzenie.
- W kodzie funkcji zasubskrybuj zdarzenia z kanału Eventarc za pomocą modułu obsługi zdarzeń.
- W ramach tej funkcji przeanalizuj ładunek zwrócony w obiekcie CloudEvent i wykonaj dowolną logikę niestandardową wymaganą przez Twoją aplikację.
Na przykład aplikacja z grą może wysyłać powiadomienia do użytkowników, gdy wchodzą na listę liderów lub ją opuszczają. 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.
Innym przykładem jest rozszerzenie, które pomaga aplikacjom przetwarzać duże obrazy. Może ono emitować zdarzenie po zakończeniu zmiany rozmiaru obrazu. Aplikacje z zainstalowanym tym rozszerzeniem mogły obsługiwać zdarzenie ukończenia, aktualizując linki w aplikacji, aby wskazywały one wersje obrazu o zmienionym rozmiarze.
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 instalujesz rozszerzenie lub wdrażasz funkcję, która korzysta z 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 obszarem Cloud Functions for Firebase, musisz jawnie dodać do ładunku zdarzenia pole source
.
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 z pakietu SDK Eventarc ten moduł obsługi wraz z tymi elementami: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 podaj nazwę zdarzenia, jak w przykładzie:
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 konkretnego rozszerzenia ładunek zwrócony w obiekcie zdarzenia zawiera dane, których możesz używać do wykonywania niestandardowej logiki w ramach przepływu aplikacji. W tym przypadku funkcja Admin SDK kopiuje metadane obrazu o zmienionym rozmiarze do kolekcji w Cloud Firestore, uzyskuje nazwę pliku z podanego przez zdarzenie parametru subject
i zapisuje 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 w przypadkach, gdy potrzebujesz specjalnych uprawnień lub innych wymagań i nie chcesz mieć takiego samego poziomu widoczności ani dostępu do wszystkich zdarzeń. 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 podać ten kanał w kodzie funkcji. Jeśli np. 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)
# ...