এই পৃষ্ঠাটি আপনাকে একটি সাধারণ ফায়ারবেস এক্সটেনশন তৈরি করার জন্য প্রয়োজনীয় পদক্ষেপগুলির মধ্যে নিয়ে যায়, যা আপনি আপনার প্রকল্পগুলিতে ইনস্টল করতে বা অন্যদের সাথে ভাগ করতে পারেন৷ একটি Firebase এক্সটেনশনের এই সাধারণ উদাহরণটি আপনার বার্তাগুলির জন্য রিয়েলটাইম ডেটাবেস দেখবে এবং সেগুলিকে বড় হাতের অক্ষরে রূপান্তর করবে৷
1. আপনার পরিবেশ সেট আপ করুন এবং একটি প্রকল্প শুরু করুন
আপনি একটি এক্সটেনশন নির্মাণ শুরু করার আগে, আপনাকে প্রয়োজনীয় সরঞ্জামগুলির সাথে একটি বিল্ড পরিবেশ সেট আপ করতে হবে৷
Node.js 16 বা নতুন ইনস্টল করুন। নোড ইনস্টল করার একটি উপায় হল nvm (বা nvm-windows ) ব্যবহার করে।
Firebase CLI- এর সর্বশেষ সংস্করণে ইনস্টল বা আপডেট করুন।
npm
ব্যবহার করে ইনস্টল বা আপডেট করতে, এই কমান্ডটি চালান:npm install -g firebase-tools
এখন একটি নতুন এক্সটেনশন প্রকল্প শুরু করতে Firebase CLI ব্যবহার করুন:
আপনার এক্সটেনশনের জন্য একটি ডিরেক্টরি তৈরি করুন এবং এতে
cd
:mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messages
Firebase CLI-এর
ext:dev:init
কমান্ড চালান:firebase ext:dev:init
প্রম্পট করা হলে, ফাংশনগুলির জন্য ভাষা হিসাবে JavaScript বেছে নিন (কিন্তু মনে রাখবেন যে আপনি যখন নিজের এক্সটেনশন তৈরি করেন তখন আপনি TypeScript ব্যবহার করতে পারেন), এবং, যখন নির্ভরতা ইনস্টল করতে বলা হয়, তখন "হ্যাঁ" উত্তর দিন। (অন্য যেকোন বিকল্পের জন্য ডিফল্ট গ্রহণ করুন।) এই কমান্ডটি একটি নতুন এক্সটেনশনের জন্য একটি কঙ্কাল কোডবেস সেট আপ করবে, যেখান থেকে আপনি আপনার এক্সটেনশনের বিকাশ শুরু করতে পারেন।
একটি নতুন এক্সটেনশন ডিরেক্টরি শুরু করতে firebase ext:dev:init
ব্যবহার করুন।
2. এমুলেটর ব্যবহার করে উদাহরণ এক্সটেনশন চেষ্টা করুন
যখন Firebase CLI নতুন এক্সটেনশন ডিরেক্টরি শুরু করে, তখন এটি একটি সাধারণ উদাহরণ ফাংশন এবং একটি integration-tests
ডিরেক্টরি তৈরি করে যাতে Firebase এমুলেটর স্যুট ব্যবহার করে একটি এক্সটেনশন চালানোর জন্য প্রয়োজনীয় ফাইল থাকে।
এমুলেটরে উদাহরণ এক্সটেনশন চালানোর চেষ্টা করুন:
integration-tests
ডিরেক্টরিতে পরিবর্তন করুন:cd functions/integration-tests
একটি ডেমো প্রকল্পের সাথে এমুলেটর শুরু করুন:
firebase emulators:start --project=demo-test
এমুলেটর এক্সটেনশনটিকে একটি পূর্বনির্ধারিত "ডামি" প্রকল্পে (
demo-test
) লোড করে। এক্সটেনশনটিতে এখন পর্যন্ত একটি একক HTTP-ট্রিগার করা ফাংশন রয়েছে,greetTheWorld
, যা অ্যাক্সেস করার সময় একটি "হ্যালো ওয়ার্ল্ড" বার্তা প্রদান করে।এমুলেটর এখনও চলমান থাকা অবস্থায়, আপনি যখন এটি শুরু করেছিলেন তখন এটি মুদ্রিত URLটিতে গিয়ে এক্সটেনশনের
greetTheWorld
ফাংশনটি ব্যবহার করে দেখুন৷আপনার ব্রাউজার "হ্যালো ওয়ার্ল্ড ফ্রম গ্রীট-দ্য-ওয়ার্ল্ড" বার্তাটি প্রদর্শন করে।
এই ফাংশনের সোর্স কোডটি এক্সটেনশনের
functions
ডিরেক্টরিতে রয়েছে। আপনার পছন্দের সম্পাদক বা IDE-এ উৎসটি খুলুন:functions/index.js
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
ফাংশনে একটি ছোট পরিবর্তন করার চেষ্টা করুন:functions/index.js
const greeting = `${consumerProvidedGreeting} everyone, from ${instanceId}`;
আপনার পরিবর্তন সংরক্ষণ করুন. এমুলেটর আপনার কোড পুনরায় লোড করবে, এবং এখন, যখন আপনি ফাংশন URL-এ যান, আপনি আপডেট করা শুভেচ্ছা দেখতে পাবেন।
এক্সটেনশন এমুলেটর ব্যবহার করে আপনি দ্রুত আপনার কোড পরীক্ষা এবং পুনরাবৃত্তি করতে দিয়ে বিকাশের গতি বাড়াতে পারেন।
আরও তথ্য
এক্সটেনশন এমুলেটর ব্যবহার সম্পর্কে আরও জানুন।
3. 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-repo
name
ক্ষেত্রে ব্যবহৃত নামকরণের নিয়মটি লক্ষ্য করুন: অফিসিয়াল ফায়ারবেস এক্সটেনশনের নামকরণ করা হয় একটি প্রিফিক্স সহ যেটি এক্সটেনশনটি কাজ করে তা প্রাথমিক Firebase পণ্য নির্দেশ করে, তারপরে এক্সটেনশনটি কী করে তার একটি বর্ণনা। আপনার নিজের এক্সটেনশনে একই কনভেনশন ব্যবহার করা উচিত।যেহেতু আপনি আপনার এক্সটেনশনের নাম পরিবর্তন করেছেন, তাই আপনাকে নতুন নাম দিয়ে আপনার এমুলেটর কনফিগারেশনও আপডেট করতে হবে:
-
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
রেফারেন্সে ফাইলটির সম্পূর্ণ স্পেসিফিকেশন আছে; যাইহোক, এই ডকুমেন্টেশনটি এই ফাইলের নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করবে কারণ আপনি সেগুলি ব্যবহার করতে হবে।
4. একটি ক্লাউড ফাংশন লিখুন এবং এটিকে একটি এক্সটেনশন সম্পদ হিসাবে ঘোষণা করুন৷
এখন আপনি কিছু কোড লেখা শুরু করতে পারেন। এই ধাপে, আপনি একটি ক্লাউড ফাংশন লিখবেন যা আপনার এক্সটেনশনের মূল কাজটি সম্পাদন করে, যা বার্তাগুলির জন্য আপনার রিয়েলটাইম ডেটাবেস দেখা এবং সেগুলিকে বড় হাতের অক্ষরে রূপান্তর করা।
আপনার পছন্দের এডিটর বা IDE-এ এক্সটেনশনের ফাংশন (এক্সটেনশনের
functions
ডিরেক্টরিতে) জন্য উৎস খুলুন। এর বিষয়বস্তুগুলি নিম্নলিখিতগুলির সাথে প্রতিস্থাপন করুন:functions/index.js
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
) ব্যবহার করে। নোডে 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"}
)। যখনই আপনি একটি নতুন রেকর্ড যোগ করবেন, এক্সটেনশনটি একটিuppercase
ক্ষেত্র যোগ করবে যাতেoriginal
ক্ষেত্রের বড় হাতের কন্টেন্ট থাকে।
আপনার কাছে এখন একটি সম্পূর্ণ, যদিও সহজ, এক্সটেনশন রয়েছে যা একটি RTDB উদাহরণে কাজ করে। অনুসরণ করা বিভাগগুলিতে, আপনি কিছু অতিরিক্ত বৈশিষ্ট্য সহ এই এক্সটেনশনটি পরিমার্জন করবেন৷ তারপরে, আপনি এক্সটেনশনটি অন্যদের কাছে বিতরণ করার জন্য প্রস্তুত পাবেন এবং অবশেষে, এক্সটেনশন হাবে আপনার এক্সটেনশনটি কীভাবে প্রকাশ করবেন তা শিখুন।
- যে ফাংশনগুলি আপনার এক্সটেনশনের যুক্তি তৈরি করে সেগুলিকে অবশ্যই ক্লাউড ফাংশন কোড হিসাবে সংজ্ঞায়িত করতে হবে এবং
extension.yaml
ফাইলে একটি এক্সটেনশন সংস্থান হিসাবে ঘোষণা করতে হবে৷ - আপনি এমন ফাংশন লিখতে পারেন যা ট্রিগার করে যখন HTTP এন্ডপয়েন্টগুলি অ্যাক্সেস করা হয়, বা Firebase পণ্য, Google ক্লাউড পণ্য এবং অন্যান্য এক্সটেনশন দ্বারা নির্গত ইভেন্টগুলির প্রতিক্রিয়া হিসাবে।
আরও তথ্য
- সমর্থিত ইভেন্ট ট্রিগার সম্পর্কে আরও সহ এক্সটেনশনগুলির জন্য ক্লাউড ফাংশন লেখার বিষয়ে আরও জানুন৷
-
extension.yaml
রেফারেন্সে ফাইলটির সম্পূর্ণ স্পেসিফিকেশন আছে; যাইহোক, এই ডকুমেন্টেশনটি এই ফাইলের নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করবে কারণ আপনি সেগুলি ব্যবহার করতে হবে। - ফায়ারবেস ডকুমেন্টেশনের জন্য ক্লাউড ফাংশনগুলিতে ক্লাউড ফাংশনগুলি ব্যবহার করার বিষয়ে সাধারণ তথ্য রয়েছে, ফায়ারবেস এক্সটেনশনগুলির জন্য নির্দিষ্ট নয়৷
5. API এবং ভূমিকা ঘোষণা করুন
ফায়ারবেস একটি ইনস্টল করা এক্সটেনশনের প্রতিটি দৃষ্টান্ত মঞ্জুর করে একটি প্রতি-ইনস্ট্যান্স পরিষেবা অ্যাকাউন্ট ব্যবহার করে প্রকল্প এবং এর ডেটাতে সীমিত অ্যাক্সেস। প্রতিটি অ্যাকাউন্ট পরিচালনার জন্য প্রয়োজনীয় অনুমতিগুলির ন্যূনতম সেট রয়েছে। এই কারণে, আপনার এক্সটেনশনের জন্য প্রয়োজনীয় যেকোন IAM ভূমিকা আপনাকে স্পষ্টভাবে ঘোষণা করতে হবে; যখন ব্যবহারকারীরা আপনার এক্সটেনশন ইনস্টল করেন, তখন Firebase এই ভূমিকাগুলি দিয়ে একটি পরিষেবা অ্যাকাউন্ট তৈরি করে এবং এক্সটেনশন চালানোর জন্য এটি ব্যবহার করে।
একটি পণ্যের ইভেন্টগুলিকে ট্রিগার করার জন্য আপনাকে ভূমিকা ঘোষণা করতে হবে না, তবে অন্যথায় এটির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে একটি ভূমিকা ঘোষণা করতে হবে। যেহেতু শেষ ধাপে আপনি যে ফাংশনটি যোগ করেছেন তা রিয়েলটাইম ডেটাবেসে লিখছে, আপনাকে extension.yaml
এ নিম্নলিখিত ঘোষণা যোগ করতে হবে:
roles:
- role: firebasedatabase.admin
reason: Allows the extension to write to RTDB.
একইভাবে, আপনি Google API ঘোষণা করেন যা একটি এক্সটেনশন apis
ক্ষেত্রে ব্যবহার করে। যখন ব্যবহারকারীরা আপনার এক্সটেনশন ইনস্টল করেন, তখন তাদের জিজ্ঞাসা করা হবে যে তারা তাদের প্রকল্পের জন্য এই APIগুলি স্বয়ংক্রিয়ভাবে সক্ষম করতে চান কিনা৷ এটি সাধারণত শুধুমাত্র নন-ফায়ারবেস Google API-এর জন্য প্রয়োজনীয় এবং এই গাইডের জন্য প্রয়োজন নেই।
-
extensions.yaml
এরroles
ক্ষেত্রে আপনার এক্সটেনশনের প্রয়োজনীয় IAM ভূমিকা ঘোষণা করুন। ইনস্টল করা হলে, এক্সটেনশনগুলি স্বয়ংক্রিয়ভাবে এই ভূমিকাগুলি মঞ্জুর হয়৷ -
extensions.yaml
এরapis
ক্ষেত্রে আপনার এক্সটেনশনের প্রয়োজনীয় যেকোন Google API ঘোষণা করুন। যখন ব্যবহারকারীরা আপনার এক্সটেনশন ইনস্টল করেন, তখন তারা তাদের প্রকল্পের জন্য স্বয়ংক্রিয়ভাবে এই APIগুলি সক্ষম করতে নির্বাচন করতে পারেন৷ - ডকুমেন্টেশনের উদ্দেশ্যে,
extensions.yaml
এরexternalServices
ফিল্ডে আপনার এক্সটেনশনের প্রয়োজন এমন যেকোনো নন-Google API ঘোষণা করুন।
আরও তথ্য
- একটি এক্সটেনশনের জন্য উপযুক্ত অ্যাক্সেস সেট আপ সম্পর্কে আরও জানুন৷
-
extension.yaml
রেফারেন্সে ফাইলটির সম্পূর্ণ স্পেসিফিকেশন আছে; যাইহোক, এই ডকুমেন্টেশনটি এই ফাইলের নির্দিষ্ট ব্যবহার নিয়ে আলোচনা করবে কারণ আপনি সেগুলি ব্যবহার করতে হবে।
6. ব্যবহারকারী-কনফিগারযোগ্য পরামিতি সংজ্ঞায়িত করুন
শেষ দুই ধাপে আপনি যে ফাংশনটি তৈরি করেছেন তা আগত বার্তাগুলির জন্য একটি নির্দিষ্ট 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
এ আরও পরে) যে কোনও ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার উল্লেখ করতে এই সিনট্যাক্সটি ব্যবহার করতে পারেন।আপনি আপনার ফাংশন কোড থেকে ব্যবহারকারী-সংজ্ঞায়িত পরামিতি অ্যাক্সেস করতে পারেন।
আপনি শেষ বিভাগে যে ফাংশনটি লিখেছেন, আপনি পরিবর্তনগুলি দেখার জন্য পাথটি হার্ড-কোড করেছেন৷ পরিবর্তে ব্যবহারকারী-সংজ্ঞায়িত মান উল্লেখ করতে ট্রিগার সংজ্ঞা পরিবর্তন করুন:
functions/index.js
export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate
মনে রাখবেন যে ফায়ারবেস এক্সটেনশনে, এই পরিবর্তনটি সম্পূর্ণরূপে ডকুমেন্টেশনের জন্য: যখন একটি ক্লাউড ফাংশন একটি এক্সটেনশনের অংশ হিসাবে স্থাপন করা হয়, তখন এটি
extension.yaml
ফাইল থেকে ট্রিগার সংজ্ঞা ব্যবহার করে এবং ফাংশনের সংজ্ঞায় উল্লেখিত মানটিকে উপেক্ষা করে। তবুও, এই মানটি কোথা থেকে এসেছে তা আপনার কোডে নথিভুক্ত করা একটি ভাল ধারণা।কোনো রানটাইম প্রভাব নেই এমন একটি কোড পরিবর্তন করা আপনার কাছে হতাশাজনক মনে হতে পারে, কিন্তু গুরুত্বপূর্ণ শিক্ষাটি হ'ল আপনি আপনার ফাংশন কোডে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার অ্যাক্সেস করতে পারেন এবং ফাংশনের যুক্তিতে এটিকে একটি সাধারণ মান হিসাবে ব্যবহার করতে পারেন। এই ক্ষমতার জন্য একটি সম্মতি হিসাবে, নিম্নলিখিত লগ স্টেটমেন্ট যোগ করুন প্রদর্শন করতে যে আপনি প্রকৃতপক্ষে ব্যবহারকারীর দ্বারা সংজ্ঞায়িত মানটি অ্যাক্সেস করছেন:
functions/index.js
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
ফাইলে ব্যবহারকারীর পরামিতি নির্ধারণ করুন।
আরও তথ্য
আপনার এক্সটেনশনে প্যারামিটার সেট আপ এবং ব্যবহার সম্পর্কে আরও জানুন।
7. ব্যবহারকারী-সংজ্ঞায়িত যুক্তির জন্য ইভেন্ট হুক প্রদান করুন
আপনি ইতিমধ্যেই একজন এক্সটেনশন লেখক হিসাবে দেখেছেন, কিভাবে একটি ফায়ারবেস পণ্য আপনার এক্সটেনশন-প্রদত্ত যুক্তিকে ট্রিগার করতে পারে: রিয়েলটাইম ডেটাবেসে নতুন রেকর্ড তৈরি করা আপনার makeuppercase
ফাংশনকে ট্রিগার করে। যে ব্যবহারকারীরা আপনার এক্সটেনশন ইনস্টল করেন তাদের সাথে আপনার এক্সটেনশনের একটি সাদৃশ্যপূর্ণ সম্পর্ক থাকতে পারে: আপনার এক্সটেনশন ব্যবহারকারীর সংজ্ঞায়িত যুক্তিকে ট্রিগার করতে পারে।
একটি এক্সটেনশন সিঙ্ক্রোনাস হুক , অ্যাসিঙ্ক্রোনাস হুক বা উভয়ই প্রদান করতে পারে। সিঙ্ক্রোনাস হুকগুলি ব্যবহারকারীদের এমন কাজগুলি সম্পাদন করার একটি উপায় দেয় যা এক্সটেনশনের ফাংশনগুলির একটির সমাপ্তি ব্লক করে৷ এটি কার্যকর হতে পারে, উদাহরণস্বরূপ, একটি এক্সটেনশন কাজ করার আগে ব্যবহারকারীদের কাস্টম প্রিপ্রসেসিং সঞ্চালনের একটি উপায় দিতে।
এই নির্দেশিকায়, আপনি আপনার এক্সটেনশনে একটি অ্যাসিঙ্ক্রোনাস হুক যোগ করবেন, যা ব্যবহারকারীদের তাদের নিজস্ব প্রক্রিয়াকরণের পদক্ষেপগুলিকে সংজ্ঞায়িত করতে সক্ষম করবে যা আপনার এক্সটেনশনটি রিয়েলটাইম ডেটাবেসে বড় হাতের বার্তা লেখার পরে চালানো হবে৷ অ্যাসিঙ্ক্রোনাস হুক ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ট্রিগার করতে Eventarc ব্যবহার করে। এক্সটেনশনগুলি তারা যে ধরনের ইভেন্টগুলি নির্গত করে তা ঘোষণা করে এবং ব্যবহারকারীরা যখন এক্সটেনশন ইনস্টল করেন, তখন তারা কোন ইভেন্টের ধরনগুলিতে আগ্রহী তা চয়ন করেন৷ যদি তারা অন্তত একটি ইভেন্ট বেছে নেন, ফায়ারবেস ইনস্টলেশন প্রক্রিয়ার অংশ হিসাবে এক্সটেনশনের জন্য একটি 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
ফাংশনের শেষে, এমন কিছু কোড যোগ করুন যা আপনি ঘোষণা করেছেন এমন একটি ইভেন্ট প্রকাশ করে:functions/index.js
// 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
যখন অনুরোধ করা হয়, একটি ডিফল্ট প্রকল্প সেট আপ করতে অস্বীকার করুন, ক্লাউড ফাংশন ভাষা হিসাবে JavaScript নির্বাচন করুন এবং প্রয়োজনীয় নির্ভরতাগুলি ইনস্টল করুন৷ এই প্রকল্পটি একটি ব্যবহারকারীর প্রকল্পের প্রতিনিধিত্ব করে, যেখানে আপনার এক্সটেনশন ইনস্টল করা আছে।
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!!!
.- ক্ষেত্র:
- আপনার এক্সটেনশনগুলিতে হুকগুলি অন্তর্ভুক্ত থাকতে পারে যা ব্যবহারকারীদের আপনার এক্সটেনশনের মৌলিক ক্রিয়াকলাপে তাদের নিজস্ব যুক্তি সন্নিবেশ করতে দেয়৷
- ব্যবহারকারীর হুকগুলি সিঙ্ক্রোনাস হতে পারে, যা সম্পূর্ণ হওয়া পর্যন্ত একটি এক্সটেনশনের সম্পাদনকে অবরুদ্ধ করে। এক্সটেনশনগুলি প্রায়শই ব্যবহারকারী-সংজ্ঞায়িত প্রিপ্রসেসিং কাজগুলি সম্পাদন করতে সিঙ্ক্রোনাস হুক ব্যবহার করে।
- ব্যবহারকারীর হুকগুলিও অ্যাসিঙ্ক্রোনাস হতে পারে, যেমন উপরের উদাহরণে। অ্যাসিঙ্ক্রোনাস হুকগুলি ব্যবহারকারী-সংজ্ঞায়িত লজিক চালানোর জন্য ব্যবহার করা যেতে পারে যা এক্সটেনশনটি সঠিকভাবে কাজ করার জন্য গুরুত্বপূর্ণ নয়।
আরও তথ্য
অ্যাসিঙ্ক্রোনাস এবং সিঙ্ক্রোনাস উভয় হুক সহ ব্যবহারকারী-সংজ্ঞায়িত লজিকের জন্য হুক যোগ করার বিষয়ে আরও জানুন।
8. জীবনচক্র ইভেন্ট হ্যান্ডলার যোগ করুন
আপনি এখন পর্যন্ত যে এক্সটেনশনটি লিখেছেন তা তৈরি হওয়ার সাথে সাথে বার্তাগুলিকে প্রক্রিয়া করে। কিন্তু যদি আপনার ব্যবহারকারীরা এক্সটেনশন ইনস্টল করার সময় ইতিমধ্যেই বার্তাগুলির একটি ডাটাবেস থাকে? ফায়ারবেস এক্সটেনশনে লাইফসাইকেল ইভেন্ট হুক নামে একটি বৈশিষ্ট্য রয়েছে যা আপনি আপনার এক্সটেনশন ইনস্টল, আপডেট বা পুনরায় কনফিগার করা হলে অ্যাকশন ট্রিগার করতে ব্যবহার করতে পারেন। এই বিভাগে, আপনি লাইফসাইকেল ইভেন্ট হুকগুলি ব্যবহার করবেন একটি প্রকল্পের বিদ্যমান বার্তা ডাটাবেসকে বড় হাতের বার্তাগুলির সাথে ব্যাকফিল করার জন্য যখন একজন ব্যবহারকারী আপনার এক্সটেনশন ইনস্টল করবেন৷
আপনার লাইফসাইকেল ইভেন্ট হ্যান্ডলার চালানোর জন্য Firebase এক্সটেনশনগুলি ক্লাউড টাস্ক ব্যবহার করে। আপনি ক্লাউড ফাংশন ব্যবহার করে ইভেন্ট হ্যান্ডলারদের সংজ্ঞায়িত করেন; যখনই আপনার এক্সটেনশনের একটি উদাহরণ সমর্থিত লাইফসাইকেল ইভেন্টগুলির একটিতে পৌঁছায়, যদি আপনি একটি হ্যান্ডলারকে সংজ্ঞায়িত করে থাকেন, এটি হ্যান্ডলারটিকে একটি ক্লাউড টাস্ক সারিতে যুক্ত করবে। ক্লাউড টাস্কগুলি তখন হ্যান্ডলারকে অ্যাসিঙ্ক্রোনাসভাবে চালাবে। যখন একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার চলছে, তখন Firebase কনসোল ব্যবহারকারীকে রিপোর্ট করবে যে এক্সটেনশন ইন্সট্যান্সের একটি প্রসেসিং কাজ চলছে। এটি আপনার হ্যান্ডলার ফাংশনের উপর নির্ভর করে ব্যবহারকারীর কাছে চলমান স্থিতি এবং কার্য সমাপ্তির প্রতিবেদন করা।
একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার যোগ করতে যা বিদ্যমান বার্তাগুলিকে ব্যাকফিল করে, নিম্নলিখিতগুলি করুন:
একটি নতুন ক্লাউড ফাংশন সংজ্ঞায়িত করুন যা টাস্ক কিউ ইভেন্ট দ্বারা ট্রিগার হয়:
functions/index.js
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
প্যারামিটারের মান পরীক্ষা করুন এবং এটি সেট না থাকলে তাড়াতাড়ি প্রস্থান করুন:functions/index.js
if (!process.env.DO_BACKFILL) { return getExtensions() .runtime() .setProcessingState("PROCESSING_COMPLETE", "Backfill skipped."); }
উপরের পরিবর্তনগুলির সাথে, এক্সটেনশনটি এখন বিদ্যমান বার্তাগুলিকে বড় হাতের অক্ষরে রূপান্তর করবে যখন এটি ইনস্টল করা হবে।
এই বিন্দু পর্যন্ত, আপনি আপনার এক্সটেনশন বিকাশ করতে এবং চলমান পরিবর্তনগুলি পরীক্ষা করতে এক্সটেনশন এমুলেটর ব্যবহার করেছেন। যাইহোক, এক্সটেনশন এমুলেটর ইনস্টলেশন প্রক্রিয়াটি এড়িয়ে যায়, তাই আপনার onInstall
ইভেন্ট হ্যান্ডলার পরীক্ষা করতে, আপনাকে একটি বাস্তব প্রকল্পে এক্সটেনশনটি ইনস্টল করতে হবে। যদিও এটি ঠিক তেমনি, যেহেতু এই স্বয়ংক্রিয় ব্যাকফিল বৈশিষ্ট্যটি যোগ করার সাথে সাথে, টিউটোরিয়াল এক্সটেনশনটি এখন কোড-সম্পূর্ণ!
লাইফসাইকেল ইভেন্টগুলি ট্রিগার হয় যখন ব্যবহারকারীরা নির্দিষ্ট এক্সটেনশন ম্যানেজমেন্ট কাজগুলি সম্পাদন করে:
- একটি এক্সটেনশনের একটি উদাহরণ ইনস্টল করা হচ্ছে
- একটি নতুন সংস্করণে একটি এক্সটেনশনের একটি উদাহরণ আপডেট করা হচ্ছে৷
- একটি এক্সটেনশনের একটি উদাহরণ পুনরায় কনফিগার করা হচ্ছে
আপনি ফাংশন সংজ্ঞায়িত করতে পারেন যা আপনার এক্সটেনশনের জীবনচক্র ইভেন্টগুলিতে ট্রিগার করে৷
ব্যবহারকারীর কাছে লাইফসাইকেল ইভেন্ট হ্যান্ডলারের অবস্থা রিপোর্ট করতে অ্যাডমিন SDK-এর এক্সটেনশন রানটাইম API ব্যবহার করুন। ব্যবহারকারীরা Firebase কনসোলে একটি এক্সটেনশনের বর্তমান প্রক্রিয়াকরণের অবস্থা দেখতে পাবেন।
যে ফাংশনগুলি আপনার সম্পূর্ণ ডাটাবেসের উপর কাজ করে (যেমন ব্যাকফিল অপারেশন) প্রায়শই ক্লাউড ফাংশন শেষ হওয়ার আগে সম্পূর্ণ করতে পারে না। আপনি বেশ কয়েকটি ফাংশন আহ্বানে আপনার টাস্ককে বিভক্ত করে এই সমস্যাটি এড়াতে পারেন।
যদি আপনার এক্সটেনশনে লাইফসাইকেল ইভেন্ট হ্যান্ডলারগুলি অন্তর্ভুক্ত থাকে যেগুলি এক্সটেনশনের কাজ করার জন্য গুরুত্বপূর্ণ নয়, তাহলে আপনাকে হ্যান্ডলার ব্যবহারকারীর সম্পাদনকে কনফিগারযোগ্য করে তুলতে হবে।
আরও তথ্য
আপনার এক্সটেনশনের জীবনচক্র ইভেন্টগুলি পরিচালনা করার বিষয়ে আরও জানুন৷
9. একটি বাস্তব ফায়ারবেস প্রকল্পে স্থাপন করুন
যদিও এক্সটেনশন এমুলেটরটি বিকাশের সময় একটি এক্সটেনশনে দ্রুত পুনরাবৃত্তি করার জন্য একটি দুর্দান্ত সরঞ্জাম, কিছু সময়ে আপনি এটি একটি বাস্তব প্রকল্পে চেষ্টা করতে চাইবেন।
এটি করতে, প্রথমে কিছু পরিষেবা সক্ষম করে একটি নতুন প্রকল্প সেট আপ করুন:
- Firebase কনসোলে , একটি নতুন প্রকল্প যোগ করুন।
- আপনার প্রজেক্টকে পে-অ্যাজ-ইউ-গো ব্লেজ প্ল্যানে আপগ্রেড করুন । Firebase-এর জন্য ক্লাউড ফাংশনগুলির জন্য আপনার প্রকল্পের একটি বিলিং অ্যাকাউন্ট থাকা প্রয়োজন, তাই একটি এক্সটেনশন ইনস্টল করার জন্য আপনার একটি বিলিং অ্যাকাউন্টও প্রয়োজন৷
- আপনার নতুন প্রকল্পে, রিয়েল-টাইম ডেটাবেস সক্ষম করুন ৷
- যেহেতু আপনি ইনস্টলেশনে বিদ্যমান ডেটা ব্যাকফিল করার জন্য আপনার এক্সটেনশনের ক্ষমতা পরীক্ষা করতে চান, তাই আপনার রিয়েল-টাইম ডাটাবেস উদাহরণে কিছু নমুনা ডেটা আমদানি করুন:
- কিছু বীজ RTDB ডেটা ডাউনলোড করুন।
- Firebase কনসোলের রিয়েল-টাইম ডেটাবেস পৃষ্ঠায়, (আরও) > 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
ফাইলে এক্সটেনশন উত্স অবস্থান রেকর্ড করবে৷ সম্মিলিতভাবে, এই দুটি রেকর্ডকে বলা হয় এক্সটেনশন ম্যানিফেস্ট । ব্যবহারকারীরা তাদের এক্সটেনশন কনফিগারেশন সংরক্ষণ করতে এবং বিভিন্ন প্রকল্পে এটি স্থাপন করতে ম্যানিফেস্ট ব্যবহার করতে পারেন।আপনার লাইভ প্রকল্পে আপনার এক্সটেনশন কনফিগারেশন স্থাপন করুন:
firebase deploy --only extensions
সবকিছু ঠিকঠাক থাকলে, Firebase CLI-কে আপনার প্রজেক্টে আপনার এক্সটেনশন আপলোড করে ইনস্টল করতে হবে। ইনস্টলেশন সম্পূর্ণ হওয়ার পরে, ব্যাকফিল টাস্কটি চলবে এবং কয়েক মিনিটের মধ্যে, আপনার ডাটাবেস বড় হাতের বার্তাগুলির সাথে আপডেট করা হবে। বার্তা ডাটাবেসে কিছু নতুন নোড যোগ করুন এবং নিশ্চিত করুন যে এক্সটেনশনটি নতুন বার্তাগুলির জন্যও কাজ করছে।
- ব্যবহারকারীরা
firebase ext:install
কমান্ড ব্যবহার করে একটি এক্সটেনশন ম্যানিফেস্ট তৈরি করতে পারে। আপনি স্থানীয় উত্স থেকে একটি এক্সটেনশন ইনস্টল করতে এই কমান্ডটি ব্যবহার করতে পারেন। -
firebase deploy
ব্যবহার করে একটি ম্যানিফেস্ট থেকে একটি লাইভ প্রজেক্টে একটি এক্সটেনশন কনফিগারেশন স্থাপন করুন। - যদিও এখানে প্রদর্শন করা হয়নি, ব্যবহারকারীরা এক্সটেনশন হাব থেকে তাদের প্রজেক্টে এক্সটেনশন ইনস্টল করতে পারেন।
আরও তথ্য
এক্সটেনশন ম্যানিফেস্টের সাথে প্রজেক্ট কনফিগারেশন পরিচালনার ব্যবহারকারী ডকুমেন্টেশন দেখুন।
10. ডকুমেন্টেশন লিখুন
আপনি ব্যবহারকারীদের সাথে আপনার এক্সটেনশন শেয়ার করার আগে, তাদের সফল হওয়ার জন্য আপনি যথেষ্ট ডকুমেন্টেশন প্রদান করছেন তা নিশ্চিত করুন।
আপনি যখন এক্সটেনশন প্রজেক্ট শুরু করেন, তখন Firebase CLI ন্যূনতম প্রয়োজনীয় ডকুমেন্টেশনের স্টাব সংস্করণ তৈরি করে। আপনি যে এক্সটেনশনটি তৈরি করেছেন তা সঠিকভাবে প্রতিফলিত করতে এই ফাইলগুলি আপডেট করুন৷
extension.yaml
আপনি ইতিমধ্যে এই ফাইলটি আপডেট করছেন যেহেতু আপনি এই এক্সটেনশনটি তৈরি করেছেন, তাই আপনাকে এখনই আর কোনো আপডেট করতে হবে না৷
যাইহোক, এই ফাইলটিতে থাকা ডকুমেন্টেশনের গুরুত্বকে উপেক্ষা করবেন না। একটি এক্সটেনশনের গুরুত্বপূর্ণ শনাক্তকরণ তথ্য-নাম, বিবরণ, লেখক, অফিসিয়াল রিপোজিটরি অবস্থান-এর পাশাপাশি extension.yaml
ফাইলটিতে প্রতিটি সংস্থান এবং ব্যবহারকারী-কনফিগারযোগ্য প্যারামিটারের জন্য ব্যবহারকারী-মুখী ডকুমেন্টেশন রয়েছে। এই তথ্যটি Firebase কনসোল, এক্সটেনশন হাব এবং Firebase CLI-এর ব্যবহারকারীদের কাছে প্রকাশ করা হয়েছে।
PREINSTALL.md
এই ফাইলে, আপনার এক্সটেনশন ইনস্টল করার আগে ব্যবহারকারীর প্রয়োজনীয় তথ্য প্রদান করুন: এক্সটেনশনটি কী করে তা সংক্ষেপে বর্ণনা করুন, কোনো পূর্বশর্ত ব্যাখ্যা করুন এবং এক্সটেনশন ইনস্টল করার বিলিং প্রভাব সম্পর্কে ব্যবহারকারীকে তথ্য দিন। আপনার যদি অতিরিক্ত তথ্য সহ একটি ওয়েবসাইট থাকে তবে এটি লিঙ্ক করার জন্য এটি একটি ভাল জায়গা।
এই ফাইলের পাঠ্য ব্যবহারকারীর কাছে Extensions Hub এবং firebase ext:info
কমান্ড দ্বারা প্রদর্শিত হয়।
এখানে একটি প্রিইনস্টল ফাইলের একটি উদাহরণ রয়েছে:
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
এই ফাইলটিতে ব্যবহারকারীরা সফলভাবে আপনার এক্সটেনশন ইনস্টল করার পরে তাদের জন্য উপযোগী তথ্য রয়েছে: উদাহরণস্বরূপ, ফলো-আপ সেটআপ পদক্ষেপ, এক্সটেনশনের কার্যকারিতার উদাহরণ এবং আরও অনেক কিছু।
একটি এক্সটেনশন কনফিগার এবং ইনস্টল করার পরে 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
বেশিরভাগ এক্সটেনশনগুলি এক্সটেনশনের সংগ্রহস্থলে যাওয়া ব্যবহারকারীদের সুবিধার জন্য একটি রিডমি ফাইলও প্রদান করে। আপনি এই ফাইলটি হাতে লিখতে পারেন বা কমান্ড ব্যবহার করে একটি read me তৈরি করতে পারেন।
এই গাইডের উদ্দেশ্যে, একটি রিডমি ফাইল লেখা এড়িয়ে যান।
অতিরিক্ত ডকুমেন্টেশন
উপরে আলোচনা করা ডকুমেন্টেশন হল ডকুমেন্টেশনের ন্যূনতম সেট যা আপনাকে ব্যবহারকারীদের প্রদান করতে হবে। ব্যবহারকারীদের সফলভাবে ব্যবহার করার জন্য অনেক এক্সটেনশনের আরো বিস্তারিত ডকুমেন্টেশন প্রয়োজন। যখন এটি হয়, তখন আপনাকে অতিরিক্ত ডকুমেন্টেশন লিখতে হবে এবং এটি হোস্ট করা উচিত যেখানে আপনি ব্যবহারকারীদের নির্দেশ করতে পারেন।
এই গাইডের উদ্দেশ্যে, আরও বিস্তৃত ডকুমেন্টেশন লেখা এড়িয়ে যান।
- সর্বনিম্নভাবে, প্রতিটি এক্সটেনশনকে নিম্নলিখিত ফাইলগুলিতে ব্যবহারকারীর ডকুমেন্টেশন প্রদান করা উচিত:
extension.yaml
,PREINSTALL.md
,POSTINSTALL.md
, এবংCHANGELOG.md
৷ - প্রয়োজনে আপনার ব্যবহারকারীদের আরও বিস্তারিত ডকুমেন্টেশন প্রদান করা উচিত।
আরও তথ্য
ডকুমেন্টেশন লেখার ডকুমেন্টেশন দেখুন।
11. এক্সটেনশন হাবে প্রকাশ করুন৷
এখন যেহেতু আপনার এক্সটেনশনটি কোড সম্পূর্ণ এবং নথিভুক্ত, আপনি এটিকে এক্সটেনশন হাবে বিশ্বের সাথে ভাগ করতে প্রস্তুত৷ কিন্তু যেহেতু এটি শুধুমাত্র একটি টিউটোরিয়াল, আসলে তা করবেন না। যান এবং আপনি এখানে যা শিখেছেন তা ব্যবহার করে আপনার নিজের এক্সটেনশন লিখতে শুরু করুন এবং Firebase এক্সটেনশন প্রকাশক ডকুমেন্টেশনের বাকি অংশে, এবং অফিসিয়াল, Firebase-লিখিত, এক্সটেনশনের উৎস পরীক্ষা করে।
যখন আপনি Extensions Hub-এ আপনার কাজ প্রকাশ করতে প্রস্তুত হন তখন আপনি এটি কীভাবে করবেন তা এখানে রয়েছে:
- আপনি যদি আপনার প্রথম এক্সটেনশন প্রকাশ করেন, তাহলে একটি এক্সটেনশন প্রকাশক হিসাবে নিবন্ধন করুন ৷ যখন আপনি একটি এক্সটেনশন প্রকাশক হিসাবে নিবন্ধন করেন, তখন আপনি একটি প্রকাশক আইডি তৈরি করেন যা ব্যবহারকারীদের দ্রুত আপনাকে আপনার এক্সটেনশনের লেখক হিসাবে সনাক্ত করতে দেয়৷
আপনার এক্সটেনশনের সোর্স কোড একটি সর্বজনীনভাবে যাচাইযোগ্য স্থানে হোস্ট করুন। যখন আপনার কোড একটি যাচাইযোগ্য উৎস থেকে পাওয়া যায়, তখন Firebase সরাসরি এই অবস্থান থেকে আপনার এক্সটেনশন প্রকাশ করতে পারে। এটি করা নিশ্চিত করতে সাহায্য করে যে আপনি আপনার এক্সটেনশনের বর্তমানে প্রকাশিত সংস্করণ প্রকাশ করছেন এবং ব্যবহারকারীদের তাদের প্রকল্পগুলিতে ইনস্টল করা কোড পরীক্ষা করতে দিয়ে তাদের সহায়তা করে৷
বর্তমানে, এর অর্থ হল আপনার এক্সটেনশনটি একটি সর্বজনীন GitHub সংগ্রহস্থলে উপলব্ধ করা।
firebase ext:dev:upload
কমান্ড ব্যবহার করে এক্সটেনশন হাবে আপনার এক্সটেনশন আপলোড করুন।Firebase কনসোলে আপনার প্রকাশক ড্যাশবোর্ডে যান, আপনি এইমাত্র আপলোড করা এক্সটেনশনটি খুঁজুন এবং "এক্সটেনশন হাবে প্রকাশ করুন" এ ক্লিক করুন৷ এটি আমাদের পর্যালোচনা কর্মীদের কাছ থেকে একটি পর্যালোচনার অনুরোধ করে, এতে কয়েক দিন সময় লাগতে পারে৷ অনুমোদিত হলে, এক্সটেনশনটি এক্সটেনশন হাবে প্রকাশ করা হবে। প্রত্যাখ্যান করা হলে, আপনি কারণ ব্যাখ্যা করে একটি বার্তা পাবেন; তারপরে আপনি রিপোর্ট করা সমস্যাগুলির সমাধান করতে পারেন এবং পর্যালোচনার জন্য আবার জমা দিতে পারেন৷
- এক্সটেনশন হাবে এক্সটেনশন শেয়ার করতে, আপনাকে অবশ্যই প্রকাশক হিসাবে নিবন্ধিত হতে হবে৷
- একটি যাচাইযোগ্য উত্স থেকে প্রকাশ করা প্রয়োজন, এবং এটি ব্যবহারকারীদের আশ্বাস দেয় যে তারা যে কোডটি ইনস্টল করছে সেটি একই কোড যা তারা GitHub এ পরীক্ষা করতে পারে।
- এক্সটেনশন হাবে একটি এক্সটেনশন আপলোড করতে
firebase ext:dev:upload
কমান্ড ব্যবহার করুন। - প্রকাশক ড্যাশবোর্ড থেকে পর্যালোচনার জন্য আপনার এক্সটেনশন জমা দিন।
আরও তথ্য
একজন প্রকাশক হিসাবে নিবন্ধন করা এবং একটি এক্সটেনশন প্রকাশ করার বিষয়ে আরও জানুন৷