all files / lib/ s3-helpers.js

84.38% Statements 27/32
58.33% Branches 7/12
100% Functions 4/4
84.38% Lines 27/32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 801×       1×   1× 645×     1× 31× 31× 31× 8×       8×   8×       8×       23× 23×                 1× 16× 56× 56× 56×           56×       56×             16×     1× 8×   8×       1×               84×    
const aws = require('aws-sdk');
 
/* Keep a global reference se we can
   override it with a mock for testing. */
let s3 = new aws.S3();
 
function getInstance() {
    return s3;
}
 
function listAllObjects(params, out = []) {
    return new Promise((resolve, reject) => {
        try {
            getInstance().listObjectsV2(params, (err, data) => {
                Iif (err) {
                    return reject(err);
                }
 
                out.push(...data.Contents);
 
                Iif (data.IsTruncated) {
                    let newParams = Object.assign(params, {ContinuationToken: data.NextContinuationToken});
                    resolve(listAllObjects(newParams, out));
                } else {
                    resolve(out);
                }
            })
        } catch (err) {
            Eif (err.code === 'ENOENT' && err.syscall === 'scandir') {
                resolve([]);
            } else {
                reject(err);
            }
        }
    });
}
 
 
function deleteEntries(bucketName, entries) {
    let p = entries.map((entry) => {
        return new Promise((resolve, reject) => {
            Eif (!entry.Key.match(/\/$/)) {
                getInstance().deleteObject(
                    {
                        Bucket: bucketName,
                        Key: entry.Key
                    },
                    (err, data) => {
                        Iif (err) {
                            return reject('Failed to remove ' + entry.Key + ': ' + err);
                        }
 
                        resolve(entry.Key);
                    }
                );
            }
        });
    });
 
    return Promise.all(p);
}
 
function clearBucket(bucketName) {
    return listAllObjects({Bucket: bucketName})
        .then((entries) => {
            return deleteEntries(bucketName, entries);
        });
}
 
module.exports = {
    listAllObjects,
    deleteEntries,
    clearBucket,
    getInstance,
 
    /* For testing only */
    __mockAPI: (mock) => {
        s3 = mock;
    }
};