New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

qiniu

Package Overview
Dependencies
Maintainers
1
Versions
62
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

qiniu - npm Package Compare versions

Comparing version 7.2.1 to 7.2.2

.eslintrc.js

5

CHANGELOG.md
## CHANGE LOG
## v7.2.2
- 一些log输出问题,travis增加eslint 检查
## v7.2.1

@@ -15,3 +18,3 @@ - 修复rtc获取回复存在的问题

## v7.7.7
## v7.1.7
- 修复form上传在升级mime库后的错误

@@ -18,0 +21,0 @@

2

index.d.ts

@@ -409,2 +409,4 @@ /**

const Zone_na0: conf.Zone;
//Southeast Asia
const Zone_as0: conf.Zone;
}

@@ -411,0 +413,0 @@

var libPath = process.env.QINIU_COV ? './lib-cov' : './qiniu';
module.exports = {
auth: {
digest: require(libPath + '/auth' + '/digest.js')
},
cdn: require(libPath + '/cdn.js'),
form_up: require(libPath + '/storage/form.js'),
resume_up: require(libPath + '/storage/resume.js'),
rs: require(libPath + '/storage/rs.js'),
fop: require(libPath + '/fop.js'),
conf: require(libPath + '/conf.js'),
rpc: require(libPath + '/rpc.js'),
util: require(libPath + '/util.js'),
zone: require(libPath + '/zone.js'),
app: require(libPath + '/rtc/app.js'),
room: require(libPath + '/rtc/room.js'),
Credentials: require(libPath + '/rtc/credentials.js')
}
auth: {
digest: require(libPath + '/auth' + '/digest.js')
},
cdn: require(libPath + '/cdn.js'),
form_up: require(libPath + '/storage/form.js'),
resume_up: require(libPath + '/storage/resume.js'),
rs: require(libPath + '/storage/rs.js'),
fop: require(libPath + '/fop.js'),
conf: require(libPath + '/conf.js'),
rpc: require(libPath + '/rpc.js'),
util: require(libPath + '/util.js'),
zone: require(libPath + '/zone.js'),
app: require(libPath + '/rtc/app.js'),
room: require(libPath + '/rtc/room.js'),
Credentials: require(libPath + '/rtc/credentials.js')
};
{
"name": "qiniu",
"version": "7.2.1",
"version": "7.2.2",
"description": "Node wrapper for Qiniu Resource (Cloud) Storage API",

@@ -19,3 +19,4 @@ "main": "index.js",

"threshold": 90
}
},
"lint": "./node_modules/eslint/bin/eslint.js **.js"
},

@@ -56,3 +57,3 @@ "repository": {

"engines": [
"node >= 4"
"node >= 6"
],

@@ -71,4 +72,4 @@ "dependencies": {

"blanket": "*",
"eslint": "^5.0.0-alpha.2",
"eslint-config-standard": "^12.0.0-alpha.0",
"eslint": "^5.11.1",
"eslint-config-standard": "^12.0.0",
"eslint-plugin-import": "^2.11.0",

@@ -78,5 +79,5 @@ "eslint-plugin-node": "^6.0.1",

"eslint-plugin-standard": "^3.1.0",
"mocha": "*",
"mocha": "^5.2.0",
"pedding": "*",
"should": "1.2.2",
"should": "^1.2.2",
"travis-cov": "*"

@@ -83,0 +84,0 @@ },

@@ -1,4 +0,2 @@

var url = require('url');
var conf = require('../conf');
var util = require('../util');

@@ -8,4 +6,4 @@ exports.Mac = Mac;

function Mac(accessKey, secretKey) {
this.accessKey = accessKey || conf.ACCESS_KEY;
this.secretKey = secretKey || conf.SECRET_KEY;
this.accessKey = accessKey || conf.ACCESS_KEY;
this.secretKey = secretKey || conf.SECRET_KEY;
}

@@ -11,3 +11,3 @@ const url = require('url');

function CdnManager(mac) {
this.mac = mac || new digest.Mac();
this.mac = mac || new digest.Mac();
}

@@ -22,15 +22,15 @@

CdnManager.prototype.getCdnLogList = function(domains, logDay, callbackFunc) {
var url = '/v2/tune/log/list\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
postBody = {
'day': logDay,
'domains': domains.join(';')
}
var url = '/v2/tune/log/list\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
var postBody = {
'day': logDay,
'domains': domains.join(';')
};
req('/v2/tune/log/list', headers, postBody, callbackFunc);
}
req('/v2/tune/log/list', headers, postBody, callbackFunc);
};

@@ -47,19 +47,19 @@

CdnManager.prototype.getFluxData = function(startDate, endDate, granularity,
domains,
callbackFunc) {
var url = '/v2/tune/flux\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
data = {
'startDate': startDate,
'endDate': endDate,
'granularity': granularity,
'domains': domains.join(';')
}
domains,
callbackFunc) {
var url = '/v2/tune/flux\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
var data = {
'startDate': startDate,
'endDate': endDate,
'granularity': granularity,
'domains': domains.join(';')
};
req('/v2/tune/flux', headers, data, callbackFunc);
}
req('/v2/tune/flux', headers, data, callbackFunc);
};

@@ -75,19 +75,19 @@

CdnManager.prototype.getBandwidthData = function(startDate, endDate,
granularity, domains,
callbackFunc) {
var url = '/v2/tune/bandwidth\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
data = {
'startDate': startDate,
'endDate': endDate,
'granularity': granularity,
'domains': domains.join(';')
}
granularity, domains,
callbackFunc) {
var url = '/v2/tune/bandwidth\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
var data = {
'startDate': startDate,
'endDate': endDate,
'granularity': granularity,
'domains': domains.join(';')
};
req('/v2/tune/bandwidth', headers, data, callbackFunc);
}
req('/v2/tune/bandwidth', headers, data, callbackFunc);
};

@@ -101,14 +101,14 @@

CdnManager.prototype.prefetchUrls = function(urls, callbackFunc) {
var postBody = {
urls: urls
};
var url = '/v2/tune/prefetch\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
var postBody = {
urls: urls
};
var url = '/v2/tune/prefetch\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
req('/v2/tune/prefetch', headers, postBody, callbackFunc);
}
req('/v2/tune/prefetch', headers, postBody, callbackFunc);
};

@@ -120,4 +120,4 @@

CdnManager.prototype.refreshUrls = function(urls, callbackFunc) {
this.refreshUrlsAndDirs(urls, null, callbackFunc);
}
this.refreshUrlsAndDirs(urls, null, callbackFunc);
};

@@ -130,20 +130,20 @@

CdnManager.prototype.refreshDirs = function(dirs, callbackFunc) {
this.refreshUrlsAndDirs(null, dirs, callbackFunc);
}
this.refreshUrlsAndDirs(null, dirs, callbackFunc);
};
CdnManager.prototype.refreshUrlsAndDirs = function(urls, dirs, callbackFunc) {
var postBody = {
urls: urls,
dirs: dirs,
};
var url = '/v2/tune/refresh\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
var postBody = {
urls: urls,
dirs: dirs,
};
var url = '/v2/tune/refresh\n';
var accessToken = util.generateAccessToken(this.mac, url, '');
var headers = {
'Content-Type': 'application/json',
'Authorization': accessToken,
};
req('/v2/tune/refresh', headers, postBody, callbackFunc);
}
req('/v2/tune/refresh', headers, postBody, callbackFunc);
};

@@ -153,7 +153,7 @@

function req(reqPath, header, reqBody, callbackFunc) {
urllib.request("http://fusion.qiniuapi.com" + reqPath, {
method: 'POST',
headers: header,
data: reqBody,
}, callbackFunc);
urllib.request('http://fusion.qiniuapi.com' + reqPath, {
method: 'POST',
headers: header,
data: reqBody,
}, callbackFunc);
}

@@ -170,23 +170,24 @@

CdnManager.prototype.createTimestampAntiLeechUrl = function(domain, fileName,
query, encryptKey, deadline) {
if (query != null) {
urlToSign = domain + '/' + encodeUrl(fileName) + '?' + query;
} else {
urlToSign = domain + '/' + encodeUrl(fileName);
}
query, encryptKey, deadline) {
var urlToSign;
if (query != null) {
urlToSign = domain + '/' + encodeUrl(fileName) + '?' + query;
} else {
urlToSign = domain + '/' + encodeUrl(fileName);
}
var urlObj = url.parse(urlToSign);
pathname = urlObj.pathname;
var urlObj = url.parse(urlToSign);
var pathname = urlObj.pathname;
var expireHex = deadline.toString(16);
var signedStr = encryptKey + pathname + expireHex;
var expireHex = deadline.toString(16);
var signedStr = encryptKey + pathname + expireHex;
var md5 = crypto.createHash('md5');
var toSignStr = md5.update(signedStr).digest('hex');
var md5 = crypto.createHash('md5');
var toSignStr = md5.update(signedStr).digest('hex');
if (query != null) {
return urlToSign + '&sign=' + toSignStr + '&t=' + expireHex;
} else {
return urlToSign + '?sign=' + toSignStr + '&t=' + expireHex;
}
}
if (query != null) {
return urlToSign + '&sign=' + toSignStr + '&t=' + expireHex;
} else {
return urlToSign + '?sign=' + toSignStr + '&t=' + expireHex;
}
};

@@ -1,3 +0,1 @@

const fs = require('fs');
const path = require('path');
const os = require('os');

@@ -10,5 +8,5 @@ const pkg = require('../package.json');

var defaultUserAgent = function() {
return 'QiniuNodejs/' + pkg.version + ' (' + os.type() + '; ' + os.platform() +
return 'QiniuNodejs/' + pkg.version + ' (' + os.type() + '; ' + os.platform() +
'; ' + os.arch() + '; )';
}
};

@@ -19,7 +17,8 @@ exports.USER_AGENT = defaultUserAgent();

//define api form mime type
exports.FormMimeUrl = "application/x-www-form-urlencoded";
exports.FormMimeJson = "application/json";
exports.FormMimeRaw = "application/octet-stream";
exports.RS_HOST = "http://rs.qiniu.com";
exports.FormMimeUrl = 'application/x-www-form-urlencoded';
exports.FormMimeJson = 'application/json';
exports.FormMimeRaw = 'application/octet-stream';
exports.RS_HOST = 'http://rs.qiniu.com';
exports.RPC_TIMEOUT = 120000; //120s
exports.UC_HOST = 'uc.qbox.me';

@@ -31,56 +30,56 @@ //proxy

exports.Config = function Config(options) {
options = options || {};
//use http or https protocol
this.useHttpsDomain = options.useHttpsDomain || false;
//use cdn accerlated domains
this.useCdnDomain = options.useCdnDomain || true;
//zone of the bucket
//z0 huadong, z1 huabei, z2 huanan, na0 beimei
this.zone = options.zone || null;
this.zoneExpire = options.zoneExpire || -1;
}
options = options || {};
//use http or https protocol
this.useHttpsDomain = !!(options.useHttpsDomain || false);
//use cdn accerlated domains
this.useCdnDomain = !!(options.useCdnDomain && true);
//zone of the bucket
//z0 huadong, z1 huabei, z2 huanan, na0 beimei
this.zone = options.zone || null;
this.zoneExpire = options.zoneExpire || -1;
};
exports.Zone = function(srcUpHosts, cdnUpHosts, ioHost, rsHost, rsfHost,
apiHost) {
this.srcUpHosts = srcUpHosts || {};
this.cdnUpHosts = cdnUpHosts || {};
this.ioHost = ioHost || "";
this.rsHost = rsHost || "rs.qiniu.com";
this.rsfHost = rsfHost || "rsf.qiniu.com";
this.apiHost = apiHost || "api.qiniu.com";
var dotIndex = this.ioHost.indexOf(".");
if (dotIndex != -1) {
var ioTag = this.ioHost.substring(0, dotIndex);
var zoneSepIndex = ioTag.indexOf("-");
if (zoneSepIndex != -1) {
var zoneTag = ioTag.substring(zoneSepIndex + 1);
switch (zoneTag) {
case "z1":
this.rsHost = "rs-z1.qiniu.com";
this.rsfHost = "rsf-z1.qiniu.com";
this.apiHost = "api-z1.qiniu.com";
break;
case "z2":
this.rsHost = "rs-z2.qiniu.com";
this.rsfHost = "rsf-z2.qiniu.com";
this.apiHost = "api-z2.qiniu.com";
break;
case "na0":
this.rsHost = "rs-na0.qiniu.com";
this.rsfHost = "rsf-na0.qiniu.com";
this.apiHost = "api-na0.qiniu.com";
break;
case "as0":
this.rsHost = "rs-as0.qiniu.com";
this.rsfHost = "rsf-as0.qiniu.com";
this.apiHost = "api-as0.qiniu.com";
break;
default:
this.rsHost = "rs.qiniu.com";
this.rsfHost = "rsf.qiniu.com";
this.apiHost = "api.qiniu.com";
break;
}
apiHost) {
this.srcUpHosts = srcUpHosts || {};
this.cdnUpHosts = cdnUpHosts || {};
this.ioHost = ioHost || '';
this.rsHost = rsHost || 'rs.qiniu.com';
this.rsfHost = rsfHost || 'rsf.qiniu.com';
this.apiHost = apiHost || 'api.qiniu.com';
var dotIndex = this.ioHost.indexOf('.');
if (dotIndex != -1) {
var ioTag = this.ioHost.substring(0, dotIndex);
var zoneSepIndex = ioTag.indexOf('-');
if (zoneSepIndex != -1) {
var zoneTag = ioTag.substring(zoneSepIndex + 1);
switch (zoneTag) {
case 'z1':
this.rsHost = 'rs-z1.qiniu.com';
this.rsfHost = 'rsf-z1.qiniu.com';
this.apiHost = 'api-z1.qiniu.com';
break;
case 'z2':
this.rsHost = 'rs-z2.qiniu.com';
this.rsfHost = 'rsf-z2.qiniu.com';
this.apiHost = 'api-z2.qiniu.com';
break;
case 'na0':
this.rsHost = 'rs-na0.qiniu.com';
this.rsfHost = 'rsf-na0.qiniu.com';
this.apiHost = 'api-na0.qiniu.com';
break;
case 'as0':
this.rsHost = 'rs-as0.qiniu.com';
this.rsfHost = 'rsf-as0.qiniu.com';
this.apiHost = 'api-as0.qiniu.com';
break;
default:
this.rsHost = 'rs.qiniu.com';
this.rsfHost = 'rsf.qiniu.com';
this.apiHost = 'api.qiniu.com';
break;
}
}
}
}
}
};

@@ -11,4 +11,4 @@ const util = require('./util');

function OperationManager(mac, config) {
this.mac = mac || new digest.Mac();
this.config = config || new conf.Config();
this.mac = mac || new digest.Mac();
this.config = config || new conf.Config();
}

@@ -26,59 +26,59 @@

OperationManager.prototype.pfop = function(bucket, key, fops, pipeline,
options, callbackFunc) {
options = options || {};
var that = this;
//必须参数
var reqParams = {
bucket: bucket,
key: key,
pipeline: pipeline,
fops: fops.join(";"),
};
options, callbackFunc) {
options = options || {};
var that = this;
//必须参数
var reqParams = {
bucket: bucket,
key: key,
pipeline: pipeline,
fops: fops.join(';'),
};
//notifyURL
if (options.notifyURL) {
reqParams.notifyURL = options.notifyURL;
}
//notifyURL
if (options.notifyURL) {
reqParams.notifyURL = options.notifyURL;
}
//force
if (options.force) {
reqParams.force = 1;
}
//force
if (options.force) {
reqParams.force = 1;
}
var useCache = false;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
var useCache = false;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
pfopReq(this.mac, this.config, reqParams, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
pfopReq(this.mac, this.config, reqParams, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//pfopReq
pfopReq(that.mac, that.config, reqParams, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//pfopReq
pfopReq(that.mac, that.config, reqParams, callbackFunc);
});
}
};
function pfopReq(mac, config, reqParams, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var requestURI = scheme + config.zone.apiHost + '/pfop/';
var reqBody = querystring.stringify(reqParams);
var auth = util.generateAccessToken(mac, requestURI, reqBody);
rpc.postWithForm(requestURI, reqBody, auth, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + config.zone.apiHost + '/pfop/';
var reqBody = querystring.stringify(reqParams);
var auth = util.generateAccessToken(mac, requestURI, reqBody);
rpc.postWithForm(requestURI, reqBody, auth, callbackFunc);
}

@@ -90,14 +90,14 @@

OperationManager.prototype.prefop = function(persistentId, callbackFunc) {
var apiHost = "api.qiniu.com";
if(this.config.zone) {
apiHost=this.config.zone.apiHost;
}
var apiHost = 'api.qiniu.com';
if(this.config.zone) {
apiHost=this.config.zone.apiHost;
}
var scheme = this.config.useHttpsDomain ? "https://" : "http://";
var requestURI = scheme + apiHost + "/status/get/prefop";
var reqParams = {
id: persistentId
};
var reqBody = querystring.stringify(reqParams);
rpc.postWithForm(requestURI, reqBody, null, callbackFunc);
}
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + apiHost + '/status/get/prefop';
var reqParams = {
id: persistentId
};
var reqBody = querystring.stringify(reqParams);
rpc.postWithForm(requestURI, reqBody, null, callbackFunc);
};
var urllib = require('urllib');
var util = require('./util');
var conf = require('./conf');

@@ -11,58 +10,58 @@

function postMultipart(requestURI, requestForm, callbackFunc) {
return post(requestURI, requestForm, requestForm.headers(), callbackFunc);
return post(requestURI, requestForm, requestForm.headers(), callbackFunc);
}
function postWithForm(requestURI, requestForm, token, callbackFunc) {
var headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
if (token) {
headers['Authorization'] = token;
}
return post(requestURI, requestForm, headers, callbackFunc);
var headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
if (token) {
headers['Authorization'] = token;
}
return post(requestURI, requestForm, headers, callbackFunc);
}
function postWithoutForm(requestURI, token, callbackFunc) {
var headers = {
'Content-Type': 'application/x-www-form-urlencoded',
};
if (token) {
headers['Authorization'] = token;
}
return post(requestURI, null, headers, callbackFunc);
var headers = {
'Content-Type': 'application/x-www-form-urlencoded',
};
if (token) {
headers['Authorization'] = token;
}
return post(requestURI, null, headers, callbackFunc);
}
function post(requestURI, requestForm, headers, callbackFunc) {
//var start = parseInt(Date.now() / 1000);
headers = headers || {};
headers['User-Agent'] = headers['User-Agent'] || conf.USER_AGENT;
headers['Connection'] = 'keep-alive';
//var start = parseInt(Date.now() / 1000);
headers = headers || {};
headers['User-Agent'] = headers['User-Agent'] || conf.USER_AGENT;
headers['Connection'] = 'keep-alive';
var data = {
headers: headers,
method: 'POST',
dataType: 'json',
timeout: conf.RPC_TIMEOUT,
gzip: true,
var data = {
headers: headers,
method: 'POST',
dataType: 'json',
timeout: conf.RPC_TIMEOUT,
gzip: true,
// timing: true,
};
};
if (conf.RPC_HTTP_AGENT) {
data['agent'] = conf.RPC_HTTP_AGENT;
}
if (conf.RPC_HTTP_AGENT) {
data['agent'] = conf.RPC_HTTP_AGENT;
}
if (conf.RPC_HTTPS_AGENT) {
data['httpsAgent'] = conf.RPC_HTTPS_AGENT;
}
if (conf.RPC_HTTPS_AGENT) {
data['httpsAgent'] = conf.RPC_HTTPS_AGENT;
}
if (Buffer.isBuffer(requestForm) || typeof requestForm === 'string') {
data.content = requestForm;
} else if (requestForm) {
data.stream = requestForm;
} else {
data.headers['Content-Length'] = 0;
};
if (Buffer.isBuffer(requestForm) || typeof requestForm === 'string') {
data.content = requestForm;
} else if (requestForm) {
data.stream = requestForm;
} else {
data.headers['Content-Length'] = 0;
}
var req = urllib.request(requestURI, data, function(respErr, respBody,
respInfo) {
var req = urllib.request(requestURI, data, function(respErr, respBody,
respInfo) {
//var end = parseInt(Date.now() / 1000);

@@ -77,6 +76,6 @@ // console.log((end - start) + " seconds");

callbackFunc(respErr, respBody, respInfo);
});
callbackFunc(respErr, respBody, respInfo);
});
return req;
return req;
}

@@ -1,4 +0,4 @@

var http = require('http')
var http = require('http');
const host = 'rtc.qiniuapi.com'
const host = 'rtc.qiniuapi.com';
const headers = {

@@ -27,3 +27,3 @@ 'Content-Type': 'application/json',

message: res.statusMessage
}
};
fn(result, null);

@@ -65,3 +65,3 @@ } else {

message: res.statusMessage
}
};
fn(result, null);

@@ -80,3 +80,3 @@ } else {

req.end();
};
}

@@ -92,4 +92,4 @@

};
post(credentials, options, app, fn)
}
post(credentials, options, app, fn);
};

@@ -104,4 +104,4 @@ exports.getApp = function (appId, credentials, fn) {

};
get(credentials, options, fn)
}
get(credentials, options, fn);
};

@@ -116,4 +116,4 @@ exports.deleteApp = function (appId, credentials, fn) {

};
get(credentials, options, fn)
}
get(credentials, options, fn);
};

@@ -128,4 +128,4 @@ exports.updateApp = function (appId, app, credentials, fn) {

};
post(credentials, options, app, fn)
}
post(credentials, options, app, fn);
};

@@ -13,3 +13,3 @@ var util = require('./util');

return token;
}
};

@@ -42,3 +42,3 @@ Credentials.prototype._signRequest = function(options, body) {

return sageDigest;
}
};

@@ -48,5 +48,5 @@ Credentials.prototype.sign = function(data) {

var sageDigest = util.base64ToUrlSafe(digest);
return this.accessKey + ":" + sageDigest;
return this.accessKey + ':' + sageDigest;
}
};

@@ -62,4 +62,4 @@ Credentials.prototype.signJson = function(opt) {

return token;
}
};
module.exports = exports = Credentials;

@@ -1,4 +0,4 @@

var http = require('http')
var http = require('http');
const host = 'rtc.qiniuapi.com'
const host = 'rtc.qiniuapi.com';
const headers = {

@@ -28,3 +28,3 @@ 'Content-Type': 'application/json',

message: res.statusMessage
}
};
fn(result, null);

@@ -45,38 +45,38 @@ } else {

function post(credentials, options, data, fn) {
var dataString = JSON.stringify(data);
// function post(credentials, options, data, fn) {
// var dataString = JSON.stringify(data);
options.headers['Authorization'] = credentials.generateAccessToken(options, dataString);
// options.headers['Authorization'] = credentials.generateAccessToken(options, dataString);
var req = http.request(options, function(res) {
res.setEncoding('utf-8');
// var req = http.request(options, function(res) {
// res.setEncoding('utf-8');
var responseString = '';
// var responseString = '';
res.on('data', function(data) {
responseString += data;
});
// res.on('data', function(data) {
// responseString += data;
// });
res.on('end', function() {
var resultObject = JSON.parse(responseString);
// res.on('end', function() {
// var resultObject = JSON.parse(responseString);
if (res.statusCode != 200) {
var result = {
code: res.statusCode,
message: res.statusMessage
}
fn(result, null);
} else {
fn(null, resultObject);
}
});
});
req.on('error', function(e) {
fn(e, null);
});
// if (res.statusCode != 200) {
// var result = {
// code: res.statusCode,
// message: res.statusMessage
// };
// fn(result, null);
// } else {
// fn(null, resultObject);
// }
// });
// });
// req.on('error', function(e) {
// fn(e, null);
// });
req.write(dataString);
// req.write(dataString);
req.end();
};
// req.end();
// }

@@ -92,4 +92,4 @@

};
get(credentials, options, fn)
}
get(credentials, options, fn);
};

@@ -104,4 +104,4 @@ exports.kickUser = function (appId, roomName, userId, credentials, fn) {

};
get(credentials, options, fn)
}
get(credentials, options, fn);
};

@@ -112,8 +112,8 @@ exports.listActiveRooms = function (appId, roomNamePrefix, offset, limit, credentials, fn) {

port: 80,
path: '/v3/apps/' + appId + "/rooms?prefix=" + roomNamePrefix + "&offset=" + offset + "&limit=" + limit ,
path: '/v3/apps/' + appId + '/rooms?prefix=' + roomNamePrefix + '&offset=' + offset + '&limit=' + limit ,
method: 'GET',
headers: headers
};
get(credentials, options, fn)
}
get(credentials, options, fn);
};

@@ -126,3 +126,3 @@ exports.getRoomToken = function (roomAccess, credentials) {

}
};

@@ -1,6 +0,6 @@

var crypto = require('crypto')
var crypto = require('crypto');
exports.base64ToUrlSafe = function(v) {
return v.replace(/\//g, '_').replace(/\+/g, '-');
}
};

@@ -10,3 +10,3 @@ exports.urlsafeBase64Encode = function(jsonFlags) {

return exports.base64ToUrlSafe(encoded);
}
};

@@ -17,2 +17,2 @@ exports.hmacSha1 = function(encodedFlags, secretKey) {

return hmac.digest('base64');
}
};

@@ -11,3 +11,2 @@ const conf = require('../conf');

const zone = require('../zone');
const digest = require('../auth/digest');

@@ -18,3 +17,3 @@ exports.FormUploader = FormUploader;

function FormUploader(config) {
this.config = config || new conf.Config();
this.config = config || new conf.Config();
}

@@ -29,92 +28,92 @@

function PutExtra(fname, params, mimeType, crc32, checkCrc) {
this.fname = fname || '';
this.params = params || {};
this.mimeType = mimeType || null;
this.crc32 = crc32 || null;
this.checkCrc = checkCrc || 1;
this.fname = fname || '';
this.params = params || {};
this.mimeType = mimeType || null;
this.crc32 = crc32 || null;
this.checkCrc = checkCrc || 1;
}
FormUploader.prototype.putStream = function(uploadToken, key, fsStream,
putExtra, callbackFunc) {
putExtra = putExtra || new PutExtra();
if (!putExtra.mimeType) {
putExtra.mimeType = 'application/octet-stream';
}
putExtra, callbackFunc) {
putExtra = putExtra || new PutExtra();
if (!putExtra.mimeType) {
putExtra.mimeType = 'application/octet-stream';
}
if (!putExtra.fname) {
putExtra.fname = key ? key : 'fname';
}
if (!putExtra.fname) {
putExtra.fname = key ? key : 'fname';
}
fsStream.on("error", function(err) {
fsStream.on('error', function(err) {
//callbackFunc
callbackFunc(err, null, null);
return;
});
callbackFunc(err, null, null);
return;
});
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
var accessKey = util.getAKFromUptoken(uploadToken);
var bucket = util.getBucketFromUptoken(uploadToken);
if (useCache) {
createMultipartForm(uploadToken, key, fsStream, putExtra, function(
postForm) {
putReq(that.config, postForm, callbackFunc);
});
} else {
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
var accessKey = util.getAKFromUptoken(uploadToken);
var bucket = util.getBucketFromUptoken(uploadToken);
if (useCache) {
createMultipartForm(uploadToken, key, fsStream, putExtra, function(
postForm) {
putReq(that.config, postForm, callbackFunc);
});
} else {
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
createMultipartForm(uploadToken, key, fsStream,
putExtra,
function(postForm) {
putReq(that.config, postForm, callbackFunc);
//req
createMultipartForm(uploadToken, key, fsStream,
putExtra,
function(postForm) {
putReq(that.config, postForm, callbackFunc);
});
});
});
}
}
}
};
function putReq(config, postForm, callbackFunc) {
//set up hosts order
var upHosts = [];
//set up hosts order
var upHosts = [];
if (config.useCdnDomain) {
if (config.zone.cdnUpHosts) {
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
if (config.useCdnDomain) {
if (config.zone.cdnUpHosts) {
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
}
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
} else {
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
}
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
} else {
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
}
var scheme = config.useHttpsDomain ? "https://" : "http://";
var upDomain = scheme + upHosts[0];
rpc.postMultipart(upDomain, postForm, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var upDomain = scheme + upHosts[0];
rpc.postMultipart(upDomain, postForm, callbackFunc);
}

@@ -125,41 +124,41 @@

FormUploader.prototype.put = function(uploadToken, key, body, putExtra,
callbackFunc) {
var fsStream = new Readable();
fsStream.push(body);
fsStream.push(null);
callbackFunc) {
var fsStream = new Readable();
fsStream.push(body);
fsStream.push(null);
putExtra = putExtra || new PutExtra();
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc)
}
putExtra = putExtra || new PutExtra();
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc);
};
FormUploader.prototype.putWithoutKey = function(uploadToken, body, putExtra,
callbackFunc) {
return this.put(uploadToken, null, body, putExtra, callbackFunc);
}
callbackFunc) {
return this.put(uploadToken, null, body, putExtra, callbackFunc);
};
function createMultipartForm(uploadToken, key, fsStream, putExtra, callbackFunc) {
var postForm = formstream();
postForm.field('token', uploadToken);
if (key) {
postForm.field('key', key);
}
postForm.stream('file', fsStream, putExtra.fname, putExtra.mimeType);
var postForm = formstream();
postForm.field('token', uploadToken);
if (key) {
postForm.field('key', key);
}
postForm.stream('file', fsStream, putExtra.fname, putExtra.mimeType);
//putExtra params
for (var k in putExtra.params) {
if (k.startsWith("x:")) {
postForm.field(k, putExtra.params[k].toString());
//putExtra params
for (var k in putExtra.params) {
if (k.startsWith('x:')) {
postForm.field(k, putExtra.params[k].toString());
}
}
}
var fileBody = [];
fsStream.on('data', function(data) {
fileBody.push(data);
});
var fileBody = [];
fsStream.on('data', function(data) {
fileBody.push(data);
});
fsStream.on('end', function() {
fileBody = Buffer.concat(fileBody);
var bodyCrc32 = parseInt("0x" + getCrc32(fileBody));
postForm.field('crc32', bodyCrc32);
});
callbackFunc(postForm);
fsStream.on('end', function() {
fileBody = Buffer.concat(fileBody);
var bodyCrc32 = parseInt('0x' + getCrc32(fileBody));
postForm.field('crc32', bodyCrc32);
});
callbackFunc(postForm);
}

@@ -175,20 +174,20 @@

FormUploader.prototype.putFile = function(uploadToken, key, localFile, putExtra,
callbackFunc) {
putExtra = putExtra || new PutExtra();
var fsStream = fs.createReadStream(localFile);
callbackFunc) {
putExtra = putExtra || new PutExtra();
var fsStream = fs.createReadStream(localFile);
if (!putExtra.mimeType) {
putExtra.mimeType = mime.getType(localFile);
}
if (!putExtra.mimeType) {
putExtra.mimeType = mime.getType(localFile);
}
if (!putExtra.fname) {
putExtra.fname = path.basename(localFile);
}
if (!putExtra.fname) {
putExtra.fname = path.basename(localFile);
}
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc);
}
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc);
};
FormUploader.prototype.putFileWithoutKey = function(uploadToken, localFile,
putExtra, callbackFunc) {
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc);
}
putExtra, callbackFunc) {
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc);
};

@@ -14,3 +14,3 @@ const conf = require('../conf');

function ResumeUploader(config) {
this.config = config || new conf.Config();
this.config = config || new conf.Config();
}

@@ -25,267 +25,269 @@

function PutExtra(fname, params, mimeType, resumeRecordFile, progressCallback) {
this.fname = fname || '';
this.params = params || {};
this.mimeType = mimeType || null;
this.resumeRecordFile = resumeRecordFile || null;
this.progressCallback = progressCallback || null;
this.fname = fname || '';
this.params = params || {};
this.mimeType = mimeType || null;
this.resumeRecordFile = resumeRecordFile || null;
this.progressCallback = progressCallback || null;
}
ResumeUploader.prototype.putStream = function(uploadToken, key, rsStream,
rsStreamLen, putExtra, callbackFunc) {
putExtra = putExtra || new PutExtra();
if (!putExtra.mimeType) {
putExtra.mimeType = 'application/octet-stream';
}
rsStreamLen, putExtra, callbackFunc) {
putExtra = putExtra || new PutExtra();
if (!putExtra.mimeType) {
putExtra.mimeType = 'application/octet-stream';
}
if (!putExtra.fname) {
putExtra.fname = key ? key : '?';
}
if (!putExtra.fname) {
putExtra.fname = key ? key : '?';
}
rsStream.on("error", function(err) {
rsStream.on('error', function(err) {
//callbackFunc
callbackFunc(err, null, null);
rsStream.close();
return;
});
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
var accessKey = util.getAKFromUptoken(uploadToken);
var bucket = util.getBucketFromUptoken(uploadToken);
if (useCache) {
putReq(this.config, uploadToken, key, rsStream, rsStreamLen, putExtra,
callbackFunc);
} else {
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
rsStream.close();
return;
}
});
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
//req
putReq(that.config, uploadToken, key, rsStream, rsStreamLen,
putExtra,
callbackFunc);
});
}
}
var accessKey = util.getAKFromUptoken(uploadToken);
var bucket = util.getBucketFromUptoken(uploadToken);
if (useCache) {
putReq(this.config, uploadToken, key, rsStream, rsStreamLen, putExtra,
callbackFunc);
} else {
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
rsStream.close();
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
putReq(that.config, uploadToken, key, rsStream, rsStreamLen,
putExtra,
callbackFunc);
});
}
};
function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra,
callbackFunc) {
//set up hosts order
var upHosts = [];
callbackFunc) {
//set up hosts order
var upHosts = [];
if (config.useCdnDomain) {
if (config.zone.cdnUpHosts) {
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
if (config.useCdnDomain) {
if (config.zone.cdnUpHosts) {
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
}
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
} else {
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
}
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
} else {
config.zone.srcUpHosts.forEach(function(host) {
upHosts.push(host);
});
config.zone.cdnUpHosts.forEach(function(host) {
upHosts.push(host);
});
}
var scheme = config.useHttpsDomain ? "https://" : "http://";
var upDomain = scheme + upHosts[0];
// block upload
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var upDomain = scheme + upHosts[0];
// block upload
var fileSize = rsStreamLen;
//console.log("file size:" + fileSize);
var blockCnt = fileSize / conf.BLOCK_SIZE
var totalBlockNum = (fileSize % conf.BLOCK_SIZE == 0) ? blockCnt : (blockCnt +
var fileSize = rsStreamLen;
//console.log("file size:" + fileSize);
var blockCnt = fileSize / conf.BLOCK_SIZE;
var totalBlockNum = (fileSize % conf.BLOCK_SIZE == 0) ? blockCnt : (blockCnt +
1);
var finishedBlock = 0;
var curBlock = 0;
var readLen = 0;
var bufferLen = 0;
var remainedData = new Buffer(0);
var readBuffers = [];
var finishedCtxList = [];
var finishedBlkPutRets = [];
//read resumeRecordFile
if (putExtra.resumeRecordFile) {
try {
var resumeRecords = fs.readFileSync(putExtra.resumeRecordFile).toString();
var blkputRets = JSON.parse(resumeRecords);
var finishedBlock = 0;
var curBlock = 0;
var readLen = 0;
var bufferLen = 0;
var remainedData = new Buffer(0);
var readBuffers = [];
var finishedCtxList = [];
var finishedBlkPutRets = [];
//read resumeRecordFile
if (putExtra.resumeRecordFile) {
try {
var resumeRecords = fs.readFileSync(putExtra.resumeRecordFile).toString();
var blkputRets = JSON.parse(resumeRecords);
for (var index = 0; index < blkputRets.length; index++) {
//check ctx expired or not
var blkputRet = blkputRets[index];
var expiredAt = blkputRet.expired_at;
//make sure the ctx at least has one day expiration
expiredAt += 3600 * 24;
if (util.isTimestampExpired(expiredAt)) {
//discard these ctxs
break;
for (var index = 0; index < blkputRets.length; index++) {
//check ctx expired or not
var blkputRet = blkputRets[index];
var expiredAt = blkputRet.expired_at;
//make sure the ctx at least has one day expiration
expiredAt += 3600 * 24;
if (util.isTimestampExpired(expiredAt)) {
//discard these ctxs
break;
}
finishedBlock += 1;
finishedCtxList.push(blkputRet.ctx);
}
} catch (e) {
// log(e);
}
}
finishedBlock += 1;
finishedCtxList.push(blkputRet.ctx);
}
} catch (e) {}
}
var isEnd = rsStream._readableState.ended;
var isSent = false;
var isEnd = rsStream._readableState.ended;
var isSent = false;
//check when to mkblk
rsStream.on('data', function(chunk) {
readLen += chunk.length;
bufferLen += chunk.length;
readBuffers.push(chunk);
//check when to mkblk
rsStream.on('data', function(chunk) {
readLen += chunk.length;
bufferLen += chunk.length;
readBuffers.push(chunk);
if (bufferLen >= conf.BLOCK_SIZE || readLen == fileSize) {
var readBuffersData = Buffer.concat(readBuffers);
var blockSize = conf.BLOCK_SIZE - remainedData.length;
if (bufferLen >= conf.BLOCK_SIZE || readLen == fileSize) {
var readBuffersData = Buffer.concat(readBuffers);
var blockSize = conf.BLOCK_SIZE - remainedData.length;
var postData = Buffer.concat([remainedData, readBuffersData.slice(0,blockSize)]);
remainedData = new Buffer(readBuffersData.slice(blockSize,bufferLen));
bufferLen = bufferLen - conf.BLOCK_SIZE;
//reset buffer
readBuffers = [];
var postData = Buffer.concat([remainedData, readBuffersData.slice(0,blockSize)]);
remainedData = new Buffer(readBuffersData.slice(blockSize,bufferLen));
bufferLen = bufferLen - conf.BLOCK_SIZE;
//reset buffer
readBuffers = [];
curBlock += 1; //set current block
if (curBlock > finishedBlock) {
rsStream.pause();
mkblkReq(upDomain, uploadToken, postData, function(respErr,
respBody,
respInfo) {
var bodyCrc32 = parseInt("0x" + getCrc32(postData));
if (respInfo.statusCode != 200 || respBody.crc32 != bodyCrc32) {
callbackFunc(respErr, respBody, respInfo);
rsStream.close();
return;
} else {
finishedBlock += 1;
var blkputRet = respBody;
finishedCtxList.push(blkputRet.ctx);
finishedBlkPutRets.push(blkputRet);
if (putExtra.progressCallback) {
putExtra.progressCallback(readLen, fileSize);
}
if (putExtra.resumeRecordFile) {
var contents = JSON.stringify(finishedBlkPutRets);
console.log("write resume record " + putExtra.resumeRecordFile)
fs.writeFileSync(putExtra.resumeRecordFile, contents, {
encoding: 'utf-8'
});
}
curBlock += 1; //set current block
if (curBlock > finishedBlock) {
rsStream.pause();
mkblkReq(upDomain, uploadToken, postData, function(respErr,
respBody,
respInfo) {
var bodyCrc32 = parseInt('0x' + getCrc32(postData));
if (respInfo.statusCode != 200 || respBody.crc32 != bodyCrc32) {
callbackFunc(respErr, respBody, respInfo);
rsStream.close();
return;
} else {
finishedBlock += 1;
var blkputRet = respBody;
finishedCtxList.push(blkputRet.ctx);
finishedBlkPutRets.push(blkputRet);
if (putExtra.progressCallback) {
putExtra.progressCallback(readLen, fileSize);
}
if (putExtra.resumeRecordFile) {
var contents = JSON.stringify(finishedBlkPutRets);
// console.log('write resume record ' + putExtra.resumeRecordFile);
fs.writeFileSync(putExtra.resumeRecordFile, contents, {
encoding: 'utf-8'
});
}
rsStream.resume();
if (isEnd || finishedCtxList.length === Math.floor(totalBlockNum)) {
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc);
isSent = true;
rsStream.resume();
if (isEnd || finishedCtxList.length === Math.floor(totalBlockNum)) {
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc);
isSent = true;
}
}
});
}
}
});
}
}
});
}
});
rsStream.on('end', function () {
rsStream.on('end', function () {
// 0B file won't trigger 'data' event
if (!isSent && rsStreamLen === 0) {
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc)
}
if (!isSent && rsStreamLen === 0) {
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc);
}
rsStream.close();
});
rsStream.close();
});
}
function mkblkReq(upDomain, uploadToken, blkData, callbackFunc) {
//console.log("mkblk");
var requestURI = upDomain + "/mkblk/" + blkData.length;
var auth = 'UpToken ' + uploadToken;
var headers = {
'Authorization': auth,
'Content-Type': 'application/octet-stream'
}
rpc.post(requestURI, blkData, headers, callbackFunc);
//console.log("mkblk");
var requestURI = upDomain + '/mkblk/' + blkData.length;
var auth = 'UpToken ' + uploadToken;
var headers = {
'Authorization': auth,
'Content-Type': 'application/octet-stream'
};
rpc.post(requestURI, blkData, headers, callbackFunc);
}
function mkfileReq(upDomain, uploadToken, fileSize, ctxList, key, putExtra,
callbackFunc) {
//console.log("mkfile");
var requestURI = upDomain + "/mkfile/" + fileSize;
if (key) {
requestURI += "/key/" + util.urlsafeBase64Encode(key);
}
if (putExtra.mimeType) {
requestURI += "/mimeType/" + util.urlsafeBase64Encode(putExtra.mimeType);
}
if (putExtra.fname) {
requestURI += "/fname/" + util.urlsafeBase64Encode(putExtra.fname);
}
if (putExtra.params) {
callbackFunc) {
//console.log("mkfile");
var requestURI = upDomain + '/mkfile/' + fileSize;
if (key) {
requestURI += '/key/' + util.urlsafeBase64Encode(key);
}
if (putExtra.mimeType) {
requestURI += '/mimeType/' + util.urlsafeBase64Encode(putExtra.mimeType);
}
if (putExtra.fname) {
requestURI += '/fname/' + util.urlsafeBase64Encode(putExtra.fname);
}
if (putExtra.params) {
//putExtra params
for (var k in putExtra.params) {
if (k.startsWith("x:") && putExtra.params[k]) {
requestURI += "/" + k + "/" + util.urlsafeBase64Encode(putExtra.params[
k].toString());
}
for (var k in putExtra.params) {
if (k.startsWith('x:') && putExtra.params[k]) {
requestURI += '/' + k + '/' + util.urlsafeBase64Encode(putExtra.params[
k].toString());
}
}
}
}
var auth = 'UpToken ' + uploadToken;
var headers = {
'Authorization': auth,
'Content-Type': 'application/octet-stream'
}
var postBody = ctxList.join(",");
rpc.post(requestURI, postBody, headers, function(err, ret, info) {
if (info.statusCode == 200 || info.statusCode == 701 ||
var auth = 'UpToken ' + uploadToken;
var headers = {
'Authorization': auth,
'Content-Type': 'application/octet-stream'
};
var postBody = ctxList.join(',');
rpc.post(requestURI, postBody, headers, function(err, ret, info) {
if (info.statusCode == 200 || info.statusCode == 701 ||
info.statusCode == 401) {
if (putExtra.resumeRecordFile) {
fs.unlinkSync(putExtra.resumeRecordFile);
}
}
callbackFunc(err, ret, info);
});
if (putExtra.resumeRecordFile) {
fs.unlinkSync(putExtra.resumeRecordFile);
}
}
callbackFunc(err, ret, info);
});
}
ResumeUploader.prototype.putFile = function(uploadToken, key, localFile,
putExtra, callbackFunc) {
putExtra = putExtra || new PutExtra();
var rsStream = fs.createReadStream(localFile,{
highWaterMark: conf.BLOCK_SIZE,
});
var rsStreamLen = fs.statSync(localFile).size;
if (!putExtra.mimeType) {
putExtra.mimeType = mime.getType(localFile);
}
putExtra, callbackFunc) {
putExtra = putExtra || new PutExtra();
var rsStream = fs.createReadStream(localFile,{
highWaterMark: conf.BLOCK_SIZE,
});
var rsStreamLen = fs.statSync(localFile).size;
if (!putExtra.mimeType) {
putExtra.mimeType = mime.getType(localFile);
}
if (!putExtra.fname) {
putExtra.fname = path.basename(localFile);
}
if (!putExtra.fname) {
putExtra.fname = path.basename(localFile);
}
return this.putStream(uploadToken, key, rsStream, rsStreamLen, putExtra,
callbackFunc);
}
return this.putStream(uploadToken, key, rsStream, rsStreamLen, putExtra,
callbackFunc);
};
ResumeUploader.prototype.putFileWithoutKey = function(uploadToken, localFile,
putExtra, callbackFunc) {
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc);
}
putExtra, callbackFunc) {
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc);
};

@@ -1,4 +0,1 @@

const url = require('url');
const crypto = require('crypto');
const formstream = require('formstream');
const querystring = require('querystring');

@@ -16,4 +13,4 @@ const encodeUrl = require('encodeurl');

function BucketManager(mac, config) {
this.mac = mac || new digest.Mac();
this.config = config || new conf.Config();
this.mac = mac || new digest.Mac();
this.config = config || new conf.Config();
}

@@ -27,39 +24,39 @@

BucketManager.prototype.stat = function(bucket, key, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
statReq(this.mac, this.config, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
statReq(this.mac, this.config, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
statReq(that.mac, that.config, bucket, key, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
statReq(that.mac, that.config, bucket, key, callbackFunc);
});
}
};
function statReq(mac, config, bucket, key, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var statOp = exports.statOp(bucket, key);
var requestURI = scheme + config.zone.rsHost + statOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var statOp = exports.statOp(bucket, key);
var requestURI = scheme + config.zone.rsHost + statOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -74,41 +71,41 @@

BucketManager.prototype.changeMime = function(bucket, key, newMime,
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
changeMimeReq(this.mac, this.config, bucket, key, newMime, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
changeMimeReq(this.mac, this.config, bucket, key, newMime, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
changeMimeReq(that.mac, that.config, bucket, key, newMime,
callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
changeMimeReq(that.mac, that.config, bucket, key, newMime,
callbackFunc);
});
}
};
function changeMimeReq(mac, config, bucket, key, newMime, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var changeMimeOp = exports.changeMimeOp(bucket, key, newMime);
var requestURI = scheme + config.zone.rsHost + changeMimeOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var changeMimeOp = exports.changeMimeOp(bucket, key, newMime);
var requestURI = scheme + config.zone.rsHost + changeMimeOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -124,41 +121,41 @@

BucketManager.prototype.changeHeaders = function(bucket, key, headers,
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
changeHeadersReq(this.mac, this.config, bucket, key, headers, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
changeHeadersReq(this.mac, this.config, bucket, key, headers, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
changeHeadersReq(that.mac, that.config, bucket, key, headers,
callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
changeHeadersReq(that.mac, that.config, bucket, key, headers,
callbackFunc);
});
}
};
function changeHeadersReq(mac, config, bucket, key, headers, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var changeHeadersOp = exports.changeHeadersOp(bucket, key, headers);
var requestURI = scheme + config.zone.rsHost + changeHeadersOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var changeHeadersOp = exports.changeHeadersOp(bucket, key, headers);
var requestURI = scheme + config.zone.rsHost + changeHeadersOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -176,43 +173,43 @@

BucketManager.prototype.move = function(srcBucket, srcKey, destBucket, destKey,
options, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
options, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
moveReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey,
options, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
moveReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey,
options, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
moveReq(that.mac, that.config, srcBucket, srcKey, destBucket,
destKey, options, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
moveReq(that.mac, that.config, srcBucket, srcKey, destBucket,
destKey, options, callbackFunc);
});
}
};
function moveReq(mac, config, srcBucket, srcKey, destBucket, destKey,
options, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var moveOp = exports.moveOp(srcBucket, srcKey, destBucket, destKey, options);
var requestURI = scheme + config.zone.rsHost + moveOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
options, callbackFunc) {
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var moveOp = exports.moveOp(srcBucket, srcKey, destBucket, destKey, options);
var requestURI = scheme + config.zone.rsHost + moveOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -230,44 +227,44 @@

BucketManager.prototype.copy = function(srcBucket, srcKey, destBucket, destKey,
options, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
options, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
copyReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey,
options, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
copyReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey,
options, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
copyReq(that.mac, that.config, srcBucket, srcKey, destBucket,
destKey, options, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
copyReq(that.mac, that.config, srcBucket, srcKey, destBucket,
destKey, options, callbackFunc);
});
}
};
function copyReq(mac, config, srcBucket, srcKey, destBucket, destKey,
options, callbackFunc) {
options = options || {};
var scheme = config.useHttpsDomain ? "https://" : "http://";
var copyOp = exports.copyOp(srcBucket, srcKey, destBucket, destKey, options);
var requestURI = scheme + config.zone.rsHost + copyOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
options, callbackFunc) {
options = options || {};
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var copyOp = exports.copyOp(srcBucket, srcKey, destBucket, destKey, options);
var requestURI = scheme + config.zone.rsHost + copyOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -281,39 +278,39 @@

BucketManager.prototype.delete = function(bucket, key, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
deleteReq(this.mac, this.config, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
deleteReq(this.mac, this.config, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
deleteReq(that.mac, that.config, bucket, key, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
deleteReq(that.mac, that.config, bucket, key, callbackFunc);
});
}
};
function deleteReq(mac, config, bucket, key, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var deleteOp = exports.deleteOp(bucket, key);
var requestURI = scheme + config.zone.rsHost + deleteOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var deleteOp = exports.deleteOp(bucket, key);
var requestURI = scheme + config.zone.rsHost + deleteOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -329,41 +326,41 @@

BucketManager.prototype.deleteAfterDays = function(bucket, key, days,
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
deleteAfterDaysReq(this.mac, this.config, bucket, key, days, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
deleteAfterDaysReq(this.mac, this.config, bucket, key, days, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
deleteAfterDaysReq(that.mac, that.config, bucket, key, days,
callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
deleteAfterDaysReq(that.mac, that.config, bucket, key, days,
callbackFunc);
});
}
};
function deleteAfterDaysReq(mac, config, bucket, key, days, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var deleteAfterDaysOp = exports.deleteAfterDaysOp(bucket, key, days);
var requestURI = scheme + config.zone.rsHost + deleteAfterDaysOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var deleteAfterDaysOp = exports.deleteAfterDaysOp(bucket, key, days);
var requestURI = scheme + config.zone.rsHost + deleteAfterDaysOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -378,41 +375,41 @@

BucketManager.prototype.fetch = function(resUrl, bucket, key, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
fetchReq(this.mac, this.config, resUrl, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
fetchReq(this.mac, this.config, resUrl, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
fetchReq(that.mac, that.config, resUrl, bucket, key, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
fetchReq(that.mac, that.config, resUrl, bucket, key, callbackFunc);
});
}
};
function fetchReq(mac, config, resUrl, bucket, key, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var encodedEntryURI = util.encodedEntry(bucket, key);
var encodedResURL = util.urlsafeBase64Encode(resUrl);
var requestURI = scheme + config.zone.ioHost + '/fetch/' + encodedResURL +
'/to/' + encodedEntryURI;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var encodedEntryURI = util.encodedEntry(bucket, key);
var encodedResURL = util.urlsafeBase64Encode(resUrl);
var requestURI = scheme + config.zone.ioHost + '/fetch/' + encodedResURL +
'/to/' + encodedEntryURI;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -426,39 +423,39 @@

BucketManager.prototype.prefetch = function(bucket, key, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
prefetchReq(this.mac, this.config, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
prefetchReq(this.mac, this.config, bucket, key, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
prefetchReq(that.mac, that.config, bucket, key, callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
prefetchReq(that.mac, that.config, bucket, key, callbackFunc);
});
}
};
function prefetchReq(mac, config, bucket, key, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var encodedEntryURI = util.encodedEntry(bucket, key);
var requestURI = scheme + config.zone.ioHost + '/prefetch/' + encodedEntryURI;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var encodedEntryURI = util.encodedEntry(bucket, key);
var requestURI = scheme + config.zone.ioHost + '/prefetch/' + encodedEntryURI;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -473,41 +470,41 @@

BucketManager.prototype.changeType = function(bucket, key, newType,
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
}
if (useCache) {
changeTypeReq(this.mac, this.config, bucket, key, newType, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (useCache) {
changeTypeReq(this.mac, this.config, bucket, key, newType, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
changeTypeReq(that.mac, that.config, bucket, key, newType,
callbackFunc);
});
}
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
changeTypeReq(that.mac, that.config, bucket, key, newType,
callbackFunc);
});
}
};
function changeTypeReq(mac, config, bucket, key, newType, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var changeTypeOp = exports.changeTypeOp(bucket, key, newType);
var requestURI = scheme + config.zone.rsHost + changeTypeOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var changeTypeOp = exports.changeTypeOp(bucket, key, newType);
var requestURI = scheme + config.zone.rsHost + changeTypeOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}

@@ -522,14 +519,14 @@

// @param callbackFunc(err, respBody, respInfo) 回调函数
const PU_HOST = "http://pu.qbox.me:10200";
const PU_HOST = 'http://pu.qbox.me:10200';
BucketManager.prototype.image = function(bucket, srcSiteUrl, srcHost,
callbackFunc) {
var encodedSrcSite = util.urlsafeBase64Encode(srcSiteUrl);
var requestURI = PU_HOST + "/image/" + bucket + "/from/" + encodedSrcSite;
if (srcHost) {
var encodedHost = util.urlsafeBase64Encode(srcHost);
requestURI += "/host/" + encodedHost;
}
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
callbackFunc) {
var encodedSrcSite = util.urlsafeBase64Encode(srcSiteUrl);
var requestURI = PU_HOST + '/image/' + bucket + '/from/' + encodedSrcSite;
if (srcHost) {
var encodedHost = util.urlsafeBase64Encode(srcHost);
requestURI += '/host/' + encodedHost;
}
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
};

@@ -541,6 +538,6 @@ // 取消设置空间镜像源

BucketManager.prototype.unimage = function(bucket, callbackFunc) {
var requestURI = PU_HOST + "/unimage/" + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
var requestURI = PU_HOST + '/unimage/' + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
};

@@ -558,70 +555,151 @@ // 获取指定前缀的文件列表

BucketManager.prototype.listPrefix = function(bucket, options, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
if (useCache) {
listPrefixReq(this.mac, this.config, bucket, options, callbackFunc);
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
listPrefixReq(that.mac, that.config, bucket, options, callbackFunc);
});
}
}
};
if (useCache) {
listPrefixReq(this.mac, this.config, bucket, options, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
function listPrefixReq(mac, config, bucket, options, callbackFunc) {
options = options || {};
//必须参数
var reqParams = {
bucket: bucket,
};
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
listPrefixReq(that.mac, that.config, bucket, options, callbackFunc);
});
}
if (options.prefix) {
reqParams.prefix = options.prefix;
} else {
reqParams.prefix = '';
}
if (options.limit >= 1 && options.limit <= 1000) {
reqParams.limit = options.limit;
} else {
reqParams.limit = 1000;
}
if (options.marker) {
reqParams.marker = options.marker;
} else {
reqParams.marker = '';
}
if (options.delimiter) {
reqParams.delimiter = options.delimiter;
} else {
reqParams.delimiter = '';
}
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + config.zone.rsfHost + '/list?' + reqSpec;
var auth = util.generateAccessToken(mac, requestURI, null);
rpc.postWithForm(requestURI, null, auth, callbackFunc);
}
function listPrefixReq(mac, config, bucket, options, callbackFunc) {
options = options || {};
//必须参数
var reqParams = {
bucket: bucket,
};
if (options.prefix) {
reqParams.prefix = options.prefix;
} else {
reqParams.prefix = "";
}
// 获取指定前缀的文件列表
//
// @param bucket 空间名称
// @param options 列举操作的可选参数
// prefix 列举的文件前缀
// marker 上一次列举返回的位置标记,作为本次列举的起点信息
// limit 每次返回的最大列举文件数量
// delimiter 指定目录分隔符
// @param callbackFunc(err, respBody, respInfo) - 回调函数
BucketManager.prototype.listPrefixV2 = function(bucket, options, callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
if (options.limit >= 1 && options.limit <= 1000) {
reqParams.limit = options.limit;
} else {
reqParams.limit = 1000;
}
if (useCache) {
listPrefixReqV2(this.mac, this.config, bucket, options, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
if (options.marker) {
reqParams.marker = options.marker;
} else {
reqParams.marker = "";
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
listPrefixReqV2(that.mac, that.config, bucket, options, callbackFunc);
});
}
};
if (options.delimiter) {
reqParams.delimiter = options.delimiter;
} else {
reqParams.delimiter = "";
}
function listPrefixReqV2(mac, config, bucket, options, callbackFunc) {
options = options || {};
//必须参数
var reqParams = {
bucket: bucket,
};
var scheme = config.useHttpsDomain ? "https://" : "http://";
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + config.zone.rsfHost + '/list?' + reqSpec;
if (options.prefix) {
reqParams.prefix = options.prefix;
} else {
reqParams.prefix = '';
}
var auth = util.generateAccessToken(mac, requestURI, null);
rpc.postWithForm(requestURI, null, auth, callbackFunc);
if (options.limit) {
reqParams.limit = Math.min(1000, Math.max(0, options.limit));
} else {
reqParams.limit = 0;
}
if (options.marker) {
reqParams.marker = options.marker;
} else {
reqParams.marker = '';
}
if (options.delimiter) {
reqParams.delimiter = options.delimiter;
} else {
reqParams.delimiter = '';
}
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + config.zone.rsfHost + '/v2/list?' + reqSpec;
var auth = util.generateAccessToken(mac, requestURI, null);
rpc.postWithForm(requestURI, null, auth, callbackFunc);
}

@@ -631,75 +709,75 @@

BucketManager.prototype.batch = function(operations, callbackFunc) {
var requestURI = conf.RS_HOST + "/batch";
var reqParams = {
op: operations,
};
var reqBody = querystring.stringify(reqParams);
var digest = util.generateAccessToken(this.mac, requestURI, reqBody);
rpc.postWithForm(requestURI, reqBody, digest, callbackFunc);
}
var requestURI = conf.RS_HOST + '/batch';
var reqParams = {
op: operations,
};
var reqBody = querystring.stringify(reqParams);
var digest = util.generateAccessToken(this.mac, requestURI, reqBody);
rpc.postWithForm(requestURI, reqBody, digest, callbackFunc);
};
// 批量操作支持的指令构造器
exports.statOp = function(bucket, key) {
return "/stat/" + util.encodedEntry(bucket, key);
}
return '/stat/' + util.encodedEntry(bucket, key);
};
exports.deleteOp = function(bucket, key) {
return "/delete/" + util.encodedEntry(bucket, key);
}
return '/delete/' + util.encodedEntry(bucket, key);
};
exports.deleteAfterDaysOp = function(bucket, key, days) {
var encodedEntryURI = util.encodedEntry(bucket, key);
return '/deleteAfterDays/' + encodedEntryURI + "/" + days;
}
var encodedEntryURI = util.encodedEntry(bucket, key);
return '/deleteAfterDays/' + encodedEntryURI + '/' + days;
};
exports.changeMimeOp = function(bucket, key, newMime) {
var encodedEntryURI = util.encodedEntry(bucket, key);
var encodedMime = util.urlsafeBase64Encode(newMime);
return '/chgm/' + encodedEntryURI + '/mime/' + encodedMime;
}
var encodedEntryURI = util.encodedEntry(bucket, key);
var encodedMime = util.urlsafeBase64Encode(newMime);
return '/chgm/' + encodedEntryURI + '/mime/' + encodedMime;
};
exports.changeHeadersOp = function(bucket, key, headers) {
var encodedEntryURI = util.encodedEntry(bucket, key);
var prefix = 'x-qn-meta-!';
var path = '/chgm/' + encodedEntryURI;
for (var headerKey in headers) {
var encodedValue = util.urlsafeBase64Encode(headers[headerKey]);
var prefixedHeaderKey = prefix + headerKey;
path += "/" + prefixedHeaderKey + "/" + encodedValue;
}
var encodedEntryURI = util.encodedEntry(bucket, key);
var prefix = 'x-qn-meta-!';
var path = '/chgm/' + encodedEntryURI;
for (var headerKey in headers) {
var encodedValue = util.urlsafeBase64Encode(headers[headerKey]);
var prefixedHeaderKey = prefix + headerKey;
path += '/' + prefixedHeaderKey + '/' + encodedValue;
}
return path;
}
return path;
};
exports.changeTypeOp = function(bucket, key, newType) {
var encodedEntryURI = util.encodedEntry(bucket, key);
return '/chtype/' + encodedEntryURI + '/type/' + newType;
}
var encodedEntryURI = util.encodedEntry(bucket, key);
return '/chtype/' + encodedEntryURI + '/type/' + newType;
};
exports.changeStatusOp = function(bucket, key, newStatus) {
var encodedEntryURI = util.encodedEntry(bucket, key);
return '/chstatus/' + encodedEntryURI + '/status/' + newStatus;
}
var encodedEntryURI = util.encodedEntry(bucket, key);
return '/chstatus/' + encodedEntryURI + '/status/' + newStatus;
};
exports.moveOp = function(srcBucket, srcKey, destBucket, destKey, options) {
options = options || {};
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey);
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey);
var op = "/move/" + encodedEntryURISrc + "/" + encodedEntryURIDest;
if (options.force) {
op += "/force/true";
}
return op;
}
options = options || {};
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey);
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey);
var op = '/move/' + encodedEntryURISrc + '/' + encodedEntryURIDest;
if (options.force) {
op += '/force/true';
}
return op;
};
exports.copyOp = function(srcBucket, srcKey, destBucket, destKey, options) {
options = options || {};
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey);
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey);
var op = "/copy/" + encodedEntryURISrc + "/" + encodedEntryURIDest;
if (options.force) {
op += "/force/true";
}
return op;
}
options = options || {};
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey);
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey);
var op = '/copy/' + encodedEntryURISrc + '/' + encodedEntryURIDest;
if (options.force) {
op += '/force/true';
}
return op;
};

@@ -714,16 +792,16 @@ // 空间资源下载

BucketManager.prototype.privateDownloadUrl = function(domain, fileName,
deadline) {
var baseUrl = this.publicDownloadUrl(domain, fileName);
if (baseUrl.indexOf('?') >= 0) {
baseUrl += '&e=';
} else {
baseUrl += '?e=';
}
baseUrl += deadline;
deadline) {
var baseUrl = this.publicDownloadUrl(domain, fileName);
if (baseUrl.indexOf('?') >= 0) {
baseUrl += '&e=';
} else {
baseUrl += '?e=';
}
baseUrl += deadline;
var signature = util.hmacSha1(baseUrl, this.mac.secretKey);
var encodedSign = util.base64ToUrlSafe(signature);
var downloadToken = this.mac.accessKey + ':' + encodedSign;
return baseUrl + '&token=' + downloadToken;
}
var signature = util.hmacSha1(baseUrl, this.mac.secretKey);
var encodedSign = util.base64ToUrlSafe(signature);
var downloadToken = this.mac.accessKey + ':' + encodedSign;
return baseUrl + '&token=' + downloadToken;
};

@@ -735,72 +813,548 @@ // 获取公开空间的下载链接

BucketManager.prototype.publicDownloadUrl = function(domain, fileName) {
return domain + '/' + encodeUrl(fileName);
return domain + '/' + encodeUrl(fileName);
};
// 修改文件状态
// @link https://developer.qiniu.com/kodo/api/4173/modify-the-file-status
// @param bucket 空间名称
// @param key 文件名称
// @param status 文件状态
// @param callbackFunc(err, respBody, respInfo) 回调函数
//updateObjectStatus(bucketName string, key string, status ObjectStatus, condition UpdateObjectInfoCondition)
BucketManager.prototype.updateObjectStatus = function(bucket, key, status,
callbackFunc) {
var useCache = false;
var that = this;
if (this.config.zone) {
if (this.config.zoneExpire == -1) {
useCache = true;
} else {
if (!util.isTimestampExpired(this.config.zoneExpire)) {
useCache = true;
}
}
}
if (useCache) {
updateStatusReq(this.mac, this.config, bucket, key, status, callbackFunc);
} else {
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo,
cZoneExpire) {
if (err) {
callbackFunc(err, null, null);
return;
}
//update object
that.config.zone = cZoneInfo;
that.config.zoneExpire = cZoneExpire;
//req
updateStatusReq(that.mac, that.config, bucket, key, status,
callbackFunc);
});
}
}
function updateStatusReq(mac, config, bucket, key, status, callbackFunc) {
var scheme = config.useHttpsDomain ? "https://" : "http://";
var changeStatusOp = exports.changeStatusOp(bucket, key, status);
var requestURI = scheme + config.zone.rsHost + changeStatusOp;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//列举bucket
//@link https://developer.qiniu.com/kodo/api/3926/get-service
//@param callbackFunc(err, respBody, respInfo) 回调函数
BucketManager.prototype.listBucket = function(callbackFunc) {
var requestURI = 'https://rs.qbox.me/buckets';
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//获取bucket信息
//@param bucket 空间名
//@param callbackFunc(err, respBody, respInfo) 回调函数
BucketManager.prototype.getBucketInfo = function(bucket, callbackFunc) {
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
requestURI = scheme + conf.UC_HOST + '/v2/bucketInfo?bucket=' + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//rules/add增加bucket规则
//@param bucket 空间名
//@param name: 规则名称 bucket 内唯一,长度小于50,不能为空,只能为字母、数字、下划线
//@param prefix: 同一个 bucket 里面前缀不能重复
//@param to_line_after_days: 指定文件上传多少天后转低频存储。指定为0表示不转低频存储,
// 小于0表示上传的文件立即变低频存储
//@param delete_after_days: 指定上传文件多少天后删除,指定为0表示不删除,大于0表示多少天后删除
//@param history_delete_after_days: 指定文件成为历史版本多少天后删除,指定为0表示不删除,
// 大于0表示多少天后删除
//@param history_to_line_after_days: 指定文件成为历史版本多少天后转低频存储。指定为0表示不转低频存储
BucketManager.prototype.putBucketLifecycleRule = function(bucket, options,
callbackFunc) {
PutBucketLifecycleRule(this.mac, this.config, bucket, options, callbackFunc);
}
function PutBucketLifecycleRule(mac, config, bucket, options, callbackFunc) {
options = options || {};
var reqParams = {
bucket: bucket,
name: options.name,
};
if (options.prefix) {
reqParams.prefix = options.prefix;
} else {
reqParams.prefix = '';
}
if (options.to_line_after_days) {
reqParams.to_line_after_days = options.to_line_after_days;
} else {
reqParams.to_line_after_days = 0;
}
if (options.delete_after_days) {
reqParams.delete_after_days = options.delete_after_days;
} else {
reqParams.delete_after_days = 0;
}
if (options.history_delete_after_days) {
reqParams.history_delete_after_days = options.history_delete_after_days;
} else {
reqParams.history_delete_after_days = 0;
}
if (options.history_to_line_after_days) {
reqParams.history_to_line_after_days = options.history_to_line_after_days;
} else {
reqParams.history_to_line_after_days = 0;
}
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/rules/add?' + reqSpec;
var auth = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, auth, callbackFunc);
}
//rules/delete 删除bucket规则
//@param bucket 空间名
//@param name: 规则名称 bucket 内唯一,长度小于50,不能为空,只能为字母、数字、下划线
BucketManager.prototype.deleteBucketLifecycleRule = function(bucket, name, callbackFunc) {
var reqParams = {
bucket: bucket,
name: name,
};
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/rules/delete?' + reqSpec;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//rules/update 更新bucket规则
//@param bucket 空间名
BucketManager.prototype.updateBucketLifecycleRule = function(bucket, options, callbackFunc) {
options = options || {};
var reqParams = {
bucket: bucket,
name: options.name,
};
if (options.prefix) {
reqParams.prefix = options.prefix;
}
if (options.to_line_after_days) {
reqParams.to_line_after_days = options.to_line_after_days;
}
if (options.delete_after_days) {
reqParams.delete_after_days = options.delete_after_days;
}
if (options.history_delete_after_days) {
reqParams.history_delete_after_days = options.history_delete_after_days;
}
if (options.history_to_line_after_days) {
reqParams.history_to_line_after_days = options.history_to_line_after_days;
}
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/rules/update?' + reqSpec;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//rules/get 获取bucket规则
//@param bucket 空间名
BucketManager.prototype.getBucketLifecycleRule = function(bucket, callbackFunc) {
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/rules/get?bucket=' + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//events/add 增加事件通知规则
BucketManager.prototype.putBucketEvent = function(bucket, options, callbackFunc) {
PutBucketEvent(this.mac, this.config, options, bucket, callbackFunc);
}
function PutBucketEvent(mac, config, options, bucket, callbackFunc) {
options = options || {};
var reqParams = { //必填参数
bucket: bucket,
name: options.name,
event: options.event,
callbackURL: options.callbackURL,
}
if (options.prefix) {
reqParams.prefix = options.prefix;
} else {
reqParams.prefix = '';
}
if (options.suffix) {
reqParams.suffix = options.suffix;
} else {
reqParams.suffix = '';
}
if (options.access_key) {
reqParams.access_key = options.access_key;
} else {
reqParams.access_key = '';
}
if (options.host) {
reqParams.host = options.host;
} else {
reqParams.host = '';
}
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/events/add?' + reqSpec;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//events/get 更新事件通知规则
BucketManager.prototype.updateBucketEvent = function(bucket, options, callbackFunc) {
UpdateBucketEvent(this.mac, this.config, options, bucket, callbackFunc);
}
function UpdateBucketEvent(mac, config, options, bucket, callbackFunc) {
options = options || {};
var reqParams = {
bucket: bucket,
name: options.name,
}
if (options.prefix) {
reqParams.prefix = options.prefix;
}
if (options.suffix) {
reqParams.suffix = options.suffix;
}
if (options.event) {
reqParams.event = options.event;
}
if (options.callbackURL) {
reqParams.callbackURL = options.callbackURL;
}
if (options.access_key) {
reqParams.access_key = options.access_key;
}
if (options.host) {
reqParams.host = options.host;
}
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/events/update?' + reqSpec;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//events/get 获取事件通知规则
BucketManager.prototype.getBucketEvent = function(bucket, callbackFunc) {
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/events/get?bucket=' + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//events/delete 删除事件通知规则
BucketManager.prototype.deleteBucketEvent = function(bucket, name, callbackFunc) {
var reqParams = {
bucket: bucket,
name: name,
};
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/events/delete?' + reqSpec;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//设置防盗链
//@param bucket: bucket 名
//@param mode 0: 表示关闭Referer; 1: 表示设置Referer白名单; 2: 表示设置Referer黑名单
//@param norefer 0: 表示不允许空 Refer 访问; 1: 表示允许空 Refer 访问
//@param pattern 一种为空主机头域名, 比如 foo.com; 一种是泛域名, 比如 *.bar.com;
// 一种是完全通配符, 即一个 *; 多个规则之间用;隔开
//@param source_enabled=: 源站是否支持,默认为0只给CDN配置, 设置为1表示开启源站防盗链
BucketManager.prototype.putReferAntiLeech = function(bucket, options, callbackFunc) {
PutReferAntiLeech(this.mac, this.config, bucket, options, callbackFunc);
}
function PutReferAntiLeech(mac, config, bucket, options, callbackFunc) {
options = options || {};
var reqParams = {
bucket: bucket,
};
if (options.mode) {
reqParams.mode = options.mode;
} else {
reqParams.mode = 0;
}
if (options.norefer) {
reqParams.norefer = options.norefer;
} else {
reqParams.norefer = 0;
}
if (options.pattern) {
reqParams.pattern = options.pattern;
} else {
reqParams.pattern = '*';
}
if (options.source_enabled) {
reqParams.source_enabled = options.source_enabled;
} else {
reqParams.source_enabled = 0;
}
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/referAntiLeech?' + reqSpec;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
///corsRules/set 设置bucket的cors(跨域)规则
BucketManager.prototype.putCorsRules = function(bucket, body, callbackFunc) {
PutCorsRules(this.mac, this.config, bucket, body, callbackFunc);
}
function PutCorsRules(mac, config, bucket, body, callbackFunc) {
var reqBody = JSON.stringify(body);
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/corsRules/set/' + bucket;
var auth = util.generateAccessToken(mac, requestURI, reqBody);
rpc.postWithForm(requestURI, reqBody, auth, callbackFunc);
}
///corsRules/get 获取bucket跨域
BucketManager.prototype.getCorsRules = function(bucket, callbackFunc) {
GetCorsRules(this.mac, this.config, bucket, callbackFunc);
}
function GetCorsRules(mac, config, bucket, callbackFunc) {
var scheme = config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/corsRules/get/' + bucket;
var digest = util.generateAccessToken(mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
// BucketManager.prototype.getBucketSourceConfig = function(body, callbackFunc) {
// var reqBody = JSON.stringify(body);
// console.log(reqBody);
// var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
// var requestURI = scheme + conf.UC_HOST + '/mirrorConfig/get';
// var digest = util.generateAccessTokenV2(this.mac, requestURI, 'POST', conf.FormMimeJson, reqBody);
// rpc.postWithForm(requestURI, reqBody,digest, callbackFunc);
// }
//原图保护
//@param bucket 空间名称
//@param mode 为1表示开启原图保护,0表示关闭
BucketManager.prototype.putBucketAccessStyleMode = function(bucket, mode, callbackFunc) {
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/accessMode/' + bucket + '/mode/' + mode;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//设置Bucket的cache-control: max-age属性
//@param maxAge:为0或者负数表示为默认值(31536000)
BucketManager.prototype.putBucketMaxAge = function(bucket, options, callbackFunc) {
var max_age = options.maxAge;
if (max_age <= 0) {
max_age = 31536000;
}
var reqParams = {
bucket: bucket,
maxAge: max_age,
};
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/maxAge?' + reqSpec;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//设置Bucket私有属性
//@param private为0表示公开,为1表示私有
BucketManager.prototype.putBucketAccessMode = function(bucket, options, callbackFunc) {
options = options || {};
var reqParams = {
bucket: bucket,
};
if (options.private) {
reqParams.private = options.private;
} else {
reqParams.private = 0;
}
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = querystring.stringify(reqParams);
var requestURI = scheme + conf.UC_HOST + '/private?' + reqSpec;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//设置配额
//@param bucket: 空间名称,不支持授权空间
//@param size: 空间存储量配额,参数传入0或不传表示不更改当前配置,传入-1表示取消限额,新创建的空间默认没有限额。
//@param count: 空间文件数配额,参数含义同<size>
BucketManager.prototype.putBucketQuota = function(bucket, options, callbackFunc) {
options = options || {};
var reqParams = {
bucket: bucket,
};
if (options.size) {
reqParams.size = options.size;
} else {
reqParams.size = 0;
}
if (options.count) {
reqParams.count = options.count;
} else {
reqParams.count = 0;
}
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var reqSpec = `${reqParams.bucket}/size/${reqParams.size}/count/${reqParams.count}`;
var requestURI = scheme + conf.UC_HOST + '/setbucketquota/' + reqSpec;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//获取配额
//@param bucket: 空间名称,不支持授权空间
BucketManager.prototype.getBucketQuota = function(bucket, callbackFunc) {
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/getbucketquota/' + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
//获得Bucket的所有域名
//@param bucket:bucketName
BucketManager.prototype.listBucketDomains = function(bucket, callbackFunc) {
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://';
var requestURI = scheme + conf.UC_HOST + '/v3/domains?tbl=' + bucket;
var digest = util.generateAccessToken(this.mac, requestURI, null);
rpc.postWithoutForm(requestURI, digest, callbackFunc);
}
// 上传策略
// @link https://developer.qiniu.com/kodo/manual/1206/put-policy
function PutPolicy(options) {
if (typeof options !== 'object') {
throw new Error('invalid putpolicy options');
}
if (typeof options !== 'object') {
throw new Error('invalid putpolicy options');
}
this.scope = options.scope || null;
this.isPrefixalScope = options.isPrefixalScope || null;
this.expires = options.expires || 3600;
this.insertOnly = options.insertOnly || null;
this.scope = options.scope || null;
this.isPrefixalScope = options.isPrefixalScope || null;
this.expires = options.expires || 3600;
this.insertOnly = options.insertOnly || null;
this.saveKey = options.saveKey || null;
this.endUser = options.endUser || null;
this.saveKey = options.saveKey || null;
this.endUser = options.endUser || null;
this.returnUrl = options.returnUrl || null;
this.returnBody = options.returnBody || null;
this.returnUrl = options.returnUrl || null;
this.returnBody = options.returnBody || null;
this.callbackUrl = options.callbackUrl || null;
this.callbackHost = options.callbackHost || null;
this.callbackBody = options.callbackBody || null;
this.callbackBodyType = options.callbackBodyType || null;
this.callbackFetchKey = options.callbackFetchKey || null;
this.callbackUrl = options.callbackUrl || null;
this.callbackHost = options.callbackHost || null;
this.callbackBody = options.callbackBody || null;
this.callbackBodyType = options.callbackBodyType || null;
this.callbackFetchKey = options.callbackFetchKey || null;
this.persistentOps = options.persistentOps || null;
this.persistentNotifyUrl = options.persistentNotifyUrl || null;
this.persistentPipeline = options.persistentPipeline || null;
this.persistentOps = options.persistentOps || null;
this.persistentNotifyUrl = options.persistentNotifyUrl || null;
this.persistentPipeline = options.persistentPipeline || null;
this.fsizeLimit = options.fsizeLimit || null;
this.fsizeMin = options.fsizeMin || null;
this.mimeLimit = options.mimeLimit || null;
this.fsizeLimit = options.fsizeLimit || null;
this.fsizeMin = options.fsizeMin || null;
this.mimeLimit = options.mimeLimit || null;
this.detectMime = options.detectMime || null;
this.deleteAfterDays = options.deleteAfterDays || null;
this.fileType = options.fileType || null;
this.detectMime = options.detectMime || null;
this.deleteAfterDays = options.deleteAfterDays || null;
this.fileType = options.fileType || null;
}
PutPolicy.prototype.getFlags = function() {
var flags = {};
var attrs = ['scope', 'isPrefixalScope', 'insertOnly', 'saveKey', 'endUser',
'returnUrl', 'returnBody', 'callbackUrl', 'callbackHost',
'callbackBody', 'callbackBodyType', 'callbackFetchKey', 'persistentOps',
'persistentNotifyUrl', 'persistentPipeline', 'fsizeLimit', 'fsizeMin',
'detectMime', 'mimeLimit', 'deleteAfterDays', 'fileType'
];
var flags = {};
var attrs = ['scope', 'isPrefixalScope', 'insertOnly', 'saveKey', 'endUser',
'returnUrl', 'returnBody', 'callbackUrl', 'callbackHost',
'callbackBody', 'callbackBodyType', 'callbackFetchKey', 'persistentOps',
'persistentNotifyUrl', 'persistentPipeline', 'fsizeLimit', 'fsizeMin',
'detectMime', 'mimeLimit', 'deleteAfterDays', 'fileType'
];
for (var i = attrs.length - 1; i >= 0; i--) {
if (this[attrs[i]] !== null) {
flags[attrs[i]] = this[attrs[i]];
for (var i = attrs.length - 1; i >= 0; i--) {
if (this[attrs[i]] !== null) {
flags[attrs[i]] = this[attrs[i]];
}
}
}
flags['deadline'] = this.expires + Math.floor(Date.now() / 1000);
flags['deadline'] = this.expires + Math.floor(Date.now() / 1000);
return flags;
}
return flags;
};
PutPolicy.prototype.uploadToken = function(mac) {
mac = mac || new digest.Mac();
var flags = this.getFlags();
var encodedFlags = util.urlsafeBase64Encode(JSON.stringify(flags));
var encoded = util.hmacSha1(encodedFlags, mac.secretKey);
var encodedSign = util.base64ToUrlSafe(encoded);
var uploadToken = mac.accessKey + ':' + encodedSign + ':' + encodedFlags;
return uploadToken;
}
mac = mac || new digest.Mac();
var flags = this.getFlags();
var encodedFlags = util.urlsafeBase64Encode(JSON.stringify(flags));
var encoded = util.hmacSha1(encodedFlags, mac.secretKey);
var encodedSign = util.base64ToUrlSafe(encoded);
var uploadToken = mac.accessKey + ':' + encodedSign + ':' + encodedFlags;
return uploadToken;
};
var url = require('url');
var crypto = require('crypto');
var conf = require('./conf');
// Check Timestamp Expired or not
exports.isTimestampExpired = function(timestamp) {
return timestamp < parseInt(Date.now() / 1000);
}
return timestamp < parseInt(Date.now() / 1000);
};
// Encoded Entry
exports.encodedEntry = function(bucket, key) {
return exports.urlsafeBase64Encode(bucket + (key ? ':' + key : ''));
}
return exports.urlsafeBase64Encode(bucket + (key ? ':' + key : ''));
};
// Get accessKey from uptoken
exports.getAKFromUptoken = function(uploadToken) {
var sepIndex = uploadToken.indexOf(":");
return uploadToken.substring(0, sepIndex);
}
var sepIndex = uploadToken.indexOf(':');
return uploadToken.substring(0, sepIndex);
};
// Get bucket from uptoken
exports.getBucketFromUptoken = function(uploadToken) {
var sepIndex = uploadToken.lastIndexOf(":");
var encodedPutPolicy = uploadToken.substring(sepIndex + 1);
var putPolicy = exports.urlSafeBase64Decode(encodedPutPolicy);
var putPolicyObj = JSON.parse(putPolicy);
var scope = putPolicyObj.scope;
var scopeSepIndex = scope.indexOf(":");
if (scopeSepIndex == -1) {
return scope;
} else {
return scope.substring(0, scopeSepIndex);
}
}
var sepIndex = uploadToken.lastIndexOf(':');
var encodedPutPolicy = uploadToken.substring(sepIndex + 1);
var putPolicy = exports.urlSafeBase64Decode(encodedPutPolicy);
var putPolicyObj = JSON.parse(putPolicy);
var scope = putPolicyObj.scope;
var scopeSepIndex = scope.indexOf(':');
if (scopeSepIndex == -1) {
return scope;
} else {
return scope.substring(0, scopeSepIndex);
}
};
exports.base64ToUrlSafe = function(v) {
return v.replace(/\//g, '_').replace(/\+/g, '-');
}
return v.replace(/\//g, '_').replace(/\+/g, '-');
};
exports.urlSafeToBase64 = function(v) {
return v.replace(/\_/g, '/').replace(/\-/g, '+');
}
return v.replace(/_/g, '/').replace(/-/g, '+');
};
// UrlSafe Base64 Decode
exports.urlsafeBase64Encode = function(jsonFlags) {
var encoded = new Buffer(jsonFlags).toString('base64');
return exports.base64ToUrlSafe(encoded);
}
var encoded = new Buffer(jsonFlags).toString('base64');
return exports.base64ToUrlSafe(encoded);
};
// UrlSafe Base64 Decode
exports.urlSafeBase64Decode = function(fromStr) {
return new Buffer(exports.urlSafeToBase64(fromStr), 'base64').toString();
}
return new Buffer(exports.urlSafeToBase64(fromStr), 'base64').toString();
};
// Hmac-sha1 Crypt
exports.hmacSha1 = function(encodedFlags, secretKey) {
/*
/*
*return value already encoded with base64
* */
var hmac = crypto.createHmac('sha1', secretKey);
hmac.update(encodedFlags);
return hmac.digest('base64');
}
var hmac = crypto.createHmac('sha1', secretKey);
hmac.update(encodedFlags);
return hmac.digest('base64');
};

