-
Notifications
You must be signed in to change notification settings - Fork 1
/
gcs.js
87 lines (74 loc) · 3.24 KB
/
gcs.js
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
80
81
82
83
84
85
86
87
'use strict';
var uuid = require('node-uuid');
var streamUtils = require('./streamUtils');
var _ = require('lodash');
var assert = require('assert');
var storage = require('@google-cloud/storage');
function _uploadToGcs(data, bucket, filename, compression, metadata, callback) {
var writeStream = bucket.file(filename).createWriteStream({metadata:metadata});
streamUtils.writeToStorageStream(data, writeStream, compression, callback);
}
module.exports.init = function(config) {
var _config = _.merge(config, {
compression: false,
extension: '.txt',
dir: '',
metadata: {contentType: 'text/plain'},
});
assert.ok(_config.project, 'Project ID is a mandary argument.');
var gcs = storage({
projectId: _config.project
});
return {
store: function(data, bucketId, dir, filename, callback) {
var callback = callback || filename || dir || bucketId;
var dir = ((typeof(dir) == 'function') || (dir === undefined)) ? _config.dir : dir;
var bucketId = ((typeof(bucketId) == 'function') || (bucketId === undefined)) ? _config.bucketId : bucketId;
var extension = _config.extension + ((_config.compression)? '.gz' : '');
var filename = ((typeof(filename) == 'function') || (filename === undefined)) ? (uuid.v4() + extension) : filename;
var path = ((dir)? (dir + '/') : '') + filename;
assert.ok(callback, 'callback missing.');
assert.ok(bucketId, 'missing bucket id');
var bucket = gcs.bucket(bucketId);
bucket.exists((err, exists) => {
if (exists) {
_uploadToGcs(data, bucket, path, _config.compression, config.metadata, () => {
callback(bucket.name + '/' + path);
});
} else {
gcs.createBucket(bucketId, function(err, bucket) {
if (!err) {
_uploadToGcs(data, bucket, path, _config.compression, config.metadata, () => {
callback(bucket.name + path);
});
} else {
console.log('Unable to create bucket');
throw Error(err);
}
});
}
});
},
retrieve: function(path, callback) {
var splitPath = path.split('/');
var bucketId = splitPath[0];
var filename = _.join(_.slice(splitPath, 1), '/');
var bucket = gcs.bucket(bucketId);
var readStream = bucket.file(filename).createReadStream();
var compression = path.endsWith('.gz');
streamUtils.readFromStorageStream(readStream, compression, function(data) {
callback(data);
});
},
delete: function(path, callback) {
var splitPath = path.split('/');
var bucketId = splitPath[0];
var filename = _.join(_.slice(splitPath, 1), '/');
var cb = callback || _.noop;
var bucket = gcs.bucket(bucketId)
bucket.file(filename).delete(function() {
cb();
});
}
}
}