ক্রোম এক্সটেনশন মেসেজিং-এর জন্য স্ট্রাকচার্ড ক্লোন আনলক করুন

জাস্টিন লুলেজিয়ান
Justin Lulejian

প্রকাশিত: ১৩ এপ্রিল, ২০২৬

বিভিন্ন এক্সটেনশন কম্পোনেন্টের (ব্যাকগ্রাউন্ড স্ক্রিপ্ট, কন্টেন্ট স্ক্রিপ্ট, পপআপ) মধ্যে যোগাযোগ ঐতিহ্যগতভাবে JSON সিরিয়ালাইজেশনের উপর নির্ভর করে। নির্ভরযোগ্য হলেও, JSON-এর কিছু সীমাবদ্ধতা রয়েছে।

আমরা আনন্দের সাথে জানাচ্ছি যে, ক্রোম ১৪৮ সংস্করণ থেকে এক্সটেনশন ডেভেলপাররা এখন থেকে মেসেজ সিরিয়ালাইজেশনের জন্য JSON-এর পরিবর্তে স্ট্রাকচার্ড ক্লোন অ্যালগরিদম ব্যবহার করার বিকল্প বেছে নিতে পারবেন! এই আধুনিকীকরণের ফলে আপনি ম্যানুয়াল সিরিয়ালাইজেশন পদ্ধতি ছাড়াই আপনার এক্সটেনশন কনটেক্সটগুলোর মধ্যে আরও জটিল ডেটা টাইপ পাঠাতে পারবেন।

স্ট্রাকচার্ড ক্লোন কেন?

JSON সিরিয়ালাইজেশন (অভ্যন্তরীণভাবে JSON.stringify- এর মাধ্যমে) কার্যকরী হলেও, আধুনিক জাভাস্ক্রিপ্ট টাইপ নিয়ে কাজ করার সময় ডেভেলপারদের কখনও কখনও বেশ জটিল প্রক্রিয়ার মধ্য দিয়ে যেতে হয়।

একটি এক্সটেনশন তৈরি করার সময় আপনি হয়তো এই ধরনের একটি নির্দিষ্ট উদাহরণের সম্মুখীন হয়েছেন:

// Sending a Map with JSON serialization
const myMap = new Map([['id', 123]]);

// Arrives as {} on the other side!
chrome.runtime.sendMessage(myMap);

// Workaround: Convert Map to an Array of entries before sending
const message = Array.from(myMap.entries());
chrome.runtime.sendMessage(message);

// On the receiving side:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  const receivedMap = new Map(message);
});

আরও কিছু পরিস্থিতি যেখানে JSON কাজ করে না এবং যার জন্য আপনাকে হয়তো বিকল্প ব্যবস্থা নিতে হয়েছে, সেগুলো হলো Set , BigInt , NaNInfinity , Date এবং Error Objects।

স্ট্রাকচার্ড ক্লোন সিরিয়ালাইজেশন ব্যবহার করার অর্থ হলো, আপনি এখন এমন বিভিন্ন অবজেক্ট পাঠাতে পারবেন যা আগে এক্সটেনশন মেসেজিংয়ের মাধ্যমে প্রেরণ করা কঠিন বা অসম্ভব ছিল। উদাহরণস্বরূপ, একটি Map অবজেক্ট পাঠানো এখন সরাসরি সম্ভব:

// Sending a Map with Structured Clone
const myMap = new Map([['id', 123]]);

// Arrives as a Map on the other side!
chrome.runtime.sendMessage(myMap);

// On the receiving side:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  // message is already a Map instance!
  console.log(message.get('id')); // 123
});

আরও সমর্থিত প্রকার

স্ট্রাকচার্ড ক্লোন File এবং Blob মতো আরও বিভিন্ন ধরনের টাইপ সমর্থন করে।

কীভাবে অপ্ট ইন করবেন

পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যতা নিশ্চিত করতে এবং বিদ্যমান এক্সটেনশনগুলির কার্যকারিতা যাতে ব্যাহত না হয়, সেজন্য এই ফিচারটি ঐচ্ছিক । আপনার manifest.json ফাইলে একটিমাত্র কী (key) যোগ করে আপনি আপনার এক্সটেনশনের জন্য এটি বিশ্বব্যাপী সক্রিয় করতে পারেন:

{
  "name": "My Extension",
  "version": "1.0",
  "manifest_version": 3,
  "message_serialization": "structured_clone"
}

এটি বাদ দেওয়া হলে, অথবা ক্রোম সংস্করণ ১৪৮-এর কম হলে, ব্রাউজারটি এক্সটেনশনটির জন্য তার বর্তমান JSON-ভিত্তিক বাস্তবায়নটি ডিফল্ট হিসেবে ব্যবহার করে।

স্ট্রাকচার্ড ক্লোন অ্যালগরিদম সমর্থন করার মাধ্যমে, আমরা এক্সটেনশন মেসেজিং এপিআই-কে স্ট্যান্ডার্ড ওয়েব প্ল্যাটফর্মের সক্ষমতার (ওয়েব ওয়ার্কার এবং আইফ্রেম কমিউনিকেশনে ব্যবহৃত postMessage এর মতো) আরও কাছাকাছি নিয়ে আসছি, যা আপনাকে আরও বেশি নমনীয়তা এবং ক্ষমতা দেবে।

আন্তঃকার্যক্ষমতা এবং অপ্রত্যাশিত সমস্যা

যদিও আমাদের স্ট্রাকচার্ড ক্লোন সিরিয়ালাইজেশন ইমপ্লিমেন্টেশন JSON-এর চেয়ে অনেক বেশি টাইপ সাপোর্ট করে, তবুও এই ইমপ্লিমেন্টেশনের সাথে কিছু আর্কিটেকচারাল অনুমান এবং অসামঞ্জস্যতা রয়েছে যা আপনার মনে রাখা উচিত।

অসমর্থিত প্রকার

আমাদের ইমপ্লিমেন্টেশনে SharedArrayBuffer মতো শেয়ার্ড অবজেক্ট এবং ArrayBuffer মতো অবজেক্ট স্থানান্তর করা সমর্থিত নয়। SharedArrayBuffer (পরিস্থিতি অনুযায়ী) সিরিয়ালাইজ বা ডিসিরিয়ালাইজ হতে ব্যর্থ হবে, এবং Uint8Array মতো স্থানান্তরযোগ্য অবজেক্ট পাঠানোর চেষ্টা করলে তার পরিবর্তে একটি কপি পাঠানো হবে।

সম্প্রসারণ যোগাযোগের সম্প্রসারণ

ডেটার অখণ্ডতা নিশ্চিত করতে আমরা একই সিরিয়ালাইজেশন ফরম্যাট প্রয়োগ করি। যেসব এক্সটেনশনের সিরিয়ালাইজেশন ফরম্যাট মেলে না, তারা runtime.sendMessage বা runtime.connect এর মাধ্যমে সরাসরি যোগাযোগ করতে পারে না। উদাহরণস্বরূপ, যদি এক্সটেনশন A JSON সিরিয়ালাইজেশন ব্যবহার করে এবং স্ট্রাকচার্ড ক্লোন ব্যবহার করে এক্সটেনশন B-কে মেসেজ পাঠানোর চেষ্টা করে, তাহলে মেসেজটি পাঠানো যাবে না এবং পোর্টটি বন্ধ হয়ে যাবে (এবং এর বিপরীতটিও ঘটবে)।

ওয়েব পেজ যোগাযোগ

