@a0n/aeon 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 +15 -0
- package/README.md +199 -0
- package/dist/CryptoProvider-SLWjqByk.d.cts +407 -0
- package/dist/CryptoProvider-SLWjqByk.d.ts +407 -0
- package/dist/compression/index.cjs +1445 -0
- package/dist/compression/index.cjs.map +1 -0
- package/dist/compression/index.d.cts +451 -0
- package/dist/compression/index.d.ts +451 -0
- package/dist/compression/index.js +1426 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/core/index.cjs +4 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +212 -0
- package/dist/core/index.d.ts +212 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/crypto/index.cjs +130 -0
- package/dist/crypto/index.cjs.map +1 -0
- package/dist/crypto/index.d.cts +56 -0
- package/dist/crypto/index.d.ts +56 -0
- package/dist/crypto/index.js +124 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/distributed/index.cjs +2586 -0
- package/dist/distributed/index.cjs.map +1 -0
- package/dist/distributed/index.d.cts +1005 -0
- package/dist/distributed/index.d.ts +1005 -0
- package/dist/distributed/index.js +2580 -0
- package/dist/distributed/index.js.map +1 -0
- package/dist/index.cjs +10953 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1953 -0
- package/dist/index.d.ts +1953 -0
- package/dist/index.js +10828 -0
- package/dist/index.js.map +1 -0
- package/dist/offline/index.cjs +419 -0
- package/dist/offline/index.cjs.map +1 -0
- package/dist/offline/index.d.cts +148 -0
- package/dist/offline/index.d.ts +148 -0
- package/dist/offline/index.js +415 -0
- package/dist/offline/index.js.map +1 -0
- package/dist/optimization/index.cjs +800 -0
- package/dist/optimization/index.cjs.map +1 -0
- package/dist/optimization/index.d.cts +347 -0
- package/dist/optimization/index.d.ts +347 -0
- package/dist/optimization/index.js +790 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/persistence/index.cjs +207 -0
- package/dist/persistence/index.cjs.map +1 -0
- package/dist/persistence/index.d.cts +95 -0
- package/dist/persistence/index.d.ts +95 -0
- package/dist/persistence/index.js +204 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/presence/index.cjs +489 -0
- package/dist/presence/index.cjs.map +1 -0
- package/dist/presence/index.d.cts +283 -0
- package/dist/presence/index.d.ts +283 -0
- package/dist/presence/index.js +485 -0
- package/dist/presence/index.js.map +1 -0
- package/dist/types-CMxO7QF0.d.cts +33 -0
- package/dist/types-CMxO7QF0.d.ts +33 -0
- package/dist/utils/index.cjs +64 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +38 -0
- package/dist/utils/index.d.ts +38 -0
- package/dist/utils/index.js +57 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/versioning/index.cjs +1164 -0
- package/dist/versioning/index.cjs.map +1 -0
- package/dist/versioning/index.d.cts +537 -0
- package/dist/versioning/index.d.ts +537 -0
- package/dist/versioning/index.js +1159 -0
- package/dist/versioning/index.js.map +1 -0
- package/package.json +194 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/compression/CompressionEngine.ts","../../src/compression/DeltaSyncOptimizer.ts","../../src/compression/codecs.ts","../../src/compression/TopologicalCompressor.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","/**\n * Compression Codecs — Pluggable implementations for topological compression.\n *\n * Each codec implements the same interface. The TopologicalCompressor races\n * them per chunk — different data regions get different codecs automatically.\n *\n * Pure-JS codecs (0-3, 6-7) — zero dependencies, work everywhere.\n * Platform codecs (4-5) wrap node:zlib for brotli/gzip when available.\n *\n * Codec lineup:\n * 0: Raw (identity) 4: Brotli (node:zlib)\n * 1: RLE 5: Gzip (node:zlib)\n * 2: Delta 6: Huffman (entropy coding)\n * 3: LZ77 7: Dictionary (web content)\n */\n\n// ============================================================================\n// Codec Interface\n// ============================================================================\n\nexport interface CompressionCodec {\n /** Unique identifier (stored in compressed frame header) */\n readonly id: number;\n /** Human-readable name */\n readonly name: string;\n /** Compress data. Returns compressed bytes (may be larger than input). */\n encode(data: Uint8Array): Uint8Array;\n /** Decompress data back to original. */\n decode(data: Uint8Array, originalSize: number): Uint8Array;\n}\n\n// ============================================================================\n// Codec 0: Raw (Identity)\n// ============================================================================\n\nexport class RawCodec implements CompressionCodec {\n readonly id = 0;\n readonly name = 'raw';\n\n encode(data: Uint8Array): Uint8Array {\n return data;\n }\n\n decode(data: Uint8Array): Uint8Array {\n return data;\n }\n}\n\n// ============================================================================\n// Codec 1: Run-Length Encoding\n// ============================================================================\n\n/**\n * RLE — excellent for data with long runs of repeated bytes.\n *\n * Format: [byte, count_high, count_low] triplets.\n * Count is u16 (max run = 65535). Non-runs still emit count=1.\n *\n * Best for: repeated patterns, sparse data, zeroed buffers.\n * Worst for: high-entropy data (3x expansion).\n */\nexport class RLECodec implements CompressionCodec {\n readonly id = 1;\n readonly name = 'rle';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length === 0) return new Uint8Array(0);\n\n // Worst case: every byte is unique → 3x expansion\n const output = new Uint8Array(data.length * 3);\n let writePos = 0;\n let i = 0;\n\n while (i < data.length) {\n const byte = data[i];\n let runLength = 1;\n\n while (\n i + runLength < data.length &&\n data[i + runLength] === byte &&\n runLength < 65535\n ) {\n runLength++;\n }\n\n output[writePos++] = byte;\n output[writePos++] = (runLength >>> 8) & 0xff;\n output[writePos++] = runLength & 0xff;\n i += runLength;\n }\n\n return output.subarray(0, writePos);\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output = new Uint8Array(originalSize);\n let readPos = 0;\n let writePos = 0;\n\n while (readPos < data.length && writePos < originalSize) {\n const byte = data[readPos++];\n const count = (data[readPos++] << 8) | data[readPos++];\n const end = Math.min(writePos + count, originalSize);\n output.fill(byte, writePos, end);\n writePos = end;\n }\n\n return output;\n }\n}\n\n// ============================================================================\n// Codec 2: Delta Encoding\n// ============================================================================\n\n/**\n * Delta encoding — stores differences between consecutive bytes.\n *\n * Best for: sequential/incremental data, sensor readings, coordinates.\n * Worst for: random data (no benefit, slight overhead from first byte).\n */\nexport class DeltaCodec implements CompressionCodec {\n readonly id = 2;\n readonly name = 'delta';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length === 0) return new Uint8Array(0);\n\n const output = new Uint8Array(data.length);\n output[0] = data[0]; // First byte stored as-is\n for (let i = 1; i < data.length; i++) {\n output[i] = (data[i] - data[i - 1]) & 0xff;\n }\n return output;\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output = new Uint8Array(originalSize);\n if (data.length === 0) return output;\n\n output[0] = data[0];\n for (let i = 1; i < data.length && i < originalSize; i++) {\n output[i] = (output[i - 1] + data[i]) & 0xff;\n }\n return output;\n }\n}\n\n// ============================================================================\n// Codec 3: LZ77-Simple (Sliding Window)\n// ============================================================================\n\n/**\n * Simplified LZ77 — sliding window compression with back-references.\n *\n * Format: control byte per group of 8 items.\n * - Bit 0 = literal byte follows\n * - Bit 1 = back-reference follows: [offset_high:4 | length:4, offset_low:8]\n * offset = 12 bits (max 4095), length = 4 bits + 3 (range 3–18)\n *\n * Window size: 4096 bytes. Min match: 3. Max match: 18.\n *\n * Best for: general-purpose data with repeated patterns.\n * Worst for: truly random data (slight overhead from control bytes).\n */\nexport class LZ77Codec implements CompressionCodec {\n readonly id = 3;\n readonly name = 'lz77';\n\n private static readonly WINDOW_SIZE = 4096;\n private static readonly MIN_MATCH = 3;\n private static readonly MAX_MATCH = 18;\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length === 0) return new Uint8Array(0);\n\n // Generous output buffer (worst case ~1.125x)\n const output = new Uint8Array(data.length + Math.ceil(data.length / 8) + 16);\n let writePos = 0;\n let readPos = 0;\n\n while (readPos < data.length) {\n const controlPos = writePos++;\n let controlByte = 0;\n\n for (let bit = 0; bit < 8 && readPos < data.length; bit++) {\n const windowStart = Math.max(0, readPos - LZ77Codec.WINDOW_SIZE);\n let bestOffset = 0;\n let bestLength = 0;\n\n // Find longest match in window\n for (let j = windowStart; j < readPos; j++) {\n let matchLen = 0;\n while (\n matchLen < LZ77Codec.MAX_MATCH &&\n readPos + matchLen < data.length &&\n data[j + matchLen] === data[readPos + matchLen]\n ) {\n matchLen++;\n }\n if (matchLen >= LZ77Codec.MIN_MATCH && matchLen > bestLength) {\n bestOffset = readPos - j;\n bestLength = matchLen;\n }\n }\n\n if (bestLength >= LZ77Codec.MIN_MATCH) {\n // Back-reference: set bit to 1\n controlByte |= 1 << bit;\n const lengthCode = bestLength - LZ77Codec.MIN_MATCH;\n output[writePos++] = ((bestOffset >>> 8) & 0x0f) | (lengthCode << 4);\n output[writePos++] = bestOffset & 0xff;\n readPos += bestLength;\n } else {\n // Literal: bit stays 0\n output[writePos++] = data[readPos++];\n }\n }\n\n output[controlPos] = controlByte;\n }\n\n return output.subarray(0, writePos);\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output = new Uint8Array(originalSize);\n let readPos = 0;\n let writePos = 0;\n\n while (readPos < data.length && writePos < originalSize) {\n const controlByte = data[readPos++];\n\n for (let bit = 0; bit < 8 && readPos < data.length && writePos < originalSize; bit++) {\n if (controlByte & (1 << bit)) {\n // Back-reference\n const byte1 = data[readPos++];\n const byte2 = data[readPos++];\n const offset = ((byte1 & 0x0f) << 8) | byte2;\n const length = (byte1 >>> 4) + LZ77Codec.MIN_MATCH;\n\n const srcStart = writePos - offset;\n for (let k = 0; k < length && writePos < originalSize; k++) {\n output[writePos++] = output[srcStart + k];\n }\n } else {\n // Literal\n output[writePos++] = data[readPos++];\n }\n }\n }\n\n return output;\n }\n}\n\n// ============================================================================\n// Codec 4: Brotli (node:zlib wrapper)\n// ============================================================================\n\n/**\n * Brotli via node:zlib — best general-purpose compression ratio.\n *\n * Only available on Node/Bun/Deno. The TopologicalCompressor races it\n * per-chunk against pure-JS codecs — brotli wins on text, raw wins on\n * already-compressed binary. This is the key insight: topological\n * compression adapts per-chunk even when one codec dominates globally.\n *\n * Quality 4 matches nginx on-the-fly default.\n */\nexport class BrotliCodec implements CompressionCodec {\n readonly id = 4;\n readonly name = 'brotli';\n\n private readonly quality: number;\n\n constructor(quality = 4) {\n this.quality = quality;\n }\n\n encode(data: Uint8Array): Uint8Array {\n try {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.brotliCompressSync(Buffer.from(data), {\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: this.quality,\n },\n }));\n } catch {\n // node:zlib unavailable (browser/CF Workers) — return raw (will be vented)\n return data;\n }\n }\n\n decode(data: Uint8Array): Uint8Array {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.brotliDecompressSync(Buffer.from(data)));\n }\n}\n\n// ============================================================================\n// Codec 5: Gzip (node:zlib wrapper)\n// ============================================================================\n\n/**\n * Gzip via node:zlib — universal fallback, slightly worse ratio than brotli.\n *\n * Level 6 matches nginx default.\n */\nexport class GzipCodec implements CompressionCodec {\n readonly id = 5;\n readonly name = 'gzip';\n\n private readonly level: number;\n\n constructor(level = 6) {\n this.level = level;\n }\n\n encode(data: Uint8Array): Uint8Array {\n try {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.gzipSync(Buffer.from(data), {\n level: this.level,\n }));\n } catch {\n return data;\n }\n }\n\n decode(data: Uint8Array): Uint8Array {\n const zlib = require('node:zlib');\n return new Uint8Array(zlib.gunzipSync(Buffer.from(data)));\n }\n}\n\n// ============================================================================\n// Codec 6: Huffman Coding (Pure JS)\n// ============================================================================\n\n/**\n * Canonical Huffman coding — entropy-optimal per-byte compression.\n *\n * Captures the entropy coding stage of Zstandard/DEFLATE. Pure JS,\n * works everywhere. Excels on data with skewed byte distributions\n * where a few byte values dominate.\n *\n * Format:\n * [0..255] u8×256 code_lengths (one per possible byte value)\n * [256..259] u32 total_bits in the encoded stream\n * [260..] packed bits (MSB-first)\n *\n * Overhead: 260 bytes. Only wins on chunks where entropy coding\n * saves more than 260 bytes — the race handles this automatically.\n */\nexport class HuffmanCodec implements CompressionCodec {\n readonly id = 6;\n readonly name = 'huffman';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length < 32) return data; // too small for 260-byte overhead\n\n // Count byte frequencies\n const freq = new Uint32Array(256);\n for (let i = 0; i < data.length; i++) freq[data[i]]++;\n\n // Collect symbols with non-zero frequency\n const symbols: Array<{ sym: number; freq: number }> = [];\n for (let i = 0; i < 256; i++) {\n if (freq[i] > 0) symbols.push({ sym: i, freq: freq[i] });\n }\n if (symbols.length <= 1) return data; // single symbol — can't Huffman-encode\n\n // Build Huffman tree using sorted-array priority queue\n type HNode = { freq: number; sym: number; left: number; right: number };\n const nodes: HNode[] = symbols.map(s => ({\n freq: s.freq, sym: s.sym, left: -1, right: -1,\n }));\n const heap = [...nodes];\n heap.sort((a, b) => a.freq - b.freq);\n\n while (heap.length > 1) {\n const left = heap.shift()!;\n const right = heap.shift()!;\n const leftIdx = nodes.indexOf(left);\n const rightIdx = nodes.indexOf(right);\n const parent: HNode = {\n freq: left.freq + right.freq, sym: -1,\n left: leftIdx, right: rightIdx,\n };\n nodes.push(parent);\n let idx = 0;\n while (idx < heap.length && heap[idx].freq <= parent.freq) idx++;\n heap.splice(idx, 0, parent);\n }\n\n // Extract code lengths via DFS\n const codeLengths = new Uint8Array(256);\n const root = nodes.length - 1;\n const dfs = (nodeIdx: number, depth: number): void => {\n const node = nodes[nodeIdx];\n if (node.left === -1 && node.right === -1) {\n codeLengths[node.sym] = depth || 1;\n return;\n }\n if (node.left >= 0) dfs(node.left, depth + 1);\n if (node.right >= 0) dfs(node.right, depth + 1);\n };\n dfs(root, 0);\n\n // Bail if any code exceeds 15 bits (pathological distribution)\n for (let i = 0; i < 256; i++) {\n if (codeLengths[i] > 15) return data;\n }\n\n // Generate canonical codes from sorted (length, symbol) pairs\n const sorted: Array<{ sym: number; len: number }> = [];\n for (let i = 0; i < 256; i++) {\n if (codeLengths[i] > 0) sorted.push({ sym: i, len: codeLengths[i] });\n }\n sorted.sort((a, b) => a.len - b.len || a.sym - b.sym);\n\n const codes = new Uint32Array(256);\n let code = 0;\n let prevLen = sorted[0].len;\n codes[sorted[0].sym] = 0;\n for (let i = 1; i < sorted.length; i++) {\n code = (code + 1) << (sorted[i].len - prevLen);\n codes[sorted[i].sym] = code;\n prevLen = sorted[i].len;\n }\n\n // Calculate total bits\n let totalBits = 0;\n for (let i = 0; i < data.length; i++) totalBits += codeLengths[data[i]];\n const totalBytes = Math.ceil(totalBits / 8);\n\n // Pack: [codeLengths:256][totalBits:u32][packedBits]\n const headerSize = 260;\n const output = new Uint8Array(headerSize + totalBytes);\n output.set(codeLengths, 0);\n new DataView(output.buffer).setUint32(256, totalBits);\n\n let bitPos = 0;\n for (let i = 0; i < data.length; i++) {\n const sym = data[i];\n const codeVal = codes[sym];\n const codeLen = codeLengths[sym];\n for (let b = codeLen - 1; b >= 0; b--) {\n if ((codeVal >>> b) & 1) {\n const byteIdx = headerSize + (bitPos >>> 3);\n output[byteIdx] |= 1 << (7 - (bitPos & 7));\n }\n bitPos++;\n }\n }\n\n return output;\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n if (data.length < 260) return data.subarray(0, originalSize);\n\n // Read code lengths and total bits\n const codeLengths = data.subarray(0, 256);\n const totalBits = new DataView(\n data.buffer, data.byteOffset + 256, 4,\n ).getUint32(0);\n\n // Reconstruct canonical codes and build decode tree\n const sorted: Array<{ sym: number; len: number }> = [];\n for (let i = 0; i < 256; i++) {\n if (codeLengths[i] > 0) sorted.push({ sym: i, len: codeLengths[i] });\n }\n sorted.sort((a, b) => a.len - b.len || a.sym - b.sym);\n\n // Build binary tree: each node is [leftChild, rightChild, symbol]\n // -1 = no child/no symbol\n const tree: Array<[number, number, number]> = [[-1, -1, -1]];\n const insertCode = (codeVal: number, len: number, sym: number): void => {\n let node = 0;\n for (let b = len - 1; b >= 0; b--) {\n const bit = (codeVal >>> b) & 1;\n if (tree[node][bit] === -1) {\n tree[node][bit] = tree.length;\n tree.push([-1, -1, -1]);\n }\n node = tree[node][bit];\n }\n tree[node][2] = sym;\n };\n\n let code = 0;\n let prevLen = sorted[0].len;\n insertCode(0, sorted[0].len, sorted[0].sym);\n for (let i = 1; i < sorted.length; i++) {\n code = (code + 1) << (sorted[i].len - prevLen);\n insertCode(code, sorted[i].len, sorted[i].sym);\n prevLen = sorted[i].len;\n }\n\n // Decode bits\n const output = new Uint8Array(originalSize);\n let bitPos = 0;\n let outPos = 0;\n const bitsStart = 260;\n\n while (outPos < originalSize && bitPos < totalBits) {\n let node = 0;\n while (tree[node][2] === -1 && bitPos < totalBits) {\n const byteIdx = bitsStart + (bitPos >>> 3);\n const bit = (data[byteIdx] >>> (7 - (bitPos & 7))) & 1;\n node = tree[node][bit];\n bitPos++;\n }\n if (tree[node][2] !== -1) {\n output[outPos++] = tree[node][2];\n }\n }\n\n return output;\n }\n}\n\n// ============================================================================\n// Codec 7: Dictionary Codec (Pure JS, Web-Content Domain)\n// ============================================================================\n\n/**\n * Domain-specific dictionary substitution for web content.\n *\n * Pre-seeded with common HTML, CSS, and JavaScript byte patterns.\n * Replaces matches with 2-byte escape codes: [0x00, index].\n * Literal null bytes are escaped as [0x00, 0x00].\n *\n * Excels on web bundles where repeated keywords, tags, and CSS\n * properties appear frequently. The race picks this codec for\n * text-heavy chunks where dictionary matches are plentiful.\n *\n * Entries sorted longest-first for greedy matching.\n */\n\nconst DICTIONARY_STRINGS = [\n // Long patterns first (most savings per match)\n 'addEventListener', // 16 bytes → 2 = saves 14\n 'querySelector', // 13 → 2 = saves 11\n 'createElement', // 13 → 2 = saves 11\n 'justify-content', // 15 → 2 = saves 13\n 'align-items:center', // 19 → 2 = saves 17\n 'textContent', // 11 → 2 = saves 9\n 'display:flex', // 12 → 2 = saves 10\n 'display:grid', // 12 → 2 = saves 10\n 'display:none', // 12 → 2 = saves 10\n 'background:', // 11 → 2 = saves 9\n 'font-weight:', // 12 → 2 = saves 10\n 'font-size:', // 10 → 2 = saves 8\n 'className', // 9 → 2 = saves 7\n 'undefined', // 9 → 2 = saves 7\n 'container', // 9 → 2 = saves 7\n 'transform:', // 10 → 2 = saves 8\n 'overflow:', // 9 → 2 = saves 7\n 'position:', // 9 → 2 = saves 7\n 'function ', // 9 → 2 = saves 7\n 'children', // 8 → 2 = saves 6\n 'document', // 8 → 2 = saves 6\n 'display:', // 8 → 2 = saves 6\n 'padding:', // 8 → 2 = saves 6\n 'onClick', // 7 → 2 = saves 5\n 'useState', // 8 → 2 = saves 6\n 'https://', // 8 → 2 = saves 6\n 'default', // 7 → 2 = saves 5\n 'extends', // 7 → 2 = saves 5\n 'return ', // 7 → 2 = saves 5\n 'export ', // 7 → 2 = saves 5\n 'import ', // 7 → 2 = saves 5\n 'margin:', // 7 → 2 = saves 5\n 'border:', // 7 → 2 = saves 5\n 'cursor:', // 7 → 2 = saves 5\n 'height:', // 7 → 2 = saves 5\n '</span>', // 7 → 2 = saves 5\n 'color:', // 6 → 2 = saves 4\n 'width:', // 6 → 2 = saves 4\n 'const ', // 6 → 2 = saves 4\n 'class ', // 6 → 2 = saves 4\n '</div>', // 6 → 2 = saves 4\n '<span ', // 6 → 2 = saves 4\n '<div ', // 5 → 2 = saves 3\n 'async', // 5 → 2 = saves 3\n 'await', // 5 → 2 = saves 3\n 'false', // 5 → 2 = saves 3\n 'this.', // 5 → 2 = saves 3\n 'props', // 5 → 2 = saves 3\n 'state', // 5 → 2 = saves 3\n '</p>', // 4 → 2 = saves 2\n 'null', // 4 → 2 = saves 2\n 'true', // 4 → 2 = saves 2\n 'flex', // 4 → 2 = saves 2\n 'grid', // 4 → 2 = saves 2\n 'none', // 4 → 2 = saves 2\n 'auto', // 4 → 2 = saves 2\n 'self', // 4 → 2 = saves 2\n '.css', // 4 → 2 = saves 2\n '.com', // 4 → 2 = saves 2\n 'var(', // 4 → 2 = saves 2\n '<p>', // 3 → 2 = saves 1\n '.js', // 3 → 2 = saves 1\n 'px;', // 3 → 2 = saves 1\n 'rem', // 3 → 2 = saves 1\n];\n\n/** Pre-encoded dictionary entries as byte arrays, sorted longest-first */\nconst DICTIONARY: Uint8Array[] = DICTIONARY_STRINGS.map(\n s => new TextEncoder().encode(s),\n);\n\nexport class DictionaryCodec implements CompressionCodec {\n readonly id = 7;\n readonly name = 'dictionary';\n\n encode(data: Uint8Array): Uint8Array {\n if (data.length < 4) return data;\n\n const output: number[] = [];\n let pos = 0;\n\n while (pos < data.length) {\n let matched = false;\n\n // Greedy: try entries from longest to shortest\n for (let idx = 0; idx < DICTIONARY.length; idx++) {\n const entry = DICTIONARY[idx];\n if (pos + entry.length > data.length) continue;\n\n let match = true;\n for (let j = 0; j < entry.length; j++) {\n if (data[pos + j] !== entry[j]) { match = false; break; }\n }\n\n if (match) {\n output.push(0x00, idx + 1); // escape + 1-indexed entry\n pos += entry.length;\n matched = true;\n break;\n }\n }\n\n if (!matched) {\n if (data[pos] === 0x00) {\n output.push(0x00, 0x00); // escape literal null\n } else {\n output.push(data[pos]);\n }\n pos++;\n }\n }\n\n return new Uint8Array(output);\n }\n\n decode(data: Uint8Array, originalSize: number): Uint8Array {\n const output: number[] = [];\n let pos = 0;\n\n while (pos < data.length && output.length < originalSize) {\n if (data[pos] === 0x00) {\n pos++;\n if (data[pos] === 0x00) {\n output.push(0x00); // literal null\n } else {\n const entry = DICTIONARY[data[pos] - 1];\n for (let j = 0; j < entry.length; j++) output.push(entry[j]);\n }\n pos++;\n } else {\n output.push(data[pos]);\n pos++;\n }\n }\n\n return new Uint8Array(output);\n }\n}\n\n// ============================================================================\n// Codec Registry\n// ============================================================================\n\n/** Pure-JS codecs — zero dependencies, work everywhere */\nexport const PURE_JS_CODECS: CompressionCodec[] = [\n new RawCodec(),\n new RLECodec(),\n new DeltaCodec(),\n new LZ77Codec(),\n new HuffmanCodec(),\n new DictionaryCodec(),\n];\n\n/** All built-in codecs including platform codecs (brotli/gzip via node:zlib) */\nexport const BUILTIN_CODECS: CompressionCodec[] = [\n ...PURE_JS_CODECS,\n new BrotliCodec(),\n new GzipCodec(),\n];\n\n/** Codec registry map for O(1) lookup */\nconst CODEC_MAP = new Map<number, CompressionCodec>(\n BUILTIN_CODECS.map(c => [c.id, c]),\n);\n\n/** Look up a codec by ID */\nexport function getCodecById(id: number): CompressionCodec {\n const codec = CODEC_MAP.get(id);\n if (!codec) {\n throw new Error(`Unknown codec ID: ${id}`);\n }\n return codec;\n}\n","/**\n * Topological Compressor — Fork/Race/Fold Applied to Compression\n *\n * Two-level fork/race/fold:\n *\n * LEVEL 1 (stream): Fork the entire input into global strategies.\n * - Path A: Global brotli on the whole stream (cross-chunk dictionary)\n * - Path B: Global gzip on the whole stream\n * - Path C: Per-chunk topological compression (Level 2)\n * Race all paths. Fold to smallest.\n *\n * LEVEL 2 (chunk): For each chunk, fork all codecs.\n * - Race codecs per chunk. Smallest wins.\n * - Vent codecs whose output >= raw.\n * - Fold: self-describing frame per chunk.\n *\n * Stream-level format (when streamRace is enabled):\n * [0] u8 strategy (0 = per-chunk, N>0 = global codec ID)\n * [1..4] u32 original_size\n * [5..] [u8] compressed data\n *\n * Per-chunk frame format:\n * [0] u8 codec_id\n * [1..4] u32 original_size\n * [5..8] u32 compressed_size\n * [9..] [u8] compressed_data\n *\n * Zero dependencies. Works on CF Workers, Deno, Node, Bun, browsers.\n */\n\nimport type { CompressionCodec } from './codecs';\nimport { BUILTIN_CODECS, getCodecById } from './codecs';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Per-chunk compression result — which codec won and why */\nexport interface ChunkResult {\n /** Index of this chunk in the original data */\n chunkIndex: number;\n /** The codec that won the race for this chunk */\n codecId: number;\n /** Codec name (for diagnostics) */\n codecName: string;\n /** Original size of this chunk in bytes */\n originalSize: number;\n /** Compressed size of this chunk in bytes (including 9-byte header) */\n compressedSize: number;\n /** Compression ratio for this chunk (0 = no compression, 1 = perfect) */\n ratio: number;\n /** How many codecs were vented (output >= input) */\n vented: number;\n}\n\n/** Overall compression result */\nexport interface TopologicalCompressionResult {\n /** The compressed output — concatenated self-describing frames */\n data: Uint8Array;\n /** Per-chunk results */\n chunks: ChunkResult[];\n /** Total original size */\n originalSize: number;\n /** Total compressed size */\n compressedSize: number;\n /** Overall compression ratio */\n ratio: number;\n /** Number of distinct codecs used across all chunks */\n codecsUsed: number;\n /** β₁ during compression (number of parallel codec paths - 1) */\n bettiNumber: number;\n /** Compression time in milliseconds */\n timeMs: number;\n /** Strategy that won the stream-level race (only set when streamRace=true) */\n strategy?: string;\n}\n\n/** Compressor configuration */\nexport interface TopologicalCompressorConfig {\n /** Chunk size in bytes. Smaller = more adaptive, larger = better ratio. */\n chunkSize: number;\n /** Codecs to race. Default: all built-in codecs. */\n codecs: CompressionCodec[];\n /** Enable two-level race: global codecs vs per-chunk topological. Default: false. */\n streamRace?: boolean;\n}\n\n// ============================================================================\n// Self-Describing Chunk Header (9 bytes)\n// ============================================================================\n\nconst CHUNK_HEADER_SIZE = 9;\n\nfunction encodeChunkHeader(\n codecId: number,\n originalSize: number,\n compressedSize: number,\n): Uint8Array {\n const header = new Uint8Array(CHUNK_HEADER_SIZE);\n const view = new DataView(header.buffer);\n header[0] = codecId;\n view.setUint32(1, originalSize);\n view.setUint32(5, compressedSize);\n return header;\n}\n\nfunction decodeChunkHeader(\n data: Uint8Array,\n offset: number,\n): { codecId: number; originalSize: number; compressedSize: number } {\n const codecId = data[offset];\n const view = new DataView(data.buffer, data.byteOffset + offset + 1, 8);\n const originalSize = view.getUint32(0);\n const compressedSize = view.getUint32(4);\n return { codecId, originalSize, compressedSize };\n}\n\n// ============================================================================\n// Stream-Level Header (5 bytes) — only present when streamRace=true\n// ============================================================================\n\nconst STREAM_HEADER_SIZE = 5;\n\nfunction encodeStreamHeader(\n strategy: number,\n originalSize: number,\n): Uint8Array {\n const header = new Uint8Array(STREAM_HEADER_SIZE);\n header[0] = strategy;\n new DataView(header.buffer).setUint32(1, originalSize);\n return header;\n}\n\nfunction decodeStreamHeader(\n data: Uint8Array,\n): { strategy: number; originalSize: number } {\n const strategy = data[0];\n const originalSize = new DataView(\n data.buffer, data.byteOffset + 1, 4,\n ).getUint32(0);\n return { strategy, originalSize };\n}\n\n// ============================================================================\n// Topological Compressor\n// ============================================================================\n\nexport class TopologicalCompressor {\n private readonly config: TopologicalCompressorConfig & { streamRace: boolean };\n\n constructor(config?: Partial<TopologicalCompressorConfig>) {\n this.config = {\n chunkSize: config?.chunkSize ?? 4096,\n codecs: config?.codecs ?? BUILTIN_CODECS,\n streamRace: config?.streamRace ?? false,\n };\n }\n\n /**\n * Compress data using fork/race/fold.\n *\n * When streamRace=false (default): per-chunk race only.\n * When streamRace=true: two-level race — global codecs vs per-chunk topo.\n */\n compress(data: Uint8Array): TopologicalCompressionResult {\n if (data.length === 0) {\n return {\n data: new Uint8Array(0),\n chunks: [],\n originalSize: 0,\n compressedSize: 0,\n ratio: 0,\n codecsUsed: 0,\n bettiNumber: 0,\n timeMs: 0,\n };\n }\n\n if (!this.config.streamRace) {\n return this.compressChunked(data);\n }\n\n return this.compressTwoLevel(data);\n }\n\n /**\n * Decompress data produced by compress().\n */\n decompress(compressed: Uint8Array): Uint8Array {\n if (compressed.length === 0) return new Uint8Array(0);\n\n if (!this.config.streamRace) {\n return this.decompressChunked(compressed);\n }\n\n return this.decompressTwoLevel(compressed);\n }\n\n // ════════════════════════════════════════════════════════════════════════\n // Level 2: Per-Chunk Topological Compression\n // ════════════════════════════════════════════════════════════════════════\n\n private compressChunked(data: Uint8Array): TopologicalCompressionResult {\n const startTime = performance.now();\n const { chunkSize, codecs } = this.config;\n const numChunks = Math.ceil(data.length / chunkSize);\n const compressedChunks: Uint8Array[] = [];\n const chunkResults: ChunkResult[] = [];\n const codecWins = new Set<number>();\n\n const bettiNumber = Math.max(0, codecs.length - 1);\n\n for (let i = 0; i < numChunks; i++) {\n const chunkStart = i * chunkSize;\n const chunkEnd = Math.min(chunkStart + chunkSize, data.length);\n const chunk = data.subarray(chunkStart, chunkEnd);\n\n let bestCodecId = 0;\n let bestCompressed = chunk;\n let ventCount = 0;\n\n for (const codec of codecs) {\n const compressed = codec.encode(chunk);\n\n if (compressed.length >= chunk.length && codec.id !== 0) {\n ventCount++;\n continue;\n }\n\n if (compressed.length < bestCompressed.length) {\n bestCodecId = codec.id;\n bestCompressed = compressed;\n }\n }\n\n const header = encodeChunkHeader(\n bestCodecId,\n chunk.length,\n bestCompressed.length,\n );\n const frame = new Uint8Array(CHUNK_HEADER_SIZE + bestCompressed.length);\n frame.set(header, 0);\n frame.set(bestCompressed, CHUNK_HEADER_SIZE);\n\n compressedChunks.push(frame);\n codecWins.add(bestCodecId);\n\n const codecName =\n codecs.find((c) => c.id === bestCodecId)?.name ?? 'unknown';\n\n chunkResults.push({\n chunkIndex: i,\n codecId: bestCodecId,\n codecName,\n originalSize: chunk.length,\n compressedSize: frame.length,\n ratio: chunk.length > 0 ? 1 - frame.length / chunk.length : 0,\n vented: ventCount,\n });\n }\n\n const totalCompressedSize = compressedChunks.reduce(\n (sum, c) => sum + c.length,\n 0,\n );\n const output = new Uint8Array(totalCompressedSize);\n let offset = 0;\n for (const c of compressedChunks) {\n output.set(c, offset);\n offset += c.length;\n }\n\n return {\n data: output,\n chunks: chunkResults,\n originalSize: data.length,\n compressedSize: totalCompressedSize,\n ratio: data.length > 0 ? 1 - totalCompressedSize / data.length : 0,\n codecsUsed: codecWins.size,\n bettiNumber,\n timeMs: performance.now() - startTime,\n };\n }\n\n private decompressChunked(compressed: Uint8Array): Uint8Array {\n const chunks: Array<{\n codecId: number;\n originalSize: number;\n compressedData: Uint8Array;\n }> = [];\n let totalOriginalSize = 0;\n let readPos = 0;\n\n while (readPos < compressed.length) {\n if (readPos + CHUNK_HEADER_SIZE > compressed.length) {\n throw new Error(`Truncated chunk header at offset ${readPos}`);\n }\n\n const { codecId, originalSize, compressedSize } = decodeChunkHeader(\n compressed,\n readPos,\n );\n readPos += CHUNK_HEADER_SIZE;\n\n if (readPos + compressedSize > compressed.length) {\n throw new Error(\n `Truncated chunk data at offset ${readPos}: need ${compressedSize}, have ${compressed.length - readPos}`,\n );\n }\n\n chunks.push({\n codecId,\n originalSize,\n compressedData: compressed.subarray(readPos, readPos + compressedSize),\n });\n readPos += compressedSize;\n totalOriginalSize += originalSize;\n }\n\n const output = new Uint8Array(totalOriginalSize);\n let writePos = 0;\n\n for (const chunk of chunks) {\n const codec = getCodecById(chunk.codecId);\n const decompressed = codec.decode(\n chunk.compressedData,\n chunk.originalSize,\n );\n output.set(decompressed, writePos);\n writePos += chunk.originalSize;\n }\n\n return output;\n }\n\n // ════════════════════════════════════════════════════════════════════════\n // Level 1: Stream-Level Two-Level Race\n // ════════════════════════════════════════════════════════════════════════\n\n /**\n * Two-level fork/race/fold:\n *\n * FORK (stream level):\n * ├─ Path 0: Per-chunk topological (Level 2)\n * ├─ Path 1: Global codec A on entire stream\n * ├─ Path 2: Global codec B on entire stream\n * └─ ...\n * RACE: Smallest total output wins\n * FOLD: 5-byte strategy header + compressed data\n *\n * On homogeneous text, global brotli wins (cross-chunk dictionary).\n * On mixed content, per-chunk topo wins (adapts per region).\n * The topology decides — not the programmer.\n */\n private compressTwoLevel(data: Uint8Array): TopologicalCompressionResult {\n const startTime = performance.now();\n const { codecs } = this.config;\n\n // ── FORK: Run all strategies in parallel ──\n\n // Strategy 0: Per-chunk topological (Level 2)\n const chunkedResult = this.compressChunked(data);\n const chunkedTotal = STREAM_HEADER_SIZE + chunkedResult.compressedSize;\n\n // Strategies 1+: Each codec globally on the full stream\n interface GlobalCandidate {\n codecId: number;\n codecName: string;\n compressed: Uint8Array;\n totalSize: number; // including 5-byte stream header\n }\n\n const globalCandidates: GlobalCandidate[] = [];\n\n for (const codec of codecs) {\n if (codec.id === 0) continue; // skip raw — can't beat per-chunk raw\n\n try {\n const compressed = codec.encode(data);\n const totalSize = STREAM_HEADER_SIZE + compressed.length;\n\n if (compressed.length < data.length) {\n globalCandidates.push({\n codecId: codec.id,\n codecName: codec.name,\n compressed,\n totalSize,\n });\n }\n } catch {\n // Codec unavailable or failed — vented\n }\n }\n\n // ── RACE: Find the smallest output ──\n let bestStrategy = 0; // 0 = per-chunk\n let bestSize = chunkedTotal;\n let bestGlobal: GlobalCandidate | null = null;\n\n for (const candidate of globalCandidates) {\n if (candidate.totalSize < bestSize) {\n bestStrategy = candidate.codecId;\n bestSize = candidate.totalSize;\n bestGlobal = candidate;\n }\n }\n\n // ── FOLD: Build stream-level output ──\n const streamHeader = encodeStreamHeader(bestStrategy, data.length);\n\n // β₁: outer race has (globalCandidates.length + 1) paths,\n // inner race has codecs.length paths per chunk\n // Total independent cycles = outer_paths - 1 + inner_β₁\n const outerPaths = globalCandidates.length + 1; // +1 for per-chunk\n const innerBeta = Math.max(0, codecs.length - 1);\n const totalBeta = (outerPaths - 1) + innerBeta;\n\n if (bestStrategy === 0) {\n // Per-chunk topological won — prefix with stream header\n const output = new Uint8Array(STREAM_HEADER_SIZE + chunkedResult.data.length);\n output.set(streamHeader, 0);\n output.set(chunkedResult.data, STREAM_HEADER_SIZE);\n\n return {\n ...chunkedResult,\n data: output,\n compressedSize: output.length,\n ratio: data.length > 0 ? 1 - output.length / data.length : 0,\n bettiNumber: totalBeta,\n strategy: 'chunked',\n timeMs: performance.now() - startTime,\n };\n } else {\n // Global codec won\n const output = new Uint8Array(STREAM_HEADER_SIZE + bestGlobal!.compressed.length);\n output.set(streamHeader, 0);\n output.set(bestGlobal!.compressed, STREAM_HEADER_SIZE);\n\n return {\n data: output,\n chunks: [],\n originalSize: data.length,\n compressedSize: output.length,\n ratio: data.length > 0 ? 1 - output.length / data.length : 0,\n codecsUsed: 1,\n bettiNumber: totalBeta,\n strategy: `global:${bestGlobal!.codecName}`,\n timeMs: performance.now() - startTime,\n };\n }\n }\n\n private decompressTwoLevel(compressed: Uint8Array): Uint8Array {\n if (compressed.length < STREAM_HEADER_SIZE) {\n throw new Error('Truncated stream header');\n }\n\n const { strategy, originalSize } = decodeStreamHeader(compressed);\n const payload = compressed.subarray(STREAM_HEADER_SIZE);\n\n if (strategy === 0) {\n // Per-chunk topological\n return this.decompressChunked(payload);\n } else {\n // Global codec\n const codec = getCodecById(strategy);\n return codec.decode(payload, originalSize);\n }\n }\n\n /** Get the codecs available for racing. */\n getCodecs(): ReadonlyArray<CompressionCodec> {\n return this.config.codecs;\n }\n\n /** Get the chunk size. */\n getChunkSize(): number {\n return this.config.chunkSize;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aeon Core Types
|
|
3
|
+
*
|
|
4
|
+
* Shared type definitions for the Aeon synchronization and versioning system.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Operation type - what action is being performed
|
|
8
|
+
*/
|
|
9
|
+
type OperationType = 'create' | 'update' | 'delete' | 'sync' | 'batch';
|
|
10
|
+
/**
|
|
11
|
+
* Operation priority for sync ordering
|
|
12
|
+
*/
|
|
13
|
+
type OperationPriority = 'high' | 'normal' | 'low';
|
|
14
|
+
/**
|
|
15
|
+
* Operation sync status
|
|
16
|
+
*/
|
|
17
|
+
type OperationStatus = 'pending' | 'syncing' | 'synced' | 'failed';
|
|
18
|
+
/**
|
|
19
|
+
* Queued operation for offline-first synchronization
|
|
20
|
+
*/
|
|
21
|
+
interface Operation {
|
|
22
|
+
id: string;
|
|
23
|
+
type: OperationType;
|
|
24
|
+
sessionId: string;
|
|
25
|
+
status: OperationStatus;
|
|
26
|
+
data: Record<string, unknown>;
|
|
27
|
+
priority?: OperationPriority;
|
|
28
|
+
createdAt?: number;
|
|
29
|
+
syncedAt?: number;
|
|
30
|
+
retryCount?: number;
|
|
31
|
+
maxRetries?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Conflict detection result
|
|
35
|
+
*/
|
|
36
|
+
interface ConflictDetectionResult {
|
|
37
|
+
hasConflict: boolean;
|
|
38
|
+
type?: 'update_update' | 'delete_update' | 'update_delete' | 'concurrent';
|
|
39
|
+
severity?: 'low' | 'medium' | 'high';
|
|
40
|
+
similarity?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Conflict resolution strategy
|
|
44
|
+
*/
|
|
45
|
+
type ResolutionStrategy = 'local_wins' | 'remote_wins' | 'last_modified' | 'merge' | 'manual';
|
|
46
|
+
/**
|
|
47
|
+
* Sync batch for uploading multiple operations
|
|
48
|
+
*/
|
|
49
|
+
interface SyncBatch {
|
|
50
|
+
batchId: string;
|
|
51
|
+
operations: Operation[];
|
|
52
|
+
totalSize: number;
|
|
53
|
+
createdAt: number;
|
|
54
|
+
priority: OperationPriority;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Sync result from server
|
|
58
|
+
*/
|
|
59
|
+
interface SyncResult {
|
|
60
|
+
success: boolean;
|
|
61
|
+
synced: string[];
|
|
62
|
+
failed: Array<{
|
|
63
|
+
operationId: string;
|
|
64
|
+
error: string;
|
|
65
|
+
}>;
|
|
66
|
+
conflicts: Array<{
|
|
67
|
+
operationId: string;
|
|
68
|
+
remoteVersion: Record<string, unknown>;
|
|
69
|
+
strategy: ResolutionStrategy;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Network state for adaptive sync
|
|
74
|
+
*/
|
|
75
|
+
type NetworkState = 'online' | 'offline' | 'poor' | 'unknown';
|
|
76
|
+
/**
|
|
77
|
+
* Bandwidth profile for sync adaptation
|
|
78
|
+
*/
|
|
79
|
+
interface BandwidthProfile {
|
|
80
|
+
bandwidth: number;
|
|
81
|
+
latency: number;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
reliability: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Sync coordinator configuration
|
|
87
|
+
*/
|
|
88
|
+
interface SyncCoordinatorConfig {
|
|
89
|
+
maxBatchSize: number;
|
|
90
|
+
maxBatchBytes: number;
|
|
91
|
+
maxRetries: number;
|
|
92
|
+
retryDelayMs: number;
|
|
93
|
+
enableCompression: boolean;
|
|
94
|
+
enableDeltaSync: boolean;
|
|
95
|
+
adaptateBatchSize: boolean;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Vector clock for causality tracking
|
|
99
|
+
*/
|
|
100
|
+
interface VectorClock {
|
|
101
|
+
[nodeId: string]: number;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* CRDT operation for conflict-free updates
|
|
105
|
+
*/
|
|
106
|
+
interface CRDTOperation {
|
|
107
|
+
id: string;
|
|
108
|
+
type: 'insert' | 'delete' | 'update';
|
|
109
|
+
path: string[];
|
|
110
|
+
value?: unknown;
|
|
111
|
+
timestamp: number;
|
|
112
|
+
nodeId: string;
|
|
113
|
+
vectorClock: VectorClock;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Presence selection range
|
|
117
|
+
*/
|
|
118
|
+
interface PresenceSelection {
|
|
119
|
+
start: number;
|
|
120
|
+
end: number;
|
|
121
|
+
direction?: 'forward' | 'backward' | 'none';
|
|
122
|
+
path?: string;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Presence typing signal
|
|
126
|
+
*/
|
|
127
|
+
interface PresenceTyping {
|
|
128
|
+
isTyping: boolean;
|
|
129
|
+
field?: string;
|
|
130
|
+
isComposing?: boolean;
|
|
131
|
+
startedAt?: number;
|
|
132
|
+
stoppedAt?: number;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Presence scroll signal
|
|
136
|
+
*/
|
|
137
|
+
interface PresenceScroll {
|
|
138
|
+
depth: number;
|
|
139
|
+
y?: number;
|
|
140
|
+
viewportHeight?: number;
|
|
141
|
+
documentHeight?: number;
|
|
142
|
+
path?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Presence viewport signal
|
|
146
|
+
*/
|
|
147
|
+
interface PresenceViewport {
|
|
148
|
+
width: number;
|
|
149
|
+
height: number;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Presence input signal
|
|
153
|
+
*/
|
|
154
|
+
interface PresenceInputState {
|
|
155
|
+
field: string;
|
|
156
|
+
hasFocus: boolean;
|
|
157
|
+
valueLength?: number;
|
|
158
|
+
selectionStart?: number;
|
|
159
|
+
selectionEnd?: number;
|
|
160
|
+
isComposing?: boolean;
|
|
161
|
+
inputMode?: string;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Presence emotional state signal
|
|
165
|
+
*/
|
|
166
|
+
interface PresenceEmotion {
|
|
167
|
+
primary?: string;
|
|
168
|
+
secondary?: string;
|
|
169
|
+
confidence?: number;
|
|
170
|
+
intensity?: number;
|
|
171
|
+
valence?: number;
|
|
172
|
+
arousal?: number;
|
|
173
|
+
dominance?: number;
|
|
174
|
+
source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';
|
|
175
|
+
updatedAt?: number;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Presence information for real-time collaboration
|
|
179
|
+
*/
|
|
180
|
+
interface PresenceInfo {
|
|
181
|
+
userId: string;
|
|
182
|
+
nodeId: string;
|
|
183
|
+
cursor?: {
|
|
184
|
+
x: number;
|
|
185
|
+
y: number;
|
|
186
|
+
path?: string;
|
|
187
|
+
};
|
|
188
|
+
focusNode?: string;
|
|
189
|
+
selection?: PresenceSelection;
|
|
190
|
+
typing?: PresenceTyping;
|
|
191
|
+
scroll?: PresenceScroll;
|
|
192
|
+
viewport?: PresenceViewport;
|
|
193
|
+
inputState?: PresenceInputState;
|
|
194
|
+
emotion?: PresenceEmotion;
|
|
195
|
+
metadata?: Record<string, unknown>;
|
|
196
|
+
lastActivity: number;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Event emitter types
|
|
200
|
+
*/
|
|
201
|
+
type EventCallback<T = unknown> = (data: T) => void;
|
|
202
|
+
type EventUnsubscribe = () => void;
|
|
203
|
+
/**
|
|
204
|
+
* Generic event emitter interface
|
|
205
|
+
*/
|
|
206
|
+
interface IEventEmitter {
|
|
207
|
+
on<T = unknown>(event: string, callback: EventCallback<T>): EventUnsubscribe;
|
|
208
|
+
off(event: string, callback: EventCallback): void;
|
|
209
|
+
emit<T = unknown>(event: string, data?: T): void;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export type { BandwidthProfile, CRDTOperation, ConflictDetectionResult, EventCallback, EventUnsubscribe, IEventEmitter, NetworkState, Operation, OperationPriority, OperationStatus, OperationType, PresenceEmotion, PresenceInfo, PresenceInputState, PresenceScroll, PresenceSelection, PresenceTyping, PresenceViewport, ResolutionStrategy, SyncBatch, SyncCoordinatorConfig, SyncResult, VectorClock };
|