এই পৃষ্ঠাটি আপনাকে একটি সহজ ফায়ারবেস এক্সটেনশন তৈরি করার জন্য প্রয়োজনীয় ধাপগুলো দেখিয়ে দেবে, যা আপনি আপনার প্রজেক্টে ইনস্টল করতে বা অন্যদের সাথে শেয়ার করতে পারেন। ফায়ারবেস এক্সটেনশনের এই সহজ উদাহরণটি আপনার রিয়েলটাইম ডেটাবেসে মেসেজের জন্য নজর রাখবে এবং সেগুলোকে আপার কেসে রূপান্তর করবে।
১. আপনার পরিবেশ প্রস্তুত করুন এবং একটি প্রকল্প শুরু করুন।
এক্সটেনশন তৈরি করা শুরু করার আগে, আপনাকে প্রয়োজনীয় টুলস সহ একটি বিল্ড এনভায়রনমেন্ট সেট আপ করতে হবে।
Node.js 16 বা তার নতুন সংস্করণ ইনস্টল করুন। Node ইনস্টল করার একটি উপায় হলো nvm (বা nvm-windows ) ব্যবহার করা।
Firebase CLI- এর সর্বশেষ সংস্করণটি ইনস্টল বা আপডেট করুন।
npmব্যবহার করে ইনস্টল বা আপডেট করতে, এই কমান্ডটি চালান:npm install -g firebase-tools
এখন Firebase CLI ব্যবহার করে একটি নতুন এক্সটেনশন প্রজেক্ট শুরু করুন:
আপনার এক্সটেনশনের জন্য ডিরেক্টরি তৈরি করুন এবং
cdব্যবহার করে সেটির ভেতরে যান:mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messagesFirebase CLI-এর
ext:dev:initকমান্ডটি চালান:firebase ext:dev:initজিজ্ঞাসা করা হলে, ফাংশনের ভাষা হিসেবে জাভাস্ক্রিপ্ট বেছে নিন (তবে মনে রাখবেন, নিজের এক্সটেনশন তৈরি করার সময় আপনি টাইপস্ক্রিপ্টও ব্যবহার করতে পারেন), এবং ডিপেন্ডেন্সি ইনস্টল করতে বলা হলে "হ্যাঁ" উত্তর দিন। (অন্যান্য বিকল্পগুলির জন্য ডিফল্ট মান গ্রহণ করুন।) এই কমান্ডটি একটি নতুন এক্সটেনশনের জন্য একটি কাঠামোবদ্ধ কোডবেস তৈরি করবে, যেখান থেকে আপনি আপনার এক্সটেনশন তৈরি করা শুরু করতে পারবেন।
নতুন এক্সটেনশন ডিরেক্টরি শুরু করতে firebase ext:dev:init ব্যবহার করুন।
২. এমুলেটর ব্যবহার করে উদাহরণ এক্সটেনশনটি চেষ্টা করুন।
যখন Firebase CLI নতুন এক্সটেনশন ডিরেক্টরিটি চালু করে, তখন এটি একটি সাধারণ উদাহরণ ফাংশন এবং একটি integration-tests ডিরেক্টরি তৈরি করে, যেটিতে Firebase এমুলেটর স্যুট ব্যবহার করে একটি এক্সটেনশন চালানোর জন্য প্রয়োজনীয় ফাইলগুলো থাকে।
এমুলেটরে উদাহরণ এক্সটেনশনটি চালানোর চেষ্টা করুন:
integration-testsডিরেক্টরিতে যান:cd functions/integration-testsএকটি ডেমো প্রজেক্ট দিয়ে এমুলেটরটি চালু করুন:
firebase emulators:start --project=demo-testএমুলেটরটি এক্সটেনশনটিকে একটি পূর্বনির্ধারিত "ডামি" প্রজেক্টে (
demo-test) লোড করে। এক্সটেনশনটিতে এখন পর্যন্তgreetTheWorldনামে একটিমাত্র HTTP-চালিত ফাংশন রয়েছে, যেটি অ্যাক্সেস করা হলে একটি "hello world" বার্তা ফেরত দেয়।এমুলেটরটি চালু থাকা অবস্থায়, এটি চালু করার সময় প্রিন্ট করা URL-টিতে গিয়ে এক্সটেনশনটির
greetTheWorldফাংশনটি ব্যবহার করে দেখুন।আপনার ব্রাউজার "Hello World from greet-the-world" বার্তাটি প্রদর্শন করছে।
এই ফাংশনের সোর্স কোডটি এক্সটেনশনটির
functionsডিরেক্টরিতে রয়েছে। আপনার পছন্দের এডিটর বা IDE-তে সোর্সটি খুলুন:ফাংশন/ইনডেক্স.জেএস
const functions = require("firebase-functions/v1"); exports.greetTheWorld = functions.https.onRequest((req, res) => { // Here we reference a user-provided parameter // (its value is provided by the user during installation) const consumerProvidedGreeting = process.env.GREETING; // And here we reference an auto-populated parameter // (its value is provided by Firebase after installation) const instanceId = process.env.EXT_INSTANCE_ID; const greeting = `${consumerProvidedGreeting} World from ${instanceId}`; res.send(greeting); });এমুলেটরটি চলার সময়, এটি আপনার ফাংশন কোডে করা যেকোনো পরিবর্তন স্বয়ংক্রিয়ভাবে পুনরায় লোড করবে।
greetTheWorldফাংশনটিতে একটি ছোট পরিবর্তন করে দেখুন:ফাংশন/ইনডেক্স.জেএস
const greeting = `${consumerProvidedGreeting} everyone, from ${instanceId}`;আপনার পরিবর্তনগুলো সংরক্ষণ করুন। এমুলেটরটি আপনার কোড পুনরায় লোড করবে, এবং এখন, আপনি যখন ফাংশন ইউআরএল-টি ভিজিট করবেন, তখন আপডেট করা অভিবাদন বার্তাটি দেখতে পাবেন।
এক্সটেনশন এমুলেটর ব্যবহার করে আপনি আপনার কোড দ্রুত পরীক্ষা ও পরিমার্জন করতে পারবেন, যা ডেভেলপমেন্টের গতি বাড়াতে সাহায্য করে।
আরও তথ্য
এক্সটেনশন এমুলেটর ব্যবহার সম্পর্কে আরও জানুন।
৩. extension.yaml-এ প্রাথমিক তথ্য যোগ করুন।
এখন যেহেতু আপনি একটি ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করে এক্সটেনশন এমুলেটরটি চালাচ্ছেন, আপনি নিজের এক্সটেনশন লেখা শুরু করতে পারেন।
প্রথম পদক্ষেপ হিসেবে, greet-the-world এর পরিবর্তে আপনি যে এক্সটেনশনটি লিখতে চান, তা প্রতিফলিত করার জন্য পূর্বনির্ধারিত এক্সটেনশন মেটাডেটা সম্পাদনা করুন। এই মেটাডেটা extension.yaml ফাইলে সংরক্ষিত থাকে।
আপনার এডিটরে
extension.yamlখুলুন এবং ফাইলের সম্পূর্ণ বিষয়বস্তু নিচের লেখা দিয়ে প্রতিস্থাপন করুন:name: rtdb-uppercase-messages version: 0.0.1 specVersion: v1beta # Firebase Extensions specification version; don't change # Friendly display name for your extension (~3-5 words) displayName: Convert messages to upper case # Brief description of the task your extension performs (~1 sentence) description: >- Converts messages in RTDB to upper case author: authorName: Your Name url: https://your-site.example.com license: Apache-2.0 # Required license # Public URL for the source code of your extension sourceUrl: https://github.com/your-name/your-reponameফিল্ডে ব্যবহৃত নামকরণের রীতিটি লক্ষ্য করুন: অফিসিয়াল ফায়ারবেস এক্সটেনশনগুলোর নামকরণের শুরুতে একটি প্রিফিক্স থাকে, যা নির্দেশ করে এক্সটেনশনটি কোন প্রধান ফায়ারবেস প্রোডাক্টে কাজ করে, এবং এর পরে এক্সটেনশনটির কাজের একটি বিবরণ থাকে। আপনার নিজের এক্সটেনশনগুলোতেও এই একই রীতি ব্যবহার করা উচিত।যেহেতু আপনি আপনার এক্সটেনশনের নাম পরিবর্তন করেছেন, তাই আপনার এমুলেটর কনফিগারেশনটিও নতুন নামটি দিয়ে আপডেট করা উচিত:
-
functions/integration-tests/firebase.jsonফাইলে,greet-the-worldকেrtdb-uppercase-messagesএ পরিবর্তন করুন। -
functions/integration-tests/extensions/greet-the-world.envনাম পরিবর্তন করেfunctions/integration-tests/extensions/rtdb-uppercase-messages.envরাখুন।
-
আপনার এক্সটেনশন কোডে এখনও greet-the-world এক্সটেনশনের কিছু অবশিষ্টাংশ রয়ে গেছে, কিন্তু আপাতত সেগুলো এভাবেই রেখে দিন। পরবর্তী কয়েকটি অংশে আপনি সেগুলো আপডেট করবেন।
extension.yamlফাইলটিতে আপনার এক্সটেনশন সম্পর্কিত মেটাডেটা থাকে। এই মেটাডেটার মধ্যে সবচেয়ে মৌলিক হলো আপনার এক্সটেনশনের নাম এবং এটি কী কাজ করে তার একটি বিবরণ।আপনার এক্সটেনশনগুলির নামকরণ নিম্নলিখিত বিন্যাসে করুন:
<firebase-product>-<description-of-tasks-performed>>।
আরও তথ্য
extension.yaml রেফারেন্সে ফাইলটির সম্পূর্ণ বিবরণ রয়েছে; তবে, এই ডকুমেন্টেশনে প্রয়োজন অনুযায়ী ফাইলটির নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করা হবে।
৪. একটি ক্লাউড ফাংশন লিখুন এবং এটিকে একটি এক্সটেনশন রিসোর্স হিসেবে ঘোষণা করুন।
এখন আপনি কোড লেখা শুরু করতে পারেন। এই ধাপে, আপনি একটি ক্লাউড ফাংশন লিখবেন যা আপনার এক্সটেনশনের মূল কাজটি সম্পাদন করবে; আর তা হলো আপনার রিয়েলটাইম ডাটাবেসে থাকা মেসেজগুলো পর্যবেক্ষণ করা এবং সেগুলোকে আপার কেসে রূপান্তর করা।
আপনার পছন্দের এডিটর বা IDE-তে এক্সটেনশনটির ফাংশনগুলোর সোর্স ফাইল (এক্সটেনশনটির
functionsডিরেক্টরিতে) খুলুন। এর ভেতরের বিষয়বস্তু নিচের লেখা দিয়ে প্রতিস্থাপন করুন:ফাংশন/ইনডেক্স.জেএস
import { database, logger } from "firebase-functions/v1"; const app = initializeApp(); // Listens for new messages added to /messages/{pushId}/original and creates an // uppercase version of the message to /messages/{pushId}/uppercase // for all databases in 'us-central1' export const makeuppercase = database .ref("/messages/{pushId}/uppercase") .onCreate(async (snapshot, context) => { // Grab the current value of what was written to the Realtime Database. const original = snapshot.val(); // Convert it to upper case. logger.log("Uppercasing", context.params.pushId, original); const uppercase = original.toUpperCase(); // Setting an "uppercase" sibling in the Realtime Database. const upperRef = snapshot.ref.parent.child("upper"); await upperRef.set(uppercase); });পুরানো ফাংশনটি, যা আপনি প্রতিস্থাপন করেছেন, সেটি ছিল একটি HTTP-ট্রিগারড ফাংশন, যা কোনো HTTP এন্ডপয়েন্ট অ্যাক্সেস করা হলে চলত। নতুন ফাংশনটি রিয়েল-টাইম ডাটাবেস ইভেন্ট দ্বারা ট্রিগার হয়: এটি একটি নির্দিষ্ট পাথে নতুন আইটেমের জন্য নজর রাখে এবং যখন কোনো আইটেম শনাক্ত হয়, তখন সেটির ভ্যালুর আপারকেস সংস্করণটি ডাটাবেসে লিখে দেয়।
যাইহোক, এই নতুন ফাইলটি CommonJS (
require)-এর পরিবর্তে ECMAScript মডিউল সিনট্যাক্স (importএবংexport) ব্যবহার করে। Node-এ ES মডিউল ব্যবহার করতে,functions/package.jsonএ"type": "module"উল্লেখ করুন:{ "name": "rtdb-uppercase-messages", "main": "index.js", "type": "module", … }আপনার এক্সটেনশনের প্রতিটি ফাংশন অবশ্যই
extension.yamlফাইলে ডিক্লেয়ার করতে হবে। উদাহরণ এক্সটেনশনটিgreetTheWorldএক্সটেনশনটির একমাত্র ক্লাউড ফাংশন হিসেবে ডিক্লেয়ার করেছিল; এখন যেহেতু আপনি এটিকেmakeuppercaseদিয়ে প্রতিস্থাপন করেছেন, তাই আপনাকে এর ডিক্লারেশনটিও আপডেট করতে হবে।extension.yamlখুলুন এবং একটিresourcesফিল্ড যোগ করুন:resources: - name: makeuppercase type: firebaseextensions.v1beta.function properties: eventTrigger: eventType: providers/google.firebase.database/eventTypes/ref.create # DATABASE_INSTANCE (project's default instance) is an auto-populated # parameter value. You can also specify an instance. resource: projects/_/instances/${DATABASE_INSTANCE}/refs/messages/{pushId}/original runtime: "nodejs18"যেহেতু আপনার এক্সটেনশনটি এখন ট্রিগার হিসেবে রিয়েলটাইম ডেটাবেস ব্যবহার করছে, তাই ক্লাউড ফাংশনস এমুলেটরের পাশাপাশি RTDB এমুলেটরটি চালানোর জন্য আপনাকে আপনার এমুলেটর কনফিগারেশন আপডেট করতে হবে:
যদি এমুলেটরটি তখনও চালু থাকে, তাহলে Ctrl-C চেপে এটি বন্ধ করুন।
functions/integration-testsডিরেক্টরি থেকে, নিম্নলিখিত কমান্ডটি চালান:firebase init emulatorsজিজ্ঞাসা করা হলে, ডিফল্ট প্রজেক্ট সেট আপ করা এড়িয়ে যান, তারপর ফাংশন এবং ডেটাবেস এমুলেটর নির্বাচন করুন। ডিফল্ট পোর্টগুলো গ্রহণ করুন এবং সেটআপ টুলটিকে প্রয়োজনীয় ফাইলগুলো ডাউনলোড করার অনুমতি দিন।
এমুলেটরটি পুনরায় চালু করুন:
firebase emulators:start --project=demo-test
আপনার আপডেট করা এক্সটেনশনটি ব্যবহার করে দেখুন:
এমুলেটরটি চালু করার সময় যে লিঙ্কটি প্রিন্ট করেছিল, সেটি ব্যবহার করে ডাটাবেস এমুলেটর UI খুলুন।
ডাটাবেসের রুট নোডটি সম্পাদনা করুন:
- ক্ষেত্র:
messages - ধরণ:
json - মান:
{"11": {"original": "recipe"}}
সবকিছু সঠিকভাবে সেট আপ করা থাকলে, আপনি যখন আপনার ডাটাবেসের পরিবর্তনগুলি সংরক্ষণ করবেন, তখন এক্সটেনশনটির
makeuppercaseফাংশনটি ট্রিগার হবে এবং মেসেজ ১১-এ"upper": "RECIPE"বিষয়বস্তু সহ একটি চাইল্ড রেকর্ড যুক্ত করবে। প্রত্যাশিত ফলাফল নিশ্চিত করতে এমুলেটর UI-এর লগ এবং ডাটাবেস ট্যাবগুলি দেখুন।- ক্ষেত্র:
messagesনোডটিতে ({"original":"any text"}) আরও কিছু চাইল্ড যোগ করার চেষ্টা করুন। যখনই আপনি একটি নতুন রেকর্ড যোগ করবেন, এক্সটেনশনটিoriginalফিল্ডের আপারকেস কন্টেন্ট ধারণকারী একটিuppercaseফিল্ড যোগ করবে।
এখন আপনার কাছে একটি সম্পূর্ণ, যদিও সরল, এক্সটেনশন আছে যা একটি RTDB ইনস্ট্যান্সে কাজ করে। পরবর্তী বিভাগগুলিতে, আপনি কিছু অতিরিক্ত বৈশিষ্ট্য যোগ করে এই এক্সটেনশনটিকে আরও উন্নত করবেন। তারপর, আপনি এক্সটেনশনটিকে অন্যদের কাছে বিতরণের জন্য প্রস্তুত করবেন এবং সবশেষে, এক্সটেনশনস হাবে আপনার এক্সটেনশনটি কীভাবে প্রকাশ করতে হয় তা শিখবেন।
- আপনার এক্সটেনশনের লজিক গঠনকারী ফাংশনগুলোকে অবশ্যই ক্লাউড ফাংশন কোড হিসেবে সংজ্ঞায়িত করতে হবে এবং
extension.yamlফাইলে একটি এক্সটেনশন রিসোর্স হিসেবে ঘোষণা করতে হবে। - আপনি এমন ফাংশন লিখতে পারেন যা HTTP এন্ডপয়েন্ট অ্যাক্সেস করা হলে, অথবা Firebase প্রোডাক্ট, Google Cloud প্রোডাক্ট এবং অন্যান্য এক্সটেনশন দ্বারা নির্গত ইভেন্টের প্রতিক্রিয়ায় ট্রিগার হয়।
আরও তথ্য
- এক্সটেনশনের জন্য ক্লাউড ফাংশন লেখা সম্পর্কে আরও জানুন, যার মধ্যে সমর্থিত ইভেন্ট ট্রিগারগুলো সম্পর্কেও বিস্তারিত তথ্য রয়েছে।
-
extension.yamlরেফারেন্সে ফাইলটির সম্পূর্ণ বিবরণ রয়েছে; তবে, এই ডকুমেন্টেশনে প্রয়োজন অনুযায়ী ফাইলটির নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করা হবে। - Cloud Functions for Firebase ডকুমেন্টেশনে ক্লাউড ফাংশন ব্যবহারের সাধারণ তথ্য রয়েছে, যা Firebase এক্সটেনশনের জন্য নির্দিষ্ট নয়।
৫. এপিআই এবং ভূমিকা ঘোষণা করুন
ফায়ারবেস একটি প্রতি-ইনস্ট্যান্স সার্ভিস অ্যাকাউন্ট ব্যবহার করে ইনস্টল করা এক্সটেনশনের প্রতিটি ইনস্ট্যান্সকে প্রজেক্ট এবং এর ডেটাতে সীমিত অ্যাক্সেস প্রদান করে। প্রতিটি অ্যাকাউন্টের পরিচালনার জন্য প্রয়োজনীয় ন্যূনতম অনুমতি থাকে। এই কারণে, আপনার এক্সটেনশনের জন্য প্রয়োজনীয় যেকোনো IAM রোল আপনাকে অবশ্যই স্পষ্টভাবে ঘোষণা করতে হবে; যখন ব্যবহারকারীরা আপনার এক্সটেনশন ইনস্টল করে, ফায়ারবেস এই রোলগুলোসহ একটি সার্ভিস অ্যাকাউন্ট তৈরি করে এবং এক্সটেনশনটি চালানোর জন্য সেটি ব্যবহার করে।
কোনো প্রোডাক্টের ইভেন্ট চালু করার জন্য রোল ডিক্লেয়ার করার প্রয়োজন নেই, কিন্তু অন্য কোনোভাবে এটির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে একটি রোল ডিক্লেয়ার করতে হবে। যেহেতু আপনি আগের ধাপে যে ফাংশনটি যোগ করেছেন তা রিয়েলটাইম ডেটাবেসে লেখে, তাই আপনাকে extension.yaml এ নিম্নলিখিত ডিক্লারেশনটি যোগ করতে হবে:
roles:
- role: firebasedatabase.admin
reason: Allows the extension to write to RTDB.
একইভাবে, একটি এক্সটেনশন যে Google API-গুলো ব্যবহার করে, সেগুলো আপনি apis ফিল্ডে ঘোষণা করেন। ব্যবহারকারীরা যখন আপনার এক্সটেনশনটি ইনস্টল করবেন, তখন তাদের কাছে জানতে চাওয়া হবে যে তারা তাদের প্রোজেক্টের জন্য এই API-গুলো স্বয়ংক্রিয়ভাবে চালু করতে চান কিনা। এটি সাধারণত শুধুমাত্র নন-ফায়ারবেস Google API-গুলোর জন্য প্রয়োজন হয় এবং এই নির্দেশিকার জন্য এর দরকার নেই।
-
extensions.yamlফাইলেরrolesফিল্ডে আপনার এক্সটেনশনের প্রয়োজনীয় যেকোনো IAM রোল ঘোষণা করুন। ইনস্টল করার সময়, এক্সটেনশনগুলোকে স্বয়ংক্রিয়ভাবে এই রোলগুলো প্রদান করা হয়। - আপনার এক্সটেনশনের জন্য প্রয়োজনীয় যেকোনো গুগল এপিআই (Google API)
extensions.yamlফাইলেরapisফিল্ডে ঘোষণা করুন। ব্যবহারকারীরা যখন আপনার এক্সটেনশনটি ইনস্টল করবেন, তখন তারা তাদের প্রোজেক্টের জন্য এই এপিআইগুলো স্বয়ংক্রিয়ভাবে সক্রিয় করার বিকল্পটি বেছে নিতে পারবেন। - ডকুমেন্টেশনের উদ্দেশ্যে, আপনার এক্সটেনশনের প্রয়োজনীয় যেকোনো নন-গুগল এপিআই
extensions.yamlফাইলেরexternalServicesফিল্ডে ঘোষণা করুন।
আরও তথ্য
- একটি এক্সটেনশনের জন্য উপযুক্ত অ্যাক্সেস সেট আপ করার বিষয়ে আরও জানুন।
-
extension.yamlরেফারেন্সে ফাইলটির সম্পূর্ণ বিবরণ রয়েছে; তবে, এই ডকুমেন্টেশনে প্রয়োজন অনুযায়ী ফাইলটির নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করা হবে।
৬. ব্যবহারকারী-কনফিগারযোগ্য প্যারামিটার নির্ধারণ করুন
গত দুটি ধাপে আপনার তৈরি করা ফাংশনটি আগত বার্তার জন্য একটি নির্দিষ্ট RTDB অবস্থান পর্যবেক্ষণ করত। কখনও কখনও, একটি নির্দিষ্ট অবস্থান পর্যবেক্ষণ করা সত্যিই আপনার প্রয়োজন হতে পারে, যেমন যখন আপনার এক্সটেনশনটি এমন একটি ডাটাবেস কাঠামোতে কাজ করে যা আপনি শুধুমাত্র আপনার এক্সটেনশনের জন্যই ব্যবহার করেন। তবে, বেশিরভাগ সময়, আপনি চাইবেন যে ব্যবহারকারীরা তাদের প্রোজেক্টে আপনার এক্সটেনশনটি ইনস্টল করলে এই মানগুলো তাদের দ্বারা কনফিগারযোগ্য হোক। এইভাবে, ব্যবহারকারীরা তাদের বিদ্যমান ডাটাবেস সেটআপের সাথে কাজ করার জন্য আপনার এক্সটেনশনটি ব্যবহার করতে পারবে।
এক্সটেনশনটি নতুন বার্তার জন্য যে পথটি পর্যবেক্ষণ করে, সেটিকে ব্যবহারকারী-কনফিগারযোগ্য করুন:
extension.yamlফাইলে একটিparamsসেকশন যোগ করুন:- param: MESSAGE_PATH label: Message path description: >- What is the path at which the original text of a message can be found? type: string default: /messages/{pushId}/original required: true immutable: falseএটি একটি নতুন স্ট্রিং প্যারামিটার নির্ধারণ করে, যা আপনার এক্সটেনশন ইনস্টল করার সময় ব্যবহারকারীদের সেট করতে বলা হবে।
এখনো
extension.yamlফাইলে, আপনারmakeuppercaseডিক্লারেশনে ফিরে যান এবংresourceফিল্ডটি নিম্নলিখিতভাবে পরিবর্তন করুন:resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${param:MESSAGE_PATH}${param:MESSAGE_PATH}টোকেনটি হলো আপনার এইমাত্র সংজ্ঞায়িত করা প্যারামিটারের একটি রেফারেন্স। যখন আপনার এক্সটেনশনটি রান করবে, তখন এই টোকেনটি ব্যবহারকারী কর্তৃক সেই প্যারামিটারের জন্য কনফিগার করা মান দ্বারা প্রতিস্থাপিত হবে, যার ফলেmakeuppercaseফাংশনটি ব্যবহারকারীর নির্দিষ্ট করা পাথটি অনুসরণ করবে। আপনি এই সিনট্যাক্সটিextension.yamlএর যেকোনো জায়গায় (এবংPOSTINSTALL.mdএও — এ বিষয়ে পরে আরও আলোচনা করা হবে) যেকোনো ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটারকে রেফারেন্স করতে ব্যবহার করতে পারেন।আপনি আপনার ফাংশন কোড থেকে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটারগুলোও অ্যাক্সেস করতে পারেন।
গত বিভাগে আপনি যে ফাংশনটি লিখেছিলেন, সেখানে পরিবর্তনের উপর নজর রাখার জন্য পাথটি হার্ড-কোড করে দিয়েছিলেন। এর পরিবর্তে ব্যবহারকারী-সংজ্ঞায়িত মান উল্লেখ করার জন্য ট্রিগার সংজ্ঞাটি পরিবর্তন করুন:
ফাংশন/ইনডেক্স.জেএস
export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreateউল্লেখ্য যে, Firebase এক্সটেনশনগুলিতে এই পরিবর্তনটি শুধুমাত্র ডকুমেন্টেশনের জন্য করা হয়েছে: যখন কোনো ক্লাউড ফাংশনকে একটি এক্সটেনশনের অংশ হিসেবে ডেপ্লয় করা হয়, তখন এটি
extension.yamlফাইল থেকে ট্রিগার ডেফিনিশন ব্যবহার করে এবং ফাংশন ডেফিনিশনে নির্দিষ্ট করা মানটিকে উপেক্ষা করে। তা সত্ত্বেও, এই মানটি কোথা থেকে আসছে তা আপনার কোডে নথিভুক্ত করে রাখা একটি ভালো অভ্যাস।এমন কোনো কোড পরিবর্তন করা যা রানটাইমে কোনো প্রভাব ফেলে না, তা আপনার কাছে হতাশাজনক মনে হতে পারে। কিন্তু এখান থেকে গুরুত্বপূর্ণ শিক্ষাটি হলো, আপনি আপনার ফাংশন কোডে যেকোনো ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার অ্যাক্সেস করতে পারেন এবং ফাংশনের লজিকে সেটিকে একটি সাধারণ মান হিসেবে ব্যবহার করতে পারেন। এই সক্ষমতার স্বীকৃতিস্বরূপ, আপনি যে ব্যবহারকারীর সংজ্ঞায়িত মানটিই অ্যাক্সেস করছেন, তা দেখানোর জন্য নিম্নলিখিত লগ স্টেটমেন্টটি যোগ করুন:
ফাংশন/ইনডেক্স.জেএস
export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate( async (snapshot, context) => { logger.log("Found new message at ", snapshot.ref); // Grab the current value of what was written to the Realtime Database. ...সাধারণত, কোনো এক্সটেনশন ইনস্টল করার সময় ব্যবহারকারীদের প্যারামিটারগুলোর জন্য মান প্রদান করতে বলা হয়। কিন্তু, যখন আপনি টেস্টিং এবং ডেভেলপমেন্টের জন্য এমুলেটর ব্যবহার করেন, তখন আপনি ইনস্টলেশন প্রক্রিয়াটি এড়িয়ে যান এবং এর পরিবর্তে একটি
envফাইল ব্যবহার করে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটারগুলোর জন্য মান প্রদান করেন।functions/integration-tests/extensions/rtdb-uppercase-messages.envখুলুন এবংGREETINGডেফিনিশনটি নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:MESSAGE_PATH=/msgs/{pushId}/originalলক্ষ্য করুন যে উপরের পাথটি ডিফল্ট পাথ এবং আপনার পূর্বে নির্ধারণ করা পাথ থেকে ভিন্ন; এটি শুধুমাত্র আপনাকে প্রমাণ করার জন্য যে, যখন আপনি আপনার আপডেট করা এক্সটেনশনটি চেষ্টা করবেন, তখন আপনার নির্ধারণ করা পাথটি কার্যকর হচ্ছে।
এখন, এমুলেটরটি পুনরায় চালু করুন এবং আবারও ডাটাবেস এমুলেটর UI-তে যান।
উপরে আপনার নির্ধারণ করা পথটি ব্যবহার করে ডাটাবেসের রুট নোডটি সম্পাদনা করুন:
- ক্ষেত্র:
msgs - ধরণ:
json - মান:
{"11": {"original": "recipe"}}
আপনি যখন আপনার ডাটাবেসের পরিবর্তনগুলো সেভ করবেন, তখন এক্সটেনশনটির
makeuppercaseফাংশনটি আগের মতোই চালু হবে, কিন্তু এখন এটি ব্যবহারকারী-নির্ধারিত প্যারামিটারটিও কনসোল লগে প্রিন্ট করবে।- ক্ষেত্র:
- আপনি
extension.yamlফাইলে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার ঘোষণা করার মাধ্যমে ব্যবহারকারীদের তাদের প্রয়োজন অনুযায়ী আপনার এক্সটেনশনটি কাস্টমাইজ করার সুযোগ দিতে পারেন। ব্যবহারকারীরা যখন আপনার এক্সটেনশনটি ইনস্টল করেন, তখন তাদের এই মানগুলি নির্ধারণ করার জন্য অনুরোধ করা হয়। - আপনি
extension.yamlফাইল এবংPOSTINSTALL.mdফাইলে নিম্নলিখিত সিনট্যাক্স ব্যবহার করে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার মান উল্লেখ করতে পারেন:${param:PARAMETER_NAME} - আপনি আপনার ক্লাউড ফাংশন কোডের মধ্যে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার মানগুলিকে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে অ্যাক্সেস করতে পারেন:
process.env.PARAMETER_NAME - এমুলেটর ব্যবহার করে পরীক্ষা করার সময়,
<extension-name>.envফাইলে ব্যবহারকারীর প্যারামিটারগুলো নির্ধারণ করুন।
আরও তথ্য
আপনার এক্সটেনশনে প্যারামিটার সেট আপ এবং ব্যবহার সম্পর্কে আরও জানুন।
৭. ব্যবহারকারী-সংজ্ঞায়িত লজিকের জন্য ইভেন্ট হুক প্রদান করুন।
একজন এক্সটেনশন লেখক হিসেবে আপনি ইতিমধ্যেই দেখেছেন, কীভাবে একটি ফায়ারবেস প্রোডাক্ট আপনার এক্সটেনশন-প্রদত্ত লজিককে সক্রিয় করতে পারে: রিয়েলটাইম ডেটাবেসে নতুন রেকর্ড তৈরি হলে আপনার makeuppercase ফাংশনটি সক্রিয় হয়। আপনার এক্সটেনশনটি যারা ইনস্টল করেন, সেই ব্যবহারকারীদের সাথেও এর একটি অনুরূপ সম্পর্ক থাকতে পারে: আপনার এক্সটেনশনটি ব্যবহারকারীর সংজ্ঞায়িত লজিককে সক্রিয় করতে পারে।
একটি এক্সটেনশন সিনক্রোনাস হুক , অ্যাসিনক্রোনাস হুক , অথবা উভয়ই প্রদান করতে পারে। সিনক্রোনাস হুক ব্যবহারকারীদের এমন সব কাজ করার সুযোগ দেয়, যা এক্সটেনশনটির কোনো একটি ফাংশনের কাজ শেষ হওয়াকে বাধা দেয়। উদাহরণস্বরূপ, কোনো এক্সটেনশন তার কাজ শুরু করার আগে ব্যবহারকারীদের নিজস্ব প্রিপ্রসেসিং করার সুযোগ দিতে এটি কার্যকর হতে পারে।
এই নির্দেশিকায়, আপনি আপনার এক্সটেনশনে একটি অ্যাসিঙ্ক্রোনাস হুক যোগ করবেন, যা ব্যবহারকারীদের তাদের নিজস্ব প্রসেসিং ধাপ নির্ধারণ করার সুযোগ দেবে। এই ধাপগুলো আপনার এক্সটেনশনটি রিয়েলটাইম ডেটাবেসে বড় হাতের অক্ষরে বার্তা লেখার পরে চালানো হবে। অ্যাসিঙ্ক্রোনাস হুকগুলো ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ট্রিগার করতে ইভেন্টআর্ক (Eventarc) ব্যবহার করে। এক্সটেনশনগুলো তারা কী ধরনের ইভেন্ট নির্গত করবে তা ঘোষণা করে, এবং ব্যবহারকারীরা যখন এক্সটেনশনটি ইনস্টল করেন, তখন তারা কোন ধরনের ইভেন্টে আগ্রহী তা বেছে নেন। যদি তারা অন্তত একটি ইভেন্ট বেছে নেন, তাহলে ফায়ারবেস ইনস্টলেশন প্রক্রিয়ার অংশ হিসেবে এক্সটেনশনটির জন্য একটি ইভেন্টআর্ক চ্যানেল সরবরাহ করবে। এরপর ব্যবহারকারীরা তাদের নিজস্ব ক্লাউড ফাংশন স্থাপন করতে পারেন, যা সেই চ্যানেলে শোনে এবং এক্সটেনশনটি নতুন ইভেন্ট প্রকাশ করলে ট্রিগার হয়।
একটি অ্যাসিঙ্ক্রোনাস হুক যোগ করতে এই ধাপগুলো অনুসরণ করুন:
extension.yamlফাইলে নিম্নলিখিত অংশটি যোগ করুন, যা এক্সটেনশনটি দ্বারা নির্গত একটিমাত্র ইভেন্টের ধরন ঘোষণা করে:events: - type: test-publisher.rtdb-uppercase-messages.v1.complete description: >- Occurs when message uppercasing completes. The event subject will contain the RTDB URL of the uppercase message.ইভেন্টের ধরণ অবশ্যই সার্বজনীনভাবে অনন্য হতে হবে; এই অনন্যতা নিশ্চিত করতে, সর্বদা নিম্নলিখিত বিন্যাস ব্যবহার করে আপনার ইভেন্টগুলির নামকরণ করুন:
<publisher-id>.<extension-id>.<version>.<description>। (আপনার এখনও কোনো প্রকাশক আইডি নেই, তাই আপাতত শুধুtest-publisherব্যবহার করুন।)makeuppercaseফাংশনের শেষে, আপনার সদ্য ঘোষিত ধরনের একটি ইভেন্ট প্রকাশ করার জন্য কিছু কোড যোগ করুন:ফাংশন/ইনডেক্স.জেএস
// Import the Eventarc library: import { initializeApp } from "firebase-admin/app"; import { getEventarc } from "firebase-admin/eventarc"; const app = initializeApp(); // In makeuppercase, after upperRef.set(uppercase), add: // 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: "test-publisher.rtdb-uppercase-messages.v1.complete", subject: upperRef.toString(), data: { "original": original, "uppercase": uppercase, }, });এই উদাহরণ কোডটি এই সত্যটির সুবিধা নেয় যে
EVENTARC_CHANNELএনভায়রনমেন্ট ভেরিয়েবলটি কেবল তখনই সংজ্ঞায়িত হয় যখন ব্যবহারকারী অন্তত একটি ইভেন্ট টাইপ সক্রিয় করেন। যদিEVENTARC_CHANNELসংজ্ঞায়িত না থাকে, তবে কোডটি কোনো ইভেন্ট প্রকাশ করার চেষ্টা করে না।আপনি একটি ইভেন্টআর্ক ইভেন্টের সাথে অতিরিক্ত তথ্য সংযুক্ত করতে পারেন। উপরের উদাহরণে, ইভেন্টটিতে একটি
subjectফিল্ড রয়েছে যা নতুন তৈরি করা ভ্যালুটির একটি রেফারেন্স ধারণ করে, এবং একটিdataপেলোড রয়েছে যা মূল এবং আপারকেস মেসেজগুলো ধারণ করে। ইভেন্টটির মাধ্যমে ট্রিগার হওয়া ইউজার-ডিফাইন্ড ফাংশনগুলো এই তথ্য ব্যবহার করতে পারে।সাধারণত, ইনস্টলেশনের সময় ব্যবহারকারীর নির্বাচিত বিকল্পগুলির উপর ভিত্তি করে
EVENTARC_CHANNELএবংEXT_SELECTED_EVENTSএনভায়রনমেন্ট ভেরিয়েবলগুলি নির্ধারিত হয়। এমুলেটর দিয়ে পরীক্ষা করার জন্য,rtdb-uppercase-messages.envফাইলে এই ভেরিয়েবলগুলি ম্যানুয়ালি নির্ধারণ করুন:EVENTARC_CHANNEL=locations/us-central1/channels/firebase EXT_SELECTED_EVENTS=test-publisher.rtdb-uppercase-messages.v1.complete
এই পর্যায়ে, আপনি আপনার এক্সটেনশনে একটি অ্যাসিঙ্ক্রোনাস ইভেন্ট হুক যোগ করার জন্য প্রয়োজনীয় ধাপগুলো সম্পন্ন করেছেন।
আপনার এইমাত্র প্রয়োগ করা নতুন বৈশিষ্ট্যটি পরীক্ষা করার জন্য, পরবর্তী কয়েকটি ধাপে, এক্সটেনশনটি ইনস্টল করছেন এমন একজন ব্যবহারকারীর ভূমিকা গ্রহণ করুন:
functions/integration-testsডিরেক্টরি থেকে একটি নতুন Firebase প্রজেক্ট শুরু করুন:firebase init functionsনির্দেশিত হলে, ডিফল্ট প্রজেক্ট সেট আপ করতে অস্বীকৃতি জানান, ক্লাউড ফাংশনস-এর ভাষা হিসেবে জাভাস্ক্রিপ্ট নির্বাচন করুন এবং প্রয়োজনীয় ডিপেন্ডেন্সিগুলো ইনস্টল করুন। এই প্রজেক্টটি একজন ব্যবহারকারীর প্রজেক্টকে প্রতিনিধিত্ব করে, যেখানে আপনার এক্সটেনশনটি ইনস্টল করা আছে।
integration-tests/functions/index.jsফাইলটি সম্পাদনা করুন এবং নিম্নলিখিত কোডটি পেস্ট করুন:import { logger } from "firebase-functions/v1"; import { onCustomEventPublished } from "firebase-functions/v2/eventarc"; import { initializeApp } from "firebase-admin/app"; import { getDatabase } from "firebase-admin/database"; const app = initializeApp(); export const extraemphasis = onCustomEventPublished( "test-publisher.rtdb-uppercase-messages.v1.complete", async (event) => { logger.info("Received makeuppercase completed event", event); const refUrl = event.subject; const ref = getDatabase().refFromURL(refUrl); const upper = (await ref.get()).val(); return ref.set(`${upper}!!!`); } );এটি এমন একটি পোস্ট-প্রসেসিং ফাংশনের উদাহরণ যা একজন ব্যবহারকারী লিখতে পারেন। এক্ষেত্রে, ফাংশনটি এক্সটেনশনটির একটি
completeইভেন্ট প্রকাশের জন্য অপেক্ষা করে, এবং যখন এটি সক্রিয় হয়, তখন নতুন করে বড় হাতের অক্ষরে রূপান্তরিত বার্তাটিতে তিনটি বিস্ময়সূচক চিহ্ন যোগ করে।এমুলেটরটি পুনরায় চালু করুন। এমুলেটরটি এক্সটেনশনের ফাংশনগুলির পাশাপাশি "ব্যবহারকারী" দ্বারা সংজ্ঞায়িত পোস্ট-প্রসেসিং ফাংশনটিও লোড করবে।
ডাটাবেস এমুলেটর UI-তে যান এবং উপরে আপনার নির্ধারণ করা পাথটি ব্যবহার করে ডাটাবেসের রুট নোডটি সম্পাদনা করুন:
- ক্ষেত্র:
msgs - ধরণ:
json - মান:
{"11": {"original": "recipe"}}
যখন আপনি আপনার ডাটাবেসের পরিবর্তনগুলি সংরক্ষণ করবেন, তখন এক্সটেনশনের
makeuppercaseফাংশন এবং ব্যবহারকারীরextraemphasisফাংশন ক্রমানুসারে সক্রিয় হবে, যার ফলেupperফিল্ডটিতেRECIPE!!!মানটি যুক্ত হবে।- ক্ষেত্র:
- আপনার এক্সটেনশনগুলিতে হুক অন্তর্ভুক্ত থাকতে পারে, যা ব্যবহারকারীদের এক্সটেনশনটির মৌলিক কার্যক্রমে তাদের নিজস্ব লজিক যুক্ত করার সুযোগ দেয়।
- ইউজার হুকগুলো সিনক্রোনাস হতে পারে, যা সম্পূর্ণ না হওয়া পর্যন্ত কোনো এক্সটেনশনের এক্সিকিউশনকে ব্লক করে রাখে। এক্সটেনশনগুলো প্রায়শই ব্যবহারকারী-সংজ্ঞায়িত প্রিপ্রসেসিং টাস্ক সম্পাদন করার জন্য সিনক্রোনাস হুক ব্যবহার করে থাকে।
- ইউজার হুক অ্যাসিঙ্ক্রোনাসও হতে পারে, যেমনটি উপরের উদাহরণে দেখানো হয়েছে। অ্যাসিঙ্ক্রোনাস হুক ব্যবহার করে এমন ইউজার-ডিফাইন্ড লজিক চালানো যায়, যা এক্সটেনশনটির সঠিকভাবে কাজ করার জন্য অপরিহার্য নয়।
আরও তথ্য
ব্যবহারকারী-সংজ্ঞায়িত লজিকের জন্য হুক যোগ করার বিষয়ে আরও জানুন, যার মধ্যে অ্যাসিঙ্ক্রোনাস এবং সিঙ্ক্রোনাস উভয় ধরনের হুক অন্তর্ভুক্ত রয়েছে।
৮. লাইফসাইকেল ইভেন্ট হ্যান্ডলার যোগ করুন
আপনি এখন পর্যন্ত যে এক্সটেনশনটি লিখেছেন, তা মেসেজ তৈরি হওয়ার সাথে সাথেই সেগুলোকে প্রসেস করে। কিন্তু যদি আপনার ব্যবহারকারীরা এক্সটেনশনটি ইনস্টল করার সময়েই তাদের কাছে আগে থেকেই মেসেজের একটি ডেটাবেস থাকে, তাহলে কী হবে? Firebase Extensions-এ লাইফসাইকেল ইভেন্ট হুকস (lifecycle event hooks) নামে একটি ফিচার আছে, যা ব্যবহার করে আপনার এক্সটেনশনটি ইনস্টল, আপডেট বা রিকনফিগার করার সময় বিভিন্ন অ্যাকশন ট্রিগার করা যায়। এই অংশে, আপনি লাইফসাইকেল ইভেন্ট হুকস ব্যবহার করে দেখবেন যে, যখন কোনো ব্যবহারকারী আপনার এক্সটেনশনটি ইনস্টল করবে, তখন প্রজেক্টের বিদ্যমান মেসেজ ডেটাবেসটিকে আপারকেস করা মেসেজ দিয়ে ব্যাকফিল করতে হবে।
ফায়ারবেস এক্সটেনশন আপনার লাইফসাইকেল ইভেন্ট হ্যান্ডলারগুলো চালানোর জন্য ক্লাউড টাস্ক ব্যবহার করে। আপনি ক্লাউড ফাংশন ব্যবহার করে ইভেন্ট হ্যান্ডলারগুলো সংজ্ঞায়িত করেন; যখনই আপনার এক্সটেনশনের কোনো ইনস্ট্যান্স সমর্থিত লাইফসাইকেল ইভেন্টগুলোর কোনো একটিতে পৌঁছায়, তখন যদি আপনি কোনো হ্যান্ডলার সংজ্ঞায়িত করে থাকেন, তবে এটি হ্যান্ডলারটিকে একটি ক্লাউড টাস্ক কিউ-তে যুক্ত করে দেবে। এরপর ক্লাউড টাস্ক অ্যাসিঙ্ক্রোনাসভাবে হ্যান্ডলারটি এক্সিকিউট করবে। যখন একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার চলতে থাকে, তখন ফায়ারবেস কনসোল ব্যবহারকারীকে জানিয়ে দেয় যে এক্সটেনশন ইনস্ট্যান্সটিতে একটি প্রসেসিং টাস্ক চলমান রয়েছে। চলমান অবস্থা এবং টাস্ক সম্পন্ন হওয়ার খবর ব্যবহারকারীকে জানানোর দায়িত্ব আপনার হ্যান্ডলার ফাংশনের।
বিদ্যমান মেসেজগুলো ব্যাকফিল করার জন্য একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার যোগ করতে, নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:
একটি নতুন ক্লাউড ফাংশন সংজ্ঞায়িত করুন যা টাস্ক কিউ ইভেন্ট দ্বারা ট্রিগার হয়:
ফাংশন/ইনডেক্স.জেএস
import { tasks } from "firebase-functions/v1"; import { getDatabase } from "firebase-admin/database"; import { getExtensions } from "firebase-admin/extensions"; import { getFunctions } from "firebase-admin/functions"; export const backfilldata = tasks.taskQueue().onDispatch(async () => { const batch = await getDatabase() .ref(process.env.MESSAGE_PATH) .parent.parent.orderByChild("upper") .limitToFirst(20) .get(); const promises = []; for (const key in batch.val()) { const msg = batch.child(key); if (msg.hasChild("original") && !msg.hasChild("upper")) { const upper = msg.child("original").val().toUpperCase(); promises.push(msg.child("upper").ref.set(upper)); } } await Promise.all(promises); if (promises.length > 0) { const queue = getFunctions().taskQueue( "backfilldata", process.env.EXT_INSTANCE_ID ); return queue.enqueue({}); } else { return getExtensions() .runtime() .setProcessingState("PROCESSING_COMPLETE", "Backfill complete."); } });লক্ষ্য করুন যে, ফাংশনটি টাস্ক কিউতে নিজেকে পুনরায় যুক্ত করার আগে মাত্র কয়েকটি রেকর্ড প্রসেস করে। ক্লাউড ফাংশনের টাইমআউট উইন্ডোর মধ্যে যে কাজগুলো সম্পন্ন হতে পারে না, সেগুলোর প্রসেসিংয়ের জন্য এটি একটি বহুল ব্যবহৃত কৌশল। যেহেতু কোনো ব্যবহারকারী আপনার এক্সটেনশনটি ইনস্টল করার সময় তার ডেটাবেসে আগে থেকেই কতগুলো মেসেজ থাকতে পারে তা আপনি অনুমান করতে পারেন না, তাই এই কৌশলটি বেশ উপযুক্ত।
extension.yamlফাইলে, আপনার ব্যাকফিল ফাংশনটিকে একটি এক্সটেনশন রিসোর্স হিসেবে ঘোষণা করুন, যেটিরtaskQueueTriggerপ্রপার্টি রয়েছে:resources: - name: makeuppercase ... - name: backfilldata type: firebaseextensions.v1beta.function description: >- Backfill existing messages with uppercase versions properties: runtime: "nodejs18" taskQueueTrigger: {}তারপর
onInstallলাইফসাইকেল ইভেন্টের হ্যান্ডলার হিসেবে ফাংশনটি ঘোষণা করুন:lifecycleEvents: onInstall: function: backfilldata processingMessage: Uppercasing existing messagesযদিও বিদ্যমান বার্তাগুলো পুনরায় পূরণ করার সুবিধাটি রয়েছে, এক্সটেনশনটি এটি ছাড়াও কাজ করতে পারে। এই ধরনের পরিস্থিতিতে, লাইফসাইকেল ইভেন্ট হ্যান্ডলারগুলো চালানো ঐচ্ছিক করে দেওয়া উচিত।
এটি করার জন্য,
extension.yamlএ একটি নতুন প্যারামিটার যোগ করুন:- param: DO_BACKFILL label: Backfill existing messages description: >- Generate uppercase versions of existing messages? type: select required: true options: - label: Yes value: true - label: No value: falseতারপর ব্যাকফিল ফাংশনের শুরুতে,
DO_BACKFILLপ্যারামিটারের মান পরীক্ষা করুন এবং যদি এটি সেট করা না থাকে তবে ফাংশনটি থেকে আগেই বেরিয়ে যান:ফাংশন/ইনডেক্স.জেএস
if (!process.env.DO_BACKFILL) { return getExtensions() .runtime() .setProcessingState("PROCESSING_COMPLETE", "Backfill skipped."); }
উপরোক্ত পরিবর্তনগুলোর ফলে, এক্সটেনশনটি ইনস্টল হওয়ার পর বিদ্যমান মেসেজগুলোকে এখন থেকে বড় হাতের অক্ষরে (uppercase) রূপান্তর করবে।
এই পর্যন্ত, আপনি আপনার এক্সটেনশনটি তৈরি করতে এবং চলমান পরিবর্তনগুলো পরীক্ষা করতে এক্সটেনশন এমুলেটর ব্যবহার করেছেন। তবে, এক্সটেনশন এমুলেটর ইনস্টলেশন প্রক্রিয়াটি এড়িয়ে যায়, তাই আপনার onInstall ইভেন্ট হ্যান্ডলার পরীক্ষা করার জন্য, আপনাকে একটি আসল প্রজেক্টে এক্সটেনশনটি ইনস্টল করতে হবে। যদিও এটা ভালোই হয়েছে, কারণ এই স্বয়ংক্রিয় ব্যাকফিল ফিচারটি যুক্ত হওয়ার ফলে টিউটোরিয়াল এক্সটেনশনটির কোড এখন সম্পূর্ণ!
ব্যবহারকারীরা যখন এক্সটেনশন ব্যবস্থাপনার নির্দিষ্ট কিছু কাজ সম্পাদন করেন, তখন লাইফসাইকেল ইভেন্টগুলো ট্রিগার হয়:
- একটি এক্সটেনশনের ইনস্ট্যান্স ইনস্টল করা
- কোনো এক্সটেনশনের একটি ইনস্ট্যান্সকে নতুন সংস্করণে আপডেট করা
- একটি এক্সটেনশনের ইনস্ট্যান্স পুনঃকনফিগার করা
আপনি এমন ফাংশন সংজ্ঞায়িত করতে পারেন যা আপনার এক্সটেনশনের লাইফসাইকেল ইভেন্টগুলিতে সক্রিয় হয়।
লাইফসাইকেল ইভেন্ট হ্যান্ডলারের স্ট্যাটাস ব্যবহারকারীকে জানানোর জন্য অ্যাডমিন SDK-এর এক্সটেনশন রানটাইম API ব্যবহার করুন। ব্যবহারকারীরা ফায়ারবেস কনসোলে একটি এক্সটেনশনের বর্তমান প্রসেসিং স্ট্যাটাস দেখতে পাবেন।
যেসব ফাংশন আপনার সম্পূর্ণ ডাটাবেসের উপর কাজ করে (যেমন ব্যাকফিল অপারেশন), সেগুলো প্রায়শই ক্লাউড ফাংশনের সময়সীমা শেষ হওয়ার আগেই সম্পন্ন হতে পারে না। আপনার কাজটি একাধিক ফাংশন ইনভোকেশনে ভাগ করে আপনি এই সমস্যাটি এড়াতে পারেন।
আপনার এক্সটেনশনে যদি এমন লাইফসাইকেল ইভেন্ট হ্যান্ডলার থাকে যা এক্সটেনশনটির কার্যকারিতার জন্য অপরিহার্য নয়, তবে হ্যান্ডলারটির সম্পাদন ব্যবহারকারী-কনফিগারযোগ্য করে তোলা উচিত।
আরও তথ্য
আপনার এক্সটেনশনের লাইফসাইকেল ইভেন্টগুলো পরিচালনা করার বিষয়ে আরও জানুন।
৯. একটি বাস্তব ফায়ারবেস প্রকল্পে স্থাপন করুন
যদিও ডেভেলপমেন্টের সময় কোনো এক্সটেনশনের দ্রুত উন্নতি সাধনের জন্য এক্সটেনশন এমুলেটর একটি চমৎকার টুল, এক পর্যায়ে আপনি এটিকে একটি বাস্তব প্রজেক্টে ব্যবহার করে দেখতে চাইবেন।
এটি করার জন্য, প্রথমে কিছু পরিষেবা সক্রিয় করে একটি নতুন প্রজেক্ট সেট আপ করুন:
- ফায়ারবেস কনসোলে একটি নতুন প্রজেক্ট যোগ করুন।
- আপনার প্রজেক্টটি পে-অ্যাজ-ইউ-গো ব্লেজ প্ল্যানে আপগ্রেড করুন । ক্লাউড ফাংশনস ফর ফায়ারবেস ব্যবহার করার জন্য আপনার প্রজেক্টে একটি বিলিং অ্যাকাউন্ট থাকা আবশ্যক, তাই একটি এক্সটেনশন ইনস্টল করার জন্যও আপনার একটি বিলিং অ্যাকাউন্ট প্রয়োজন।
- আপনার নতুন প্রজেক্টে রিয়েল-টাইম ডাটাবেস সক্রিয় করুন ।
- যেহেতু আপনি ইনস্টলেশনের সময় বিদ্যমান ডেটা ব্যাকফিল করার ক্ষেত্রে আপনার এক্সটেনশনের সক্ষমতা পরীক্ষা করতে চান, তাই আপনার রিয়েল-টাইম ডাটাবেস ইনস্ট্যান্সে কিছু নমুনা ডেটা ইম্পোর্ট করুন:
- কিছু সিড আরটিডিবি ডেটা ডাউনলোড করুন।
- Firebase কনসোলের রিয়েল-টাইম ডেটাবেস পৃষ্ঠায়, (more) > Import JSON- এ ক্লিক করুন এবং আপনি এইমাত্র ডাউনলোড করা ফাইলটি নির্বাচন করুন।
ব্যাকফিল ফাংশনকে
orderByChildমেথড ব্যবহার করার সুযোগ দিতে, ডেটাবেসকেupperএর মানের উপর ভিত্তি করে মেসেজ ইন্ডেক্স করার জন্য কনফিগার করুন।{ "rules": { ".read": false, ".write": false, "messages": { ".indexOn": "upper" } } }
এখন আপনার এক্সটেনশনটি লোকাল সোর্স থেকে নতুন প্রজেক্টে ইনস্টল করুন:
আপনার ফায়ারবেস প্রজেক্টের জন্য একটি নতুন ডিরেক্টরি তৈরি করুন:
mkdir ~/extensions-live-test && cd ~/extensions-live-testওয়ার্কিং ডিরেক্টরিতে একটি ফায়ারবেস প্রজেক্ট শুরু করুন:
firebase init databaseনির্দেশিত হলে, আপনার এইমাত্র তৈরি করা প্রজেক্টটি নির্বাচন করুন।
আপনার স্থানীয় ফায়ারবেস প্রজেক্টে এক্সটেনশনটি ইনস্টল করুন:
firebase ext:install /path/to/rtdb-uppercase-messagesএখানে আপনি দেখতে পারেন, Firebase CLI টুল ব্যবহার করে কোনো এক্সটেনশন ইনস্টল করার সময় ব্যবহারকারীর অভিজ্ঞতা কেমন হয়। কনফিগারেশন টুলটি যখন আপনার বিদ্যমান ডেটাবেস ব্যাকফিল করতে চান কিনা জিজ্ঞাসা করবে, তখন অবশ্যই "হ্যাঁ" নির্বাচন করবেন।
কনফিগারেশন অপশনগুলো নির্বাচন করার পর, Firebase CLI আপনার কনফিগারেশনটি
extensionsডিরেক্টরিতে সংরক্ষণ করবে এবংfirebase.jsonফাইলে এক্সটেনশনের সোর্স লোকেশনটি রেকর্ড করবে। সম্মিলিতভাবে, এই দুটি রেকর্ডকে extensions manifest বলা হয়। ব্যবহারকারীরা তাদের এক্সটেনশন কনফিগারেশন সংরক্ষণ করতে এবং বিভিন্ন প্রজেক্টে তা ডেপ্লয় করতে এই ম্যানিফেস্ট ব্যবহার করতে পারেন।আপনার এক্সটেনশন কনফিগারেশনটি আপনার লাইভ প্রোজেক্টে ডিপ্লয় করুন:
firebase deploy --only extensions
সবকিছু ঠিকঠাক থাকলে, Firebase CLI আপনার এক্সটেনশনটি আপনার প্রোজেক্টে আপলোড এবং ইনস্টল করবে। ইনস্টলেশন সম্পন্ন হলে, ব্যাকফিল টাস্কটি চলবে এবং কয়েক মিনিটের মধ্যে আপনার ডাটাবেস বড় হাতের অক্ষরে লেখা মেসেজ দিয়ে আপডেট হয়ে যাবে। মেসেজ ডাটাবেসে কিছু নতুন নোড যোগ করুন এবং নিশ্চিত করুন যে এক্সটেনশনটি নতুন মেসেজগুলোর জন্যও কাজ করছে।
- ব্যবহারকারীরা `
firebase ext:installকমান্ড ব্যবহার করে একটি এক্সটেনশন ম্যানিফেস্ট তৈরি করতে পারেন। এছাড়াও, স্থানীয় উৎস থেকে একটি এক্সটেনশন ইনস্টল করার জন্য আপনি এই কমান্ডটি ব্যবহার করতে পারেন। -
firebase deployব্যবহার করে একটি ম্যানিফেস্ট থেকে এক্সটেনশন কনফিগারেশন একটি লাইভ প্রজেক্টে ডিপ্লয় করুন। - যদিও এখানে তা দেখানো হয়নি, ব্যবহারকারীরা এক্সটেনশন হাব থেকেও তাদের প্রোজেক্টে এক্সটেনশন ইনস্টল করতে পারেন।
আরও তথ্য
এক্সটেনশন ম্যানিফেস্ট ব্যবহার করে প্রজেক্ট কনফিগারেশন পরিচালনা করার বিষয়ে ব্যবহারকারী ডকুমেন্টেশন দেখুন।
১০. ডকুমেন্টেশন লিখুন
ব্যবহারকারীদের সাথে আপনার এক্সটেনশনটি শেয়ার করার আগে, নিশ্চিত করুন যে তারা সফলভাবে এটি ব্যবহার করতে পারে, তার জন্য আপনি পর্যাপ্ত ডকুমেন্টেশন প্রদান করছেন।
আপনি যখন এক্সটেনশন প্রজেক্টটি চালু করেছিলেন, তখন Firebase CLI ন্যূনতম প্রয়োজনীয় ডকুমেন্টেশনের স্টাব ভার্সন তৈরি করেছিল। আপনার তৈরি করা এক্সটেনশনটিকে সঠিকভাবে প্রতিফলিত করার জন্য এই ফাইলগুলো আপডেট করুন।
extension.yaml
আপনি এই এক্সটেনশনটি তৈরি করার সময় ইতোমধ্যেই এই ফাইলটি আপডেট করে আসছেন, তাই এখন আর কোনো আপডেট করার প্রয়োজন নেই।
তবে, এই ফাইলে থাকা ডকুমেন্টেশনের গুরুত্বকে উপেক্ষা করবেন না। একটি এক্সটেনশনের গুরুত্বপূর্ণ শনাক্তকারী তথ্য—যেমন নাম, বিবরণ, লেখক, অফিসিয়াল রিপোজিটরি লোকেশন—ছাড়াও extension.yaml ফাইলটিতে প্রতিটি রিসোর্স এবং ব্যবহারকারী-কনফিগারযোগ্য প্যারামিটারের জন্য ব্যবহারকারী-মুখী ডকুমেন্টেশন থাকে। এই তথ্য ফায়ারবেস কনসোল, এক্সটেনশনস হাব এবং ফায়ারবেস সিএলআই-তে ব্যবহারকারীদের কাছে প্রদর্শিত হয়।
PREINSTALL.md
এই ফাইলে, আপনার এক্সটেনশনটি ইনস্টল করার আগে ব্যবহারকারীর প্রয়োজনীয় তথ্য দিন: এক্সটেনশনটি কী কাজ করে তা সংক্ষেপে বর্ণনা করুন, কোনো পূর্বশর্ত থাকলে তা ব্যাখ্যা করুন এবং এক্সটেনশনটি ইনস্টল করার ফলে বিল সংক্রান্ত কী প্রভাব পড়বে, সে বিষয়ে ব্যবহারকারীকে তথ্য দিন। আপনার যদি অতিরিক্ত তথ্যসহ কোনো ওয়েবসাইট থাকে, তবে সেটির লিঙ্ক দেওয়ার জন্যও এটি একটি ভালো জায়গা।
এই ফাইলের টেক্সট ব্যবহারকারীকে এক্সটেনশনস হাব-এ এবং firebase ext:info কমান্ডের মাধ্যমে দেখানো হয়।
এখানে একটি PREINSTALL ফাইলের উদাহরণ দেওয়া হলো:
Use this extension to automatically convert strings to upper case when added to
a specified Realtime Database path.
This extension expects a database layout like the following example:
"messages": {
MESSAGE_ID: {
"original": MESSAGE_TEXT
},
MESSAGE_ID: {
"original": MESSAGE_TEXT
},
}
When you create new string records, this extension creates a new sibling record
with upper-cased text:
MESSAGE_ID: {
"original": MESSAGE_TEXT,
"upper": UPPERCASE_MESSAGE_TEXT,
}
#### Additional setup
Before installing this extension, make sure that you've
[set up Realtime Database](https://firebase.google.com/docs/database/quickstart)
in your Firebase project.
#### Billing
To install an extension, your project must be on the
[Blaze (pay as you go) plan](https://firebase.google.com/pricing).
- This extension uses other Firebase and Google Cloud Platform services, which
have associated charges if you exceed the service's no-cost tier:
- Realtime Database
- Cloud Functions (Node.js 10+ runtime)
[See FAQs](/docs/functions/faq-and-troubleshooting#extensions-pricing)
- If you enable events,
[Eventarc fees apply](https://cloud.google.com/eventarc/pricing).
পোস্টইনস্টল.এমডি
এই ফাইলে এমন সব তথ্য রয়েছে যা আপনার এক্সটেনশনটি সফলভাবে ইনস্টল করার পর ব্যবহারকারীদের জন্য দরকারি: যেমন, পরবর্তী সেটআপের ধাপসমূহ, এক্সটেনশনটি কীভাবে কাজ করে তার একটি উদাহরণ, ইত্যাদি।
একটি এক্সটেনশন কনফিগার এবং ইনস্টল করার পরে POSTINSTALL.md ফাইলের বিষয়বস্তু ফায়ারবেস কনসোলে প্রদর্শিত হয়। আপনি এই ফাইলে ব্যবহারকারীর প্যারামিটার উল্লেখ করতে পারেন এবং সেগুলি কনফিগার করা মান দ্বারা প্রতিস্থাপিত হবে।
টিউটোরিয়াল এক্সটেনশনটির জন্য এখানে একটি পোস্ট-ইনস্টল ফাইলের উদাহরণ দেওয়া হলো:
### See it in action
You can test out this extension right away!
1. Go to your
[Realtime Database dashboard](https://console.firebase.google.com/project/${param:PROJECT_ID}/database/${param:PROJECT_ID}/data) in the Firebase console.
1. Add a message string to a path that matches the pattern `${param:MESSAGE_PATH}`.
1. In a few seconds, you'll see a sibling node named `upper` that contains the
message in upper case.
### Using the extension
We recommend adding data by pushing -- for example,
`firebase.database().ref().push()` -- because pushing assigns an automatically
generated ID to the node in the database. During retrieval, these nodes are
guaranteed to be ordered by the time they were added. Learn more about reading
and writing data for your platform (iOS, Android, or Web) in the
[Realtime Database documentation](https://firebase.google.com/docs/database/).
### Monitoring
As a best practice, you can
[monitor the activity](https://firebase.google.com/docs/extensions/manage-installed-extensions#monitor)
of your installed extension, including checks on its health, usage, and logs.
পরিবর্তন লগ.এমডি
একটি এক্সটেনশনের দুটি রিলিজের মধ্যবর্তী সময়ে আপনি যে পরিবর্তনগুলো করেন, সেগুলোও CHANGELOG.md ফাইলে নথিভুক্ত করা উচিত।
যেহেতু উদাহরণ এক্সটেনশনটি আগে কখনও প্রকাশিত হয়নি, তাই চেঞ্জ লগে কেবল একটি এন্ট্রি রয়েছে:
## Version 0.0.1
Initial release of the _Convert messages to upper case_ extension.
README.md
বেশিরভাগ এক্সটেনশনই তাদের রিপোজিটরি পরিদর্শনকারী ব্যবহারকারীদের সুবিধার জন্য একটি রিডমি ফাইল প্রদান করে। আপনি এই ফাইলটি নিজে লিখতে পারেন অথবা কমান্ড ব্যবহার করে একটি রিডমি ফাইল তৈরি করতে পারেন।
এই নির্দেশিকার জন্য, রিডমি ফাইল লেখার প্রয়োজন নেই।
অতিরিক্ত নথিপত্র
উপরে আলোচিত ডকুমেন্টেশনটি হলো ন্যূনতম ডকুমেন্টেশন যা আপনার ব্যবহারকারীদের প্রদান করা উচিত। অনেক এক্সটেনশন সফলভাবে ব্যবহার করার জন্য ব্যবহারকারীদের আরও বিস্তারিত ডকুমেন্টেশনের প্রয়োজন হয়। সেক্ষেত্রে, আপনার অতিরিক্ত ডকুমেন্টেশন লেখা উচিত এবং এমন কোনো স্থানে তা হোস্ট করা উচিত যেখানে আপনি ব্যবহারকারীদের নির্দেশ করতে পারেন।
এই নির্দেশিকার জন্য, আরও বিশদ নথি লেখার প্রয়োজন নেই।
- ন্যূনতমপক্ষে, প্রতিটি এক্সটেনশনে নিম্নলিখিত ফাইলগুলিতে ব্যবহারকারী ডকুমেন্টেশন থাকা উচিত:
extension.yaml,PREINSTALL.md,POSTINSTALL.md, এবংCHANGELOG.md। - প্রয়োজন হলে ব্যবহারকারীদের আরও বিস্তারিত ডকুমেন্টেশন প্রদান করা উচিত।
আরও তথ্য
ডকুমেন্টেশন লেখার বিষয়ে ডকুমেন্টেশন দেখুন।
১১. এক্সটেনশন হাবে প্রকাশ করুন
এখন যেহেতু আপনার এক্সটেনশনের কোড লেখা ও ডকুমেন্টেশন সম্পন্ন হয়েছে, আপনি এক্সটেনশনস হাব-এ এটি সবার সাথে শেয়ার করার জন্য প্রস্তুত। কিন্তু যেহেতু এটি শুধুমাত্র একটি টিউটোরিয়াল, তাই বাস্তবে তা করবেন না। এখানে এবং ফায়ারবেস এক্সটেনশনস পাবলিশারের বাকি ডকুমেন্টেশন থেকে যা শিখেছেন, তা ব্যবহার করে এবং ফায়ারবেস দ্বারা লিখিত অফিসিয়াল এক্সটেনশনগুলোর সোর্স কোড পরীক্ষা করে নিজের এক্সটেনশন লেখা শুরু করুন।
আপনি যখন এক্সটেনশনস হাব-এ আপনার কাজ প্রকাশ করার জন্য প্রস্তুত হবেন, তখন এইভাবেই তা করবেন:
- আপনি যদি আপনার প্রথম এক্সটেনশনটি প্রকাশ করেন, তাহলে একজন এক্সটেনশন প্রকাশক হিসেবে নিবন্ধন করুন । এক্সটেনশন প্রকাশক হিসেবে নিবন্ধন করলে, আপনি একটি প্রকাশক আইডি তৈরি করেন, যা ব্যবহারকারীদের আপনাকে আপনার এক্সটেনশনের লেখক হিসেবে দ্রুত শনাক্ত করতে সাহায্য করে।
আপনার এক্সটেনশনের সোর্স কোড একটি সর্বজনীনভাবে যাচাইযোগ্য স্থানে হোস্ট করুন। যখন আপনার কোড একটি যাচাইযোগ্য উৎস থেকে পাওয়া যায়, তখন Firebase সরাসরি সেই স্থান থেকে আপনার এক্সটেনশনটি প্রকাশ করতে পারে। এটি নিশ্চিত করতে সাহায্য করে যে আপনি আপনার এক্সটেনশনের সদ্য প্রকাশিত সংস্করণটিই প্রকাশ করছেন, এবং ব্যবহারকারীদের তাদের প্রোজেক্টে ইনস্টল করা কোড পরীক্ষা করার সুযোগ দিয়ে তাদেরও সাহায্য করে।
বর্তমানে, এর অর্থ হলো আপনার এক্সটেনশনটি একটি পাবলিক গিটহাব রিপোজিটরিতে উপলব্ধ করা।
firebase ext:dev:uploadকমান্ড ব্যবহার করে আপনার এক্সটেনশনটি এক্সটেনশনস হাব-এ আপলোড করুন।Firebase কনসোলে আপনার পাবলিশার ড্যাশবোর্ডে যান, আপনি এইমাত্র যে এক্সটেনশনটি আপলোড করেছেন সেটি খুঁজুন এবং "Publish to Extensions Hub"-এ ক্লিক করুন। এটি আমাদের রিভিউ স্টাফদের দ্বারা পর্যালোচনার জন্য একটি অনুরোধ পাঠায়, যাতে কয়েক দিন সময় লাগতে পারে। অনুমোদিত হলে, এক্সটেনশনটি Extensions Hub-এ প্রকাশিত হবে। প্রত্যাখ্যাত হলে, আপনি কারণ ব্যাখ্যা করে একটি বার্তা পাবেন; তখন আপনি রিপোর্ট করা সমস্যাগুলো সমাধান করে পর্যালোচনার জন্য পুনরায় জমা দিতে পারেন।
- এক্সটেনশনস হাব-এ এক্সটেনশন শেয়ার করতে হলে, আপনাকে প্রকাশক হিসেবে নিবন্ধিত হতে হবে।
- একটি যাচাইযোগ্য উৎস থেকে প্রকাশ করা আবশ্যক, এবং এটি ব্যবহারকারীদের এই আশ্বাস দেয় যে, তাঁরা যে কোডটি ইনস্টল করছেন তা সেই একই কোড যা তাঁরা গিটহাবে পরীক্ষা করে দেখতে পারেন।
- এক্সটেনশনস হাবে একটি এক্সটেনশন আপলোড করতে
firebase ext:dev:uploadকমান্ডটি ব্যবহার করুন। - পাবলিশার ড্যাশবোর্ড থেকে পর্যালোচনার জন্য আপনার এক্সটেনশনগুলো জমা দিন।
আরও তথ্য
প্রকাশক হিসেবে নিবন্ধন এবং এক্সটেনশন প্রকাশ করার বিষয়ে আরও জানুন।