externally_connectable ব্যবহারকারী ওয়েব পেজগুলো স্বয়ংক্রিয়ভাবে টার্গেট এক্সটেনশনের সিরিয়ালাইজেশন ফরম্যাটের সাথে খাপ খাইয়ে নেবে। যদি আপনার এক্সটেনশন স্ট্রাকচার্ড ক্লোন ব্যবহার করে, তাহলে runtime এপিআই ব্যবহার করে মেসেজ পাঠানো ওয়েব কনটেক্সটগুলো স্বয়ংক্রিয়ভাবে স্ট্রাকচার্ড ক্লোন ব্যবহার করবে (এবং এর বিপরীতটিও ঘটবে)। এর মানে হলো, সিরিয়ালাইজেশন ত্রুটি এড়াতে ওয়েবসাইট এবং এক্সটেনশনকে তাদের প্রত্যাশিত সিরিয়ালাইজেশন ফরম্যাটের ক্ষেত্রে অবশ্যই সামঞ্জস্যপূর্ণ থাকতে হবে।

স্থানীয় বার্তা

নেটিভ মেসেজিং চ্যানেলগুলো সর্বদা JSON সিরিয়ালাইজেশন বাধ্যতামূলক করে চলেছে। কোনো নেটিভ হোস্টে শুধুমাত্র স্ট্রাকচার্ড-ক্লোন টাইপের (যেমন BigInt ) ডেটা পাঠানোর চেষ্টা করলে, মেসেজটি আপনার এক্সটেনশনের কনটেক্সট থেকে বের হওয়ার আগেই তা ব্যর্থ হবে।

toJSON() পদ্ধতি

আপনি যদি কাস্টম সিরিয়ালাইজেশন করার জন্য (উদাহরণস্বরূপ, কোনো অবজেক্ট পাঠানোর আগে পাসওয়ার্ড মুছে দিয়ে ডেটা স্যানিটাইজ করার জন্য) কাস্টম toJSON() মেথডসহ ক্লাস বা অবজেক্ট ব্যবহার করেন, তবে মনে রাখবেন যে স্ট্রাকচার্ড ক্লোন toJSON() উপেক্ষা করে । এটি সরাসরি প্রপার্টির ভ্যালু কপি করে। আপনি যদি কাস্টম সিরিয়ালাইজেশনের জন্য toJSON() এর উপর নির্ভর করেন, তবে পাঠানোর আগে কিছু ম্যানুয়াল কাজ করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ:

class User {
  constructor(name, password) {
    this.name = name;
    this.password = password;
  }

  // This will be ignored by structured clone!
  toJSON() {
    return { name: this.name };
  }
}

const user = new User("Alice", "secret123");

// JSON -> {"name":"Alice"}
// Structured Clone -> { name: "Alice", password: "secret123" }

JSON সিরিয়ালাইজেশন কি বিলুপ্ত হয়ে যাচ্ছে?

না! ক্রোম অদূর ভবিষ্যতে উভয় সিরিয়ালাইজেশন ফরম্যাটকেই সমর্থন করতে প্রতিশ্রুতিবদ্ধ।

মতামত জানান

আমরা আশা করি, এই নতুন সক্ষমতা আপনার এক্সটেনশন ডেভেলপমেন্টের জন্য আরও মসৃণ ও শক্তিশালী কর্মপ্রবাহ উন্মোচন করবে।

যদিও আমরা আমাদের স্ট্রাকচার্ড ক্লোন ইমপ্লিমেন্টেশনের কার্যকারিতা যাচাই করার জন্য একটি টেস্ট স্যুট তৈরি করেছি, ওয়েব প্ল্যাটফর্মে বিপুল বৈচিত্র্যের অবজেক্ট রয়েছে। এই নতুন ফিচারটি ব্যবহার করে দেখুন এবং আপনার সম্মুখীন হওয়া যেকোনো বাগ বা এজ কেস রিপোর্ট করুন ! আপনার মতামত পুরো কমিউনিটির জন্য ইমপ্লিমেন্টেশনটি উন্নত করতে আমাদের সাহায্য করবে।