This commit is contained in:
2026-05-25 14:02:56 +02:00
parent 29bd42e52e
commit 758b152a0c
1798 changed files with 1991205 additions and 481068 deletions
@@ -0,0 +1,356 @@
## 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.
```mermaid
---
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.
```mermaid
---
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.
```mermaid
---
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.
```mermaid
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.
```mermaid
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.
```mermaid
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)