ওয়েবের জন্য সঞ্চয়স্থান

ব্রাউজারে ডেটা সংরক্ষণের জন্য বিভিন্ন বিকল্প রয়েছে। আপনার প্রয়োজনের জন্য কোনটি সবচেয়ে ভালো?

চলার পথে ইন্টারনেট সংযোগ দুর্বল বা অনুপস্থিত থাকতে পারে, যে কারণে প্রগ্রেসিভ ওয়েব অ্যাপগুলিতে অফলাইন সাপোর্ট এবং নির্ভরযোগ্য পারফরম্যান্স একটি সাধারণ বৈশিষ্ট্য। এমনকি নিখুঁত ওয়্যারলেস পরিবেশেও, ক্যাশিং এবং অন্যান্য স্টোরেজ কৌশলের বিচক্ষণ ব্যবহার ব্যবহারকারীর অভিজ্ঞতাকে উল্লেখযোগ্যভাবে উন্নত করতে পারে। আপনার স্ট্যাটিক অ্যাপ্লিকেশন রিসোর্স (HTML, JavaScript, CSS, ছবি, ইত্যাদি) এবং ডেটা (ব্যবহারকারীর ডেটা, সংবাদ নিবন্ধ, ইত্যাদি) ক্যাশ করার বিভিন্ন উপায় রয়েছে। কিন্তু সেরা সমাধান কোনটি? আপনি কতটা ডেটা সংরক্ষণ করতে পারেন? ডেটা যাতে মুছে না যায়, তার জন্য কী করবেন?

আমার কী ব্যবহার করা উচিত?

সম্পদ সংরক্ষণের জন্য এখানে একটি সাধারণ সুপারিশ দেওয়া হলো:

IndexedDB, OPFS, এবং Cache Storage API প্রতিটি আধুনিক ব্রাউজারে সমর্থিত। এগুলো অ্যাসিঙ্ক্রোনাস, এবং মেইন থ্রেডকে ব্লক করে না (তবে OPFS-এর একটি সিঙ্ক্রোনাস সংস্করণও রয়েছে যা শুধুমাত্র ওয়েব ওয়ার্কারগুলিতে পাওয়া যায়)। এগুলো window অবজেক্ট, ওয়েব ওয়ার্কার এবং সার্ভিস ওয়ার্কার থেকে অ্যাক্সেসযোগ্য, ফলে আপনার কোডের যেকোনো জায়গায় এগুলো ব্যবহার করা সম্ভব।

অন্যান্য স্টোরেজ মেকানিজমগুলোর ব্যাপারে কী বলা যায়?

ব্রাউজারে আরও বেশ কিছু স্টোরেজ ব্যবস্থা রয়েছে, কিন্তু সেগুলোর ব্যবহার সীমিত এবং এগুলো পারফরম্যান্সে গুরুতর সমস্যা সৃষ্টি করতে পারে।

SessionStorage ট্যাব-নির্দিষ্ট এবং ট্যাবের জীবনকাল পর্যন্ত সীমাবদ্ধ থাকে। এটি অল্প পরিমাণে সেশন-নির্দিষ্ট তথ্য সংরক্ষণের জন্য উপযোগী হতে পারে, যেমন একটি IndexedDB কী। এটি সতর্কতার সাথে ব্যবহার করা উচিত কারণ এটি সিনক্রোনাস এবং প্রধান থ্রেডকে ব্লক করে দেবে। এটি প্রায় ৫ মেগাবাইট পর্যন্ত সীমাবদ্ধ এবং এতে শুধুমাত্র স্ট্রিং থাকতে পারে। ট্যাব-নির্দিষ্ট হওয়ার কারণে, এটি ওয়েব ওয়ার্কার বা সার্ভিস ওয়ার্কার থেকে অ্যাক্সেসযোগ্য নয়।

LocalStorage এড়িয়ে চলা উচিত, কারণ এটি সিনক্রোনাস এবং মেইন থ্রেডকে ব্লক করে দেয়। এর ধারণক্ষমতা প্রায় ৫ মেগাবাইট এবং এতে শুধুমাত্র স্ট্রিং থাকতে পারে। ওয়েব ওয়ার্কার বা সার্ভিস ওয়ার্কার থেকে LocalStorage অ্যাক্সেস করা যায় না।

