คุณสามารถอนุญาตให้ผู้ใช้ที่ติดตั้งส่วนขยาย แทรกของตัวเองได้ ตรรกะที่กำหนดเองในการดำเนินการส่วนขยายของคุณ คุณทำสิ่งต่อไปนี้ได้ 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 หลังจากปรับขนาดรูปภาพ
ฮุกแบบซิงโครนัส
เมื่อคุณต้องการให้ผู้ใช้มีฮุกที่ต้องทำให้สำเร็จ ใช้ฮุกแบบซิงโครนัสเพื่อให้ฟังก์ชันส่วนขยายตัวใดตัวหนึ่งทำงาน
ฮุกแบบซิงโครนัสเรียก HTTPS แบบ Callable 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 มีฮุกแบบซิงโครนัสเพื่อเรียกใช้ฟังก์ชันการแปลงที่ผู้ใช้ระบุ ก่อนจะเขียนไปที่ Algolia