আপনার অ্যাপের জন্য হাই পারফরম্যান্স স্টোরেজ: স্টোরেজ ফাউন্ডেশন API

ওয়েব প্ল্যাটফর্মটি ক্রমবর্ধমানভাবে বিকাশকারীদের ওয়েবের জন্য জরিমানা-টিউনযুক্ত উচ্চ-পারফরম্যান্স অ্যাপ্লিকেশনগুলি তৈরি করার জন্য প্রয়োজনীয় সরঞ্জামগুলি সরবরাহ করে৷ সবচেয়ে উল্লেখযোগ্যভাবে, WebAssembly (Wasm) দ্রুত এবং শক্তিশালী ওয়েব অ্যাপ্লিকেশনের দরজা খুলে দিয়েছে, যখন Emscripten-এর মতো প্রযুক্তিগুলি এখন ডেভেলপারদের ওয়েবে চেষ্টা করা এবং পরীক্ষিত কোড পুনরায় ব্যবহার করার অনুমতি দেয়। সত্যিকার অর্থে এই সম্ভাবনাকে কাজে লাগাতে, স্টোরেজের ক্ষেত্রে বিকাশকারীদের অবশ্যই একই শক্তি এবং নমনীয়তা থাকতে হবে।

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

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

কেন ওয়েব অন্য স্টোরেজ API প্রয়োজন?

ওয়েব প্ল্যাটফর্মটি ডেভেলপারদের জন্য অনেকগুলি স্টোরেজ বিকল্প অফার করে, যার প্রতিটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে মাথায় রেখে তৈরি করা হয়েছে।

  • এই বিকল্পগুলির মধ্যে কিছু স্পষ্টভাবে এই প্রস্তাবের সাথে ওভারল্যাপ করে না কারণ তারা শুধুমাত্র খুব অল্প পরিমাণে ডেটা সংরক্ষণ করার অনুমতি দেয়, যেমন কুকিজ , বা sessionStorage এবং localStorage প্রক্রিয়া নিয়ে গঠিত ওয়েব স্টোরেজ API
  • ফাইল এবং ডিরেক্টরি এন্ট্রি এপিআই বা WebSQL এর মতো বিভিন্ন কারণে অন্যান্য বিকল্পগুলি ইতিমধ্যেই বাতিল করা হয়েছে৷
  • ফাইল সিস্টেম অ্যাক্সেস API-এর একটি অনুরূপ API পৃষ্ঠ রয়েছে, তবে এটির ব্যবহার হল ক্লায়েন্টের ফাইল সিস্টেমের সাথে ইন্টারফেস করা এবং ডেটাতে অ্যাক্সেস প্রদান করা যা মূলের বা এমনকি ব্রাউজারের মালিকানার বাইরেও হতে পারে। এই ভিন্ন ফোকাস কঠোর নিরাপত্তা বিবেচনা এবং উচ্চ কর্মক্ষমতা খরচ সঙ্গে আসে.
  • IndexedDB API স্টোরেজ ফাউন্ডেশন API-এর কিছু ব্যবহারের ক্ষেত্রে ব্যাকএন্ড হিসাবে ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ, Emscripten-এ IDBFS অন্তর্ভুক্ত, একটি IndexedDB-ভিত্তিক স্থায়ী ফাইল সিস্টেম। যাইহোক, যেহেতু IndexedDB মূলত একটি মূল-মূল্যের দোকান, এটি উল্লেখযোগ্য কর্মক্ষমতা সীমাবদ্ধতার সাথে আসে। উপরন্তু, IndexedDB-এর অধীনে একটি ফাইলের উপবিভাগ সরাসরি অ্যাক্সেস করা আরও কঠিন এবং ধীর।
  • অবশেষে, CacheStorage ইন্টারফেস ব্যাপকভাবে সমর্থিত এবং ওয়েব অ্যাপ্লিকেশন সংস্থানগুলির মতো বড় আকারের ডেটা সংরক্ষণের জন্য টিউন করা হয়েছে, তবে মানগুলি অপরিবর্তনীয়।

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

স্টোরেজ ফাউন্ডেশন API-এর জন্য প্রস্তাবিত ব্যবহারের ক্ষেত্রে

এই API ব্যবহার করতে পারে এমন সাইটগুলির উদাহরণগুলির মধ্যে রয়েছে:

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

স্টোরেজ ফাউন্ডেশন এপিআই কি?

