Özel etkinlik tetikleyicileri oluşturma ve işleme

Cloud Functions (2. nesil) ile, özel etkinlikler başlıklı makaleyi inceleyin. Bunlar, aşağıda listelenen özel veya ek etkinlik sağlayıcıları tarafından sağlanan etkinliklerdir: Ancak Cloud Functions için Firebase SDK'sı tarafından yerel olarak desteklenen Firebase etkinlikleri. Uygulamanız, özel etkinlik tetikleyicileri aracılığıyla Firebase Extensions veya kendi özel düzenlemenizi yayınlayabilirsiniz bunlara yanıt olarak etkinlikleri tetikleyebilir.

Tüm özel etkinlikler CloudEvents JSON etkinlik biçimine uygundur ve Eventarc adresinde yayınlanır. Eventarc. kullanım ücreti uygulanır.

İşlevleri özel etkinliklerle tetikleme

Özel etkinlikler yayınlayabilir (veya Firebase uzantılarından etkinlikleri alabilirsiniz) ve şu temel akışı uygulayarak işlevleri bu etkinliklere yanıt olarak tetikleyin:

  1. İstediğiniz etkinlikleri bir Eventarc kanalında yayınlayın veya yüklediğiniz bir uzantı tarafından sağlanan mevcut etkinlikleri tanımlayın.
  2. Fonksiyon kodunuzda, olduğunu unutmayın.
  3. Fonksiyonda, CloudEvent nesnesini tanımlayın ve uygulamanızın gerektirdiği özel mantığı gerçekleştirin.

Örneğin, bir oyun uygulaması giriş yapan kullanıcılara bildirim göndermek isteyebilir veya en iyi on rakibin skor tablosundan ayrılabilirsiniz. Bu uygulama, liderlik tablosu etkinliklerini varsayılan kanalda yayınlayabilir ve ardından etkinliği, kullanıcılara hedefli push bildirimleri gönderen bir işlevde işleyebilir.

Başka bir örnekte, uygulamaların büyük resimleri işlemesine yardımcı olmak için tasarlanmış bir uzantı, resim yeniden boyutlandırma işlemi tamamlandığında bir etkinlik yayınlayabilir. Bu uzantının yüklü olduğu uygulamalar tamamlama etkinliğini, uygulamadaki bağlantıları güncelleyerek yeniden boyutlandırabilirsiniz.

Kanalda etkinlik yayınlama

Eventarc etkinlikleri kanallar kapsamındaki tüm kanalları kapsar. Kanallar, ilgili etkinlikleri gruplandırmanın ve erişim izinlerini yönetmenin bir yoludur. Bir uzantı yüklediğinizde veya özel etkinlikler kullanan bir işlev dağıttığınızda Firebase, us-central1 bölgesinde otomatik olarak firebase adlı bir varsayılan kanal oluşturur. Firebase Admin SDK, Kanallarda yayınlama için bir eventarc alt paketi.

Bir etkinliği güvenilir bir sunucudan (veya başka bir işlevden) varsayılan kanal:

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, varsayılan kanalı otomatik olarak oluşturmanın yanı sıra etkinliğin kaynağını belirten EVENTARC_CLOUD_EVENT_SOURCE ortam değişkenini de ayarlar. Cloud Functions for Firebase dışında etkinlik yayınlıyorsanız etkinlik yükünüze source alanını açıkça eklemeniz gerekir.

Özel etkinlikleri işleme

Uzantıların etkinlikleri dahil tüm özel etkinlikleri onCustomEventPublished veya on_custom_event_published işleyicileriyle işleyebilirsiniz. Öncelikle bu işleyiciyi Eventarc SDK'sından aşağıdakilerle birlikte içe aktarın:Firebase Admin SDK

Node.js

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

Python

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

İşlev kodunuzda, örnek işlevde gösterildiği gibi etkinlik adını iletin:

Node.js

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

Python

@eventarc_fn.on_custom_event_published(
    event_type="firebase.extensions.storage-resize-images.v1.complete")
def onimageresized(event: eventarc_fn.CloudEvent) -> None:
    print("Received image resize completed event: ", event.type)

    if not isinstance(event.subject, str):
        print("No 'subject' data.")
        return

    # For example, write resized image details into Firestore.
    firestore_client: google.cloud.firestore.Client = firestore.client()
    collection = firestore_client.collection("images")
    doc = collection.document(event.subject.replace("/", "_"))  # original file path
    doc.set(event.data)  # resized images paths and sizes

Her bir uzantı için, etkinlik nesnesinde döndürülen yük uygulama akışınız için özel mantık gerçekleştirmek üzere kullanabileceğiniz veriler. Bu durumda işlev, yeniden boyutlandırılmış resimle ilgili meta verileri Cloud Firestore içindeki bir koleksiyona kopyalamak için Admin SDK'ü kullanır. İşlev, dosya adını etkinlik tarafından sağlanan subject öğesinden alır ve meta verileri etkinlik tarafından sağlanan data öğesinden kaydeder.

Varsayılan olmayan kanallardaki etkinlikleri yayınlama ve işleme

Özel kanallar, özel izin gereksinimlerinizin olduğu durumlarda yararlı olabilir veya diğer gereksinimleri karşılayabilecek, aynı seviyede görünürlük ve erişim . "Google Cloud Platform'u" kullanarak kendi kanallarınızı Google Cloud konsolunuza giriş yapın. Etkinliklerin yayınlanması ve etkinliklere abone olunması aynı kanalda yapılmalıdır.

Özel bir etkinliğin varsayılan olmayan bir kanalda yayınlandığı durumlarda işlev kodunuzda kanalı belirtmeniz gerekir. Örneğin, için varsayılan olmayan bir kanalda yayınlanan etkinlikleri us-west1 konumu; kanalı şu şekilde belirtmeniz gerekir:

Node.js

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

Python

@eventarc_fn.on_custom_event_published(
    event_type="firebase.extensions.storage-resize-images.v1.complete",
    channel="locations/us-west1/channels/firebase",
    region="us-west1")
def onimageresizedwest(event: eventarc_fn.CloudEvent) -> None:
    print("Received image resize completed event: ", event.type)
    # ...