คุณสามารถให้ผู้ใช้ที่ติดตั้งส่วนขยายของคุณสามารถแทรกตรรกะที่กำหนดเองของตนเองลงในการดำเนินการส่วนขยายของคุณได้ มีสองวิธีในการบรรลุเป้าหมายนี้:
กิจกรรม Eventarc : เพื่อให้ผู้ใช้สามารถตอบสนองต่อเหตุการณ์แบบอะซิงโครนัส คุณสามารถเผยแพร่ไปยัง Eventarc ได้ ผู้ใช้สามารถปรับใช้ฟังก์ชันตัวจัดการเหตุการณ์ได้ เช่น ส่งการแจ้งเตือนหลังจากงานที่ใช้เวลานานเสร็จสิ้น หรือสามารถกำหนดฟังก์ชันหลังการประมวลผลของตนเองได้
Hooks แบบซิงโครนัส : เพื่อให้ผู้ใช้สามารถเพิ่มตรรกะการบล็อกให้กับส่วนขยายของคุณ คุณสามารถเพิ่ม hooks แบบซิงโครนัสที่จุดที่กำหนดไว้ล่วงหน้าในการดำเนินการของส่วนขยาย ณ จุดเหล่านี้ คุณจะเรียกใช้ฟังก์ชันผู้ให้บริการผู้ใช้และดำเนินการต่อหลังจากฟังก์ชันดังกล่าวเสร็จสิ้นแล้วเท่านั้น งานก่อนการประมวลผลมักจัดอยู่ในหมวดหมู่นี้
ส่วนขยายสามารถใช้วิธีใดวิธีหนึ่งหรือทั้งสองวิธีก็ได้
งานกิจกรรม Eventarc
หากต้องการเผยแพร่กิจกรรมจากส่วนขยาย:
ประกาศประเภทเหตุการณ์ที่คุณจะเผยแพร่ในไฟล์
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.
ผู้ใช้จะสามารถเลือกกิจกรรมที่จะสมัครรับข้อมูลได้เมื่อติดตั้งส่วนขยาย
ในฟังก์ชันส่วนขยายของคุณ ให้นำเข้า Eventarc API จาก Admin SDK และเริ่มต้นช่องทางเหตุการณ์โดยใช้การตั้งค่าการติดตั้งของผู้ใช้ การตั้งค่าเหล่านี้แสดงโดยใช้ตัวแปรสภาพแวดล้อมต่อไปนี้:
-
EVENTARC_CHANNEL
: ชื่อแบบเต็มของช่อง Eventarc ที่ผู้ใช้เลือกที่จะเผยแพร่กิจกรรม -
EXT_SELECTED_EVENTS
: รายการประเภทเหตุการณ์ที่คั่นด้วยเครื่องหมายจุลภาคซึ่งผู้ใช้เลือกที่จะเผยแพร่ เมื่อคุณเริ่มต้นช่องด้วยค่านี้ Admin 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, });
-
เผยแพร่กิจกรรมไปยังช่อง ณ จุดในส่วนขยายที่คุณต้องการเปิดเผยต่อผู้ใช้ ตัวอย่างเช่น:
// 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: { // ... } });
บันทึกเหตุการณ์ที่คุณเผยแพร่ในไฟล์ 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 หลังจากปรับขนาดรูปภาพ
ตะขอแบบซิงโครนัส
เมื่อคุณต้องการจัดเตรียม hook ให้กับผู้ใช้ที่ต้องดำเนินการให้เสร็จสิ้นเพื่อให้ฟังก์ชันส่วนขยายรายการใดรายการหนึ่งของคุณทำงานได้ ให้ใช้ hooks แบบซิงโครนัส
ฮุกแบบซิงโครนัสเรียก ใช้ฟังก์ชันคลาวด์ที่เรียกได้ HTTPS ที่ ผู้ใช้กำหนดและรอการดำเนินการให้เสร็จสิ้น (อาจมีค่าที่ส่งคืน) ก่อนดำเนินการต่อ ข้อผิดพลาดในฟังก์ชันที่ผู้ใช้ระบุส่งผลให้เกิดข้อผิดพลาดในฟังก์ชันส่วนขยาย
หากต้องการเปิดเผยฮุกแบบซิงโครนัส:
เพิ่มพารามิเตอร์ลงในส่วนขยายของคุณเพื่อให้ผู้ใช้สามารถกำหนดค่าส่วนขยายด้วย 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
ณ จุดในส่วนขยายของคุณที่คุณต้องการเปิดเผย hook ให้เรียกใช้ฟังก์ชันโดยใช้ 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. // ... });
บันทึก hooks ใด ๆ ที่คุณจัดให้มีไว้ในไฟล์ PREINSTALL หรือ POSTINSTALL
สำหรับตะขอแต่ละอัน ให้จัดทำเอกสารดังต่อไปนี้:
- วัตถุประสงค์ที่ตั้งใจไว้
- จุดที่ตรรกะของส่วนขยายของคุณทำงาน
- อินพุตและเอาต์พุตที่คาดหวัง
- เงื่อนไข (หรือตัวเลือก) สำหรับการดำเนินการ
นอกจากนี้ เตือนผู้ใช้อย่าดำเนินการใดๆ ในฟังก์ชัน hook ที่อาจทริกเกอร์ส่วนขยายเดียวกัน ซึ่งส่งผลให้เกิดการวนซ้ำไม่สิ้นสุด
ตัวอย่าง
ส่วนขยาย Algolia Search จัดเตรียมเบ็ดแบบซิงโครนัสเพื่อ เรียกใช้ฟังก์ชันการแปลงที่ผู้ใช้ระบุ ก่อนที่จะเขียนถึง Algolia