किसी एक्सटेंशन में उपयोगकर्ता हुक जोड़ें

आपका एक्सटेंशन इंस्टॉल करने वाले उपयोगकर्ताओं को, अपना एक्सटेंशन डालने की सुविधा दी जा सकती है कस्टम लॉजिक लगा सकते हैं. इसके दो तरीके हैं इसे पूरा करें:

  • Eventarc इवेंट: इसकी मदद से, उपयोगकर्ताओं को एसिंक्रोनस तरीके से प्रतिक्रिया देने का तरीका बताया जाता है की सुविधा वाले इवेंट, Eventarc पर पब्लिश किए जा सकते हैं. उपयोगकर्ता इवेंट हैंडलर डिप्लॉय कर सकते हैं उदाहरण के लिए, ऐसे फ़ंक्शन जो लंबे समय तक चलने के बाद सूचनाएं भेजते हैं टास्क पूरे हो चुके हैं या वे अपने पोस्ट-प्रोसेसिंग फ़ंक्शन तय कर सकते हैं.

  • सिंक्रोनस हुक: इसकी मदद से, उपयोगकर्ता आपके डिवाइस पर ब्लॉक करने वाला लॉजिक जोड़ सकते हैं एक्सटेंशन, तो आप एक्सटेंशन की कार्रवाई. इन बिंदुओं पर, आप user-provider फ़ंक्शन चलाते हैं पूरा होने के बाद ही आगे बढ़ें. प्रोसेस से पहले के टास्क आम तौर पर यह कैटगरी.

एक्सटेंशन, इनमें से किसी एक या दोनों तरीकों का इस्तेमाल कर सकता है.

इवेंटआर्क इवेंट

किसी एक्सटेंशन के इवेंट पब्लिश करने के लिए:

  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. अपने एक्सटेंशन फ़ंक्शन में, Admin SDK से Eventarc API इंपोर्ट करें और उपयोगकर्ता की इंस्टॉलेशन सेटिंग का इस्तेमाल करके इवेंट चैनल को शुरू करें. ये सेटिंग, यहां दिए गए एनवायरमेंट वैरिएबल का इस्तेमाल करके दिखती हैं:

    • 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 में पब्लिश करके, एसिंक्रोनस हुक इस्तेमाल करता है का साइज़ बदलने के बाद,

सिंक्रोनस हुक

जब आप उपयोगकर्ताओं को ऐसा हुक देना चाहते हों जिसे सही तरीके से पूरा होना चाहिए किसी एक्सटेंशन फ़ंक्शन को चलाने के लिए, सिंक्रोनस हुक का इस्तेमाल करें.

सिंक्रोनस हुक, उपयोगकर्ता के तय किए गए एचटीटीपीएस कॉल किए जा सकने वाले क्लाउड को कॉल करता है फ़ंक्शन को प्रोसेस करता है और पूरा होने का इंतज़ार करता है (संभावित रूप से, जारी रखने से पहले, रिटर्न वैल्यू) जोड़ें. उपयोगकर्ता के उपलब्ध कराए गए फ़ंक्शन में कोई गड़बड़ी हुई एक्सटेंशन फ़ंक्शन में कोई गड़बड़ी दिखाता है.

सिंक्रोनस हुक को दिखाने के लिए:

  1. अपने एक्सटेंशन में ऐसा पैरामीटर जोड़ें जिससे उपयोगकर्ता, एक्सटेंशन मौजूद है. उदाहरण के लिए:

    - 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. अपने एक्सटेंशन में जहां से आप हुक को एक्सपोज़ करना चाहते हैं, वहां फ़ंक्शन को एक्ज़ीक्यूट करने की ज़रूरत नहीं है. उदाहरण के लिए:

    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 पर लिखा होगा.