@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
129 lines (110 loc) • 3.63 kB
JavaScript
/*
* files.js: Instance methods for working with files from Google Cloud Storage
*
* (C) 2012 Charlie Robbins, Ken Perkins, Ross Kukulinski & the Contributors.
*
*/
var pkgcloud = require('../../../../../lib/pkgcloud'),
through = require('through2'),
storage = pkgcloud.providers.google.storage,
_ = require('underscore');
/**
* Destroy a file in the specified container.
*
* @param {string} container - Name of the container to destroy the file in.
* @param {string} file - Name of the file to destroy.
* @param {function} callback - Continuation to respond to when complete.
*/
exports.removeFile = function (container, file, callback) {
var bucket = this._getBucket(container),
file = this._getFile(bucket, file);
file.delete(function(err) {
return err
? callback(err)
: callback(null, true);
});
};
/**
* Upload a file to the specified bucket.
*
* @param {object} options - Configuration object.
* @param {object} options.container - Container object for the file.
* @param {object|string} options.file - The file to upload content to.
* @return {stream}
*/
exports.upload = function (options) {
var self = this,
bucket = this._getBucket(options),
file = this._getFile(bucket, options);
// check for deprecated calling with a callback
if (typeof arguments[arguments.length - 1] === 'function') {
self.emit('log::warn', 'storage.upload no longer supports calling with a callback');
}
var proxyStream = through(),
writableStream = file.createWriteStream();
// we need a proxy stream so we can always return a file model
// via the 'success' event
writableStream.on('complete', function() {
proxyStream.emit('success', new storage.File(self, file));
});
writableStream.on('error', function(err) {
proxyStream.emit('error', err);
});
writableStream.on('data', function(chunk) {
proxyStream.emit('data', chunk);
});
proxyStream.pipe(writableStream);
return proxyStream;
};
/**
* Download a file from the specified bucket.
*
* @param {object} options - Configuration object.
* @param {object} options.container - Container object for the file.
* @param {object|string} options.file - The file to upload content to.
* @return {stream}
*/
exports.download = function (options) {
var bucket = this._getBucket(options),
file = this._getFile(bucket, options);
return file.createReadStream(options);
};
exports.getFile = function (container, file, callback) {
var self = this,
bucket = this._getBucket(container),
file = this._getFile(bucket, file);
file.getMetadata(function(err, data) {
return err
? callback(err)
: callback(null, new storage.File(self, _.extend({ metadata: data }, {
container: container
})));
});
};
/**
* Get all of the files from a gcloud bucket.
*
* @param {object} container - Container object for the file.
* @param {object=|function} options - Options or callback.
* @param {string} options.maxResults - Maximum amount of results to fetch.
* @param {function} callback - Continuation to respond to when complete.
*/
exports.getFiles = function (container, options, callback) {
var self = this,
bucket = this._getBucket(container);
if (typeof options === 'function') {
callback = options;
options = {};
}
else if (!options) {
options = {};
}
bucket.getFiles(options, function(err, files, nextQuery) {
return err
? callback(err)
: callback(null, files.map(function (file) {
file.container = container;
return new storage.File(self, file);
}), nextQuery);
});
};