কাস্টম ইভেন্ট ট্রিগার তৈরি করুন এবং পরিচালনা করুন

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

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

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

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

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

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

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

একটি চ্যানেলে একটি ইভেন্ট প্রকাশ করুন

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

নোড.জেএস

const {onCustomEventPublished} = require("firebase-functions/eventarc");
const logger = require("firebase-functions/logger");
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

পাইথন

from firebase_admin import firestore, initialize_app
from firebase_functions import eventarc_fn

আপনার ফাংশন কোডে, উদাহরণ ফাংশনে দেখানো অনুযায়ী ইভেন্টের নামটি পাস করুন:

নোড.জেএস

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
    });

পাইথন

@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 থেকে মেটাডেটা সংরক্ষণ করে।

নন-ডিফল্ট চ্যানেলগুলিতে ইভেন্ট প্রকাশ ও পরিচালনা করুন

কাস্টম চ্যানেল সেইসব ক্ষেত্রে কার্যকর হতে পারে যেখানে আপনার বিশেষ অনুমতির প্রয়োজন বা অন্যান্য প্রয়োজনীয়তা রয়েছে এবং আপনি সমস্ত ইভেন্টের জন্য একই স্তরের দৃশ্যমানতা ও অ্যাক্সেস চান না। আপনি গুগল ক্লাউড কনসোল ব্যবহার করে আপনার নিজস্ব চ্যানেল তৈরি করতে পারেন। ইভেন্ট প্রকাশ করা এবং সাবস্ক্রাইব করা অবশ্যই একই চ্যানেলে করতে হবে।

যেসব ক্ষেত্রে কোনো কাস্টম ইভেন্ট ডিফল্ট চ্যানেল ছাড়া অন্য কোনো চ্যানেলে প্রকাশিত হয়, সেক্ষেত্রে আপনাকে আপনার ফাংশন কোডে চ্যানেলটি নির্দিষ্ট করে দিতে হবে। উদাহরণস্বরূপ, আপনি যদি us-west1 লোকেশনের জন্য ডিফল্ট চ্যানেল ছাড়া অন্য কোনো চ্যানেলে প্রকাশিত ইভেন্টগুলো পরিচালনা করতে চান, তাহলে আপনাকে দেখানো অনুযায়ী চ্যানেলটি নির্দিষ্ট করতে হবে:

নোড.জেএস

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) => { ... });

পাইথন

@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)
    # ...