npmCache.on('close', onClose); return deferred.promise;
/** * Test if file exists. * @param {String} file file to test * @return {Promise} promise of the test */ const chexists = function (file) { const found = when.defer() fs.exists(file, function (exists) { return found.resolve(exists) }) return found.promise }
/** * Get resource stream. * @param {String} container Container name * @param {String} entry Resource name * @return {Promise} Promise of the resource stream */ var stream = function (container, entry) { var p = getContainerName(container, entry) var result = when.defer() logger.debug('Get stream from S3 object: %s/%s', container, entry) client.getFile(p, function (err, res) { if (err || res.statusCode !== 200) { logger.error('Error while getting S3 object: %s', p, err || res) result.reject('ES3STREAM') } else { result.resolve(res) } }) return result.promise }
/** * Get a local copy of the file. * @param {String} container Container name * @param {String} entry Resource name * @return {Promise} Promise of the local file path */ var localCopy = function (container, entry) { var localPath = files.chpath('tmp', 's3', container) logger.debug('Copy S3 object to local disk: %s/%s', container, entry) return files.chmkdir(localPath) .then(function () { return stream(container, entry) }) .then(function (res) { const localFile = fs.createWriteStream(files.chpath(localPath, entry)) const result = when.defer() res.pipe(localFile) res.on('end', function () { result.resolve(files.chpath(localPath, entry)) }) localFile.on('error', result.reject) return result.promise }) }
/** * Make directories recusively (mkdir -p) * @param {String} p Full directory path * @returns {Promise} A promise with direcory path as parameter */ const mkdirs = function (p) { const created = when.defer() fs.exists(p, function (exists) { if (exists) { return created.resolve(p, true) } const ps = path.normalize(p).split('/') mkdirs(ps.slice(0, -1).join('/')).then(function (/* p */) { logger.debug('Create directory: %s', p) nodefn.call(fs.mkdir, p, '0755').then(function () { created.resolve(p) }, created.reject) }, created.reject) }) return created.promise }
/** * Store resource into a container. * @param {String} container Container name * @param {String} entry Resource name * @param {String} s Resource stream * @param {Object} options Resource options (type, size, etc) * @return {Promise} Promise of the action */ var store = function (container, entry, s, options) { var p = getContainerName(container, entry) logger.debug('Store S3 object: %s/%s', container, entry) var result = when.defer() var req = client.put(p, options) s.pipe(req) req.on('response', function (res) { if (res.statusCode === 200) { return result.resolve(p) } else { logger.error('Error while storing S3 object: %s [%d]', p, res.statusCode) // console.log(res) return result.reject('ES3STORE') } }) return result.promise }
const prepare = (callback) => { const deferred = when.defer() if (typeof (callback) === 'function') { return { callback: function (error, res, body) { if (error || res.statusCode >= 400) { callback(error || errorMessage(res.statusCode, body)) return } callback(null, body) } } } else { return { promise: deferred.promise, callback: function (error, res, body) { if (error || res.statusCode >= 400) { deferred.reject(error || errorMessage(res.statusCode, body)) return } deferred.resolve(body) } } } }
/** * Get resource infos. * @param {String} container Container name * @param {String} entry Resource name * @return {Promise} Promise of the resource infos */ var info = function (container, entry) { var p = getContainerName(container, entry) var result = when.defer() logger.debug('Get meta info from S3 object: %s/%s', container, entry) client.head(p).on('response', function (res) { if (res.statusCode === 200) { var infos = { driver: 's3', size: res.headers['content-length'], type: res.headers['content-type'], mtime: new Date(res.headers.date), path: p, container: container, key: entry } logger.debug('Get meta info from S3 object: %s/%s', container, entry, infos) return result.resolve(infos) } else { logger.error('Error while getting meta info from S3 object: %s', p, res) result.reject(res.body) } }).end() return result.promise }
}) return thumbnailed.promise })
}) return thumbnailed.promise })
return result.promise
return writed.promise
/** * Remove resource. * @param {String} container Container name * @param {String} entry Resource name * @return {Promise} Promise of the action */ var remove = function (container, entry) { var p = getContainerName(container, entry) var result = when.defer() logger.debug('Remove S3 object: %s/%s', container, entry) client.del(p).on('response', function (res) { if (res.statusCode === 200) { result.resolve() } else { logger.error('Error while removing S3 object: %s/%s', container, entry, res) return result.reject('ES3REMOVE') } }).end() return result.promise }