@x5e/gink
Version:
an eventually consistent database
100 lines • 4.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.construct = construct;
exports.interpret = interpret;
exports.toJson = toJson;
const Container_1 = require("./Container");
const Directory_1 = require("./Directory");
const Sequence_1 = require("./Sequence");
const Box_1 = require("./Box");
const Group_1 = require("./Group");
const PairSet_1 = require("./PairSet");
const PairMap_1 = require("./PairMap");
const KeySet_1 = require("./KeySet");
const Database_1 = require("./Database");
const utils_1 = require("./utils");
const builders_1 = require("./builders");
const Property_1 = require("./Property");
const Vertex_1 = require("./Vertex");
const EdgeType_1 = require("./EdgeType");
const Accumulator_1 = require("./Accumulator");
// TODO: maybe make address the first argument, and then database second and optional
async function construct(address, database, containerBuilder) {
if (database === undefined) {
database = Database_1.Database.recent;
}
if (address.timestamp === -1) {
if (address.offset === builders_1.Behavior.DIRECTORY)
return Directory_1.Directory.get(database, address);
if (address.offset === builders_1.Behavior.SEQUENCE)
return Sequence_1.Sequence.get(database, address);
if (address.offset === builders_1.Behavior.BOX)
return Box_1.Box.get(database, address);
if (address.offset === builders_1.Behavior.PAIR_MAP)
return PairMap_1.PairMap.get(database, address);
if (address.offset === builders_1.Behavior.PAIR_SET)
return PairSet_1.PairSet.get(database, address);
if (address.offset === builders_1.Behavior.KEY_SET)
return KeySet_1.KeySet.get(database, address);
if (address.offset === builders_1.Behavior.GROUP)
return Group_1.Group.get(database, address);
if (address.offset === builders_1.Behavior.PROPERTY)
return Property_1.Property.get(database, address);
if (address.offset === builders_1.Behavior.VERTEX)
return Vertex_1.Vertex.get(database, address);
if (address.offset === builders_1.Behavior.ACCUMULATOR)
return Accumulator_1.Accumulator.get(database, address);
}
if (containerBuilder === undefined) {
const containerBytes = await database.store.getContainerBytes(address);
if (!containerBytes) {
return null;
}
containerBuilder = (builders_1.ContainerBuilder.deserializeBinary(containerBytes));
}
if (containerBuilder.getBehavior() === builders_1.Behavior.BOX)
return Box_1.Box.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.SEQUENCE)
return Sequence_1.Sequence.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.KEY_SET)
return KeySet_1.KeySet.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.DIRECTORY)
return Directory_1.Directory.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.PAIR_SET)
return PairSet_1.PairSet.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.PAIR_MAP)
return PairMap_1.PairMap.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.VERTEX)
return Vertex_1.Vertex.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.EDGE_TYPE)
return EdgeType_1.EdgeType.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.PROPERTY)
return Property_1.Property.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.GROUP)
return Group_1.Group.get(database, address);
if (containerBuilder.getBehavior() === builders_1.Behavior.ACCUMULATOR)
return Accumulator_1.Accumulator.get(database, address);
throw new Error(`container type not recognized/implemented: ${containerBuilder.getBehavior()}`);
}
async function interpret(entry, database) {
if (entry === undefined || entry.deletion) {
return undefined;
}
if (entry.value !== undefined)
return entry.value;
if (entry.pointeeList.length > 0) {
const muid = (0, utils_1.rehydrate)(entry.pointeeList[0]);
return construct(muid, database);
}
if (Array.isArray(entry.storageKey) && entry.storageKey.length === 3) {
// For a MuidTuple effective key
return await construct((0, utils_1.muidTupleToMuid)(entry.storageKey), database);
}
throw new Error(`don't know how to interpret entry: ${JSON.stringify(entry)}`);
}
async function toJson(value, indent = false, asOf, seen) {
return value instanceof Container_1.Container
? await value.toJson(indent, asOf, seen)
: (0, utils_1.valueToJson)(value);
}
//# sourceMappingURL=factories.js.map