Crear y manejar disparadores de eventos personalizados

Con Cloud Functions v2, puede 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 compatibles de forma nativa con el SDK de Firebase para Cloud Functions.

Durante la versión preliminar pública, Firebase Extensions proporciona los eventos personalizados disponibles. Puede instalar una extensión en su aplicación y luego responder a eventos personalizados en este flujo básico:

  1. Instale una extensión que proporcione uno o más eventos personalizados.
  2. Manejar un tipo de evento implementando un controlador onCustomEventPublished . En esta función, analice la carga útil devuelta en el objeto CloudEvent y realice cualquier lógica personalizada que requiera su aplicación.

Por 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.

Todos los eventos personalizados se ajustan al formato de evento JSON de CloudEvents . Para obtener información clave, como la lista de eventos disponibles y los detalles de la carga útil del evento, consulte la documentación de una extensión en particular.

Manejar un evento personalizado

Una vez que haya descubierto un evento personalizado disponible desde una extensión instalada, puede manejar ese evento con el
controlador onCustomEventPublished . Primero, importe este controlador desde el SDK de Eventarc junto con el SDK de administrador de Firebase para Node.js para su lógica personalizada y el SDK del logger para manejar errores:

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

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

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

Para cada extensión en 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 usa Admin SDK 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 los metadatos de los data proporcionados por el evento.

Manejar un evento en un canal no predeterminado

El ejemplo anterior asume que el evento de finalización de la imagen se publica en el canal predeterminado, en la ubicación predeterminada us-central1 como se especifica en la extensión. En los casos en que se publique un evento personalizado en un canal no predeterminado, deberá especificar el canal en su código de función. Por ejemplo, si desea manejar eventos que se publican en un canal no predeterminado para la ubicación us-west1 , debe especificar el canal como se muestra:

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