कस्टम इवेंट ट्रिगर बनाना और उन्हें मैनेज करना

Cloud Functions (दूसरी जनरेशन) की मदद से, कस्टम इवेंट के जवाब में फ़ंक्शन ट्रिगर किए जा सकते हैं. ये इवेंट, खास या अतिरिक्त इवेंट उपलब्ध कराने वाली कंपनियों से मिलते हैं. ये Cloud Functions के लिए Firebase SDK टूल के साथ काम करने वाले Firebase इवेंट के बजाय होते हैं. कस्टम इवेंट ट्रिगर की मदद से, आपका ऐप्लिकेशन Firebase Extensions से मिले इवेंट का जवाब दे सकता है. इसके अलावा, आपके पास अपने कस्टम इवेंट पब्लिश करने और उनके जवाब में फ़ंक्शन ट्रिगर करने का विकल्प भी होता है.

सभी कस्टम इवेंट, CloudEvents JSON इवेंट फ़ॉर्मैट के मुताबिक होते हैं और Eventarc पर पब्लिश किए जाते हैं. Eventarc इस्तेमाल के लिए शुल्क लागू होते हैं.

कस्टम इवेंट की मदद से फ़ंक्शन ट्रिगर करना

इस बुनियादी फ़्लो को लागू करके, कस्टम इवेंट पब्लिश किए जा सकते हैं (या Firebase एक्सटेंशन से इवेंट पाए जा सकते हैं) और उन इवेंट के जवाब में फ़ंक्शन ट्रिगर किए जा सकते हैं:

  1. अपनी पसंद के इवेंट को Eventarc चैनल पर पब्लिश करें या इंस्टॉल किए गए एक्सटेंशन से उपलब्ध इवेंट की पहचान करें.
  2. अपने फ़ंक्शन कोड में, इवेंट हैंडलर की मदद से Eventarc चैनल पर इवेंट की सदस्यता लें.
  3. फ़ंक्शन में, CloudEvent ऑब्जेक्ट में दिखाए गए पेलोड को पार्स करें और अपने ऐप्लिकेशन के लिए ज़रूरी कस्टम लॉजिक लागू करें.

उदाहरण के लिए, कोई गेम ऐप्लिकेशन, उपयोगकर्ताओं को सूचनाएं भेज सकता है, जब वे शीर्ष 10 प्रतियोगियों के लीडरबोर्ड में शामिल हों या उससे बाहर निकलें. यह ऐप्लिकेशन, लीडरबोर्ड के इवेंट को डिफ़ॉल्ट चैनल पर पब्लिश कर सकता है. इसके बाद, इवेंट को ऐसे फ़ंक्शन में मैनेज कर सकता है जो उपयोगकर्ताओं को टारगेट किए गए पुश नोटिफ़िकेशन भेजता है.

एक और उदाहरण के लिए, ऐप्लिकेशन को बड़ी इमेज प्रोसेस करने में मदद करने के लिए डिज़ाइन किया गया एक्सटेंशन, इमेज का साइज़ बदलने के बाद इवेंट उत्सर्जित कर सकता है. जिन ऐप्लिकेशन में यह एक्सटेंशन इंस्टॉल है, वे इमेज के साइज़ वाले वर्शन पर ले जाने के लिए, ऐप्लिकेशन में लिंक अपडेट करके, इवेंट पूरा होने की प्रोसेस को मैनेज कर सकते हैं.

किसी चैनल पर इवेंट पब्लिश करना

Eventarc इवेंट, चैनल में पब्लिश किए जाते हैं. चैनल, मिलते-जुलते इवेंट को ग्रुप करने और ऐक्सेस की अनुमतियों को मैनेज करने का एक तरीका है. जब कोई ऐसा एक्सटेंशन इंस्टॉल किया जाता है या कोई ऐसा फ़ंक्शन डिप्लॉय किया जाता है जो कस्टम इवेंट का इस्तेमाल करता है, तो Firebase अपने-आप us-central1 क्षेत्र में firebase नाम का डिफ़ॉल्ट चैनल बना देता है. Firebase Admin SDK, चैनलों पर पब्लिश करने के लिए eventarc सबपैकेज उपलब्ध कराता है.

डिफ़ॉल्ट चैनल का इस्तेमाल करके, किसी भरोसेमंद सर्वर (या किसी दूसरे फ़ंक्शन) से इवेंट पब्लिश करने के लिए:

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, एनवायरमेंट वैरिएबल EVENTARC_CLOUD_EVENT_SOURCE को सेट करता है. इससे इवेंट का सोर्स पता चलता है. अगर Cloud Functions for Firebase के बाहर इवेंट पब्लिश किए जा रहे हैं, तो आपको अपने इवेंट पेलोड में source फ़ील्ड को साफ़ तौर पर जोड़ना होगा.

कस्टम इवेंट मैनेज करना

onCustomEventPublished या on_custom_event_published हैंडलर की मदद से, एक्सटेंशन इवेंट के साथ-साथ सभी कस्टम इवेंट मैनेज किए जा सकते हैं. सबसे पहले, Eventarc SDK टूल से इस हैंडलर को 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

अपने फ़ंक्शन कोड में, इवेंट का नाम डालें. उदाहरण के लिए, फ़ंक्शन कोड में इवेंट का नाम इस तरह डालें:

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

हर खास एक्सटेंशन के लिए, इवेंट ऑब्जेक्ट में लौटाया गया पेलोड ऐसा डेटा उपलब्ध कराता है जिसका इस्तेमाल करके अपने ऐप्लिकेशन फ़्लो के लिए, कस्टम लॉजिक किया जा सकता है. इस मामले में, फ़ंक्शन Admin SDK का इस्तेमाल करके, बदली गई इमेज का मेटाडेटा Cloud Firestore में मौजूद कलेक्शन में कॉपी करता है. साथ ही, इवेंट से मिले subject से फ़ाइल का नाम और data से मेटाडेटा पाता है.

डिफ़ॉल्ट चैनलों के अलावा, दूसरे चैनलों पर इवेंट पब्लिश करना और उन्हें मैनेज करना

कस्टम चैनल उन मामलों में काम के हो सकते हैं जहां आपको खास अनुमति या अन्य ज़रूरतें होती हैं. साथ ही, आपको सभी इवेंट के लिए एक जैसी पहुंच और दिखने की सुविधा नहीं चाहिए. Google Cloud Console का इस्तेमाल करके, अपने चैनल बनाए जा सकते हैं. इवेंट पब्लिश करने और उनकी सदस्यता लेने की प्रोसेस एक ही चैनल पर होनी चाहिए.

अगर कोई कस्टम इवेंट, डिफ़ॉल्ट चैनल के अलावा किसी दूसरे चैनल पर पब्लिश किया जाता है, तो आपको अपने फ़ंक्शन कोड में चैनल की जानकारी देनी होगी. उदाहरण के लिए, अगर आपको us-west1 जगह के लिए, डिफ़ॉल्ट चैनल के अलावा किसी दूसरे चैनल में पब्लिश किए गए इवेंट मैनेज करने हैं, तो आपको चैनल की जानकारी इस तरह देनी होगी:

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)
    # ...