UNPKG

loccon

Version:

A simple local context storage and management tool with CLI and web interfaces. Store, search, and organize code snippets, notes, and development contexts with sharded JSON storage.

117 lines 4.85 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ShardManager = void 0; const path = __importStar(require("path")); const fs = __importStar(require("fs-extra")); class ShardManager { constructor(storagePath) { this.storagePath = storagePath; } async getMetadata() { const metadataPath = path.join(this.storagePath, 'metadata.json'); return await fs.readJson(metadataPath); } async saveMetadata(metadata) { const metadataPath = path.join(this.storagePath, 'metadata.json'); await fs.writeJson(metadataPath, metadata, { spaces: 2 }); } async getCurrentShard() { const metadata = await this.getMetadata(); if (!metadata.currentShard) { // No shards exist yet, create the first one return await this.createNewShard(); } const currentShardMeta = metadata.shards[metadata.currentShard]; if (currentShardMeta.status === 'full') { // Current shard is full, create a new one return await this.createNewShard(); } return metadata.currentShard; } async createNewShard() { const metadata = await this.getMetadata(); const shardNumber = metadata.totalShards + 1; const shardId = `shard-${shardNumber.toString().padStart(3, '0')}`; const shardPath = path.join(this.storagePath, 'shards', `${shardId}.json`); // Create empty shard file const emptyShardData = { shardId: shardId, contexts: {} }; await fs.writeJson(shardPath, emptyShardData, { spaces: 2 }); // Update metadata metadata.totalShards++; metadata.currentShard = shardId; metadata.shards[shardId] = { entries: 0, sizeBytes: JSON.stringify(emptyShardData).length, status: 'active' }; await this.saveMetadata(metadata); return shardId; } async loadShard(shardId) { const shardPath = path.join(this.storagePath, 'shards', `${shardId}.json`); return await fs.readJson(shardPath); } async saveShard(shardData) { const shardPath = path.join(this.storagePath, 'shards', `${shardData.shardId}.json`); await fs.writeJson(shardPath, shardData, { spaces: 2 }); // Update metadata with new size and entry count const metadata = await this.getMetadata(); const shardSize = JSON.stringify(shardData).length; const entryCount = Object.keys(shardData.contexts).length; metadata.shards[shardData.shardId] = { entries: entryCount, sizeBytes: shardSize, status: shardSize >= 5 * 1024 * 1024 ? 'full' : 'active' // 5MB limit }; metadata.totalEntries = Object.values(metadata.shards).reduce((sum, shard) => sum + shard.entries, 0); await this.saveMetadata(metadata); } async getAllShardIds() { const metadata = await this.getMetadata(); return Object.keys(metadata.shards); } async checkShardCapacity(shardId, additionalContent) { const shardData = await this.loadShard(shardId); const currentSize = JSON.stringify(shardData).length; const additionalSize = JSON.stringify(additionalContent).length; return (currentSize + additionalSize) < 5 * 1024 * 1024; // 5MB limit } } exports.ShardManager = ShardManager; //# sourceMappingURL=shardManager.js.map