Major protocol refactor: all byte[] payloads in SignalR hub/client interfaces, plumbing, and DTOs are now wrapped in SignalData, a disposable, ArrayPool-backed type with Span access. Introduces AyCodeBinaryHubProtocol (derived from AcBinaryHubProtocol) to rent pooled buffers for SignalData on receive. All message signatures, diagnostics, and serialization logic updated. Documentation and tests revised to reflect SignalData usage. Enables zero-copy, low-GC, high-performance binary messaging for large payloads. |
||
|---|---|---|
| .. | ||
| AcLoggerSignalRHub.cs | ||
| AcSessionService.cs | ||
| AcSignalRDataSource.cs | ||
| AcSignalRSendToClientService.cs | ||
| AcWebSignalRHubBase.cs | ||
| ExtensionMethods.cs | ||
| IAcSessionItem.cs | ||
| IAcSignalRHubItemServer.cs | ||
| README.md | ||
| TrackingItemHelpers.cs | ||
README.md
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 extendingHub<IAcSignalRHubItemServer>. Manages connection lifecycle, message dispatch viaDynamicMethodRegistry, 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 withConcurrentDictionary<TSessionItemId, TSessionItem>.IAcSessionItem.cs— Session item interface withSessionIdproperty.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<TDataItem, TId, TIList>) implementingIList<T>with full CRUD and change tracking.- Change tracking:
TrackingItem<T, TId>wraps each modified item withTrackingState+OriginalValuefor rollback.ChangeTracking<T, TId>manages the tracking list. - Loading:
LoadDataSource()(sync),LoadDataSourceAsync()(async callback),LoadItem(id)(single). Binary path usesBinaryToMerge()forAcObservableCollection(batch UI update viaBeginUpdate/EndUpdate). - Saving:
SaveChanges()iterates tracked items, posts each via CRUD tag, rollbacks on failure.SaveItem()for individual saves. - Sync state:
IsSyncing(Interlocked counter) +OnSyncingStateChangedevent 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.
- Change tracking:
Utilities
ExtensionMethods.cs—InvokeMethod()— invokes methods and unwrapsTask/Task<T>/ValueTaskresults.TrackingItemHelpers.cs— Deep clone helpers:JsonClone<T>(),ReflectionClone<T>().