নেটিভ মেসেজিং

এক্সটেনশনগুলি অন্যান্য মেসেজ পাসিং API-এর মতো একটি API ব্যবহার করে নেটিভ অ্যাপ্লিকেশনগুলির সাথে বার্তা বিনিময় করতে পারে। এই বৈশিষ্ট্যটি সমর্থন করে এমন নেটিভ অ্যাপ্লিকেশনগুলিকে একটি নেটিভ মেসেজিং হোস্ট নিবন্ধন করতে হবে যা এক্সটেনশনের সাথে যোগাযোগ করতে পারে। 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
নেটিভ মেসেজিং হোস্ট বাইনারিতে যাওয়ার পথ। লিনাক্স এবং ম্যাকোসে পাথটি অবশ্যই অ্যাবসোলিউট হতে হবে। উইন্ডোজে এটি ম্যানিফেস্ট ফাইল ধারণকারী ডিরেক্টরির সাথে সম্পর্কিত হতে পারে। হোস্ট প্রক্রিয়াটি হোস্ট বাইনারি ধারণকারী ডিরেক্টরিতে সেট করা বর্তমান ডিরেক্টরি দিয়ে শুরু হয়। উদাহরণস্বরূপ, যদি এই প্যারামিটারটি C:\Application\nm_host.exe তে সেট করা থাকে তবে এটি বর্তমান ডিরেক্টরি `C:\Application` দিয়ে শুরু হবে।
type
নেটিভ মেসেজিং হোস্টের সাথে যোগাযোগের জন্য ব্যবহৃত ইন্টারফেসের ধরণ। এই প্যারামিটারের একটি সম্ভাব্য মান রয়েছে: stdio । এটি নির্দেশ করে যে হোস্টের সাথে যোগাযোগের জন্য Chrome-এর stdin এবং stdout ব্যবহার করা উচিত।
allowed_origins
নেটিভ মেসেজিং হোস্টে অ্যাক্সেস থাকা উচিত এমন এক্সটেনশনের তালিকা। allowed-origins মানগুলিতে ওয়াইল্ডকার্ড থাকতে পারে না

নেটিভ মেসেজিং হোস্ট লোকেশন

ম্যানিফেস্ট ফাইলের অবস্থান প্ল্যাটফর্মের উপর নির্ভর করে।

উইন্ডোজে , ম্যানিফেস্ট ফাইলটি ফাইল সিস্টেমের যেকোনো জায়গায় অবস্থিত হতে পারে। অ্যাপ্লিকেশন ইনস্টলারকে অবশ্যই একটি রেজিস্ট্রি কী তৈরি করতে হবে, হয় 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- এ, নেটিভ মেসেজিং হোস্টের ম্যানিফেস্ট ফাইলের অবস্থান ব্রাউজার (গুগল ক্রোম বা ক্রোমিয়াম) অনুসারে পরিবর্তিত হয়। সিস্টেম-ওয়াইড নেটিভ মেসেজিং হোস্টগুলি একটি নির্দিষ্ট স্থানে অনুসন্ধান করা হয়, যখন ব্যবহারকারী-স্তরের নেটিভ মেসেজিং হোস্টগুলি ব্যবহারকারী প্রোফাইল ডিরেক্টরির NativeMessagingHosts/ সাবডিরেক্টরিতে অনুসন্ধান করা হয়।

macOS (সিস্টেম-ব্যাপী)
গুগল ক্রোম: /Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json ক্রোম/নেটিভমেসেজিংহোস্টস/com.my_company.my_application.json
ক্রোমিয়াম: /Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
macOS (ব্যবহারকারী-নির্দিষ্ট, ডিফল্ট পথ)
গুগল ক্রোম: ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
ক্রোমিয়াম: ~/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
লিনাক্স (সিস্টেম-ব্যাপী)
গুগল ক্রোম: /etc/opt/chrome/native-messaging-hosts/com.my_company.my_application.json
ক্রোমিয়াম: /etc/chromium/native-messaging-hosts/com.my_company.my_application.json
লিনাক্স (ব্যবহারকারী-নির্দিষ্ট, ডিফল্ট পথ)
গুগল ক্রোম: ~/.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 MB, মূলত নেটিভ অ্যাপ্লিকেশনগুলিকে ভুল আচরণ করা থেকে Chrome কে রক্ষা করার জন্য। নেটিভ মেসেজিং হোস্টে পাঠানো বার্তার সর্বোচ্চ আকার 64 MiB।

নেটিভ মেসেজিং হোস্টের প্রথম যুক্তি হল কলারের উৎপত্তি, সাধারণত chrome-extension://[ID of allowed extension] । এটি নেটিভ মেসেজিং হোস্টকে বার্তার উৎস সনাক্ত করতে দেয় যখন নেটিভ মেসেজিং হোস্ট ম্যানিফেস্টে allowed_origins কীতে একাধিক এক্সটেনশন নির্দিষ্ট করা থাকে।

উইন্ডোজে, নেটিভ মেসেজিং হোস্টকে একটি কমান্ড লাইন আর্গুমেন্টও পাঠানো হয় যার মাধ্যমে একটি হ্যান্ডেল Chrome নেটিভ উইন্ডোতে পাঠানো হয়: --parent-window=<decimal handle value> । এটি নেটিভ মেসেজিং হোস্টকে এমন নেটিভ UI উইন্ডো তৈরি করতে দেয় যা সঠিকভাবে প্যারেন্ট করা হয়েছে। মনে রাখবেন যে কলিং প্রসঙ্গটি যদি কোনও পরিষেবা কর্মী হয় তবে এই মান 0 হবে।

