chore(backend): добавить поддержку ACME и управление сертификатами

This commit is contained in:
Denozordec
2026-05-12 20:00:25 +07:00
parent bfceb07a23
commit d62d212c86
21 changed files with 2183 additions and 301 deletions
+17 -11
View File
@@ -26,6 +26,8 @@ interface DataSourceContextValue {
setBackendUrl: (url: string) => void
backendUrlLocked: boolean
mockModeAvailable: boolean
/** localStorage для mode/backendUrl применён на клиенте (после первого paint). */
prefsHydrated: boolean
/** undefined = не проверялось, true = OK, false = недоступен */
backendStatus: boolean | undefined
checkBackend: () => Promise<void>
@@ -57,19 +59,22 @@ function normalizeBackendUrl(url: string): string {
}
export function DataSourceProvider({ children }: { children: React.ReactNode }) {
const [mode, setModeState] = useState<DataSourceMode>(() =>
typeof window === "undefined" ? defaultDataSourceMode() : readStoredMode(),
)
const [backendUrl, setBackendUrlState] = useState(() =>
typeof window === "undefined" ? LOCAL_DEFAULT_BACKEND_URL : readStoredBackendUrl(),
)
const [mode, setModeState] = useState<DataSourceMode>(defaultDataSourceMode)
const [backendUrl, setBackendUrlState] = useState(LOCAL_DEFAULT_BACKEND_URL)
const [prefsHydrated, setPrefsHydrated] = useState(false)
const [backendStatus, setBackendStatus] = useState<boolean | undefined>(undefined)
const backendUrlLocked = isBackendUrlLocked()
const mockModeAvailable = isMockDataSourceAvailable()
useEffect(() => {
if (configuredBackendUrl().kind !== "same-origin") return
setBackendUrlState(window.location.origin)
const storedMode = readStoredMode()
let url = readStoredBackendUrl()
if (configuredBackendUrl().kind === "same-origin") {
url = window.location.origin
}
setModeState(storedMode)
setBackendUrlState(url)
setPrefsHydrated(true)
}, [])
const setMode = useCallback((m: DataSourceMode) => {
@@ -96,12 +101,13 @@ export function DataSourceProvider({ children }: { children: React.ReactNode })
}, [backendUrl])
useEffect(() => {
if (mode === "live") queueMicrotask(() => { void checkBackend() })
}, [mode, checkBackend])
if (!prefsHydrated || mode !== "live") return
queueMicrotask(() => { void checkBackend() })
}, [prefsHydrated, mode, checkBackend])
return (
<DataSourceContext.Provider
value={{ mode, setMode, backendUrl, setBackendUrl, backendUrlLocked, mockModeAvailable, backendStatus, checkBackend }}
value={{ mode, setMode, backendUrl, setBackendUrl, backendUrlLocked, mockModeAvailable, prefsHydrated, backendStatus, checkBackend }}
>
{children}
</DataSourceContext.Provider>