{"path":"NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs","purpose":"Defines an application-layer abstraction for broadcasting real-time synchronization and ingestion progress events to connected client devices (keeps Application layer decoupled from SignalR).","classification":{"role":"service","layer":"application","confidence":0.9,"evidence":["Namespace: NexusReader.Application.Abstractions.Messaging","XML comment: 'Defined in Application to prevent a direct dependency on SignalR in Application layer handlers.'"]},"className":"ISyncBroadcaster","methods":[{"name":"BroadcastProgressAsync","line":18,"endLine":23,"signature":"(userId: string, pageId: string, timestamp: DateTime, excludedConnectionId: string? , cancellationToken: CancellationToken = default) -> Task","purpose":"Declares an asynchronous broadcast of a user's reading progress to that user's devices, optionally excluding a specific connection.","calls":[],"actions":[{"id":"declaration_18","kind":"mapping","label":"Abstract async broadcast contract","line":18,"detail":"Interface method only; implementations will perform real-time broadcasting to clients and may exclude an originating connection via excludedConnectionId.","visibility":"detail-only","confidence":0.7},{"id":"params_18","kind":"mapping","label":"Parameters indicate target user, page, server UTC timestamp, optional excluded connection, and cancellation token","line":18,"detail":"userId, pageId, timestamp, excludedConnectionId, cancellationToken","visibility":"detail-only","confidence":0.7}]},{"name":"BroadcastIngestionProgressAsync","line":33,"endLine":37,"signature":"(userId: string, message: string, progress: double, cancellationToken: CancellationToken = default) -> Task","purpose":"Declares an asynchronous broadcast of ingestion (background processing) status and progress to a specific user.","calls":[],"actions":[{"id":"declaration_33","kind":"mapping","label":"Abstract async ingestion progress contract","line":33,"detail":"Interface method only; implementations will notify a single user about ingestion status and numeric progress.","visibility":"detail-only","confidence":0.7},{"id":"params_33","kind":"mapping","label":"Parameters convey user, human message, progress fraction, and cancellation token","line":33,"detail":"userId, message, progress, cancellationToken","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"ISyncBroadcaster","kind":"interface","line":7,"purpose":"Application-layer interface abstracting real-time broadcasting behavior (keeps handlers free of SignalR dependency).","fields":[]}],"serviceRegistrations":[],"startupActions":[],"dependencies":[],"patterns":["Adapter/Abstraction","Pub/Sub (broadcast)"],"domainConcepts":["Real-time sync","Reading progress","Ingestion progress"],"keyDetails":"Interface intentionally defined in Application layer to avoid a direct dependency on SignalR; concrete implementations (in Infrastructure) will perform the actual SignalR or other transport operations.","orchestrationMethods":[],"typedContracts":[{"name":"ISyncBroadcaster","kind":"interface","line":7,"fieldCount":0,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"ISyncBroadcaster","line":7,"summary":"interface with 0 fields.","confidence":0.8,"evidencePaths":["NexusReader.Application/Abstractions/Messaging/ISyncBroadcaster.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"4708dda826a8baf0c6a26fb8baf7527ab6a098187d27357b872af5ab562e8b2e","sourceByteSize":1859,"analyzedAt":"2026-05-23T16:19:04.083Z","technology":"dotnet"}}