Написание облачных функций для расширения

Когда вы создаете расширение, вы пишете его логику с помощью Cloud Functions , почти так же, как вы пишете функцию, которая будет использоваться только в вашем собственном проекте. Вы объявляете свои функции в файле extension.yaml , и когда пользователи устанавливают ваше расширение, эти функции развертываются в их проекте.

Общие сведения об использовании Cloud Functions см. в документации Cloud Functions .

Cloud Functions 1-го и 2-го поколения

Firebase поддерживает Cloud Functions как 1-го, так и 2-го поколения . Однако расширения Firebase в настоящее время имеют некоторые ограничения на то, какое поколение облачных функций можно использовать с определенными типами триггеров. По этой причине многие расширения включают в себя сочетание функций 1-го и 2-го поколения.

Поддержка генерации функций указана для каждого типа триггера ниже.

Особые соображения

  • Некоторые определения функций требуют указания информации, которая также указана в файле extension.yaml . Например, в Cloud Firestore есть метод document() , который определяет шаблон документа для просмотра, а его соответствующее объявление в extension.yaml имеет поле resource , которое указывает то же самое.

    В таких ситуациях используется конфигурация, указанная в файле extension.yaml , а конфигурация, указанная в определении функции, игнорируется.

    Обычной практикой является указание настроенного значения в определении функции в целях документации. Примеры на этой странице следуют этому шаблону.

  • В SDK Cloud Functions 1-го поколения есть метод functions.config() и команда CLI functions:config:set , которую можно использовать для работы с параметризованными значениями в функциях 1-го поколения. Этот метод устарел в Cloud Functions и вообще не будет работать в расширении. Вместо этого используйте модуль functions.params (рекомендуется) или process.env .

Использование TypeScript

Большая часть документации по разработке собственного расширения описывает рабочие процессы с использованием JavaScript для Cloud Functions for Firebase . Однако вместо этого вы можете писать свои функции, используя TypeScript.

Фактически, все официальные расширения Firebase написаны на TypeScript. Вы можете просмотреть эти расширения, чтобы узнать о некоторых рекомендациях по использованию TypeScript для вашего расширения.

Если вы пишете функции своего расширения на TypeScript, перед установкой расширения необходимо сделать следующее:

  1. Скомпилируйте исходный код функций вашего расширения в JavaScript.

    Команда firebase ext:dev:init позволяет вам выбрать TypeScript для написания ваших функций. Команда предоставляет вам полное устанавливаемое расширение , а также сценарий сборки, который вы можете запустить с помощью npm run build .

  2. В файле package.json обязательно укажите в main поле сгенерированный JavaScript.

  3. Если вы устанавливаете или загружаете расширение из локального источника, сначала скомпилируйте файлы TypeScript.

Поддерживаемые триггеры функций

HTTP-триггеры

Функция, активируемая HTTP, развертывается в общедоступной конечной точке https и запускается при доступе к конечной точке.

Информацию о написании функций, запускаемых HTTP, см. в разделе «Вызов функций через HTTP-запросы» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { https } from "firebase-functions/v1";

