Is there any Amazon S3 client library for Node.js that allows listing of all files in S3 bucket?
The most known aws2js and knox don\'t seem to have this functionalit
const { S3 } = require("aws-sdk");
const s3 = new S3();
async function* listAllKeys(opts) {
opts = { ...opts };
do {
const data = await s3.listObjectsV2(opts).promise();
opts.ContinuationToken = data.NextContinuationToken;
yield data;
} while (opts.ContinuationToken);
}
const opts = {
Bucket: "bucket-xyz" /* required */,
// ContinuationToken: 'STRING_VALUE',
// Delimiter: 'STRING_VALUE',
// EncodingType: url,
// FetchOwner: true || false,
// MaxKeys: 'NUMBER_VALUE',
// Prefix: 'STRING_VALUE',
// RequestPayer: requester,
// StartAfter: 'STRING_VALUE'
};
async function main() {
// using for of await loop
for await (const data of listAllKeys(opts)) {
console.log(data.Contents);
}
}
main();
thats it
async function main() {
const keys = listAllKeys(opts);
console.log(await keys.next());
// {value: {…}, done: false}
console.log(await keys.next());
// {value: {…}, done: false}
console.log(await keys.next());
// {value: undefined, done: true}
}
main();
const lister = (opts) => (o) => {
let needMore = true;
(async () => {
const keys = listAllKeys(opts);
for await (const data of keys) {
o.next(data);
if (!needMore) break;
}
o.complete();
})();
return () => (needMore = false);
};
// Using Rxjs
const { Observable } = require("rxjs");
const { flatMap } = require("rxjs/operators");
function listAll() {
return Observable.create(lister(opts))
.pipe(flatMap((v) => v.Contents))
.subscribe(console.log);
}
listAll();
const EventEmitter = require("events");
const _eve = new EventEmitter();
async function onData(data) {
// will be called for each set of data
console.log(data);
}
async function onError(error) {
// will be called if any error
console.log(error);
}
async function onComplete() {
// will be called when data completely received
}
_eve.on("next", onData);
_eve.on("error", onError);
_eve.on("complete", onComplete);
const stop = lister(opts)({
next: (v) => _eve.emit("next", v),
error: (e) => _eve.emit("error", e),
complete: (v) => _eve.emit("complete", v),
});