# ZB.MOM.WW.CBDDC.Core Core abstractions and logic for **CBDDC**, a peer-to-peer data synchronization middleware for .NET. ## What Is CBDDC? CBDDC is **not** a database � it's a sync layer that plugs into your existing data store (BLite) and enables automatic P2P replication across nodes in a mesh network. Your application reads and writes to its database as usual; CBDDC handles synchronization in the background. ## What's In This Package - **Interfaces**: `IDocumentStore`, `IOplogStore`, `IVectorClockService`, `IConflictResolver` - **Models**: `OplogEntry`, `Document`, `HlcTimestamp`, `VectorClock` - **Conflict Resolution**: `LastWriteWinsConflictResolver`, `RecursiveNodeMergeConflictResolver` - **Production Features**: Document caching (LRU), offline queue, health monitoring, retry policies ## Installation ```bash # Pick a persistence provider dotnet add package ZB.MOM.WW.CBDDC.Persistence # Embedded document DB # Add networking dotnet add package ZB.MOM.WW.CBDDC.Network ``` ## Quick Start ```csharp // 1. Define your DbContext public class MyDbContext : CBDDCDocumentDbContext { public DocumentCollection Users { get; private set; } public MyDbContext(string path) : base(path) { } } // 2. Create your DocumentStore (the sync bridge) public class MyDocumentStore : BLiteDocumentStore { public MyDocumentStore(MyDbContext ctx, IPeerNodeConfigurationProvider cfg, IVectorClockService vc, ILogger? log = null) : base(ctx, cfg, vc, logger: log) { WatchCollection("Users", ctx.Users, u => u.Id); } protected override async Task ApplyContentToEntityAsync( string collection, string key, JsonElement content, CancellationToken ct) { var user = content.Deserialize()!; user.Id = key; var existing = _context.Users.Find(u => u.Id == key).FirstOrDefault(); if (existing != null) _context.Users.Update(user); else _context.Users.Insert(user); await _context.SaveChangesAsync(ct); } // ... implement other abstract methods } // 3. Register and use builder.Services.AddCBDDCCore() .AddCBDDCBLite( sp => new MyDbContext("data.blite")) .AddCBDDCNetwork(); ``` ## Key Concepts | Concept | Description | |-------------------|------------------------------------------------------------------------------| | **CDC** | Change Data Capture � watches collections registered via `WatchCollection()` | | **Oplog** | Append-only hash-chained journal of changes per node | | **VectorClock** | Tracks causal ordering across the mesh | | **DocumentStore** | Your bridge between entities and the sync engine | ## Architecture ``` Your App ? DbContext.SaveChangesAsync() ? ? CDC Trigger DocumentStore.CreateOplogEntryAsync() ? ??? OplogEntry (hash-chained, HLC timestamped) ??? VectorClockService.Update() ? ? SyncOrchestrator (background) ??? Push to peers ??? Pull from peers ? ApplyBatchAsync ``` ## Related Packages - **ZB.MOM.WW.CBDDC.Persistence** � BLite embedded provider (.NET 10+) - **ZB.MOM.WW.CBDDC.Network** � P2P networking (UDP discovery, TCP sync, Gossip) ## Documentation - **[Complete Documentation](https://github.com/CBDDC/ZB.MOM.WW.CBDDC.Net)** - **[Sample Application](https://github.com/CBDDC/ZB.MOM.WW.CBDDC.Net/tree/main/samples/ZB.MOM.WW.CBDDC.Sample.Console) ** - **[Integration Guide](https://github.com/CBDDC/ZB.MOM.WW.CBDDC.Net#integrating-with-your-database)** ## License MIT � see [LICENSE](https://github.com/CBDDC/ZB.MOM.WW.CBDDC.Net/blob/main/LICENSE)