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

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

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

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

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

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

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

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

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

Eventarc इवेंट, चैनल में पब्लिश किए जाते हैं. चैनलों की मदद से, मिलते-जुलते इवेंट को ग्रुप किया जा सकता है. साथ ही, ऐक्सेस की अनुमतियां मैनेज की जा सकती हैं. जब कोई एक्सटेंशन इंस्टॉल किया जाता है या कस्टम इवेंट का इस्तेमाल करने वाला फ़ंक्शन डिप्लॉय किया जाता है, तो Firebase अपने-आप us-central1 इलाके में firebase नाम का एक डिफ़ॉल्ट चैनल बना देता है. Firebase एडमिन 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 सेट करता है. अगर 'Firebase के लिए Cloud Functions' के बाहर, इवेंट पब्लिश किए जा रहे हैं, तो आपको अपने इवेंट पेलोड में साफ़ तौर पर source फ़ील्ड जोड़ना होगा.

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

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

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

ऐसे चैनल जो डिफ़ॉल्ट के तौर पर सेट नहीं हैं उन पर इवेंट पब्लिश और मैनेज करना

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

अगर कस्टम इवेंट किसी ऐसे चैनल पर पब्लिश किया गया है जो डिफ़ॉल्ट नहीं है, तो आपको अपने फ़ंक्शन कोड में चैनल की जानकारी देनी होगी. उदाहरण के लिए, अगर आपको ऐसे इवेंट मैनेज करने हैं जो 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)
    # ...