Özel etkinlik tetikleyicileri oluşturma ve işleme

Cloud Functions (2. nesil) ile, özelleştirilmiş etkinlikler ile ilgili daha fazla bilgi edinin. Bunlar, aşağıda listelenen özel veya ek etkinlik sağlayıcıları tarafından sağlanan etkinliklerdir: Cloud Functions için Firebase SDK'sı tarafından yerel olarak desteklenen Firebase etkinliklerine karşılık gelir. Uygulamanız, özel etkinlik tetikleyicileri aracılığıyla veya kendi özel uzantınızı yayımlayabilirsiniz bunlara yanıt olarak etkinlikleri tetikleyebilir.

Tüm özel etkinlikler CloudEvents JSON etkinlik biçimi ve Eventarc'ta yayınlanır. Olay arkı kullanım ücreti geçerlidir.

İş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. İstenen etkinlikleri bir Eventarc kanalında yayınlayın veya mevcut olanları belirleyin Etkinlikleri içeren etkinlikler (ör. yüklediğiniz bir uzantı)
  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 yayınlayabilir varsayılan kanala ekleyebilirsiniz. Ardından, bu etkinliği işlevi görür.

Başka bir Örneğin, uygulamaların büyük resimleri işlemesine yardımcı olmak için tasarlanmış bir uzantı, etkinliği sona erecektir. 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şimi yönetmenin bir yoludur izin verir. Bir uzantı yüklediğinizde veya özel etkinlikler için Firebase tarafından otomatik olarak us-central1 bölgesinde firebase. Firebase Admin SDK, Kanallarda yayınlanmak için bir eventarc alt paketi içerir.

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 kaynağı belirten bir değer içeren EVENTARC_CLOUD_EVENT_SOURCE ortam değişkeni bu etkinlikten bahsedeceğiz. 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 de dahil olmak üzere tüm özel etkinlikleri onCustomEventPublished veya on_custom_event_published işleyicileri tarafından desteklenmektedir. İlk olarak, bu işleyiciyi Firebase Yönetici SDK'sı:

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, etkinlik adını örnek işlevde gösterildiği gibi 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. Burada bu durumda işlev, yeniden boyutlandırılan öğe hakkındaki meta verileri kopyalamak için Yönetici SDK'sini resmi Cloud Firestore'daki bir koleksiyona kopyalayarak dosya adını subject etkinlik tarafından sağlandı ve data kaynağındaki meta veriler kaydediliyor bu etkinliği takip edebilirsiniz.

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. Etkinlik yayınlama ve etkinliklere abone olma aynı kanalda yapılmalıdır.

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