@creditkarma/memcached
Version:
A fully featured Memcached API client, supporting both single and clustered Memcached servers through consistent hashing and failover/failure. Memcached is rewrite of nMemcached, which will be deprecated in the near future.
126 lines • 4.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resultSetIsEmpty = exports.unescapeValue = exports.escapeValue = exports.merge = exports.fuse = exports.validateArg = void 0;
const crypto_1 = require("crypto");
const toString = Object.prototype.toString;
function validateArg(args, config) {
let err;
args.validate.forEach((tokens) => {
const key = tokens[0];
const value = args[key];
switch (tokens[1]) {
case Number:
if (toString.call(value) !== '[object Number]') {
err = `Argument "${key}" is not a valid Number.`;
}
break;
case Boolean:
if (toString.call(value) !== '[object Boolean]') {
err = `Argument "${key}" is not a valid Boolean.`;
}
break;
case Array:
if (toString.call(value) !== '[object Array]') {
err = `Argument "${key}" is not a valid Array.`;
}
else if (!err && key === 'key') {
for (let vKey = 0; vKey < value.length; vKey++) {
const vValue = value[vKey];
const result = validateKeySize(config, vKey, vValue);
if (result.err) {
err = result.err;
}
else {
args.command = args.command.replace(vValue, result.value);
}
}
}
break;
case Object:
if (toString.call(value) !== '[object Object]') {
err = `Argument "${key}" is not a valid Object.`;
}
break;
case Function:
if (toString.call(value) !== '[object Function]') {
err = `Argument "${key}" is not a valid Function.`;
}
break;
case String:
if (toString.call(value) !== '[object String]') {
err = `Argument "${key}" is not a valid String.`;
}
else if (!err && key === 'key') {
const result = validateKeySize(config, key, value);
if (result.err) {
err = result.err;
}
else {
args.command = args.command.replace(value, result.value);
}
}
break;
default:
if (toString.call(value) === '[object global]' && !(2 in tokens)) {
err = `Argument "${key}" is not defined.`;
}
}
});
if (err) {
if (args.callback) {
args.callback(new Error(err), undefined);
}
return false;
}
return true;
}
exports.validateArg = validateArg;
function validateKeySize(config, key, value) {
if (value.length > config.maxKeySize) {
if (config.keyCompression) {
return { err: false, value: (0, crypto_1.createHash)('md5').update(value).digest('hex') };
}
else {
return { err: `Argument "${key}" is longer than the maximum allowed length of ${config.maxKeySize}` };
}
}
else if (/[\s\n\r]/.test(value)) {
return { err: 'The key should not contain any whitespace or new lines' };
}
else {
return { err: false, value };
}
}
function fuse(target, handlers) {
for (const i in handlers) {
if (handlers.hasOwnProperty(i)) {
target.on(i, handlers[i]);
}
}
}
exports.fuse = fuse;
function merge(...objs) {
const target = {};
for (const obj of objs) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
target[key] = obj[key];
}
}
}
return target;
}
exports.merge = merge;
function escapeValue(value) {
return value.replace(/(\r|\n)/g, '\\$1');
}
exports.escapeValue = escapeValue;
function unescapeValue(value) {
return value.replace(/\\(\r|\n)/g, '$1');
}
exports.unescapeValue = unescapeValue;
function resultSetIsEmpty(resultSet) {
return !resultSet || (resultSet.length === 1 && !resultSet[0]);
}
exports.resultSetIsEmpty = resultSetIsEmpty;
//# sourceMappingURL=utils.js.map