Firebase is back at Google I/O on May 10! Register now

Crea e gestisci trigger di eventi personalizzati

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Con Cloud Functions (2ª generazione), puoi attivare funzioni in risposta a eventi personalizzati . Si tratta di eventi forniti da provider di eventi speciali o aggiuntivi, al contrario degli eventi Firebase supportati in modo nativo dall'SDK Firebase per Cloud Functions. Tramite trigger di eventi personalizzati, la tua app può rispondere agli eventi forniti da Firebase Extensions oppure puoi pubblicare i tuoi eventi personalizzati e attivare le funzioni in risposta ad essi.

Tutti gli eventi personalizzati sono conformi al formato dell'evento JSON di CloudEvents e vengono pubblicati in Eventarc . Si applicano le tariffe per l'utilizzo di Eventarc.

Funzioni di trigger con eventi personalizzati

Puoi pubblicare eventi personalizzati (o ottenere eventi dalle estensioni Firebase) e attivare funzioni in risposta a tali eventi implementando questo flusso di base:

  1. Pubblica gli eventi desiderati su un canale Eventarc o identifica gli eventi disponibili forniti da un'estensione che hai installato.
  2. Nel codice della funzione, iscriviti agli eventi sul canale Eventarc con un gestore onCustomEventPublished .
  3. Nella funzione, analizza il payload restituito nell'oggetto CloudEvent ed esegui la logica personalizzata richiesta dalla tua app.

Ad esempio, un'app di gioco potrebbe voler inviare notifiche agli utenti quando entrano o escono dalla classifica dei primi dieci concorrenti. Questa app potrebbe pubblicare eventi di classifica sul canale predefinito e quindi gestire l'evento in una funzione che invia notifiche push mirate agli utenti.

In un altro esempio, un'estensione progettata per aiutare le app a elaborare immagini di grandi dimensioni potrebbe emettere un evento al completamento del ridimensionamento dell'immagine. Le app con questa estensione installata potrebbero gestire l'evento di completamento aggiornando i collegamenti nell'app in modo che puntino a versioni ridimensionate dell'immagine.

Pubblica un evento su un canale

Gli eventi Eventarc sono pubblicati nei canali . I canali sono un modo per raggruppare eventi correlati e gestire le autorizzazioni di accesso. Quando installi un'estensione o distribuisci una funzione che consuma eventi personalizzati, Firebase crea automaticamente un canale predefinito denominato firebase nella regione us-central1 . L'SDK Firebase Admin fornisce un sottopacchetto eventarc per la pubblicazione sui canali.

Per pubblicare un evento da un server attendibile (o da un'altra funzione) utilizzando il canale predefinito:

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

Oltre a creare automaticamente il canale predefinito, Firebase imposta la variabile di ambiente EVENTARC_CLOUD_EVENT_SOURCE , che specifica l'origine dell'evento. Se pubblichi eventi al di fuori di Cloud Functions for Firebase, dovrai aggiungere in modo esplicito il campo source nel payload dell'evento.

Gestisci gli eventi con onCustomEventPublished

Puoi gestire tutti gli eventi personalizzati, inclusi gli eventi di estensione, con il gestore onCustomEventPublished . Innanzitutto, importa questo gestore dall'SDK Eventarc insieme all'SDK Firebase Admin per Node.js per la tua logica personalizzata e l'SDK logger per la gestione degli errori:

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

Nel codice della funzione, passa il nome dell'evento come mostrato per la funzione di esempio 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
    });

Per ogni particolare estensione, il payload restituito nell'oggetto evento fornisce i dati che puoi utilizzare per eseguire la logica personalizzata per il flusso dell'applicazione. In questo caso, la funzione utilizza Admin SDK per copiare i metadati relativi all'immagine ridimensionata in una raccolta in Cloud Firestore, ottenendo il nome file subject fornito dall'evento e salvando i metadati dai data forniti dall'evento.

Pubblica e gestisci eventi su canali non predefiniti

I canali personalizzati possono essere utili nei casi in cui hai esigenze di autorizzazioni speciali o altri requisiti e non desideri lo stesso livello di visibilità e accesso per tutti gli eventi. Puoi creare i tuoi canali utilizzando Google Cloud Console . La pubblicazione e l'iscrizione agli eventi devono essere effettuate sullo stesso canale.

Nei casi in cui un evento personalizzato viene pubblicato su un canale non predefinito, dovrai specificare il canale nel codice funzione. Ad esempio, se desideri gestire gli eventi pubblicati in un canale non predefinito per la posizione us-west1 , devi specificare il canale come mostrato:

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