একটি এক্সটেনশন ব্যবহারকারী হুক যোগ করুন

আপনি আপনার এক্সটেনশন ইনস্টল করার ব্যবহারকারীদের তাদের নিজস্ব কাস্টম লজিক আপনার এক্সটেনশন কার্যকর করার ক্ষমতা প্রদান করতে পারেন৷ এটি সম্পন্ন করার দুটি উপায় আছে:

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

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

একটি এক্সটেনশন উভয় বা উভয় পদ্ধতি ব্যবহার করতে পারে।

ইভেন্টর্ক ইভেন্ট

একটি এক্সটেনশন থেকে ইভেন্ট প্রকাশ করতে:

  1. আপনি extension.yaml ফাইলে প্রকাশ করবেন এমন ইভেন্টের ধরন ঘোষণা করুন:

    events:
      - type: publisher-id.extension-name.version.event-name
        description: event-description
      - type: publisher-id.extension-name.version.another-event-name
        description: another-event-description
    

    type আইডেন্টিফায়ারটি বিভিন্ন ডট-ডিলিমিটেড ফিল্ড দিয়ে তৈরি। প্রকাশক আইডি , এক্সটেনশনের নাম এবং ইভেন্টের নাম ক্ষেত্র প্রয়োজন। সংস্করণ ক্ষেত্র সুপারিশ করা হয়. আপনার প্রকাশ করা প্রতিটি ইভেন্টের জন্য একটি অনন্য এবং বর্ণনামূলক ইভেন্টের নাম চয়ন করুন।

    উদাহরণস্বরূপ, storage-resize-images এক্সটেনশন একটি একক ইভেন্ট টাইপ ঘোষণা করে:

    events:
      - type: firebase.extensions.storage-resize-images.v1.complete
        description: |
          Occurs when image resizing completes. The event will contain further
          details about specific formats and sizes.
    

    ব্যবহারকারীরা এক্সটেনশন ইনস্টল করার সময় কোন ইভেন্টগুলিতে সদস্যতা নেবেন তা চয়ন করতে সক্ষম হবেন৷

  2. আপনার এক্সটেনশন ফাংশনে, Admin SDK থেকে Eventarc API আমদানি করুন এবং ব্যবহারকারীর ইনস্টলেশন সেটিংস ব্যবহার করে একটি ইভেন্ট চ্যানেল শুরু করুন। এই সেটিংস নিম্নলিখিত পরিবেশ ভেরিয়েবল ব্যবহার করে উন্মুক্ত করা হয়:

    • EVENTARC_CHANNEL : Eventarc চ্যানেলের সম্পূর্ণ-যোগ্য নাম যেখানে ব্যবহারকারী ইভেন্ট প্রকাশ করতে বেছে নিয়েছে।
    • EXT_SELECTED_EVENTS : ব্যবহারকারী প্রকাশ করতে বেছে নেওয়া ইভেন্ট প্রকারের একটি কমা-বিভক্ত তালিকা৷ আপনি যখন এই মান সহ একটি চ্যানেল শুরু করেন, তখন অ্যাডমিন SDK স্বয়ংক্রিয়ভাবে ইভেন্ট ফিল্টার করে দেয় যা ব্যবহারকারী নির্বাচন করেননি।
    • EVENTARC_CLOUD_EVENT_SOURCE : ক্লাউড ইভেন্ট উৎস শনাক্তকারী। অ্যাডমিন SDK স্বয়ংক্রিয়ভাবে প্রকাশিত ইভেন্টের source ক্ষেত্রে এই মানটি পাস করে। আপনি সাধারণত স্পষ্টভাবে এই পরিবর্তনশীল ব্যবহার করার প্রয়োজন নেই.

    যদি ইভেন্টগুলি ইনস্টলেশনের সময় সক্ষম না করা হয় তবে এই ভেরিয়েবলগুলি অনির্ধারিত হবে। ইভেন্টগুলি সক্ষম হলেই আপনি একটি ইভেন্ট চ্যানেল শুরু করতে এই সত্যটি ব্যবহার করতে পারেন:

    import * as admin from "firebase-admin";
    import {getEventarc} from 'firebase-admin/eventarc';
    
    admin.initializeApp();
    
    // 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,
      });
    
  3. আপনার এক্সটেনশনের পয়েন্টগুলিতে চ্যানেলে ইভেন্টগুলি প্রকাশ করুন যা আপনি ব্যবহারকারীদের কাছে প্রকাশ করতে চান৷ যেমন:

    // If events are enabled, publish a `complete` event to the configured
    // channel.
    eventChannel && eventChannel.publish({
        type: 'firebase.extensions.storage-resize-images.v1.complete',
        subject: filename,  // the name of the original file
        data: {
          // ...
        }
    });
    
  4. প্রিইনস্টল বা পোস্টিনস্টল ফাইলে আপনার প্রকাশিত ইভেন্টগুলি নথিভুক্ত করুন৷

    প্রতিটি ইভেন্টের জন্য, নিম্নলিখিত নথিভুক্ত করুন:

    • এর উদ্দিষ্ট উদ্দেশ্য
    • আপনার এক্সটেনশনের যুক্তিতে বিন্দু এটি চলে
    • আউটপুট তথ্য এটি অন্তর্ভুক্ত
    • এর বাস্তবায়নের শর্ত

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

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

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণটি মূল চিত্রটি পুনরায় আকার দেওয়ার পরে মুছে দেয়। মনে রাখবেন যে এই উদাহরণ হ্যান্ডলারটি ইভেন্টের subject সম্পত্তি ব্যবহার করে, যা এই ক্ষেত্রে চিত্রের আসল ফাইলের নাম।

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, delete the original.
      return admin.storage()
          .bucket("my-project.appspot.com")
          .file(event.subject)
          .delete();
    });

