veendor
Version:
a tool for stroing your npm dependencies in arbitraty storage
50 lines (40 loc) • 1.74 kB
JavaScript
const errors = require('../errors');
const getLogger = require('../logger').getLogger;
const {createCleanCacheDir} = require('./helpers');
module.exports = function pushBackends(backends, hash, config, rePull) {
const logger = getLogger();
logger.trace(`Pushing '${hash}' to backends`);
const pushingBackends = backends.filter(backend => backend.push === true);
if (pushingBackends.length === 0) {
logger.info(`No backends with push: true found. Exiting`);
}
const dirPromises = pushingBackends.map(backend => {
return createCleanCacheDir(backend);
});
return Promise.all(dirPromises)
.then((cacheDirs) => {
const pushingPromises = [];
for (const [index, backend] of pushingBackends.entries()) {
logger.info(`Pushing '${hash}' to '${backend.alias}' backend`);
if (backend.pushMayFail) {
pushingPromises.push(
backend.backend
.push(hash, backend.options, cacheDirs[index])
.catch(error => logger.warn(error))
);
} else {
pushingPromises.push(backend.backend.push(hash, backend.options, cacheDirs[index]));
}
}
return Promise.all(pushingPromises);
})
.then(result => result, error => {
if (error instanceof errors.BundleAlreadyExistsError) {
if (!rePull) {
logger.error(`Bundle '${hash}' already exists in remote repo! Re-pulling it`);
throw new errors.RePullNeeded();
}
}
throw error;
});
};