একটি এক্সটেনশন নির্মাণ শুরু করুন

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

১. আপনার পরিবেশ সেট আপ করুন এবং একটি প্রকল্প শুরু করুন

একটি এক্সটেনশন তৈরি শুরু করার আগে, আপনাকে প্রয়োজনীয় সরঞ্জাম সহ একটি বিল্ড পরিবেশ সেট আপ করতে হবে।

  1. Node.js ১৬ বা তার পরবর্তী সংস্করণ ইনস্টল করুন। Node ইনস্টল করার একটি উপায় হল nvm (অথবা nvm-windows ) ব্যবহার করা।

  2. Firebase CLI এর সর্বশেষ সংস্করণ ইনস্টল বা আপডেট করুন। npm ব্যবহার করে ইনস্টল বা আপডেট করতে, এই কমান্ডটি চালান:

    npm install -g firebase-tools

এখন একটি নতুন এক্সটেনশন প্রকল্প শুরু করতে Firebase CLI ব্যবহার করুন:

  1. আপনার এক্সটেনশনের জন্য একটি ডিরেক্টরি তৈরি করুন এবং এতে cd :

    mkdir rtdb-uppercase-messages && cd rtdb-uppercase-messages
  2. Firebase CLI এর ext:dev:init কমান্ডটি চালান:

    firebase ext:dev:init

    অনুরোধ করা হলে, ফাংশনের ভাষা হিসেবে জাভাস্ক্রিপ্ট বেছে নিন (কিন্তু মনে রাখবেন যে আপনি আপনার নিজস্ব এক্সটেনশন তৈরি করার সময় টাইপস্ক্রিপ্টও ব্যবহার করতে পারেন), এবং নির্ভরতা ইনস্টল করতে বলা হলে, "হ্যাঁ" উত্তর দিন। (অন্য যেকোনো বিকল্পের জন্য ডিফল্ট গ্রহণ করুন।) এই কমান্ডটি একটি নতুন এক্সটেনশনের জন্য একটি স্কেলিটন কোডবেস সেট আপ করবে, যেখান থেকে আপনি আপনার এক্সটেনশন তৈরি শুরু করতে পারবেন।

২. এমুলেটর ব্যবহার করে উদাহরণ এক্সটেনশনটি চেষ্টা করুন।

যখন Firebase CLI নতুন এক্সটেনশন ডিরেক্টরিটি শুরু করে, তখন এটি একটি সহজ উদাহরণ ফাংশন এবং একটি integration-tests ডিরেক্টরি তৈরি করে যাতে Firebase এমুলেটর স্যুট ব্যবহার করে একটি এক্সটেনশন চালানোর জন্য প্রয়োজনীয় ফাইল থাকে।

এমুলেটরে উদাহরণ এক্সটেনশনটি চালানোর চেষ্টা করুন:

  1. integration-tests ডিরেক্টরিতে পরিবর্তন করুন:

    cd functions/integration-tests
  2. একটি ডেমো প্রকল্প দিয়ে এমুলেটরটি শুরু করুন:

    firebase emulators:start --project=demo-test

    এমুলেটরটি এক্সটেনশনটিকে একটি পূর্বনির্ধারিত "ডামি" প্রকল্পে ( demo-test ) লোড করে। এখন পর্যন্ত এক্সটেনশনটিতে একটি একক HTTP-ট্রিগার করা ফাংশন, greetTheWorld , রয়েছে, যা অ্যাক্সেস করার সময় একটি "হ্যালো ওয়ার্ল্ড" বার্তা প্রদান করে।

  3. এমুলেটরটি এখনও চালু থাকা অবস্থায়, এক্সটেনশনটির greetTheWorld ফাংশনটি ব্যবহার করে দেখুন, এটি শুরু করার সময় এটি যে URL টি প্রিন্ট করেছিল সেখানে গিয়ে।

    আপনার ব্রাউজারে "greet-the-world থেকে Hello World" বার্তাটি প্রদর্শিত হবে।

  4. এই ফাংশনের সোর্স কোডটি এক্সটেনশনের 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);
    });
    
  5. এমুলেটরটি চলাকালীন, এটি আপনার ফাংশন কোডে করা যেকোনো পরিবর্তন স্বয়ংক্রিয়ভাবে পুনরায় লোড করবে। greetTheWorld ফাংশনে একটি ছোট পরিবর্তন করার চেষ্টা করুন:

    ফাংশন/ইন্ডেক্স.জেএস

    const greeting = `${consumerProvidedGreeting} everyone, from ${instanceId}`;
    

    আপনার পরিবর্তনগুলি সংরক্ষণ করুন। এমুলেটর আপনার কোডটি পুনরায় লোড করবে, এবং এখন, যখন আপনি ফাংশন URL এ যাবেন, তখন আপনি আপডেট করা শুভেচ্ছা দেখতে পাবেন।

