Crear y gestionar activadores de eventos personalizados

Con Cloud Functions (segunda generación), puedes activar funciones en respuesta a eventos personalizados . Estos son eventos proporcionados por proveedores de eventos especiales o adicionales, a diferencia de los eventos de Firebase admitidos de forma nativa por el SDK de Firebase para Cloud Functions. A través de activadores de eventos personalizados, su aplicación puede responder a eventos proporcionados por Firebase Extensions, o puede publicar sus propios eventos personalizados y activar funciones en respuesta a ellos.

Todos los eventos personalizados se ajustan al formato de evento JSON de CloudEvents y se publican en Eventarc . Se aplican tarifas de uso de Eventarc.

Funciones de activación con eventos personalizados

Puedes publicar eventos personalizados (u obtener eventos de las extensiones de Firebase) y activar funciones en respuesta a esos eventos implementando este flujo básico:

  1. Publique los eventos deseados en un canal de Eventarc o identifique los eventos disponibles proporcionados por una extensión que haya instalado.
  2. En su código de función, suscríbase a eventos en el canal Eventarc con un controlador de eventos.
  3. En la función, analice la carga útil devuelta en el objeto CloudEvent y realice cualquier lógica personalizada que requiera su aplicación.

Por ejemplo, es posible que una aplicación de juego desee enviar notificaciones a los usuarios cuando entran o salen de la tabla de clasificación de los diez principales competidores. Esta aplicación podría publicar eventos de clasificación en el canal predeterminado y luego manejar el evento en una función que envía notificaciones push dirigidas a los usuarios.

En otro ejemplo, una extensión diseñada para ayudar a las aplicaciones a procesar imágenes grandes podría emitir un evento al finalizar el cambio de tamaño de la imagen. Las aplicaciones con esta extensión instalada podrían manejar el evento de finalización actualizando los enlaces en la aplicación para que apunten a versiones redimensionadas de la imagen.

Publicar un evento en un canal

Los eventos de Eventarc se publican en canales . Los canales son una forma de agrupar eventos relacionados y administrar permisos de acceso. Cuando instalas una extensión o implementas una función que consume eventos personalizados, Firebase crea automáticamente un canal predeterminado llamado firebase en la región us-central1 . El SDK de Firebase Admin proporciona un subpaquete eventarc para publicar en canales.

Para publicar un evento desde un servidor confiable (u otra función) usando el canal predeterminado:

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 . . .'
    }
});

Además de crear automáticamente el canal predeterminado, Firebase establece la variable de entorno EVENTARC_CLOUD_EVENT_SOURCE , que especifica el origen del evento. Si publicas eventos fuera de Cloud Functions para Firebase, deberás agregar explícitamente el campo source en la carga útil del evento.

Manejar eventos personalizados

Puede controlar todos los eventos personalizados, incluidos los eventos de extensiones, con los controladores onCustomEventPublished o on_custom_event_published . Primero, importe este controlador desde el SDK de Eventarc junto con el SDK de administrador de Firebase:

Nodo.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");

Pitón

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

En su código de función, pase el nombre del evento como se muestra en la función de ejemplo:

Nodo.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
    });

Pitón

@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

Para cada extensión particular, la carga útil devuelta en el objeto de evento proporciona datos que puede usar para realizar una lógica personalizada para el flujo de su aplicación. En este caso, la función utiliza el SDK de administración para copiar metadatos sobre la imagen redimensionada a una colección en Cloud Firestore, obteniendo el nombre de archivo del subject proporcionado por el evento y guardando metadatos de los data proporcionados por el evento.

Publicar y gestionar eventos en canales no predeterminados

Los canales personalizados pueden ser útiles para casos en los que tiene necesidades de permisos especiales u otros requisitos y no desea el mismo nivel de visibilidad y acceso para todos los eventos. Puedes crear tus propios canales usando la consola de Google Cloud . La publicación y suscripción a eventos debe realizarse en el mismo canal.

En los casos en que un evento personalizado se publique en un canal no predeterminado, deberá especificar el canal en su código de función. Por ejemplo, si desea controlar eventos que se publican en un canal no predeterminado para la ubicación us-west1 , debe especificar el canal como se muestra:

Nodo.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) => { ... });

Pitón

@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)
    # ...