Özel etkinlik tetikleyicileri oluşturma ve işleme

Cloud Functions (2. nesil) ile özel etkinliklere yanıt olarak işlevleri tetikleyebilirsiniz. Bunlar, Firebase SDK'sı tarafından yerel olarak desteklenen Firebase etkinliklerinin aksine, özel veya ek etkinlik sağlayıcılar tarafından sağlanan etkinliklerdir.Cloud Functions Uygulamanız, özel etkinlik tetikleyicileri aracılığıyla Firebase Extensions tarafından sağlanan etkinliklere yanıt verebilir veya kendi özel etkinliklerinizi yayınlayıp bunlara yanıt olarak işlevleri tetikleyebilirsiniz.

Tüm özel etkinlikler, CloudEvents JSON etkinlik biçimine uygundur ve Eventarc'e yayınlanır. Eventarc Kullanım ücretleri geçerlidir.

Özel etkinliklerle işlevleri tetikleme

Bu temel akışı uygulayarak özel etkinlikler yayınlayabilir (veya Firebase uzantılarından etkinlikler alabilir) ve bu etkinliklere yanıt olarak işlevleri tetikleyebilirsiniz:

  1. İstediğiniz etkinlikleri bir Eventarc kanalında yayınlayın veya yüklediğiniz bir uzantının sağladığı kullanılabilir etkinlikleri belirleyin.
  2. İşlev kodunuzda, Eventarc kanalındaki etkinliklere bir etkinlik işleyiciyle abone olun.
  3. İşlevde, CloudEvent nesnesinde döndürülen yükü ayrıştırın ve uygulamanızın gerektirdiği özel mantığı uygulayın.

Örneğin, bir oyun uygulaması, ilk on rakibin skor tablosuna giren veya bu tablodan çıkan kullanıcılara bildirim göndermek isteyebilir. Bu uygulama, varsayılan kanalda skor tablosu etkinlikleri yayınlayabilir ve ardından etkinliği, kullanıcılara hedeflenmiş 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, uygulamadaki bağlantıları güncelleyerek resmi yeniden boyutlandırılmış sürümlere yönlendirebilir ve tamamlama etkinliğini işleyebilir.

Kanala etkinlik yayınlama

Eventarc etkinlikleri kanallarda yayınlanır. Kanallar, ilgili etkinlikleri gruplandırmanın ve erişim izinlerini yönetmenin bir yoludur. Özel etkinlikleri kullanan bir uzantı yüklediğinizde veya işlev dağıttığınızda Firebase, us-central1 bölgesinde firebase adlı varsayılan bir kanal oluşturur. Firebase Admin SDK, kanallarda yayınlama için eventarc alt paketi sağlar.

Varsayılan kanalı kullanarak güvenilir bir sunucudan (veya başka bir işlevden) etkinlik yayınlamak için:

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ı etkinlikleri de dahil olmak üzere tüm özel etkinlikleri onCustomEventPublished veya on_custom_event_published işleyicileriyle yönetebilirsiniz. Öncelikle bu işleyiciyi Firebase Admin SDK ile birlikte Eventarc SDK'sından içe aktarın:

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ızda özel mantık yürütmek için kullanabileceğiniz veriler sağlar. Bu durumda işlev, yeniden boyutlandırılan resimle ilgili meta verileri Admin SDK kullanarak Cloud Firestore içindeki bir koleksiyona kopyalar, dosya adını etkinlik tarafından sağlanan subject'dan alır ve etkinlik tarafından sağlanan data'daki meta verileri kaydeder.

Varsayılan olmayan kanallarda etkinlik yayınlama ve yönetme

Özel kanallar, özel izin ihtiyaçlarınızın veya diğer gereksinimlerinizin olduğu ve tüm etkinlikler için aynı düzeyde görünürlük ve erişim istemediğiniz durumlarda faydalı olabilir. Google Cloud Console'u kullanarak kendi kanallarınızı oluşturabilirsiniz. Etkinliklerin yayınlanması ve etkinliklere abone olunması aynı kanalda yapılmalıdır.

Özel bir etkinlik varsayılan olmayan bir kanalda yayınlandığında, işlev kodunuzda kanalı belirtmeniz gerekir. Örneğin, us-west1 konumu için varsayılan olmayan bir kanalda yayınlanan etkinlikleri işlemek istiyorsanız kanalı gösterildiği gibi 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)
    # ...