قلاب های کاربر را به یک برنامه افزودنی اضافه کنید

شما می توانید به کاربرانی که برنامه افزودنی شما را نصب می کنند، این امکان را ارائه دهید که منطق سفارشی خود را در اجرای برنامه افزودنی شما وارد کنند. دو راه برای انجام این کار وجود دارد:

  • رویدادهای 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. در توابع برنامه افزودنی خود، Eventarc API را از Admin SDK وارد کنید و یک کانال رویداد را با استفاده از تنظیمات نصب کاربر مقداردهی کنید. این تنظیمات با استفاده از متغیرهای محیطی زیر نمایش داده می شوند:

    • EVENTARC_CHANNEL : نام کاملاً واجد شرایط کانال Eventarc که کاربر برای انتشار رویدادها انتخاب کرده است.
    • EXT_SELECTED_EVENTS : فهرستی از انواع رویداد که کاربر برای انتشار انتخاب کرده است، با کاما جدا شده است. وقتی کانالی را با این مقدار مقداردهی اولیه می کنید، Admin SDK به طور خودکار رویدادهایی را که کاربر انتخاب نکرده است فیلتر می کند.
    • EVENTARC_CLOUD_EVENT_SOURCE : شناسه منبع رویداد Cloud. Admin 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. رویدادهایی را که منتشر می‌کنید، در فایل PREINSTALL یا POSTINSTALL مستند کنید.

    برای هر رویداد، موارد زیر را مستند کنید:

    • هدف مورد نظر آن
    • نقطه در منطق برنامه افزودنی شما اجرا می شود
    • داده های خروجی که شامل می شود
    • شرایط اجرای آن

    به‌علاوه، به کاربران هشدار دهید که در کنترل‌کننده‌های رویداد خود اقدامی انجام ندهند که ممکن است همان برنامه افزودنی را فعال کند و در نتیجه یک حلقه بی‌نهایت ایجاد شود.

هنگامی که رویدادها را از یک برنامه افزودنی منتشر می کنید، کاربران می توانند کنترل کننده رویداد را برای پاسخگویی با منطق سفارشی مستقر کنند.

به عنوان مثال، مثال زیر تصویر اصلی را پس از تغییر اندازه حذف می کند. توجه داشته باشید که این کنترل کننده نمونه از ویژگی 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 تابع Cloud سفارشی خود پیکربندی کنند. به عنوان مثال:

    - 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. قلاب هایی را که در دسترس می گذارید در فایل PREINSTALL یا POSTINSTALL مستند کنید.

    برای هر قلاب، موارد زیر را مستند کنید:

    • هدف مورد نظر آن
    • نقطه در منطق برنامه افزودنی شما اجرا می شود
    • ورودی ها و خروجی های مورد انتظار آن
    • شرایط (یا گزینه های) برای اجرای آن

    به‌علاوه، به کاربران هشدار دهید که در عملکرد قلاب هیچ گونه عملی را انجام ندهند که ممکن است همان پسوند را ایجاد کند و در نتیجه یک حلقه بی‌نهایت ایجاد شود.

مثال

افزونه جستجوی Algolia یک قلاب همزمان برای فراخوانی یک تابع تبدیل ارائه شده توسط کاربر قبل از نوشتن در Algolia فراهم می کند.