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