আরও তথ্যের জন্য কাস্টম ইভেন্ট ট্রিগার দেখুন।

উদাহরণ

অফিসিয়াল রিসাইজ ইমেজ এক্সটেনশন একটি ইমেজ রিসাইজ করার পরে Eventarc-এ প্রকাশ করে একটি অ্যাসিঙ্ক্রোনাস হুক প্রদান করে।

সিঙ্ক্রোনাস হুক

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

একটি সিঙ্ক্রোনাস হুক একটি ব্যবহারকারী-সংজ্ঞায়িত HTTPS কলযোগ্য ক্লাউড ফাংশনকে কল করে এবং চালিয়ে যাওয়ার আগে সমাপ্তির জন্য অপেক্ষা করে (সম্ভবত একটি ফেরত মান সহ)। ব্যবহারকারী-প্রদত্ত ফাংশনে একটি ত্রুটির ফলে এক্সটেনশন ফাংশনে একটি ত্রুটি দেখা দেয়।

একটি সিঙ্ক্রোনাস হুক প্রকাশ করতে:

  1. আপনার এক্সটেনশনে একটি প্যারামিটার যোগ করুন যা ব্যবহারকারীদের তাদের কাস্টম ক্লাউড ফাংশনে URL সহ এক্সটেনশন কনফিগার করতে দেয়। যেমন:

    - param: PREPROCESSING_FUNCTION
      label: Pre-processing function URL
      description: >
        An HTTPS callable function that will be called to transform the input data
        before it is processed by this function.
      type: string
      example: https://us-west1-my-project-id.cloudfunctions.net/preprocessData
      required: false
    
  2. আপনার এক্সটেনশনের বিন্দুতে যেখানে আপনি হুকটি প্রকাশ করতে চান, তার URL ব্যবহার করে ফাংশনটিকে কল করুন। যেমন:

    const functions = require('firebase-functions/v1');
    const fetch = require('node-fetch');
    
    const preprocessFunctionURL = process.env.PREPROCESSING_FUNCTION;
    
    exports.yourFunctionName = functions.firestore.document("collection/{doc_id}")
        .onWrite((change, context) => {
          // PREPROCESSING_FUNCTION hook begins here.
          // If a preprocessing function is defined, call it before continuing.
          if (preprocessFunctionURL) {
            try {
              await fetch(preprocessFunctionURL); // Could also be a POST request if you want to send data.
            } catch (e) {
              // Preprocessing failure causes the function to fail.
              functions.logger.error("Preprocessor error:", e);
              return;
            }
          }
          // End of PREPROCESSING_FUNCTION hook.
    
          // Main function logic follows.
          // ...
        });
    
  3. প্রিইনস্টল বা পোস্টিনস্টল ফাইলে আপনি উপলব্ধ যে কোনো হুক নথিভুক্ত করুন।

    প্রতিটি হুকের জন্য, নিম্নলিখিত নথিভুক্ত করুন:

    • এর উদ্দিষ্ট উদ্দেশ্য
    • আপনার এক্সটেনশনের যুক্তিতে বিন্দু এটি চলে
    • এর প্রত্যাশিত ইনপুট এবং আউটপুট
    • এটি কার্যকর করার জন্য শর্ত (বা বিকল্প)

    অতিরিক্তভাবে, ব্যবহারকারীদের হুক ফাংশনে এমন কোনো কাজ না করার জন্য সতর্ক করুন যা একই এক্সটেনশনকে ট্রিগার করতে পারে, যার ফলে একটি অসীম লুপ হতে পারে।

