नेटिव मैसेज की सुविधा

एक्सटेंशन, एक ऐसे एपीआई का इस्तेमाल करके नेटिव ऐप्लिकेशन के साथ मैसेज एक्सचेंज कर सकते हैं जो दूसरे मैसेज पास करने वाले एपीआई की तरह है. इस सुविधा के साथ काम करने वाले नेटिव ऐप्लिकेशन को, ऐसा नेटिव मैसेजिंग होस्ट रजिस्टर करना होगा जो एक्सटेंशन से संपर्क कर सके. Chrome एक अलग प्रोसेस में, होस्ट शुरू करता है और स्टैंडर्ड इनपुट और स्टैंडर्ड आउटपुट स्ट्रीम का इस्तेमाल करके, होस्ट से संपर्क करता है.

नेटिव मैसेजिंग होस्ट

नेटिव मैसेजिंग होस्ट को रजिस्टर करने के लिए, ऐप्लिकेशन को ऐसी फ़ाइल सेव करनी होगी जो नेटिव मैसेजिंग होस्ट कॉन्फ़िगरेशन की जानकारी देती हो.

फ़ाइल का उदाहरण यहां दिया गया है:

{
  "name": "com.my_company.my_application",
  "description": "My Application",
  "path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
  "type": "stdio",
  "allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}

नेटिव मैसेजिंग होस्ट मेनिफ़ेस्ट फ़ाइल, मान्य JSON होनी चाहिए. साथ ही, उसमें ये फ़ील्ड शामिल होने चाहिए:

name
नेटिव मैसेजिंग होस्ट का नाम. क्लाइंट इस स्ट्रिंग को runtime.connectNative() या runtime.sendNativeMessage() को पास करते हैं. इस नाम में सिर्फ़ अंग्रेज़ी के छोटे अक्षर, अंडरस्कोर, और बिंदु हो सकते हैं. नाम, बिंदु से शुरू या खत्म नहीं हो सकता. साथ ही, बिंदु के बाद दूसरा बिंदु नहीं हो सकता.
description
ऐप्लिकेशन के बारे में कम शब्दों में जानकारी.
path
नेटिव मैसेजिंग होस्ट बाइनरी का पाथ. Linux और macOS पर पाथ का पूरा होना ज़रूरी है. Windows पर, यह मेनिफ़ेस्ट फ़ाइल वाली डायरेक्ट्री के हिसाब से हो सकता है. होस्ट करने की प्रोसेस तब शुरू होती है, जब मौजूदा डायरेक्ट्री उस डायरेक्ट्री पर सेट की गई हो जिसमें होस्ट बाइनरी है. उदाहरण के लिए, अगर इस पैरामीटर को C:\Application\nm_host.exe पर सेट किया जाता है, तो इसे मौजूदा डायरेक्ट्री `C:\Application` से शुरू किया जाएगा.
type
नेटिव मैसेजिंग होस्ट के साथ कम्यूनिकेट करने के लिए इस्तेमाल किए जाने वाले इंटरफ़ेस का टाइप. इस पैरामीटर की एक संभावित वैल्यू हो सकती है: stdio. यह बताता है कि Chrome को stdin और stdout का इस्तेमाल करके, होस्ट से संपर्क करना चाहिए.
allowed_origins
उन एक्सटेंशन की सूची जिनके पास नेटिव मैसेजिंग होस्ट का ऐक्सेस होना चाहिए. allowed-origins वैल्यू में वाइल्डकार्ड नहीं हो सकते.

नेटिव मैसेजिंग होस्ट की जगह

मेनिफ़ेस्ट फ़ाइल की जगह, प्लैटफ़ॉर्म के हिसाब से तय होती है.

Windows पर, मेनिफ़ेस्ट फ़ाइल फ़ाइल सिस्टम में कहीं भी मौजूद हो सकती है. ऐप्लिकेशन इंस्टॉलर को HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application या HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application में से किसी एक रजिस्ट्री कुंजी को बनाना होगा और मेनिफ़ेस्ट फ़ाइल के पूरे पाथ पर उस कुंजी की डिफ़ॉल्ट वैल्यू सेट करनी होगी. उदाहरण के लिए, इस निर्देश का इस्तेमाल करके:

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application" /ve /t REG_SZ /d "C:\path\to\nmh-manifest.json" /f

या इस .reg फ़ाइल का इस्तेमाल करके:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application]
@="C:\\path\\to\\nmh-manifest.json"

