Files
Nexus.Reader/src/.documentation/infrastructure/infrastructure-services.md
T
2026-05-25 14:02:56 +02:00

48 KiB

Infrastructure Services (AI, Epub, Storage, Billing)

This document summarizes concrete infrastructure services for AI/knowledge integration, EPUB processing, book storage, and Stripe billing. Diagrams show dependencies, flows, contracts, guardrails, and method interactions.

---
config:
  flowchart:
    defaultRenderer: "elk"
---
flowchart TD
    flow_file_nexusreader_infrastructure_helpers_contenthasher_cs_file_1["ContentHasher"]
    flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1["SignalRSyncBroadcaster"]
    flow_file_nexusreader_infrastructure_services_billingservice_cs_file_1["BillingService"]
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1["BookStorageService"]
    flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1["EpubMetadataExtractor"]
    flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1["EpubReaderService"]
    flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1["KnowledgeService"]
    flow_file_nexusreader_infrastructure_services_promptregistry_cs_file_1["PromptRegistry"]
    flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1["AiSettings"]
    flow_file_nexusreader_infrastructure_configuration_stripesettings_cs_file_1["StripeSettings"]
    flow_file_nexusreader_infrastructure_helpers_jsonrepairhelper_cs_file_1["JsonRepairHelper"]
    flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1["SyncHub"]
    flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3[/"AiSettings"/]
    flow_type_nexusreader_infrastructure_configuration_stripesettings_cs_stripesettings_3[/"StripeSettings"/]
    flow_type_nexusreader_infrastructure_helpers_contenthasher_cs_contenthasher_7[/"ContentHasher"/]
    flow_type_nexusreader_infrastructure_helpers_jsonrepairhelper_cs_jsonrepairhelper_6[/"JsonRepairHelper"/]
    flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11[/"SignalRSyncBroadcaster"/]
    flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10[/"SyncHub"/]
    flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10[/"BookStorageService"/]
    flow_type_nexusreader_infrastructure_services_epubmetadataextractor_cs_epubmetadataextractor_12[/"EpubMetadataExtractor"/]
    flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1 -->|dto AiSettings| flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3
    flow_file_nexusreader_infrastructure_configuration_stripesettings_cs_file_1 -->|model StripeSettings| flow_type_nexusreader_infrastructure_configuration_stripesettings_cs_stripesettings_3
    flow_file_nexusreader_infrastructure_helpers_contenthasher_cs_file_1 -->|model ContentHasher| flow_type_nexusreader_infrastructure_helpers_contenthasher_cs_contenthasher_7
    flow_file_nexusreader_infrastructure_helpers_jsonrepairhelper_cs_file_1 -->|model JsonRepairHelper| flow_type_nexusreader_infrastructure_helpers_jsonrepairhelper_cs_jsonrepairhelper_6
    flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1 -->|model SignalRSyncBroadcaster| flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11
    flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|model SyncHub| flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|model BookStorageService| flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10
    flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1 -->|model EpubMetadataExtractor| flow_type_nexusreader_infrastructure_services_epubmetadataextractor_cs_epubmetadataextractor_12
    click flow_file_nexusreader_infrastructure_services_billingservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/BillingService.cs:1:1" "Open source"
    click flow_file_nexusreader_infrastructure_configuration_stripesettings_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Configuration/StripeSettings.cs:1:1" "Open source"
    click flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:10:1" "Open source"
    click flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:1:1" "Open source"
    click flow_file_nexusreader_infrastructure_services_knowledgeservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/KnowledgeService.cs:1:1" "Open source"
    click flow_file_nexusreader_infrastructure_helpers_contenthasher_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Helpers/ContentHasher.cs:1:1" "Open source"
    click flow_file_nexusreader_infrastructure_helpers_jsonrepairhelper_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs:1:1" "Open source"
    click flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Configuration/AiSettings.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3 href "vscode://file/NexusReader.Infrastructure/Configuration/AiSettings.cs:3:1" "Open source"
    click flow_type_nexusreader_infrastructure_configuration_stripesettings_cs_stripesettings_3 href "vscode://file/NexusReader.Infrastructure/Configuration/StripeSettings.cs:3:1" "Open source"
    click flow_type_nexusreader_infrastructure_helpers_contenthasher_cs_contenthasher_7 href "vscode://file/NexusReader.Infrastructure/Helpers/ContentHasher.cs:7:1" "Open source"
    click flow_type_nexusreader_infrastructure_helpers_jsonrepairhelper_cs_jsonrepairhelper_6 href "vscode://file/NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs:6:1" "Open source"
    click flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1 href "vscode://file/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_signalrsyncbroadcaster_11 href "vscode://file/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs:11:1" "Open source"
    click flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_realtime_synchub_cs_synchub_10 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:10:1" "Open source"
    click flow_file_nexusreader_infrastructure_services_epubmetadataextractor_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_services_epubmetadataextractor_cs_epubmetadataextractor_12 href "vscode://file/NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs:12:1" "Open source"
    click flow_file_nexusreader_infrastructure_services_promptregistry_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/PromptRegistry.cs:1:1" "Open source"

