কাস্টম ইভেন্ট ট্রিগার তৈরি ও ম্যানেজ করা

Cloud Functions (২য় জেনারেশন)-এর সাহায্যে, আপনি কাস্টম ইভেন্ট-এর উত্তরে ফাংশন ট্রিগার করতে পারবেন। এগুলি হল বিশেষ বা অতিরিক্ত ইভেন্ট প্রদানকারীর দ্বারা প্রদান করা ইভেন্ট, যা Cloud Functions-এর জন্য Firebase SDK-এর মাধ্যমে নেটিভভাবে সমর্থিত Firebase ইভেন্টের বিপরীত। কাস্টম ইভেন্ট ট্রিগারের মাধ্যমে, আপনার অ্যাপ Firebase Extensions-এর দেওয়া ইভেন্টের উত্তর দিতে পারে অথবা আপনি নিজের কাস্টম ইভেন্ট প্রকাশ করতে এবং সেগুলির উত্তরে ফাংশন ট্রিগার করতে পারেন।

সব কাস্টম ইভেন্ট CloudEvents JSON ইভেন্ট ফর্ম্যাট অনুযায়ী হয় এবং Eventarc-এ প্রকাশ করা হয়। Eventarc ব্যবহারের ফি প্রযোজ্য।

কাস্টম ইভেন্টের মাধ্যমে ফাংশন ট্রিগার করা

আপনি কাস্টম ইভেন্ট প্রকাশ করতে পারেন (অথবা Firebase এক্সটেনশন থেকে ইভেন্ট পেতে পারেন) এবং এই বেসিক ফ্লো প্রয়োগ করে সেইসব ইভেন্টের উত্তরে ফাংশন ট্রিগার করতে পারেন:

  1. Eventarc চ্যানেলে আপনার পছন্দের ইভেন্ট প্রকাশ করুন অথবা আপনার ইনস্টল করা এক্সটেনশনের মাধ্যমে উপলভ্য ইভেন্ট শনাক্ত করুন।
  2. আপনার ফাংশন কোডে, ইভেন্ট হ্যান্ডলারের মাধ্যমে Eventarc চ্যানেলে ইভেন্ট সাবস্ক্রাইব করুন।
  3. ফাংশনে, CloudEvent অবজেক্টে ফেরত আসা পেলোড পার্স করুন এবং আপনার অ্যাপের জন্য প্রয়োজনীয় যেকোনও কাস্টম লজিক পারফর্ম করুন।

যেমন, কোনও গেম অ্যাপ ব্যবহারকারীদের বিজ্ঞপ্তি পাঠাতে চাইতে পারে, যখন তারা সেরা দশ প্রতিযোগীর লিডারবোর্ডে প্রবেশ করে বা ছেড়ে যায়। এই অ্যাপ ডিফল্ট চ্যানেলে লিডারবোর্ড ইভেন্ট প্রকাশ করতে পারে এবং তারপরে এমন একটি ফাংশনে ইভেন্টটি ম্যানেজ করতে পারে যা ব্যবহারকারীদের টার্গেট করা পুশ বিজ্ঞপ্তি পাঠায়।

অন্য একটি উদাহরণে, অ্যাপকে বড় ছবি প্রসেস করতে সাহায্য করার জন্য ডিজাইন করা একটি এক্সটেনশন, ছবির সাইজ পরিবর্তন করার কাজ সম্পূর্ণ হওয়ার পরে একটি ইভেন্ট নির্গত করতে পারে। এই এক্সটেনশন ইনস্টল করা অ্যাপ ইমেজের ছোট বড় করা ভার্সনের দিকে পয়েন্ট করার জন্য অ্যাপে লিঙ্ক আপডেট করার মাধ্যমে সম্পূর্ণ করার ইভেন্ট ম্যানেজ করতে পারে।

কোনও চ্যানেলে ইভেন্ট প্রকাশ করা

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 কনসোল ব্যবহার করে আপনি নিজের চ্যানেল তৈরি করতে পারবেন। ইভেন্টের জন্য প্রকাশ করা এবং সাবস্ক্রাইব করা একই চ্যানেলে করতে হবে।

ডিফল্ট নয় এমন চ্যানেলে কাস্টম ইভেন্ট প্রকাশ করা হলে, আপনাকে ফাংশন কোডে চ্যানেলটি উল্লেখ করতে হবে। যেমন, আপনি যদি 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)
    # ...