৩. extension.yaml-এ মৌলিক তথ্য যোগ করুন

এখন যেহেতু আপনার একটি ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করা আছে এবং আপনি এক্সটেনশন এমুলেটরটি চালাচ্ছেন, আপনি নিজের এক্সটেনশন লেখা শুরু করতে পারেন।

একটি সাধারণ প্রথম পদক্ষেপ হিসেবে, greet-the-world পরিবর্তে আপনি যে এক্সটেনশনটি লিখতে চান তা প্রতিফলিত করার জন্য পূর্বনির্ধারিত এক্সটেনশন মেটাডেটা সম্পাদনা করুন। এই মেটাডেটা extension.yaml ফাইলে সংরক্ষিত আছে।

  1. আপনার এডিটরে 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 ক্ষেত্রে ব্যবহৃত নামকরণের নিয়মটি লক্ষ্য করুন: অফিসিয়াল ফায়ারবেস এক্সটেনশনগুলির নামকরণের ক্ষেত্রে একটি উপসর্গ থাকে যা এক্সটেনশনটি কোন প্রাথমিক ফায়ারবেস পণ্যের উপর কাজ করে তা নির্দেশ করে, তারপরে এক্সটেনশনটি কী করে তার বিবরণ থাকে। আপনার নিজস্ব এক্সটেনশনগুলিতে একই নিয়ম ব্যবহার করা উচিত।

  2. যেহেতু আপনি আপনার এক্সটেনশনের নাম পরিবর্তন করেছেন, তাই আপনার এমুলেটর কনফিগারেশনটি নতুন নাম দিয়ে আপডেট করা উচিত:

    1. functions/integration-tests/firebase.json এ, greet-the-world rtdb-uppercase-messages এ পরিবর্তন করুন।
    2. functions/integration-tests/extensions/greet-the-world.env নাম পরিবর্তন করে functions/integration-tests/extensions/rtdb-uppercase-messages.env করুন।

আপনার এক্সটেনশন কোডে greet-the-world এক্সটেনশনের কিছু অবশিষ্টাংশ এখনও অবশিষ্ট আছে, তবে আপাতত এগুলি রেখে দিন। আপনি পরবর্তী কয়েকটি বিভাগে সেগুলি আপডেট করবেন।

৪. একটি ক্লাউড ফাংশন লিখুন এবং এটিকে একটি এক্সটেনশন রিসোর্স হিসেবে ঘোষণা করুন।

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

  1. আপনার পছন্দের এডিটর বা 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 and export ) ব্যবহার করে। Node-এ ES মডিউল ব্যবহার করতে, functions/package.json"type": "module" উল্লেখ করুন:

    {
      "name": "rtdb-uppercase-messages",
      "main": "index.js",
      "type": "module",
      
    }
    
  2. আপনার এক্সটেনশনের প্রতিটি ফাংশন 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"
    
  3. যেহেতু আপনার এক্সটেনশনটি এখন রিয়েলটাইম ডেটাবেসকে ট্রিগার হিসেবে ব্যবহার করছে, তাই ক্লাউড ফাংশন এমুলেটরের পাশাপাশি RTDB এমুলেটর চালানোর জন্য আপনাকে আপনার এমুলেটর কনফিগারেশন আপডেট করতে হবে:

    1. যদি এমুলেটরটি এখনও চলমান থাকে, তাহলে Ctrl-C টিপে এটি বন্ধ করুন।

    2. functions/integration-tests ডিরেক্টরি থেকে, নিম্নলিখিত কমান্ডটি চালান:

      firebase init emulators

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

    3. এমুলেটরটি পুনরায় চালু করুন:

      firebase emulators:start --project=demo-test
  4. আপনার আপডেট করা এক্সটেনশনটি ব্যবহার করে দেখুন:

    1. ডাটাবেস এমুলেটর UI খুলুন, শুরু করার সময় এমুলেটরটি যে লিঙ্কটি প্রিন্ট করেছিল তা ব্যবহার করে।

    2. ডাটাবেসের রুট নোড সম্পাদনা করুন:

      • ক্ষেত্র: messages
      • ধরণ: json
      • মান: {"11": {"original": "recipe"}}

      যদি সবকিছু সঠিকভাবে সেট আপ করা থাকে, তাহলে যখন আপনি আপনার ডাটাবেসের পরিবর্তনগুলি সংরক্ষণ করবেন, তখন এক্সটেনশনের makeuppercase ফাংশনটি ট্রিগার করবে এবং "upper": "RECIPE" বিষয়বস্তু সহ বার্তা 11-এ একটি চাইল্ড রেকর্ড যুক্ত করবে। প্রত্যাশিত ফলাফল নিশ্চিত করতে এমুলেটর UI এর লগ এবং ডাটাবেস ট্যাবগুলি একবার দেখুন।

    3. messages নোডে আরও কিছু শিশু যোগ করার চেষ্টা করুন ( {"original":"any text"} )। যখনই আপনি একটি নতুন রেকর্ড যোগ করবেন, এক্সটেনশনটিতে original ক্ষেত্রের বড় হাতের বিষয়বস্তু সম্বলিত একটি uppercase ক্ষেত্র যুক্ত করা উচিত।