export const yourFunctionName = https.onRequest(async (req, resp) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      runtime: nodejs16
      httpsTrigger: {}
  - name: anotherFunction
    type: ...

Вызываемые функции

Вызываемые функции аналогичны функциям, запускаемым HTTP, но они реализуют протокол, который делает их удобными для вызова из клиентского кода.

Информацию об использовании вызываемых функций см. в разделе Вызов функций из вашего приложения в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { https } from "firebase-functions/v1";

export const yourFunctionName = https.onCall(async (data, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      runtime: nodejs16
      httpsTrigger: {}
  - name: anotherFunction
    type: ...

Триггеры запланированных функций

Запланированная функция выполняется неоднократно по настраиваемому расписанию.

Информацию о написании запланированных функций см. в разделе Функции расписания в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { pubsub } from "firebase-functions/v1";

export const yourFunctionName = pubsub.schedule("every 6 hours").onRun((context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      scheduleTrigger:
        schedule: 'every 5 minutes'
  - name: anotherFunction
    type: ...

Вот доступные подполя для scheduleTrigger :

Поле Описание
schedule
(необходимый)

Частота, с которой вы хотите, чтобы функция выполнялась.

Это поле может принимать строки, использующие любой синтаксис (требуется заключение в одинарные кавычки ):

timeZone
(необязательный)

Часовой пояс, в котором будет работать расписание.

Если вы хотите, чтобы пользователи могли настраивать расписание при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      scheduleTrigger:
        schedule: ${SCHEDULE_FREQUENCY}
  - name: anotherFunction
    type: ...

params:
  - param: SCHEDULE_FREQUENCY
    label: Schedule
    description: How often do you want to run yourFunctionName()?
    type: string
    default: 'every 5 minutes'  # Specifying a default is optional.
    required: true

Триггеры очереди задач

Функция очереди задач запускается либо при событиях жизненного цикла вашего расширения, либо при добавлении в очередь задач вашего расширения вручную с помощью метода TaskQueue.enqueue() Admin SDK.

См . раздел «Обработка событий жизненного цикла вашего расширения» для получения информации о написании функций, обрабатывающих события жизненного цикла.

Информацию о написании функций очереди задач см. в разделе «Постановка функций в очередь с облачными задачами» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { tasks } from "firebase-functions/v1";

export const yourFunctionName = tasks.taskQueue().onDispatch(async (data, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: myTaskFunction
    type: firebaseextensions.v1beta.function
    description: >-
      Perform a task when triggered by a lifecycle event
    properties:
      taskQueueTrigger: {}

Установите для свойства taskQueueTrigger значение {} или карту параметров, которые настраивают ограничения скорости и поведение повторных попыток очереди задач (см. Настройка очереди задач ).

Если вы хотите запускать свою функцию в событиях жизненного цикла вашего расширения, добавьте записи lifecycleEvents с именем функции и необязательным сообщением обработки, которое будет отображаться в консоли Firebase при начале обработки.

lifecycleEvents:
  onInstall:
    function: myTaskFunction
    processingMessage: Resizing your existing images
  onUpdate:
    function: myOtherTaskFunction
    processingMessage: Setting up your extension
  onConfigure:
    function: myOtherTaskFunction
    processingMessage: Setting up your extension

Analytics

Функция, активируемая Analytics, запускается при регистрации указанного события Analytics.

Информацию о написании функций, запускаемых Analytics, см. в разделе «Триггеры Google Analytics» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { analytics } from "firebase-functions/v1";

export const yourFunctionName = analytics.event("event_name").onLog((event, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.analytics/eventTypes/event.log
        resource: projects/${PROJECT_ID}/events/ga_event
  - name: anotherFunction
    type: ...

Если вы хотите, чтобы пользователи могли настроить событие Analytics для прослушивания при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.analytics/eventTypes/event.log
        resource: projects/${PROJECT_ID}/events/${EVENT_NAME}
  - name: anotherFunction
    type: ...

params:
  - param: EVENT_NAME
    label: Analytics event
    description: What event do you want to respond to?
    type: string
    default: ga_event  # Specifying a default is optional.
    required: true

Authentication

Функция, активируемая аутентификацией, запускается при создании или удалении пользователя.

См. «Триггеры аутентификации Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых авторизацией.

Определение функции (только 1-го поколения)

import { auth } from "firebase-functions/v1";

export const yourFunctionName = auth.user().onCreate((user, context) => {
  // ...
});

export const yourFunctionName2 = auth.user().onDelete((user, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/firebase.auth/eventTypes/user.create
        resource: projects/${PROJECT_ID}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Authentication :

Триггер событий Cloud Functions eventType Описание
onCreate() providers/firebase.auth/eventTypes/user.create Новый пользователь создан
onDelete() providers/firebase.auth/eventTypes/user.delete Пользователь удален

Cloud Firestore

Функция, активируемая Cloud Firestore, запускается при создании, обновлении или удалении документа.

См. «Триггеры Cloud Firestore» в документации Cloud Functions для получения информации о написании функций, запускаемых Firestore.

Определение функции (только 1-го поколения)

import { firestore } from "firebase-functions/v1";

export const yourFunctionName = firestore.document("collection/{doc_id}")
  .onCreate((snapshot, context) => {
    // ...
  });

export const yourFunctionName2 = firestore.document("collection/{doc_id}")
  .onUpdate((change, context) => {
    // ...
  });

export const yourFunctionName3 = firestore.document("collection/{doc_id}")
  .onDelete((snapshot, context) => {
    // ...
  });

export const yourFunctionName4 = firestore.document("collection/{doc_id}")
  .onWrite((change, context) => {
    // onWrite triggers on creation, update, and deletion.
    // ...
  });

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/collection/{documentID}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Cloud Firestore :

Триггер событий Cloud Functions eventType Описание
onCreate() providers/cloud.firestore/eventTypes/document.create Новый документ создан
onDelete() providers/cloud.firestore/eventTypes/document.delete Документ удален.
onUpdate() providers/cloud.firestore/eventTypes/document.update Документ обновлен
onWrite() providers/cloud.firestore/eventTypes/document.write Документ создан, удален или обновлен

Если вы хотите, чтобы пользователи могли настраивать путь к документу при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/${YOUR_DOCUMENT_PATH}
  - name: anotherFunction
    type: ...

params:
  - param: YOUR_DOCUMENT_PATH
    label: Cloud Firestore path
    description: Where do you want to watch for changes?
    type: string
    default: path/to/{documentID}  # Specifying a default is optional.
    required: true

Pub/Sub

Функция, запускаемая Pub/Sub, запускается, когда сообщение публикуется в определенной теме.

Информацию о написании функций, запускаемых Pub/Sub, см. в разделе «Триггеры Pub/Sub» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { pubsub } from "firebase-functions/v1";

export const yourFunctionName = pubsub.topic("topic_name").onPublish((message, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.pubsub.topic.publish
        resource: projects/${PROJECT_ID}/topics/topic-name
  - name: anotherFunction
    type: ...

Если вы хотите, чтобы пользователи могли настраивать тему Pub/Sub при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.pubsub.topic.publish
        resource: projects/${PROJECT_ID}/topics/${PUBSUB_TOPIC}
  - name: anotherFunction
    type: ...

params:
  - param: PUBSUB_TOPIC
    label: Pub/Sub topic
    description: Which Pub/Sub topic do you want to watch for messages?
    type: string
    default: topic-name  # Specifying a default is optional.
    required: true

Realtime Database

Функция, активируемая базой данных реального времени, запускается, когда создается, обновляется или удаляется путь, соответствующий указанному шаблону.

Информацию о написании функций, запускаемых RTDB, см. в разделе «Триггеры базы данных реального времени » в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { database } from "firebase-functions/v1";

export const yourFunctionName = database.ref("path/to/{item}")
  .onCreate((snapshot, context) => {
    // ...
  });

export const yourFunctionName2 = database.ref("path/to/{item}")
  .onUpdate((change, context) => {
    // ...
  });

export const yourFunctionName3 = database.ref("path/to/{item}")
  .onDelete((snapshot, context) => {
    // ...
  });

export const yourFunctionName4 = database.ref("path/to/{item}")
  .onWrite((change, context) => {
    // onWrite triggers on creation, update, and deletion.
    // ...
  });

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.database/eventTypes/ref.create
        # DATABASE_INSTANCE (project's default instance) is an auto-populated
        # parameter value. You can also specify an instance.
        resource: projects/_/instances/${DATABASE_INSTANCE}/refs/path/to/{itemId}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Cloud Firestore :

Триггер событий Cloud Functions eventType Описание
onCreate() providers/google.firebase.database/eventTypes/ref.create Данные созданы
onDelete() providers/google.firebase.database/eventTypes/ref.delete Данные удалены
onUpdate() providers/google.firebase.database/eventTypes/ref.update Данные обновлены
onWrite() providers/google.firebase.database/eventTypes/ref.write Данные созданы, удалены или обновлены

Если вы хотите, чтобы пользователи могли настраивать путь для просмотра при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.database/eventTypes/ref.create
        # DATABASE_INSTANCE (project's default instance) is an auto-populated
        # parameter value. You can also specify an instance.
        resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${DB_PATH}
  - name: anotherFunction
    type: ...

params:
  - param: DB_PATH
    label: Realtime Database path
    description: Where do you want to watch for changes?
    type: string
    default: path/to/{itemId}  # Specifying a default is optional.
    required: true

Remote Config

Функция, активируемая Remote Config, запускается при обновлении шаблона параметров проекта.

См. триггеры Remote Config в документации Cloud Functions для получения информации о написании функций, запускаемых Remote Config.

Определение функции (только 1-го поколения)

import { remoteConfig } from "firebase-functions/v1";

export const yourFunctionName = remoteConfig.onUpdate((version, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.firebase.remoteconfig.update
        resource: projects/${PROJECT_ID}
  - name: anotherFunction
    type: ...

Cloud Storage

Функция, активируемая Cloud Storage, запускается при создании, архивировании или удалении объекта, а также при изменении его метаданных.

Информацию о написании функций, запускаемых хранилищем, см. в разделе «Триггеры облачного хранилища» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { storage } from "firebase-functions/v1";

export const yourFunctionName = storage.object().onFinalize((object, context) => {
  // ...
});

export const yourFunctionName2 = storage.object().onMetadataUpdate((object, context) => {
  // ...
});

export const yourFunctionName3 = storage.object().onArchive((object, context) => {
  // ...
});

export const yourFunctionName4 = storage.object().onDelete((object, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.storage.object.finalize
        # STORAGE_BUCKET (project's default bucket) is an auto-populated
        # parameter. You can also specify a bucket.
        resource: projects/_/buckets/${STORAGE_BUCKET}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Cloud Storage :

Триггер событий Cloud Functions eventType Описание
onFinalize() google.storage.object.finalize Объект создан
onMetadataUpdate() google.storage.object.metadataUpdate Метаданные объекта обновлены.
onArchive() google.storage.object.archive Объект был заархивирован
onDelete() google.storage.object.delete Объект удален

Если вы хотите, чтобы пользователи могли настраивать сегмент хранилища при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.storage.object.finalize
        resource: projects/_/buckets/${YOUR_BUCKET}
  - name: anotherFunction
    type: ...

params:
  - param: YOUR_BUCKET
    label: Cloud Storage bucket
    description: Which bucket do you want to watch for changes?
    type: selectResource
    resourceType: storage.googleapis.com/Bucket
    default: ${STORAGE_BUCKET}  # Specifying a default is optional.
    required: true

Test Lab

Функция, запускаемая тестовой лабораторией, запускается, когда тестовая матрица завершает свои тесты.

Информацию о написании функций, запускаемых Test Lab, см. в разделе «Триггеры Firebase Test Lab» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { testLab } from "firebase-functions/v1";

export const yourFunctionName = testLab.testMatrix().onComplete((matrix, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.testing.testMatrix.complete
        resource: projects/${PROJECT_ID}/testMatrices/{matrixId}
  - name: anotherFunction
    type: ...

Триггеры оповещений Crashlytics

Функция, запускаемая Crashlytics запускается, когда Crashlytics публикует оповещение.

См. «Триггеры оповещений Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых оповещениями.

Определение функции (только 2-го поколения)

import {
  onNewFatalIssuePublished,
  onNewNonfatalIssuePublished,
  onNewAnrIssuePublished,
  onRegressionAlertPublished,
  onVelocityAlertPublished,
  onStabilityDigestPublished,
} from "firebase-functions/v2/alerts/crashlytics";

export const yourFunctionName = onNewFatalIssuePublished((event) => {
  // ...
});

export const yourFunctionName2 = onNewNonfatalIssuePublished((event) => {
  // ...
});

export const yourFunctionName3 = onNewAnrIssuePublished((event) => {
  // ...
});

export const yourFunctionName4 = onRegressionAlertPublished((event) => {
  // ...
});

export const yourFunctionName5 = onVelocityAlertPublished((event) => {
  // ...
});

export const yourFunctionName6 = onStabilityDigestPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: crashlytics.newFatalIssue
  - name: anotherFunction
    type: ...

Вы можете использовать следующие значения для alerttype

  • crashlytics.newFatalIssue
  • crashlytics.newNonfatalIssue
  • crashlytics.regression
  • crashlytics.stabilityDigest
  • crashlytics.velocity
  • crashlytics.newAnrIssue

Триггеры оповещений Performance Monitoring

Функция, активируемая Performance Monitoring , запускается, когда Performance Monitoring публикует предупреждение.

См. «Триггеры оповещений Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых оповещениями.

Определение функции (только 2-го поколения)

import { onThresholdAlertPublished } from "firebase-functions/v2/alerts/performance";

export const yourFunctionName = onThresholdAlertPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: performance.threshold
  - name: anotherFunction
    type: ...

Триггеры оповещений App Distribution

Функция, активируемая App Distribution запускается, когда App Distribution публикует оповещение.

См. «Триггеры оповещений Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых оповещениями.

Определение функции (только 2-го поколения)

import {
  onNewTesterIosDevicePublished,
  onInAppFeedbackPublished
} from "firebase-functions/v2/alerts/appDistribution";

export const yourFunctionName = onNewTesterIosDevicePublished((event) => {
  // ...
});

export const yourFunctionName2 = onInAppFeedbackPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: appDistribution.inAppFeedback
  - name: anotherFunction
    type: ...

Вы можете использовать следующие значения для alerttype

  • appDistribution.newTesterIosDevice
  • appDistribution.inAppFeedback

Пользовательские триггеры событий (Eventarc)

Функция, запускаемая Eventarc, запускается, когда событие определенного типа публикуется в определенном канале.

Информацию о написании функций, запускаемых Eventarc, см. в разделе Создание и обработка пользовательских триггеров событий в документации Cloud Functions

Вы также можете публиковать события из своих расширений, чтобы дать пользователям возможность вставлять в ваше расширение собственную логику. См. раздел Использование пользовательской логики, предоставленной разработчиком, в расширении .

Определение функции (только 2-го поколения)

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const yourFunctionName = onCustomEventPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      # LOCATION is a user-configured parameter value specified by the user
      # during installation.
      location: ${param:LOCATION}
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
        timeoutSeconds: 60
      eventTrigger:
        eventType: firebase.extensions.storage-resize-images.v1.complete
        channel: projects/${param:PROJECT_ID}/locations/us-central1/channels/firebase
  - name: anotherFunction
    type: ...

Канал должен уже существовать на момент установки вашего расширения. Например, если вы зависите от пользовательских событий другого расширения, создающего канал, попросите пользователей сначала установить это расширение.

В приведенном выше примере будет создан пользовательский триггер событий для канала Firebase по умолчанию в регионе us-central1 . Вы можете настроить имя канала и регион с помощью параметров. Например:


params:
  - param: EVENTARC_CHANNEL_NAME
    label: Eventarc channel name
    description: What is the name of the Eventarc channel.
    default: firebase
    type: string
    required: true

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      location: ${param:LOCATION}
      eventTrigger:
        eventType: firebase.extensions.storage-resize-images.v1.complete
        channel: projects/${param:PROJECT_ID}/locations/${param:LOCATION}/channels/${param:EVENTARC_CHANNEL_NAME}
,

Когда вы создаете расширение, вы пишете его логику с помощью Cloud Functions , почти так же, как вы пишете функцию, которая будет использоваться только в вашем собственном проекте. Вы объявляете свои функции в файле extension.yaml , и когда пользователи устанавливают ваше расширение, эти функции развертываются в их проекте.

Общие сведения об использовании Cloud Functions см. в документации Cloud Functions .

Cloud Functions 1-го и 2-го поколения

Firebase поддерживает Cloud Functions как 1-го, так и 2-го поколения . Однако расширения Firebase в настоящее время имеют некоторые ограничения на то, какое поколение облачных функций можно использовать с определенными типами триггеров. По этой причине многие расширения включают в себя сочетание функций 1-го и 2-го поколения.

Поддержка генерации функций указана для каждого типа триггера ниже.

Особые соображения

  • Некоторые определения функций требуют указания информации, которая также указана в файле extension.yaml . Например, в Cloud Firestore есть метод document() , который определяет шаблон документа для просмотра, а его соответствующее объявление в extension.yaml имеет поле resource , которое указывает то же самое.

    В таких ситуациях используется конфигурация, указанная в файле extension.yaml , а конфигурация, указанная в определении функции, игнорируется.

    Обычной практикой является указание настроенного значения в определении функции в целях документации. Примеры на этой странице следуют этому шаблону.

  • В SDK Cloud Functions 1-го поколения есть метод functions.config() и команда CLI functions:config:set , которую можно использовать для работы с параметризованными значениями в функциях 1-го поколения. Этот метод устарел в Cloud Functions и вообще не будет работать в расширении. Вместо этого используйте модуль functions.params (рекомендуется) или process.env .

Использование TypeScript

Большая часть документации по разработке собственного расширения описывает рабочие процессы с использованием JavaScript для Cloud Functions for Firebase . Однако вместо этого вы можете писать свои функции, используя TypeScript.

Фактически, все официальные расширения Firebase написаны на TypeScript. Вы можете просмотреть эти расширения, чтобы узнать о некоторых рекомендациях по использованию TypeScript для вашего расширения.

Если вы пишете функции своего расширения на TypeScript, перед установкой расширения необходимо сделать следующее:

  1. Скомпилируйте исходный код функций вашего расширения в JavaScript.

    Команда firebase ext:dev:init позволяет вам выбрать TypeScript для написания ваших функций. Команда предоставляет вам полное устанавливаемое расширение , а также сценарий сборки, который вы можете запустить с помощью npm run build .

  2. В файле package.json обязательно укажите в main поле сгенерированный JavaScript.

  3. Если вы устанавливаете или загружаете расширение из локального источника, сначала скомпилируйте файлы TypeScript.

Поддерживаемые триггеры функций

HTTP-триггеры

Функция, активируемая HTTP, развертывается в общедоступной конечной точке https и запускается при доступе к конечной точке.

Информацию о написании функций, запускаемых HTTP, см. в разделе «Вызов функций через HTTP-запросы» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { https } from "firebase-functions/v1";

export const yourFunctionName = https.onRequest(async (req, resp) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      runtime: nodejs16
      httpsTrigger: {}
  - name: anotherFunction
    type: ...

Вызываемые функции

Вызываемые функции аналогичны функциям, запускаемым HTTP, но они реализуют протокол, который делает их удобными для вызова из клиентского кода.

Информацию об использовании вызываемых функций см. в разделе Вызов функций из вашего приложения в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { https } from "firebase-functions/v1";

export const yourFunctionName = https.onCall(async (data, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      runtime: nodejs16
      httpsTrigger: {}
  - name: anotherFunction
    type: ...

Триггеры запланированных функций

Запланированная функция выполняется неоднократно по настраиваемому расписанию.

См. функции планирования в документации Cloud Functions для получения информации о написании запланированных функций.

Определение функции (только 1-го поколения)

import { pubsub } from "firebase-functions/v1";

export const yourFunctionName = pubsub.schedule("every 6 hours").onRun((context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      scheduleTrigger:
        schedule: 'every 5 minutes'
  - name: anotherFunction
    type: ...

Вот доступные подполя для scheduleTrigger :

Поле Описание
schedule
(необходимый)

Частота, с которой вы хотите, чтобы функция выполнялась.

Это поле может принимать строки, использующие любой синтаксис (требуется заключение в одинарные кавычки ):

timeZone
(необязательный)

Часовой пояс, в котором будет работать расписание.

Если вы хотите, чтобы пользователи могли настраивать расписание при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      scheduleTrigger:
        schedule: ${SCHEDULE_FREQUENCY}
  - name: anotherFunction
    type: ...

params:
  - param: SCHEDULE_FREQUENCY
    label: Schedule
    description: How often do you want to run yourFunctionName()?
    type: string
    default: 'every 5 minutes'  # Specifying a default is optional.
    required: true

Триггеры очереди задач

Функция очереди задач запускается либо при событиях жизненного цикла вашего расширения, либо при добавлении в очередь задач вашего расширения вручную с помощью метода TaskQueue.enqueue() Admin SDK.

См . раздел «Обработка событий жизненного цикла вашего расширения» для получения информации о написании функций, обрабатывающих события жизненного цикла.

Информацию о написании функций очереди задач см. в разделе «Постановка функций в очередь с облачными задачами» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { tasks } from "firebase-functions/v1";

export const yourFunctionName = tasks.taskQueue().onDispatch(async (data, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: myTaskFunction
    type: firebaseextensions.v1beta.function
    description: >-
      Perform a task when triggered by a lifecycle event
    properties:
      taskQueueTrigger: {}

Установите для свойства taskQueueTrigger значение {} или карту параметров, которые настраивают ограничения скорости и поведение повторных попыток очереди задач (см. Настройка очереди задач ).

Если вы хотите запускать свою функцию в событиях жизненного цикла вашего расширения, добавьте записи lifecycleEvents с именем функции и необязательным сообщением обработки, которое будет отображаться в консоли Firebase при начале обработки.

lifecycleEvents:
  onInstall:
    function: myTaskFunction
    processingMessage: Resizing your existing images
  onUpdate:
    function: myOtherTaskFunction
    processingMessage: Setting up your extension
  onConfigure:
    function: myOtherTaskFunction
    processingMessage: Setting up your extension

Analytics

Функция, активируемая Analytics, запускается при регистрации указанного события Analytics.

Информацию о написании функций, запускаемых Analytics, см. в разделе «Триггеры Google Analytics» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { analytics } from "firebase-functions/v1";

export const yourFunctionName = analytics.event("event_name").onLog((event, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.analytics/eventTypes/event.log
        resource: projects/${PROJECT_ID}/events/ga_event
  - name: anotherFunction
    type: ...

Если вы хотите, чтобы пользователи могли настроить событие Analytics для прослушивания при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.analytics/eventTypes/event.log
        resource: projects/${PROJECT_ID}/events/${EVENT_NAME}
  - name: anotherFunction
    type: ...

params:
  - param: EVENT_NAME
    label: Analytics event
    description: What event do you want to respond to?
    type: string
    default: ga_event  # Specifying a default is optional.
    required: true

Authentication

Функция, активируемая аутентификацией, запускается при создании или удалении пользователя.

См. «Триггеры аутентификации Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых авторизацией.

Определение функции (только 1-го поколения)

import { auth } from "firebase-functions/v1";

export const yourFunctionName = auth.user().onCreate((user, context) => {
  // ...
});

export const yourFunctionName2 = auth.user().onDelete((user, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/firebase.auth/eventTypes/user.create
        resource: projects/${PROJECT_ID}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Authentication :

Триггер событий Cloud Functions eventType Описание
onCreate() providers/firebase.auth/eventTypes/user.create Новый пользователь создан
onDelete() providers/firebase.auth/eventTypes/user.delete Пользователь удален

Cloud Firestore

Функция, активируемая Cloud Firestore, запускается при создании, обновлении или удалении документа.

См. «Триггеры Cloud Firestore» в документации Cloud Functions для получения информации о написании функций, запускаемых Firestore.

Определение функции (только 1-го поколения)

import { firestore } from "firebase-functions/v1";

export const yourFunctionName = firestore.document("collection/{doc_id}")
  .onCreate((snapshot, context) => {
    // ...
  });

export const yourFunctionName2 = firestore.document("collection/{doc_id}")
  .onUpdate((change, context) => {
    // ...
  });

export const yourFunctionName3 = firestore.document("collection/{doc_id}")
  .onDelete((snapshot, context) => {
    // ...
  });

export const yourFunctionName4 = firestore.document("collection/{doc_id}")
  .onWrite((change, context) => {
    // onWrite triggers on creation, update, and deletion.
    // ...
  });

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/collection/{documentID}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Cloud Firestore :

Триггер событий Cloud Functions eventType Описание
onCreate() providers/cloud.firestore/eventTypes/document.create Новый документ создан
onDelete() providers/cloud.firestore/eventTypes/document.delete Документ удален.
onUpdate() providers/cloud.firestore/eventTypes/document.update Документ обновлен
onWrite() providers/cloud.firestore/eventTypes/document.write Документ создан, удален или обновлен

Если вы хотите, чтобы пользователи могли настраивать путь к документу при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/cloud.firestore/eventTypes/document.write
        resource: projects/${PROJECT_ID}/databases/(default)/documents/${YOUR_DOCUMENT_PATH}
  - name: anotherFunction
    type: ...

params:
  - param: YOUR_DOCUMENT_PATH
    label: Cloud Firestore path
    description: Where do you want to watch for changes?
    type: string
    default: path/to/{documentID}  # Specifying a default is optional.
    required: true

Pub/Sub

Функция, запускаемая Pub/Sub, запускается, когда сообщение публикуется в определенной теме.

Информацию о написании функций, запускаемых Pub/Sub, см. в разделе «Триггеры Pub/Sub» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { pubsub } from "firebase-functions/v1";

export const yourFunctionName = pubsub.topic("topic_name").onPublish((message, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.pubsub.topic.publish
        resource: projects/${PROJECT_ID}/topics/topic-name
  - name: anotherFunction
    type: ...

Если вы хотите, чтобы пользователи могли настраивать тему Pub/Sub при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.pubsub.topic.publish
        resource: projects/${PROJECT_ID}/topics/${PUBSUB_TOPIC}
  - name: anotherFunction
    type: ...

params:
  - param: PUBSUB_TOPIC
    label: Pub/Sub topic
    description: Which Pub/Sub topic do you want to watch for messages?
    type: string
    default: topic-name  # Specifying a default is optional.
    required: true

Realtime Database

Функция, активируемая базой данных реального времени, запускается, когда создается, обновляется или удаляется путь, соответствующий указанному шаблону.

Информацию о написании функций, запускаемых RTDB, см. в разделе «Триггеры базы данных реального времени » в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { database } from "firebase-functions/v1";

export const yourFunctionName = database.ref("path/to/{item}")
  .onCreate((snapshot, context) => {
    // ...
  });

export const yourFunctionName2 = database.ref("path/to/{item}")
  .onUpdate((change, context) => {
    // ...
  });

export const yourFunctionName3 = database.ref("path/to/{item}")
  .onDelete((snapshot, context) => {
    // ...
  });

export const yourFunctionName4 = database.ref("path/to/{item}")
  .onWrite((change, context) => {
    // onWrite triggers on creation, update, and deletion.
    // ...
  });

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.database/eventTypes/ref.create
        # DATABASE_INSTANCE (project's default instance) is an auto-populated
        # parameter value. You can also specify an instance.
        resource: projects/_/instances/${DATABASE_INSTANCE}/refs/path/to/{itemId}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Cloud Firestore :

Триггер событий Cloud Functions eventType Описание
onCreate() providers/google.firebase.database/eventTypes/ref.create Данные созданы
onDelete() providers/google.firebase.database/eventTypes/ref.delete Данные удалены
onUpdate() providers/google.firebase.database/eventTypes/ref.update Данные обновлены
onWrite() providers/google.firebase.database/eventTypes/ref.write Данные созданы, удалены или обновлены

Если вы хотите, чтобы пользователи могли настраивать путь для просмотра при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: providers/google.firebase.database/eventTypes/ref.create
        # DATABASE_INSTANCE (project's default instance) is an auto-populated
        # parameter value. You can also specify an instance.
        resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${DB_PATH}
  - name: anotherFunction
    type: ...

params:
  - param: DB_PATH
    label: Realtime Database path
    description: Where do you want to watch for changes?
    type: string
    default: path/to/{itemId}  # Specifying a default is optional.
    required: true

Remote Config

Функция, активируемая Remote Config, запускается при обновлении шаблона параметров проекта.

См. триггеры Remote Config в документации Cloud Functions для получения информации о написании функций, запускаемых Remote Config.

Определение функции (только 1-го поколения)

import { remoteConfig } from "firebase-functions/v1";

export const yourFunctionName = remoteConfig.onUpdate((version, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.firebase.remoteconfig.update
        resource: projects/${PROJECT_ID}
  - name: anotherFunction
    type: ...

Cloud Storage

Функция, активируемая Cloud Storage, запускается при создании, архивировании или удалении объекта, а также при изменении его метаданных.

Информацию о написании функций, запускаемых хранилищем, см. в разделе «Триггеры облачного хранилища» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { storage } from "firebase-functions/v1";

export const yourFunctionName = storage.object().onFinalize((object, context) => {
  // ...
});

export const yourFunctionName2 = storage.object().onMetadataUpdate((object, context) => {
  // ...
});

export const yourFunctionName3 = storage.object().onArchive((object, context) => {
  // ...
});

export const yourFunctionName4 = storage.object().onDelete((object, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.storage.object.finalize
        # STORAGE_BUCKET (project's default bucket) is an auto-populated
        # parameter. You can also specify a bucket.
        resource: projects/_/buckets/${STORAGE_BUCKET}
  - name: anotherFunction
    type: ...

В следующей таблице показано, как указать каждый из поддерживаемых типов событий Cloud Storage :

Триггер событий Cloud Functions eventType Описание
onFinalize() google.storage.object.finalize Объект создан
onMetadataUpdate() google.storage.object.metadataUpdate Метаданные объекта обновлены.
onArchive() google.storage.object.archive Объект был заархивирован
onDelete() google.storage.object.delete Объект удален

Если вы хотите, чтобы пользователи могли настраивать сегмент хранилища при установке вашего расширения, добавьте новый параметр в файл extension.yaml и укажите ссылку на этот параметр в объявлении resource вашей функции:

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.storage.object.finalize
        resource: projects/_/buckets/${YOUR_BUCKET}
  - name: anotherFunction
    type: ...

params:
  - param: YOUR_BUCKET
    label: Cloud Storage bucket
    description: Which bucket do you want to watch for changes?
    type: selectResource
    resourceType: storage.googleapis.com/Bucket
    default: ${STORAGE_BUCKET}  # Specifying a default is optional.
    required: true

Test Lab

Функция, запускаемая тестовой лабораторией, запускается, когда тестовая матрица завершает свои тесты.

Информацию о написании функций, запускаемых Test Lab, см. в разделе «Триггеры Firebase Test Lab» в документации Cloud Functions .

Определение функции (только 1-го поколения)

import { testLab } from "firebase-functions/v1";

export const yourFunctionName = testLab.testMatrix().onComplete((matrix, context) => {
  // ...
});

Объявление ресурса (расширение.yaml)

resources:
  - name: yourFunctionName
    type: firebaseextensions.v1beta.function
    properties:
      eventTrigger:
        eventType: google.testing.testMatrix.complete
        resource: projects/${PROJECT_ID}/testMatrices/{matrixId}
  - name: anotherFunction
    type: ...

Триггеры оповещений Crashlytics

Функция, запускаемая Crashlytics запускается, когда Crashlytics публикует оповещение.

См. «Триггеры оповещений Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых оповещениями.

Определение функции (только 2-го поколения)

import {
  onNewFatalIssuePublished,
  onNewNonfatalIssuePublished,
  onNewAnrIssuePublished,
  onRegressionAlertPublished,
  onVelocityAlertPublished,
  onStabilityDigestPublished,
} from "firebase-functions/v2/alerts/crashlytics";

export const yourFunctionName = onNewFatalIssuePublished((event) => {
  // ...
});

export const yourFunctionName2 = onNewNonfatalIssuePublished((event) => {
  // ...
});

export const yourFunctionName3 = onNewAnrIssuePublished((event) => {
  // ...
});

export const yourFunctionName4 = onRegressionAlertPublished((event) => {
  // ...
});

export const yourFunctionName5 = onVelocityAlertPublished((event) => {
  // ...
});

export const yourFunctionName6 = onStabilityDigestPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: crashlytics.newFatalIssue
  - name: anotherFunction
    type: ...

Вы можете использовать следующие значения для alerttype

  • crashlytics.newFatalIssue
  • crashlytics.newNonfatalIssue
  • crashlytics.regression
  • crashlytics.stabilityDigest
  • crashlytics.velocity
  • crashlytics.newAnrIssue

Триггеры оповещений Performance Monitoring

Функция, активируемая Performance Monitoring , запускается, когда Performance Monitoring публикует предупреждение.

См. «Триггеры оповещений Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых оповещениями.

Определение функции (только 2-го поколения)

import { onThresholdAlertPublished } from "firebase-functions/v2/alerts/performance";

export const yourFunctionName = onThresholdAlertPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: performance.threshold
  - name: anotherFunction
    type: ...

Триггеры оповещений App Distribution

Функция, активируемая App Distribution запускается, когда App Distribution публикует оповещение.

См. «Триггеры оповещений Firebase» в документации Cloud Functions для получения информации о написании функций, запускаемых оповещениями.

Определение функции (только 2-го поколения)

import {
  onNewTesterIosDevicePublished,
  onInAppFeedbackPublished
} from "firebase-functions/v2/alerts/appDistribution";

export const yourFunctionName = onNewTesterIosDevicePublished((event) => {
  // ...
});

export const yourFunctionName2 = onInAppFeedbackPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
      eventTrigger:
        eventType: google.firebase.firebasealerts.alerts.v1.published
        triggerRegion: global
        eventFilters:
          - attribute: alerttype
            value: appDistribution.inAppFeedback
  - name: anotherFunction
    type: ...

Вы можете использовать следующие значения для alerttype

  • appDistribution.newTesterIosDevice
  • appDistribution.inAppFeedback

Пользовательские триггеры событий (Eventarc)

Функция, запускаемая Eventarc, запускается, когда событие определенного типа публикуется в определенном канале.

Информацию о написании функций, запускаемых Eventarc, см. в разделе Создание и обработка пользовательских триггеров событий в документации Cloud Functions

Вы также можете публиковать события из своих расширений, чтобы дать пользователям возможность вставлять в ваше расширение собственную логику. См. раздел Использование пользовательской логики, предоставленной разработчиком, в расширении .

Определение функции (только 2-го поколения)

import { onCustomEventPublished } from "firebase-functions/v2/eventarc";

export const yourFunctionName = onCustomEventPublished((event) => {
  // ...
});

Объявление ресурса (расширение.yaml)

apis:
  - apiName: eventarc.googleapis.com
    reason: Powers all events and triggers
  - apiName: run.googleapis.com
    reason: Powers 2nd-gen functions

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      # LOCATION is a user-configured parameter value specified by the user
      # during installation.
      location: ${param:LOCATION}
      buildConfig:
        runtime: nodejs16
      serviceConfig:
        availableMemory: 512M
        timeoutSeconds: 60
      eventTrigger:
        eventType: firebase.extensions.storage-resize-images.v1.complete
        channel: projects/${param:PROJECT_ID}/locations/us-central1/channels/firebase
  - name: anotherFunction
    type: ...

Канал должен уже существовать на момент установки вашего расширения. Например, если вы зависите от пользовательских событий другого расширения, создающего канал, попросите пользователей сначала установить это расширение.

В приведенном выше примере будет создан пользовательский триггер событий для канала Firebase по умолчанию в регионе us-central1 . Вы можете настроить имя канала и регион с помощью параметров. Например:


params:
  - param: EVENTARC_CHANNEL_NAME
    label: Eventarc channel name
    description: What is the name of the Eventarc channel.
    default: firebase
    type: string
    required: true

resources:
  - name: yourfunctionname
    type: firebaseextensions.v1beta.v2function
    properties:
      location: ${param:LOCATION}
      eventTrigger:
        eventType: firebase.extensions.storage-resize-images.v1.complete
        channel: projects/${param:PROJECT_ID}/locations/${param:LOCATION}/channels/${param:EVENTARC_CHANNEL_NAME}