উদাহরণ

অ্যালগোলিয়া সার্চ এক্সটেনশনটি অ্যালগোলিয়াতে লেখার আগে ব্যবহারকারীর সরবরাহকৃত ট্রান্সফর্ম ফাংশনকে কল করার জন্য একটি সিঙ্ক্রোনাস হুক প্রদান করে।

,

আপনি আপনার এক্সটেনশন ইনস্টল করার ব্যবহারকারীদের তাদের নিজস্ব কাস্টম লজিক আপনার এক্সটেনশন কার্যকর করার ক্ষমতা প্রদান করতে পারেন৷ এটি সম্পন্ন করার দুটি উপায় আছে:

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

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

একটি এক্সটেনশন উভয় বা উভয় পদ্ধতি ব্যবহার করতে পারে।

ইভেন্টর্ক ইভেন্ট

একটি এক্সটেনশন থেকে ইভেন্ট প্রকাশ করতে:

  1. আপনি extension.yaml ফাইলে প্রকাশ করবেন এমন ইভেন্টের ধরন ঘোষণা করুন:

    events:
      - type: publisher-id.extension-name.version.event-name
        description: event-description
      - type: publisher-id.extension-name.version.another-event-name
        description: another-event-description
    

    type আইডেন্টিফায়ারটি বিভিন্ন ডট-ডিলিমিটেড ফিল্ড দিয়ে তৈরি। প্রকাশক আইডি , এক্সটেনশনের নাম এবং ইভেন্টের নাম ক্ষেত্র প্রয়োজন। সংস্করণ ক্ষেত্র সুপারিশ করা হয়. আপনার প্রকাশ করা প্রতিটি ইভেন্টের জন্য একটি অনন্য এবং বর্ণনামূলক ইভেন্টের নাম চয়ন করুন।

    উদাহরণস্বরূপ, storage-resize-images এক্সটেনশন একটি একক ইভেন্ট টাইপ ঘোষণা করে:

    events:
      - type: firebase.extensions.storage-resize-images.v1.complete
        description: |
          Occurs when image resizing completes. The event will contain further
          details about specific formats and sizes.
    

    ব্যবহারকারীরা এক্সটেনশন ইনস্টল করার সময় কোন ইভেন্টগু���িতে সদস্যতা নেবেন তা চয়ন করতে সক্ষম হবেন৷

  2. আপনার এক্সটেনশন ফাংশনে, Admin SDK থেকে Eventarc API আমদানি করুন এবং ব্যবহারকারীর ইনস্টলেশন সেটিংস ব্যবহার করে একটি ইভেন্ট চ্যানেল শুরু করুন। এই সেটিংস নিম্নলিখিত পরিবেশ ভেরিয়েবল ব্যবহার করে উন্মুক্ত করা হয়:

    • EVENTARC_CHANNEL : Eventarc চ্যানেলের সম্পূর্ণ-যোগ্য নাম যেখানে ব্যবহারকারী ইভেন্ট প্রকাশ করতে বেছে নিয়েছে।
    • EXT_SELECTED_EVENTS : ব্যবহারকারী প্রকাশ করতে বেছে নেওয়া ইভেন্ট প্রকারের একটি কমা-বিভক্ত তালিকা৷ আপনি যখন এই মান সহ একটি চ্যানেল শুরু করেন, তখন অ্যাডমিন SDK স্বয়ংক্রিয়ভাবে ইভেন্ট ফিল্টার করে দেয় যা ব্যবহারকারী নির্বাচন করেননি।
    • EVENTARC_CLOUD_EVENT_SOURCE : ক্লাউড ইভেন্ট উৎস শনাক্তকারী। অ্যাডমিন SDK স্বয়ংক্রিয়ভাবে প্রকাশিত ইভেন্টের source ক্ষেত্রে এই মানটি পাস করে। আপনি সাধারণত স্পষ্টভাবে এই পরিবর্তনশীল ব্যবহার করার প্রয়োজন নেই.

    যদি ইভেন্টগুলি ইনস্টলেশনের সময় সক্ষম না করা হয় তবে এই ভেরিয়েবলগুলি অনির্ধারিত হবে। ইভেন্টগুলি সক্ষম হলেই আপনি একটি ইভেন্ট চ্যানেল শুরু করতে এই সত্যটি ব্যবহার করতে পারেন:

    import * as admin from "firebase-admin";
    import {getEventarc} from 'firebase-admin/eventarc';
    
    admin.initializeApp();
    
    // 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,
      });
    
  3. আপনার এক্সটেনশনের পয়েন্টগুলিতে চ্যানেলে ইভেন্টগুলি প্রকাশ করুন যা আপনি ব্যবহারকারীদের কাছে প্রকাশ করতে চান৷ যেমন:

    // If events are enabled, publish a `complete` event to the configured
    // channel.
    eventChannel && eventChannel.publish({
        type: 'firebase.extensions.storage-resize-images.v1.complete',
        subject: filename,  // the name of the original file
        data: {
          // ...
        }
    });
    
  4. প্রিইনস্টল বা পোস্টিনস্টল ফাইলে আপনার প্রকাশিত ইভেন্টগুলি নথিভুক্ত করুন৷

    প্রতিটি ইভেন্টের জন্য, নিম্নলিখিত নথিভুক্ত করুন:

    • এর উদ্দিষ্ট উদ্দেশ্য
    • আপনার এক্সটেনশনের যুক্তিতে বিন্দু এটি চলে
    • আউটপুট তথ্য এটি অন্তর্ভুক্ত
    • এর বাস্তবায়নের শর্ত

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

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

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণটি মূল চিত্রটি পুনরায় আকার দেওয়ার পরে মুছে দেয়। মনে রাখবেন যে এই উদাহরণ হ্যান্ডলারটি ইভেন্টের subject সম্পত্তি ব্যবহার করে, যা এই ক্ষেত্রে চিত্রের আসল ফাইলের নাম।