এখন আপনার কাছে একটি সম্পূর্ণ, যদিও সহজ, এক্সটেনশন আছে যা একটি RTDB ইনস্ট্যান্সে কাজ করে। পরবর্তী বিভাগগুলিতে, আপনি কিছু অতিরিক্ত বৈশিষ্ট্য সহ এই এক্সটেনশনটি পরিমার্জন করবেন। তারপর, আপনি অন্যদের কাছে বিতরণের জন্য এক্সটেনশনটি প্রস্তুত করবেন এবং অবশেষে, এক্সটেনশন হাবে আপনার এক্সটেনশনটি কীভাবে প্রকাশ করবেন তা শিখবেন।

৫. API এবং ভূমিকা ঘোষণা করুন

ফায়ারবেস একটি ইনস্টল করা এক্সটেনশনের প্রতিটি উদাহরণকে একটি প্রতি-ইনস্ট্যান্স পরিষেবা অ্যাকাউন্ট ব্যবহার করে প্রকল্প এবং এর ডেটাতে সীমিত অ্যাক্সেস দেয়। প্রতিটি অ্যাকাউন্ট পরিচালনার জন্য প্রয়োজনীয় ন্যূনতম অনুমতির সেট থাকে। এই কারণে, আপনার এক্সটেনশনের জন্য প্রয়োজনীয় IAM ভূমিকাগুলি স্পষ্টভাবে ঘোষণা করতে হবে; ব্যবহারকারীরা যখন আপনার এক্সটেনশন ইনস্টল করেন, তখন ফায়ারবেস এই ভূমিকাগুলি মঞ্জুর করে একটি পরিষেবা অ্যাকাউন্ট তৈরি করে এবং এক্সটেনশনটি চালানোর জন্য এটি ব্যবহার করে।

কোনও পণ্যের ইভেন্ট চালু করার জন্য আপনাকে ভূমিকা ঘোষণা করতে হবে না, তবে অন্যথায় এটির সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে একটি ভূমিকা ঘোষণা করতে হবে। যেহেতু আপনি শেষ ধাপে যে ফাংশনটি যোগ করেছেন তা রিয়েলটাইম ডেটাবেসে লেখা হয়, তাই আপনাকে extension.yaml এ নিম্নলিখিত ঘোষণাটি যোগ করতে হবে:

roles:
  - role: firebasedatabase.admin
    reason: Allows the extension to write to RTDB.

একইভাবে, আপনি apis ফিল্ডে একটি এক্সটেনশন ব্যবহার করে এমন Google API গুলি ঘোষণা করেন। ব্যবহারকারীরা যখন আপনার এক্সটেনশন ইনস্টল করবেন, তখন তাদের জিজ্ঞাসা করা হবে যে তারা তাদের প্রকল্পের জন্য এই API গুলি স্বয়ংক্রিয়ভাবে সক্ষম করতে চান কিনা। এটি সাধারণত শুধুমাত্র নন-ফায়ারবেস Google API গুলির জন্য প্রয়োজনীয়, এবং এই নির্দেশিকার জন্য এটি প্রয়োজন হয় না।

৬. ব্যবহারকারী-কনফিগারযোগ্য পরামিতি নির্ধারণ করুন

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