जब Chrome नेटिव मैसेजिंग होस्ट खोजता है, तो सबसे पहले 32-बिट रजिस्ट्री से क्वेरी की जाती है. इसके बाद, 64-बिट रजिस्ट्री से क्वेरी की जाती है.

macOS और Linux पर, नेटिव मैसेजिंग होस्ट की मेनिफ़ेस्ट फ़ाइल की जगह, ब्राउज़र (Google Chrome या Chromium) के हिसाब से अलग-अलग होती है. पूरे सिस्टम के नेटिव मैसेजिंग होस्ट, एक तय जगह पर देखे जाते हैं. वहीं, उपयोगकर्ता-लेवल के नेटिव मैसेजिंग होस्ट, उपयोगकर्ता प्रोफ़ाइल डायरेक्ट्री की NativeMessagingHosts/ सबडायरेक्ट्री में खोजे जाते हैं.

macOS (पूरे सिस्टम में)
Google Chrome: /Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
Chromium: /Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
macOS (खास उपयोगकर्ता के लिए, डिफ़ॉल्ट पाथ)
Google Chrome: ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
Chromium: ~/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
Linux (पूरे सिस्टम के लिए)
Google Chrome: /etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json
Chromium: /etc/chromium/native-messaging-hosts/com.my_company.my_application.json
Linux (उपयोगकर्ता के लिए खास तौर पर, डिफ़ॉल्ट पाथ)
Google Chrome: ~/.config/google-chrome/NativeMessagingHosts/com.my_company.my_application.json
Chromium: ~/.config/chromium/NativeMessagingHosts/com.my_company.my_application.json

नेटिव मैसेजिंग प्रोटोकॉल

Chrome, हर नेटिव मैसेजिंग होस्ट को एक अलग प्रोसेस से शुरू करता है और स्टैंडर्ड इनपुट (stdin) और स्टैंडर्ड आउटपुट (stdout) का इस्तेमाल करके, मैसेज भेजने के लिए, एक ही फ़ॉर्मैट का इस्तेमाल करता है. हर मैसेज को JSON और UTF-8 कोड में बदलकर, क्रम से लगाया जाता है. मैसेज की लंबाई 32-बिट के क्रम में होती है. नेटिव मैसेजिंग होस्ट की तरफ़ से किसी एक मैसेज का ज़्यादा से ज़्यादा साइज़ 1 एमबी होता है, ताकि Chrome को नेटिव ऐप्लिकेशन के साथ ठीक तरह से काम करने से रोका जा सके. नेटिव मैसेजिंग होस्ट को भेजे गए मैसेज का साइज़, ज़्यादा से ज़्यादा 4 जीबी हो सकता है.

नेटिव मैसेजिंग होस्ट का पहला आर्ग्युमेंट, कॉल करने वाला (कॉलर) का ऑरिजिन होता है. आम तौर पर, chrome-extension://[ID of allowed extension]. जब नेटिव मैसेजिंग होस्ट मेनिफ़ेस्ट की allowed_origins कुंजी में एक से ज़्यादा एक्सटेंशन तय किए जाते हैं, तो नेटिव मैसेजिंग होस्ट, मैसेज के सोर्स की पहचान कर सकते हैं.

Windows पर, नेटिव मैसेजिंग होस्ट को कमांड लाइन आर्ग्युमेंट पास किया जाता है. साथ ही, हैंडल के साथ Chrome की नेटिव विंडो को कॉल भी किया जाता है: --parent-window=<decimal handle value>. इससे नेटिव मैसेजिंग होस्ट को नेटिव यूज़र इंटरफ़ेस (यूआई) विंडो बनाने में मदद मिलती है. इन विंडो को सही तरीके से पैरंट किया जाता है. ध्यान दें कि अगर कॉल कॉन्टेक्स्ट कोई सर्विस वर्कर है, तो यह वैल्यू 0 होगी.

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

