@affectively/aeon 1.3.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +5 -11
- package/README.md +90 -10
- package/dist/compression/index.cjs +20 -3
- package/dist/compression/index.cjs.map +1 -1
- package/dist/compression/index.js +20 -3
- package/dist/compression/index.js.map +1 -1
- package/dist/crypto/index.cjs +30 -0
- package/dist/crypto/index.cjs.map +1 -1
- package/dist/crypto/index.js +29 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/distributed/index.cjs +15 -8
- package/dist/distributed/index.cjs.map +1 -1
- package/dist/distributed/index.js +15 -8
- package/dist/distributed/index.js.map +1 -1
- package/dist/index.cjs +2923 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2879 -47
- package/dist/index.js.map +1 -1
- package/dist/optimization/index.cjs +6 -3
- package/dist/optimization/index.cjs.map +1 -1
- package/dist/optimization/index.js +6 -3
- package/dist/optimization/index.js.map +1 -1
- package/dist/persistence/index.cjs +91 -29
- package/dist/persistence/index.cjs.map +1 -1
- package/dist/persistence/index.js +91 -29
- package/dist/persistence/index.js.map +1 -1
- package/dist/presence/index.cjs.map +1 -1
- package/dist/presence/index.js.map +1 -1
- package/dist/versioning/index.cjs +4 -3
- package/dist/versioning/index.cjs.map +1 -1
- package/dist/versioning/index.js +4 -3
- package/dist/versioning/index.js.map +1 -1
- package/package.json +7 -8
- package/dist/compression/index.d.cts +0 -189
- package/dist/compression/index.d.ts +0 -189
- package/dist/core/index.d.cts +0 -216
- package/dist/core/index.d.ts +0 -216
- package/dist/crypto/index.d.cts +0 -446
- package/dist/crypto/index.d.ts +0 -446
- package/dist/distributed/index.d.cts +0 -1016
- package/dist/distributed/index.d.ts +0 -1016
- package/dist/index.d.cts +0 -12
- package/dist/index.d.ts +0 -12
- package/dist/offline/index.d.cts +0 -154
- package/dist/offline/index.d.ts +0 -154
- package/dist/optimization/index.d.cts +0 -347
- package/dist/optimization/index.d.ts +0 -347
- package/dist/persistence/index.d.cts +0 -63
- package/dist/persistence/index.d.ts +0 -63
- package/dist/presence/index.d.cts +0 -283
- package/dist/presence/index.d.ts +0 -283
- package/dist/types-B7gCpNX9.d.cts +0 -33
- package/dist/types-B7gCpNX9.d.ts +0 -33
- package/dist/utils/index.d.cts +0 -38
- package/dist/utils/index.d.ts +0 -38
- package/dist/versioning/index.d.cts +0 -537
- package/dist/versioning/index.d.ts +0 -537
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/logger.ts","../../src/compression/CompressionEngine.ts","../../src/compression/DeltaSyncOptimizer.ts"],"names":["logger","deltaSize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n const total = sorted[0]?.total ?? 0;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return hash.toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history\n this.operationHistory.set(operation.id, operation);\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history\n this.operationHistory.set(operation.id, operation);\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/compression/CompressionEngine.ts","../../src/compression/DeltaSyncOptimizer.ts"],"names":["logger","deltaSize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n if (sorted.length === 0) {\n throw new Error('Cannot reassemble: no chunks provided');\n }\n const total = sorted[0].total;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private static readonly MAX_HISTORY_SIZE = 10000;\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n // Evict oldest entries if over limit\n while (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n else break;\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n"]}
|
package/dist/crypto/index.cjs
CHANGED
|
@@ -93,8 +93,38 @@ var NullCryptoProvider = class {
|
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
95
|
|
|
96
|
+
// src/crypto/transactionSigner.ts
|
|
97
|
+
var NullTransactionSigner = class {
|
|
98
|
+
async execute(request) {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
action: request.action,
|
|
102
|
+
chainId: request.chainId || 0,
|
|
103
|
+
errorCode: "signer_unavailable",
|
|
104
|
+
errorMessage: "Transaction signer not configured"
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async getSigner(action) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
`Transaction signer metadata unavailable for action: ${action}`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
async health() {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
service: "transaction-signer",
|
|
116
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
function createTransactionSignerAdapter(contract) {
|
|
121
|
+
return contract;
|
|
122
|
+
}
|
|
123
|
+
|
|
96
124
|
exports.AEON_CAPABILITIES = AEON_CAPABILITIES;
|
|
97
125
|
exports.DEFAULT_CRYPTO_CONFIG = DEFAULT_CRYPTO_CONFIG;
|
|
98
126
|
exports.NullCryptoProvider = NullCryptoProvider;
|
|
127
|
+
exports.NullTransactionSigner = NullTransactionSigner;
|
|
128
|
+
exports.createTransactionSignerAdapter = createTransactionSignerAdapter;
|
|
99
129
|
//# sourceMappingURL=index.cjs.map
|
|
100
130
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/crypto/types.ts","../../src/crypto/CryptoProvider.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/ucan and @affectively/zk-encryption.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/ucan)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/zk-encryption)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/ucan and @affectively/zk-encryption\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/types.ts","../../src/crypto/CryptoProvider.ts","../../src/crypto/transactionSigner.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/auth and @affectively/auth.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/auth and @affectively/auth\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n","/**\n * Aeon Transaction Signer Abstraction\n *\n * Keeps sync cryptography (`ICryptoProvider`) decoupled from on-chain write signing.\n * This interface matches custodial signer semantics so server and Aeon callers\n * converge on one contract shape.\n */\n\nexport type HexString = `0x${string}`;\n\nexport type TransactionSignerPayloadMap = Record<string, unknown>;\n\nexport type TransactionSignerExecuteRequest<\n TPayloads extends TransactionSignerPayloadMap,\n TAction extends keyof TPayloads & string = keyof TPayloads & string\n> = {\n action: TAction;\n payload: TPayloads[TAction];\n chainId?: number;\n waitForReceipt?: boolean;\n requestId?: string;\n};\n\nexport type TransactionSignerErrorCode =\n | 'invalid_request'\n | 'signer_unavailable'\n | 'signer_denied'\n | 'tx_failed'\n | 'tx_reverted'\n | 'unauthorized'\n | 'forbidden'\n | 'unknown_action'\n | 'upstream_error';\n\nexport interface TransactionSignerExecuteResponse<\n TAction extends string = string\n> {\n success: boolean;\n action: TAction;\n chainId: number;\n txHash?: HexString;\n receiptStatus?: 'pending' | 'success' | 'reverted';\n signerAddress?: HexString;\n keyVersion?: string;\n errorCode?: TransactionSignerErrorCode;\n errorMessage?: string;\n revertReason?: string;\n}\n\nexport interface TransactionSignerMetadata<TAction extends string = string> {\n action: TAction;\n chainId: number;\n signerAddress: HexString;\n keyVersion: string;\n keyName: string;\n}\n\nexport interface TransactionSignerHealth {\n ok: boolean;\n service: string;\n timestamp: string;\n}\n\nexport interface ITransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> {\n execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>>;\n\n getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>>;\n\n health(): Promise<TransactionSignerHealth>;\n}\n\nexport class NullTransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> implements ITransactionSigner<TPayloads>\n{\n async execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>> {\n return {\n success: false,\n action: request.action,\n chainId: request.chainId || 0,\n errorCode: 'signer_unavailable',\n errorMessage: 'Transaction signer not configured',\n };\n }\n\n async getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>> {\n throw new Error(\n `Transaction signer metadata unavailable for action: ${action}`\n );\n }\n\n async health(): Promise<TransactionSignerHealth> {\n return {\n ok: false,\n service: 'transaction-signer',\n timestamp: new Date().toISOString(),\n };\n }\n}\n\nexport function createTransactionSignerAdapter<\n TPayloads extends TransactionSignerPayloadMap\n>(contract: ITransactionSigner<TPayloads>): ITransactionSigner<TPayloads> {\n return contract;\n}\n"]}
|
package/dist/crypto/index.js
CHANGED
|
@@ -91,6 +91,34 @@ var NullCryptoProvider = class {
|
|
|
91
91
|
}
|
|
92
92
|
};
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
// src/crypto/transactionSigner.ts
|
|
95
|
+
var NullTransactionSigner = class {
|
|
96
|
+
async execute(request) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
action: request.action,
|
|
100
|
+
chainId: request.chainId || 0,
|
|
101
|
+
errorCode: "signer_unavailable",
|
|
102
|
+
errorMessage: "Transaction signer not configured"
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async getSigner(action) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
`Transaction signer metadata unavailable for action: ${action}`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
async health() {
|
|
111
|
+
return {
|
|
112
|
+
ok: false,
|
|
113
|
+
service: "transaction-signer",
|
|
114
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
function createTransactionSignerAdapter(contract) {
|
|
119
|
+
return contract;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export { AEON_CAPABILITIES, DEFAULT_CRYPTO_CONFIG, NullCryptoProvider, NullTransactionSigner, createTransactionSignerAdapter };
|
|
95
123
|
//# sourceMappingURL=index.js.map
|
|
96
124
|
//# sourceMappingURL=index.js.map
|
package/dist/crypto/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/crypto/types.ts","../../src/crypto/CryptoProvider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/ucan and @affectively/zk-encryption.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/ucan)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/zk-encryption)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/ucan and @affectively/zk-encryption\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/types.ts","../../src/crypto/CryptoProvider.ts","../../src/crypto/transactionSigner.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/auth and @affectively/auth.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/auth and @affectively/auth\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n","/**\n * Aeon Transaction Signer Abstraction\n *\n * Keeps sync cryptography (`ICryptoProvider`) decoupled from on-chain write signing.\n * This interface matches custodial signer semantics so server and Aeon callers\n * converge on one contract shape.\n */\n\nexport type HexString = `0x${string}`;\n\nexport type TransactionSignerPayloadMap = Record<string, unknown>;\n\nexport type TransactionSignerExecuteRequest<\n TPayloads extends TransactionSignerPayloadMap,\n TAction extends keyof TPayloads & string = keyof TPayloads & string\n> = {\n action: TAction;\n payload: TPayloads[TAction];\n chainId?: number;\n waitForReceipt?: boolean;\n requestId?: string;\n};\n\nexport type TransactionSignerErrorCode =\n | 'invalid_request'\n | 'signer_unavailable'\n | 'signer_denied'\n | 'tx_failed'\n | 'tx_reverted'\n | 'unauthorized'\n | 'forbidden'\n | 'unknown_action'\n | 'upstream_error';\n\nexport interface TransactionSignerExecuteResponse<\n TAction extends string = string\n> {\n success: boolean;\n action: TAction;\n chainId: number;\n txHash?: HexString;\n receiptStatus?: 'pending' | 'success' | 'reverted';\n signerAddress?: HexString;\n keyVersion?: string;\n errorCode?: TransactionSignerErrorCode;\n errorMessage?: string;\n revertReason?: string;\n}\n\nexport interface TransactionSignerMetadata<TAction extends string = string> {\n action: TAction;\n chainId: number;\n signerAddress: HexString;\n keyVersion: string;\n keyName: string;\n}\n\nexport interface TransactionSignerHealth {\n ok: boolean;\n service: string;\n timestamp: string;\n}\n\nexport interface ITransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> {\n execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>>;\n\n getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>>;\n\n health(): Promise<TransactionSignerHealth>;\n}\n\nexport class NullTransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> implements ITransactionSigner<TPayloads>\n{\n async execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>> {\n return {\n success: false,\n action: request.action,\n chainId: request.chainId || 0,\n errorCode: 'signer_unavailable',\n errorMessage: 'Transaction signer not configured',\n };\n }\n\n async getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>> {\n throw new Error(\n `Transaction signer metadata unavailable for action: ${action}`\n );\n }\n\n async health(): Promise<TransactionSignerHealth> {\n return {\n ok: false,\n service: 'transaction-signer',\n timestamp: new Date().toISOString(),\n };\n }\n}\n\nexport function createTransactionSignerAdapter<\n TPayloads extends TransactionSignerPayloadMap\n>(contract: ITransactionSigner<TPayloads>): ITransactionSigner<TPayloads> {\n return contract;\n}\n"]}
|
|
@@ -31,7 +31,8 @@ var logger = {
|
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
// src/distributed/SyncCoordinator.ts
|
|
34
|
-
var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
34
|
+
var SyncCoordinator = class _SyncCoordinator extends eventemitter3.EventEmitter {
|
|
35
|
+
static MAX_SYNC_EVENTS = 1e4;
|
|
35
36
|
nodes = /* @__PURE__ */ new Map();
|
|
36
37
|
sessions = /* @__PURE__ */ new Map();
|
|
37
38
|
syncEvents = [];
|
|
@@ -44,6 +45,12 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
44
45
|
constructor() {
|
|
45
46
|
super();
|
|
46
47
|
}
|
|
48
|
+
addSyncEvent(event) {
|
|
49
|
+
this.syncEvents.push(event);
|
|
50
|
+
if (this.syncEvents.length > _SyncCoordinator.MAX_SYNC_EVENTS) {
|
|
51
|
+
this.syncEvents = this.syncEvents.slice(-_SyncCoordinator.MAX_SYNC_EVENTS);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
47
54
|
/**
|
|
48
55
|
* Configure cryptographic provider for authenticated sync
|
|
49
56
|
*/
|
|
@@ -83,7 +90,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
83
90
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
84
91
|
data: { did: nodeInfo.did, authenticated: true }
|
|
85
92
|
};
|
|
86
|
-
this.
|
|
93
|
+
this.addSyncEvent(event);
|
|
87
94
|
this.emit("node-joined", node);
|
|
88
95
|
logger.debug("[SyncCoordinator] Authenticated node registered", {
|
|
89
96
|
nodeId: node.id,
|
|
@@ -161,7 +168,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
161
168
|
encryptionMode: session.encryptionMode
|
|
162
169
|
}
|
|
163
170
|
};
|
|
164
|
-
this.
|
|
171
|
+
this.addSyncEvent(event);
|
|
165
172
|
this.emit("sync-started", session);
|
|
166
173
|
logger.debug("[SyncCoordinator] Authenticated sync session created", {
|
|
167
174
|
sessionId: session.id,
|
|
@@ -208,7 +215,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
208
215
|
nodeId: node.id,
|
|
209
216
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
210
217
|
};
|
|
211
|
-
this.
|
|
218
|
+
this.addSyncEvent(event);
|
|
212
219
|
this.emit("node-joined", node);
|
|
213
220
|
logger.debug("[SyncCoordinator] Node registered", {
|
|
214
221
|
nodeId: node.id,
|
|
@@ -231,7 +238,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
231
238
|
nodeId,
|
|
232
239
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
233
240
|
};
|
|
234
|
-
this.
|
|
241
|
+
this.addSyncEvent(event);
|
|
235
242
|
this.emit("node-left", node);
|
|
236
243
|
logger.debug("[SyncCoordinator] Node deregistered", { nodeId });
|
|
237
244
|
}
|
|
@@ -260,7 +267,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
260
267
|
nodeId: initiatorId,
|
|
261
268
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
262
269
|
};
|
|
263
|
-
this.
|
|
270
|
+
this.addSyncEvent(event);
|
|
264
271
|
this.emit("sync-started", session);
|
|
265
272
|
logger.debug("[SyncCoordinator] Sync session created", {
|
|
266
273
|
sessionId: session.id,
|
|
@@ -287,7 +294,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
287
294
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
288
295
|
data: { status: updates.status, itemsSynced: session.itemsSynced }
|
|
289
296
|
};
|
|
290
|
-
this.
|
|
297
|
+
this.addSyncEvent(event);
|
|
291
298
|
this.emit("sync-completed", session);
|
|
292
299
|
}
|
|
293
300
|
logger.debug("[SyncCoordinator] Sync session updated", {
|
|
@@ -310,7 +317,7 @@ var SyncCoordinator = class extends eventemitter3.EventEmitter {
|
|
|
310
317
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
311
318
|
data: conflictData
|
|
312
319
|
};
|
|
313
|
-
this.
|
|
320
|
+
this.addSyncEvent(event);
|
|
314
321
|
this.emit("conflict-detected", { session, nodeId, conflictData });
|
|
315
322
|
logger.debug("[SyncCoordinator] Conflict recorded", {
|
|
316
323
|
sessionId,
|