@x5e/gink
Version:
an eventually consistent database
109 lines (104 loc) • 3.34 kB
JavaScript
/**
* Determines whether a container stores keys as any value, a muid, a muid pair,
* or not at all. Same thing for values.
*
* Valid keyType options:
* "none", "any", "pair", "muid"
*
* Valid valueType options:
* "none", "any"
*
* @param {gink.Container} container
* @returns an Array of [keyType, valueType] strings
*/
function determineContainerStorage(container) {
let keyType = "none";
let valueType = "none";
switch (container.behavior) {
case 1: // Box
valueType = "any";
break;
case 2: // Sequence
valueType = "any";
break;
case 3: // PairMap
keyType = "pair";
valueType = "any";
break;
case 4: // Directory
keyType = "any";
valueType = "any";
break;
case 5: // KeySet
keyType = "any";
break;
case 6: // Group
keyType = "muid";
break;
case 8: // PairSet
keyType = "pair";
break;
case 10: // Property
keyType = "muid";
valueType = "any";
break;
default:
throw new Error(
`Either invalid behavior or container is edge_type, or vertex, which don't have entries.`
);
}
return [keyType, valueType];
}
/**
* Interpret a key - determines whether the key needs to be converted
* to a muid, a muid array, or remain as a string/number/object.
* @param {*} key key to interpret
* @param {Container} container gink Container as context
*/
function interpretKey(key, container) {
const [keyType, valueType] = determineContainerStorage(container);
let returning;
if (keyType === "muid") {
if (typeof key === "string") {
// Ensure string key is a valid muid format
gink.ensure(key.length === 34, "Key is not a valid muid.");
returning = gink.strToMuid(key);
} else if ("timestamp" in key) returning = key;
else throw new Error("Muid key type got unexpected key");
} else if (keyType === "pair") {
gink.ensure(Array.isArray(key) && key.length === 2);
if (typeof key[0] === "string" && typeof key[1] === "string") {
// Ensure string keys are valid muid format
gink.ensure(key[0].length === 34 && key[1].length === 34);
returning = [gink.strToMuid(key[0]), gink.strToMuid(key[1])];
} else if ("timestamp" in key[0] && "timestamp" in key[1])
returning = key;
else throw new Error("Pair key type got unexpected key");
} else if (keyType === "any") {
returning = key;
} else {
throw new Error("This container doesn't use keys.");
}
return returning;
}
/**
* "Unwraps" a key or value. This is used to convert
* JavaScript objects to strings.
* @param {*} element
*/
function unwrapToString(element) {
// May want to use this for other types of elements in the future.
return JSON.stringify(element);
}
/**
* Shortens a string to its first 20 characters, followed by '...'
* @param {String} string
* @returns
*/
function shortenedString(string) {
if (string.length <= 20) {
return string;
} else {
return string.substring(0, 21) + "...";
}
}