@@ -72,14 +71,14 @@ // 创建 AccessToken 凭证

exports.generateAccessToken = function(mac, requestURI, reqBody) {
var u = url.parse(requestURI);
var path = u.path;
var access = path + '\n';
var u = url.parse(requestURI);
var path = u.path;
var access = path + '\n';
if (reqBody) {
access += reqBody;
}
if (reqBody) {
access += reqBody;
}
var digest = exports.hmacSha1(access, mac.secretKey);
var safeDigest = exports.base64ToUrlSafe(digest);
return 'QBox ' + mac.accessKey + ':' + safeDigest;
}
var digest = exports.hmacSha1(access, mac.secretKey);
var safeDigest = exports.base64ToUrlSafe(digest);
return 'QBox ' + mac.accessKey + ':' + safeDigest;
};

@@ -94,37 +93,37 @@ // 创建 AccessToken 凭证

exports.generateAccessTokenV2 = function (mac, requestURI, reqMethod, reqContentType, reqBody) {
var u = url.parse(requestURI);
var path = u.path;
var query = u.query;
var host = u.host;
var port = u.port;
var u = url.parse(requestURI);
var path = u.path;
var query = u.query;
var host = u.host;
var port = u.port;
var access = reqMethod.toUpperCase() + ' ' + path;
if (query) {
access += '?' + query;
}
// add host
access += '\nHost: ' + host;
// add port
if (port) {
access += ':' + port;
}
var access = reqMethod.toUpperCase() + ' ' + path;
if (query) {
access += '?' + query;
}
// add host
access += '\nHost: ' + host;
// add port
if (port) {
access += ':' + port;
}
// add content type
if (reqContentType && (reqContentType=="application/json" || reqContentType=="application/x-www-form-urlencoded")) {
access += '\nContent-Type: ' + reqContentType;
}
// add content type
if (reqContentType && (reqContentType=='application/json' || reqContentType=='application/x-www-form-urlencoded')) {
access += '\nContent-Type: ' + reqContentType;
}
access += '\n\n';
access += '\n\n';
// add reqbody
if (reqBody) {
access += reqBody;
}
// add reqbody
if (reqBody) {
access += reqBody;
}
console.log(access);
// console.log(access);
var digest = exports.hmacSha1(access, mac.secretKey);
var safeDigest = exports.base64ToUrlSafe(digest);
return 'Qiniu ' + mac.accessKey + ':' + safeDigest;
}
var digest = exports.hmacSha1(access, mac.secretKey);
var safeDigest = exports.base64ToUrlSafe(digest);
return 'Qiniu ' + mac.accessKey + ':' + safeDigest;
};

