@affectively/aeon 1.0.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.
- package/LICENSE +21 -0
- package/README.md +332 -0
- package/dist/core/index.cjs +4 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +146 -0
- package/dist/core/index.d.ts +146 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/distributed/index.cjs +1874 -0
- package/dist/distributed/index.cjs.map +1 -0
- package/dist/distributed/index.d.cts +2 -0
- package/dist/distributed/index.d.ts +2 -0
- package/dist/distributed/index.js +1869 -0
- package/dist/distributed/index.js.map +1 -0
- package/dist/index-C_4CMV5c.d.cts +1207 -0
- package/dist/index-C_4CMV5c.d.ts +1207 -0
- package/dist/index.cjs +4671 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +812 -0
- package/dist/index.d.ts +812 -0
- package/dist/index.js +4632 -0
- package/dist/index.js.map +1 -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 +871 -0
- package/dist/versioning/index.cjs.map +1 -0
- package/dist/versioning/index.d.cts +472 -0
- package/dist/versioning/index.d.ts +472 -0
- package/dist/versioning/index.js +866 -0
- package/dist/versioning/index.js.map +1 -0
- package/package.json +142 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/distributed/SyncCoordinator.ts","../../src/distributed/ReplicationManager.ts","../../src/distributed/SyncProtocol.ts","../../src/distributed/StateReconciler.ts"],"names":["EventEmitter","result"],"mappings":"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","file":"index.cjs","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 * Sync Coordinator\n *\n * Coordinates synchronization between multiple nodes in a distributed system.\n * Manages sync sessions, node registration, and synchronization workflows.\n *\n * Features:\n * - Node registration and discovery\n * - Sync session management\n * - Synchronization workflow orchestration\n * - Node health monitoring\n * - Conflict detection and resolution coordination\n * - DID-based node identification\n * - Authenticated sync sessions\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\n\nexport interface SyncNode {\n id: string;\n address: string;\n port: number;\n status: 'online' | 'offline' | 'syncing';\n lastHeartbeat: string;\n version: string;\n capabilities: string[];\n // DID-based identity (optional, for authenticated nodes)\n did?: string;\n // Public signing key for verification\n publicSigningKey?: JsonWebKey;\n // Public encryption key for E2E encryption\n publicEncryptionKey?: JsonWebKey;\n // Granted capabilities via UCAN\n grantedCapabilities?: string[];\n}\n\nexport interface SyncSession {\n id: string;\n initiatorId: string;\n participantIds: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n itemsSynced: number;\n itemsFailed: number;\n conflictsDetected: number;\n // Security fields for authenticated sessions\n initiatorDID?: string;\n participantDIDs?: string[];\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n sessionToken?: string;\n}\n\nexport interface SyncEvent {\n type: 'node-joined' | 'node-left' | 'sync-started' | 'sync-completed' | 'conflict-detected';\n sessionId?: string;\n nodeId: string;\n timestamp: string;\n data?: unknown;\n}\n\n/**\n * Sync Coordinator\n * Coordinates synchronization across distributed nodes\n */\nexport class SyncCoordinator extends EventEmitter {\n private nodes: Map<string, SyncNode> = new Map();\n private sessions: Map<string, SyncSession> = new Map();\n private syncEvents: SyncEvent[] = [];\n private nodeHeartbeats: Map<string, number> = new Map();\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private nodesByDID: Map<string, string> = new Map(); // DID -> nodeId\n\n constructor() {\n super();\n }\n\n /**\n * Configure cryptographic provider for authenticated sync\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[SyncCoordinator] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register a node with DID-based identity\n */\n async registerAuthenticatedNode(\n nodeInfo: Omit<SyncNode, 'did' | 'publicSigningKey' | 'publicEncryptionKey'> & {\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n },\n ): Promise<SyncNode> {\n const node: SyncNode = {\n ...nodeInfo,\n };\n\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n this.nodesByDID.set(nodeInfo.did, node.id);\n\n // Register with crypto provider if available\n if (this.cryptoProvider) {\n await this.cryptoProvider.registerRemoteNode({\n id: node.id,\n did: nodeInfo.did,\n publicSigningKey: nodeInfo.publicSigningKey,\n publicEncryptionKey: nodeInfo.publicEncryptionKey,\n });\n }\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n data: { did: nodeInfo.did, authenticated: true },\n };\n\n this.syncEvents.push(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Authenticated node registered', {\n nodeId: node.id,\n did: nodeInfo.did,\n version: node.version,\n });\n\n return node;\n }\n\n /**\n * Get node by DID\n */\n getNodeByDID(did: string): SyncNode | undefined {\n const nodeId = this.nodesByDID.get(did);\n if (!nodeId) return undefined;\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get all authenticated nodes (nodes with DIDs)\n */\n getAuthenticatedNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter(n => n.did);\n }\n\n /**\n * Create an authenticated sync session with UCAN-based authorization\n */\n async createAuthenticatedSyncSession(\n initiatorDID: string,\n participantDIDs: string[],\n options?: {\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n },\n ): Promise<SyncSession> {\n // Find the initiator node by DID\n const initiatorNodeId = this.nodesByDID.get(initiatorDID);\n if (!initiatorNodeId) {\n throw new Error(`Initiator node with DID ${initiatorDID} not found`);\n }\n\n // Find participant node IDs\n const participantIds: string[] = [];\n for (const did of participantDIDs) {\n const nodeId = this.nodesByDID.get(did);\n if (nodeId) {\n participantIds.push(nodeId);\n }\n }\n\n // Create session token if crypto is available\n let sessionToken: string | undefined;\n if (this.cryptoProvider && this.cryptoProvider.isInitialized()) {\n // Create a UCAN that grants sync capabilities to all participants\n const capabilities = (options?.requiredCapabilities || ['aeon:sync:read', 'aeon:sync:write'])\n .map(cap => ({ can: cap, with: '*' }));\n\n // Create token for the first participant (in production, you'd create one per participant)\n if (participantDIDs.length > 0) {\n sessionToken = await this.cryptoProvider.createUCAN(\n participantDIDs[0],\n capabilities,\n { expirationSeconds: 3600 }, // 1 hour\n );\n }\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId: initiatorNodeId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n initiatorDID,\n participantDIDs,\n encryptionMode: options?.encryptionMode || 'none',\n requiredCapabilities: options?.requiredCapabilities,\n sessionToken,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorNodeId,\n timestamp: new Date().toISOString(),\n data: {\n authenticated: true,\n initiatorDID,\n participantCount: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n },\n };\n\n this.syncEvents.push(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Authenticated sync session created', {\n sessionId: session.id,\n initiatorDID,\n participants: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n });\n\n return session;\n }\n\n /**\n * Verify a node's UCAN capabilities for a session\n */\n async verifyNodeCapabilities(\n sessionId: string,\n nodeDID: string,\n token: string,\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return { authorized: false, error: `Session ${sessionId} not found` };\n }\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: session.requiredCapabilities?.map(cap => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn('[SyncCoordinator] Node capability verification failed', {\n sessionId,\n nodeDID,\n error: result.error,\n });\n }\n\n return result;\n }\n\n /**\n * Register a node in the cluster\n */\n registerNode(node: SyncNode): void {\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n };\n\n this.syncEvents.push(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Node registered', {\n nodeId: node.id,\n address: node.address,\n version: node.version,\n });\n }\n\n /**\n * Deregister a node from the cluster\n */\n deregisterNode(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n this.nodes.delete(nodeId);\n this.nodeHeartbeats.delete(nodeId);\n\n const event: SyncEvent = {\n type: 'node-left',\n nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.syncEvents.push(event);\n this.emit('node-left', node);\n\n logger.debug('[SyncCoordinator] Node deregistered', { nodeId });\n }\n\n /**\n * Create a new sync session\n */\n createSyncSession(initiatorId: string, participantIds: string[]): SyncSession {\n const node = this.nodes.get(initiatorId);\n if (!node) {\n throw new Error(`Initiator node ${initiatorId} not found`);\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorId,\n timestamp: new Date().toISOString(),\n };\n\n this.syncEvents.push(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Sync session created', {\n sessionId: session.id,\n initiator: initiatorId,\n participants: participantIds.length,\n });\n\n return session;\n }\n\n /**\n * Update sync session\n */\n updateSyncSession(\n sessionId: string,\n updates: Partial<SyncSession>,\n ): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n Object.assign(session, updates);\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n session.endTime = new Date().toISOString();\n\n const event: SyncEvent = {\n type: 'sync-completed',\n sessionId,\n nodeId: session.initiatorId,\n timestamp: new Date().toISOString(),\n data: { status: updates.status, itemsSynced: session.itemsSynced },\n };\n\n this.syncEvents.push(event);\n this.emit('sync-completed', session);\n }\n\n logger.debug('[SyncCoordinator] Sync session updated', {\n sessionId,\n status: session.status,\n itemsSynced: session.itemsSynced,\n });\n }\n\n /**\n * Record a conflict during sync\n */\n recordConflict(sessionId: string, nodeId: string, conflictData?: unknown): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.conflictsDetected++;\n\n const event: SyncEvent = {\n type: 'conflict-detected',\n sessionId,\n nodeId,\n timestamp: new Date().toISOString(),\n data: conflictData,\n };\n\n this.syncEvents.push(event);\n this.emit('conflict-detected', { session, nodeId, conflictData });\n\n logger.debug('[SyncCoordinator] Conflict recorded', {\n sessionId,\n nodeId,\n totalConflicts: session.conflictsDetected,\n });\n }\n }\n\n /**\n * Update node status\n */\n updateNodeStatus(nodeId: string, status: SyncNode['status']): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n node.status = status;\n this.nodeHeartbeats.set(nodeId, Date.now());\n\n logger.debug('[SyncCoordinator] Node status updated', {\n nodeId,\n status,\n });\n }\n\n /**\n * Record heartbeat from node\n */\n recordHeartbeat(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n return;\n }\n\n node.lastHeartbeat = new Date().toISOString();\n this.nodeHeartbeats.set(nodeId, Date.now());\n }\n\n /**\n * Get all nodes\n */\n getNodes(): SyncNode[] {\n return Array.from(this.nodes.values());\n }\n\n /**\n * Get node by ID\n */\n getNode(nodeId: string): SyncNode | undefined {\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get online nodes\n */\n getOnlineNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter(n => n.status === 'online');\n }\n\n /**\n * Get nodes by capability\n */\n getNodesByCapability(capability: string): SyncNode[] {\n return Array.from(this.nodes.values()).filter(n =>\n n.capabilities.includes(capability),\n );\n }\n\n /**\n * Get sync session\n */\n getSyncSession(sessionId: string): SyncSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Get all sync sessions\n */\n getAllSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values());\n }\n\n /**\n * Get active sync sessions\n */\n getActiveSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values()).filter(s => s.status === 'active');\n }\n\n /**\n * Get sessions for a node\n */\n getSessionsForNode(nodeId: string): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n s => s.initiatorId === nodeId || s.participantIds.includes(nodeId),\n );\n }\n\n /**\n * Get sync statistics\n */\n getStatistics() {\n const sessions = Array.from(this.sessions.values());\n const completed = sessions.filter(s => s.status === 'completed').length;\n const failed = sessions.filter(s => s.status === 'failed').length;\n const active = sessions.filter(s => s.status === 'active').length;\n\n const totalItemsSynced = sessions.reduce((sum, s) => sum + s.itemsSynced, 0);\n const totalConflicts = sessions.reduce((sum, s) => sum + s.conflictsDetected, 0);\n\n return {\n totalNodes: this.nodes.size,\n onlineNodes: this.getOnlineNodes().length,\n offlineNodes: this.nodes.size - this.getOnlineNodes().length,\n totalSessions: sessions.length,\n activeSessions: active,\n completedSessions: completed,\n failedSessions: failed,\n successRate: sessions.length > 0 ? (completed / sessions.length) * 100 : 0,\n totalItemsSynced,\n totalConflicts,\n averageConflictsPerSession: sessions.length > 0 ? totalConflicts / sessions.length : 0,\n };\n }\n\n /**\n * Get sync events\n */\n getSyncEvents(limit?: number): SyncEvent[] {\n const events = [...this.syncEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync events for session\n */\n getSessionEvents(sessionId: string): SyncEvent[] {\n return this.syncEvents.filter(e => e.sessionId === sessionId);\n }\n\n /**\n * Check node health\n */\n getNodeHealth(): Record<string, { isHealthy: boolean; downtime: number }> {\n const health: Record<string, { isHealthy: boolean; downtime: number }> = {};\n\n for (const [nodeId, lastHeartbeat] of this.nodeHeartbeats) {\n const now = Date.now();\n const downtime = now - lastHeartbeat;\n const isHealthy = downtime < 30000; // 30 seconds threshold\n\n health[nodeId] = {\n isHealthy,\n downtime,\n };\n }\n\n return health;\n }\n\n /**\n * Start heartbeat monitoring\n */\n startHeartbeatMonitoring(interval: number = 5000): void {\n if (this.heartbeatInterval) {\n return;\n }\n\n this.heartbeatInterval = setInterval(() => {\n const health = this.getNodeHealth();\n\n for (const [nodeId, { isHealthy }] of Object.entries(health)) {\n const node = this.nodes.get(nodeId);\n if (!node) {\n continue;\n }\n\n const newStatus = isHealthy ? 'online' : 'offline';\n if (node.status !== newStatus) {\n this.updateNodeStatus(nodeId, newStatus);\n }\n }\n }, interval);\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring started', { interval });\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring stopped');\n }\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.nodes.clear();\n this.sessions.clear();\n this.syncEvents = [];\n this.nodeHeartbeats.clear();\n this.nodesByDID.clear();\n this.cryptoProvider = null;\n this.stopHeartbeatMonitoring();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Replication Manager\n *\n * Manages data replication across multiple nodes.\n * Handles replication policies, consistency levels, and replica coordination.\n *\n * Features:\n * - Replica set management\n * - Replication policy enforcement\n * - Consistency level tracking\n * - Replication health monitoring\n * - Replica synchronization coordination\n * - End-to-end encryption for replicated data\n * - DID-based replica authentication\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\n\nexport interface Replica {\n id: string;\n nodeId: string;\n status: 'primary' | 'secondary' | 'syncing' | 'failed';\n lastSyncTime: string;\n lagBytes: number;\n lagMillis: number;\n // DID-based identity for authenticated replicas\n did?: string;\n // Whether this replica uses encrypted data\n encrypted?: boolean;\n}\n\nexport interface ReplicationPolicy {\n id: string;\n name: string;\n replicationFactor: number;\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong';\n syncInterval: number;\n maxReplicationLag: number;\n // Encryption settings for this policy\n encryptionMode?: AeonEncryptionMode;\n // Required capabilities for replicas\n requiredCapabilities?: string[];\n}\n\nexport interface ReplicationEvent {\n type: 'replica-added' | 'replica-removed' | 'replica-synced' | 'sync-failed';\n replicaId: string;\n nodeId: string;\n timestamp: string;\n details?: unknown;\n}\n\n/**\n * Encrypted replication data envelope\n */\nexport interface EncryptedReplicationData {\n /** Encrypted ciphertext (base64) */\n ct: string;\n /** Initialization vector (base64) */\n iv: string;\n /** Authentication tag (base64) */\n tag: string;\n /** Ephemeral public key for ECIES */\n epk?: JsonWebKey;\n /** Sender DID */\n senderDID?: string;\n /** Target replica DID */\n targetDID?: string;\n /** Encryption timestamp */\n encryptedAt: number;\n}\n\n/**\n * Replication Manager\n * Manages data replication across distributed nodes\n */\nexport class ReplicationManager {\n private replicas: Map<string, Replica> = new Map();\n private policies: Map<string, ReplicationPolicy> = new Map();\n private replicationEvents: ReplicationEvent[] = [];\n private syncStatus: Map<string, { synced: number; failed: number }> = new Map();\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private replicasByDID: Map<string, string> = new Map(); // DID -> replicaId\n\n /**\n * Configure cryptographic provider for encrypted replication\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[ReplicationManager] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register an authenticated replica with DID\n */\n async registerAuthenticatedReplica(\n replica: Omit<Replica, 'did' | 'encrypted'> & {\n did: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n },\n encrypted: boolean = false,\n ): Promise<Replica> {\n const authenticatedReplica: Replica = {\n ...replica,\n encrypted,\n };\n\n this.replicas.set(replica.id, authenticatedReplica);\n this.replicasByDID.set(replica.did, replica.id);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n // Register with crypto provider if keys provided\n if (this.cryptoProvider && replica.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: replica.nodeId,\n did: replica.did,\n publicSigningKey: replica.publicSigningKey,\n publicEncryptionKey: replica.publicEncryptionKey,\n });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { did: replica.did, encrypted, authenticated: true },\n };\n\n this.replicationEvents.push(event);\n\n logger.debug('[ReplicationManager] Authenticated replica registered', {\n replicaId: replica.id,\n did: replica.did,\n encrypted,\n });\n\n return authenticatedReplica;\n }\n\n /**\n * Get replica by DID\n */\n getReplicaByDID(did: string): Replica | undefined {\n const replicaId = this.replicasByDID.get(did);\n if (!replicaId) return undefined;\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all encrypted replicas\n */\n getEncryptedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(r => r.encrypted);\n }\n\n /**\n * Encrypt data for replication to a specific replica\n */\n async encryptForReplica(\n data: unknown,\n targetReplicaDID: string,\n ): Promise<EncryptedReplicationData> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const encrypted = await this.cryptoProvider.encrypt(dataBytes, targetReplicaDID);\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n return {\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n senderDID: localDID || undefined,\n targetDID: targetReplicaDID,\n encryptedAt: encrypted.encryptedAt,\n };\n }\n\n /**\n * Decrypt data received from replication\n */\n async decryptReplicationData<T>(\n encrypted: EncryptedReplicationData,\n ): Promise<T> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const decrypted = await this.cryptoProvider.decrypt(\n {\n alg: 'ECIES-P256',\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n },\n encrypted.senderDID,\n );\n\n return JSON.parse(new TextDecoder().decode(decrypted)) as T;\n }\n\n /**\n * Create an encrypted replication policy\n */\n createEncryptedPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n encryptionMode: AeonEncryptionMode,\n options?: {\n syncInterval?: number;\n maxReplicationLag?: number;\n requiredCapabilities?: string[];\n },\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval: options?.syncInterval || 1000,\n maxReplicationLag: options?.maxReplicationLag || 10000,\n encryptionMode,\n requiredCapabilities: options?.requiredCapabilities,\n };\n\n this.policies.set(policy.id, policy);\n\n logger.debug('[ReplicationManager] Encrypted policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n encryptionMode,\n });\n\n return policy;\n }\n\n /**\n * Verify a replica's capabilities via UCAN\n */\n async verifyReplicaCapabilities(\n replicaDID: string,\n token: string,\n policyId?: string,\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const policy = policyId ? this.policies.get(policyId) : undefined;\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: policy?.requiredCapabilities?.map(cap => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn('[ReplicationManager] Replica capability verification failed', {\n replicaDID,\n error: result.error,\n });\n }\n\n return result;\n }\n\n /**\n * Register a replica\n */\n registerReplica(replica: Replica): void {\n this.replicas.set(replica.id, replica);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n\n logger.debug('[ReplicationManager] Replica registered', {\n replicaId: replica.id,\n nodeId: replica.nodeId,\n status: replica.status,\n });\n }\n\n /**\n * Remove a replica\n */\n removeReplica(replicaId: string): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n this.replicas.delete(replicaId);\n\n const event: ReplicationEvent = {\n type: 'replica-removed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n\n logger.debug('[ReplicationManager] Replica removed', { replicaId });\n }\n\n /**\n * Create a replication policy\n */\n createPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n syncInterval: number = 1000,\n maxReplicationLag: number = 10000,\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval,\n maxReplicationLag,\n };\n\n this.policies.set(policy.id, policy);\n\n logger.debug('[ReplicationManager] Policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n consistencyLevel,\n });\n\n return policy;\n }\n\n /**\n * Update replica status\n */\n updateReplicaStatus(\n replicaId: string,\n status: Replica['status'],\n lagBytes: number = 0,\n lagMillis: number = 0,\n ): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n replica.status = status;\n replica.lagBytes = lagBytes;\n replica.lagMillis = lagMillis;\n replica.lastSyncTime = new Date().toISOString();\n\n const event: ReplicationEvent = {\n type: status === 'syncing' ? 'replica-synced' : 'sync-failed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { status, lagBytes, lagMillis },\n };\n\n this.replicationEvents.push(event);\n\n const syncStatus = this.syncStatus.get(replica.nodeId);\n if (syncStatus) {\n if (status === 'syncing' || status === 'secondary') {\n syncStatus.synced++;\n } else if (status === 'failed') {\n syncStatus.failed++;\n }\n }\n\n logger.debug('[ReplicationManager] Replica status updated', {\n replicaId,\n status,\n lagBytes,\n lagMillis,\n });\n }\n\n /**\n * Get replicas for node\n */\n getReplicasForNode(nodeId: string): Replica[] {\n return Array.from(this.replicas.values()).filter(r => r.nodeId === nodeId);\n }\n\n /**\n * Get healthy replicas\n */\n getHealthyReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n r => r.status === 'secondary' || r.status === 'primary',\n );\n }\n\n /**\n * Get syncing replicas\n */\n getSyncingReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(r => r.status === 'syncing');\n }\n\n /**\n * Get failed replicas\n */\n getFailedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(r => r.status === 'failed');\n }\n\n /**\n * Check replication health for policy\n */\n checkReplicationHealth(policyId: string): {\n healthy: boolean;\n replicasInPolicy: number;\n healthyReplicas: number;\n replicationLag: number;\n } {\n const policy = this.policies.get(policyId);\n if (!policy) {\n throw new Error(`Policy ${policyId} not found`);\n }\n\n const healthy = this.getHealthyReplicas();\n const maxLag = Math.max(0, ...healthy.map(r => r.lagMillis));\n\n return {\n healthy: healthy.length >= policy.replicationFactor && maxLag <= policy.maxReplicationLag,\n replicasInPolicy: policy.replicationFactor,\n healthyReplicas: healthy.length,\n replicationLag: maxLag,\n };\n }\n\n /**\n * Get consistency level\n */\n getConsistencyLevel(policyId: string): 'eventual' | 'read-after-write' | 'strong' {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return 'eventual';\n }\n\n return policy.consistencyLevel;\n }\n\n /**\n * Get replica\n */\n getReplica(replicaId: string): Replica | undefined {\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all replicas\n */\n getAllReplicas(): Replica[] {\n return Array.from(this.replicas.values());\n }\n\n /**\n * Get policy\n */\n getPolicy(policyId: string): ReplicationPolicy | undefined {\n return this.policies.get(policyId);\n }\n\n /**\n * Get all policies\n */\n getAllPolicies(): ReplicationPolicy[] {\n return Array.from(this.policies.values());\n }\n\n /**\n * Get replication statistics\n */\n getStatistics() {\n const healthy = this.getHealthyReplicas().length;\n const syncing = this.getSyncingReplicas().length;\n const failed = this.getFailedReplicas().length;\n const total = this.replicas.size;\n\n const replicationLags = Array.from(this.replicas.values()).map(r => r.lagMillis);\n const avgLag = replicationLags.length > 0 ? replicationLags.reduce((a, b) => a + b) / replicationLags.length : 0;\n const maxLag = replicationLags.length > 0 ? Math.max(...replicationLags) : 0;\n\n return {\n totalReplicas: total,\n healthyReplicas: healthy,\n syncingReplicas: syncing,\n failedReplicas: failed,\n healthiness: total > 0 ? (healthy / total) * 100 : 0,\n averageReplicationLagMs: avgLag,\n maxReplicationLagMs: maxLag,\n totalPolicies: this.policies.size,\n };\n }\n\n /**\n * Get replication events\n */\n getReplicationEvents(limit?: number): ReplicationEvent[] {\n const events = [...this.replicationEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync status for node\n */\n getSyncStatus(nodeId: string): { synced: number; failed: number } {\n return this.syncStatus.get(nodeId) || { synced: 0, failed: 0 };\n }\n\n /**\n * Get replication lag distribution\n */\n getReplicationLagDistribution(): Record<string, number> {\n const distribution: Record<string, number> = {\n '0-100ms': 0,\n '100-500ms': 0,\n '500-1000ms': 0,\n '1000+ms': 0,\n };\n\n for (const replica of this.replicas.values()) {\n if (replica.lagMillis <= 100) {\n distribution['0-100ms']++;\n } else if (replica.lagMillis <= 500) {\n distribution['100-500ms']++;\n } else if (replica.lagMillis <= 1000) {\n distribution['500-1000ms']++;\n } else {\n distribution['1000+ms']++;\n }\n }\n\n return distribution;\n }\n\n /**\n * Check if can satisfy consistency level\n */\n canSatisfyConsistency(policyId: string, _requiredAcks: number): boolean {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return false;\n }\n\n const healthyCount = this.getHealthyReplicas().length;\n\n switch (policy.consistencyLevel) {\n case 'eventual':\n return true; // Always achievable\n case 'read-after-write':\n return healthyCount >= 1;\n case 'strong':\n return healthyCount >= policy.replicationFactor;\n default:\n return false;\n }\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.replicas.clear();\n this.policies.clear();\n this.replicationEvents = [];\n this.syncStatus.clear();\n this.replicasByDID.clear();\n this.cryptoProvider = null;\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Sync Protocol\n *\n * Handles synchronization protocol messages and handshaking.\n * Manages message serialization, protocol versioning, and compatibility.\n *\n * Features:\n * - Message serialization and deserialization\n * - Protocol version management\n * - Handshake handling\n * - Message validation and error handling\n * - Protocol state machine\n * - Optional cryptographic authentication and encryption\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type {\n AeonEncryptionMode,\n AuthenticatedMessageFields,\n} from '../crypto/types';\n\nexport interface SyncMessage {\n type: 'handshake' | 'sync-request' | 'sync-response' | 'ack' | 'error';\n version: string;\n sender: string;\n receiver: string;\n messageId: string;\n timestamp: string;\n payload?: unknown;\n // Authentication fields (populated when crypto is configured)\n auth?: AuthenticatedMessageFields;\n}\n\nexport interface Handshake {\n protocolVersion: string;\n nodeId: string;\n capabilities: string[];\n state: 'initiating' | 'responding' | 'completed';\n // DID for authenticated handshakes\n did?: string;\n // Public signing key (JWK)\n publicSigningKey?: JsonWebKey;\n // Public encryption key (JWK)\n publicEncryptionKey?: JsonWebKey;\n // UCAN token for capability verification\n ucan?: string;\n}\n\n/**\n * Crypto configuration for sync protocol\n */\nexport interface SyncProtocolCryptoConfig {\n /** Encryption mode for messages */\n encryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Required capabilities for sync operations */\n requiredCapabilities?: Array<{ can: string; with: string }>;\n}\n\nexport interface SyncRequest {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n filter?: Record<string, unknown>;\n}\n\nexport interface SyncResponse {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n data: unknown[];\n hasMore: boolean;\n offset: number;\n}\n\nexport interface ProtocolError {\n code: string;\n message: string;\n recoverable: boolean;\n}\n\n/**\n * Sync Protocol\n * Handles synchronization protocol messages and handshaking\n */\nexport class SyncProtocol {\n private version: string = '1.0.0';\n private messageQueue: SyncMessage[] = [];\n private messageMap: Map<string, SyncMessage> = new Map();\n private handshakes: Map<string, Handshake> = new Map();\n private protocolErrors: Array<{ error: ProtocolError; timestamp: string }> = [];\n private messageCounter: number = 0;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private cryptoConfig: SyncProtocolCryptoConfig | null = null;\n\n /**\n * Configure cryptographic provider for authenticated/encrypted messages\n */\n configureCrypto(\n provider: ICryptoProvider,\n config?: Partial<SyncProtocolCryptoConfig>,\n ): void {\n this.cryptoProvider = provider;\n this.cryptoConfig = {\n encryptionMode: config?.encryptionMode ?? 'none',\n requireSignatures: config?.requireSignatures ?? false,\n requireCapabilities: config?.requireCapabilities ?? false,\n requiredCapabilities: config?.requiredCapabilities,\n };\n\n logger.debug('[SyncProtocol] Crypto configured', {\n encryptionMode: this.cryptoConfig.encryptionMode,\n requireSignatures: this.cryptoConfig.requireSignatures,\n requireCapabilities: this.cryptoConfig.requireCapabilities,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Get crypto configuration\n */\n getCryptoConfig(): SyncProtocolCryptoConfig | null {\n return this.cryptoConfig ? { ...this.cryptoConfig } : null;\n }\n\n /**\n * Get protocol version\n */\n getVersion(): string {\n return this.version;\n }\n\n /**\n * Create authenticated handshake message with DID and keys\n */\n async createAuthenticatedHandshake(\n capabilities: string[],\n targetDID?: string,\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n const publicInfo = await this.cryptoProvider.exportPublicIdentity();\n if (!publicInfo) {\n throw new Error('Cannot export public identity');\n }\n\n // Create UCAN if target DID is specified and capabilities are required\n let ucan: string | undefined;\n if (targetDID && this.cryptoConfig?.requireCapabilities) {\n const caps = this.cryptoConfig.requiredCapabilities || [\n { can: 'aeon:sync:read', with: '*' },\n { can: 'aeon:sync:write', with: '*' },\n ];\n ucan = await this.cryptoProvider.createUCAN(targetDID, caps);\n }\n\n const handshakePayload: Handshake = {\n protocolVersion: this.version,\n nodeId: localDID,\n capabilities,\n state: 'initiating',\n did: localDID,\n publicSigningKey: publicInfo.publicSigningKey,\n publicEncryptionKey: publicInfo.publicEncryptionKey,\n ucan,\n };\n\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: localDID,\n receiver: targetDID || '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: handshakePayload,\n };\n\n // Sign the message if signatures are required\n if (this.cryptoConfig?.requireSignatures) {\n const signed = await this.cryptoProvider.signData(handshakePayload);\n message.auth = {\n senderDID: localDID,\n receiverDID: targetDID,\n signature: signed.signature,\n };\n }\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n logger.debug('[SyncProtocol] Authenticated handshake created', {\n messageId: message.messageId,\n did: localDID,\n capabilities: capabilities.length,\n hasUCAN: !!ucan,\n });\n\n return message;\n }\n\n /**\n * Verify and process an authenticated handshake\n */\n async verifyAuthenticatedHandshake(\n message: SyncMessage,\n ): Promise<{ valid: boolean; handshake?: Handshake; error?: string }> {\n if (message.type !== 'handshake') {\n return { valid: false, error: 'Message is not a handshake' };\n }\n\n const handshake = message.payload as Handshake;\n\n // If crypto is not configured, just process normally\n if (!this.cryptoProvider || !this.cryptoConfig) {\n this.handshakes.set(message.sender, handshake);\n return { valid: true, handshake };\n }\n\n // Register the remote node if we have their keys\n if (handshake.did && handshake.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: handshake.nodeId,\n did: handshake.did,\n publicSigningKey: handshake.publicSigningKey,\n publicEncryptionKey: handshake.publicEncryptionKey,\n });\n }\n\n // Verify signature if required\n if (this.cryptoConfig.requireSignatures && message.auth?.signature) {\n const signed = {\n payload: handshake,\n signature: message.auth.signature,\n signer: message.auth.senderDID || message.sender,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n logger.warn('[SyncProtocol] Handshake signature verification failed', {\n messageId: message.messageId,\n sender: message.sender,\n });\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n // Verify UCAN if required\n if (this.cryptoConfig.requireCapabilities && handshake.ucan) {\n const localDID = this.cryptoProvider.getLocalDID();\n const result = await this.cryptoProvider.verifyUCAN(handshake.ucan, {\n expectedAudience: localDID || undefined,\n requiredCapabilities: this.cryptoConfig.requiredCapabilities,\n });\n\n if (!result.authorized) {\n logger.warn('[SyncProtocol] Handshake UCAN verification failed', {\n messageId: message.messageId,\n error: result.error,\n });\n return { valid: false, error: result.error || 'Unauthorized' };\n }\n }\n\n this.handshakes.set(message.sender, handshake);\n\n logger.debug('[SyncProtocol] Authenticated handshake verified', {\n messageId: message.messageId,\n did: handshake.did,\n });\n\n return { valid: true, handshake };\n }\n\n /**\n * Sign and optionally encrypt a message payload\n */\n async signMessage<T>(\n message: SyncMessage,\n payload: T,\n encrypt: boolean = false,\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n // Sign the payload\n const signed = await this.cryptoProvider.signData(payload);\n\n message.auth = {\n senderDID: localDID || undefined,\n receiverDID: message.receiver || undefined,\n signature: signed.signature,\n encrypted: false,\n };\n\n // Encrypt if requested and we have a recipient\n if (encrypt && message.receiver && this.cryptoConfig?.encryptionMode !== 'none') {\n const payloadBytes = new TextEncoder().encode(JSON.stringify(payload));\n const encrypted = await this.cryptoProvider.encrypt(payloadBytes, message.receiver);\n\n message.payload = encrypted;\n message.auth.encrypted = true;\n\n logger.debug('[SyncProtocol] Message encrypted', {\n messageId: message.messageId,\n recipient: message.receiver,\n });\n } else {\n message.payload = payload;\n }\n\n return message;\n }\n\n /**\n * Verify signature and optionally decrypt a message\n */\n async verifyMessage<T>(\n message: SyncMessage,\n ): Promise<{ valid: boolean; payload?: T; error?: string }> {\n if (!this.cryptoProvider || !message.auth) {\n // No crypto or no auth - return payload as-is\n return { valid: true, payload: message.payload as T };\n }\n\n let payload = message.payload;\n\n // Decrypt if encrypted\n if (message.auth.encrypted && message.payload) {\n try {\n const encrypted = message.payload as {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n };\n\n const decrypted = await this.cryptoProvider.decrypt(\n encrypted,\n message.auth.senderDID,\n );\n\n payload = JSON.parse(new TextDecoder().decode(decrypted));\n\n logger.debug('[SyncProtocol] Message decrypted', {\n messageId: message.messageId,\n });\n } catch (error) {\n return {\n valid: false,\n error: `Decryption failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n // Verify signature if present\n if (message.auth.signature && message.auth.senderDID) {\n const signed = {\n payload,\n signature: message.auth.signature,\n signer: message.auth.senderDID,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n return { valid: true, payload: payload as T };\n }\n\n /**\n * Create handshake message\n */\n createHandshakeMessage(\n nodeId: string,\n capabilities: string[],\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: nodeId,\n receiver: '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n protocolVersion: this.version,\n nodeId,\n capabilities,\n state: 'initiating',\n } as Handshake,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n logger.debug('[SyncProtocol] Handshake message created', {\n messageId: message.messageId,\n nodeId,\n capabilities: capabilities.length,\n });\n\n return message;\n }\n\n /**\n * Create sync request message\n */\n createSyncRequestMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n filter?: Record<string, unknown>,\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-request',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n filter,\n } as SyncRequest,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n logger.debug('[SyncProtocol] Sync request created', {\n messageId: message.messageId,\n sessionId,\n fromVersion,\n toVersion,\n });\n\n return message;\n }\n\n /**\n * Create sync response message\n */\n createSyncResponseMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n data: unknown[],\n hasMore: boolean = false,\n offset: number = 0,\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-response',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n data,\n hasMore,\n offset,\n } as SyncResponse,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n logger.debug('[SyncProtocol] Sync response created', {\n messageId: message.messageId,\n sessionId,\n itemCount: data.length,\n hasMore,\n });\n\n return message;\n }\n\n /**\n * Create acknowledgement message\n */\n createAckMessage(sender: string, receiver: string, messageId: string): SyncMessage {\n const message: SyncMessage = {\n type: 'ack',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: { acknowledgedMessageId: messageId },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n return message;\n }\n\n /**\n * Create error message\n */\n createErrorMessage(\n sender: string,\n receiver: string,\n error: ProtocolError,\n relatedMessageId?: string,\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'error',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n error,\n relatedMessageId,\n },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n this.protocolErrors.push({\n error,\n timestamp: new Date().toISOString(),\n });\n\n logger.error('[SyncProtocol] Error message created', {\n messageId: message.messageId,\n errorCode: error.code,\n recoverable: error.recoverable,\n });\n\n return message;\n }\n\n /**\n * Validate message\n */\n validateMessage(message: SyncMessage): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!message.type) {\n errors.push('Message type is required');\n }\n\n if (!message.sender) {\n errors.push('Sender is required');\n }\n\n if (!message.messageId) {\n errors.push('Message ID is required');\n }\n\n if (!message.timestamp) {\n errors.push('Timestamp is required');\n }\n\n try {\n new Date(message.timestamp);\n } catch {\n errors.push('Invalid timestamp format');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Serialize message\n */\n serializeMessage(message: SyncMessage): string {\n try {\n return JSON.stringify(message);\n } catch (error) {\n logger.error('[SyncProtocol] Message serialization failed', {\n messageId: message.messageId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(`Failed to serialize message: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Deserialize message\n */\n deserializeMessage(data: string): SyncMessage {\n try {\n const message = JSON.parse(data) as SyncMessage;\n const validation = this.validateMessage(message);\n\n if (!validation.valid) {\n throw new Error(`Invalid message: ${validation.errors.join(', ')}`);\n }\n\n return message;\n } catch (error) {\n logger.error('[SyncProtocol] Message deserialization failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(`Failed to deserialize message: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Process handshake\n */\n processHandshake(message: SyncMessage): Handshake {\n if (message.type !== 'handshake') {\n throw new Error('Message is not a handshake');\n }\n\n const handshake = message.payload as Handshake;\n const nodeId = message.sender;\n\n this.handshakes.set(nodeId, handshake);\n\n logger.debug('[SyncProtocol] Handshake processed', {\n nodeId,\n protocolVersion: handshake.protocolVersion,\n capabilities: handshake.capabilities.length,\n });\n\n return handshake;\n }\n\n /**\n * Get message\n */\n getMessage(messageId: string): SyncMessage | undefined {\n return this.messageMap.get(messageId);\n }\n\n /**\n * Get all messages\n */\n getAllMessages(): SyncMessage[] {\n return [...this.messageQueue];\n }\n\n /**\n * Get messages by type\n */\n getMessagesByType(type: SyncMessage['type']): SyncMessage[] {\n return this.messageQueue.filter(m => m.type === type);\n }\n\n /**\n * Get messages from sender\n */\n getMessagesFromSender(sender: string): SyncMessage[] {\n return this.messageQueue.filter(m => m.sender === sender);\n }\n\n /**\n * Get pending messages\n */\n getPendingMessages(receiver: string): SyncMessage[] {\n return this.messageQueue.filter(m => m.receiver === receiver);\n }\n\n /**\n * Get handshakes\n */\n getHandshakes(): Map<string, Handshake> {\n return new Map(this.handshakes);\n }\n\n /**\n * Get protocol statistics\n */\n getStatistics() {\n const messagesByType: Record<string, number> = {};\n for (const message of this.messageQueue) {\n messagesByType[message.type] = (messagesByType[message.type] || 0) + 1;\n }\n\n const errorCount = this.protocolErrors.length;\n const recoverableErrors = this.protocolErrors.filter(e => e.error.recoverable).length;\n\n return {\n totalMessages: this.messageQueue.length,\n messagesByType,\n totalHandshakes: this.handshakes.size,\n totalErrors: errorCount,\n recoverableErrors,\n unrecoverableErrors: errorCount - recoverableErrors,\n };\n }\n\n /**\n * Get protocol errors\n */\n getErrors(): Array<{ error: ProtocolError; timestamp: string }> {\n return [...this.protocolErrors];\n }\n\n /**\n * Generate message ID\n */\n private generateMessageId(): string {\n this.messageCounter++;\n return `msg-${Date.now()}-${this.messageCounter}`;\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.messageQueue = [];\n this.messageMap.clear();\n this.handshakes.clear();\n this.protocolErrors = [];\n this.messageCounter = 0;\n this.cryptoProvider = null;\n this.cryptoConfig = null;\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * State Reconciler\n *\n * Reconciles conflicting state across multiple nodes in a distributed system.\n * Applies merge strategies and resolves divergent state.\n *\n * Features:\n * - State comparison and diff generation\n * - Multiple merge strategies (last-write-wins, vector-clock based, custom)\n * - Conflict detection and resolution\n * - State validation and verification\n * - Version tracking\n * - Cryptographic verification of state versions\n * - Signed state for tamper detection\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { SignedSyncData } from '../crypto/types';\n\nexport interface StateVersion {\n version: string;\n timestamp: string;\n nodeId: string;\n hash: string;\n data: unknown;\n // Cryptographic fields for signed versions\n signerDID?: string;\n signature?: string;\n signedAt?: number;\n}\n\nexport interface StateDiff {\n added: Record<string, unknown>;\n modified: Record<string, { old: unknown; new: unknown }>;\n removed: string[];\n timestamp: string;\n}\n\nexport interface ReconciliationResult {\n success: boolean;\n mergedState: unknown;\n conflictsResolved: number;\n strategy: string;\n timestamp: string;\n}\n\nexport type MergeStrategy = 'last-write-wins' | 'vector-clock' | 'majority-vote' | 'custom';\n\n/**\n * State Reconciler\n * Reconciles state conflicts across distributed nodes\n */\nexport class StateReconciler {\n private stateVersions: Map<string, StateVersion[]> = new Map();\n private reconciliationHistory: ReconciliationResult[] = [];\n private cryptoProvider: ICryptoProvider | null = null;\n private requireSignedVersions: boolean = false;\n\n /**\n * Configure cryptographic provider for signed state versions\n */\n configureCrypto(provider: ICryptoProvider, requireSigned: boolean = false): void {\n this.cryptoProvider = provider;\n this.requireSignedVersions = requireSigned;\n\n logger.debug('[StateReconciler] Crypto configured', {\n initialized: provider.isInitialized(),\n requireSigned,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Record a signed state version with cryptographic verification\n */\n async recordSignedStateVersion(\n key: string,\n version: string,\n data: unknown,\n ): Promise<StateVersion> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n // Hash the data\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const hash = Array.from(hashBytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Sign the version\n const versionData = { version, data, hash };\n const signed = await this.cryptoProvider.signData(versionData);\n\n const stateVersion: StateVersion = {\n version,\n timestamp: new Date().toISOString(),\n nodeId: localDID,\n hash,\n data,\n signerDID: localDID,\n signature: signed.signature,\n signedAt: signed.signedAt,\n };\n\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n this.stateVersions.get(key)!.push(stateVersion);\n\n logger.debug('[StateReconciler] Signed state version recorded', {\n key,\n version,\n signerDID: localDID,\n hash: hash.slice(0, 16) + '...',\n });\n\n return stateVersion;\n }\n\n /**\n * Verify a state version's signature\n */\n async verifyStateVersion(\n version: StateVersion,\n ): Promise<{ valid: boolean; error?: string }> {\n // If no signature, verify based on hash only\n if (!version.signature || !version.signerDID) {\n if (this.requireSignedVersions) {\n return { valid: false, error: 'Signature required but not present' };\n }\n\n // Verify hash matches data\n const dataBytes = new TextEncoder().encode(JSON.stringify(version.data));\n if (this.cryptoProvider) {\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const computedHash = Array.from(hashBytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n if (computedHash !== version.hash) {\n return { valid: false, error: 'Hash mismatch' };\n }\n }\n\n return { valid: true };\n }\n\n // Verify signature\n if (!this.cryptoProvider) {\n return { valid: false, error: 'Crypto provider not configured' };\n }\n\n const versionData = {\n version: version.version,\n data: version.data,\n hash: version.hash,\n };\n\n const signed: SignedSyncData<typeof versionData> = {\n payload: versionData,\n signature: version.signature,\n signer: version.signerDID,\n algorithm: 'ES256',\n signedAt: version.signedAt || Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n\n return { valid: true };\n }\n\n /**\n * Reconcile with verification - only accept verified versions\n */\n async reconcileWithVerification(\n key: string,\n strategy: MergeStrategy = 'last-write-wins',\n ): Promise<ReconciliationResult & { verificationErrors: string[] }> {\n const versions = this.stateVersions.get(key) || [];\n const verifiedVersions: StateVersion[] = [];\n const verificationErrors: string[] = [];\n\n // Verify all versions\n for (const version of versions) {\n const result = await this.verifyStateVersion(version);\n if (result.valid) {\n verifiedVersions.push(version);\n } else {\n verificationErrors.push(\n `Version ${version.version} from ${version.nodeId}: ${result.error}`,\n );\n logger.warn('[StateReconciler] Version verification failed', {\n version: version.version,\n nodeId: version.nodeId,\n error: result.error,\n });\n }\n }\n\n if (verifiedVersions.length === 0) {\n return {\n success: false,\n mergedState: null,\n conflictsResolved: 0,\n strategy,\n timestamp: new Date().toISOString(),\n verificationErrors,\n };\n }\n\n // Apply reconciliation strategy\n let result: ReconciliationResult;\n switch (strategy) {\n case 'last-write-wins':\n result = this.reconcileLastWriteWins(verifiedVersions);\n break;\n case 'vector-clock':\n result = this.reconcileVectorClock(verifiedVersions);\n break;\n case 'majority-vote':\n result = this.reconcileMajorityVote(verifiedVersions);\n break;\n default:\n result = this.reconcileLastWriteWins(verifiedVersions);\n }\n\n return { ...result, verificationErrors };\n }\n\n /**\n * Record a state version\n */\n recordStateVersion(\n key: string,\n version: string,\n timestamp: string,\n nodeId: string,\n hash: string,\n data: unknown,\n ): void {\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n const versions = this.stateVersions.get(key)!;\n versions.push({\n version,\n timestamp,\n nodeId,\n hash,\n data,\n });\n\n logger.debug('[StateReconciler] State version recorded', {\n key,\n version,\n nodeId,\n hash,\n });\n }\n\n /**\n * Detect conflicts in state versions\n */\n detectConflicts(key: string): boolean {\n const versions = this.stateVersions.get(key);\n if (!versions || versions.length <= 1) {\n return false;\n }\n\n const hashes = new Set(versions.map(v => v.hash));\n return hashes.size > 1;\n }\n\n /**\n * Compare two states and generate diff\n */\n compareStates(state1: Record<string, unknown>, state2: Record<string, unknown>): StateDiff {\n const diff: StateDiff = {\n added: {},\n modified: {},\n removed: [],\n timestamp: new Date().toISOString(),\n };\n\n // Find added and modified\n for (const [key, value] of Object.entries(state2)) {\n if (!(key in state1)) {\n diff.added[key] = value;\n } else if (JSON.stringify(state1[key]) !== JSON.stringify(value)) {\n diff.modified[key] = { old: state1[key], new: value };\n }\n }\n\n // Find removed\n for (const key of Object.keys(state1)) {\n if (!(key in state2)) {\n diff.removed.push(key);\n }\n }\n\n return diff;\n }\n\n /**\n * Reconcile states using last-write-wins strategy\n */\n reconcileLastWriteWins(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Sort by timestamp descending, most recent first\n const sorted = [...versions].sort((a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n const latest = sorted[0];\n const conflictsResolved = versions.length - 1;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'last-write-wins',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (last-write-wins)', {\n winnerNode: latest.nodeId,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using vector clock strategy\n */\n reconcileVectorClock(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // For vector clock, use the version with highest timestamp\n // In production, this would use actual vector clocks\n const sorted = [...versions].sort((a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n const latest = sorted[0];\n let conflictsResolved = 0;\n\n // Count concurrent versions (those with similar timestamps)\n for (const v of versions) {\n const timeDiff = Math.abs(\n new Date(v.timestamp).getTime() - new Date(latest.timestamp).getTime(),\n );\n if (timeDiff > 100) {\n // More than 100ms difference\n conflictsResolved++;\n }\n }\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'vector-clock',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (vector-clock)', {\n winnerVersion: latest.version,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using majority vote strategy\n */\n reconcileMajorityVote(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Group versions by hash\n const hashGroups: Map<string, StateVersion[]> = new Map();\n for (const version of versions) {\n if (!hashGroups.has(version.hash)) {\n hashGroups.set(version.hash, []);\n }\n hashGroups.get(version.hash)!.push(version);\n }\n\n // Find the majority\n let majorityVersion: StateVersion | null = null;\n let maxCount = 0;\n\n for (const [, versionGroup] of hashGroups) {\n if (versionGroup.length > maxCount) {\n maxCount = versionGroup.length;\n majorityVersion = versionGroup[0];\n }\n }\n\n if (!majorityVersion) {\n majorityVersion = versions[0];\n }\n\n const conflictsResolved = versions.length - maxCount;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: majorityVersion.data,\n conflictsResolved,\n strategy: 'majority-vote',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (majority-vote)', {\n majorityCount: maxCount,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Merge multiple states\n */\n mergeStates(states: Record<string, unknown>[]): unknown {\n if (states.length === 0) {\n return {};\n }\n\n if (states.length === 1) {\n return states[0];\n }\n\n // Simple merge: take all keys, preferring later states\n const merged: Record<string, unknown> = {};\n\n for (const state of states) {\n if (typeof state === 'object' && state !== null) {\n Object.assign(merged, state);\n }\n }\n\n return merged;\n }\n\n /**\n * Validate state after reconciliation\n */\n validateState(state: unknown): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (state === null) {\n errors.push('State is null');\n } else if (state === undefined) {\n errors.push('State is undefined');\n } else if (typeof state !== 'object') {\n errors.push('State is not an object');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get state versions for a key\n */\n getStateVersions(key: string): StateVersion[] {\n return this.stateVersions.get(key) || [];\n }\n\n /**\n * Get all state versions\n */\n getAllStateVersions(): Record<string, StateVersion[]> {\n const result: Record<string, StateVersion[]> = {};\n\n for (const [key, versions] of this.stateVersions) {\n result[key] = [...versions];\n }\n\n return result;\n }\n\n /**\n * Get reconciliation history\n */\n getReconciliationHistory(): ReconciliationResult[] {\n return [...this.reconciliationHistory];\n }\n\n /**\n * Get reconciliation statistics\n */\n getStatistics() {\n const resolvedConflicts = this.reconciliationHistory.reduce(\n (sum, r) => sum + r.conflictsResolved,\n 0,\n );\n\n const strategyUsage: Record<string, number> = {};\n for (const result of this.reconciliationHistory) {\n strategyUsage[result.strategy] = (strategyUsage[result.strategy] || 0) + 1;\n }\n\n return {\n totalReconciliations: this.reconciliationHistory.length,\n successfulReconciliations: this.reconciliationHistory.filter(r => r.success).length,\n totalConflictsResolved: resolvedConflicts,\n averageConflictsPerReconciliation:\n this.reconciliationHistory.length > 0\n ? resolvedConflicts / this.reconciliationHistory.length\n : 0,\n strategyUsage,\n trackedKeys: this.stateVersions.size,\n };\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.stateVersions.clear();\n this.reconciliationHistory = [];\n this.cryptoProvider = null;\n this.requireSignedVersions = false;\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { H as Handshake, M as MergeStrategy, P as ProtocolError, R as ReconciliationResult, l as Replica, m as ReplicationEvent, n as ReplicationManager, o as ReplicationPolicy, s as StateDiff, t as StateReconciler, u as StateVersion, v as SyncCoordinator, w as SyncEvent, x as SyncMessage, y as SyncNode, z as SyncProtocol, B as SyncRequest, F as SyncResponse, G as SyncSession } from '../index-C_4CMV5c.cjs';
|
|
2
|
+
import 'eventemitter3';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { H as Handshake, M as MergeStrategy, P as ProtocolError, R as ReconciliationResult, l as Replica, m as ReplicationEvent, n as ReplicationManager, o as ReplicationPolicy, s as StateDiff, t as StateReconciler, u as StateVersion, v as SyncCoordinator, w as SyncEvent, x as SyncMessage, y as SyncNode, z as SyncProtocol, B as SyncRequest, F as SyncResponse, G as SyncSession } from '../index-C_4CMV5c.js';
|
|
2
|
+
import 'eventemitter3';
|