@affectively/aeon 1.0.0 → 1.2.0

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.
Files changed (62) hide show
  1. package/README.md +10 -0
  2. package/dist/compression/index.cjs +580 -0
  3. package/dist/compression/index.cjs.map +1 -0
  4. package/dist/compression/index.d.cts +189 -0
  5. package/dist/compression/index.d.ts +189 -0
  6. package/dist/compression/index.js +573 -0
  7. package/dist/compression/index.js.map +1 -0
  8. package/dist/core/index.d.cts +70 -5
  9. package/dist/core/index.d.ts +70 -5
  10. package/dist/crypto/index.cjs +100 -0
  11. package/dist/crypto/index.cjs.map +1 -0
  12. package/dist/crypto/index.d.cts +407 -0
  13. package/dist/crypto/index.d.ts +407 -0
  14. package/dist/crypto/index.js +96 -0
  15. package/dist/crypto/index.js.map +1 -0
  16. package/dist/distributed/index.cjs +420 -23
  17. package/dist/distributed/index.cjs.map +1 -1
  18. package/dist/distributed/index.d.cts +901 -2
  19. package/dist/distributed/index.d.ts +901 -2
  20. package/dist/distributed/index.js +420 -23
  21. package/dist/distributed/index.js.map +1 -1
  22. package/dist/index.cjs +1222 -55
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +11 -811
  25. package/dist/index.d.ts +11 -811
  26. package/dist/index.js +1221 -56
  27. package/dist/index.js.map +1 -1
  28. package/dist/offline/index.cjs +419 -0
  29. package/dist/offline/index.cjs.map +1 -0
  30. package/dist/offline/index.d.cts +148 -0
  31. package/dist/offline/index.d.ts +148 -0
  32. package/dist/offline/index.js +415 -0
  33. package/dist/offline/index.js.map +1 -0
  34. package/dist/optimization/index.cjs +797 -0
  35. package/dist/optimization/index.cjs.map +1 -0
  36. package/dist/optimization/index.d.cts +347 -0
  37. package/dist/optimization/index.d.ts +347 -0
  38. package/dist/optimization/index.js +787 -0
  39. package/dist/optimization/index.js.map +1 -0
  40. package/dist/persistence/index.cjs +145 -0
  41. package/dist/persistence/index.cjs.map +1 -0
  42. package/dist/persistence/index.d.cts +63 -0
  43. package/dist/persistence/index.d.ts +63 -0
  44. package/dist/persistence/index.js +142 -0
  45. package/dist/persistence/index.js.map +1 -0
  46. package/dist/presence/index.cjs +489 -0
  47. package/dist/presence/index.cjs.map +1 -0
  48. package/dist/presence/index.d.cts +283 -0
  49. package/dist/presence/index.d.ts +283 -0
  50. package/dist/presence/index.js +485 -0
  51. package/dist/presence/index.js.map +1 -0
  52. package/dist/types-CMxO7QF0.d.cts +33 -0
  53. package/dist/types-CMxO7QF0.d.ts +33 -0
  54. package/dist/versioning/index.cjs +296 -14
  55. package/dist/versioning/index.cjs.map +1 -1
  56. package/dist/versioning/index.d.cts +66 -1
  57. package/dist/versioning/index.d.ts +66 -1
  58. package/dist/versioning/index.js +296 -14
  59. package/dist/versioning/index.js.map +1 -1
  60. package/package.json +51 -1
  61. package/dist/index-C_4CMV5c.d.cts +0 -1207
  62. package/dist/index-C_4CMV5c.d.ts +0 -1207
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/logger.ts","../../src/optimization/PrefetchingEngine.ts","../../src/optimization/BatchTimingOptimizer.ts","../../src/optimization/AdaptiveCompressionOptimizer.ts"],"names":["logger"],"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 * Prefetching Engine (Phase 13)\n *\n * Predictively pre-compresses batches based on detected operation patterns.\n * Analyzes historical data to predict which operations are most likely to occur.\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 * Pattern in operation sequence\n */\nexport interface OperationPattern {\n sequence: string[];\n frequency: number;\n probability: number;\n lastOccurred: number;\n avgIntervalMs: number;\n}\n\n/**\n * Prediction for next operations\n */\nexport interface OperationPrediction {\n operationType: string;\n probability: number;\n reason: string;\n shouldPrefetch: boolean;\n estimatedTimeMs: number;\n}\n\n/**\n * Prefetched batch\n */\nexport interface PrefetchedBatch {\n id: string;\n operationType: string;\n compressed: Uint8Array;\n compressedSize: number;\n originalSize: number;\n compressionRatio: number;\n compressed_at: number;\n created_at: number;\n ttl: number;\n expiresAt: number;\n hitCount: number;\n missCount: number;\n}\n\n/**\n * Prefetching statistics\n */\nexport interface PrefetchingStats {\n totalPrefetched: number;\n totalHits: number;\n totalMisses: number;\n totalOverwrites: number;\n hitRatio: number;\n bandwidthSaved: number;\n patternsDetected: number;\n predictionAccuracy: number;\n}\n\n// ============================================================================\n// Prefetching Engine\n// ============================================================================\n\nexport class PrefetchingEngine {\n private operationHistory: Array<{\n type: string;\n timestamp: number;\n size: number;\n }> = [];\n private patterns: Map<string, OperationPattern> = new Map();\n private prefetchCache: Map<string, PrefetchedBatch[]> = new Map();\n private maxHistoryEntries = 1000;\n private maxCachePerType = 5;\n private prefetchTTL = 5 * 60 * 1000; // 5 minutes\n private predictionThreshold = 0.3;\n private stats: PrefetchingStats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n private lastPredictionTime = 0;\n private predictionInterval = 30 * 1000;\n\n constructor() {\n logger.debug('[PrefetchingEngine] Initialized', {\n ttl: this.prefetchTTL,\n threshold: this.predictionThreshold,\n });\n }\n\n /**\n * Record operation for pattern analysis\n */\n recordOperation(operationType: string, size: number): void {\n const now = Date.now();\n\n this.operationHistory.push({\n type: operationType,\n timestamp: now,\n size,\n });\n\n if (this.operationHistory.length > this.maxHistoryEntries) {\n this.operationHistory.shift();\n }\n\n // Clean expired prefetches periodically\n if (Math.random() < 0.1) {\n this.cleanExpiredPrefetches();\n }\n\n logger.debug('[PrefetchingEngine] Operation recorded', {\n type: operationType,\n size,\n historySize: this.operationHistory.length,\n });\n }\n\n /**\n * Analyze patterns in operation history\n */\n private analyzePatterns(): void {\n if (this.operationHistory.length < 5) {\n return;\n }\n\n const patterns = new Map<string, OperationPattern>();\n\n // Find 2-3 operation sequences\n for (let length = 2; length <= 3; length++) {\n for (let i = 0; i < this.operationHistory.length - length; i++) {\n const sequence = this.operationHistory\n .slice(i, i + length)\n .map((op) => op.type);\n const key = sequence.join(' → ');\n\n if (!patterns.has(key)) {\n patterns.set(key, {\n sequence,\n frequency: 0,\n probability: 0,\n lastOccurred: 0,\n avgIntervalMs: 0,\n });\n }\n\n const pattern = patterns.get(key)!;\n pattern.frequency++;\n pattern.lastOccurred = Date.now();\n }\n }\n\n // Calculate probabilities\n const totalSequences = this.operationHistory.length;\n\n for (const [key, pattern] of patterns.entries()) {\n pattern.probability = Math.min(1, pattern.frequency / totalSequences);\n }\n\n this.patterns = patterns;\n this.stats.patternsDetected = patterns.size;\n\n logger.debug('[PrefetchingEngine] Patterns analyzed', {\n patternsFound: patterns.size,\n });\n }\n\n /**\n * Predict next operations\n */\n predictNextOperations(recentOperations: Operation[]): OperationPrediction[] {\n const now = Date.now();\n\n if (now - this.lastPredictionTime > this.predictionInterval) {\n this.analyzePatterns();\n this.lastPredictionTime = now;\n }\n\n if (this.patterns.size === 0) {\n return [];\n }\n\n const predictions: OperationPrediction[] = [];\n const recentTypeSequence = recentOperations\n .slice(-3)\n .map((op) => op.type)\n .join(' → ');\n\n for (const [key, pattern] of this.patterns.entries()) {\n if (key.includes(recentTypeSequence)) {\n const nextType = pattern.sequence[pattern.sequence.length - 1];\n\n const prediction: OperationPrediction = {\n operationType: nextType,\n probability: pattern.probability,\n reason: `Detected pattern: ${key}`,\n shouldPrefetch: pattern.probability > this.predictionThreshold,\n estimatedTimeMs: pattern.avgIntervalMs,\n };\n\n predictions.push(prediction);\n }\n }\n\n // Deduplicate and sort\n const deduped = Array.from(\n new Map(predictions.map((p) => [p.operationType, p])).values(),\n ).sort((a, b) => b.probability - a.probability);\n\n logger.debug('[PrefetchingEngine] Predictions', {\n predictions: deduped.slice(0, 3).map((p) => ({\n type: p.operationType,\n probability: (p.probability * 100).toFixed(1) + '%',\n })),\n });\n\n return deduped;\n }\n\n /**\n * Add prefetched batch\n */\n addPrefetchedBatch(\n operationType: string,\n compressed: Uint8Array,\n originalSize: number,\n ): PrefetchedBatch {\n if (!this.prefetchCache.has(operationType)) {\n this.prefetchCache.set(operationType, []);\n }\n\n const cache = this.prefetchCache.get(operationType)!;\n\n if (cache.length >= this.maxCachePerType) {\n const oldest = cache.shift()!;\n if (oldest.hitCount === 0) {\n this.stats.totalMisses++;\n } else {\n this.stats.totalOverwrites++;\n }\n }\n\n const batch: PrefetchedBatch = {\n id: `prefetch-${operationType}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n operationType,\n compressed,\n compressedSize: compressed.length,\n originalSize,\n compressionRatio: 1 - compressed.length / originalSize,\n compressed_at: Date.now(),\n created_at: Date.now(),\n ttl: this.prefetchTTL,\n expiresAt: Date.now() + this.prefetchTTL,\n hitCount: 0,\n missCount: 0,\n };\n\n cache.push(batch);\n this.stats.totalPrefetched++;\n this.stats.bandwidthSaved += originalSize - compressed.length;\n\n logger.debug('[PrefetchingEngine] Prefetched batch added', {\n type: operationType,\n id: batch.id,\n ratio: (batch.compressionRatio * 100).toFixed(1) + '%',\n });\n\n return batch;\n }\n\n /**\n * Try to use prefetched batch\n */\n getPrefetchedBatch(operationType: string): PrefetchedBatch | null {\n const cache = this.prefetchCache.get(operationType);\n if (!cache || cache.length === 0) {\n return null;\n }\n\n const now = Date.now();\n for (let i = 0; i < cache.length; i++) {\n const batch = cache[i];\n\n if (batch.expiresAt > now) {\n batch.hitCount++;\n this.stats.totalHits++;\n this.updatePredictionAccuracy(true);\n\n logger.debug('[PrefetchingEngine] Prefetch hit', {\n type: operationType,\n id: batch.id,\n });\n\n return batch;\n } else {\n cache.splice(i, 1);\n i--;\n batch.missCount++;\n this.stats.totalMisses++;\n this.updatePredictionAccuracy(false);\n }\n }\n\n return null;\n }\n\n /**\n * Update prediction accuracy metric\n */\n private updatePredictionAccuracy(hit: boolean): void {\n const total = this.stats.totalHits + this.stats.totalMisses;\n if (total === 0) return;\n\n this.stats.predictionAccuracy = this.stats.totalHits / total;\n }\n\n /**\n * Clean expired prefetches\n */\n private cleanExpiredPrefetches(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [type, cache] of this.prefetchCache.entries()) {\n for (let i = cache.length - 1; i >= 0; i--) {\n if (cache[i].expiresAt < now) {\n const batch = cache.splice(i, 1)[0];\n if (batch.hitCount === 0) {\n this.stats.totalMisses++;\n }\n cleanedCount++;\n }\n }\n\n if (cache.length === 0) {\n this.prefetchCache.delete(type);\n }\n }\n\n if (cleanedCount > 0) {\n logger.debug('[PrefetchingEngine] Cleaned expired prefetches', {\n count: cleanedCount,\n });\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): PrefetchingStats {\n const total = this.stats.totalHits + this.stats.totalMisses;\n this.stats.hitRatio = total > 0 ? this.stats.totalHits / total : 0;\n\n return { ...this.stats };\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.operationHistory = [];\n this.patterns.clear();\n this.prefetchCache.clear();\n this.stats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n logger.debug('[PrefetchingEngine] Cleared all caches');\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet prefetchingEngineInstance: PrefetchingEngine | null = null;\n\nexport function getPrefetchingEngine(): PrefetchingEngine {\n if (!prefetchingEngineInstance) {\n prefetchingEngineInstance = new PrefetchingEngine();\n }\n return prefetchingEngineInstance;\n}\n\nexport function resetPrefetchingEngine(): void {\n prefetchingEngineInstance = null;\n}\n","/**\n * Batch Timing Optimizer (Phase 13)\n *\n * Intelligently schedules batch transmission based on network conditions,\n * device resources, and user activity patterns.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network window quality assessment\n */\nexport interface NetworkWindow {\n startTime: number;\n endTime: number;\n expectedDurationMs: number;\n latencyMs: number;\n bandwidthMbps: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n isStable: boolean;\n congestionLevel: number;\n recommendedBatchSize: number;\n}\n\n/**\n * Activity pattern\n */\nexport interface ActivityPattern {\n type: 'user-active' | 'idle' | 'background' | 'sleep';\n startTime: number;\n duration: number;\n probability: number;\n}\n\n/**\n * Batch scheduling decision\n */\nexport interface SchedulingDecision {\n shouldSendNow: boolean;\n nextOptimalWindowMs: number;\n recommendedDelay: number;\n reason: string;\n priority: 'critical' | 'high' | 'normal' | 'low';\n estimatedDeliveryMs: number;\n}\n\n/**\n * Batch timing statistics\n */\nexport interface BatchTimingStats {\n totalBatches: number;\n immediateDeliveries: number;\n deferredBatches: number;\n averageWaitTimeMs: number;\n averageDeliveryTimeMs: number;\n networkWindowsUsed: number;\n congestionAvoided: number;\n userFocusedOptimizations: number;\n}\n\n// ============================================================================\n// Batch Timing Optimizer\n// ============================================================================\n\nexport class BatchTimingOptimizer {\n private networkHistory: Array<{\n latencyMs: number;\n bandwidthMbps: number;\n timestamp: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n }> = [];\n private activityHistory: ActivityPattern[] = [];\n private stats: BatchTimingStats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n private lastActivityTime = Date.now();\n private isUserActive = true;\n private congestionDetectionWindow = 60 * 1000;\n private optimalBatchSize = 50 * 1024;\n\n constructor() {\n logger.debug('[BatchTimingOptimizer] Initialized', {\n congestionWindow: this.congestionDetectionWindow,\n optimalBatchSize: this.optimalBatchSize,\n });\n }\n\n /**\n * Record network measurement\n */\n recordNetworkMeasurement(latencyMs: number, bandwidthMbps: number): void {\n const quality = this.assessNetworkQuality(latencyMs, bandwidthMbps);\n\n this.networkHistory.push({\n latencyMs,\n bandwidthMbps,\n timestamp: Date.now(),\n quality,\n });\n\n if (this.networkHistory.length > 100) {\n this.networkHistory.shift();\n }\n\n this.stats.networkWindowsUsed++;\n\n logger.debug('[BatchTimingOptimizer] Network measured', {\n latency: latencyMs + 'ms',\n bandwidth: bandwidthMbps.toFixed(1) + ' Mbps',\n quality,\n });\n }\n\n /**\n * Assess network quality\n */\n private assessNetworkQuality(\n latencyMs: number,\n bandwidthMbps: number,\n ): 'excellent' | 'good' | 'fair' | 'poor' {\n if (latencyMs < 20 && bandwidthMbps > 10) return 'excellent';\n if (latencyMs < 50 && bandwidthMbps > 5) return 'good';\n if (latencyMs < 100 && bandwidthMbps > 2) return 'fair';\n return 'poor';\n }\n\n /**\n * Detect congestion in network\n */\n private detectCongestion(): number {\n const recentMeasurements = this.networkHistory.filter(\n (m) => Date.now() - m.timestamp < this.congestionDetectionWindow,\n );\n\n if (recentMeasurements.length < 3) {\n return 0;\n }\n\n const poorCount = recentMeasurements.filter(\n (m) => m.quality === 'poor',\n ).length;\n\n return poorCount / recentMeasurements.length;\n }\n\n /**\n * Find next optimal network window\n */\n private findOptimalWindow(): NetworkWindow {\n const now = Date.now();\n\n const recentMeasurements = this.networkHistory.slice(-20);\n if (recentMeasurements.length === 0) {\n return {\n startTime: now,\n endTime: now + 1000,\n expectedDurationMs: 1000,\n latencyMs: 50,\n bandwidthMbps: 5,\n quality: 'good',\n isStable: true,\n congestionLevel: 0,\n recommendedBatchSize: this.optimalBatchSize,\n };\n }\n\n const avgLatency =\n recentMeasurements.reduce((sum, m) => sum + m.latencyMs, 0) /\n recentMeasurements.length;\n const avgBandwidth =\n recentMeasurements.reduce((sum, m) => sum + m.bandwidthMbps, 0) /\n recentMeasurements.length;\n\n const latencyVariance =\n Math.sqrt(\n recentMeasurements.reduce(\n (sum, m) => sum + Math.pow(m.latencyMs - avgLatency, 2),\n 0,\n ) / recentMeasurements.length,\n ) / avgLatency;\n\n const isStable = latencyVariance < 0.2;\n const congestionLevel = this.detectCongestion();\n const quality = this.assessNetworkQuality(avgLatency, avgBandwidth);\n\n const recommendedBatchSize = Math.max(\n 10 * 1024,\n Math.min(500 * 1024, (avgBandwidth * 1024 * 100) / 8),\n );\n\n return {\n startTime: now,\n endTime: now + (isStable ? 30 * 1000 : 10 * 1000),\n expectedDurationMs: isStable ? 30 * 1000 : 10 * 1000,\n latencyMs: avgLatency,\n bandwidthMbps: avgBandwidth,\n quality,\n isStable,\n congestionLevel,\n recommendedBatchSize,\n };\n }\n\n /**\n * Get scheduling decision for a batch\n */\n getSchedulingDecision(\n batchSize: number,\n batchPriority: 'critical' | 'high' | 'normal' | 'low' = 'normal',\n isUserTriggered = false,\n ): SchedulingDecision {\n const now = Date.now();\n const currentWindow = this.findOptimalWindow();\n const congestionLevel = this.detectCongestion();\n\n let shouldSendNow = false;\n let recommendedDelay = 0;\n let reason = '';\n let priority = batchPriority;\n\n if (priority === 'critical') {\n shouldSendNow = true;\n reason = 'Critical operation (bypass optimization)';\n } else if (isUserTriggered && this.isUserActive) {\n shouldSendNow = true;\n reason = 'User-triggered operation';\n priority = 'high';\n } else if (\n currentWindow.quality === 'excellent' ||\n currentWindow.quality === 'good'\n ) {\n if (congestionLevel < 0.3) {\n shouldSendNow = true;\n reason = 'Good network conditions';\n } else {\n shouldSendNow = true;\n reason = 'Good network despite some congestion';\n recommendedDelay = 1000 + Math.random() * 2000;\n }\n } else if (currentWindow.quality === 'fair') {\n if (priority === 'high') {\n shouldSendNow = true;\n reason = 'High priority despite fair network';\n } else {\n shouldSendNow = false;\n reason = 'Fair network: waiting for better window';\n recommendedDelay = 30 * 1000 + Math.random() * 30 * 1000;\n }\n } else {\n shouldSendNow = false;\n reason = 'Poor network conditions: deferring';\n if (priority === 'high') {\n recommendedDelay = 60 * 1000 + Math.random() * 30 * 1000;\n } else {\n recommendedDelay = 120 * 1000 + Math.random() * 60 * 1000;\n }\n }\n\n const estimatedDeliveryMs =\n (batchSize / ((currentWindow.bandwidthMbps * 1024 * 1024) / 8)) * 1000 +\n currentWindow.latencyMs +\n recommendedDelay;\n\n const decision: SchedulingDecision = {\n shouldSendNow,\n nextOptimalWindowMs: now + recommendedDelay,\n recommendedDelay,\n reason,\n priority,\n estimatedDeliveryMs,\n };\n\n logger.debug('[BatchTimingOptimizer] Scheduling decision', {\n size: (batchSize / 1024).toFixed(1) + ' KB',\n shouldSendNow,\n delay: recommendedDelay + 'ms',\n reason,\n });\n\n return decision;\n }\n\n /**\n * Apply scheduling and update stats\n */\n applyScheduling(\n batchSize: number,\n sendNow: boolean,\n actualDelay: number,\n ): void {\n this.stats.totalBatches++;\n\n if (sendNow) {\n this.stats.immediateDeliveries++;\n } else {\n this.stats.deferredBatches++;\n }\n\n const totalWait =\n this.stats.averageWaitTimeMs * (this.stats.totalBatches - 1) +\n actualDelay;\n this.stats.averageWaitTimeMs = totalWait / this.stats.totalBatches;\n\n if (this.detectCongestion() > 0.3 && !sendNow) {\n this.stats.congestionAvoided++;\n }\n\n if (this.isUserActive) {\n this.stats.userFocusedOptimizations++;\n }\n\n this.stats.networkWindowsUsed++;\n }\n\n /**\n * Get optimal batch size recommendation\n */\n getOptimalBatchSize(): number {\n const window = this.findOptimalWindow();\n return window.recommendedBatchSize;\n }\n\n /**\n * Get current network window\n */\n getCurrentNetworkWindow(): NetworkWindow {\n return this.findOptimalWindow();\n }\n\n /**\n * Set user activity state\n */\n setUserActive(active: boolean): void {\n this.isUserActive = active;\n if (active) {\n this.lastActivityTime = Date.now();\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): BatchTimingStats {\n return { ...this.stats };\n }\n\n /**\n * Clear history\n */\n clear(): void {\n this.networkHistory = [];\n this.activityHistory = [];\n this.stats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet batchTimingOptimizerInstance: BatchTimingOptimizer | null = null;\n\nexport function getBatchTimingOptimizer(): BatchTimingOptimizer {\n if (!batchTimingOptimizerInstance) {\n batchTimingOptimizerInstance = new BatchTimingOptimizer();\n }\n return batchTimingOptimizerInstance;\n}\n\nexport function resetBatchTimingOptimizer(): void {\n batchTimingOptimizerInstance = null;\n}\n","/**\n * Adaptive Compression Optimizer (Phase 13)\n *\n * Automatically adjusts compression level based on network conditions,\n * device capabilities, and real-time performance metrics.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { CompressionStats } from '../compression/CompressionEngine';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network conditions affecting compression\n */\nexport interface NetworkProfile {\n estimatedSpeedKbps: number;\n latencyMs: number;\n isOnline: boolean;\n isWifi: boolean;\n isFast: boolean;\n isSlow: boolean;\n isEmpty: boolean;\n}\n\n/**\n * Device capabilities for compression\n */\nexport interface DeviceProfile {\n cpuCores: number;\n cpuUtilization: number;\n memoryAvailableMB: number;\n memoryTotalMB: number;\n isConstrained: boolean;\n isPremium: boolean;\n supportsWebWorkers: boolean;\n supportsWebAssembly: boolean;\n}\n\n/**\n * Compression recommendation based on conditions\n */\nexport interface CompressionRecommendation {\n recommendedLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n reason: string;\n confidence: number;\n estimatedCompressionMs: number;\n estimatedRatio: number;\n networkFactor: number;\n deviceFactor: number;\n}\n\n/**\n * Adaptive compression statistics\n */\nexport interface AdaptiveStats {\n currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n averageCompressionMs: number;\n averageRatio: number;\n levelsUsed: Set<number>;\n adjustmentCount: number;\n totalBatches: number;\n networkCondition: 'fast' | 'normal' | 'slow' | 'offline';\n}\n\n// ============================================================================\n// Adaptive Compression Optimizer\n// ============================================================================\n\nexport class AdaptiveCompressionOptimizer {\n private currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 = 6;\n private networkProfile: NetworkProfile = {\n estimatedSpeedKbps: 5000,\n latencyMs: 50,\n isOnline: true,\n isWifi: false,\n isFast: true,\n isSlow: false,\n isEmpty: false,\n };\n private deviceProfile: DeviceProfile = {\n cpuCores: 4,\n cpuUtilization: 0.3,\n memoryAvailableMB: 512,\n memoryTotalMB: 1024,\n isConstrained: false,\n isPremium: false,\n supportsWebWorkers: true,\n supportsWebAssembly: true,\n };\n private compressionHistory: Array<{\n level: number;\n ratio: number;\n timeMs: number;\n timestamp: number;\n }> = [];\n private stats: AdaptiveStats = {\n currentLevel: 6,\n averageCompressionMs: 10,\n averageRatio: 0.85,\n levelsUsed: new Set([6]),\n adjustmentCount: 0,\n totalBatches: 0,\n networkCondition: 'normal',\n };\n\n constructor() {\n logger.debug('[AdaptiveCompressionOptimizer] Initialized', {\n level: this.currentLevel,\n });\n }\n\n /**\n * Update network conditions\n */\n updateNetworkConditions(\n speedKbps: number,\n latencyMs?: number,\n isOnline?: boolean,\n ): void {\n this.networkProfile.estimatedSpeedKbps = speedKbps;\n if (latencyMs !== undefined) {\n this.networkProfile.latencyMs = latencyMs;\n }\n if (isOnline !== undefined) {\n this.networkProfile.isOnline = isOnline;\n }\n\n this.networkProfile.isFast = speedKbps > 5000;\n this.networkProfile.isSlow = speedKbps < 1000;\n this.networkProfile.isEmpty = speedKbps < 100;\n\n if (isOnline === false) {\n this.stats.networkCondition = 'offline';\n } else if (this.networkProfile.isSlow) {\n this.stats.networkCondition = 'slow';\n } else if (this.networkProfile.isFast) {\n this.stats.networkCondition = 'fast';\n } else {\n this.stats.networkCondition = 'normal';\n }\n\n logger.debug('[AdaptiveCompressionOptimizer] Network updated', {\n speedKbps,\n condition: this.stats.networkCondition,\n });\n }\n\n /**\n * Update device resource usage\n */\n updateDeviceResources(\n cpuUtilization: number,\n memoryAvailableMB: number,\n ): void {\n this.deviceProfile.cpuUtilization = Math.max(\n 0,\n Math.min(1, cpuUtilization),\n );\n this.deviceProfile.memoryAvailableMB = memoryAvailableMB;\n this.deviceProfile.isConstrained = memoryAvailableMB < 512;\n this.deviceProfile.isPremium = memoryAvailableMB > 2048;\n\n logger.debug('[AdaptiveCompressionOptimizer] Device resources updated', {\n cpuUtilization: (cpuUtilization * 100).toFixed(1) + '%',\n memoryAvailableMB,\n });\n }\n\n /**\n * Record compression performance\n */\n recordCompressionPerformance(\n level: number,\n compressionMs: number,\n ratio: number,\n ): void {\n this.compressionHistory.push({\n level,\n ratio,\n timeMs: compressionMs,\n timestamp: Date.now(),\n });\n\n if (this.compressionHistory.length > 100) {\n this.compressionHistory.shift();\n }\n\n this.stats.totalBatches++;\n this.stats.averageCompressionMs =\n this.compressionHistory.reduce((sum, h) => sum + h.timeMs, 0) /\n this.compressionHistory.length;\n this.stats.averageRatio =\n this.compressionHistory.reduce((sum, h) => sum + h.ratio, 0) /\n this.compressionHistory.length;\n }\n\n /**\n * Get compression recommendation based on conditions\n */\n getRecommendedLevel(): CompressionRecommendation {\n const networkFactor = this.calculateNetworkFactor();\n const deviceFactor = this.calculateDeviceFactor();\n const combinedFactor = (networkFactor + deviceFactor) / 2;\n\n const recommendedLevel = Math.max(\n 1,\n Math.min(9, Math.round(combinedFactor * 9)),\n ) as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\n const estimatedCompressionMs =\n this.estimateCompressionTime(recommendedLevel);\n const estimatedRatio = this.estimateCompressionRatio(recommendedLevel);\n\n let reason = '';\n if (networkFactor < 0.3 && deviceFactor < 0.3) {\n reason = 'Slow network + constrained device: using level 1-2 (fast)';\n } else if (networkFactor > 0.7 && deviceFactor > 0.7) {\n reason =\n 'Fast network + premium device: using level 8-9 (best compression)';\n } else if (networkFactor > 0.7) {\n reason = 'Fast network: prioritizing compression ratio';\n } else if (deviceFactor < 0.3) {\n reason = 'Constrained device: prioritizing speed';\n } else {\n reason = 'Normal conditions: balanced compression level';\n }\n\n const recommendation: CompressionRecommendation = {\n recommendedLevel,\n reason,\n confidence: this.compressionHistory.length > 10 ? 0.9 : 0.5,\n estimatedCompressionMs,\n estimatedRatio,\n networkFactor,\n deviceFactor,\n };\n\n logger.debug(\n '[AdaptiveCompressionOptimizer] Recommendation',\n recommendation,\n );\n\n return recommendation;\n }\n\n /**\n * Calculate network factor (0-1)\n */\n private calculateNetworkFactor(): number {\n if (!this.networkProfile.isOnline) return 0;\n\n const speedMbps = this.networkProfile.estimatedSpeedKbps / 1000;\n\n if (speedMbps < 0.1) return 0;\n if (speedMbps < 1) return 0.1 + (speedMbps / 1) * 0.2;\n if (speedMbps < 5) return 0.3 + ((speedMbps - 1) / 4) * 0.3;\n if (speedMbps < 20) return 0.6 + ((speedMbps - 5) / 15) * 0.3;\n return Math.min(1, 0.9 + (speedMbps - 20) / 200);\n }\n\n /**\n * Calculate device factor (0-1)\n */\n private calculateDeviceFactor(): number {\n let factor = 0.5;\n\n if (this.deviceProfile.isPremium) {\n factor = 0.8;\n } else if (this.deviceProfile.isConstrained) {\n factor = 0.2;\n }\n\n if (this.deviceProfile.cpuUtilization > 0.8) {\n factor *= 0.7;\n } else if (this.deviceProfile.cpuUtilization < 0.2) {\n factor *= 1.1;\n }\n\n if (this.deviceProfile.supportsWebAssembly) {\n factor = Math.min(1, factor + 0.1);\n }\n\n return Math.max(0, Math.min(1, factor));\n }\n\n /**\n * Estimate compression time for a level (in ms)\n */\n private estimateCompressionTime(level: number): number {\n return Math.max(1, level * 2.5);\n }\n\n /**\n * Estimate compression ratio for a level\n */\n private estimateCompressionRatio(level: number): number {\n return 0.6 + (level / 9) * 0.3;\n }\n\n /**\n * Apply recommendation and get new level\n */\n applyRecommendation(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n const recommendation = this.getRecommendedLevel();\n const oldLevel = this.currentLevel;\n\n const shouldChange =\n recommendation.confidence > 0.7 ||\n Math.abs(recommendation.recommendedLevel - oldLevel) > 2;\n\n if (shouldChange) {\n this.currentLevel = recommendation.recommendedLevel;\n this.stats.levelsUsed.add(this.currentLevel);\n\n if (oldLevel !== this.currentLevel) {\n this.stats.adjustmentCount++;\n logger.debug('[AdaptiveCompressionOptimizer] Level adjusted', {\n from: oldLevel,\n to: this.currentLevel,\n reason: recommendation.reason,\n });\n }\n }\n\n this.stats.currentLevel = this.currentLevel;\n return this.currentLevel;\n }\n\n /**\n * Get current level\n */\n getCurrentLevel(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n return this.currentLevel;\n }\n\n /**\n * Get statistics\n */\n getStats(): AdaptiveStats {\n return { ...this.stats };\n }\n\n /**\n * Get detailed analysis\n */\n getDetailedAnalysis() {\n return {\n stats: this.stats,\n network: this.networkProfile,\n device: this.deviceProfile,\n recommendation: this.getRecommendedLevel(),\n history: this.compressionHistory.slice(-20),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet adaptiveOptimizerInstance: AdaptiveCompressionOptimizer | null = null;\n\nexport function getAdaptiveCompressionOptimizer(): AdaptiveCompressionOptimizer {\n if (!adaptiveOptimizerInstance) {\n adaptiveOptimizerInstance = new AdaptiveCompressionOptimizer();\n }\n return adaptiveOptimizerInstance;\n}\n\nexport function resetAdaptiveCompressionOptimizer(): void {\n adaptiveOptimizerInstance = null;\n}\n"]}
@@ -0,0 +1,145 @@
1
+ 'use strict';
2
+
3
+ // src/persistence/DashStorageAdapter.ts
4
+ var DashStorageAdapter = class {
5
+ backend;
6
+ syncClient;
7
+ syncDebounceMs;
8
+ maxPendingChanges;
9
+ onSyncError;
10
+ pendingChanges = /* @__PURE__ */ new Map();
11
+ syncTimer = null;
12
+ syncInFlight = false;
13
+ syncPending = false;
14
+ constructor(backend, options = {}) {
15
+ this.backend = backend;
16
+ this.syncClient = options.syncClient ?? null;
17
+ this.syncDebounceMs = options.syncDebounceMs ?? 50;
18
+ this.maxPendingChanges = options.maxPendingChanges ?? 5e3;
19
+ this.onSyncError = options.onSyncError ?? null;
20
+ }
21
+ async getItem(key) {
22
+ return await this.backend.get(key);
23
+ }
24
+ async setItem(key, value) {
25
+ await this.backend.set(key, value);
26
+ this.trackChange({
27
+ key,
28
+ operation: "set",
29
+ value,
30
+ timestamp: Date.now()
31
+ });
32
+ }
33
+ async removeItem(key) {
34
+ await this.backend.delete(key);
35
+ this.trackChange({
36
+ key,
37
+ operation: "delete",
38
+ timestamp: Date.now()
39
+ });
40
+ }
41
+ getPendingSyncCount() {
42
+ return this.pendingChanges.size;
43
+ }
44
+ async flushSync() {
45
+ if (!this.syncClient || this.pendingChanges.size === 0) {
46
+ return;
47
+ }
48
+ if (this.syncTimer) {
49
+ clearTimeout(this.syncTimer);
50
+ this.syncTimer = null;
51
+ }
52
+ await this.performSync();
53
+ }
54
+ trackChange(change) {
55
+ this.pendingChanges.set(change.key, change);
56
+ this.enforcePendingLimit();
57
+ this.scheduleSync();
58
+ }
59
+ enforcePendingLimit() {
60
+ if (this.pendingChanges.size <= this.maxPendingChanges) {
61
+ return;
62
+ }
63
+ const sorted = Array.from(this.pendingChanges.values()).sort(
64
+ (a, b) => a.timestamp - b.timestamp
65
+ );
66
+ const overflow = this.pendingChanges.size - this.maxPendingChanges;
67
+ for (let i = 0; i < overflow; i++) {
68
+ const toDrop = sorted[i];
69
+ if (toDrop) {
70
+ this.pendingChanges.delete(toDrop.key);
71
+ }
72
+ }
73
+ }
74
+ scheduleSync() {
75
+ if (!this.syncClient) {
76
+ return;
77
+ }
78
+ if (this.syncTimer) {
79
+ clearTimeout(this.syncTimer);
80
+ }
81
+ this.syncTimer = setTimeout(() => {
82
+ void this.performSync();
83
+ }, this.syncDebounceMs);
84
+ }
85
+ async performSync() {
86
+ if (!this.syncClient) {
87
+ return;
88
+ }
89
+ if (this.syncInFlight) {
90
+ this.syncPending = true;
91
+ return;
92
+ }
93
+ const changes = Array.from(this.pendingChanges.values()).sort(
94
+ (a, b) => a.timestamp - b.timestamp
95
+ );
96
+ if (changes.length === 0) {
97
+ return;
98
+ }
99
+ this.pendingChanges.clear();
100
+ this.syncInFlight = true;
101
+ try {
102
+ await this.syncClient.syncChanges(changes);
103
+ } catch (error) {
104
+ for (const change of changes) {
105
+ const current = this.pendingChanges.get(change.key);
106
+ if (!current || change.timestamp > current.timestamp) {
107
+ this.pendingChanges.set(change.key, change);
108
+ }
109
+ }
110
+ if (this.onSyncError) {
111
+ const normalizedError = error instanceof Error ? error : new Error(String(error));
112
+ this.onSyncError(normalizedError, changes);
113
+ }
114
+ } finally {
115
+ this.syncInFlight = false;
116
+ const rerun = this.syncPending || this.pendingChanges.size > 0;
117
+ this.syncPending = false;
118
+ if (rerun) {
119
+ this.scheduleSync();
120
+ }
121
+ }
122
+ }
123
+ };
124
+
125
+ // src/persistence/InMemoryStorageAdapter.ts
126
+ var InMemoryStorageAdapter = class {
127
+ store = /* @__PURE__ */ new Map();
128
+ getItem(key) {
129
+ return this.store.get(key) ?? null;
130
+ }
131
+ setItem(key, value) {
132
+ this.store.set(key, value);
133
+ }
134
+ removeItem(key) {
135
+ this.store.delete(key);
136
+ }
137
+ clear() {
138
+ this.store.clear();
139
+ }
140
+ };
141
+
142
+ exports.DashStorageAdapter = DashStorageAdapter;
143
+ exports.InMemoryStorageAdapter = InMemoryStorageAdapter;
144
+ //# sourceMappingURL=index.cjs.map
145
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/persistence/DashStorageAdapter.ts","../../src/persistence/InMemoryStorageAdapter.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { StorageAdapter } from './types';\n\nexport interface DashStorageBackend {\n get(key: string): Promise<string | null> | string | null;\n set(key: string, value: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n}\n\nexport interface DashStorageChange {\n key: string;\n operation: 'set' | 'delete';\n value?: string;\n timestamp: number;\n}\n\nexport interface DashSyncClient {\n syncChanges(changes: DashStorageChange[]): Promise<void>;\n}\n\nexport interface DashStorageAdapterOptions {\n syncClient?: DashSyncClient;\n syncDebounceMs?: number;\n maxPendingChanges?: number;\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n}\n\n/**\n * Storage adapter boundary for dash-backed persistence.\n *\n * Writes are local-first through the provided backend and optionally synced\n * to D1/R2 via a sync client using debounced change batches.\n */\nexport class DashStorageAdapter implements StorageAdapter {\n private readonly backend: DashStorageBackend;\n private readonly syncClient: DashSyncClient | null;\n private readonly syncDebounceMs: number;\n private readonly maxPendingChanges: number;\n private readonly onSyncError: ((error: Error, changes: DashStorageChange[]) => void) | null;\n private readonly pendingChanges = new Map<string, DashStorageChange>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private syncInFlight = false;\n private syncPending = false;\n\n constructor(\n backend: DashStorageBackend,\n options: DashStorageAdapterOptions = {},\n ) {\n this.backend = backend;\n this.syncClient = options.syncClient ?? null;\n this.syncDebounceMs = options.syncDebounceMs ?? 50;\n this.maxPendingChanges = options.maxPendingChanges ?? 5000;\n this.onSyncError = options.onSyncError ?? null;\n }\n\n async getItem(key: string): Promise<string | null> {\n return await this.backend.get(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.backend.set(key, value);\n this.trackChange({\n key,\n operation: 'set',\n value,\n timestamp: Date.now(),\n });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.backend.delete(key);\n this.trackChange({\n key,\n operation: 'delete',\n timestamp: Date.now(),\n });\n }\n\n getPendingSyncCount(): number {\n return this.pendingChanges.size;\n }\n\n async flushSync(): Promise<void> {\n if (!this.syncClient || this.pendingChanges.size === 0) {\n return;\n }\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n await this.performSync();\n }\n\n private trackChange(change: DashStorageChange): void {\n this.pendingChanges.set(change.key, change);\n this.enforcePendingLimit();\n this.scheduleSync();\n }\n\n private enforcePendingLimit(): void {\n if (this.pendingChanges.size <= this.maxPendingChanges) {\n return;\n }\n\n const sorted = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n );\n const overflow = this.pendingChanges.size - this.maxPendingChanges;\n for (let i = 0; i < overflow; i++) {\n const toDrop = sorted[i];\n if (toDrop) {\n this.pendingChanges.delete(toDrop.key);\n }\n }\n }\n\n private scheduleSync(): void {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n }\n\n this.syncTimer = setTimeout(() => {\n void this.performSync();\n }, this.syncDebounceMs);\n }\n\n private async performSync(): Promise<void> {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncInFlight) {\n this.syncPending = true;\n return;\n }\n\n const changes = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n );\n if (changes.length === 0) {\n return;\n }\n\n this.pendingChanges.clear();\n this.syncInFlight = true;\n try {\n await this.syncClient.syncChanges(changes);\n } catch (error) {\n for (const change of changes) {\n const current = this.pendingChanges.get(change.key);\n if (!current || change.timestamp > current.timestamp) {\n this.pendingChanges.set(change.key, change);\n }\n }\n\n if (this.onSyncError) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n this.onSyncError(normalizedError, changes);\n }\n } finally {\n this.syncInFlight = false;\n const rerun = this.syncPending || this.pendingChanges.size > 0;\n this.syncPending = false;\n if (rerun) {\n this.scheduleSync();\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\n/**\n * In-memory adapter for tests and ephemeral runtimes.\n */\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n"]}
@@ -0,0 +1,63 @@
1
+ import { S as StorageAdapter } from '../types-CMxO7QF0.cjs';
2
+ export { P as PersistedEnvelope, a as PersistenceDeserializer, b as PersistenceSerializer } from '../types-CMxO7QF0.cjs';
3
+
4
+ interface DashStorageBackend {
5
+ get(key: string): Promise<string | null> | string | null;
6
+ set(key: string, value: string): Promise<void> | void;
7
+ delete(key: string): Promise<void> | void;
8
+ }
9
+ interface DashStorageChange {
10
+ key: string;
11
+ operation: 'set' | 'delete';
12
+ value?: string;
13
+ timestamp: number;
14
+ }
15
+ interface DashSyncClient {
16
+ syncChanges(changes: DashStorageChange[]): Promise<void>;
17
+ }
18
+ interface DashStorageAdapterOptions {
19
+ syncClient?: DashSyncClient;
20
+ syncDebounceMs?: number;
21
+ maxPendingChanges?: number;
22
+ onSyncError?: (error: Error, changes: DashStorageChange[]) => void;
23
+ }
24
+ /**
25
+ * Storage adapter boundary for dash-backed persistence.
26
+ *
27
+ * Writes are local-first through the provided backend and optionally synced
28
+ * to D1/R2 via a sync client using debounced change batches.
29
+ */
30
+ declare class DashStorageAdapter implements StorageAdapter {
31
+ private readonly backend;
32
+ private readonly syncClient;
33
+ private readonly syncDebounceMs;
34
+ private readonly maxPendingChanges;
35
+ private readonly onSyncError;
36
+ private readonly pendingChanges;
37
+ private syncTimer;
38
+ private syncInFlight;
39
+ private syncPending;
40
+ constructor(backend: DashStorageBackend, options?: DashStorageAdapterOptions);
41
+ getItem(key: string): Promise<string | null>;
42
+ setItem(key: string, value: string): Promise<void>;
43
+ removeItem(key: string): Promise<void>;
44
+ getPendingSyncCount(): number;
45
+ flushSync(): Promise<void>;
46
+ private trackChange;
47
+ private enforcePendingLimit;
48
+ private scheduleSync;
49
+ private performSync;
50
+ }
51
+
52
+ /**
53
+ * In-memory adapter for tests and ephemeral runtimes.
54
+ */
55
+ declare class InMemoryStorageAdapter implements StorageAdapter {
56
+ private readonly store;
57
+ getItem(key: string): string | null;
58
+ setItem(key: string, value: string): void;
59
+ removeItem(key: string): void;
60
+ clear(): void;
61
+ }
62
+
63
+ export { DashStorageAdapter, type DashStorageAdapterOptions, type DashStorageBackend, type DashStorageChange, type DashSyncClient, InMemoryStorageAdapter, StorageAdapter };
@@ -0,0 +1,63 @@
1
+ import { S as StorageAdapter } from '../types-CMxO7QF0.js';
2
+ export { P as PersistedEnvelope, a as PersistenceDeserializer, b as PersistenceSerializer } from '../types-CMxO7QF0.js';
3
+
4
+ interface DashStorageBackend {
5
+ get(key: string): Promise<string | null> | string | null;
6
+ set(key: string, value: string): Promise<void> | void;
7
+ delete(key: string): Promise<void> | void;
8
+ }
9
+ interface DashStorageChange {
10
+ key: string;
11
+ operation: 'set' | 'delete';
12
+ value?: string;
13
+ timestamp: number;
14
+ }
15
+ interface DashSyncClient {
16
+ syncChanges(changes: DashStorageChange[]): Promise<void>;
17
+ }
18
+ interface DashStorageAdapterOptions {
19
+ syncClient?: DashSyncClient;
20
+ syncDebounceMs?: number;
21
+ maxPendingChanges?: number;
22
+ onSyncError?: (error: Error, changes: DashStorageChange[]) => void;
23
+ }
24
+ /**
25
+ * Storage adapter boundary for dash-backed persistence.
26
+ *
27
+ * Writes are local-first through the provided backend and optionally synced
28
+ * to D1/R2 via a sync client using debounced change batches.
29
+ */
30
+ declare class DashStorageAdapter implements StorageAdapter {
31
+ private readonly backend;
32
+ private readonly syncClient;
33
+ private readonly syncDebounceMs;
34
+ private readonly maxPendingChanges;
35
+ private readonly onSyncError;
36
+ private readonly pendingChanges;
37
+ private syncTimer;
38
+ private syncInFlight;
39
+ private syncPending;
40
+ constructor(backend: DashStorageBackend, options?: DashStorageAdapterOptions);
41
+ getItem(key: string): Promise<string | null>;
42
+ setItem(key: string, value: string): Promise<void>;
43
+ removeItem(key: string): Promise<void>;
44
+ getPendingSyncCount(): number;
45
+ flushSync(): Promise<void>;
46
+ private trackChange;
47
+ private enforcePendingLimit;
48
+ private scheduleSync;
49
+ private performSync;
50
+ }
51
+
52
+ /**
53
+ * In-memory adapter for tests and ephemeral runtimes.
54
+ */
55
+ declare class InMemoryStorageAdapter implements StorageAdapter {
56
+ private readonly store;
57
+ getItem(key: string): string | null;
58
+ setItem(key: string, value: string): void;
59
+ removeItem(key: string): void;
60
+ clear(): void;
61
+ }
62
+
63
+ export { DashStorageAdapter, type DashStorageAdapterOptions, type DashStorageBackend, type DashStorageChange, type DashSyncClient, InMemoryStorageAdapter, StorageAdapter };
@@ -0,0 +1,142 @@
1
+ // src/persistence/DashStorageAdapter.ts
2
+ var DashStorageAdapter = class {
3
+ backend;
4
+ syncClient;
5
+ syncDebounceMs;
6
+ maxPendingChanges;
7
+ onSyncError;
8
+ pendingChanges = /* @__PURE__ */ new Map();
9
+ syncTimer = null;
10
+ syncInFlight = false;
11
+ syncPending = false;
12
+ constructor(backend, options = {}) {
13
+ this.backend = backend;
14
+ this.syncClient = options.syncClient ?? null;
15
+ this.syncDebounceMs = options.syncDebounceMs ?? 50;
16
+ this.maxPendingChanges = options.maxPendingChanges ?? 5e3;
17
+ this.onSyncError = options.onSyncError ?? null;
18
+ }
19
+ async getItem(key) {
20
+ return await this.backend.get(key);
21
+ }
22
+ async setItem(key, value) {
23
+ await this.backend.set(key, value);
24
+ this.trackChange({
25
+ key,
26
+ operation: "set",
27
+ value,
28
+ timestamp: Date.now()
29
+ });
30
+ }
31
+ async removeItem(key) {
32
+ await this.backend.delete(key);
33
+ this.trackChange({
34
+ key,
35
+ operation: "delete",
36
+ timestamp: Date.now()
37
+ });
38
+ }
39
+ getPendingSyncCount() {
40
+ return this.pendingChanges.size;
41
+ }
42
+ async flushSync() {
43
+ if (!this.syncClient || this.pendingChanges.size === 0) {
44
+ return;
45
+ }
46
+ if (this.syncTimer) {
47
+ clearTimeout(this.syncTimer);
48
+ this.syncTimer = null;
49
+ }
50
+ await this.performSync();
51
+ }
52
+ trackChange(change) {
53
+ this.pendingChanges.set(change.key, change);
54
+ this.enforcePendingLimit();
55
+ this.scheduleSync();
56
+ }
57
+ enforcePendingLimit() {
58
+ if (this.pendingChanges.size <= this.maxPendingChanges) {
59
+ return;
60
+ }
61
+ const sorted = Array.from(this.pendingChanges.values()).sort(
62
+ (a, b) => a.timestamp - b.timestamp
63
+ );
64
+ const overflow = this.pendingChanges.size - this.maxPendingChanges;
65
+ for (let i = 0; i < overflow; i++) {
66
+ const toDrop = sorted[i];
67
+ if (toDrop) {
68
+ this.pendingChanges.delete(toDrop.key);
69
+ }
70
+ }
71
+ }
72
+ scheduleSync() {
73
+ if (!this.syncClient) {
74
+ return;
75
+ }
76
+ if (this.syncTimer) {
77
+ clearTimeout(this.syncTimer);
78
+ }
79
+ this.syncTimer = setTimeout(() => {
80
+ void this.performSync();
81
+ }, this.syncDebounceMs);
82
+ }
83
+ async performSync() {
84
+ if (!this.syncClient) {
85
+ return;
86
+ }
87
+ if (this.syncInFlight) {
88
+ this.syncPending = true;
89
+ return;
90
+ }
91
+ const changes = Array.from(this.pendingChanges.values()).sort(
92
+ (a, b) => a.timestamp - b.timestamp
93
+ );
94
+ if (changes.length === 0) {
95
+ return;
96
+ }
97
+ this.pendingChanges.clear();
98
+ this.syncInFlight = true;
99
+ try {
100
+ await this.syncClient.syncChanges(changes);
101
+ } catch (error) {
102
+ for (const change of changes) {
103
+ const current = this.pendingChanges.get(change.key);
104
+ if (!current || change.timestamp > current.timestamp) {
105
+ this.pendingChanges.set(change.key, change);
106
+ }
107
+ }
108
+ if (this.onSyncError) {
109
+ const normalizedError = error instanceof Error ? error : new Error(String(error));
110
+ this.onSyncError(normalizedError, changes);
111
+ }
112
+ } finally {
113
+ this.syncInFlight = false;
114
+ const rerun = this.syncPending || this.pendingChanges.size > 0;
115
+ this.syncPending = false;
116
+ if (rerun) {
117
+ this.scheduleSync();
118
+ }
119
+ }
120
+ }
121
+ };
122
+
123
+ // src/persistence/InMemoryStorageAdapter.ts
124
+ var InMemoryStorageAdapter = class {
125
+ store = /* @__PURE__ */ new Map();
126
+ getItem(key) {
127
+ return this.store.get(key) ?? null;
128
+ }
129
+ setItem(key, value) {
130
+ this.store.set(key, value);
131
+ }
132
+ removeItem(key) {
133
+ this.store.delete(key);
134
+ }
135
+ clear() {
136
+ this.store.clear();
137
+ }
138
+ };
139
+
140
+ export { DashStorageAdapter, InMemoryStorageAdapter };
141
+ //# sourceMappingURL=index.js.map
142
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/persistence/DashStorageAdapter.ts","../../src/persistence/InMemoryStorageAdapter.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { StorageAdapter } from './types';\n\nexport interface DashStorageBackend {\n get(key: string): Promise<string | null> | string | null;\n set(key: string, value: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n}\n\nexport interface DashStorageChange {\n key: string;\n operation: 'set' | 'delete';\n value?: string;\n timestamp: number;\n}\n\nexport interface DashSyncClient {\n syncChanges(changes: DashStorageChange[]): Promise<void>;\n}\n\nexport interface DashStorageAdapterOptions {\n syncClient?: DashSyncClient;\n syncDebounceMs?: number;\n maxPendingChanges?: number;\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n}\n\n/**\n * Storage adapter boundary for dash-backed persistence.\n *\n * Writes are local-first through the provided backend and optionally synced\n * to D1/R2 via a sync client using debounced change batches.\n */\nexport class DashStorageAdapter implements StorageAdapter {\n private readonly backend: DashStorageBackend;\n private readonly syncClient: DashSyncClient | null;\n private readonly syncDebounceMs: number;\n private readonly maxPendingChanges: number;\n private readonly onSyncError: ((error: Error, changes: DashStorageChange[]) => void) | null;\n private readonly pendingChanges = new Map<string, DashStorageChange>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private syncInFlight = false;\n private syncPending = false;\n\n constructor(\n backend: DashStorageBackend,\n options: DashStorageAdapterOptions = {},\n ) {\n this.backend = backend;\n this.syncClient = options.syncClient ?? null;\n this.syncDebounceMs = options.syncDebounceMs ?? 50;\n this.maxPendingChanges = options.maxPendingChanges ?? 5000;\n this.onSyncError = options.onSyncError ?? null;\n }\n\n async getItem(key: string): Promise<string | null> {\n return await this.backend.get(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.backend.set(key, value);\n this.trackChange({\n key,\n operation: 'set',\n value,\n timestamp: Date.now(),\n });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.backend.delete(key);\n this.trackChange({\n key,\n operation: 'delete',\n timestamp: Date.now(),\n });\n }\n\n getPendingSyncCount(): number {\n return this.pendingChanges.size;\n }\n\n async flushSync(): Promise<void> {\n if (!this.syncClient || this.pendingChanges.size === 0) {\n return;\n }\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n await this.performSync();\n }\n\n private trackChange(change: DashStorageChange): void {\n this.pendingChanges.set(change.key, change);\n this.enforcePendingLimit();\n this.scheduleSync();\n }\n\n private enforcePendingLimit(): void {\n if (this.pendingChanges.size <= this.maxPendingChanges) {\n return;\n }\n\n const sorted = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n );\n const overflow = this.pendingChanges.size - this.maxPendingChanges;\n for (let i = 0; i < overflow; i++) {\n const toDrop = sorted[i];\n if (toDrop) {\n this.pendingChanges.delete(toDrop.key);\n }\n }\n }\n\n private scheduleSync(): void {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n }\n\n this.syncTimer = setTimeout(() => {\n void this.performSync();\n }, this.syncDebounceMs);\n }\n\n private async performSync(): Promise<void> {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncInFlight) {\n this.syncPending = true;\n return;\n }\n\n const changes = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n );\n if (changes.length === 0) {\n return;\n }\n\n this.pendingChanges.clear();\n this.syncInFlight = true;\n try {\n await this.syncClient.syncChanges(changes);\n } catch (error) {\n for (const change of changes) {\n const current = this.pendingChanges.get(change.key);\n if (!current || change.timestamp > current.timestamp) {\n this.pendingChanges.set(change.key, change);\n }\n }\n\n if (this.onSyncError) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n this.onSyncError(normalizedError, changes);\n }\n } finally {\n this.syncInFlight = false;\n const rerun = this.syncPending || this.pendingChanges.size > 0;\n this.syncPending = false;\n if (rerun) {\n this.scheduleSync();\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\n/**\n * In-memory adapter for tests and ephemeral runtimes.\n */\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n"]}