s3mini
এস 3-সামঞ্জস্যপূর্ণ অবজেক্ট স্টোরেজের জন্য একটি অতি-লাইটওয়েট টাইপস্ক্রিপ্ট ক্লায়েন্ট (~ 14 কেবি মিনিফাইড, ≈15 % আরও বেশি ওপিএস/এস)। এটি নোড, বান, ক্লাউডফ্লেয়ার কর্মী এবং অন্যান্য প্রান্ত প্ল্যাটফর্মগুলিতে চলে। এটি ক্লাউডফ্লেয়ার আর 2, ব্যাকব্লেজ বি 2, ডিজিটাল ওসিয়ান স্পেস এবং মিনিওতে পরীক্ষা করা হয়েছে। (কোনও ব্রাউজার সমর্থন নেই!)
(গিথুব) (ইস্যু) (এনপিএম)
- 🚀 হালকা এবং দ্রুত: গড় ≈15 % বেশি অপ্স/এস এবং কেবল 14 কেবি (মিনিফাইড, জিজিপড নয়)।
- 🔧 শূন্য নির্ভরতা; এডাব্লুএস সিআইজিভি 4 সমর্থন করে (প্রাক-স্বাক্ষরযুক্ত অনুরোধগুলি নেই)।
- Well ক্লাউডফ্লেয়ার কর্মীদের উপর কাজ করে; এজ কম্পিউটিং, নোড এবং বানের জন্য আদর্শ (কোনও ব্রাউজার সমর্থন নেই)।
- 🔑 কেবলমাত্র প্রয়োজনীয় এস 3 এপিআই – উন্নত তালিকা, পুট, পেতে, মুছুন এবং আরও কয়েকটি।
- 📦 BYOS3 – আপনার নিজের এস 3-সামঞ্জস্যপূর্ণ বালতি আনুন (ক্লাউডফ্লেয়ার আর 2, ব্যাকব্লেজ বি 2, ডিজিটাল ওসিয়ান স্পেসস, মিনিও এবং গ্যারেজে পরীক্ষিত! সিফ এবং এডাব্লুএস কাতারে রয়েছে)।
দেব:
স্থানীয় মিনিও উদাহরণে পারফরম্যান্স পরীক্ষা করা হয়েছিল। আপনার ফলাফলগুলি পরিবেশ এবং নেটওয়ার্ক অবস্থার উপর নির্ভর করে পরিবর্তিত হতে পারে, তাই এটি লবণের দানা দিয়ে নিন।
গ্রন্থাগারটি এস 3 অপারেশনগুলির একটি উপসেটকে সমর্থন করে, প্রয়োজনীয় বৈশিষ্ট্যগুলিতে ফোকাস করে, এটি সীমিত সংস্থান সহ পরিবেশের জন্য উপযুক্ত করে তোলে।
- ✅ হেডবকেট (বালতিএক্সিস্ট)
- ✅ ক্রিয়েটবকেট (ক্রিয়েটবকেট)
- ✅ listobjectsv2 (তালিকা)
- ✅ getObject (getObject, getObjectresponse, getobjectwithetag, getObjectraw, getObjectarraybuffer, getObjectjson)
- ✅ পুটবজেক্ট (পুটবজেক্ট)
- ✅ মুছে ফেলুন (মুছে ফেলুন)
- ✅ হেডবজেক্ট (অবজেক্টএক্সিস্টস, গেটট্যাগ, গেটকন্টেন্টেন্টল্যাথ)
- ✅ আর্ট মাল্টিপুপুপলোডস
- Are
- ✅ সমাপ্তি
- ✅ AbortMultipartupload
- ✅ আপলোড পার্ট
- ❌ অনুলিপি: প্রয়োগ করা হয়নি (টিবিডি)
⚠ পরিবেশ সমর্থন বিজ্ঞপ্তিএই লাইব্রেরিটি যেমন পরিবেশে চালানোর জন্য ডিজাইন করা হয়েছে নোড.জেএস, বানএবং ক্লাউডফ্লেয়ার কর্মীরা। এটা করে ব্রাউজার পরিবেশ সমর্থন না নোড.জেএস এপিআই এবং পলিফিলগুলি ব্যবহারের কারণে।
ক্লাউডফ্লেয়ার কর্মীরা: অন্তর্নির্মিত নোড.জেএস ক্রিপ্টো এপিআই সক্ষম করতে, যোগ করুন
nodejs_compat
আপনার র্যাংলার কনফিগারেশন ফাইলে সামঞ্জস্যতা পতাকা। এটিও সক্ষম করেnodejs_compat_v2
যতক্ষণ আপনার সামঞ্জস্যতার তারিখ2024-09-23
বা পরে। নোড.জেএসের সামঞ্জস্যতা পতাকা এবং ভি 2 সম্পর্কে আরও জানুন।
import s3mini, sanitizeETag from 's3mini';
const s3client = new s3mini(
accessKeyId: config.accessKeyId,
secretAccessKey: config.secretAccessKey,
endpoint: config.endpoint,
region: config.region,
);
// Basic bucket ops
let exists: boolean = false;
try
// Check if the bucket exists
exists = await s3client.bucketExists();
catch (err)
throw new Error(`Failed bucketExists() call, wrong credentials maybe: $err.message`);
if (!exists)
// Create the bucket based on the endpoint bucket name
await s3client.createBucket();
// Basic object ops
// key is the name of the object in the bucket
const smallObjectKey: string = 'small-object.txt';
// content is the data you want to store in the object
// it can be a string or Buffer (recommended for large objects)
const smallObjectContent: string = 'Hello, world!';
// check if the object exists
const objectExists: boolean = await s3client.objectExists(smallObjectKey);
let etag: string | null = null;
if (!objectExists)
// put/upload the object, content can be a string or Buffer
// to add object into "folder", use "folder/filename.txt" as key
const resp: Response = await s3client.putObject(smallObjectKey, smallObjectContent);
// you can also get etag via getEtag method
// const etag: string = await s3client.getEtag(smallObjectKey);
etag = sanitizeETag(resp.headers.get('etag'));
// get the object, null if not found
const objectData: string | null = await s3client.getObject(smallObjectKey);
console.log('Object data:', objectData);
// get the object with ETag, null if not found
const response2: Response = await s3mini.getObject(smallObjectKey, 'if-none-match': etag );
if (response2)
// ETag changed so we can get the object data and new ETag
// Note: ETag is not guaranteed to be the same as the MD5 hash of the object
// ETag is sanitized to remove quotes
const etag2: string = sanitizeETag(response2.headers.get('etag'));
console.log('Object data with ETag:', response2.body, 'ETag:', etag2);
else
console.log('Object not found or ETag does match.');
// list objects in the bucket, null if bucket is empty
// Note: listObjects uses listObjectsV2 API and iterate over all pages
// so it will return all objects in the bucket which can take a while
// If you want to limit the number of objects returned, use the maxKeys option
// If you want to list objects in a specific "folder", use "folder/" as prefix
// Example s3client.listObjects(" "myfolder/")
const list: object() | null = await s3client.listObjects();
if (list)
console.log('List of objects:', list);
else
console.log('No objects found in the bucket.');
// delete the object
const wasDeleted: boolean = await s3client.deleteObject(smallObjectKey);
// Multipart upload
const multipartKey = 'multipart-object.txt';
const large_buffer = new Uint8Array(1024 * 1024 * 15); // 15 MB buffer
const partSize = 8 * 1024 * 1024; // 8 MB
const totalParts = Math.ceil(large_buffer.length / partSize);
// Beware! This will return always a new uploadId
// if you want to use the same uploadId, you need to store it somewhere
const uploadId = await s3client.getMultipartUploadId(multipartKey);
const uploadPromises = ();
for (let i = 0; i < totalParts; i++)
const partBuffer = large_buffer.subarray(i * partSize, (i + 1) * partSize);
// upload each part
// Note: uploadPart returns a promise, so you can use Promise.all to upload all parts in parallel
// but be careful with the number of parallel uploads, it can cause throttling
// or errors if you upload too many parts at once
// You can also use generator functions to upload parts in batches
uploadPromises.push(s3client.uploadPart(multipartKey, uploadId, partBuffer, i + 1));
const uploadResponses = await Promise.all(uploadPromises);
const parts = uploadResponses.map((response, index) => (
partNumber: index + 1,
etag: response.etag,
));
// Complete the multipart upload
const completeResponse = await s3client.completeMultipartUpload(multipartKey, uploadId, parts);
const completeEtag = completeResponse.etag;
// List multipart uploads
// returns object with uploadId and key
const multipartUploads: object = await s3client.listMultipartUploads();
// Abort the multipart upload
const abortResponse = await s3client.abortMultipartUpload(multipartUploads.key, multipartUploads.uploadId);
// Multipart download
// lets test getObjectRaw with range
const rangeStart = 2048 * 1024; // 2 MB
const rangeEnd = 8 * 1024 * 1024 * 2; // 16 MB
const rangeResponse = await s3client.getObjectRaw(multipartKey, false, rangeStart, rangeEnd);
const rangeData = await rangeResponse.arrayBuffer();
আরও চেক ব্যবহার.এমডি ফাইল, উদাহরণ এবং পরীক্ষাগুলির জন্য।
- লাইব্রেরি লগিংয়ের সময় সংবেদনশীল তথ্য (অ্যাক্সেস কী, সেশন টোকেন ইত্যাদি) মাস্ক করে।
- সর্বদা আপনার এডাব্লুএস শংসাপত্রগুলি রক্ষা করুন এবং আপনার অ্যাপ্লিকেশনটিতে সেগুলি হার্ড-কোডিং এড়িয়ে চলুন (!!!)। পরিবেশ ভেরিয়েবল ব্যবহার করুন। শংসাপত্রগুলি সংরক্ষণের জন্য পরিবেশের ভেরিয়েবল বা একটি সুরক্ষিত ভল্ট ব্যবহার করুন।
- এস 3 বালতিটি অ্যাক্সেস করতে এবং অপারেশনগুলি সম্পাদন করার জন্য আপনার প্রয়োজনীয় অনুমতি রয়েছে তা নিশ্চিত করুন।
- মাল্টিপার্ট আপলোডগুলি ব্যবহার করার সময় সতর্ক হন, কারণ সঠিকভাবে পরিচালিত না হলে তারা অতিরিক্ত ব্যয় করতে পারে।
- গ্রন্থাগারটির অনুপযুক্ত ব্যবহারের ফলে কোনও ডেটা ক্ষতি বা সুরক্ষা লঙ্ঘনের জন্য লেখকরা দায়বদ্ধ নন।
- যদি আপনি কোনও সুরক্ষা দুর্বলতা খুঁজে পান তবে দয়া করে এটি আমাদের কাছে সরাসরি ইমেলের মাধ্যমে রিপোর্ট করুন। আরও তথ্যের জন্য, দয়া করে সুরক্ষা.এমডি ফাইলটি দেখুন।
অবদানগুলি প্রশংসা করা হয়! আপনার যদি কোনও নতুন বৈশিষ্ট্যের জন্য ধারণা থাকে বা কোনও বাগ পাওয়া যায় তবে আমরা আপনাকে জড়িত হতে উত্সাহিত করি:
রিপোর্ট ইস্যু: আপনি যদি কোনও সমস্যার মুখোমুখি হন বা কোনও বৈশিষ্ট্য অনুরোধ করেন তবে দয়া করে গিথুবে একটি সমস্যা খুলুন। যতটা সম্ভব বিশদ (পরিবেশ, ত্রুটি বার্তা, লগ, পুনরুত্পাদন করার পদক্ষেপ ইত্যাদি) অন্তর্ভুক্ত করুন যাতে আমরা সমস্যাটি বুঝতে এবং সমাধান করতে পারি।
অনুরোধগুলি টানুন: আমরা PRs স্বাগত! আপনি যদি কোনও নতুন বৈশিষ্ট্য বাস্তবায়ন করতে বা কোনও বাগ ঠিক করতে চান তবে সর্বশেষতমটিতে একটি টান অনুরোধ জমা দিতে নির্দ্বিধায়
dev branch
। বড় পরিবর্তনগুলির জন্য, প্রথমে কোনও ইস্যুতে আপনার পরিকল্পনাগুলি নিয়ে আলোচনা করা ভাল ধারণা।লাইটওয়েট দর্শন: অবদান রাখার সময়, মনে রাখবেন যে S3Mini হালকা ওজনের এবং নির্ভরতা মুক্ত থাকার লক্ষ্য। ভারী নির্ভরতা যুক্ত করা এড়িয়ে চলুন। নতুন বৈশিষ্ট্যগুলির আকারের কোনও বৃদ্ধি ন্যায়সঙ্গত করার জন্য উল্লেখযোগ্য মান সরবরাহ করা উচিত।
সম্প্রদায় আচরণ: যোগাযোগের ক্ষেত্রে শ্রদ্ধাশীল এবং গঠনমূলক হন। আমরা সমস্ত অবদানকারীদের জন্য একটি স্বাগত পরিবেশ চাই। আরও তথ্যের জন্য, দয়া করে আমাদের কোড_অফ_কন্ডাক্ট.এমডি দেখুন। কেউ এটি পড়েন না, তবে এটি কোনও কারণে রয়েছে।
আপনি যদি নিজের প্রশ্ন বা সমস্যার সমাধান খুঁজে বের করেন তবে দয়া করে উত্তরটি পোস্ট করা বা ব্যাখ্যা দিয়ে সমস্যাটি বন্ধ করার বিষয়টি বিবেচনা করুন। এটি পরবর্তী ব্যক্তিকে একই জিনিসটিতে চালিত করতে সহায়তা করতে পারে!
এই প্রকল্পটি এমআইটি লাইসেন্সের অধীনে লাইসেন্সযুক্ত – বিশদগুলির জন্য লাইসেন্স.এমডি ফাইলটি দেখুন।
S3Mini (এবং অন্যান্য ওপেন সোর্স প্রকল্পগুলি) বিকাশ এবং বজায় রাখার জন্য সময় এবং প্রচেষ্টা প্রয়োজন। যদি আপনি এই গ্রন্থাগারটি দরকারী বলে মনে করেন তবে দয়া করে এর বিকাশের স্পনসর করার বিষয়টি বিবেচনা করুন। আপনার সমর্থনটি নিশ্চিত করতে সহায়তা করে যে আমি S3Mini এবং অন্যান্য প্রকল্পগুলির উন্নতি চালিয়ে যেতে পারি। আপনাকে ধন্যবাদ!