exports.onimageresized = onCustomEventPublished(
    "firebase.extensions.storage-resize-images.v1.complete",
    (event) => {
      logger.info("Received image resize completed event", event);
      // For example, delete the original.
      return admin.storage()
          .bucket("my-project.appspot.com")
          .file(event.subject)
          .delete();
    });

আরও তথ্যের জন্য কাস্টম ইভেন্ট ট্রিগার দেখুন।

উদাহরণ

অফিসিয়াল রিসাইজ ইমেজ এক্সটেনশন একটি ইমেজ রিসাইজ করার পরে Eventarc-এ প্রকাশ করে একটি অ্যাসিঙ্ক্রোনাস হুক প্রদান করে।

সিঙ্ক্রোনাস হুক

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

একটি সিঙ্ক্রোনাস হুক একটি ব্যবহারকারী-সংজ্ঞায়িত HTTPS কলযোগ্য ক্লাউড ফাংশনকে কল করে এবং চালিয়ে যাওয়ার আগে সমাপ্তির জন্য অপেক্ষা করে (সম্ভবত একটি ফেরত মান সহ)। ব্যবহারকারী-প্রদত্ত ফাংশনে একটি ত্রুটির ফলে এক্সটেনশন ফাংশনে একটি ত্রুটি দেখা দেয়।

