เพิ่มฮุกผู้ใช้ลงในส่วนขยาย

คุณอนุญาตให้ผู้ใช้ที่ติดตั้งส่วนขยายแทรกตรรกะที่กำหนดเองของตนไว้ในการเรียกใช้ส่วนขยายได้ ทำได้ 2 วิธีดังนี้

  • เหตุการณ์ Eventarc: คุณเผยแพร่ไปยัง Eventarc เพื่อให้ผู้ใช้แสดงความรู้สึกต่อเหตุการณ์แบบไม่พร้อมกันได้ ผู้ใช้สามารถทำให้ตัวแฮนเดิลเหตุการณ์ใช้งานได้ เช่น ส่งการแจ้งเตือนหลังจากงานที่ใช้เวลานานเสร็จสิ้น หรือจะกำหนดฟังก์ชันหลังการประมวลผลของตนเองก็ได้

  • ฮุกแบบซิงโครนัส: เพื่อให้ผู้ใช้สามารถเพิ่มตรรกะการบล็อกลงในส่วนขยายของคุณได้ คุณสามารถเพิ่มฮุกแบบพร้อมกัน ณ จุดที่กำหนดไว้ล่วงหน้าในการทำงานของส่วนขยาย เมื่อถึงจุดนี้ คุณยังเรียกใช้ฟังก์ชันผู้ให้บริการผู้ใช้ และดำเนินการต่อเมื่อฟังก์ชันเสร็จสิ้นเท่านั้น งานก่อนการประมวลผลมักจะจัดอยู่ในหมวดหมู่นี้

ส่วนขยายหนึ่งอาจใช้วิธีใดวิธีหนึ่งหรือทั้ง 2 วิธีก็ได้

งานกิจกรรม 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: ตัวระบุแหล่งที่มาของเหตุการณ์ระบบคลาวด์ 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 หลังจากปรับขนาดรูปภาพ

ฮุกแบบซิงโครนัส

เมื่อคุณต้องการให้ผู้ใช้มีฮุกที่ต้องทำให้ฟังก์ชันของส่วนขยายทำงานเสร็จสมบูรณ์ ให้ใช้ฮุกแบบซิงโครนัส

ฮุกแบบซิงโครนัสจะเรียกใช้ Cloud Function ที่เรียกใช้ได้ของ 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');
    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

    บันทึกข้อมูลต่อไปนี้สำหรับแต่ละฮุก

    • จุดประสงค์ในการใช้งาน
    • จุดในตรรกะของส่วนขยายที่จะทำงาน
    • อินพุตและเอาต์พุตที่คาดไว้
    • เงื่อนไข (หรือตัวเลือก) สำหรับการดำเนินการ

    นอกจากนี้ ให้เตือนผู้ใช้ไม่ให้ดำเนินการใดๆ ในฟังก์ชัน Hook ที่อาจเรียกใช้ส่วนขยายเดียวกัน ซึ่งส่งผลให้เกิดการวนซ้ำที่ไม่สิ้นสุด

ตัวอย่าง

ส่วนขยายการค้นหาของ Algolia มีฮุกแบบซิงโครนัสเพื่อเรียกใช้ฟังก์ชันการแปลงที่ผู้ใช้ระบุก่อนที่จะเขียนไปยัง Algolia