কুকির ব্যবহার আছে, কিন্তু ডেটা সংরক্ষণের জন্য এটি ব্যবহার করা উচিত নয়। প্রতিটি HTTP অনুরোধের সাথে কুকি পাঠানো হয়, তাই অল্প পরিমাণের চেয়ে বেশি ডেটা সংরক্ষণ করলে প্রতিটি ওয়েব অনুরোধের আকার উল্লেখযোগ্যভাবে বেড়ে যায়। এগুলি সিনক্রোনাস এবং ওয়েব ওয়ার্কার থেকে অ্যাক্সেসযোগ্য নয়। LocalStorage এবং SessionStorage-এর মতো, কুকিও শুধুমাত্র স্ট্রিং-এর মধ্যে সীমাবদ্ধ।

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

ফাইল সিস্টেম এপিআই এবং ফাইলরাইটার এপিআই একটি স্যান্ডবক্সড ফাইল সিস্টেমে ফাইল পড়া এবং লেখার জন্য মেথড সরবরাহ করে। যদিও এটি অ্যাসিঙ্ক্রোনাস, এটি ব্যবহার করার পরামর্শ দেওয়া হয় না, কারণ এটি শুধুমাত্র ক্রোমিয়াম-ভিত্তিক ব্রাউজারগুলিতে উপলব্ধ

আমি কতটুকু সংরক্ষণ করতে পারি?

সংক্ষেপে বলতে গেলে, অনেকটাই , অন্তত কয়েকশ মেগাবাইট, এবং সম্ভবত কয়েকশ গিগাবাইট বা তারও বেশি। ব্রাউজারের কার্যপ্রণালী ভিন্ন হতে পারে, কিন্তু উপলব্ধ স্টোরেজের পরিমাণ সাধারণত ডিভাইসে থাকা স্টোরেজের পরিমাণের উপর নির্ভর করে।

  • ক্রোম ব্রাউজারকে মোট ডিস্ক স্পেসের ৮০% পর্যন্ত ব্যবহারের অনুমতি দেয়। একটি অরিজিন মোট ডিস্ক স্পেসের ৬০% পর্যন্ত ব্যবহার করতে পারে। উপলব্ধ সর্বোচ্চ কোটা নির্ধারণ করতে আপনি StorageManager API ব্যবহার করতে পারেন। অন্যান্য ক্রোমিয়াম-ভিত্তিক ব্রাউজারগুলোর ক্ষেত্রে এটি ভিন্ন হতে পারে।
    • ইনকগনিটো মোডে, ক্রোম একটি অরিজিনের ব্যবহারযোগ্য স্টোরেজের পরিমাণ মোট ডিস্ক স্পেসের প্রায় ৫%-এ কমিয়ে দেয়।
    • যদি ব্যবহারকারী ক্রোমে "সমস্ত উইন্ডো বন্ধ করার সময় কুকি এবং সাইটের ডেটা মুছে ফেলুন" বিকল্পটি চালু করে থাকেন, তাহলে স্টোরেজ কোটা উল্লেখযোগ্যভাবে কমে সর্বোচ্চ প্রায় ৩০০ মেগাবাইটে নেমে আসে।
  • ফায়ারফক্স ব্রাউজারকে ডিস্কের খালি জায়গার ৫০% পর্যন্ত ব্যবহার করার অনুমতি দেয়। একটি eTLD+1 গ্রুপ (যেমন, example.com , www.example.com এবং foo.bar.example.com ) ২ জিবি পর্যন্ত জায়গা ব্যবহার করতে পারে । কী পরিমাণ জায়গা এখনও খালি আছে তা জানতে আপনি StorageManager API ব্যবহার করতে পারেন।
  • সাফারি (ডেস্কটপ এবং মোবাইল উভয়ই) প্রায় ১ জিবি ডেটা ব্যবহারের অনুমতি দেয় বলে মনে হয়। এই সীমায় পৌঁছালে, সাফারি ব্যবহারকারীকে জানিয়ে দেয় এবং ২০০ মেগাবাইট করে সীমা বাড়াতে থাকে। আমি এই বিষয়ে কোনো আনুষ্ঠানিক নথি খুঁজে পাইনি।
    • মোবাইল সাফারির হোম স্ক্রিনে কোনো PWA যোগ করা হলে, এটি একটি নতুন স্টোরেজ কন্টেইনার তৈরি করে এবং PWA ও মোবাইল সাফারির মধ্যে কোনো কিছুই শেয়ার হয় না। একবার কোনো ইনস্টল করা PWA-এর কোটা শেষ হয়ে গেলে, অতিরিক্ত স্টোরেজের জন্য অনুরোধ করার আর কোনো উপায় থাকে না।

