আপনি আপনার এক্সটেনশন ইনস্টলকারী ব্যবহারকারীদেরকে এর কার্যকারিতায় তাদের নিজস্ব কাস্টম লজিক যুক্ত করার সুযোগ দিতে পারেন। এটি করার দুটি উপায় রয়েছে:
ইভেন্টআর্ক ইভেন্ট : ব্যবহারকারীদের ইভেন্টগুলিতে অ্যাসিঙ্ক্রোনাসভাবে প্রতিক্রিয়া জানানোর সুযোগ দিতে, আপনি ইভেন্টআর্কে ইভেন্ট প্রকাশ করতে পারেন। ব্যবহারকারীরা ইভেন্ট হ্যান্ডলার ফাংশন স্থাপন করতে পারেন, যা উদাহরণস্বরূপ, দীর্ঘ সময় ধরে চলা কাজ শেষ হওয়ার পরে বিজ্ঞপ্তি পাঠায়, অথবা তারা তাদের নিজস্ব পোস্ট-প্রসেসিং ফাংশন সংজ্ঞায়িত করতে পারেন।
সিঙ্ক্রোনাস হুকস : ব্যবহারকারীদের আপনার এক্সটেনশনে ব্লকিং লজিক যোগ করার সুযোগ দিতে, আপনি এক্সটেনশনটির কার্যক্রমের পূর্বনির্ধারিত পয়েন্টে সিঙ্ক্রোনাস হুকস যোগ করতে পারেন। এই পয়েন্টগুলোতে, আপনি একটি ইউজার-প্রোভাইডার ফাংশন রান করেন এবং সেটি সম্পন্ন হওয়ার পরেই কেবল সামনে অগ্রসর হন। প্রি-প্রসেসিং টাস্কগুলো প্রায়শই এই ক্যাটাগরির অন্তর্ভুক্ত হয়।
একটি এক্সটেনশন যেকোনো একটি বা উভয় পদ্ধতিই ব্যবহার করতে পারে।
ইভেন্টার্ক ইভেন্টগুলি
একটি এক্সটেনশন থেকে ইভেন্ট প্রকাশ করতে:
extension.yamlফাইলে আপনি যে ইভেন্টের ধরণগুলো প্রকাশ করবেন তা ঘোষণা করুন:events: - type: publisher-id.extension-name.version.event-name description: event-description - type: publisher-id.extension-name.version.another-event-name description: another-event-descriptiontypeআইডেন্টিফায়ারটি কয়েকটি ডট-ডিলিমিটেড ফিল্ড দিয়ে গঠিত। পাবলিশার আইডি , এক্সটেনশন নেম এবং ইভেন্ট নেম ফিল্ডগুলো আবশ্যক। ভার্সন ফিল্ডটি থাকা বাঞ্ছনীয়। আপনার প্রকাশ করা প্রতিটি ইভেন্ট টাইপের জন্য একটি অনন্য এবং বর্ণনামূলক ইভেন্ট নেম বেছে নিন।উদাহরণস্বরূপ,
storage-resize-imagesএক্সটেনশনটি একটিমাত্র ইভেন্ট টাইপ ঘোষণা করে:events: - type: firebase.extensions.storage-resize-images.v1.complete description: | Occurs when image resizing completes. The event will contain further details about specific formats and sizes.এক্সটেনশনটি ইনস্টল করার সময় ব্যবহারকারীরা কোন কোন ইভেন্টে সাবস্ক্রাইব করবেন তা বেছে নিতে পারবেন।
আপনার এক্সটেনশন ফাংশনগুলিতে, Admin SDK থেকে ইভেন্টআর্ক এপিআই (Eventarc API) ইম্পোর্ট করুন এবং ব্যবহারকারীর ইনস্টলেশন সেটিংস ব্যবহার করে একটি ইভেন্ট চ্যানেল ইনিশিয়ালাইজ করুন। এই সেটিংসগুলি নিম্নলিখিত এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে প্রকাশ করা হয়:
-
EVENTARC_CHANNEL: ইভেন্টআর্ক চ্যানেলের পূর্ণাঙ্গ নাম, যেখানে ব্যবহারকারী ইভেন্ট প্রকাশ করার জন্য বেছে নিয়েছেন। -
EXT_SELECTED_EVENTS: ব্যবহারকারীর প্রকাশ করার জন্য বেছে নেওয়া ইভেন্টের প্রকারগুলির একটি কমা-দ্বারা-বিভক্ত তালিকা। আপনি যখন এই মান দিয়ে একটি চ্যানেল শুরু করেন, তখন অ্যাডমিন SDK স্বয়ংক্রিয়ভাবে ব্যবহারকারীর নির্বাচন না করা ইভেন্টগুলিকে ফিল্টার করে দেয়। -
EVENTARC_CLOUD_EVENT_SOURCE: ক্লাউড ইভেন্টের উৎস শনাক্তকারী। অ্যাডমিন SDK প্রকাশিত ইভেন্টগুলিরsourceফিল্ডে স্বয়ংক্রিয়ভাবে এই মানটি পাস করে। সাধারণত আপনার এই ভেরিয়েবলটি স্পষ্টভাবে ব্যবহার করার প্রয়োজন হয় না।
ইনস্টলেশনের সময় ইভেন্টগুলি সক্রিয় করা না থাকলে, এই ভেরিয়েবলগুলি অনির্ধারিত থাকবে। আপনি এই ফ্যাক্টটি ব্যবহার করে শুধুমাত্র ইভেন্টগুলি সক্রিয় থাকলেই একটি ইভেন্ট চ্যানেল শুরু করতে পারেন:
import * as admin from "firebase-admin"; import {getEventarc} from 'firebase-admin/eventarc'; admin.initializeApp(); // Set eventChannel to a newly-initialized channel, or `undefined` if events // aren't enabled. const eventChannel = process.env.EVENTARC_CHANNEL && getEventarc().channel(process.env.EVENTARC_CHANNEL, { allowedEventTypes: process.env.EXT_SELECTED_EVENTS, });-
আপনার এক্সটেনশনের যে অংশগুলোতে ব্যবহারকারীদের কাছে প্রকাশ করতে চান, সেখানে চ্যানেলে ইভেন্টগুলো প্রকাশ করুন। উদাহরণস্বরূপ:
// If events are enabled, publish a `complete` event to the configured // channel. eventChannel && eventChannel.publish({ type: 'firebase.extensions.storage-resize-images.v1.complete', subject: filename, // the name of the original file data: { // ... } });আপনি যে ইভেন্টগুলো প্রকাশ করেন, সেগুলো PREINSTALL অথবা POSTINSTALL ফাইলে নথিভুক্ত করুন।
প্রতিটি ঘটনার জন্য নিম্নলিখিত বিষয়গুলো নথিভুক্ত করুন:
- এর উদ্দেশ্য
- আপনার এক্সটেনশনের লজিকের যে পয়েন্টে এটি চলে
- আউটপুট ডেটা এতে অন্তর্ভুক্ত
- এর বাস্তবায়নের শর্তাবলী
এছাড়াও, ব্যবহারকারীদের সতর্ক করুন যেন তারা তাদের ইভেন্ট হ্যান্ডলারে এমন কোনো কাজ না করেন যা একই এক্সটেনশনকে ট্রিগার করতে পারে, যার ফলে একটি অনন্ত লুপ তৈরি হতে পারে।
যখন আপনি কোনো এক্সটেনশন থেকে ইভেন্ট প্রকাশ করেন, তখন ব্যবহারকারীরা নিজস্ব লজিক দিয়ে সাড়া দেওয়ার জন্য ইভেন্ট হ্যান্ডলার স্থাপন করতে পারেন।
উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণটি মূল ছবিটি রিসাইজ করার পর মুছে ফেলে। লক্ষ্য করুন যে এই উদাহরণ হ্যান্ডলারটি ইভেন্টের subject প্রপার্টি ব্যবহার করে, যা এই ক্ষেত্রে ছবিটির মূল ফাইলের নাম।
exports.onimageresized = onCustomEventPublished(
"firebase.extensions.storage-resize-images.v1.complete",
(event) => {
logger.info("Received image resize completed event", event);
// For example, delete the original.
return admin.storage()
.bucket("my-project.firebasestorage.app")
.file(event.subject)
.delete();
});
আরও তথ্যের জন্য কাস্টম ইভেন্ট ট্রিগার দেখুন।
উদাহরণ
অফিসিয়াল রিসাইজ ইমেজেস এক্সটেনশনটি কোনো ছবির আকার পরিবর্তন করার পর ইভেন্টআর্ক-এ পাবলিশ করার মাধ্যমে একটি অ্যাসিঙ্ক্রোনাস হুক প্রদান করে।
সিঙ্ক্রোনাস হুক
যখন আপনি ব্যবহারকারীদের এমন একটি হুক দিতে চান যা আপনার এক্সটেনশনের কোনো একটি ফাংশন কাজ করার জন্য অবশ্যই সফলভাবে সম্পন্ন হতে হবে, তখন সিনক্রোনাস হুক ব্যবহার করুন।
একটি সিনক্রোনাস হুক ব্যবহারকারী-সংজ্ঞায়িত একটি HTTPS কলযোগ্য ক্লাউড ফাংশনকে কল করে এবং পরবর্তী ধাপে যাওয়ার আগে এর সমাপ্তির জন্য (সম্ভবত একটি রিটার্ন করা মান সহ) অপেক্ষা করে। ব্যবহারকারী-প্রদত্ত ফাংশনে কোনো ত্রুটি ঘটলে এক্সটেনশন ফাংশনটিতেও ত্রুটি দেখা দেয়।
একটি সিঙ্ক্রোনাস হুক প্রকাশ করতে:
আপনার এক্সটেনশনে এমন একটি প্যারামিটার যোগ করুন যা ব্যবহারকারীদের তাদের নিজস্ব ক্লাউড ফাংশনের URL দিয়ে এক্সটেনশনটি কনফিগার করার সুযোগ দেবে। উদাহরণস্বরূপ:
- param: PREPROCESSING_FUNCTION label: Pre-processing function URL description: > An HTTPS callable function that will be called to transform the input data before it is processed by this function. type: string example: https://us-west1-my-project-id.cloudfunctions.net/preprocessData required: falseআপনার এক্সটেনশনের যে অংশে আপনি হুকটি প্রকাশ করতে চান, সেখানে ফাংশনটির URL ব্যবহার করে সেটিকে কল করুন। উদাহরণস্বরূপ:
const functions = require('firebase-functions/v1'); const fetch = require('node-fetch'); const preprocessFunctionURL = process.env.PREPROCESSING_FUNCTION; exports.yourFunctionName = functions.firestore.document("collection/{doc_id}") .onWrite((change, context) => { // PREPROCESSING_FUNCTION hook begins here. // If a preprocessing function is defined, call it before continuing. if (preprocessFunctionURL) { try { await fetch(preprocessFunctionURL); // Could also be a POST request if you want to send data. } catch (e) { // Preprocessing failure causes the function to fail. functions.logger.error("Preprocessor error:", e); return; } } // End of PREPROCESSING_FUNCTION hook. // Main function logic follows. // ... });PREINSTALL অথবা POSTINSTALL ফাইলে আপনি যে হুকগুলো উপলব্ধ করেন, সেগুলো নথিভুক্ত করুন।
প্রতিটি হুকের জন্য নিম্নলিখিত বিষয়গুলো নথিভুক্ত করুন:
- এর উদ্দেশ্য
- আপনার এক্সটেনশনের লজিকের যে পয়েন্টে এটি চলে
- এর প্রত্যাশিত ইনপুট এবং আউটপুট
- এটি কার্যকর করার শর্তাবলী (বা বিকল্পসমূহ)
এছাড়াও, ব্যবহারকারীদের সতর্ক করুন যেন তারা হুক ফাংশনের মধ্যে এমন কোনো কাজ না করেন যা একই এক্সটেনশনকে ট্রিগার করতে পারে, যার ফলে একটি অসীম লুপ তৈরি হতে পারে।
উদাহরণ
অ্যালগোলিয়া সার্চ এক্সটেনশনটি অ্যালগোলিয়াতে লেখার পূর্বে ব্যবহারকারী-সরবরাহকৃত একটি ট্রান্সফর্ম ফাংশন কল করার জন্য একটি সিনক্রোনাস হুক প্রদান করে।