এক্সটেনশনটি নতুন বার্তাগুলির জন্য যে পথটি পর্যবেক্ষণ করে তা ব্যবহারকারী-কনফিগারযোগ্য করে তুলুন:

  1. 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
    

    এটি একটি নতুন স্ট্রিং প্যারামিটার সংজ্ঞায়িত করে যা ব্যবহারকারীরা আপনার এক্সটেনশন ইনস্টল করার সময় সেট করতে অনুরোধ করবে।

  2. এখনও extension.yaml ফাইলে আছে, আপনার makeuppercase ঘোষণায় ফিরে যান এবং resource ক্ষেত্রটি নিম্নলিখিতটিতে পরিবর্তন করুন:

    resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${param:MESSAGE_PATH}
    

    ${param:MESSAGE_PATH} টোকেনটি আপনার সংজ্ঞায়িত প্যারামিটারের একটি রেফারেন্স। যখন আপনার এক্সটেনশনটি চলবে, তখন এই টোকেনটি ব্যবহারকারীর দ্বারা সেই প্যারামিটারের জন্য কনফিগার করা যেকোনো মান দ্বারা প্রতিস্থাপিত হবে, যার ফলে makeuppercase ফাংশন ব্যবহারকারীর নির্দিষ্ট করা পথটি শুনবে। আপনি extension.yaml (এবং POSTINSTALL.md - পরে আরও বিস্তারিত) যেকোনো ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার রেফারেন্স করতে এই সিনট্যাক্সটি ব্যবহার করতে পারেন।

  3. আপনি আপনার ফাংশন কোড থেকে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটারগুলিও অ্যাক্সেস করতে পারেন।

    গত বিভাগে আপনি যে ফাংশনটি লিখেছিলেন, তাতে আপনি পরিবর্তনগুলি দেখার জন্য পাথটি হার্ড-কোড করেছেন। ব্যবহারকারী-সংজ্ঞায়িত মান উল্লেখ করার জন্য ট্রিগার সংজ্ঞাটি পরিবর্তন করুন:

    ফাংশন/ইন্ডেক্স.জেএস

    export const makeuppercase = database.ref(process.env.MESSAGE_PATH).onCreate
    

    মনে রাখবেন যে Firebase Extensions-এ, এই পরিবর্তনটি সম্পূর্ণরূপে ডকুমেন্টেশনের জন্য: যখন একটি ক্লাউড ফাংশন একটি এক্সটেনশনের অংশ হিসাবে স্থাপন করা হয়, তখন এটি extension.yaml ফাইল থেকে ট্রিগার সংজ্ঞা ব্যবহার করে এবং ফাংশন সংজ্ঞায় নির্দিষ্ট মান উপেক্ষা করে। তবুও, আপনার কোডে এই মানটি কোথা থেকে এসেছে তা নথিভুক্ত করা একটি ভাল ধারণা।

  4. রানটাইম প্রভাব ছাড়াই কোড পরিবর্তন করা আপনার জন্য হতাশাজনক হতে পারে, তবে গুরুত্বপূর্ণ শিক্ষা হল আপনি আপনার ফাংশন কোডের যেকোনো ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটার অ্যাক্সেস করতে পারেন এবং এটি ফাংশনের লজিকে একটি সাধারণ মান হিসাবে ব্যবহার করতে পারেন। এই ক্ষমতার একটি ইঙ্গিত হিসাবে, নিম্নলিখিত লগ স্টেটমেন্টটি যোগ করুন যাতে দেখা যায় যে আপনি প্রকৃতপক্ষে ব্যবহারকারীর সংজ্ঞায়িত মানটি অ্যাক্সেস করছেন:

    ফাংশন/ইন্ডেক্স.জেএস

    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.
        ...
    
  5. সাধারণত, ব্যবহারকারীরা যখন কোনও এক্সটেনশন ইনস্টল করেন তখন তাদের প্যারামিটারের জন্য মান প্রদান করতে বলা হয়। তবে, যখন আপনি পরীক্ষা এবং বিকাশের জন্য এমুলেটর ব্যবহার করেন, তখন আপনি ইনস্টলেশন প্রক্রিয়াটি এড়িয়ে যান, তাই আপনি একটি env ফাইল ব্যবহার করে ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটারের জন্য মান প্রদান করেন।

    functions/integration-tests/extensions/rtdb-uppercase-messages.env খুলুন এবং GREETING সংজ্ঞাটি নিম্নলিখিত দিয়ে প্রতিস্থাপন করুন:

    MESSAGE_PATH=/msgs/{pushId}/original
    

    লক্ষ্য করুন যে উপরের পাথটি ডিফল্ট পাথ এবং আপনার পূর্বে সংজ্ঞায়িত পাথ থেকে আলাদা; এটি শুধুমাত্র আপনার আপডেট করা এক্সটেনশনটি চেষ্টা করার সময় নিজেকে প্রমাণ করার জন্য যে আপনার সংজ্ঞা কার্যকর হচ্ছে।

  6. এখন, এমুলেটরটি পুনরায় চালু করুন এবং আবার ডাটাবেস এমুলেটর UI দেখুন।

    উপরে বর্ণিত পথ ব্যবহার করে ডাটাবেসের রুট নোড সম্পাদনা করুন:

    • ক্ষেত্র: msgs
    • ধরণ: json
    • মান: {"11": {"original": "recipe"}}

    যখন আপনি আপনার ডাটাবেসের পরিবর্তনগুলি সংরক্ষণ করেন, তখন এক্সটেনশনের makeuppercase ফাংশনটি আগের মতোই ট্রিগার হওয়া উচিত, কিন্তু এখন এটি ব্যবহারকারী-সংজ্ঞায়িত প্যারামিটারটি কনসোল লগেও প্রিন্ট করবে।

