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

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