mirror of
https://github.com/GenderDysphoria/GenderDysphoria.fyi.git
synced 2025-01-31 15:26:17 +00:00
44 lines
1004 B
JavaScript
44 lines
1004 B
JavaScript
|
var Readable = require('readable-stream').Readable;
|
||
|
|
||
|
function identity (_in) {
|
||
|
return _in;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a stream for any paged AWS function
|
||
|
* you can optionally provide a mapping function
|
||
|
* like S3::listObjectsV2()
|
||
|
*
|
||
|
* @param {function} req - a non executed AWS function
|
||
|
* @param {function} fn - a function that selects/maps the results
|
||
|
* @param {object} opts - stream options
|
||
|
*/
|
||
|
function s3PageStream (req, fn, opts) {
|
||
|
opts = Object.assign({}, opts, { read, objectMode: true });
|
||
|
if (!fn) fn = identity;
|
||
|
|
||
|
var stream = new Readable(opts);
|
||
|
|
||
|
return stream;
|
||
|
|
||
|
function read () {
|
||
|
if (!req) return;
|
||
|
|
||
|
var _req = req;
|
||
|
req = null; // poor man's once!
|
||
|
_req.send(page_handler);
|
||
|
}
|
||
|
|
||
|
function page_handler (e, data) {
|
||
|
if (e) return stream.destroy(e);
|
||
|
data.Contents.forEach((obj) => {
|
||
|
stream.push(fn(obj));
|
||
|
});
|
||
|
|
||
|
var nextPage = this.hasNextPage() ? this.nextPage() : null;
|
||
|
if (nextPage) nextPage.send(page_handler);
|
||
|
else stream.push(null);
|
||
|
}
|
||
|
}
|
||
|
|