Özel olay tetikleyicileri oluşturun ve yönetin

Cloud Functions (2. nesil) ile, özel olaylara yanıt olarak işlevleri tetikleyebilirsiniz. Bunlar, Firebase SDK for Cloud Functions 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 olaylar CloudEvents JSON olay formatına uygundur ve Eventarc'ta yayınlanır. Eventarc kullanım ücretleri uygulanır.

Özel etkinliklerle işlevleri tetikleyin

Bu temel akışı uygulayarak özel etkinlikler yayınlayabilir (veya Firebase uzantılarından etkinlik alabilirsiniz) 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ı tarafından sağlanan mevcut etkinlikleri tanımlayın.
  2. İşlev kodunuzda, bir olay işleyiciyle Eventarc kanalındaki olaylara abone olun.
  3. İşlevde, CloudEvent nesnesinde döndürülen yükü ayrıştırın ve uygulamanızın gerektirdiği özel mantığı gerçekleştirin.

Örneğin bir oyun uygulaması, kullanıcılara ilk on rakibin liderlik tablosuna girerken veya çıkarken bildirim göndermek isteyebilir. Bu uygulama, skor tablosu etkinliklerini varsayılan kanalda yayınlayabilir ve ardından etkinliği, kullanıcılara hedeflenen anlık bildirimler gönderen bir işlevde işleyebilir.

Başka bir örnekte, uygulamaların büyük görselleri işlemesine yardımcı olmak için tasarlanmış bir uzantı, görsel yeniden boyutlandırma tamamlandığında bir etkinlik yayınlayabilir. Bu uzantının yüklü olduğu uygulamalar, uygulamadaki bağlantıları görüntünün yeniden boyutlandırılmış sürümlerine işaret edecek şekilde güncelleyerek tamamlama olayını gerçekleştirebilir.

Bir etkinliği bir kanalda 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 olayları kullanan bir işlevi dağıttığınızda, Firebase us-central1 bölgesinde otomatik olarak firebase adında varsayılan bir kanal oluşturur. Firebase Admin SDK, kanallara yayınlamak için bir eventarc alt paketi sağlar.

Varsayılan kanalı kullanarak güvenilir bir sunucudan (veya başka bir işlevden) bir etkinliği 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, olayın kaynağını belirten EVENTARC_CLOUD_EVENT_SOURCE ortam değişkenini de ayarlar. Etkinlikleri Cloud Functions for Firebase dışında yayınlıyorsanız source alanını etkinlik yükünüze açıkça eklemeniz gerekir.

Özel etkinlikleri yönetin

Uzantı olayları dahil tüm özel olayları onCustomEventPublished veya on_custom_event_published işleyicileriyle işleyebilirsiniz. Ö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ı girin:

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, olay nesnesinde döndürülen veri, uygulama akışınız için özel mantık gerçekleştirmek amacıyla kullanabileceğiniz verileri sağlar. Bu durumda işlev, yeniden boyutlandırılan görüntüyle ilgili meta verileri Cloud Firestore'daki bir koleksiyona kopyalamak, dosya adını etkinlik tarafından sağlanan subject almak ve meta verileri etkinlik tarafından sağlanan data kaydetmek için Yönetici SDK'sını kullanır.

Varsayılan olmayan kanallardaki etkinlikleri yayınlayın ve yönetin

Özel izinlere veya diğer gereksinimlere sahip olduğunuz ve tüm etkinlikler için aynı düzeyde görünürlük ve erişim istemediğiniz durumlarda özel kanallar yararlı olabilir. Google Cloud konsolunu kullanarak kendi kanallarınızı oluşturabilirsiniz. Etkinliklerin yayınlanması ve abone olunması aynı kanal üzerinden yapılmalıdır.

Özel bir etkinliğin varsayılan olmayan bir kanalda yayınlandığı durumlarda kanalı işlev kodunuzda 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)
    # ...