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

Cloud Functions (दूसरी जनरेशन) की मदद से, कस्टम इवेंट के जवाब में फ़ंक्शन ट्रिगर किए जा सकते हैं. ये इवेंट, खास या अतिरिक्त इवेंट प्रोवाइडर उपलब्ध कराते हैं. ये Firebase के लिए Cloud Functions 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)
    # ...