Comparing version 0.1.0 to 0.1.1
538
index.js
@@ -1,537 +0,1 @@ | ||
var fs = require('fs') | ||
var crypto = require('crypto') | ||
var http = require('http') | ||
var async = require('async') | ||
var mime = require('mime') | ||
var Stream = require('stream') | ||
function noop() {} | ||
var BCS = function (options) { | ||
options = options || {} | ||
this.accessKey = options.accessKey | ||
this.secretKey = options.secretKey | ||
this.host = options.host || 'bcs.duapp.com' | ||
this.protocol = options.protocol || 'http:' | ||
this.port = options.port || 80 | ||
this.ip = options.ip // 允许上传的ip,默认为空,即:不限制ip | ||
this.time = options.time // 有效时间 | ||
this.size = options.size // 限制上传最大字节 | ||
} | ||
/* | ||
* sign | ||
* | ||
* options: { | ||
* method:'', | ||
* bucket:'', | ||
* object:'' | ||
* } | ||
*/ | ||
BCS.prototype.generateSign = function (options) { | ||
/* | ||
* sign = Flag:AccessKey:Signature | ||
*/ | ||
var self = this | ||
// content | ||
var flag = 'MBO' | ||
var content = 'Method=' + options.method + '\n' | ||
+ 'Bucket=' + options.bucket + '\n' | ||
+ 'Object=' + options.object + '\n' | ||
if (self.time) { | ||
flag += 'T' | ||
content += 'Time=' + self.time + '\n' | ||
} | ||
if (self.ip) { | ||
flag += 'I' | ||
content += 'Ip=' + self.ip + '\n' | ||
} | ||
if (self.size) { | ||
flag += 'S' | ||
content += 'Size=' + self.size + '\n' | ||
} | ||
content = flag + '\n' + content | ||
var signature = generateSignature(self.secretKey, content) | ||
var sign = flag + ':' + self.accessKey + ':' + encodeURIComponent(signature) | ||
return sign | ||
} | ||
function generateSignature (secretKey, content) { | ||
return crypto.createHmac('sha1', secretKey).update(content).digest().toString('base64') | ||
} | ||
/* | ||
* request | ||
* | ||
* options: { | ||
* path: '', | ||
* method: '', | ||
* headers: '', | ||
* source: '' // string (file path), buffer, stream | ||
* } | ||
*/ | ||
BCS.prototype.request = function (options, callback) { | ||
options = options || {} | ||
var self = this | ||
options.host = self.host | ||
options.port = self.port | ||
if (options.path) { | ||
options.path.split('/').map(function (item) { | ||
return encodeURIComponent(item) | ||
}).join('/') | ||
} | ||
var response = {} | ||
var req = http.request(options, function (res) { | ||
response.status = res.statusCode | ||
response.headers = res.headers | ||
response.body = '' | ||
res.setEncoding('utf8') | ||
res.on('data', function (chunk) { | ||
response.body += chunk | ||
}) | ||
res.on('end', function () { | ||
if ((res.headers['content-type'] === 'application/json') && response.body) { | ||
try { | ||
response.body = JSON.parse(response.body) | ||
} catch (e) {} | ||
} | ||
callback(null, response) | ||
}) | ||
}) | ||
if (options.headers) { | ||
for (var header in options.headers) { | ||
req.setHeader(header, options.headers[header]) | ||
} | ||
} | ||
req.on('error', function (error) { | ||
callback(error, null) | ||
}) | ||
/* | ||
* body | ||
*/ | ||
if (options.source) { | ||
if (typeof options.source === 'string') { | ||
dealSourceWithFilePath(options.source) | ||
} else if (Buffer.isBuffer(options.source)) { | ||
dealSourceWithBuffer(options.source) | ||
} else if (options.source instanceof Stream) { | ||
dealSourceWithStream(options.source) | ||
} else { | ||
req.end() | ||
} | ||
} else { | ||
req.end() | ||
} | ||
function dealSourceWithFilePath(filepath) { | ||
var contentType = mime.lookup(options.source) | ||
var contentLength = 0 | ||
async.series([ | ||
function (cb) { | ||
fs.stat(filepath, function (error, stats) { | ||
if (error) { | ||
return cb(error) | ||
} | ||
contentLength = stats.size | ||
cb(null) | ||
}) | ||
} | ||
], function (error) { | ||
if (error) { | ||
return callback(error) | ||
} | ||
if (contentType && !req.getHeader('Content-Type')) { | ||
req.setHeader('Content-Type', contentType) | ||
} | ||
if (contentLength) { | ||
req.setHeader('Content-Length', contentLength) | ||
} | ||
fs.createReadStream(filepath).pipe(req) | ||
}) | ||
} | ||
function dealSourceWithBuffer(bufferSource) { | ||
var contentLength = bufferSource.length | ||
if (contentLength) { | ||
req.setHeader('Content-Length', contentLength) | ||
} | ||
req.end(bufferSource) | ||
} | ||
function dealSourceWithStream(streamSource) { | ||
streamSource.pipe(req) | ||
} | ||
} | ||
/* | ||
* put bucket | ||
* | ||
* options: { | ||
* bucket: '', | ||
* acl: '' // optional | ||
* } | ||
*/ | ||
BCS.prototype.putBucket = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
if (options.acl) { | ||
headers['x-bs-acl'] = options.acl | ||
} | ||
// path | ||
var path = '/' + options.bucket + '?sign=' + self.generateSign({ | ||
method: 'PUT', | ||
bucket: options.bucket, | ||
object: '/' | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'PUT', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* list Bucket | ||
*/ | ||
BCS.prototype.listBucket = function (callback) { | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = { | ||
'Content-Length': 0 | ||
} | ||
// path | ||
var path = '/?sign=' + self.generateSign({ | ||
method: 'GET', | ||
bucket: '', | ||
object: '/' | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'GET', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* delete Bucket | ||
*/ | ||
BCS.prototype.deleteBucket = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
if (options.acl) { | ||
headers['x-bs-acl'] = options.acl | ||
} | ||
// path | ||
var path = '/' + options.bucket + '?sign=' + self.generateSign({ | ||
method: 'DELETE', | ||
bucket: options.bucket, | ||
object: '/' | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'DELETE', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* put object | ||
* | ||
* options: { | ||
* bucket: '', | ||
* object: '', | ||
* source: '', | ||
* headers: {} // optional | ||
* } | ||
*/ | ||
BCS.prototype.putObject = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop() | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
// path | ||
var path = '/' + options.bucket + '/' + options.object + '?sign=' + self.generateSign({ | ||
method: 'PUT', | ||
bucket: options.bucket, | ||
object: '/' + options.object | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'PUT', | ||
headers: headers, | ||
source: options.source | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* copy object | ||
* | ||
* option: { | ||
* sourceBucket: '', | ||
* sourceObject: '', | ||
* bucket: '', | ||
* object: '' | ||
} | ||
*/ | ||
BCS.prototype.copyObject = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop() | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
headers['x-bs-copy-source'] = 'http://bcs.duapp.com/' + options.sourceBucket +'/' + options.sourceObject | ||
// path | ||
var path = '/' + options.bucket + '/' + options.object + '?sign=' + self.generateSign({ | ||
method: 'PUT', | ||
bucket: options.bucket, | ||
object: '/' + options.object | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'PUT', | ||
headers: headers, | ||
source: options.source | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* put superfile | ||
*/ | ||
BCS.prototype.putSuperfile = function (options, callback) { | ||
// todo...... | ||
} | ||
/* | ||
* get object | ||
*/ | ||
BCS.prototype.getObject = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop() | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
// path | ||
var path = '/' + options.bucket + '/' + options.object + '?sign=' + self.generateSign({ | ||
method: 'GET', | ||
bucket: options.bucket, | ||
object: '/' + options.object | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'GET', | ||
headers: headers, | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* head object | ||
*/ | ||
BCS.prototype.headObject = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
// path | ||
var path = '/' + options.bucket + '/' + options.object + '?sign=' + self.generateSign({ | ||
method: 'HEAD', | ||
bucket: options.bucket, | ||
object: '/' + options.object | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'HEAD', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* list object | ||
* | ||
* options: { | ||
* bucket: '' | ||
* start: 0, // optional, default: 0 | ||
* limit: 30 // optional, default: 1000 | ||
} | ||
*/ | ||
BCS.prototype.listObject = function (options, callback) { | ||
options = options || {} | ||
options.start = options.start || 0 | ||
options.limit = options.limit || 1000 | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
// path | ||
var path = '/' + options.bucket + '?sign=' + self.generateSign({ | ||
method: 'GET', | ||
bucket: options.bucket, | ||
object: '/' | ||
}) + '&start=' + options.start + '&limit=' + options.limit | ||
self.request({ | ||
path: path, | ||
method: 'GET', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* delete object | ||
*/ | ||
BCS.prototype.deleteObject = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
// path | ||
var path = '/' + options.bucket + '/' + options.object + '?sign=' + self.generateSign({ | ||
method: 'DELETE', | ||
bucket: options.bucket, | ||
object: '/' + options.object | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'DELETE', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* put acl | ||
*/ | ||
BCS.prototype.putAcl = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
headers['x-bs-acl'] = options.acl | ||
// path | ||
var path = '/' + options.bucket + '?acl=1&sign=' + self.generateSign({ | ||
method: 'PUT', | ||
bucket: options.bucket, | ||
object: '/' | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'PUT', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* get acl | ||
*/ | ||
BCS.prototype.getAcl = function (options, callback) { | ||
options = options || {} | ||
callback = callback || noop | ||
var self = this | ||
// headers | ||
var headers = options.headers || {} | ||
headers['Content-Length'] = 0 | ||
// path | ||
var path = '/' + options.bucket + '?acl=1&sign=' + self.generateSign({ | ||
method: 'GET', | ||
bucket: options.bucket, | ||
object: '/' | ||
}) | ||
self.request({ | ||
path: path, | ||
method: 'GET', | ||
headers: headers | ||
}, function (error, response) { | ||
callback(error, response) | ||
}) | ||
} | ||
/* | ||
* export | ||
*/ | ||
exports.createClient = function (options) { | ||
return new BCS(options) | ||
} | ||
module.exports = require('./lib/bcs') |
{ | ||
"name": "baidu-bcs", | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"description": "baidu bcs node.js sdk", | ||
@@ -21,3 +21,3 @@ "main": "index.js", | ||
"blanket": { | ||
"pattern": "baidu-bcs/index.js" | ||
"pattern": "baidu-bcs/lib" | ||
} | ||
@@ -32,4 +32,3 @@ }, | ||
"dependencies": { | ||
"mime": "~1.2.11", | ||
"async": "~0.2.9" | ||
"mime": "~1.2.11" | ||
}, | ||
@@ -36,0 +35,0 @@ "devDependencies": { |
106
README.md
@@ -29,4 +29,4 @@ ### baidu-bcs | ||
var bcs = BCS.createClient({ | ||
accessKey: 'your access key', | ||
secretKey: 'your secret key' | ||
accessKey: 'your access key', | ||
secretKey: 'your secret key' | ||
}) | ||
@@ -38,4 +38,4 @@ ``` | ||
bcs.putBucket({ | ||
bucket: '', | ||
acl: '' | ||
bucket: '', | ||
acl: '' | ||
}, function (error, result) {}) | ||
@@ -47,4 +47,4 @@ ``` | ||
bcs.putBucket({ | ||
bucket: '', | ||
acl: '' | ||
bucket: '', | ||
acl: '' | ||
}, function (error, result) {}) | ||
@@ -61,3 +61,3 @@ ``` | ||
bcs.deleteBucket({ | ||
bucket: '' | ||
bucket: '' | ||
}, function (error, result) {}) | ||
@@ -69,5 +69,5 @@ ``` | ||
bcs.putObject({ | ||
bucket: '', | ||
object: '', | ||
source: './index.js' | ||
bucket: '', | ||
object: '', | ||
source: './index.js' | ||
}, function (error, result) {}) | ||
@@ -80,8 +80,8 @@ ``` | ||
bcs.putObject({ | ||
bucket: '', | ||
object: '', | ||
source: new Buffer('baidu-bcs'), | ||
headers: { | ||
'Content-Type': 'text/plain' | ||
} | ||
bucket: '', | ||
object: '', | ||
source: new Buffer('baidu-bcs'), | ||
headers: { | ||
'Content-Type': 'text/plain' | ||
} | ||
}, function (error, result) {}) | ||
@@ -93,9 +93,9 @@ ``` | ||
bcs.putObject({ | ||
bucket: '', | ||
object: '', | ||
source: fs.createReadStream(__filename), | ||
headers: { | ||
'Content-Type': 'text/plain', | ||
'Content-Length': fs.statSync(__filename).size // important: the 'Content-Type' is must | ||
} | ||
bucket: '', | ||
object: '', | ||
source: fs.createReadStream(__filename), | ||
headers: { | ||
'Content-Type': 'text/plain', | ||
'Content-Length': fs.statSync(__filename).size // important: the 'Content-Type' is must | ||
} | ||
}, function (error, result) {}) | ||
@@ -111,9 +111,9 @@ ``` | ||
bcs.copyObject({ | ||
bucket: '', | ||
object: '', | ||
sourceBucket: '', | ||
sourceObject: '', | ||
headers: { | ||
'Content-Type': '' | ||
} | ||
bucket: '', | ||
object: '', | ||
sourceBucket: '', | ||
sourceObject: '', | ||
headers: { | ||
'Content-Type': '' | ||
} | ||
}, function (error, result) {}) | ||
@@ -125,4 +125,4 @@ ``` | ||
bcs.headObject({ | ||
bucket: '', | ||
object: '' | ||
bucket: '', | ||
object: '' | ||
}, function (error, result) {}) | ||
@@ -134,5 +134,5 @@ ``` | ||
bcs.listObject({ | ||
bucket: '', | ||
start: 1, | ||
limit: 1 | ||
bucket: '', | ||
start: 1, | ||
limit: 1 | ||
}, function (error, result) {}) | ||
@@ -144,11 +144,30 @@ ``` | ||
bcs.getObject({ | ||
bucket: '', | ||
object: '', | ||
bucket: '', | ||
object: '', | ||
}, function (error, result) {}) | ||
``` | ||
get object to file path | ||
```js | ||
bcs.getObject({ | ||
bucket: '', | ||
object: '', | ||
dest: './xxoo.xo' | ||
}, function (error, result) {}) | ||
``` | ||
get object to write stream | ||
```js | ||
var writeStream = fs.createWriteStream('./xxoo.xo') | ||
bcs.getObject({ | ||
bucket: '', | ||
object: '', | ||
dest: writeStream | ||
}, function (error, result) {}) | ||
``` | ||
delete bucket | ||
```js | ||
bcs.deleteBucket({ | ||
bucket: '' | ||
bucket: '' | ||
}, function (error, result) {}) | ||
@@ -160,4 +179,4 @@ ``` | ||
bcs.putAcl({ | ||
bucket: '', | ||
acl: 'private' | ||
bucket: '', | ||
acl: 'private' | ||
}, function (error, result) {}) | ||
@@ -169,3 +188,3 @@ ``` | ||
bcs.getAcl({ | ||
bucket: '' | ||
bucket: '' | ||
}, function (error, result) {}) | ||
@@ -183,2 +202,5 @@ ``` | ||
### test | ||
* coverage: 94% | ||
coverage: 94% | ||
### License | ||
MIT |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
15360
1
483
193
2
- Removedasync@~0.2.9
- Removedasync@0.2.10(transitive)