Fix session persistence on android

This commit is contained in:
Jon Staab 2026-08-17 16:10:00 -07:00
parent b8ec94e548
commit 20f12a48a4
4 changed files with 26 additions and 25 deletions

View file

@ -76,16 +76,16 @@
"@types/throttle-debounce": "^5.0.2", "@types/throttle-debounce": "^5.0.2",
"@vite-pwa/assets-generator": "^1.0.2", "@vite-pwa/assets-generator": "^1.0.2",
"@vite-pwa/sveltekit": "^1.1.0", "@vite-pwa/sveltekit": "^1.1.0",
"@welshman/app": "^0.9.0-pre6", "@welshman/app": "^0.9.0",
"@welshman/content": "^0.9.0-pre6", "@welshman/content": "^0.9.0",
"@welshman/domain": "^0.9.0-pre6", "@welshman/domain": "^0.9.0",
"@welshman/editor": "^0.9.0-pre6", "@welshman/editor": "^0.9.0",
"@welshman/feeds": "^0.9.0-pre6", "@welshman/feeds": "^0.9.0",
"@welshman/lib": "^0.9.0-pre6", "@welshman/lib": "^0.9.0",
"@welshman/net": "^0.9.0-pre6", "@welshman/net": "^0.9.0",
"@welshman/signer": "^0.9.0-pre6", "@welshman/signer": "^0.9.0",
"@welshman/store": "^0.9.0-pre6", "@welshman/store": "^0.9.0",
"@welshman/util": "^0.9.0-pre6", "@welshman/util": "^0.9.0",
"cheerio": "^1.2.0", "cheerio": "^1.2.0",
"compressorjs-next": "^1.1.2", "compressorjs-next": "^1.1.2",
"dompurify": "^3.4.13", "dompurify": "^3.4.13",

Binary file not shown.

View file

@ -3,7 +3,7 @@ import type {Unsubscriber} from "svelte/store"
import {deleteDB} from "idb" import {deleteDB} from "idb"
import {SecureStorage} from "@aparajita/capacitor-secure-storage" import {SecureStorage} from "@aparajita/capacitor-secure-storage"
import {Preferences} from "@capacitor/preferences" import {Preferences} from "@capacitor/preferences"
import {noop, on, throttle, batch, call} from "@welshman/lib" import {noop, on, throttle, batch, call, makeQueue} from "@welshman/lib"
import type {Maybe} from "@welshman/lib" import type {Maybe} from "@welshman/lib"
import { import {
ALERT_ANDROID, ALERT_ANDROID,
@ -45,7 +45,7 @@ import {IDB} from "@lib/indexeddb"
import {appPolicies} from "@app/core" import {appPolicies} from "@app/core"
export const kv = call(() => { export const kv = call(() => {
let p = Promise.resolve() const enqueue = makeQueue()
const get = async <T>(key: string): Promise<T | undefined> => { const get = async <T>(key: string): Promise<T | undefined> => {
const result = await Preferences.get({key}) const result = await Preferences.get({key})
@ -58,22 +58,18 @@ export const kv = call(() => {
} }
const set = async <T>(key: string, value: T): Promise<void> => { const set = async <T>(key: string, value: T): Promise<void> => {
p = p.then(() => Preferences.set({key, value: JSON.stringify(value)})) await enqueue(() => Preferences.set({key, value: JSON.stringify(value)}))
await p
} }
const clear = async () => { const clear = async () => {
p = p.then(() => Preferences.clear()) await enqueue(() => Preferences.clear())
await p
} }
return {get, set, clear} return {get, set, clear}
}) })
export const ss = call(() => { export const ss = call(() => {
let p = Promise.resolve() const enqueue = makeQueue()
const get = async <T>(key: string): Promise<T | undefined> => { const get = async <T>(key: string): Promise<T | undefined> => {
let value = await SecureStorage.getItem(key) let value = await SecureStorage.getItem(key)
@ -97,16 +93,17 @@ export const ss = call(() => {
} }
} }
// Android's SecureStorage rejects undefined
const set = async <T>(key: string, value: T): Promise<void> => { const set = async <T>(key: string, value: T): Promise<void> => {
p = p.then(() => SecureStorage.setItem(key, JSON.stringify(value))) await enqueue(() =>
value === undefined
await p ? SecureStorage.removeItem(key)
: SecureStorage.setItem(key, JSON.stringify(value)),
)
} }
const clear = async () => { const clear = async () => {
p = p.then(() => SecureStorage.clear()) await enqueue(() => SecureStorage.clear())
await p
} }
return {get, set, clear} return {get, set, clear}

View file

@ -1,7 +1,11 @@
<script lang="ts"> <script lang="ts">
import {page} from "$app/stores"
import {goToHome} from "@app/routes" import {goToHome} from "@app/routes"
// Depend on the page so the redirect runs again instead of only on mount.
$effect(() => { $effect(() => {
void $page
goToHome() goToHome()
}) })
</script> </script>