स्थानीय मैसेज सेवा

एक्सटेंशन और ऐप्लिकेशन, एक एपीआई का इस्तेमाल करके नेटिव ऐप्लिकेशन के साथ मैसेज शेयर कर सकते हैं. यह एपीआई, मैसेज पास करने वाले अन्य एपीआई की तरह ही काम करता है. यह सुविधा जिन नेटिव ऐप्लिकेशन पर काम करती है उन्हें ऐसा नेटिव मैसेजिंग होस्ट रजिस्टर करना होगा जिसे एक्सटेंशन से संपर्क करने का तरीका पता हो. 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 और PostgreSQL पर पाथ बिलकुल सटीक होना चाहिए. Windows पर, यह उस डायरेक्ट्री से जुड़ा हो सकता है जिसमें मेनिफ़ेस्ट फ़ाइल मौजूद है. होस्ट करने की प्रोसेस तब शुरू होती है, जब मौजूदा डायरेक्ट्री उस डायरेक्ट्री पर सेट की गई हो जिसमें होस्ट बाइनरी है. उदाहरण के लिए, अगर इस पैरामीटर को C:\Application\nm_host.exe पर सेट किया जाता है, तो यह मौजूदा डायरेक्ट्री C:\Application\ से शुरू हो जाएगा.
typeनेटिव मैसेजिंग होस्ट से संपर्क करने के लिए इस्तेमाल किए जाने वाले इंटरफ़ेस का टाइप. फ़िलहाल, इस पैरामीटर के लिए सिर्फ़ एक वैल्यू दी जा सकती है: stdio. यह बताता है कि Chrome को होस्ट से संपर्क करने के लिए, stdin और stdout का इस्तेमाल करना चाहिए.
allowed_originsउन एक्सटेंशन की सूची जिनके पास नेटिव मैसेजिंग होस्ट का ऐक्सेस होना चाहिए. chrome-extension://*/* जैसे वाइल्डकार्ड की अनुमति नहीं है.

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

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

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-बिट रजिस्ट्री से क्वेरी की जाती है.

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

  • OS X (पूरे सिस्टम पर)
    • Google Chrome: /Library/Google/Chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • क्रोमियम: /Library/Application Support/Chromium/NativeMessagingHosts/_com.my_company.my_application_.json
  • OS X (उपयोगकर्ता के लिए खास तौर पर, डिफ़ॉल्ट पाथ)
    • Google Chrome: ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • क्रोमियम: ~/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
    • क्रोमियम: /etc/chromium/native-messaging-hosts/_com.my_company.my_application_.json
  • Linux (उपयोगकर्ता के लिए, डिफ़ॉल्ट पाथ)
    • Google Chrome: ~/.config/google-chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • क्रोमियम: ~/.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 54 और उससे पहले के वर्शन में, ऑरिजिन को पहले पैरामीटर के बजाय दूसरे पैरामीटर के तौर पर पास किया गया था.

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

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

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

किसी नेटिव ऐप्लिकेशन से मैसेज भेजना और पाना, क्रॉस-एक्सटेंशन मैसेज भेजने जैसा ही है. मुख्य अंतर यह है कि 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);
  });

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

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

यहां समस्याओं को हल करने के लिए कुछ गड़बड़ियां और सुझाव दिए गए हैं:

  • नेटिव मैसेजिंग होस्ट शुरू नहीं किया जा सका.
    • देखें कि आपके पास फ़ाइल चलाने के लिए, ज़रूरी अनुमतियां हैं या नहीं.
  • अमान्य स्थानीय मैसेज सेवा होस्ट नाम दर्ज किया गया.
    • जांच लें कि नाम में कोई अमान्य वर्ण तो नहीं है. सिर्फ़ अंग्रेज़ी के छोटे अक्षर, अंडरस्कोर, और बिंदु इस्तेमाल किए जा सकते हैं. नाम, बिंदु से शुरू या खत्म नहीं हो सकता. साथ ही, डॉट के बाद दूसरे बिंदु नहीं आ सकते.
  • नेटिव होस्ट अब आगे निकल गया है.
    • Chrome के मैसेज को पढ़े जाने से पहले ही, नेटिव मैसेजिंग होस्ट का पाइप टूट गया था. ऐसा अक्सर आपके नेटिव मैसेजिंग होस्ट ने किया हो.
  • बताया गया नेटिव मैसेजिंग होस्ट नहीं मिला.
    • क्या एक्सटेंशन और मेनिफ़ेस्ट फ़ाइल में नाम की स्पेलिंग सही है?
    • क्या मेनिफ़ेस्ट को सही डायरेक्ट्री में रखा गया है और उसका नाम सही है? सही फ़ॉर्मैट के लिए, नेटिव मैसेजिंग होस्ट की जगह की जानकारी देखें.
    • क्या मेनिफ़ेस्ट फ़ाइल का फ़ॉर्मैट सही है? खास तौर पर, क्या JSON सिंटैक्स सही है और क्या वैल्यू नेटिव मैसेजिंग होस्ट मेनिफ़ेस्ट की परिभाषा से मेल खाती हैं?
    • क्या path में दी गई फ़ाइल मौजूद है? Windows पर, पाथ रिलेटिव हो सकते हैं, लेकिन OS X और 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 मोड सेट किया जा सकता है.