إضافة عناصر الجذب للمستخدمين إلى إضافة

يمكنك منح المستخدمين الذين يثبّتون إضافتك إمكانية إدراج منطق مخصّص خاص بهم في عملية تنفيذ إضافتك. هناك طريقتان لتحقيق ذلك:

  • أحداث Eventarc: لمنح المستخدمين طريقة للتفاعل بشكل غير متزامن مع الأحداث، يمكنك النشر على 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: قائمة مفصولة بفواصل لأنواع الأحداث التي اختار المستخدم نشرها. عند تهيئة قناة بهذه القيمة، ستعمل حزمة تطوير البرامج (SDK) للمشرف تلقائيًا على فلترة الأحداث التي لم يحدّدها المستخدم.
    • EVENTARC_CLOUD_EVENT_SOURCE: معرّف مصدر Cloud Event. تنقل حزمة تطوير البرامج (SDK) الخاصة بخدمة Admin هذه القيمة تلقائيًا في الحقل 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.firebasestorage.app")
          .file(event.subject)
          .delete();
    });

اطّلِع على عوامل تشغيل الأحداث المخصّصة لمزيد من المعلومات.

مثال

توفّر إضافة Resize Images الرسمية خطافًا غير متزامن من خلال النشر إلى Eventarc بعد تغيير حجم الصورة.

عبارات الربط المتزامنة

عندما تريد تزويد المستخدمين بخطاف يجب أن يكتمل بنجاح لكي تعمل إحدى وظائف الإضافة، استخدِم خطافات متزامنة.

يستدعي الخطاف المتزامن دالة Cloud قابلة للاستدعاء عبر HTTPS يحدّدها المستخدم وينتظر اكتمالها (ربما مع قيمة معروضة) قبل المتابعة. يؤدي حدوث خطأ في الدالة التي يقدّمها المستخدم إلى حدوث خطأ في دالة الإضافة.

لعرض خطاف متزامن، اتّبِع الخطوات التالية:

  1. أضِف مَعلمة إلى الإضافة تسمح للمستخدمين بضبط الإضافة باستخدام عنوان URL الخاص بـ Cloud Function المخصّصة. على سبيل المثال:

    - 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 Search خطافًا متزامنًا لاستدعاء دالة تحويل يوفّرها المستخدم قبل الكتابة إلى Algolia.