किसी स्थानीय ऐप्लिकेशन से कनेक्ट करना

किसी नेटिव ऐप्लिकेशन से मैसेज भेजना और पाना, क्रॉस-एक्सटेंशन मैसेज भेजने जैसा ही है. मुख्य अंतर यह है कि runtime.connect() की जगह runtime.connectNative() का इस्तेमाल किया जाता है और runtime.sendMessage() की जगह runtime.sendNativeMessage() का इस्तेमाल किया जाता है.

इन तरीकों का इस्तेमाल करने के लिए, आपके एक्सटेंशन की मेनिफ़ेस्ट फ़ाइल में "NATIVEMessaging" अनुमति दिखनी ज़रूरी है.

ये तरीके, सिर्फ़ आपके एक्सटेंशन के पेजों और सर्विस वर्कर में, कॉन्टेंट स्क्रिप्ट में उपलब्ध नहीं हैं. अगर आपको किसी कॉन्टेंट स्क्रिप्ट से नेटिव ऐप्लिकेशन पर मैसेज भेजना है, तो अपने सर्विस वर्कर को मैसेज भेजें, ताकि वह नेटिव ऐप्लिकेशन को पास हो जाए.

यहां दिए गए उदाहरण में, runtime.Port ऑब्जेक्ट बनाया गया है, जो नेटिव मैसेजिंग होस्ट com.my_company.my_application से जुड़ा है. साथ ही, इस पोर्ट से मैसेज सुनना शुरू करता है और एक आउटगोइंग मैसेज भेजता है:

var port = chrome.runtime.connectNative('com.my_company.my_application');
port.onMessage.addListener(function (msg) {
  console.log('Received' + msg);
});
port.onDisconnect.addListener(function () {
  console.log('Disconnected');
});
port.postMessage({text: 'Hello, my_application'});

पोर्ट बनाए बिना नेटिव ऐप्लिकेशन पर मैसेज भेजने के लिए runtime.sendNativeMessage का इस्तेमाल करें, उदाहरण:

chrome.runtime.sendNativeMessage(
  'com.my_company.my_application',
  {text: 'Hello'},
  function (response) {
    console.log('Received ' + response);
  }
);

नेटिव मैसेजिंग को डीबग करें

जब कुछ नेटिव मैसेजिंग काम नहीं करते हैं, तो आउटपुट Chrome के गड़बड़ी लॉग में लिखा जाता है. इसमें नेटिव मैसेजिंग होस्ट के शुरू न होने, stderr को लिखने या कम्यूनिकेशन प्रोटोकॉल का उल्लंघन करने जैसी गतिविधियां शामिल हैं. Linux और macOS पर, इस लॉग को कमांड लाइन से Chrome को शुरू करने के बाद, टर्मिनल में इसके आउटपुट को देखते हुए ऐक्सेस किया जा सकता है. Windows पर, लॉगिन करने की सुविधा चालू करने का तरीका में बताए गए तरीके से --enable-logging का इस्तेमाल करें.

यहां कुछ सामान्य गड़बड़ियां और उन्हें हल करने के लिए सलाह दी गई है:

नेटिव मैसेजिंग होस्ट शुरू नहीं किया जा सका.

देखें कि आपके पास नेटिव मैसेजिंग होस्ट फ़ाइल को एक्ज़ीक्यूट करने के लिए, ज़रूरी अनुमतियां हैं या नहीं.

अमान्य नेटिव मैसेजिंग होस्ट नाम के बारे में बताया गया है.

जांच लें कि नाम में अमान्य वर्ण हैं या नहीं. सिर्फ़ अंग्रेज़ी के छोटे अक्षरों, अंडरस्कोर, और बिंदुओं का इस्तेमाल किया जा सकता है. नाम, बिंदु से शुरू या खत्म नहीं हो सकता. साथ ही, डॉट के बाद दूसरे बिंदु नहीं आ सकते.

