Skip to content

Commit

Permalink
feat: support multiversion api (#784)
Browse files Browse the repository at this point in the history
* fix: _unSupportBrowserTip (#755)

* fix: checkBucketName bug (#749)

* feat: image processing (#744)

close #676

* feat: putBucketWebsite support new parameter (#736)

* feat: support for the latest putBucketLifecycle api features (#757)

* feat: signatureUrl support trafficLimit (#756)

* feat(node): bucket policy (#751)

* test: getBucketTags/getObjectTagging/calculatePostSignature (#739)

* test: getBucketTags/getObjectTagging/calculatePostSignature

* fix: trafficLimit error

* chore: browserify close  debug (#759)

* fix: add successStatus (#762)

* fix: checkBucketName bug (#763)

* fix: add CORS for server-side-encryption

* chore: bump 6.6.0

* fix: proto.put TypeError text (#771)

* refactor: replace is.blob & is.file with isBlob & isFile (#776)

* feat: multiversion (#750)

* chore: bump 6.8.0-beta

* refactor: multiversion (#781)

* fix: browser端,去除没有使用的 sha256.js 文件 (#780)

* chore: change and delete the bucket used for test (#783)

* fix: putBucketWebsite testting (#785)

* chore: fix test case

Co-authored-by: 冷若霜寒 <912881342@qq.com>
Co-authored-by: microJ <microJ@users.noreply.github.com>
  • Loading branch information
3 people committed May 12, 2020
1 parent fed2ba7 commit 2de5afc
Show file tree
Hide file tree
Showing 43 changed files with 2,662 additions and 1,034 deletions.
335 changes: 327 additions & 8 deletions README.md

Large diffs are not rendered by default.

1,271 changes: 765 additions & 506 deletions dist/aliyun-oss-sdk.js

Large diffs are not rendered by default.

30 changes: 15 additions & 15 deletions dist/aliyun-oss-sdk.min.js

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions lib/browser/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ merge(proto, require('../common/bucket/getBucketLifecycle'));
merge(proto, require('../common/bucket/putBucketLifecycle'));
merge(proto, require('../common/bucket/deleteBucketLifecycle'));

// multiversion
merge(proto, require('../common/bucket/putBucketVersioning'));
merge(proto, require('../common/bucket/getBucketVersioning'));

// multipart upload
merge(proto, require('./managed-upload'));
Expand Down
21 changes: 7 additions & 14 deletions lib/browser/managed-upload.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ const util = require('util');
const path = require('path');
const mime = require('mime');
const copy = require('copy-to');
const isBlob = require('../common/utils/isBlob');
const isFile = require('../common/utils/isFile');

const proto = exports;

Expand Down Expand Up @@ -39,9 +41,9 @@ proto.multipartUpload = async function multipartUpload(name, file, options) {
const minPartSize = 100 * 1024;

if (!options.mime) {
if (is.file(file)) {
if (isFile(file)) {
options.mime = mime.getType(path.extname(file.name));
} else if (is.blob(file)) {
} else if (isBlob(file)) {
options.mime = file.type;
} else {
options.mime = mime.getType(path.extname(file));
Expand Down Expand Up @@ -202,22 +204,13 @@ proto._resumeMultipart = async function _resumeMultipart(checkpoint, options) {
return await this.completeMultipartUpload(name, uploadId, internalDoneParts, options);
};


is.file = function file(obj) {
return typeof (File) !== 'undefined' && obj instanceof File;
};

is.blob = function (blob) {
return typeof (Blob) !== 'undefined' && blob instanceof Blob;
};

/**
* Get file size
*/
proto._getFileSize = async function _getFileSize(file) {
if (is.buffer(file)) {
return file.length;
} else if (is.blob(file) || is.file(file)) {
} else if (isBlob(file) || isFile(file)) {
return file.size;
}

Expand Down Expand Up @@ -287,7 +280,7 @@ WebFileReadStream.prototype._read = function _read(size) {
};

proto._createStream = function _createStream(file, start, end) {
if (is.blob(file) || is.file(file)) {
if (isBlob(file) || isFile(file)) {
return new WebFileReadStream(file.slice(start, end));
}
// else if (is.string(file)) {
Expand All @@ -310,7 +303,7 @@ proto._getPartSize = function _getPartSize(fileSize, partSize) {

return Math.max(
Math.ceil(fileSize / maxNumParts),
partSize,
partSize
);
};

Expand Down
188 changes: 15 additions & 173 deletions lib/browser/object.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ const mime = require('mime');
const callback = require('../common/callback');
const signHelper = require('../common/signUtils');
const merge = require('merge-descriptors');
const isBlob = require('../common/utils/isBlob');
const isFile = require('../common/utils/isFile');

// var assert = require('assert');

Expand Down Expand Up @@ -64,9 +66,9 @@ proto.put = async function put(name, file, options) {
name = this._objectName(name);
if (is.buffer(file)) {
content = file;
} else if (is.blob(file) || is.file(file)) {
} else if (isBlob(file) || isFile(file)) {
if (!options.mime) {
if (is.file(file)) {
if (isFile(file)) {
options.mime = mime.getType(path.extname(file.name));
} else {
options.mime = file.type;
Expand All @@ -85,7 +87,7 @@ proto.put = async function put(name, file, options) {
}
}
} else {
throw new TypeError('Must provide Buffer/Blob for put.');
throw new TypeError('Must provide Buffer/Blob/File for put.');
}

options.headers = options.headers || {};
Expand Down Expand Up @@ -154,131 +156,18 @@ proto.putStream = async function putStream(name, stream, options) {
return ret;
};

proto.head = async function head(name, options) {
const params = this._objectRequestParams('HEAD', name, options);
params.successStatuses = [200, 304];

const result = await this.request(params);

const data = {
meta: null,
res: result.res,
status: result.status
};

if (result.status === 200) {
Object.keys(result.headers).forEach((k) => {
if (k.indexOf('x-oss-meta-') === 0) {
if (!data.meta) {
data.meta = {};
}
data.meta[k.substring(11)] = result.headers[k];
}
});
}
return data;
};

proto.get = async function get(name, file, options) {
let writeStream = null;
let needDestroy = false;

if (is.writableStream(file)) {
writeStream = file;
} else if (is.string(file)) {
writeStream = fs.createWriteStream(file);
needDestroy = true;
} else {
// get(name, options)
options = file;
}

options = options || {};
if (options.process) {
options.subres = options.subres || {};
options.subres['x-oss-process'] = options.process;
}

let result;
try {
const params = this._objectRequestParams('GET', name, options);
params.writeStream = writeStream;
params.successStatuses = [200, 206, 304];

result = await this.request(params);

if (needDestroy) {
writeStream.destroy();
}
} catch (err) {
if (needDestroy) {
writeStream.destroy();
// should delete the exists file before throw error
this.debug('get error: %s, delete the exists file %s', err, file, 'error');
await this._deleteFileSafe(file);
}
throw err;
}

return {
res: result.res,
content: result.data
};
};

proto.delete = async function _delete(name, options) {
const params = this._objectRequestParams('DELETE', name, options);
params.successStatuses = [204];

const result = await this.request(params);

return {
res: result.res
};
};

proto.deleteMulti = async function deleteMulti(names, options) {
options = options || {};
let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<Delete>\n';
if (options.quiet) {
xml += ' <Quiet>true</Quiet>\n';
} else {
xml += ' <Quiet>false</Quiet>\n';
}
for (let i = 0; i < names.length; i++) {
xml += ` <Object><Key>${
utility.escape(this._objectName(names[i]))}</Key></Object>\n`;
}
xml += '</Delete>';
this.debug('delete multi objects: %s', xml, 'info');

options.subres = 'delete';
const params = this._objectRequestParams('POST', '', options);
params.mime = 'xml';
params.content = xml;
params.xmlResponse = true;
params.successStatuses = [200];
const result = await this.request(params);

const r = result.data;
let deleted = (r && r.Deleted) || null;
if (deleted) {
if (!Array.isArray(deleted)) {
deleted = [deleted];
}
deleted = deleted.map(item => item.Key);
}
return {
res: result.res,
deleted
};
};

merge(proto, require('../common/object/copyObject'));
merge(proto, require('../common/object/getObjectTagging'));
merge(proto, require('../common/object/putObjectTagging'));
merge(proto, require('../common/object/deleteObjectTagging'));
merge(proto, require('../common/image'));
merge(proto, require('../common/object/getBucketVersions'));
merge(proto, require('../common/object/getACL'));
merge(proto, require('../common/object/putACL'));
merge(proto, require('../common/object/head'));
merge(proto, require('../common/object/delete'));
merge(proto, require('../common/object/get'));

proto.putMeta = async function putMeta(name, meta, options) {
const copyResult = await this.copy(name, name, {
Expand Down Expand Up @@ -334,56 +223,6 @@ proto.list = async function list(query, options) {
};
};

/*
* Set object's ACL
* @param {String} name the object key
* @param {String} acl the object ACL
* @param {Object} options
*/
proto.putACL = async function putACL(name, acl, options) {
options = options || {};
options.subres = 'acl';
options.headers = options.headers || {};
options.headers['x-oss-object-acl'] = acl;
name = this._objectName(name);

const params = this._objectRequestParams('PUT', name, options);
params.successStatuses = [200];

const result = await this.request(params);

return {
res: result.res
};
};

/*
* Get object's ACL
* @param {String} name the object key
* @param {Object} options
* @return {Object}
*/
proto.getACL = async function getACL(name, options) {
options = options || {};
options.subres = 'acl';
name = this._objectName(name);

const params = this._objectRequestParams('GET', name, options);
params.successStatuses = [200];
params.xmlResponse = true;

const result = await this.request(params);

return {
acl: result.data.AccessControlList.Grant,
owner: {
id: result.data.Owner.ID,
displayName: result.data.Owner.DisplayName
},
res: result.res
};
};

/**
* Restore Object
* @param {String} name the object key
Expand All @@ -392,7 +231,10 @@ proto.getACL = async function getACL(name, options) {
*/
proto.restore = async function restore(name, options) {
options = options || {};
options.subres = 'restore';
options.subres = Object.assign({ restore: '' }, options.subres);
if (options.versionId) {
options.subres.versionId = options.versionId;
}
const params = this._objectRequestParams('POST', name, options);
params.successStatuses = [202];

Expand Down
2 changes: 1 addition & 1 deletion lib/browser/version.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
exports.version="6.7.0"
exports.version="6.8.0-beta"
22 changes: 22 additions & 0 deletions lib/common/bucket/getBucketVersioning.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const _checkBucketName = require('../utils/checkBucketName');

const proto = exports;
/**
* getBucketVersioning
* @param {String} bucketName - bucket name
*/

proto.getBucketVersioning = async function getBucketVersioning(bucketName, options) {
_checkBucketName(bucketName);
const params = this._bucketRequestParams('GET', bucketName, 'versioning', options);
params.xmlResponse = true;
params.successStatuses = [200];
const result = await this.request(params);

const versionStatus = result.data.Status;
return {
status: result.status,
versionStatus,
res: result.res
};
};
2 changes: 2 additions & 0 deletions lib/common/bucket/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ merge(proto, require('./deleteBucketLifecycle'));
merge(proto, require('./getBucketPolicy'));
merge(proto, require('./putBucketPolicy'));
merge(proto, require('./deleteBucketPolicy'));
merge(proto, require('./getBucketVersioning'));
merge(proto, require('./putBucketVersioning'));
10 changes: 7 additions & 3 deletions lib/common/bucket/putBucketLifecycle.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,19 @@ function checkRule(rule) {
}

if (rule.expiration) {
checkDaysAndDate(rule.expiration, 'Expiration');
if (!rule.expiration.expiredObjectDeleteMarker) {
checkDaysAndDate(rule.expiration, 'Expiration');
} else if (rule.expiration.days || rule.expiration.createdBeforeDate) {
throw new Error('expiredObjectDeleteMarker cannot be used with days or createdBeforeDate');
}
}

if (rule.abortMultipartUpload) {
checkDaysAndDate(rule.abortMultipartUpload, 'AbortMultipartUpload');
}

if (!rule.expiration && !rule.abortMultipartUpload && !rule.transition) {
throw new Error('Rule must includes expiration or abortMultipartUpload or transition');
if (!rule.expiration && !rule.abortMultipartUpload && !rule.transition && !rule.noncurrentVersionTransition) {
throw new Error('Rule must includes expiration or abortMultipartUpload or transition or noncurrentVersionTransition');
}

if (rule.tag) {
Expand Down
2 changes: 1 addition & 1 deletion lib/common/bucket/putBucketTags.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const checkTag = require('../utils/checkBucketTag');
const proto = exports;
/**
* putBucketTags
* @param {Sting} name - bucket name
* @param {String} name - bucket name
* @param {Object} tag - bucket tag, eg: `{a: "1", b: "2"}`
* @param {Object} options
*/
Expand Down
Loading

0 comments on commit 2de5afc

Please sign in to comment.