যখন runtime.connectNative() ব্যবহার করে একটি মেসেজিং পোর্ট তৈরি করা হয়, তখন Chrome নেটিভ মেসেজিং হোস্ট প্রক্রিয়া শুরু করে এবং পোর্টটি ধ্বংস না হওয়া পর্যন্ত এটি চালু রাখে। অন্যদিকে, যখন runtime.sendNativeMessage() ব্যবহার করে একটি মেসেজ পাঠানো হয়, তখন কোনও মেসেজিং পোর্ট তৈরি না করেই, Chrome প্রতিটি মেসেজের জন্য একটি নতুন নেটিভ মেসেজিং হোস্ট প্রক্রিয়া শুরু করে। সেক্ষেত্রে হোস্ট প্রক্রিয়া দ্বারা তৈরি প্রথম মেসেজটি মূল অনুরোধের প্রতিক্রিয়া হিসাবে পরিচালিত হয় এবং runtime.sendNativeMessage() কল করার সময় Chrome এটি নির্দিষ্ট প্রতিক্রিয়া কলব্যাকে প্রেরণ করবে। সেই ক্ষেত্রে নেটিভ মেসেজিং হোস্ট দ্বারা তৈরি অন্যান্য সমস্ত মেসেজ উপেক্ষা করা হয়।

একটি নেটিভ অ্যাপ্লিকেশনের সাথে সংযোগ স্থাপন করা হচ্ছে

একটি নেটিভ অ্যাপ্লিকেশনে বার্তা পাঠানো এবং গ্রহণ করা ক্রস-এক্সটেনশন মেসেজিংয়ের মতোই। প্রধান পার্থক্য হল runtime.connectNative() এর পরিবর্তে runtime.connect() ব্যবহার করা হয় এবং runtime.sendNativeMessage() এর পরিবর্তে runtime.sendMessage() ব্যবহার করা হয়।

এই পদ্ধতিগুলি ব্যবহার করার জন্য, আপনার এক্সটেনশনের ম্যানিফেস্ট ফাইলে "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 উল্লেখিত ফাইলটি কি বিদ্যমান? উইন্ডোজে, পাথগুলি আপেক্ষিক হতে পারে, কিন্তু ম্যাকওএস এবং লিনাক্সে, পাথগুলি অবশ্যই পরম হতে হবে।

নেটিভ মেসেজিং হোস্ট হোস্টের নাম নিবন্ধিত নয়। (শুধুমাত্র উইন্ডোজ)

উইন্ডোজ রেজিস্ট্রিতে নেটিভ মেসেজিং হোস্টটি পাওয়া যায়নি। regedit ব্যবহার করে দুবার পরীক্ষা করুন যে কীটি আসলেই তৈরি করা হয়েছে কিনা এবং নেটিভ মেসেজিং হোস্ট লোকেশনে নথিভুক্ত প্রয়োজনীয় ফর্ম্যাটের সাথে মেলে কিনা।

নির্দিষ্ট নেটিভ মেসেজিং হোস্টে অ্যাক্সেস নিষিদ্ধ।

এক্সটেনশনের উৎস কি allowed_origins এ তালিকাভুক্ত?

নেটিভ মেসেজিং হোস্টের সাথে যোগাযোগ করার সময় ত্রুটি।

এটি নেটিভ মেসেজিং হোস্টে যোগাযোগ প্রোটোকলের ভুল বাস্তবায়ন নির্দেশ করে।

  • নিশ্চিত করুন যে stdout এর সমস্ত আউটপুট নেটিভ মেসেজিং প্রোটোকল মেনে চলে। যদি আপনি ডিবাগিংয়ের জন্য কিছু ডেটা প্রিন্ট করতে চান, তাহলে stderr এ লিখুন।
  • নিশ্চিত করুন যে 32-বিট বার্তার দৈর্ঘ্য প্ল্যাটফর্মের নেটিভ পূর্ণসংখ্যা বিন্যাসে (লিটল-এন্ডিয়ান / বিগ-এন্ডিয়ান) আছে।
  • বার্তার দৈর্ঘ্য ১০২৪*১০২৪ এর বেশি হওয়া উচিত নয়।
  • বার্তার আকার বার্তার বাইটের সংখ্যার সমান হতে হবে। এটি একটি স্ট্রিংয়ের "দৈর্ঘ্য" থেকে আলাদা হতে পারে, কারণ অক্ষরগুলি একাধিক বাইট দ্বারা প্রতিনিধিত্ব করা যেতে পারে।
  • শুধুমাত্র উইন্ডোজ-এর জন্য: নিশ্চিত করুন যে প্রোগ্রামের I/O মোড O_BINARY তে সেট করা আছে। ডিফল্টরূপে, I/O মোড হল O_TEXT , যা লাইন ব্রেক ( \n = 0A ) উইন্ডোজ-স্টাইল লাইন এন্ডিং ( \r\n = 0D 0A ) দিয়ে প্রতিস্থাপন করা হলে বার্তা ফর্ম্যাটকে দূষিত করে। I/O মোড __setmode ব্যবহার করে সেট করা যেতে পারে।