diff --git a/lib/Open/index.js b/lib/Open/index.js index 83c349b..ab0da12 100644 --- a/lib/Open/index.js +++ b/lib/Open/index.js @@ -1,6 +1,7 @@ const fs = require('graceful-fs'); const directory = require('./directory'); const Stream = require('stream'); +const { GetObjectCommand, HeadObjectCommand } = require('@aws-sdk/client-s3'); module.exports = { buffer: function(buffer, options) { @@ -93,7 +94,42 @@ module.exports = { return directory(source, options); }, + s3_v3: function (client, params, options) { + const source = { + size: async () => { + const head = await client.send( + new HeadObjectCommand({ + Bucket: params.Bucket, + Key: params.Key, + }) + ); + + return head.ContentLength ?? 0; + }, + stream: (offset, length) => { + const stream = Stream.PassThrough(); + const end = length ? offset + length : ""; + client + .send( + new GetObjectCommand({ + Bucket: params.Bucket, + Key: params.Key, + Range: `bytes=${offset}-${end}`, + }) + ) + .then((response) => { + response.Body.pipe(stream); + }) + .catch((error) => { + stream.emit("error", error); + }); + return stream; + }, + }; + + return directory(source, options); + }, custom: function(source, options) { return directory(source, options); } diff --git a/package.json b/package.json index 528f510..ab009c1 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,9 @@ "tap": "^12.7.0", "temp": ">= 0.4.0 < 1" }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0" + }, "directories": { "example": "examples", "test": "test"