UNPKG

@nos-sdk/nos-node-sdk

Version:

NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。

228 lines 10.6 kB
"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(/&amp;/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