@nos-sdk/nos-node-sdk
Version:
NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。
228 lines • 10.6 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const date_fns_1 = require("date-fns");
const xml = __importStar(require("fast-xml-parser"));
const fs_1 = __importDefault(require("fs"));
const querystring = __importStar(require("querystring"));
const ramda_1 = require("ramda");
const url = __importStar(require("url"));
const client_1 = require("../client");
const error_1 = require("../lib/error");
const resource_1 = require("../lib/resource");
const util_1 = require("../lib/util");
class NosClientObjectExt extends client_1.NosBaseClient {
listObject(params = {}) {
return __awaiter(this, void 0, void 0, function* () {
const { bucket, headers, resource } = this.validateParams(params);
Object.assign(resource, ramda_1.pick(['prefix', 'marker', 'delimiter'], params), util_1.compactObject({
// 不要问我为什么,文档就是用了 kabab case 我有什么办法
'max-keys': params.limit,
}));
const { listBucketResult: result } = yield this.requestBody('get', headers, resource);
const objects = util_1.normalizeArray(result.contents);
for (const obj of objects) {
obj.lastModified = date_fns_1.parse(obj.lastModified);
}
return Object.assign({}, ramda_1.pick(['isTruncated', 'nextMarker', 'prefix'], result), { bucket: result.name, commonPrefixes: util_1.normalizeArray(result.commonPrefixes), items: objects, delimiter: params.delimiter || '', limit: result.maxKeys });
});
}
putObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const { headers, resource } = this.validateParams(params);
let data;
if ('file' in params) {
data = fs_1.default.createReadStream(params.file);
}
else {
data = params.body;
}
Object.assign(headers, Object.assign({}, util_1.addMetadataPrefix(params.metadata || {})));
// TODO: check eTag
const resp = yield this.request('put', headers, resource, data);
return {
eTag: resp.headers.get('etag') || '',
};
});
}
getObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const encode = params.encode || 'stream';
const { bucket, headers, resource } = this.validateParams(params);
if (params.range) {
headers.range =
'bytes=' +
(typeof params.range === 'string' ? params.range : `${params.range.first || ''}-${params.range.last || ''}`);
}
resource_1.mergeResource(resource, ramda_1.pick(['ifNotFound'], params));
const resp = yield this._request('get', headers, resource);
if (!util_1.isHttpStatusOk(resp.status) && (params.ifNotFound && resp.status !== 404)) {
yield this.handleRequestError(resp);
}
if (encode === 'stream') {
return resp.body;
}
else if (encode === 'buffer') {
return yield util_1.stream2Buffer(resp.body);
}
else {
return (yield util_1.stream2Buffer(resp.body)).toString(encode);
}
});
}
headObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const { bucket, headers, resource } = this.validateParams(params);
if (params.ifModifiedSince) {
headers['if-modified-since'] =
typeof params.ifModifiedSince === 'string' ? params.ifModifiedSince : params.ifModifiedSince.toUTCString();
}
const resp = yield this.request('head', headers, resource);
const lastModifiedHeader = resp.headers.get('last-modified') || '';
return {
// lastModified maybe emitted from response
lastModified: date_fns_1.parse(lastModifiedHeader),
eTag: resp.headers.get('etag') || '',
contentType: resp.headers.get('content-type') || '',
metadata: util_1.getMetadataFromHeaders(resp.headers),
};
});
}
isObjectExist(params) {
return __awaiter(this, void 0, void 0, function* () {
try {
yield this.headObject(params);
return true;
}
catch (e) {
if (e instanceof error_1.NosError && e.status === 404) {
return false;
}
throw e;
}
});
}
copyObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const { resource, headers, sourceBucket } = this.validateBinaryParams(params);
headers['x-nos-copy-source'] = querystring.escape(`/${sourceBucket}/${params.sourceObjectKey}`);
yield this.requestBody('put', headers, resource);
});
}
getObjectUrl(params) {
return __awaiter(this, void 0, void 0, function* () {
const { bucket, headers, resource } = this.validateParams(params);
Object.assign(resource, {
expires: params.expires,
link: true,
});
const result = yield this.requestBody('get', headers, resource);
return url.format({
protocol: this.options.protocol,
host: `${bucket}.${this.options.host}`,
pathname: `/${params.objectKey}`,
search: '?' + result.linkParameter.replace(/&/g, '&'),
});
});
}
deleteObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const { headers, resource } = this.validateParams(params);
try {
yield this.requestBody('delete', headers, resource);
}
catch (e) {
if (e instanceof error_1.NosError && e.name === 'NoSuchKey') {
return;
}
throw e;
}
});
}
moveObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const { sourceBucket, targetBucket, headers, resource } = this.validateBinaryParams(params);
if (sourceBucket !== targetBucket) {
throw new Error('sourceBucket must be equal to targetBucket: https://www.163yun.com/help/documents/45669971175591936');
}
headers['x-nos-move-source'] = querystring.escape(`/${sourceBucket}/${params.sourceObjectKey}`);
yield this.request('put', headers, resource);
});
}
deleteMultiObject(params) {
return __awaiter(this, void 0, void 0, function* () {
const { headers, resource } = this.validateParams(params);
if (!params.objectKeys.length) {
// 如果没有要删除的元素,那么直接返回空信息
return [];
}
// TODO: check chinese objectKey
const objects = params.objectKeys.map(key => ({ key }));
const reqData = {
delete: {
quiet: true,
object: objects,
},
};
Object.assign(resource, { delete: true });
const reqString = new xml.j2xParser({}).parse(util_1.CamelCaseObject(reqData));
const result = yield this.requestBody('post', headers, resource, reqString);
return util_1.normalizeArray(result.deleteResult.error);
});
}
}
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "listObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "putObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "getObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "headObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "isObjectExist", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "copyObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "getObjectUrl", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "deleteObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "moveObject", null);
__decorate([
util_1.Callbackable
], NosClientObjectExt.prototype, "deleteMultiObject", null);
exports.NosClientObjectExt = NosClientObjectExt;
//# sourceMappingURL=object.js.map