@nos-sdk/nos-node-sdk
Version:
NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。
149 lines • 4.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const crypto_1 = require("crypto");
const ramda_1 = require("ramda");
const ramda_adjunct_1 = require("ramda-adjunct");
const encodeCharCode = new Map("!'()&^~".split('').map(char => [
new RegExp(`\\${char}`, 'g'),
`%${char
.charCodeAt(0)
.toString(16)
.toUpperCase()}`,
]));
function camelCase(name) {
if (name === 'ID')
return 'id';
name = name.replace(/^[A-Z]/, m => m.toLowerCase());
name = name.replace(/[-_][a-z]/g, m => m[1].toUpperCase());
return name;
}
exports.camelCase = camelCase;
function CamelCase(name) {
if (name === 'id')
return 'ID';
name = name.replace(/^[a-z]/, m => m.toUpperCase());
name = name.replace(/[-_][a-z]/g, m => m[1].toUpperCase());
return name;
}
exports.CamelCase = CamelCase;
function kababCase(name) {
name = name.replace(/^[A-Z]/, m => m.toLowerCase());
name = name.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);
return name;
}
exports.kababCase = kababCase;
function renameObjectNameFactory(renameFunc) {
return function changeCase(obj) {
switch (ramda_1.type(obj)) {
case 'Object':
obj = ramda_adjunct_1.renameKeysWith(renameFunc, obj);
for (const [key, value] of Object.entries(obj)) {
obj[key] = changeCase(value);
}
break;
case 'Array':
for (let i = 0; i < obj.length; i++) {
obj[i] = changeCase(obj[i]);
}
obj = obj.slice(); // clone
break;
}
return obj;
};
}
exports.camelCaseObject = renameObjectNameFactory(camelCase);
exports.CamelCaseObject = renameObjectNameFactory(CamelCase);
exports.kababCaseObject = renameObjectNameFactory(kababCase);
function stream2Buffer(stream) {
const bufs = [];
return new Promise((resolve, reject) => {
stream.on('data', buf => bufs.push(buf));
stream.on('end', () => {
resolve(Buffer.concat(bufs));
});
stream.on('error', reject);
});
}
exports.stream2Buffer = stream2Buffer;
exports.addMetadataPrefix = ramda_adjunct_1.renameKeysWith(ramda_1.pipe(kababCase, ramda_1.concat('x-nos-')));
function getMetadataFromHeaders(headers) {
let keyIt = headers.keys();
const metadata = {};
let res = keyIt.next();
while (!res.done) {
const key = res.value;
if (key.startsWith('x-nos-')) {
metadata[key.slice(6)] = headers.get(key);
}
res = keyIt.next();
}
return exports.camelCaseObject(metadata);
}
exports.getMetadataFromHeaders = getMetadataFromHeaders;
function isHttpStatusOk(status) {
return status >= 200 && status < 400;
}
exports.isHttpStatusOk = isHttpStatusOk;
function md5sum(data) {
return crypto_1.createHash('md5')
.update(data)
.digest('hex');
}
exports.md5sum = md5sum;
exports.isNullOrUndefined = (a) => ramda_adjunct_1.isNull(a) || ramda_adjunct_1.isUndefined(a);
exports.compactObject = ramda_1.filter(e => !exports.isNullOrUndefined(e));
// https://www.typescriptlang.org/docs/handbook/mixins.html
function applyMixins(derivedCtor, baseCtors) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
derivedCtor.prototype[name] = baseCtor.prototype[name];
});
});
}
exports.applyMixins = applyMixins;
// decorator to add callback support of method
function Callbackable(target, key, descr) {
const fn = descr.value;
descr.value = function (...args) {
if (typeof args[args.length - 1] === 'function') {
const cb = args[args.length - 1];
fn.apply(this, args.slice(0, -1))
.then((data) => cb(null, data))
.catch((e) => cb(e, null));
return;
}
return fn.apply(this, args);
};
}
exports.Callbackable = Callbackable;
// make sure value is array
// if value is undefined or null, return []
// if value is not array, wrapper as array
// return value
function normalizeArray(value) {
if (!value) {
return [];
}
if (ramda_1.type(value) !== 'Array') {
return [value];
}
return value;
}
exports.normalizeArray = normalizeArray;
/**
* @param key
*/
function encodeKey(key) {
if (key[0] === '/' && key.length > 1) {
key = key.slice(1);
}
key = encodeURIComponent(key);
for (const [reg, str] of encodeCharCode) {
key = key.replace(reg, str);
}
// 恢复 /
key = key.replace(/%2F/g, '/');
return key;
}
exports.encodeKey = encodeKey;
//# sourceMappingURL=util.js.map