Özel etkinlik tetikleyicileri oluşturma ve işleme

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

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

Özel etkinliklerle tetikleme işlevleri

Aşağıdaki temel akışı uygulayarak özel etkinlikler yayınlayabilir (veya Firebase uzantılarından etkinlik elde edebilir) ve bu etkinliklere yanıt olarak işlevleri tetikleyebilirsiniz:

  1. İstenen etkinlikleri bir Eventarc kanalına yayınlayın veya yüklediğiniz bir uzantının sağladığı mevcut etkinlikleri belirleyin.
  2. İşlev kodunuzda, Eventarc kanalındaki etkinliklere bir etkinlik işleyici ile 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 girdiklerinde veya skor tablosundan ayrılan kullanıcılara bildirim göndermek isteyebilir. Bu uygulama, skor tablosu etkinliklerini varsayılan kanalda yayınlayabilir ve daha sonra bu 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ırmanın tamamlanmasıyla birlikte bir etkinlik başlatabilir. Bu uzantının yüklü olduğu uygulamalar, uygulamadaki bağlantıları resmin yeniden boyutlandırılan sürümlerine işaret edecek şekilde güncelleyerek tamamlama etkinliğini işleyebilir.

Kanalda etkinlik yayınlama

Eventarc etkinlikleri kanallarda yayınlanır. Kanallar, ilgili etkinlikleri gruplandırmanın ve erişim izinlerini yönetmenin bir yoludur. Bir uzantı yüklediğinizde veya özel etkinlikleri 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, kanallara yayınlama için bir 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 ayarlar. Cloud Functions for Firebase dışında etkinlik yayınlıyorsanız source alanını etkinlik yükünüze açıkça eklemeniz gerekir.

Özel etkinlikleri işleme

Uzantı etkinlikleri dahil, tüm özel etkinlikleri onCustomEventPublished veya on_custom_event_published işleyicileriyle işleyebilirsiniz. İlk olarak, bu işleyiciyi Firebase Admin SDK ile birlikte Eventarc SDK'dan 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 gerçekleştirmek için kullanabileceğiniz veriler sağlar. Bu durumda işlev, Yönetici SDK'sını kullanarak yeniden boyutlandırılan resimle ilgili meta verileri Cloud Firestore'daki bir koleksiyona kopyalar. Etkinlik tarafından sağlanan subject öğesinden dosya adını alır ve etkinlik tarafından sağlanan data öğesinden meta verileri kaydeder.

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

Özel kanallar, özel izin gereksinimleriniz veya başka gereksinimleriniz olduğu ve tüm etkinlikler için aynı görünürlük ve erişim düzeyini istemediğiniz durumlarda yararlı olabilir. Google Cloud Console'u kullanarak kendi kanallarınızı oluşturabilirsiniz. Etkinlikler için yayınlama ve abone olma işlemleri 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, us-west1 konumu için varsayılan olmayan bir kanalda yayınlanan etkinlikleri işlemek istiyorsanız kanalı aşağıda 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)
    # ...