Cloud Functions (दूसरी पीढ़ी) की मदद से, कस्टम इवेंट के जवाब में फ़ंक्शन ट्रिगर किए जा सकते हैं. ये इवेंट, खास या अतिरिक्त इवेंट प्रोवाइडर उपलब्ध कराते हैं. ये Firebase SDK for Cloud Functions के ज़रिए, Firebase के इवेंट के तौर पर उपलब्ध नहीं होते. कस्टम इवेंट ट्रिगर की मदद से, आपका ऐप्लिकेशन Firebase Extensions से मिले इवेंट के जवाब में काम कर सकता है. इसके अलावा, अपने कस्टम इवेंट पब्लिश किए जा सकते हैं और उनके जवाब में फ़ंक्शन ट्रिगर किए जा सकते हैं.
सभी कस्टम इवेंट, CloudEvents JSON इवेंट फ़ॉर्मैट के मुताबिक होते हैं और इन्हें Eventarcपर पब्लिश किया जाता है. Eventarc इस्तेमाल पर शुल्क लागू होते हैं.
कस्टम इवेंट की मदद से फ़ंक्शन ट्रिगर करना
कस्टम इवेंट पब्लिश किए जा सकते हैं या Firebase एक्सटेंशन से इवेंट हासिल किए जा सकते हैं. साथ ही, इस बुनियादी फ़्लो को लागू करके, इन इवेंट के जवाब में फ़ंक्शन ट्रिगर किए जा सकते हैं:
- Eventarc चैनल पर, अपने हिसाब से इवेंट पब्लिश करें. इसके अलावा, इंस्टॉल किए गए एक्सटेंशन से उपलब्ध इवेंट की पहचान करें.
- अपने फ़ंक्शन कोड में, इवेंट हैंडलर की मदद से Eventarc चैनल पर इवेंट के लिए सदस्यता लें.
- फ़ंक्शन में, 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
हैंडलर की मदद से, एक्सटेंशन इवेंट के साथ-साथ सभी कस्टम इवेंट मैनेज किए जा सकते हैं. सबसे पहले,
Firebase Admin SDK के साथ-साथ, Eventarc 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)
# ...