-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvoilab-object-storage.js
141 lines (120 loc) · 4.29 KB
/
voilab-object-storage.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*jslint node: true */
(function () {
'use strict';
module.exports = function (config) {
var pkgcloud = require('pkgcloud'),
fs = require('fs'),
bs = require('streamifier'),
client = pkgcloud.storage.createClient({
provider: config.provider,
username: config.username,
password: config.password,
authUrl: config.authUrl,
tenantId: config.tenantId,
domainId: config.domainId,
region: config.region,
keystoneAuthVersion: config.authVersion
}),
getUploadStream = function (remote, cb) {
var stream = client.upload({
container: config.container,
remote: remote
});
stream.on('error', function (err) {
cb(err);
});
stream.on('success', function (file) {
cb(null, '/' + file.name);
});
return stream;
},
os = {};
/**
* Upload a file on the object storage
*
* @param {String} source File source URL
* @param {String} remote File name when uploaded on the object storage
* @param {Function} callback
* @param {Function} progress
*/
os.uploadFromUri = function (source, remote, callback, progress) {
var http = require('http' + (config.ssl ? 's' : '')),
writeStream = getUploadStream(remote, callback),
req = http.get(source, function (res) {
res.on('error', function (err) {
callback(err);
});
if (progress) {
res.on('data', function (chunk) {
progress(req, res, chunk);
});
}
res.pipe(writeStream);
});
req.on('error', function (err) {
callback(err);
});
};
/**
* Upload un fichier depuis une source déposée sur le serveur vers
* le cloud
*
* @param {String} path File path
* @param {String} remote File name when uploaded on the object storage
* @param {Boolean} unlink Set true to delete source file after upload
* @param {Function} cb
* @returns {void}
*/
os.uploadFromFile = function (path, remote, unlink, cb) {
// create a stream from path
var fstream = fs.createReadStream(path);
// send it to the cloud
fstream.pipe(getUploadStream(remote, function (err, url) {
if (err) {
return cb(err);
}
// delete file if asked
if (unlink !== false) {
fs.unlink(path, function (err) {
if (err) {
return cb(err, url);
}
cb(null, url);
});
} else {
cb(null, url);
}
}));
};
/**
* Upload a file from a buffer source
*
* @param {Buffer} buffer Buffer to send to the object storage
* @param {String} remote File name when uploaded on the object storage
* @param {Function} cb
* @returns {void}
*/
os.uploadFromBuffer = function (buffer, remote, cb) {
// create a stream from buffer
var bstream = bs.createReadStream(buffer);
// send it to the cloud
bstream.pipe(getUploadStream(remote, cb));
};
/**
* Alias for retro-compatibility
*
* @type {os.uploadFromUri|*}
*/
os.upload = os.uploadFromUri;
os.getFiles = function (cb) {
client.getFiles(config.container, cb);
};
os.getFile = function (filename, cb) {
client.getFile(config.container, filename, cb);
};
os.getClient = function () {
return client;
};
return os;
};
}());