একটি সিঙ্ক্রোনাস হুক প্রকাশ করতে:

  1. আপনার এক্সটেনশনে একটি প্যারামিটার যোগ করুন যা ব্যবহারকারীদের তাদের কাস্টম ক্লাউড ফাংশনে URL সহ এক্সটেনশন কনফিগার করতে দেয়। যেমন:

    - param: PREPROCESSING_FUNCTION
      label: Pre-processing function URL
      description: >
        An HTTPS callable function that will be called to transform the input data
        before it is processed by this function.
      type: string
      example: https://us-west1-my-project-id.cloudfunctions.net/preprocessData
      required: false
    
  2. আপনার এক্সটেনশনের বিন্দুতে যেখানে আপনি হুকটি প্রকাশ করতে চান, তার URL ব্যবহার করে ফাংশনটিকে কল করুন। যেমন:

    const functions = require('firebase-functions/v1');
    const fetch = require('node-fetch');
    
    const preprocessFunctionURL = process.env.PREPROCESSING_FUNCTION;
    
    exports.yourFunctionName = functions.firestore.document("collection/{doc_id}")
        .onWrite((change, context) => {
          // PREPROCESSING_FUNCTION hook begins here.
          // If a preprocessing function is defined, call it before continuing.
          if (preprocessFunctionURL) {
            try {
              await fetch(preprocessFunctionURL); // Could also be a POST request if you want to send data.
            } catch (e) {
              // Preprocessing failure causes the function to fail.
              functions.logger.error("Preprocessor error:", e);
              return;
            }
          }
          // End of PREPROCESSING_FUNCTION hook.
    
          // Main function logic follows.
          // ...
        });
    
  3. প্রিইনস্টল বা পোস্টিনস্টল ফাইলে আপনি উপলব্ধ যে কোনো হুক নথিভুক্ত করুন।

    প্রতিটি হুকের জন্য, নিম্নলিখিত নথিভুক্ত করুন:

    • এর উদ্দিষ্ট উদ্দেশ্য
    • আপনার এক্সটেনশনের যুক্তিতে বিন্দু এটি চলে
    • এর প্রত্যাশিত ইনপুট এবং আউটপুট
    • এটি কার্যকর করার জন্য শর্ত (বা বিকল্প)

    অতিরিক্তভাবে, ব্যবহারকারীদের হুক ফাংশনে এমন কোনো কাজ না করার জন্য সতর্ক করুন যা একই এক্সটেনশনকে ট্রিগার করতে পারে, যার ফলে একটি অসীম লুপ হতে পারে।

উদাহরণ

অ্যালগোলিয়া সার্চ এক্সটেনশনটি অ্যালগোলিয়াতে লেখার আগে ব্যবহারকারীর সরবরাহকৃত ট্রান্সফর্ম ফাংশনকে কল করার জন্য একটি সিঙ্ক্রোনাস হুক প্রদান করে।