এই পৃষ্ঠাটি আপনাকে একটি সহজ ফায়ারবেস এক্সটেনশন তৈরি করার জন্য প্রয়োজনীয় পদক্ষেপগুলি সম্পর্কে জানাবে, যা আপনি আপনার প্রকল্পগুলিতে ইনস্টল করতে পারেন বা অন্যদের সাথে ভাগ করতে পারেন। ফায়ারবেস এক্সটেনশনের এই সহজ উদাহরণটি আপনার রিয়েলটাইম ডেটাবেস বার্তাগুলির জন্য নজর রাখবে এবং সেগুলিকে বড় হাতের অক্ষরে রূপান্তর করবে।
১. আপনার পরিবেশ সেট আপ করুন এবং একটি প্রকল্প শুরু করুন
একটি এক্সটেনশন তৈরি শুরু করার আগে, আপনাকে প্রয়োজনীয় সরঞ্জাম সহ একটি বিল্ড পরিবেশ সেট আপ করতে হবে।
Node.js ১৬ বা তার পরবর্তী সংস্করণ ইনস্টল করুন। 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) লোড করে। এখন পর্যন্ত এক্সটেনশনটিতে একটি একক HTTP-ট্রিগার করা ফাংশন,greetTheWorld, রয়েছে, যা অ্যাক্সেস করার সময় একটি "হ্যালো ওয়ার্ল্ড" বার্তা প্রদান করে।এমুলেটরটি এখনও চালু থাকা অবস্থায়, এক্সটেনশনটির
greetTheWorldফাংশনটি ব্যবহার করে দেখুন, এটি শুরু করার সময় এটি যে URL টি প্রিন্ট করেছিল সেখানে গিয়ে।আপনার ব্রাউজারে "greet-the-world থেকে Hello 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}`;আপনার পরিবর্তনগুলি সংরক্ষণ করুন। এমুলেটর আপনার কোডটি পুনরায় লোড করবে, এবং এখন, যখন আপনি ফাংশন URL এ যাবেন, তখন আপনি আপডেট করা শুভেচ্ছা দেখতে পাবেন।
এক্সটেনশন এমুলেটর ব্যবহার করলে আপনার কোড দ্রুত পরীক্ষা এবং পুনরাবৃত্তি করার সুযোগ পেয়ে ডেভেলপমেন্ট দ্রুত হতে পারে।
অধিক তথ্য
এক্সটেনশন এমুলেটর ব্যবহার সম্পর্কে আরও জানুন।
৩. 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-worldrtdb-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 মডিউল সিনট্যাক্স (importandexport) ব্যবহার করে। 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"বিষয়বস্তু সহ বার্তা 11-এ একটি চাইল্ড রেকর্ড যুক্ত করবে। প্রত্যাশিত ফলাফল নিশ্চিত করতে এমুলেটর UI এর লগ এবং ডাটাবেস ট্যাবগুলি একবার দেখুন।- ক্ষেত্র:
messagesনোডে আরও কিছু শিশু যোগ করার চেষ্টা করুন ({"original":"any text"})। যখনই আপনি একটি নতুন রেকর্ড যোগ করবেন, এক্সটেনশনটিতেoriginalক্ষেত্রের বড় হাতের বিষয়বস্তু সম্বলিত একটিuppercaseক্ষেত্র যুক্ত করা উচিত।
এখন আপনার কাছে একটি সম্পূর্ণ, যদিও সহজ, এক্সটেনশন আছে যা একটি RTDB ইনস্ট্যান্সে কাজ করে। পরবর্তী বিভাগগুলিতে, আপনি কিছু অতিরিক্ত বৈশিষ্ট্য সহ এই এক্সটেনশনটি পরিমার্জন করবেন। তারপর, আপনি অন্যদের কাছে বিতরণের জন্য এক্সটেনশনটি প্রস্তুত করবেন এবং অবশেষে, এক্সটেনশন হাবে আপনার এক্সটেনশনটি কীভাবে প্রকাশ করবেন তা শিখবেন।
- আপনার এক্সটেনশনের লজিক তৈরি করে এমন ফাংশনগুলিকে অবশ্যই ক্লাউড ফাংশন কোড হিসাবে সংজ্ঞায়িত করতে হবে এবং
extension.yamlফাইলে একটি এক্সটেনশন রিসোর্স হিসাবে ঘোষণা করতে হবে। - আপনি এমন ফাংশন লিখতে পারেন যা HTTP এন্ডপয়েন্ট অ্যাক্সেস করার সময় ট্রিগার হয়, অথবা Firebase পণ্য, Google ক্লাউড পণ্য এবং অন্যান্য এক্সটেনশন দ্বারা নির্গত ইভেন্টের প্রতিক্রিয়ায়।
অধিক তথ্য
- এক্সটেনশনের জন্য ক্লাউড ফাংশন লেখা সম্পর্কে আরও জানুন, সমর্থিত ইভেন্ট ট্রিগার সম্পর্কে আরও জানুন।
-
extension.yamlরেফারেন্সে ফাইলটির সম্পূর্ণ স্পেসিফিকেশন রয়েছে; তবে, এই ডকুমেন্টেশনে এই ফাইলটির নির্দিষ্ট ব্যবহার সম্পর্কে আলোচনা করা হবে কারণ আপনার সেগুলি ব্যবহার করার প্রয়োজন। - Firebase ডকুমেন্টেশনের জন্য Cloud Functions-এ Cloud Functions ব্যবহার সম্পর্কে সাধারণ তথ্য রয়েছে, Firebase এক্সটেনশনের জন্য নির্দিষ্ট নয়।
৫. API এবং ভূমিকা ঘোষণা করুন
ফায়ারবেস একটি ইনস্টল করা এক্সটেনশনের প্রতিটি উদাহরণকে একটি প্রতি-ইনস্ট্যান্স পরিষেবা অ্যাকাউন্ট ব্যবহার করে প্রকল্প এবং এর ডেটাতে সীমিত অ্যাক্সেস দেয়। প্রতিটি অ্যাকাউন্ট পরিচালনার জন্য প্রয়োজনীয় ন্যূনতম অনুমতির সেট থাকে। এই কারণে, আপনার এক্সটেনশনের জন্য প্রয়োজনীয় IAM ভূমিকাগুলি স্পষ্টভাবে ঘোষণা করতে হবে; ব্যবহারকারীরা যখন আপনার এক্সটেনশন ইনস্টল করেন, তখন ফায়ারবেস এই ভূমিকাগুলি মঞ্জুর করে একটি পরিষেবা অ্যাকাউন্ট তৈরি করে এবং এক্সটেনশনটি চালানোর জন্য এটি ব্যবহার করে।
কোনও পণ্যের ইভেন্ট চালু করার জন্য আপনাকে ভূমিকা ঘোষণা করতে হবে না, তবে অন্যথায় এটির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে একটি ভূমিকা ঘোষণা করতে হবে। যেহেতু আপনি শেষ ধাপে যে ফাংশনটি যোগ করেছেন তা রিয়েলটাইম ডেটাবেসে লেখা হয়, তাই আপনাকে extension.yaml এ নিম্নলিখিত ঘোষণাটি যোগ করতে হবে:
roles:
- role: firebasedatabase.admin
reason: Allows the extension to write to RTDB.
একইভাবে, আপনি apis ফিল্ডে একটি এক্সটেনশন ব্যবহার করে এমন Google API গুলি ঘোষণা করেন। ব্যবহারকারীরা যখন আপনার এক্সটেনশন ইনস্টল করবেন, তখন তাদের জিজ্ঞাসা করা হবে যে তারা তাদের প্রকল্পের জন্য এই API গুলি স্বয়ংক্রিয়ভাবে সক্ষম করতে চান কিনা। এটি সাধারণত শুধুমাত্র নন-ফায়ারবেস Google API গুলির জন্য প্রয়োজনীয়, এবং এই নির্দেশিকার জন্য এটি প্রয়োজন হয় না।
-
extensions.yamlএরrolesক্ষেত্রে আপনার এক্সটেনশনের প্রয়োজনীয় যেকোনো IAM ভূমিকা ঘোষণা করুন। ইনস্টল করা হলে, এক্সটেনশনগুলি স্বয়ংক্রিয়ভাবে এই ভূমিকাগুলি প্রদান করে। - আপনার এক্সটেনশনের জন্য প্রয়োজনীয় যেকোনো Google API
extensions.yamlএরapisফিল্ডে ঘোষণা করুন। ব্যবহারকারীরা যখন আপনার এক্সটেনশন ইনস্টল করেন, তখন তারা তাদের প্রকল্পের জন্য এই API গুলি স্বয়ংক্রিয়ভাবে সক্ষম করতে পারেন। - ডকুমেন্টেশনের উদ্দেশ্যে,
extensions.yamlএরexternalServicesক্ষেত্রে আপনার এক্সটেনশনের প্রয়োজনীয় যেকোনো নন-Google API ঘোষণা করুন।
অধিক তথ্য
- একটি এক্সটেনশনের জন্য উপযুক্ত অ্যাক্সেস সেট আপ করার বিষয়ে আরও জানুন।
-
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 Extensions-এ, এই পরিবর্তনটি সম্পূর্ণরূপে ডকুমেন্টেশনের জন্য: যখন একটি ক্লাউড ফাংশন একটি এক্সটেনশনের অংশ হিসাবে স্থাপন করা হয়, তখন এটি
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ফাইলে ব্যবহারকারীর পরামিতি নির্ধারণ করুন।
অধিক তথ্য
আপনার এক্সটেনশনে প্যারামিটার সেট আপ এবং ব্যবহার সম্পর্কে আরও জানুন।
৭. ব্যবহারকারী-সংজ্ঞায়িত যুক্তির জন্য ইভেন্ট হুক প্রদান করুন
একজন এক্সটেনশন লেখক হিসেবে, আপনি ইতিমধ্যেই দেখেছেন কিভাবে একটি Firebase পণ্য আপনার এক্সটেনশন-প্রদত্ত লজিককে ট্রিগার করতে পারে: রিয়েলটাইম ডেটাবেসে নতুন রেকর্ড তৈরি করলে আপনার makeuppercase ফাংশনটি ট্রিগার হয়। আপনার এক্সটেনশনের সাথে আপনার এক্সটেনশনটি ইনস্টল করা ব্যবহারকারীদের একটি অনুরূপ সম্পর্ক থাকতে পারে: আপনার এক্সটেনশন ব্যবহারকারীর সংজ্ঞা অনুসারে লজিককে ট্রিগার করতে পারে।
একটি এক্সটেনশন সিঙ্ক্রোনাস হুক , অ্যাসিঙ্ক্রোনাস হুক , অথবা উভয়ই প্রদান করতে পারে। সিঙ্ক্রোনাস হুক ব্যবহারকারীদের এমন কাজ সম্পাদন করার একটি উপায় দেয় যা এক্সটেনশনের একটি ফাংশন সম্পূর্ণ করতে বাধা দেয়। এটি কার্যকর হতে পারে, উদাহরণস্বরূপ, ব্যবহারকারীদের একটি এক্সটেনশন তার কাজ করার আগে কাস্টম প্রিপ্রসেসিং করার একটি উপায় দেওয়ার জন্য।
এই নির্দেশিকায়, আপনি আপনার এক্সটেনশনে একটি অ্যাসিঙ্ক্রোনাস হুক যুক্ত করবেন, যা ব্যবহারকারীদের তাদের নিজস্ব প্রক্রিয়াকরণ পদক্ষেপগুলি সংজ্ঞায়িত করতে সক্ষম করবে যা আপনার এক্সটেনশনটি রিয়েলটাইম ডাটাবেসে বড় হাতের বার্তা লেখার পরে চালানো হবে। অ্যাসিঙ্ক্রোনাস হুকগুলি ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি ট্রিগার করতে Eventarc ব্যবহার করে। এক্সটেনশনগুলি তারা যে ধরণের ইভেন্ট নির্গত করে তা ঘোষণা করে এবং ব্যবহারকারীরা যখন এক্সটেনশনটি ইনস্টল করেন, তখন তারা কোন ধরণের ইভেন্টে আগ্রহী তা বেছে নেয়। যদি তারা কমপক্ষে একটি ইভেন্ট বেছে নেয়, তাহলে ইনস্টলেশন প্রক্রিয়ার অংশ হিসাবে Firebase এক্সটেনশনের জন্য একটি 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সংজ্ঞায়িত না থাকে, তাহলে কোডটি কোনও ইভেন্ট প্রকাশ করার চেষ্টা করে না।আপনি একটি Eventarc ইভেন্টে অতিরিক্ত তথ্য সংযুক্ত করতে পারেন। উপরের উদাহরণে, ইভেন্টটিতে একটি
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 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 আপনার লাইফসাইকেল ইভেন্ট হ্যান্ডলার চালানোর জন্য Cloud Tasks ব্যবহার করে। আপনি Cloud Functions ব্যবহার করে ইভেন্ট হ্যান্ডলার সংজ্ঞায়িত করেন; যখনই আপনার এক্সটেনশনের একটি ইনস্ট্যান্স সমর্থিত লাইফসাইকেল ইভেন্টগুলির একটিতে পৌঁছায়, যদি আপনি একটি হ্যান্ডলার সংজ্ঞায়িত করে থাকেন, তাহলে এটি হ্যান্ডলারটিকে একটি Cloud Tasks কিউতে যুক্ত করবে। Cloud Tasks তারপর অ্যাসিঙ্ক্রোনাসভাবে হ্যান্ডলারটি কার্যকর করবে। যখন একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার চলমান থাকে, তখন Firebase কনসোল ব্যবহারকারীকে রিপোর্ট করবে যে এক্সটেনশন ইনস্ট্যান্সের একটি প্রক্রিয়াকরণ কাজ চলছে। চলমান অবস্থা এবং টাস্ক সমাপ্তির রিপোর্ট ব্যবহারকারীকে ফেরত পাঠানো আপনার হ্যান্ডলার ফাংশনের উপর নির্ভর করে।
বিদ্যমান বার্তাগুলিকে ব্যাকফিল করে এমন একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার যোগ করতে, নিম্নলিখিতগুলি করুন:
টাস্ক কিউ ইভেন্ট দ্বারা ট্রিগার হওয়া একটি নতুন ক্লাউড ফাংশন সংজ্ঞায়িত করুন:
ফাংশন/ইন্ডেক্স.জেএস
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."); }
উপরের পরিবর্তনগুলির সাথে, এক্সটেনশনটি এখন ইনস্টল করার পরে বিদ্যমান বার্তাগুলিকে বড় হাতের অক্ষরে রূপান্তর করবে।
এই পর্যন্ত, আপনি আপনার এক্সটেনশন ডেভেলপ করতে এবং চলমান পরিবর্তনগুলি পরীক্ষা করতে এক্সটেনশন এমুলেটর ব্যবহার করেছেন। তবে, এক্সটেনশন এমুলেটরটি ইনস্টলেশন প্রক্রিয়াটি এড়িয়ে যায়, তাই আপনার onInstall ইভেন্ট হ্যান্ডলার পরীক্ষা করার জন্য, আপনাকে একটি বাস্তব প্রকল্পে এক্সটেনশনটি ইনস্টল করতে হবে। তবে এটি ঠিক ততটাই ভালো, কারণ এই স্বয়ংক্রিয় ব্যাকফিল বৈশিষ্ট্যটি যুক্ত হওয়ার সাথে সাথে, টিউটোরিয়াল এক্সটেনশনটি এখন কোড-সম্পূর্ণ!
ব্যবহারকারীরা যখন নির্দিষ্ট এক্সটেনশন পরিচালনার কাজগুলি সম্পাদন করে তখন জীবনচক্র ইভেন্টগুলি ট্রিগার হয়:
- একটি এক্সটেনশনের একটি উদাহরণ ইনস্টল করা হচ্ছে
- একটি এক্সটেনশনের একটি উদাহরণকে একটি নতুন সংস্করণে আপডেট করা হচ্ছে
- একটি এক্সটেনশনের একটি উদাহরণ পুনরায় কনফিগার করা হচ্ছে
আপনি এমন ফাংশন সংজ্ঞায়িত করতে পারেন যা আপনার এক্সটেনশনের জীবনচক্র ইভেন্টগুলিতে ট্রিগার করে।
ব্যবহারকারীকে লাইফসাইকেল ইভেন্ট হ্যান্ডলারের অবস্থা রিপোর্ট করতে অ্যাডমিন SDK এর এক্সটেনশন রানটাইম API ব্যবহার করুন। ব্যবহারকারীরা Firebase কনসোলে একটি এক্সটেনশনের বর্তমান প্রক্রিয়াকরণ অবস্থা দেখতে পাবেন।
আপনার সম্পূর্ণ ডাটাবেসের উপর পরিচালিত ফাংশনগুলি (যেমন ব্যাকফিল অপারেশন) প্রায়শই ক্লাউড ফাংশনের সময় শেষ হওয়ার আগে সম্পূর্ণ হতে পারে না। আপনি আপনার কাজটিকে কয়েকটি ফাংশন ইনভোকেশনে ভাগ করে এই সমস্যা এড়াতে পারেন।
যদি আপনার এক্সটেনশনে এমন লাইফসাইকেল ইভেন্ট হ্যান্ডলার থাকে যা এক্সটেনশনের কার্যকারিতার জন্য গুরুত্বপূর্ণ নয়, তাহলে আপনার হ্যান্ডলার ব্যবহারকারীর এক্সিকিউশন কনফিগারযোগ্য করে তোলা উচিত।
অধিক তথ্য
আপনার এক্সটেনশনের জীবনচক্র ইভেন্টগুলি পরিচালনা করার বিষয়ে আরও জানুন।
৯. একটি বাস্তব ফায়ারবেস প্রকল্পে স্থাপন করুন
যদিও এক্সটেনশন এমুলেটর ডেভেলপমেন্টের সময় দ্রুত এক্সটেনশনে পুনরাবৃত্তি করার জন্য একটি দুর্দান্ত হাতিয়ার, তবুও এক পর্যায়ে আপনি এটি একটি বাস্তব প্রকল্পে চেষ্টা করে দেখতে চাইবেন।
এটি করার জন্য, প্রথমে কিছু পরিষেবা সক্ষম করে একটি নতুন প্রকল্প সেট আপ করুন:
- ফায়ারবেস কনসোলে , একটি নতুন প্রকল্প যুক্ত করুন।
- আপনার প্রকল্পটি পে-অ্যাজ-ইউ-গো ব্লেজ প্ল্যানে আপগ্রেড করুন । ক্লাউড ফাংশনস ফর ফায়ারবেসের জন্য আপনার প্রকল্পের একটি বিলিং অ্যাকাউন্ট থাকা প্রয়োজন, তাই এক্সটেনশন ইনস্টল করার জন্য আপনার একটি বিলিং অ্যাকাউন্টও প্রয়োজন।
- আপনার নতুন প্রকল্পে, রিয়েল-টাইম ডেটাবেস সক্ষম করুন ।
- যেহেতু আপনি আপনার এক্সটেনশনের ইনস্টলেশনের সময় বিদ্যমান ডেটা ব্যাকফিল করার ক্ষমতা পরীক্ষা করতে চান, তাই আপনার রিয়েল-টাইম ডাটাবেস ইনস্ট্যান্সে কিছু নমুনা ডেটা আমদানি করুন:
- কিছু বীজ RTDB তথ্য ডাউনলোড করুন।
- Firebase কনসোলের রিয়েল-টাইম ডেটাবেস পৃষ্ঠায়, (আরও) > Import JSON এ ক্লিক করুন এবং আপনার ডাউনলোড করা ফাইলটি নির্বাচন করুন।
orderByChildপদ্ধতি ব্যবহার করার জন্য ব্যাকফিল ফাংশন সক্রিয় করতে, ডাটাবেসটিupper: এর মানের উপর বার্তা সূচী করার জন্য কনফিগার করুন।{ "rules": { ".read": false, ".write": false, "messages": { ".indexOn": "upper" } } }
এখন স্থানীয় উৎস থেকে আপনার এক্সটেনশনটি নতুন প্রকল্পে ইনস্টল করুন:
আপনার Firebase প্রকল্পের জন্য একটি নতুন ডিরেক্টরি তৈরি করুন:
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ফাইলে এক্সটেনশন সোর্স লোকেশন রেকর্ড করবে। সম্মিলিতভাবে, এই দুটি রেকর্ডকে এক্সটেনশন ম্যানিফেস্ট বলা হয়। ব্যবহারকারীরা তাদের এক্সটেনশন কনফিগারেশন সংরক্ষণ করতে এবং বিভিন্ন প্রকল্পে এটি স্থাপন করতে ম্যানিফেস্ট ব্যবহার করতে পারেন।আপনার লাইভ প্রজেক্টে আপনার এক্সটেনশন কনফিগারেশন স্থাপন করুন:
firebase deploy --only extensions
সবকিছু ঠিকঠাক থাকলে, Firebase CLI আপনার প্রোজেক্টে আপনার এক্সটেনশন আপলোড করবে এবং এটি ইনস্টল করবে। ইনস্টলেশন সম্পন্ন হওয়ার পরে, ব্যাকফিল টাস্কটি চলবে এবং কয়েক মিনিটের মধ্যে, আপনার ডাটাবেসটি বড় হাতের বার্তা দিয়ে আপডেট হবে। বার্তা ডাটাবেসে কিছু নতুন নোড যুক্ত করুন এবং নিশ্চিত করুন যে এক্সটেনশনটি নতুন বার্তাগুলির জন্যও কাজ করছে।
- ব্যবহারকারীরা
firebase ext:installকমান্ড ব্যবহার করে একটি এক্সটেনশন ম্যানিফেস্ট তৈরি করতে পারেন। আপনি স্থানীয় উৎস থেকে একটি এক্সটেনশন ইনস্টল করতেও এই কমান্ডটি ব্যবহার করতে পারেন। -
firebase deployব্যবহার করে একটি ম্যানিফেস্ট থেকে একটি লাইভ প্রজেক্টে একটি এক্সটেনশন কনফিগারেশন স্থাপন করুন। - যদিও এখানে দেখানো হয়নি, ব্যবহারকারীরা এক্সটেনশন হাব থেকে তাদের প্রকল্পগুলিতে এক্সটেনশন ইনস্টল করতে পারেন।
অধিক তথ্য
এক্সটেনশন ম্যানিফেস্ট ব্যবহার করে প্রকল্প কনফিগারেশন পরিচালনা করার জন্য ব্যবহারকারীর ডকুমেন্টেশন দেখুন।
১০. ডকুমেন্টেশন লিখুন
ব্যবহারকারীদের সাথে আপনার এক্সটেনশন শেয়ার করার আগে, নিশ্চিত করুন যে আপনি তাদের সফল হওয়ার জন্য পর্যাপ্ত ডকুমেন্টেশন সরবরাহ করছেন।
যখন আপনি এক্সটেনশন প্রকল্পটি শুরু করেন, তখন Firebase CLI ন্যূনতম প্রয়োজনীয় ডকুমেন্টেশনের স্টাব সংস্করণ তৈরি করে। আপনার তৈরি করা এক্সটেনশনটি সঠিকভাবে প্রতিফলিত করতে এই ফাইলগুলি আপডেট করুন।
এক্সটেনশন.ইয়ামল
এই এক্সটেনশনটি তৈরি করার সাথে সাথে আপনি ইতিমধ্যেই এই ফাইলটি আপডেট করছেন, তাই এখনই আপনাকে আর কোনও আপডেট করার দরকার নেই।
তবে, এই ফাইলে থাকা ডকুমেন্টেশনের গুরুত্ব উপেক্ষা করবেন না। এক্সটেনশনের গুরুত্বপূর্ণ শনাক্তকরণ তথ্য - নাম, বিবরণ, লেখক, অফিসিয়াল রিপোজিটরি অবস্থান - ছাড়াও extension.yaml ফাইলে প্রতিটি রিসোর্স এবং ব্যবহারকারী-কনফিগারযোগ্য প্যারামিটারের জন্য ব্যবহারকারী-মুখী ডকুমেন্টেশন রয়েছে। এই তথ্য Firebase কনসোল, এক্সটেনশন হাব এবং Firebase CLI-তে ব্যবহারকারীদের কাছে প্রকাশিত হয়।
প্রিইনস্টল.এমডি
এই ফাইলে, ব্যবহারকারী আপনার এক্সটেনশন ইনস্টল করার আগে প্রয়োজনীয় তথ্য প্রদান করুন: এক্সটেনশনটি কী করে তা সংক্ষেপে বর্ণনা করুন, কোন পূর্বশর্তগুলি ব্যাখ্যা করুন এবং এক্সটেনশনটি ইনস্টল করার বিলিংয়ের প্রভাব সম্পর্কে ব্যবহারকারীকে তথ্য দিন। যদি আপনার অতিরিক্ত তথ্য সহ একটি ওয়েবসাইট থাকে, তবে এটি লিঙ্ক করার জন্যও এটি একটি ভাল জায়গা।
এই ফাইলের টেক্সট ব্যবহারকারীর কাছে এক্সটেনশন হাবে এবং 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](https://firebase.google.com/support/faq#extensions-pricing)
- If you enable events,
[Eventarc fees apply](https://cloud.google.com/eventarc/pricing).
পোস্টইনস্টল.এমডি
এই ফাইলটিতে ব্যবহারকারীরা আপনার এক্সটেনশনটি সফলভাবে ইনস্টল করার পরে তাদের জন্য দরকারী তথ্য রয়েছে: উদাহরণস্বরূপ, পরবর্তী সেটআপ পদক্ষেপ, কার্যকরী এক্সটেনশনের একটি উদাহরণ, ইত্যাদি।
একটি এক্সটেনশন কনফিগার এবং ইনস্টল করার পরে POSTINSTALL.md এর বিষয়বস্তু Firebase কনসোলে প্রদর্শিত হয়। আপনি এই ফাইলে ব্যবহারকারীর প্যারামিটারগুলি উল্লেখ করতে পারেন এবং সেগুলি কনফিগার করা মান দ্বারা প্রতিস্থাপিত হবে।
টিউটোরিয়াল এক্সটেনশনের জন্য এখানে একটি উদাহরণ পোস্ট-ইনস্টল ফাইল রয়েছে:
### 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 সম্পর্কে
আপনার 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কমান্ড ব্যবহার করে আপনার এক্সটেনশনটি Extensions Hub-এ আপলোড করুন।Firebase কনসোলে আপনার প্রকাশক ড্যাশবোর্ডে যান, আপনার আপলোড করা এক্সটেনশনটি খুঁজুন এবং "Extensions Hub-এ প্রকাশ করুন" এ ক্লিক করুন। এটি আমাদের পর্যালোচনা কর্মীদের কাছ থেকে একটি পর্যালোচনার অনুরোধ করে, যা কয়েক দিন সময় নিতে পারে। অনুমোদিত হলে, এক্সটেনশনটি Extensions Hub-তে প্রকাশিত হবে। যদি প্রত্যাখ্যান করা হয়, তাহলে আপনি কারণ ব্যাখ্যা করে একটি বার্তা পাবেন; তারপরে আপনি রিপোর্ট করা সমস্যাগুলি সমাধান করতে পারেন এবং পর্যালোচনার জন্য পুনরায় জমা দিতে পারেন।
- এক্সটেনশন হাবে এক্সটেনশন শেয়ার করতে, আপনাকে প্রকাশক হিসেবে নিবন্ধিত হতে হবে।
- যাচাইযোগ্য উৎস থেকে প্রকাশনা প্রয়োজন, এবং এটি ব্যবহারকারীদের আশ্বস্ত করে যে তারা যে কোডটি ইনস্টল করছেন তা একই কোড যা তারা GitHub-এ পরীক্ষা করতে পারবেন।
- এক্সটেনশন হাবে একটি এক্সটেনশন আপলোড করতে
firebase ext:dev:uploadকমান্ড ব্যবহার করুন। - প্রকাশক ড্যাশবোর্ড থেকে পর্যালোচনার জন্য আপনার এক্সটেনশনগুলি জমা দিন।
অধিক তথ্য
প্রকাশক হিসেবে নিবন্ধন এবং একটি এক্সটেনশন প্রকাশ সম্পর্কে আরও জানুন।