API এর দুটি প্রধান অংশ রয়েছে:

  • ফাইল সিস্টেম কল , যা ফাইল এবং ফাইল পাথের সাথে ইন্টারঅ্যাক্ট করার জন্য মৌলিক কার্যকারিতা প্রদান করে।
  • ফাইল হ্যান্ডলগুলি , যা একটি বিদ্যমান ফাইলে পড়ার এবং লেখার অ্যাক্সেস প্রদান করে।

ফাইল সিস্টেম কল

স্টোরেজ ফাউন্ডেশন এপিআই একটি নতুন অবজেক্ট, storageFoundation প্রবর্তন করে, যা window অবজেক্টে থাকে এবং এতে বেশ কয়েকটি ফাংশন রয়েছে:

  • storageFoundation.open(name) : প্রদত্ত নামের ফাইলটি খোলে যদি এটি বিদ্যমান থাকে এবং অন্যথায় একটি নতুন ফাইল তৈরি করে। একটি প্রতিশ্রুতি প্রদান করে যা খোলা ফাইলের সাথে সমাধান করে।
  • storageFoundation.delete(name) : প্রদত্ত নামের ফাইলটি সরিয়ে দেয়। একটি প্রতিশ্রুতি প্রদান করে যা ফাইলটি মুছে ফেলা হলে সমাধান করে।
  • storageFoundation.rename(oldName, newName) : ফাইলের পুরানো নাম থেকে নতুন নামে পারমাণবিকভাবে নামকরণ করে। একটি প্রতিশ্রুতি প্রদান করে যা ফাইলটির নাম পরিবর্তন করার সময় সমাধান করে।
  • storageFoundation.getAll() : একটি প্রতিশ্রুতি প্রদান করে যা সমস্ত বিদ্যমান ফাইল নামের একটি অ্যারের সাথে সমাধান করে।
  • storageFoundation.requestCapacity(requestedCapacity) : বর্তমান এক্সিকিউশন প্রসঙ্গ দ্বারা ব্যবহারের জন্য নতুন ক্ষমতা (বাইটে) অনুরোধ করে। একটি প্রতিশ্রুতি প্রদান করে যা উপলব্ধ ক্ষমতার অবশিষ্ট পরিমাণের সাথে সমাধান করা হয়েছে।
  • storageFoundation.releaseCapacity(toBeReleasedCapacity) : বর্তমান এক্সিকিউশন প্রেক্ষাপট থেকে নির্দিষ্ট সংখ্যক বাইট রিলিজ করে এবং একটি প্রতিশ্রুতি প্রদান করে যা অবশিষ্ট ক্ষমতার সাথে সমাধান করে।
  • storageFoundation.getRemainingCapacity() : একটি প্রতিশ্রুতি প্রদান করে যা বর্তমান নির্বাহের প্রসঙ্গে উপলব্ধ ক্ষমতার সাথে সমাধান করে।

ফাইল হ্যান্ডলগুলি

