# SignalRs Server-side SignalR hub infrastructure: hub base class, session management, data source with change tracking, and client broadcast service. > **Architecture:** For full dispatch flow, tag system, and tech debt documentation see `AyCode.Services/docs/SIGNALR.md`. ## Key Files ### Hub - **`AcWebSignalRHubBase.cs`** — Abstract hub extending `Hub`. Manages connection lifecycle, message dispatch via `DynamicMethodRegistry`, binary/JSON parameter deserialization. Response methods: `ResponseToCaller()`, `SendMessageToOthers()`, `SendMessageToUserIdInternal()`. - **`IAcSignalRHubItemServer.cs`** — Server hub interfaces: `IAcSignalRHubItemServer`, `IAcSignalRHubServer`. - **`AcLoggerSignalRHub.cs`** — Specialized hub for receiving log items via SignalR (`AddLogItem()`). ### Session & Broadcast - **`AcSessionService.cs`** — Generic session manager with `ConcurrentDictionary`. - **`IAcSessionItem.cs`** — Session item interface with `SessionId` property. - **`AcSignalRSendToClientService.cs`** — Abstract broadcast service: `SendMessageToClient()`, `SendMessageToAllClients()`, `SendMessageToConnection()`, `SendMessageToUser()`. ### Data Source > **Full specification:** `AyCode.Services.Server/docs/SIGNALR_DATASOURCE.md` - **`AcSignalRDataSource.cs`** — Generic real-time collection (`AcSignalRDataSource`) implementing `IList` with full CRUD and change tracking. - **Change tracking:** `TrackingItem` wraps each modified item with `TrackingState` + `OriginalValue` for rollback. `ChangeTracking` manages the tracking list. - **Loading:** `LoadDataSource()` (sync), `LoadDataSourceAsync()` (async callback), `LoadItem(id)` (single). Binary path uses `BinaryToMerge()` for `AcObservableCollection` (batch UI update via `BeginUpdate/EndUpdate`). - **Saving:** `SaveChanges()` iterates tracked items, posts each via CRUD tag, rollbacks on failure. `SaveItem()` for individual saves. - **Sync state:** `IsSyncing` (Interlocked counter) + `OnSyncingStateChanged` event for UI loading indicators. - **Locking:** `object _syncRoot` (sync ops) + `SemaphoreSlim _asyncLock` (async ops). `GetEnumerator()` returns safe copy. - **Working reference list:** `SetWorkingReferenceList()` allows external list to become inner storage (zero-copy). - **Context:** `ContextIds` (object[]) + `FilterText` (string) sent with GetAll requests for server-side filtering. ### Utilities - **`ExtensionMethods.cs`** — `InvokeMethod()` — invokes methods and unwraps `Task`/`Task`/`ValueTask` results. - **`TrackingItemHelpers.cs`** — Deep clone helpers: `JsonClone()`, `ReflectionClone()`.