Files
Moku/src/hooks.client.ts
T
2026-06-05 17:42:32 -05:00

90 lines
3.1 KiB
TypeScript

import { detectAdapter } from '$lib/platform-adapters'
import { initPlatformService } from '$lib/platform-service'
import { initRequestManager } from '$lib/request-manager'
import { appState } from '$lib/state/app.svelte'
import { configureAuth, probeServer } from '$lib/core/auth'
import { loadSettings, loadLibrary, loadUpdates } from '$lib/core/persistence/persist'
import { loadSettingsIntoState } from '$lib/state/settings.svelte'
import { historyState } from '$lib/state/history.svelte'
import { readerState } from '$lib/state/reader.svelte'
const KEY_URL = 'moku_server_url'
const KEY_AUTH = 'moku_auth_config'
interface SavedAuth {
mode: 'NONE' | 'BASIC_AUTH' | 'UI_LOGIN'
user?: string
pass?: string
}
async function boot() {
try {
const platformAdapter = detectAdapter()
initPlatformService(platformAdapter)
const { SuwayomiAdapter } = await import('$lib/server-adapters/suwayomi')
const serverAdapter = new SuwayomiAdapter()
initRequestManager(serverAdapter)
await platformAdapter.init()
appState.platform = platformAdapter.platform
appState.version = await platformAdapter.getVersion()
const [settingsData, libraryData] = await Promise.all([
loadSettings(),
loadLibrary(),
loadUpdates(),
])
await loadSettingsIntoState(settingsData.settings)
readerState.bookmarks = libraryData.bookmarks
readerState.markers = libraryData.markers
historyState.load(libraryData.sessions, libraryData.dailyReadCounts)
const savedUrl = (await platformAdapter.getCredential(KEY_URL)) ?? 'http://127.0.0.1:4567'
const savedAuthRaw = await platformAdapter.getCredential(KEY_AUTH)
const savedAuth: SavedAuth = savedAuthRaw ? JSON.parse(savedAuthRaw) : { mode: 'NONE' }
appState.serverUrl = savedUrl
appState.authMode = savedAuth.mode
appState.authUser = savedAuth.user ?? ''
appState.authPass = savedAuth.pass ?? ''
configureAuth(savedUrl, savedAuth.mode, savedAuth.user, savedAuth.pass)
await serverAdapter.connect({
baseUrl: savedUrl,
credentials:
savedAuth.mode === 'BASIC_AUTH' && savedAuth.user && savedAuth.pass
? { username: savedAuth.user, password: savedAuth.pass }
: undefined,
})
const isTauri = platformAdapter.platform === 'tauri'
const autoStartServer = settingsData.settings.autoStartServer ?? false
if (isTauri && autoStartServer) {
appState.status = 'booting'
return
}
const probe = await probeServer()
if (probe === 'auth_required') { appState.status = 'auth'; return }
if (probe === 'unreachable') {
appState.error = `Could not reach server at ${savedUrl}`
appState.status = 'error'
return
}
appState.authenticated = true
appState.status = 'ready'
} catch (e) {
appState.error = String(e)
appState.status = 'error'
}
}
boot()