ফাইলগুলির সাথে কাজ নিম্নলিখিত ফাংশনগুলির মাধ্যমে ঘটে:

  • NativeIOFile.close() : একটি ফাইল বন্ধ করে, এবং একটি প্রতিশ্রুতি প্রদান করে যা অপারেশন সম্পূর্ণ হলে সমাধান করে।
  • NativeIOFile.flush() : স্টোরেজ ডিভাইসের সাথে একটি ফাইলের ইন-মেমরি অবস্থা সিঙ্ক্রোনাইজ করে (অর্থাৎ, ফ্লাশ করে) এবং একটি প্রতিশ্রুতি প্রদান করে যা অপারেশন সম্পূর্ণ হলে সমাধান করে।
  • NativeIOFile.getLength() : একটি প্রতিশ্রুতি প্রদান করে যা ফাইলের দৈর্ঘ্য বাইটে সমাধান করে।
  • NativeIOFile.setLength(length) : বাইটে ফাইলের দৈর্ঘ্য সেট করে এবং একটি প্রতিশ্রুতি প্রদান করে যা অপারেশন শেষ হলে সমাধান করে। নতুন দৈর্ঘ্য বর্তমান দৈর্ঘ্যের চেয়ে ছোট হলে, ফাইলের শেষ থেকে শুরু করে বাইটগুলি সরানো হয়। অন্যথায় ফাইলটি শূন্য-মূল্যবান বাইট দিয়ে প্রসারিত হয়।
  • NativeIOFile.read(buffer, offset) : একটি বাফারের মাধ্যমে প্রদত্ত অফসেটে ফাইলের বিষয়বস্তু পড়ে যা প্রদত্ত বাফার স্থানান্তরের ফলাফল, যা পরে বিচ্ছিন্ন রেখে দেওয়া হয়। স্থানান্তরিত বাফার এবং সফলভাবে পড়া বাইটের সংখ্যা সহ একটি NativeIOReadResult প্রদান করে।

    একটি NativeIOReadResult হল একটি বস্তু যা দুটি এন্ট্রি নিয়ে গঠিত:

    • buffer : একটি ArrayBufferView , যা read() এ পাস করা বাফার স্থানান্তরের ফলাফল। এটি উৎস বাফার হিসাবে একই ধরনের এবং দৈর্ঘ্য।
    • readBytes : buffer সফলভাবে পড়া বাইটের সংখ্যা। এটি বাফার আকারের চেয়ে কম হতে পারে, যদি একটি ত্রুটি ঘটে বা ফাইলের শেষের বাইরে পঠিত পরিসর বিস্তৃত হয়। পঠিত পরিসর ফাইলের শেষের বাইরে থাকলে এটি শূন্যে সেট করা হয়।
  • NativeIOFile.write(buffer, offset) : প্রদত্ত অফসেটে ফাইলটিতে প্রদত্ত বাফারের বিষয়বস্তু লেখে। কোনো ডেটা লেখার আগে বাফার স্থানান্তরিত হয় এবং তাই বিচ্ছিন্ন রাখা হয়। স্থানান্তরিত বাফার এবং সফলভাবে লেখা বাইটের সংখ্যা সহ একটি NativeIOWriteResult প্রদান করে। লেখার পরিসীমা তার দৈর্ঘ্য অতিক্রম করলে ফাইলটি বাড়ানো হবে।

    একটি NativeIOWriteResult হল একটি বস্তু যা দুটি এন্ট্রি নিয়ে গঠিত:

    • buffer : একটি ArrayBufferView যা write() পাস করা বাফার স্থানান্তরের ফলাফল। এটি উৎস বাফার হিসাবে একই ধরনের এবং দৈর্ঘ্য।
    • writtenBytes : buffer সফলভাবে লেখা বাইটের সংখ্যা। কোনো ত্রুটি ঘটলে এটি বাফার আকারের চেয়ে কম হতে পারে।

সম্পূর্ণ উদাহরণ

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

খোলা, লেখা, পড়া, বন্ধ

// Open a file (creating it if needed).
const file = await storageFoundation.open('test_file');
try {
  // Request 100 bytes of capacity for this context.
  await storageFoundation.requestCapacity(100);

  const writeBuffer = new Uint8Array([64, 65, 66]);
  // Write the buffer at offset 0. After this operation, `result.buffer`
  // contains the transferred buffer and `result.writtenBytes` is 3,
  // the number of bytes written. `writeBuffer` is left detached.
  let result = await file.write(writeBuffer, 0);

  const readBuffer = new Uint8Array(3);
  // Read at offset 1. `result.buffer` contains the transferred buffer,
  // `result.readBytes` is 2, the number of bytes read. `readBuffer` is left
  // detached.
  result = await file.read(readBuffer, 1);
  // `Uint8Array(3) [65, 66, 0]`
  console.log(result.buffer);
} finally {
  file.close();
}

খোলা, তালিকা, মুছে ফেলা

// Open three different files (creating them if needed).
await storageFoundation.open('sunrise');
await storageFoundation.open('noon');
await storageFoundation.open('sunset');
// List all existing files.
// `["sunset", "sunrise", "noon"]`
await storageFoundation.getAll();
// Delete one of the three files.
await storageFoundation.delete('noon');
// List all remaining existing files.
// `["sunrise", "noon"]`
await storageFoundation.getAll();

ডেমো

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

নিরাপত্তা এবং অনুমতি

Chromium টিম ব্যবহারকারীর নিয়ন্ত্রণ, স্বচ্ছতা, এবং ergonomics সহ শক্তিশালী ওয়েব প্ল্যাটফর্ম বৈশিষ্ট্যগুলিতে অ্যাক্সেস নিয়ন্ত্রণে সংজ্ঞায়িত মূল নীতিগুলি ব্যবহার করে স্টোরেজ ফাউন্ডেশন API ডিজাইন এবং প্রয়োগ করেছে৷

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

ব্যবহারকারী নিয়ন্ত্রণ

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

সহায়ক লিঙ্ক

স্বীকৃতি

স্টোরেজ ফাউন্ডেশন API ইমানুয়েল ক্রিভয় এবং রিচার্ড স্টটজ দ্বারা নির্দিষ্ট এবং প্রয়োগ করা হয়েছিল। এই নিবন্ধটি পিট লেপেজ এবং জো মেডলি দ্বারা পর্যালোচনা করা হয়েছে।

Unsplash-Markus Spiske-এর মাধ্যমে হিরো ইমেজ।