नेटिव होस्ट अब आगे निकल गया है.

Chrome के मैसेज को पढ़े जाने से पहले ही, नेटिव मैसेजिंग होस्ट का पाइप टूट गया था. ऐसा अक्सर आपके नेटिव मैसेजिंग होस्ट ने किया हो.

तय किया गया नेटिव मैसेजिंग होस्ट नहीं मिला.

नीचे दी गई बातों पर ध्यान दें:

  • क्या एक्सटेंशन और मेनिफ़ेस्ट फ़ाइल में नाम की स्पेलिंग सही है?
  • क्या मेनिफ़ेस्ट सही डायरेक्ट्री में है और उसका नाम सही है? सही फ़ॉर्मैट के लिए, नेटिव मैसेजिंग होस्ट की जगह की जानकारी देखें.
  • क्या मेनिफ़ेस्ट फ़ाइल का फ़ॉर्मैट सही है? खास तौर पर, क्या JSON मान्य और सही तरीके से बनाया गया है और क्या उसके मान नेटिव मैसेजिंग होस्ट मेनिफ़ेस्ट की परिभाषा से मेल खाते हैं?
  • क्या path में दी गई फ़ाइल मौजूद है? Windows पर, पाथ मिलते-जुलते हो सकते हैं, लेकिन macOS और Linux पर, पाथ सटीक होने चाहिए.

नेटिव मैसेजिंग होस्ट के होस्ट का नाम रजिस्टर नहीं है. (सिर्फ़ Windows के लिए)

Windows रजिस्ट्री में नेटिव मैसेजिंग होस्ट नहीं मिला. regedit का इस्तेमाल करके दोबारा जांच करें कि क्या कुंजी वाकई बनाई गई थी. यह नेटिव मैसेजिंग होस्ट की जगह पर दिए गए ज़रूरी फ़ॉर्मैट से मेल खाती है.

किसी खास नेटिव मैसेजिंग होस्ट को ऐक्सेस करने की अनुमति नहीं है.

क्या एक्सटेंशन का ऑरिजिन allowed_origins में दिया गया है?

नेटिव मैसेजिंग होस्ट से कम्यूनिकेट करते समय गड़बड़ी होना.

इससे पता चलता है कि नेटिव मैसेजिंग होस्ट पर, कम्यूनिकेशन प्रोटोकॉल गलत तरीके से लागू किया गया है.

  • पक्का करें कि stdout में सभी आउटपुट नेटिव मैसेजिंग प्रोटोकॉल का पालन करते हों. अगर आपको डीबग करने के लिए कुछ डेटा प्रिंट करना है, तो stderr पर लिखें.
  • पक्का करें कि 32-बिट मैसेज की लंबाई, प्लैटफ़ॉर्म के नेटिव पूर्णांक के फ़ॉर्मैट (little-endian /big-endian) में हो.
  • मैसेज में 1024*1024 से ज़्यादा वर्ण नहीं होने चाहिए.
  • मैसेज का साइज़, मैसेज में मौजूद बाइट की संख्या के बराबर होना चाहिए. यह स्ट्रिंग की "लंबाई" से अलग हो सकता है, क्योंकि वर्णों को एक से ज़्यादा बाइट से दिखाया जा सकता है.
  • सिर्फ़ Windows के लिए: पक्का करें कि प्रोग्राम का I/O मोड O_BINARY पर सेट हो. डिफ़ॉल्ट रूप से, I/O मोड O_TEXT है, जो मैसेज फ़ॉर्मैट को खराब कर देता है, क्योंकि लाइन ब्रेक (\n = 0A) को लाइन ब्रेक (\n = 0A) से बदल दिया जाता है. इसे Windows स्टाइल के लाइन के आखिरी हिस्सों (\r\n = 0D 0A) से बदल दिया जाता है. __setmode का इस्तेमाल करके, I/O मोड सेट किया जा सकता है.