৭. ব্যবহারকারী-সংজ্ঞায়িত যুক্তির জন্য ইভেন্ট হুক প্রদান করুন

একজন এক্সটেনশন লেখক হিসেবে, আপনি ইতিমধ্যেই দেখেছেন কিভাবে একটি Firebase পণ্য আপনার এক্সটেনশন-প্রদত্ত লজিককে ট্রিগার করতে পারে: রিয়েলটাইম ডেটাবেসে নতুন রেকর্ড তৈরি করলে আপনার makeuppercase ফাংশনটি ট্রিগার হয়। আপনার এক্সটেনশনের সাথে আপনার এক্সটেনশনটি ইনস্টল করা ব্যবহারকারীদের একটি অনুরূপ সম্পর্ক থাকতে পারে: আপনার এক্সটেনশন ব্যবহারকারীর সংজ্ঞা অনুসারে লজিককে ট্রিগার করতে পারে।

একটি এক্সটেনশন সিঙ্ক্রোনাস হুক , অ্যাসিঙ্ক্রোনাস হুক , অথবা উভয়ই প্রদান করতে পারে। সিঙ্ক্রোনাস হুক ব্যবহারকারীদের এমন কাজ সম্পাদন করার একটি উপায় দেয় যা এক্সটেনশনের একটি ফাংশন সম্পূর্ণ করতে বাধা দেয়। এটি কার্যকর হতে পারে, উদাহরণস্বরূপ, ব্যবহারকারীদের একটি এক্সটেনশন তার কাজ করার আগে কাস্টম প্রিপ্রসেসিং করার একটি উপায় দেওয়ার জন্য।

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

একটি অ্যাসিঙ্ক্রোনাস হুক যোগ করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. 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 ব্যবহার করুন।)

  2. 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 পেলোড রয়েছে যাতে মূল এবং বড় হাতের বার্তা রয়েছে। ইভেন্টটি ট্রিগার করে এমন ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি এই তথ্য ব্যবহার করতে পারে।

  3. সাধারণত, 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
    

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

আপনার দ্বারা বাস্তবায়িত এই নতুন বৈশিষ্ট্যটি ব্যবহার করে দেখতে, পরবর্তী কয়েকটি ধাপে, এক্সটেনশনটি ইনস্টল করা ব্যবহারকারীর ভূমিকা গ্রহণ করুন:

  1. functions/integration-tests ডিরেক্টরি থেকে, একটি নতুন ফায়ারবেস প্রকল্প শুরু করুন:

    firebase init functions

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

  2. 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 ইভেন্ট প্রকাশের জন্য এক্সটেনশনের কথা শোনে এবং ট্রিগার করা হলে, নতুন বড় হাতের বার্তায় তিনটি বিস্ময়বোধক বিন্দু যোগ করে।

  3. এমুলেটরটি পুনরায় চালু করুন। এমুলেটরটি এক্সটেনশনের ফাংশনগুলির পাশাপাশি "ব্যবহারকারী" দ্বারা সংজ্ঞায়িত পোস্ট-প্রসেসিং ফাংশনটি লোড করবে।

  4. ডাটাবেস এমুলেটর UI দেখুন এবং উপরে বর্ণিত পথটি ব্যবহার করে ডাটাবেসের রুট নোড সম্পাদনা করুন:

    • ক্ষেত্র: msgs
    • ধরণ: json
    • মান: {"11": {"original": "recipe"}}

    যখন আপনি আপনার ডাটাবেসের পরিবর্তনগুলি সংরক্ষণ করেন, তখন এক্সটেনশনের makeuppercase ফাংশন এবং ব্যবহারকারীর extraemphasis ফাংশন ক্রমানুসারে ট্রিগার হওয়া উচিত, যার ফলে upper ক্ষেত্রটি RECIPE!!! মান পাবে।

৮. লাইফসাইকেল ইভেন্ট হ্যান্ডলার যোগ করুন

