Avec Cloud Functions (2e génération), vous pouvez déclencher des fonctions en réponse à des les événements. Il s'agit d'événements proposés par des fournisseurs d'événements spéciaux ou supplémentaires, comme par opposition aux événements Firebase acceptés de manière native par le SDK Firebase pour Cloud Functions. Grâce aux déclencheurs d'événements personnalisés, votre application peut répondre aux événements fournis par Firebase Extensions, ou vous pouvez publier vos propres et déclencher des fonctions en réponse.
Tous les événements personnalisés sont conformes au Format d'événement JSON CloudEvents et sont publiés dans Eventarc. Des frais d'utilisation de Eventarc s'appliquent.
Déclencher des fonctions avec des événements personnalisés
Vous pouvez publier des événements personnalisés (ou obtenir des événements à partir d'extensions Firebase) et déclencher des fonctions en réponse à ces événements en implémentant la procédure de base suivante:
- Publiez les événements souhaités sur un canal Eventarc ou identifiez les événements disponibles fournis par une extension que vous avez installée.
- Dans votre code de fonction, abonnez-vous aux événements du canal Eventarc avec un gestionnaire d'événements.
- Dans la fonction, analysez la charge utile renvoyée dans CloudEvent et exécuter la logique personnalisée requise par votre application.
Par exemple, une application de jeu peut vouloir envoyer des notifications aux utilisateurs lorsqu'ils y accèdent ou quitter le classement des 10 principaux concurrents. Cette application pourrait être publiée de classement au canal par défaut, puis gérez ces événements dans une qui envoie des notifications push ciblées aux utilisateurs.
Dans une autre Par exemple, une extension conçue pour aider les applications à traiter des images volumineuses peut émettre une à la fin du redimensionnement de l'image. Applications avec cette extension installée pourrait gérer l'événement d'achèvement en mettant à jour les liens dans l'application pour qu'ils pointent vers des versions redimensionnées de l'image.
Publier un événement sur une chaîne
Les événements Eventarc sont publiés
chaînes.
Les canaux permettent de regrouper des événements associés et de gérer les autorisations d'accès. Lorsque vous installez une extension ou déployez une fonction qui utilise
personnalisés, Firebase crée automatiquement un canal par défaut nommé
firebase
dans la région us-central1
. Le Firebase Admin SDK fournit
un sous-package eventarc
pour la publication sur les chaînes.
Pour publier un événement à partir d'un serveur de confiance (ou d'une autre fonction) à l'aide de la méthode canal par défaut:
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 . . .'
}
});
En plus de créer automatiquement le canal par défaut, Firebase définit
la variable d'environnement EVENTARC_CLOUD_EVENT_SOURCE
, qui spécifie la source
de l'événement. Si vous publiez des événements en dehors de Cloud Functions for Firebase,
vous devez ajouter explicitement le champ source
dans la charge utile de l'événement.
Gérer les événements personnalisés
Vous pouvez gérer tous les événements personnalisés, y compris les événements d'extension, à l'aide de la propriété
onCustomEventPublished
ou
on_custom_event_published
gestionnaires. Importez d'abord ce gestionnaire à partir du SDK Eventarc avec la classe
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
Dans le code de votre fonction, transmettez le nom de l'événement comme indiqué pour l'exemple de fonction:
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
Pour chaque extension particulière, la charge utile renvoyée dans l'objet d'événement fournit
des données que vous pouvez utiliser pour exécuter
une logique personnalisée pour le flux de votre application. Dans ce
la fonction utilise Admin SDK pour copier les métadonnées concernant le redimensionnement
dans une collection de Cloud Firestore, en obtenant le nom du fichier
subject
fournies par l'événement et en enregistrant les métadonnées à partir du data
fourni
par l'événement.
Publier et gérer des événements sur des canaux autres que ceux par défaut
Les critères personnalisés peuvent s'avérer utiles lorsque vous avez des autorisations particulières. ou autres, et ne souhaitent pas avoir le même niveau de visibilité et d'accès pour tous les événements. Vous pouvez créer vos propres chaînes à l'aide du Console Google Cloud La publication et l'abonnement aux événements doivent être effectués sur le même canal.
Si un événement personnalisé est publié sur un canal autre que celui par défaut,
vous devez spécifier le canal dans le code de votre fonction. Par exemple, si vous souhaitez gérer les événements publiés dans un canal autre que le canal par défaut pour l'emplacement us-west1
, vous devez spécifier le canal comme indiqué :
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)
# ...