UNPKG

@nos-sdk/nos-node-sdk

Version:

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

138 lines 5.78 kB
"use strict"; 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 __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; 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; }; Object.defineProperty(exports, "__esModule", { value: true }); const fast_xml_parser_1 = require("fast-xml-parser"); const mime_1 = __importDefault(require("mime")); const node_fetch_1 = __importDefault(require("node-fetch")); const url = __importStar(require("url")); const authorization_1 = require("./lib/authorization"); const error_1 = require("./lib/error"); const request_1 = require("./lib/request"); const resource_1 = require("./lib/resource"); const util_1 = require("./lib/util"); class NosBaseClient { constructor(options) { const parsed = url.parse(options.endpoint); this.options = Object.assign({ host: parsed.host, protocol: parsed.protocol, }, options); } /** * 底层请求方法包装 * @param method 请求方法 * @param headers 头信息 * @param resource 资源信息,也会序列化到 Url 上面 * @param [body] 请求体 * @private */ _request(method, headers, resource, body) { return __awaiter(this, void 0, void 0, function* () { headers['date'] = new Date().toUTCString(); const uri = resource_1.getResourceUri(resource); // 并不知道设置错误的 content-type 会有什么影响,但是设置了就没错 if (body) { if (typeof body === 'object' && body.constructor === Object) { body = new fast_xml_parser_1.j2xParser({}).parse(util_1.CamelCaseObject(body)); headers['content-type'] = 'application/xml;charset=UTF-8'; } else { headers['content-type'] = mime_1.default.getType(uri) || 'application/octet-stream'; } } if (body instanceof Buffer || typeof body === 'string') { headers['content-md5'] = util_1.md5sum(body); headers['content-length'] = headers['content-length'] || body.length; } const sign = authorization_1.signature(this.options.accessSecret, method, headers, resource); headers['authorization'] = `NOS ${this.options.accessKey}:${sign}`; return yield node_fetch_1.default(url.resolve(this.options.endpoint, uri), { method, headers, body, }); }); } handleRequestError(resp) { return __awaiter(this, void 0, void 0, function* () { if (!util_1.isHttpStatusOk(resp.status)) { const errObj = (yield request_1.parseBody(resp)).error || {}; errObj.status = resp.status; errObj.response = resp; throw error_1.makeNosError(errObj); } return resp; }); } request(method, headers, resource, body) { return __awaiter(this, void 0, void 0, function* () { const resp = yield this._request(method, headers, resource, body); return yield this.handleRequestError(resp); }); } requestBody(method, headers, resource, body) { return __awaiter(this, void 0, void 0, function* () { const resp = yield this.request(method, headers, resource, body); return yield request_1.parseBody(resp); }); } validateParams(params) { const bucket = params.bucket || this.options.defaultBucket; if (!bucket) { throw new error_1.NoBucketError(); } const resource = { bucket, }; if ('objectKey' in params) { resource.objectKey = util_1.encodeKey(params.objectKey); } return { bucket, resource, headers: { host: `${bucket}.${this.options.host}`, }, }; } validateBinaryParams(params) { const sourceBucket = params.sourceBucket || this.options.defaultBucket; const targetBucket = params.targetBucket || this.options.defaultBucket; if (!sourceBucket || !targetBucket) { throw new error_1.NoBucketError(); } const resource = { bucket: targetBucket, }; if ('targetObjectKey' in params) { resource.objectKey = util_1.encodeKey(params.targetObjectKey); } return { sourceBucket, targetBucket, resource, headers: { host: `${targetBucket}.${this.options.host}`, }, }; } } exports.NosBaseClient = NosBaseClient; //# sourceMappingURL=client.js.map