আপনি এখন পর্যন্ত যে এক্সটেনশনটি লিখেছেন তা তৈরি হওয়ার সাথে সাথে বার্তাগুলি প্রক্রিয়া করে। কিন্তু যদি আপনার ব্যবহারকারীরা এক্সটেনশনটি ইনস্টল করার সময় ইতিমধ্যেই বার্তাগুলির একটি ডাটাবেস পেয়ে থাকেন? ফায়ারবেস এক্সটেনশনে লাইফসাইকেল ইভেন্ট হুক নামে একটি বৈশিষ্ট্য রয়েছে যা আপনি আপনার এক্সটেনশন ইনস্টল, আপডেট বা পুনর্গঠন করার সময় অ্যাকশন ট্রিগার করতে ব্যবহার করতে পারেন। এই বিভাগে, আপনি লাইফসাইকেল ইভেন্ট হুক ব্যবহার করে কোনও ব্যবহারকারী আপনার এক্সটেনশন ইনস্টল করার সময় বড় হাতের বার্তা দিয়ে একটি প্রকল্পের বিদ্যমান বার্তা ডাটাবেস ব্যাকফিল করবেন।

Firebase Extensions আপনার লাইফসাইকেল ইভেন্ট হ্যান্ডলার চালানোর জন্য Cloud Tasks ব্যবহার করে। আপনি Cloud Functions ব্যবহার করে ইভেন্ট হ্যান্ডলার সংজ্ঞায়িত করেন; যখনই আপনার এক্সটেনশনের একটি ইনস্ট্যান্স সমর্থিত লাইফসাইকেল ইভেন্টগুলির একটিতে পৌঁছায়, যদি আপনি একটি হ্যান্ডলার সংজ্ঞায়িত করে থাকেন, তাহলে এটি হ্যান্ডলারটিকে একটি Cloud Tasks কিউতে যুক্ত করবে। Cloud Tasks তারপর অ্যাসিঙ্ক্রোনাসভাবে হ্যান্ডলারটি কার্যকর করবে। যখন একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার চলমান থাকে, তখন Firebase কনসোল ব্যবহারকারীকে রিপোর্ট করবে যে এক্সটেনশন ইনস্ট্যান্সের একটি প্রক্রিয়াকরণ কাজ চলছে। চলমান অবস্থা এবং টাস্ক সমাপ্তির রিপোর্ট ব্যবহারকারীকে ফেরত পাঠানো আপনার হ্যান্ডলার ফাংশনের উপর নির্ভর করে।

বিদ্যমান বার্তাগুলিকে ব্যাকফিল করে এমন একটি লাইফসাইকেল ইভেন্ট হ্যান্ডলার যোগ করতে, নিম্নলিখিতগুলি করুন:

  1. টাস্ক কিউ ইভেন্ট দ্বারা ট্রিগার হওয়া একটি নতুন ক্লাউড ফাংশন সংজ্ঞায়িত করুন:

    ফাংশন/ইন্ডেক্স.জেএস

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

    লক্ষ্য করুন যে ফাংশনটি কেবল কয়েকটি রেকর্ড প্রক্রিয়া করে এবং তারপর আবার টাস্ক কিউতে যোগ করে। এটি একটি সাধারণ কৌশল যা ক্লাউড ফাংশনের টাইমআউট উইন্ডোর মধ্যে সম্পন্ন না হওয়া কাজগুলি প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। যেহেতু আপনি ভবিষ্যদ্বাণী করতে পারবেন না যে কোনও ব্যবহারকারী যখন আপনার এক্সটেনশন ইনস্টল করবেন তখন তাদের ডাটাবেসে কতগুলি বার্তা থাকবে, তাই এই কৌশলটি আপনার জন্য উপযুক্ত।

  2. 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
    
  3. যদিও বিদ্যমান বার্তাগুলি ব্যাকফিল করা ভালো, তবুও এক্সটেনশনটি এটি ছাড়াই কাজ করতে পারে। এই ধরণের পরিস্থিতিতে, আপনার জীবনচক্র ইভেন্ট হ্যান্ডলারগুলি চালানো ঐচ্ছিক করা উচিত।

    এটি করার জন্য, 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 ইভেন্ট হ্যান্ডলার পরীক্ষা করার জন্য, আপনাকে একটি বাস্তব প্রকল্পে এক্সটেনশনটি ইনস্টল করতে হবে। তবে এটি ঠিক ততটাই ভালো, কারণ এই স্বয়ংক্রিয় ব্যাকফিল বৈশিষ্ট্যটি যুক্ত হওয়ার সাথে সাথে, টিউটোরিয়াল এক্সটেনশনটি এখন কোড-সম্পূর্ণ!

৯. একটি বাস্তব ফায়ারবেস প্রকল্পে স্থাপন করুন