অতীতে, কোনো সাইট একটি নির্দিষ্ট পরিমাণ ডেটা সংরক্ষণ করলে, ব্রাউজারটি আরও ডেটা ব্যবহারের জন্য ব্যবহারকারীর কাছে অনুমতি চাইত। উদাহরণস্বরূপ, যদি সাইটটি ৫০ মেগাবাইটের বেশি ডেটা ব্যবহার করত, তাহলে ব্রাউজারটি ব্যবহারকারীকে ১০০ মেগাবাইট পর্যন্ত ডেটা সংরক্ষণের অনুমতি দিতে বলত এবং এরপর ৫০ মেগাবাইট করে বাড়িয়ে আবার অনুমতি চাইত।

আজকাল বেশিরভাগ আধুনিক ব্রাউজার ব্যবহারকারীকে কোনো জিজ্ঞাসা করে না এবং একটি সাইটকে তার বরাদ্দকৃত কোটা পর্যন্ত ব্যবহার করার অনুমতি দেয়। এর ব্যতিক্রম হলো সাফারি, যা স্টোরেজ কোটা অতিক্রম করলে বরাদ্দকৃত কোটা বাড়ানোর অনুমতি চেয়ে জিজ্ঞাসা করে। যদি কোনো অরিজিন তার বরাদ্দকৃত কোটার চেয়ে বেশি ব্যবহার করার চেষ্টা করে, তবে ডেটা লেখার পরবর্তী প্রচেষ্টাগুলো ব্যর্থ হবে।

কী পরিমাণ স্টোরেজ খালি আছে তা আমি কীভাবে পরীক্ষা করতে পারি?

অনেক ব্রাউজারে , আপনি StorageManager API ব্যবহার করে অরিজিনের জন্য উপলব্ধ স্টোরেজের পরিমাণ এবং এটি কী পরিমাণ স্টোরেজ ব্যবহার করছে তা নির্ধারণ করতে পারেন। এটি IndexedDB এবং Cache API দ্বারা ব্যবহৃত মোট বাইটের সংখ্যা রিপোর্ট করে এবং উপলব্ধ আনুমানিক অবশিষ্ট স্টোরেজ স্পেস গণনা করা সম্ভব করে তোলে।

if (navigator.storage && navigator.storage.estimate) {
  const quota = await navigator.storage.estimate();
  // quota.usage -> Number of bytes used.
  // quota.quota -> Maximum number of bytes available.
  const percentageUsed = (quota.usage / quota.quota) * 100;
  console.log(`You've used ${percentageUsed}% of the available storage.`);
  const remaining = quota.quota - quota.usage;
  console.log(`You can write up to ${remaining} more bytes.`);
}

আপনাকে অবশ্যই কোটা-বহির্ভূত ত্রুটিগুলো ধরতে হবে (নিচে দেখুন)। কিছু ক্ষেত্রে, উপলব্ধ কোটা প্রকৃত স্টোরেজের পরিমাণকে অতিক্রম করতে পারে।

পরিদর্শন করুন

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

ক্রোম ৮৮-এ একটি নতুন ফিচার যোগ করা হয়েছে, যা আপনাকে স্টোরেজ প্যানে সাইটের স্টোরেজ কোটা ওভাররাইড করার সুযোগ দেয়। এই ফিচারটি আপনাকে বিভিন্ন ডিভাইস সিমুলেট করতে এবং ডিস্কের জায়গা কম থাকলে আপনার অ্যাপের আচরণ পরীক্ষা করার ক্ষমতা দেয়। অ্যাপ্লিকেশন- এ গিয়ে স্টোরেজ- এ যান, ‘Simulate custom storage quota’ চেকবক্সটি এনাবল করুন এবং স্টোরেজ কোটা সিমুলেট করার জন্য যেকোনো একটি বৈধ সংখ্যা লিখুন।

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

কোটা অতিক্রম করলে কীভাবে সামাল দেবেন?

কোটা অতিক্রম করলে আপনার কী করা উচিত? সবচেয়ে গুরুত্বপূর্ণ হলো, আপনার সর্বদা রাইট এরর (write errors) ধরা এবং তার সমাধান করা উচিত, তা QuotaExceededError হোক বা অন্য কিছু। তারপর, আপনার অ্যাপের ডিজাইনের উপর নির্ভর করে, এটি কীভাবে সমাধান করবেন তা স্থির করুন। উদাহরণস্বরূপ, দীর্ঘ সময় ধরে অ্যাক্সেস করা হয়নি এমন কন্টেন্ট মুছে ফেলুন, আকারের উপর ভিত্তি করে ডেটা সরিয়ে ফেলুন, অথবা ব্যবহারকারীদের জন্য তারা কী মুছতে চান তা বেছে নেওয়ার একটি উপায় রাখুন।