This dependency map shows service, helper, settings and realtime components and how DTOs/models link. It identifies AI and Stripe settings and key service classes for navigation and ownership.

---
config:
  flowchart:
    defaultRenderer: "elk"
---
flowchart TD
    subgraph flow_2_nexusreader_infrastructure_services_bookstorageservice_cs["BookStorageService"]
    end
    subgraph flow_1_nexusreader_infrastructure_services_billingservice_cs["BillingService"]
    end
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1["BookStorageService"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66["EnsureDirectoryExists"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43["SaveCoverAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50["SaveCoverAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19["SaveEbookAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25["SaveEbookAsync"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68{"Evaluates branch condition"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68{"Check directory existence and create if absent"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_47_47["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45{"Guards early exit or rejection path"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53{"Ensure covers directory exists (create if missing)"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_22_22["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28{"Ensure uploads directory exists (create if missing)"}
    flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1["AiSettings"]
    flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3[/"AiSettings"/]
    flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10[/"BookStorageService"/]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47(["Returns result"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63(["Return web-relative path with forward slash"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22(["Returns result"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40(["Return web-relative path with forward slash"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68 -->|true / false| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60 -->|Return web-relative path with forward slash| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_47_47
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35 -->|Return web-relative path with forward slash| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_22_22
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|EnsureDirectoryExists| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveCoverAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveCoverAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveEbookAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveEbookAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|model BookStorageService| flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43 -->|exit / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28
    click flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:1:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:19:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:22:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_22_22 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:22:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:25:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:28:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:35:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:40:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:43:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:45:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:47:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:50:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:53:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:60:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:63:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:66:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:68:1" "Open source"

This flow highlights BookStorageService runtime paths: SaveEbookAsync and SaveCoverAsync ensure directories, perform async writes, and return web-relative paths. BillingService is shown as a sibling service but billing flow is implemented in BillingService.cs.

---
config:
  flowchart:
    defaultRenderer: "elk"
---
flowchart TD
    subgraph NexusReader_Infrastructure_Services_BookStorageService["BookStorageService"]
    end
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1["BookStorageService"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66["EnsureDirectoryExists"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43["SaveCoverAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50["SaveCoverAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19["SaveEbookAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25["SaveEbookAsync"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68{"Evaluates branch condition"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68{"Check directory existence and create if absent"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_47_47["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45{"Guards early exit or rejection path"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53{"Ensure covers directory exists (create if missing)"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_22_22["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28{"Ensure uploads directory exists (create if missing)"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47(["Returns result"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63(["Return web-relative path with forward slash"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22(["Returns result"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40(["Return web-relative path with forward slash"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68 -->|true / false| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60 -->|Return web-relative path with forward slash| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_47_47
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35 -->|Return web-relative path with forward slash| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22 -->|Waits for async work| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_22_22
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|EnsureDirectoryExists| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveCoverAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveCoverAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveEbookAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 -->|SaveEbookAsync| flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43 -->|exit / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28
    click flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:1:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:19:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:22:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_22_22 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:22:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:25:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:28:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:35:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:40:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:43:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:45:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:47:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:50:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:53:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:60:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:63:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:66:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:68:1" "Open source"

This control-flow emphasizes checks and failure paths for storage operations and the web-relative return conventions used by the service.

classDiagram
    class flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1["BookStorageService"]
    class flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1["AiSettings"]
    class flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3["AiSettings"]
    class flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10["BookStorageService"]
    flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1 --> flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3 : dto AiSettings
    flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 --> flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10 : model BookStorageService
    click flow_file_nexusreader_infrastructure_services_bookstorageservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_services_bookstorageservice_cs_bookstorageservice_10 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:10:1" "Open source"
    click flow_file_nexusreader_infrastructure_configuration_aisettings_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Configuration/AiSettings.cs:1:1" "Open source"
    click flow_type_nexusreader_infrastructure_configuration_aisettings_cs_aisettings_3 href "vscode://file/NexusReader.Infrastructure/Configuration/AiSettings.cs:3:1" "Open source"

This class/contract view shows the BookStorageService model and its dependency on AiSettings DTOs, clarifying configuration coupling.

flowchart TD
    subgraph NexusReader_Infrastructure_Services_BookStorageService["BookStorageService"]
    end
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66["EnsureDirectoryExists"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43["SaveCoverAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50["SaveCoverAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19["SaveEbookAsync"]
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25["SaveEbookAsync"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68{"Evaluates branch condition"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68{"Check directory existence and create if absent"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45{"Guards early exit or rejection path"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53{"Ensure covers directory exists (create if missing)"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35["Waits for async work"]
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28{"Ensure uploads directory exists (create if missing)"}
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47(["Returns result"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63(["Return web-relative path with forward slash"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22(["Returns result"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40(["Return web-relative path with forward slash"])
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68 -->|true / false| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_branch_68_68
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60 -->|Return web-relative path with forward slash| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35 -->|Return web-relative path with forward slash| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40
    flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43 -->|exit / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19 -->|Returns result| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22
    flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25 -->|create-directory / continue| flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_19 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:19:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_22_22 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:22:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_25 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:25:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_guard_clause_28_28 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:28:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_await_35_35 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:35:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_saveebookasync_return_40_40 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:40:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_43 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:43:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_45_45 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:45:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_47_47 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:47:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_50 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:50:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_guard_clause_53_53 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:53:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_await_60_60 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:60:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_savecoverasync_return_63_63 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:63:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_66 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:66:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_bookstorageservice_cs_ensuredirectoryexists_guard_clause_68_68 href "vscode://file/NexusReader.Infrastructure/Services/BookStorageService.cs:68:1" "Open source"

This guardrails diagram isolates failure and branching behavior for storage operations and shows explicit early-exit guards.

flowchart TD
    subgraph NexusReader_Infrastructure_Services_EpubReaderService["EpubReaderService"]
    end
    subgraph NexusReader_Infrastructure_Helpers_ContentHasher["ContentHasher"]
    end
    subgraph NexusReader_Infrastructure_RealTime_SignalRSyncBroadcaster["SignalRSyncBroadcaster"]
    end
    subgraph NexusReader_Infrastructure_RealTime_SyncHub["SyncHub"]
    end
    flow_file_nexusreader_infrastructure_helpers_contenthasher_cs_file_1["ContentHasher"]
    flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1["SignalRSyncBroadcaster"]
    flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1["EpubReaderService"]
    flow_method_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_9["ComputeHash"]
    flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21["BroadcastProgressAsync"]
    flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28["OnConnectedAsync"]
    flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38["OnDisconnectedAsync"]
    flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19["UpdateProgress"]
    flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175["CountWords"]
    flow_action_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_branch_11_11{"Evaluates branch condition"}
    flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30{"check excludedConnectionId presence"}
    flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30["Reads repository or persistence state"]
    flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40["Reads repository or persistence state"]
    flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21["Reads repository or persistence state"]
    flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177{"empty check"}
    flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_await_85_85["Waits for async work"]
    flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1["SyncHub"]
    flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_await_85_85 -->|ContentHasher.ComputeHash| flow_method_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_9
    flow_file_nexusreader_infrastructure_helpers_contenthasher_cs_file_1 -->|ComputeHash| flow_method_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_9
    flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1 -->|BroadcastProgressAsync| flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21
    flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|OnConnectedAsync| flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28
    flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|OnDisconnectedAsync| flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38
    flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 -->|UpdateProgress| flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19
    flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1 -->|CountWords| flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175
    flow_method_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_9 -->|true / false| flow_action_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_branch_11_11
    flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21 -->|enter branch: attempts exclusion comment / else: normal send| flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30
    flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28 -->|Reads repository or persistence state| flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30
    flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38 -->|Reads repository or persistence state| flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40
    flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19 -->|Reads repository or persistence state| flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21
    flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175 -->|empty check| flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177
    click flow_file_nexusreader_infrastructure_services_epubreaderservice_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:1:1" "Open source"
    click flow_method_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_175 href "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:175:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_epubreaderservice_cs_countwords_guard_clause_177_177 href "vscode://file/NexusReader.Infrastructure/Services/EpubReaderService.cs:177:1" "Open source"
    click flow_action_nexusreader_infrastructure_services_knowledgeservice_cs_getknowledgeinternalasync_await_85_85 href "vscode://file/NexusReader.Infrastructure/Services/KnowledgeService.cs:85:1" "Open source"
    click flow_file_nexusreader_infrastructure_helpers_contenthasher_cs_file_1 href "vscode://file/NexusReader.Infrastructure/Helpers/ContentHasher.cs:1:1" "Open source"
    click flow_method_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_9 href "vscode://file/NexusReader.Infrastructure/Helpers/ContentHasher.cs:9:1" "Open source"
    click flow_action_nexusreader_infrastructure_helpers_contenthasher_cs_computehash_branch_11_11 href "vscode://file/NexusReader.Infrastructure/Helpers/ContentHasher.cs:11:1" "Open source"
    click flow_file_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_file_1 href "vscode://file/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs:1:1" "Open source"
    click flow_method_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_21 href "vscode://file/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs:21:1" "Open source"
    click flow_action_nexusreader_infrastructure_realtime_signalrsyncbroadcaster_cs_broadcastprogressasync_guard_clause_30_30 href "vscode://file/NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs:30:1" "Open source"
    click flow_file_nexusreader_infrastructure_realtime_synchub_cs_file_1 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:1:1" "Open source"
    click flow_method_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_19 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:19:1" "Open source"
    click flow_action_nexusreader_infrastructure_realtime_synchub_cs_updateprogress_repository_read_21_21 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:21:1" "Open source"
    click flow_method_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_28 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:28:1" "Open source"
    click flow_action_nexusreader_infrastructure_realtime_synchub_cs_onconnectedasync_repository_read_30_30 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:30:1" "Open source"
    click flow_method_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_38 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:38:1" "Open source"
    click flow_action_nexusreader_infrastructure_realtime_synchub_cs_ondisconnectedasync_repository_read_40_40 href "vscode://file/NexusReader.Infrastructure/RealTime/SyncHub.cs:40:1" "Open s

### Key Files
- NexusReader.Infrastructure/Services/KnowledgeService.cs
- NexusReader.Infrastructure/Services/EpubReaderService.cs
- NexusReader.Infrastructure/Services/EpubMetadataExtractor.cs
- NexusReader.Infrastructure/Services/BookStorageService.cs
- NexusReader.Infrastructure/Services/BillingService.cs
- NexusReader.Infrastructure/Services/PromptRegistry.cs
- NexusReader.Infrastructure/Configuration/AiSettings.cs
- NexusReader.Infrastructure/Configuration/StripeSettings.cs
- NexusReader.Infrastructure/Helpers/ContentHasher.cs
- NexusReader.Infrastructure/Helpers/JsonRepairHelper.cs
- NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs
- NexusReader.Infrastructure/RealTime/SyncHub.cs

---

## See Also

- [Project Overview and High-level Architecture](../collections/overview.md)
- [Application Layer: Commands, Queries, DTOs and Handlers](../domains/application-cqs-and-handlers.md)
- [AI Features, Knowledge Graph and UX Integration](../integrations/ai-and-knowledge-ux.md)
- [Web Client (WASM) and Shared UI Components](../domains/web-client-and-shared-ui.md)
- [Mobile (MAUI) Application Integration](../runtime/mobile-maui.md)
- [Authentication, Authorization and Account Flows](../flows/authentication-and-account.md)
- [Business Overview](../business/business-overview.md)
- [Top Business Flows](../business/top-business-flows.md)