Com o Cloud Functions v2, você pode acionar funções em resposta a eventos personalizados . Esses são eventos fornecidos por provedores de eventos especiais ou adicionais, em oposição aos eventos do Firebase suportados nativamente pelo SDK do Firebase para Cloud Functions.
Durante a visualização pública, os eventos personalizados disponíveis são fornecidos pelas extensões do Firebase. Você pode instalar uma extensão em seu aplicativo e responder a eventos personalizados neste fluxo básico:
- Instale uma extensão que forneça um ou mais eventos personalizados.
- Manipule um tipo de evento implantando um manipulador
onCustomEventPublished
. Nesta função, analise a carga retornada no objetoCloudEvent
e execute qualquer lógica personalizada que seu aplicativo exigir.
Por exemplo, uma extensão projetada para ajudar os aplicativos a processar imagens grandes pode emitir um evento na conclusão do redimensionamento da imagem. Aplicativos com essa extensão instalada podem manipular o evento de conclusão atualizando links no aplicativo para apontar para versões redimensionadas da imagem.
Todos os eventos personalizados estão em conformidade com o formato de evento JSON do CloudEvents . Para obter informações importantes, como a lista de eventos disponíveis e os detalhes da carga útil do evento, consulte a documentação de uma determinada extensão.
Lidar com um evento personalizado
Depois de descobrir um evento personalizado disponível em uma extensão instalada, você pode manipular esse evento com o
manipulador onCustomEventPublished
. Primeiro, importe esse gerenciador do SDK Eventarc junto com o SDK Admin do Firebase para Node.js para sua lógica personalizada e o SDK do logger
para lidar com erros:
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");
Em seu código de função, passe o nome do evento conforme mostrado para a função de exemplo 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 extensão específica, a carga retornada no objeto de evento fornece dados que você pode usar para executar a lógica personalizada para o fluxo do aplicativo. Nesse caso, a função usa o SDK Admin para copiar metadados sobre a imagem redimensionada para uma coleção no Cloud Firestore, obtendo o nome do arquivo do subject
fornecido pelo evento e salvando metadados dos data
fornecidos pelo evento.
Manipular um evento em um canal não padrão
O exemplo acima supõe que o evento de conclusão da imagem seja publicado no canal padrão, no local padrão us-central1
conforme especificado na extensão. Nos casos em que um evento personalizado é publicado em um canal não padrão, você precisará especificar o canal em seu código de função. Por exemplo, se você quiser lidar com eventos publicados em um canal não padrão para o local us-west1
, será necessário especificar o canal conforme mostrado:
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) => { ... });