@@ -138,4 +137,4 @@ // 校验七牛上传回调的Authorization

exports.isQiniuCallback = function(mac, requestURI, reqBody, callbackAuth) {
var auth = exports.generateAccessToken(mac, requestURI, reqBody);
return auth === callbackAuth;
}
var auth = exports.generateAccessToken(mac, requestURI, reqBody);
return auth === callbackAuth;
};

@@ -1,3 +0,3 @@

const urllib = require('urllib')
const util = require('util')
const urllib = require('urllib');
const util = require('util');
const conf = require('./conf');

@@ -10,10 +10,10 @@

'up-xs.qiniup.com',
], [
], [
'upload.qiniup.com',
'upload-nb.qiniup.com',
'upload-xs.qiniup.com',
], 'iovip.qbox.me',
'rs.qbox.me',
'rsf.qbox.me',
'api.qiniu.com');
], 'iovip.qbox.me',
'rs.qbox.me',
'rsf.qbox.me',
'api.qiniu.com');

@@ -23,8 +23,8 @@ //huabei

'up-z1.qiniup.com',
], [
], [
'upload-z1.qiniup.com',
], 'iovip-z1.qbox.me',
'rs-z1.qbox.me',
'rsf-z1.qbox.me',
'api-z1.qiniu.com');
], 'iovip-z1.qbox.me',
'rs-z1.qbox.me',
'rsf-z1.qbox.me',
'api-z1.qiniu.com');

