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

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