@shubhamrasal/groundline
Version:
Groundline GraphDB with IPFS persistence
105 lines • 3.13 kB
JavaScript
import * as Y from 'yjs';
// import * as fs from 'fs';
// Create a new Y.Doc instance
export const graphDoc = new Y.Doc();
// 'nodes' and 'edges' are Y.Maps for storing entities and relations
export const nodes = graphDoc.getMap('nodes');
export const edges = graphDoc.getMap('edges');
// Optionally, export a function to initialize or reset the doc
export function initGraphDoc() {
graphDoc.getMap('nodes').clear();
graphDoc.getMap('edges').clear();
}
const provenanceLog = [];
// Enhanced logging function with metadata support
function logChange(entry, metadata = {}) {
const defaultMeta = {
schemaVersion: '1.0', // Current schema version
source: 'api',
validationStatus: 'valid'
};
provenanceLog.push({
...entry,
timestamp: Date.now(),
meta: {
...defaultMeta,
...metadata
}
});
}
// Add a node (Entity) to the nodes map with metadata support
export function addNode(entity, metadata) {
if (!entity.id)
throw new Error('Entity must have an id');
nodes.set(entity.id, entity);
logChange({
action: 'add',
objectType: 'node',
id: entity.id,
data: entity
}, metadata);
}
// Edit a node (Entity) in the nodes map with metadata support
export function editNode(entity, metadata) {
if (!entity.id)
throw new Error('Entity must have an id');
if (!nodes.has(entity.id))
throw new Error('Node does not exist');
nodes.set(entity.id, entity);
logChange({
action: 'edit',
objectType: 'node',
id: entity.id,
data: entity
}, metadata);
}
// Delete a node by id with metadata support
export function deleteNode(id, metadata) {
nodes.delete(id);
logChange({
action: 'delete',
objectType: 'node',
id
}, metadata);
}
// Add an edge (Relation) to the edges map with metadata support
export function addEdge(relation, metadata) {
const edgeId = `${relation.from}->${relation.to}:${relation.relationType}`;
edges.set(edgeId, relation);
logChange({
action: 'add',
objectType: 'edge',
id: edgeId,
data: relation
}, metadata);
}
// Edit an edge (Relation) in the edges map with metadata support
export function editEdge(relation, metadata) {
const edgeId = `${relation.from}->${relation.to}:${relation.relationType}`;
if (!edges.has(edgeId))
throw new Error('Edge does not exist');
edges.set(edgeId, relation);
logChange({
action: 'edit',
objectType: 'edge',
id: edgeId,
data: relation
}, metadata);
}
// Delete an edge by id (composite key) with metadata support
export function deleteEdge(edgeId, metadata) {
edges.delete(edgeId);
logChange({
action: 'delete',
objectType: 'edge',
id: edgeId
}, metadata);
}
// Export functions to get and clear the provenance log
export function getProvenanceLog() {
return provenanceLog.slice();
}
export function clearProvenanceLog() {
provenanceLog.length = 0;
}
//# sourceMappingURL=graph-crdt.js.map