উপলব্ধ কোটা অতিক্রম করলে IndexedDB এবং Cache API উভয়ই QuotaExceededError নামের একটি DOMError থ্রো করে।

ইনডেক্সডডিবি

যদি অরিজিন তার কোটা অতিক্রম করে ফেলে, তাহলে IndexedDB-তে লেখার প্রচেষ্টা ব্যর্থ হবে। ট্রানজ্যাকশনের onabort() হ্যান্ডলারটি একটি ইভেন্ট পাস করে কল করা হবে। ইভেন্টটির error প্রপার্টিতে একটি DOMException অন্তর্ভুক্ত থাকবে। এররের name পরীক্ষা করলে QuotaExceededError রিটার্ন হবে।

const transaction = idb.transaction(['entries'], 'readwrite');
transaction.onabort = function(event) {
  const error = event.target.error; // DOMException
  if (error.name == 'QuotaExceededError') {
    // Fallback code goes here
  }
};

ক্যাশে এপিআই

যদি অরিজিন তার কোটা অতিক্রম করে, তাহলে ক্যাশ এপিআই-তে লেখার প্রচেষ্টা QuotaExceededError DOMException সহ প্রত্যাখ্যাত হবে।

try {
  const cache = await caches.open('my-cache');
  await cache.add(new Request('/sample1.jpg'));
} catch (err) {
  if (error.name === 'QuotaExceededError') {
    // Fallback code goes here
  }
}

উচ্ছেদ প্রক্রিয়া কীভাবে কাজ করে?

ওয়েব স্টোরেজকে দুটি ভাগে ভাগ করা হয়, "বেস্ট এফোর্ট" এবং "পার্সিস্টেন্ট"। বেস্ট এফোর্ট মানে হলো এই স্টোরেজ ব্যবহারকারীকে বাধা না দিয়েই ব্রাউজার দ্বারা খালি করা যায়, কিন্তু দীর্ঘমেয়াদী বা গুরুত্বপূর্ণ ডেটার জন্য এটি কম টেকসই। পার্সিস্টেন্ট স্টোরেজ কমে গেলেও স্বয়ংক্রিয়ভাবে খালি হয় না। ব্যবহারকারীকে এই স্টোরেজটি ম্যানুয়ালি (ব্রাউজার সেটিংসের মাধ্যমে) খালি করতে হয়।

ডিফল্টরূপে, একটি সাইটের ডেটা (IndexedDB, Cache API, ইত্যাদি সহ) 'বেস্ট এফোর্ট' ক্যাটাগরির অন্তর্ভুক্ত থাকে। এর অর্থ হলো, যদি না কোনো সাইট স্থায়ী স্টোরেজের জন্য অনুরোধ করে থাকে, ব্রাউজার তার নিজস্ব বিবেচনার ভিত্তিতে সাইটের ডেটা মুছে ফেলতে পারে, যেমন—যখন ডিভাইসের স্টোরেজ কম থাকে।

সর্বোত্তম প্রচেষ্টার জন্য উচ্ছেদ নীতিটি হলো:

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

iOS এবং iPadOS 13.4 এবং macOS-এর Safari 13.1 থেকে, IndexedDB, সার্ভিস ওয়ার্কার রেজিস্ট্রেশন এবং Cache API সহ সমস্ত স্ক্রিপ্ট রাইটেবল স্টোরেজের উপর সাত দিনের একটি সীমা আরোপ করা হয়েছে। এর মানে হলো, যদি ব্যবহারকারী সাত দিন ধরে সাইটটির সাথে কোনো ইন্টারঅ্যাকশন না করেন, তাহলে Safari ব্যবহারের পর ক্যাশ থেকে সমস্ত কন্টেন্ট মুছে ফেলা হবে। এই অপসারণ নীতিটি হোম স্ক্রিনে যুক্ত করা ইনস্টল করা PWA-গুলোর ক্ষেত্রে প্রযোজ্য নয় । সম্পূর্ণ বিবরণের জন্য WebKit ব্লগে ‘Full Third-Party Cookie Blocking and More’ দেখুন।

স্টোরেজ বালতি

স্টোরেজ বাকেটস এপিআই- এর মূল ধারণা হলো সাইটগুলোকে একাধিক স্টোরেজ বাকেট তৈরি করার সুযোগ দেওয়া, যেখানে ব্রাউজার প্রতিটি বাকেটকে অন্য বাকেটগুলো থেকে স্বাধীনভাবে মুছে ফেলার সিদ্ধান্ত নিতে পারে। এটি ডেভেলপারদের ডেটা মুছে ফেলার অগ্রাধিকার নির্দিষ্ট করার সুযোগ দেয়, যাতে সবচেয়ে মূল্যবান ডেটা মুছে না যায়।