যদিও এক্সটেনশন এমুলেটর ডেভেলপমেন্টের সময় দ্রুত এক্সটেনশনে পুনরাবৃত্তি করার জন্য একটি দুর্দান্ত হাতিয়ার, তবুও এক পর্যায়ে আপনি এটি একটি বাস্তব প্রকল্পে চেষ্টা করে দেখতে চাইবেন।

এটি করার জন্য, প্রথমে কিছু পরিষেবা সক্ষম করে একটি নতুন প্রকল্প সেট আপ করুন:

  1. ফায়ারবেস কনসোলে , একটি নতুন প্রকল্প যুক্ত করুন।
  2. আপনার প্রকল্পটি পে-অ্যাজ-ইউ-গো ব্লেজ প্ল্যানে আপগ্রেড করুন । ক্লাউড ফাংশনস ফর ফায়ারবেসের জন্য আপনার প্রকল্পের একটি বিলিং অ্যাকাউন্ট থাকা প্রয়োজন, তাই এক্সটেনশন ইনস্টল করার জন্য আপনার একটি বিলিং অ্যাকাউন্টও প্রয়োজন।
  3. আপনার নতুন প্রকল্পে, রিয়েল-টাইম ডেটাবেস সক্ষম করুন
  4. যেহেতু আপনি আপনার এক্সটেনশনের ইনস্টলেশনের সময় বিদ্যমান ডেটা ব্যাকফিল করার ক্ষমতা পরীক্ষা করতে চান, তাই আপনার রিয়েল-টাইম ডাটাবেস ইনস্ট্যান্সে কিছু নমুনা ডেটা আমদানি করুন:
    1. কিছু বীজ RTDB তথ্য ডাউনলোড করুন।
    2. Firebase কনসোলের রিয়েল-টাইম ডেটাবেস পৃষ্ঠায়, (আরও) > Import JSON এ ক্লিক করুন এবং আপনার ডাউনলোড করা ফাইলটি নির্বাচন করুন।
  5. orderByChild পদ্ধতি ব্যবহার করার জন্য ব্যাকফিল ফাংশন সক্রিয় করতে, ডাটাবেসটি upper : এর মানের উপর বার্তা সূচী করার জন্য কনফিগার করুন।

    {
      "rules": {
        ".read": false,
        ".write": false,
        "messages": {
          ".indexOn": "upper"
        }
      }
    }
    

এখন স্থানীয় উৎস থেকে আপনার এক্সটেনশনটি নতুন প্রকল্পে ইনস্টল করুন:

  1. আপনার Firebase প্রকল্পের জন্য একটি নতুন ডিরেক্টরি তৈরি করুন:

    mkdir ~/extensions-live-test && cd ~/extensions-live-test
    
  2. ওয়ার্কিং ডিরেক্টরিতে একটি ফায়ারবেস প্রকল্প শুরু করুন:

    firebase init database

    অনুরোধ করা হলে, আপনার তৈরি করা প্রকল্পটি নির্বাচন করুন।

  3. আপনার স্থানীয় ফায়ারবেস প্রকল্পে এক্সটেনশনটি ইনস্টল করুন:

    firebase ext:install /path/to/rtdb-uppercase-messages

    এখানে আপনি দেখতে পাবেন Firebase CLI টুল ব্যবহার করে এক্সটেনশন ইনস্টল করার সময় ব্যবহারকারীর অভিজ্ঞতা কেমন হয়। কনফিগারেশন টুল যখন জিজ্ঞাসা করবে যে আপনি আপনার বিদ্যমান ডাটাবেস ব্যাকফিল করতে চান কিনা তখন "হ্যাঁ" নির্বাচন করতে ভুলবেন না।

    কনফিগারেশন অপশন নির্বাচন করার পর, Firebase CLI আপনার কনফিগারেশন extensions ডিরেক্টরিতে সংরক্ষণ করবে এবং firebase.json ফাইলে এক্সটেনশন সোর্স লোকেশন রেকর্ড করবে। সম্মিলিতভাবে, এই দুটি রেকর্ডকে এক্সটেনশন ম্যানিফেস্ট বলা হয়। ব্যবহারকারীরা তাদের এক্সটেনশন কনফিগারেশন সংরক্ষণ করতে এবং বিভিন্ন প্রকল্পে এটি স্থাপন করতে ম্যানিফেস্ট ব্যবহার করতে পারেন।

  4. আপনার লাইভ প্রজেক্টে আপনার এক্সটেনশন কনফিগারেশন স্থাপন করুন:

    firebase deploy --only extensions

