s3mini: Ultra-leichter, schneller S3-Client für Node und Edge Platforms
GitHub-Benutzer good-lly hat ein Projekt namens s3mini veröffentlicht. Es handelt sich um einen ultraleichten S3-Client für Node.js und Edge-Plattformen, geschrieben in TypeScript. Der Client wiegt nur etwa 14 KB (nicht komprimiert) und liefert durchschnittlich ca. 15 % mehr Vorgänge pro Sekunde (ops/s). Er ist kompatibel mit Cloudflare R2, Backblaze B2, DigitalOcean Spaces, MinIO und Garage. Unterstützung für Ceph und AWS befindet sich in der Warteschleife. Merkmale Leicht und schnell: Durchschnittlich 15 % mehr ops/s und nur 14 KB groß. Keine Abhängigkeiten: Unterstützt AWS SigV4, aber keine vorzeichnenden Anfragen. Edge-Computing-fähig: Ideal für Node.js, Bun und Cloudflare Workers, unterstützt jedoch keine Browserumgebungen. Wesentliche S3-APIs: Verbesserte Listen-, Put-, Get-, Delete- und einige weitere Operationen. BYOS3 (Bring Your Own S3): Kompatibilität getestet mit Cloudflare R2, Backblaze B2, DigitalOcean Spaces, MinIO und Garage. Getestet auf Entwicklungsphase: Lokales MinIO-Setup. Leistungstests Die Leistungstests wurden auf einer lokalen MinIO-Instanz durchgeführt. Die Ergebnisse können je nach Umgebung und Netzwerkbedingungen variieren. Installation Um s3mini zu installieren, verwenden Sie den folgenden Befehl: bash npm install s3mini Verwendung Hier ist ein Beispiel, wie man s3mini verwendet: ```typescript import { s3mini, sanitizeETag } from 's3mini'; const s3client = new s3mini({ accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey, endpoint: config.endpoint, region: config.region, }); // Prüfen, ob das Bucket existiert let exists: boolean = false; try { exists = await s3client.bucketExists(); } catch (err) { throw new Error(bucketExists()-Aufruf fehlgeschlagen, falsche Anmeldeinformationen?: ${err.message}); } if (!exists) { // Bucket basierend auf dem Endpunkt-Namen erstellen await s3client.createBucket(); } // Grundlegende Objekt-Operationen const smallObjectKey: string = 'small-object.txt'; const smallObjectContent: string = 'Hallo, Welt!'; // Prüfen, ob das Objekt existiert const objectExists: boolean = await s3client.objectExists(smallObjectKey); let etag: string | null = null; if (!objectExists) { // Objekt hochladen, Inhalt kann String oder Buffer sein const resp: Response = await s3client.putObject(smallObjectKey, smallObjectContent); etag = sanitizeETag(resp.headers.get('etag')); } // Objekt abrufen, null wenn nicht gefunden const objectData: string | null = await s3client.getObject(smallObjectKey); console.log('Objekt-Daten:', objectData); // Objekt mit ETag abrufen, null wenn nicht gefunden const response2: Response = await s3client.getObject(smallObjectKey, { 'if-none-match': etag }); if (response2) { const etag2: string = sanitizeETag(response2.headers.get('etag')); console.log('Objekt-Daten mit ETag:', response2.body, 'ETag:', etag2); } else { console.log('Objekt nicht gefunden oder ETag stimmt überein.'); } // Objekte im Bucket auflisten, null wenn Bucket leer const list: object[] | null = await s3client.listObjects(); if (list) { console.log('Liste der Objekte:', list); } else { console.log('Im Bucket wurden keine Objekte gefunden.'); } // Objekt löschen const wasDeleted: boolean = await s3client.deleteObject(smallObjectKey); // Mehrteilige Uploads const multipartKey = 'multipart-object.txt'; const largeBuffer = new Uint8Array(1024 * 1024 * 15); // 15 MB Puffer const partSize = 8 * 1024 * 1024; // 8 MB const totalParts = Math.ceil(largeBuffer.length / partSize); // Neues uploadId abrufen const uploadId = await s3client.getMultipartUploadId(multipartKey); const uploadPromises = []; for (let i = 0; i < totalParts; i++) { const partBuffer = largeBuffer.subarray(i * partSize, (i + 1) * partSize); // Jeden Teil hochladen 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, })); // Mehrteiligen Upload abschließen const completeResponse = await s3client.completeMultipartUpload(multipartKey, uploadId, parts); const completeEtag = completeResponse.etag; // Mehrteilige Uploads auflisten const multipartUploads: object = await s3client.listMultipartUploads(); // Mehrteiligen Upload abbrechen const abortResponse = await s3client.abortMultipartUpload(multipartUploads.key, multipartUploads.uploadId); // Mehrteiligen Download 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(); Für weitere Informationen und Beispiele siehe die Datei USAGE.md, die Tests und die Dokumentation. Sicherheitshinweise Beiträge willkommen: Wenn Sie eine Idee für ein neues Feature haben oder einen Fehler entdeckt haben, sind wir dankbar für Ihre Beteiligung. Probleme melden: Wenn Sie ein Problem feststellen oder einen Funktionswunsch haben, öffnen Sie bitte ein Issue auf GitHub. Geben Sie so viele Details wie möglich (Umgebung, Fehlermeldungen, Protokolle, Schritte zur Reproduktion usw.), damit wir das Problem verstehen und lösen können. Pull-Requests: Wir freuen uns über Pull-Requests! Wenn Sie ein neues Feature implementieren oder einen Fehler beheben möchten, senden Sie bitte einen Pull-Request an die aktuelle dev-Branch. Bei größeren Änderungen sollten Sie Ihre Pläne zunächst in einem Issue besprechen. Leichtgewichtiges Konzept: s3mini soll leicht und frei von Abhängigkeiten bleiben. Vermeiden Sie die Hinzufügung schwerer Abhängigkeiten. Neue Features sollten einen signifikanten Nutzen bieten, um eine Größe-zuwachs zu rechtfertigen. Gemeinschaftliches Verhalten: Seien Sie respektvoll und konstruktiv in Ihren Kommunikationen. Wir wollen eine einladende Umgebung für alle Beteiligten. Nähere Informationen finden Sie in unserer CODE_OF_CONDUCT.md. Obwohl niemand es lesen wird, ist es aus gutem Grund da. Selbstständige Lösungen teilen: Wenn Sie eine Lösung für Ihr Problem oder Ihre Frage selbst finden, erwägen Sie bitte, die Antwort zu posten oder das Issue mit einer Erklärung zu schließen. Dies kann anderen helfen, die das gleiche Problem haben. Lizenz Dieses Projekt steht unter der MIT-Lizenz. Weitere Details finden Sie in der LICENSE.md-Datei. Sponsoring Die Entwicklung und Wartung von s3mini (und anderen Open-Source-Projekten) erfordert Zeit und Aufwand. Wenn Sie diesen Client nützlich finden, erwägen Sie bitte, seine Entwicklung zu unterstützen. Ihre Spenden helfen, sicherzustellen, dass ich s3mini und andere Projekte weiter verbessern kann. Vielen Dank! Experteneinschätzung s3mini ist ein vielversprechendes Tool für Entwickler, die in ressourcenbeschränkten Umgebungen arbeiten. Seine geringe Größe und hohe Geschwindigkeit machen es besonders geeignet für Edge-Computing-Anwendungen und Plattformen wie Cloudflare Workers. Die Unterstützung für mehrere S3-kompatible Dienste erhöht seine Flexibilität und Nützlichkeit. Die Community-Unterstützung und das Open-Source-Modell sorgen dafür, dass das Projekt kontinuierlich weiterentwickelt wird. Unternehmensprofil good-lly ist ein GitHub-Benutzer, der sich auf die Entwicklung leichtgewichtiger, effizienter Technologien spezialisiert hat. s3mini ist eines seiner Projekte, das sich durch seine Kompaktheit und Leistungsfähigkeit hervorhebt.