@nos-sdk/nos-node-sdk
Version:
NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。
138 lines • 5.78 kB
JavaScript
;
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