@@ -36,10 +36,10 @@ //huanan

'up-fs.qiniup.com'
], [
], [
'upload-z2.qiniup.com',
'upload-gz.qiniup.com',
'upload-fs.qiniup.com',
], 'iovip-z2.qbox.me',
'rs-z2.qbox.me',
'rsf-z2.qbox.me',
'api-z2.qiniu.com');
], 'iovip-z2.qbox.me',
'rs-z2.qbox.me',
'rsf-z2.qbox.me',
'api-z2.qiniu.com');

@@ -50,70 +50,70 @@

'up-na0.qiniup.com',
], [
], [
'upload-na0.qiniup.com',
], 'iovip-na0.qbox.me',
'rs-na0.qbox.me',
'rsf-na0.qbox.me',
'api-na0.qiniu.com')
], 'iovip-na0.qbox.me',
'rs-na0.qbox.me',
'rsf-na0.qbox.me',
'api-na0.qiniu.com');
exports.Zone_as0 = new conf.Zone([
'up-as0.qiniup.com',
'up-as0.qiniup.com',
], [
'upload-as0.qiniup.com',
'upload-as0.qiniup.com',
], 'iovip-as0.qbox.me',
'rs-as0.qbox.me',
'rsf-as0.qbox.me',
'api-as0.qiniu.com')
'api-as0.qiniu.com');
exports.getZoneInfo = function(accessKey, bucket, callbackFunc) {
var apiAddr = util.format('https://uc.qbox.me/v2/query?ak=%s&bucket=%s',
accessKey, bucket);
urllib.request(apiAddr, function(respErr, respData, respInfo) {
if (respErr) {
callbackFunc(respErr, null, null);
return;
}
var apiAddr = util.format('https://uc.qbox.me/v2/query?ak=%s&bucket=%s',
accessKey, bucket);
urllib.request(apiAddr, function(respErr, respData, respInfo) {
if (respErr) {
callbackFunc(respErr, null, null);
return;
}
if (respInfo.statusCode != 200) {
//not ok
respErr = new Error(respInfo.statusCode + "\n" + respData);
callbackFunc(respErr, null, null);
return;
}
if (respInfo.statusCode != 200) {
//not ok
respErr = new Error(respInfo.statusCode + '\n' + respData);
callbackFunc(respErr, null, null);
return;
}
var zoneData = JSON.parse(respData);
var srcUpHosts = [];
var cdnUpHosts = [];
var zoneExpire = 0;
var zoneData = JSON.parse(respData);
var srcUpHosts = [];
var cdnUpHosts = [];
var zoneExpire = 0;
try {
zoneExpire = zoneData.ttl;
//read src hosts
zoneData.up.src.main.forEach(function(host) {
srcUpHosts.push(host);
});
if (zoneData.up.src.backup) {
zoneData.up.src.backup.forEach(function(host) {
srcUpHosts.push(host);
});
}
try {
zoneExpire = zoneData.ttl;
//read src hosts
zoneData.up.src.main.forEach(function(host) {
srcUpHosts.push(host);
});
if (zoneData.up.src.backup) {
zoneData.up.src.backup.forEach(function(host) {
srcUpHosts.push(host);
});
}
//read acc hosts
zoneData.up.acc.main.forEach(function(host) {
cdnUpHosts.push(host);
});
if (zoneData.up.acc.backup) {
zoneData.up.acc.backup.forEach(function(host) {
cdnUpHosts.push(host);
});
}
//read acc hosts
zoneData.up.acc.main.forEach(function(host) {
cdnUpHosts.push(host);
});
if (zoneData.up.acc.backup) {
zoneData.up.acc.backup.forEach(function(host) {
cdnUpHosts.push(host);
});
}
var ioHost = zoneData.io.src.main[0];
var zoneInfo = new conf.Zone(srcUpHosts, cdnUpHosts, ioHost)
callbackFunc(null, zoneInfo, zoneExpire);
} catch (e) {
callbackFunc(e, null, null);
}
});
}
var ioHost = zoneData.io.src.main[0];
var zoneInfo = new conf.Zone(srcUpHosts, cdnUpHosts, ioHost);
callbackFunc(null, zoneInfo, zoneExpire);
} catch (e) {
callbackFunc(e, null, null);
}
});
};

@@ -5,4 +5,4 @@ # Qiniu Cloud SDK for Node.js

[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE.md)
[![Build Status](https://travis-ci.org/qiniu/nodejs-sdk.v6.png?branch=master)](https://travis-ci.org/qiniu/nodejs-sdk.v6)
[![Code Climate](https://codeclimate.com/github/qiniu/nodejs-sdk.png)](https://codeclimate.com/github/qiniu/nodejs-sdk)
[![Build Status](https://travis-ci.org/qiniu/nodejs-sdk.v6.svg?branch=master)](https://travis-ci.org/qiniu/nodejs-sdk.v6)
[![Code Climate](https://codeclimate.com/github/qiniu/nodejs-sdk.svg)](https://codeclimate.com/github/qiniu/nodejs-sdk)
[![Latest Stable Version](https://img.shields.io/npm/v/qiniu.svg)](https://www.npmjs.com/package/qiniu)

@@ -9,0 +9,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc