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

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

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

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

  1. Node.js 16 বা নতুন ইনস্টল করুন। নোড ইনস্টল করার একটি উপায় হল 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
    

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

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

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

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

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

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

    firebase emulators:start --project=demo-test
    

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

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

    আপনার ব্রাউজার "হ্যালো ওয়ার্ল্ড ফ্রম গ্রীট-দ্য-ওয়ার্ল্ড" বার্তাটি প্রদর্শন করে।

  4. এই ফাংশনের সোর্স কোডটি এক্সটেনশনের functions ডিরেক্টরিতে রয়েছে। আপনার পছন্দের সম্পাদক বা IDE-এ উৎসটি খুলুন:

    functions/index.js

    const functions = require("firebase-functions");
    
    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 ফাংশনে একটি ছোট পরিবর্তন করার চেষ্টা করুন:

    functions/index.js

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

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

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

  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 এক্সটেনশনের কিছু অবশিষ্টাংশ এখনও অবশিষ্ট আছে, কিন্তু আপাতত সেগুলি ছেড়ে দিন। আপনি পরবর্তী কয়েকটি বিভাগে সেগুলি আপডেট করবেন।

4. একটি ক্লাউড ফাংশন লিখুন এবং এটিকে একটি এক্সটেনশন সম্পদ হিসাবে ঘোষণা করুন৷

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

  1. আপনার পছন্দের এডিটর বা 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",
      …
    }
    
  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"} )। যখনই আপনি একটি নতুন রেকর্ড যোগ করবেন, এক্সটেনশনটি একটি uppercase ক্ষেত্র যোগ করবে যাতে original ক্ষেত্রের বড় হাতের কন্টেন্ট থাকে।

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

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

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

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

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

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

6. ব্যবহারকারী-কনফিগারযোগ্য পরামিতি সংজ্ঞায়িত করুন

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

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

    functions/index.js

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

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

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

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

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

    MESSAGE_PATH=/msgs/{pushId}/original
    

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

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

    আপনি উপরে সংজ্ঞায়িত পথ ব্যবহার করে ডাটাবেসের রুট নোড সম্পাদনা করুন:

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

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

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

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

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

এই নির্দেশিকায়, আপনি আপনার এক্সটেনশনে একটি অ্যাসিঙ্ক্রোনাস হুক যোগ করবেন, যা ব্যবহারকারীদের তাদের নিজস্ব প্রক্রিয়াকরণের পদক্ষেপগুলিকে সংজ্ঞায়িত করতে সক্ষম করবে যা আপনার এক্সটেনশনটি রিয়েলটাইম ডেটাবেসে বড় হাতের বার্তা লেখার পরে চালানো হবে৷ অ্যাসিঙ্ক্রোনাস হুক ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ট্রিগার করতে Eventarc ব্যবহার করে। এক্সটেনশনগুলি তারা যে ধরনের ইভেন্টগুলি নির্গত করে তা ঘোষণা করে এবং ব্যবহারকারীরা যখন এক্সটেনশন ইনস্টল করেন, তখন তারা কোন ইভেন্টের ধরনগুলিতে আগ্রহী তা চয়ন করেন৷ যদি তারা অন্তত একটি ইভেন্ট বেছে নেন, ফায়ারবেস ইনস্টলেশন প্রক্রিয়ার অংশ হিসাবে এক্সটেনশনের জন্য একটি 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 ফাংশনের শেষে, এমন কিছু কোড যোগ করুন যা আপনি ঘোষণা করেছেন এমন একটি ইভেন্ট প্রকাশ করে:

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

  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
    

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

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

8. জীবনচক্র ইভেন্ট হ্যান্ডলার যোগ করুন

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

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

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

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

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

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

  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 প্যারামিটারের মান পরীক্ষা করুন এবং এটি সেট না থাকলে তাড়াতাড়ি প্রস্থান করুন:

    functions/index.js

    if (!process.env.DO_BACKFILL) {
      return getExtensions()
        .runtime()
        .setProcessingState("PROCESSING_COMPLETE", "Backfill skipped.");
    }
    

উপরের পরিবর্তনগুলির সাথে, এক্সটেনশনটি এখন বিদ্যমান বার্তাগুলিকে বড় হাতের অক্ষরে রূপান্তর করবে যখন এটি ইনস্টল করা হবে।

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

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

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

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

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

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

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

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

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

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 তৈরি করতে পারেন।

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

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

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

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

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

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

যখন আপনি Extensions Hub-এ আপনার কাজ প্রকাশ করতে প্রস্তুত হন তখন আপনি এটি কীভাবে করবেন তা এখানে রয়েছে:

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

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

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

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