বোনাস: IndexedDB-এর জন্য র‍্যাপার কেন ব্যবহার করবেন

IndexedDB একটি লো-লেভেল এপিআই, যা ব্যবহারের আগে যথেষ্ট সেটআপের প্রয়োজন হয়, যা কম জটিল ডেটা সংরক্ষণের ক্ষেত্রে বিশেষভাবে কষ্টকর হতে পারে। বেশিরভাগ আধুনিক প্রমিস-ভিত্তিক এপিআই-এর মতো নয়, এটি ইভেন্ট-ভিত্তিক। IndexedDB-এর জন্য idb-এর মতো প্রমিস র‍্যাপারগুলো এর কিছু শক্তিশালী বৈশিষ্ট্যকে আড়াল করে, কিন্তু তার চেয়েও গুরুত্বপূর্ণ হলো, এগুলো IndexedDB লাইব্রেরির সাথে আসা জটিল কার্যপ্রণালীকে (যেমন, ট্রানজ্যাকশন, স্কিমা ভার্সনিং) গোপন করে রাখে।

বোনাস: SQLite Wasm

ওয়েব এসকিউএল অপ্রচলিত ঘোষিত হওয়ার পর এবং ক্রোম থেকে সরিয়ে ফেলার পর, গুগল জনপ্রিয় এসকিউলাইট (SQLite) ডাটাবেসের রক্ষণাবেক্ষণকারীদের সাথে কাজ করে এসকিউলাইট-ভিত্তিক একটি ওয়েব এসকিউএল-এর বিকল্প নিয়ে আসে। এটি কীভাবে ব্যবহার করতে হয় তার বিস্তারিত জানতে, অরিজিন প্রাইভেট ফাইল সিস্টেম দ্বারা সমর্থিত ব্রাউজারে এসকিউলাইট ওয়াসম (SQLite Wasm) পড়ুন।

উপসংহার

সীমিত স্টোরেজ এবং ব্যবহারকারীকে আরও বেশি ডেটা সংরক্ষণ করতে উৎসাহিত করার দিন শেষ। সাইটগুলো এখন তাদের কার্যক্রম পরিচালনার জন্য প্রয়োজনীয় সমস্ত রিসোর্স এবং ডেটা কার্যকরভাবে সংরক্ষণ করতে পারে। StorageManager API ব্যবহার করে আপনি নির্ধারণ করতে পারেন আপনার জন্য কতটা উপলব্ধ আছে এবং আপনি কতটা ব্যবহার করেছেন। আর পারসিস্টেন্ট স্টোরেজের মাধ্যমে, ব্যবহারকারী নিজে থেকে এটি মুছে না ফেলা পর্যন্ত আপনি এটিকে উচ্ছেদ থেকে সুরক্ষিত রাখতে পারেন।

অতিরিক্ত সম্পদ

ধন্যবাদ

এই নির্দেশিকাটি পর্যালোচনা করার জন্য জ্যারিড গুডম্যান, ফিল ওয়ালটন, এইজি কিটামুরা, ড্যানিয়েল মারফি, ডারউইন হুয়াং, জশ বেল, মারিজিন ক্রুইসেলব্রিঙ্ক এবং ভিক্টর কস্টানকে বিশেষ ধন্যবাদ। এই নির্দেশিকাটি যে মূল প্রবন্ধগুলোর উপর ভিত্তি করে তৈরি, সেগুলো লেখার জন্য এইজি কিটামুরা, অ্যাডি ওসমানি এবং মার্ক কোহেনকে ধন্যবাদ। এইজি ‘ব্রাউজার স্টোরেজ অ্যাবিউজার’ নামে একটি সহায়ক টুল তৈরি করেছেন, যা বর্তমান আচরণ যাচাই করার ক্ষেত্রে কার্যকর ছিল। এটি আপনাকে আপনার ব্রাউজারে যত খুশি ডেটা সংরক্ষণ করতে এবং স্টোরেজের সীমা দেখতে দেয়। সাফারির স্টোরেজের সীমা বের করার জন্য গভীর অনুসন্ধান করার জন্য ফ্রাঁসোয়া বোফোর্টকে এবং অরিজিন প্রাইভেট ফাইল সিস্টেম, স্টোরেজ বাকেট, SQLite Wasm এবং ২০২৪ সালের একটি সামগ্রিক কন্টেন্ট আপডেট সম্পর্কিত তথ্য যোগ করার জন্য টমাস স্টেইনারকে ধন্যবাদ।