С помощью облачных функций (2-го поколения) вы можете запускать функции в ответ на пользовательские события . Это события, предоставляемые специальными или дополнительными поставщиками событий, в отличие от событий Firebase, изначально поддерживаемых Firebase SDK для облачных функций. С помощью настраиваемых триггеров событий ваше приложение может реагировать на события, предоставленные расширениями Firebase, или вы можете публиковать свои собственные настраиваемые события и запускать функции в ответ на них.
Все пользовательские события соответствуют формату событий CloudEvents JSON и публикуются в Eventarc . Взимается плата за использование Eventarc.
Триггерные функции с пользовательскими событиями
Вы можете публиковать пользовательские события (или получать события из расширений Firebase) и запускать функции в ответ на эти события, реализуя этот базовый процесс:
- Публикуйте нужные события на канале Eventarc или определяйте доступные события, предоставляемые установленным вами расширением.
- В коде функции подпишитесь на события в канале Eventarc с помощью обработчика
onCustomEventPublished
. - В функции проанализируйте полезные данные, возвращенные в объекте CloudEvent, и выполните любую пользовательскую логику, требуемую вашим приложением.
Например, игровое приложение может захотеть отправлять уведомления пользователям, когда они входят или выходят из списка лидеров десяти лучших конкурентов. Это приложение может публиковать события списка лидеров в канале по умолчанию, а затем обрабатывать событие в функции, которая отправляет целевые push-уведомления пользователям.
В другом примере расширение, предназначенное для помощи приложениям в обработке больших изображений, может генерировать событие по завершении изменения размера изображения. Приложения с установленным этим расширением могут обрабатывать событие завершения, обновляя ссылки в приложении, чтобы они указывали на версии изображения с измененным размером.
Публикация события на канале
События Eventarc публикуются в каналах . Каналы — это способ группировать связанные события и управлять разрешениями на доступ. Когда вы устанавливаете расширение или развертываете функцию, использующую настраиваемые события, Firebase автоматически создает канал по умолчанию с именем firebase
в регионе us-central1
. Firebase Admin SDK предоставляет подпакет eventarc
для публикации в каналах.
Чтобы опубликовать событие с доверенного сервера (или другой функции) с использованием канала по умолчанию:
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 . . .'
}
});
Помимо автоматического создания канала по умолчанию, Firebase устанавливает переменную среды EVENTARC_CLOUD_EVENT_SOURCE
, которая указывает источник события. Если вы публикуете события за пределами Cloud Functions for Firebase, вам необходимо явно добавить поле source
в полезные данные события.
Обработка событий с помощью onCustomEventPublished
Вы можете обрабатывать все пользовательские события, включая события расширений, с помощью обработчика onCustomEventPublished
. Сначала импортируйте этот обработчик из Eventarc SDK вместе с Firebase Admin SDK для Node.js для вашей пользовательской логики и SDK logger
для обработки ошибок:
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");
В коде функции передайте имя события, как показано для примера функции 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
});
Для каждого конкретного расширения полезная нагрузка, возвращаемая в объекте события, предоставляет данные, которые можно использовать для выполнения пользовательской логики потока вашего приложения. В этом случае функция использует Admin SDK для копирования метаданных об изображении с измененным размером в коллекцию в Cloud Firestore, получения имени файла из subject
, предоставленной событием, и сохранения метаданных из data
, предоставленных событием.
Публикация и обработка событий на каналах не по умолчанию
Пользовательские каналы могут быть полезны в случаях, когда у вас есть особые потребности в разрешениях или другие требования, и вам не нужен одинаковый уровень видимости и доступа для всех событий. Вы можете создавать собственные каналы с помощью консоли Google Cloud . Публикация и подписка на события должны осуществляться на одном и том же канале.
В тех случаях, когда пользовательское событие публикуется на канале, отличном от канала по умолчанию, вам необходимо указать канал в коде функции. Например, если вы хотите обрабатывать события, которые публикуются в канале, отличном от канала по умолчанию для местоположения us-west1
, вам необходимо указать канал, как показано ниже:
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) => { ... });