সবকিছু ঠিকঠাক থাকলে, Firebase CLI আপনার প্রোজেক্টে আপনার এক্সটেনশন আপলোড করবে এবং এটি ইনস্টল করবে। ইনস্টলেশন সম্পন্ন হওয়ার পরে, ব্যাকফিল টাস্কটি চলবে এবং কয়েক মিনিটের মধ্যে, আপনার ডাটাবেসটি বড় হাতের বার্তা দিয়ে আপডেট হবে। বার্তা ডাটাবেসে কিছু নতুন নোড যুক্ত করুন এবং নিশ্চিত করুন যে এক্সটেনশনটি নতুন বার্তাগুলির জন্যও কাজ করছে।

১০. ডকুমেন্টেশন লিখুন

ব্যবহারকারীদের সাথে আপনার এক্সটেনশন শেয়ার করার আগে, নিশ্চিত করুন যে আপনি তাদের সফল হওয়ার জন্য পর্যাপ্ত ডকুমেন্টেশন সরবরাহ করছেন।

যখন আপনি এক্সটেনশন প্রকল্পটি শুরু করেন, তখন 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 সম্পর্কে

বেশিরভাগ এক্সটেনশনই এক্সটেনশনের রিপোজিটরিতে আসা ব্যবহারকারীদের সুবিধার্থে একটি রিডমি ফাইলও প্রদান করে। আপনি এই ফাইলটি হাতে লিখতে পারেন অথবা কমান্ড ব্যবহার করে একটি রিডমি তৈরি করতে পারেন।

এই নির্দেশিকার উদ্দেশ্যে, রিডমি ফাইল লেখা এড়িয়ে চলুন।

অতিরিক্ত ডকুমেন্টেশন

উপরে আলোচিত ডকুমেন্টেশন হল ব্যবহারকারীদের জন্য নূন্যতম ডকুমেন্টেশন সেট যা আপনাকে প্রদান করতে হবে। অনেক এক্সটেনশনের ব্যবহারকারীদের সফলভাবে ব্যবহারের জন্য আরও বিস্তারিত ডকুমেন্টেশনের প্রয়োজন হয়। যখন এটি হয়, তখন আপনার অতিরিক্ত ডকুমেন্টেশন লিখে এমন কোথাও হোস্ট করা উচিত যেখানে আপনি ব্যবহারকারীদের নির্দেশ করতে পারেন।

এই নির্দেশিকার উদ্দেশ্যে, আরও বিস্তৃত ডকুমেন্টেশন লেখা এড়িয়ে চলুন।

১১. এক্সটেনশন হাবে প্রকাশ করুন

এখন যেহেতু আপনার এক্সটেনশনটি কোড সম্পূর্ণ এবং ডকুমেন্টেড, আপনি এটি এক্সটেনশন হাবের মাধ্যমে বিশ্বের সাথে শেয়ার করতে প্রস্তুত। কিন্তু যেহেতু এটি কেবল একটি টিউটোরিয়াল, তাই আসলে এটি করবেন না। এখানে এবং ফায়ারবেস এক্সটেনশন প্রকাশকের বাকি ডকুমেন্টেশন থেকে যা শিখেছেন তা ব্যবহার করে এবং অফিসিয়াল, ফায়ারবেস-লিখিত, এক্সটেনশনের উৎস পরীক্ষা করে আপনার নিজস্ব এক্সটেনশন লেখা শুরু করুন।

যখন আপনি এক্সটেনশন হাবে আপনার কাজ প্রকাশ করার জন্য প্রস্তুত হবেন, তখন আপনি এটি কীভাবে করবেন তা এখানে দেওয়া হল:

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

    বর্তমানে, এর অর্থ হল আপনার এক্সটেনশনটি একটি পাবলিক গিটহাব রিপোজিটরিতে উপলব্ধ করা।

  3. firebase ext:dev:upload কমান্ড ব্যবহার করে আপনার এক্সটেনশনটি Extensions Hub-এ আপলোড করুন।

  4. Firebase কনসোলে আপনার প্রকাশক ড্যাশবোর্ডে যান, আপনার আপলোড করা এক্সটেনশনটি খুঁজুন এবং "Extensions Hub-এ প্রকাশ করুন" এ ক্লিক করুন। এটি আমাদের পর্যালোচনা কর্মীদের কাছ থেকে একটি পর্যালোচনার অনুরোধ করে, যা কয়েক দিন সময় নিতে পারে। অনুমোদিত হলে, এক্সটেনশনটি Extensions Hub-তে প্রকাশিত হবে। যদি প্রত্যাখ্যান করা হয়, তাহলে আপনি কারণ ব্যাখ্যা করে একটি বার্তা পাবেন; তারপরে আপনি রিপোর্ট করা সমস্যাগুলি সমাধান করতে পারেন এবং পর্যালোচনার জন্য পুনরায় জমা দিতে পারেন।