From 20f12a48a45e968e36af1792516e7aadbb1fc8ee Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Mon, 17 Aug 2026 16:10:00 -0700 Subject: [PATCH] Fix session persistence on android --- package.json | 20 ++++++++++---------- pnpm-lock.yaml | Bin 382072 -> 380572 bytes src/app/storage.ts | 27 ++++++++++++--------------- src/routes/+page.svelte | 4 ++++ 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 57bd41ea..ff0ec991 100644 --- a/package.json +++ b/package.json @@ -76,16 +76,16 @@ "@types/throttle-debounce": "^5.0.2", "@vite-pwa/assets-generator": "^1.0.2", "@vite-pwa/sveltekit": "^1.1.0", - "@welshman/app": "^0.9.0-pre6", - "@welshman/content": "^0.9.0-pre6", - "@welshman/domain": "^0.9.0-pre6", - "@welshman/editor": "^0.9.0-pre6", - "@welshman/feeds": "^0.9.0-pre6", - "@welshman/lib": "^0.9.0-pre6", - "@welshman/net": "^0.9.0-pre6", - "@welshman/signer": "^0.9.0-pre6", - "@welshman/store": "^0.9.0-pre6", - "@welshman/util": "^0.9.0-pre6", + "@welshman/app": "^0.9.0", + "@welshman/content": "^0.9.0", + "@welshman/domain": "^0.9.0", + "@welshman/editor": "^0.9.0", + "@welshman/feeds": "^0.9.0", + "@welshman/lib": "^0.9.0", + "@welshman/net": "^0.9.0", + "@welshman/signer": "^0.9.0", + "@welshman/store": "^0.9.0", + "@welshman/util": "^0.9.0", "cheerio": "^1.2.0", "compressorjs-next": "^1.1.2", "dompurify": "^3.4.13", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e35138b70bee7ee47b5bd6038e8458438f330f6..d761f488b05e44be82e6fbcd65c99acab0186888 100644 GIT binary patch delta 3194 zcmd5aFqA2K(=yqOX<;MRq=I@k+BXJj z->~{*&KC|(FgfBKs^OAml3lCGZYuf2K=fMm>Ly3DI^9OJQ_D+MD_lwz(ipt(b>umC z_gi3TYfl?lTW}SIu`ZHvF{xZ+l+D%4Sz0lO=(wY3ViIF4!H@cTGMCNwh82uWmQ3F? zl+Oz>E}f5BJcf4265ff2Q_*Hh5X!h&SBeEK7|WnC@AHl4te5W@ugmqCfgE#jOW{^> zvsIQ7XuD~qVi~%b_Qxno<29?&@Ky`4J~3r9MKAGUufSUVTx!5`GCvZFBcFgp`tgK{ zb`6Ck`IJ8-qQqu99?8Pqj}}(pKNlAE!Eg7F6&I*GnY20@JHZ;x6o(PU3!=?@J%HZ6@*SIMd*TDGiaU-vW8yCi9DB!OCvqRr1h+3C}A`q-b2u( z)w=?b5@nX!&sW{(|WNoN)V$& zq@<;j1yS|Y1LUObRWo#~-eY4yU)k9ocZ2^sO9y=R2lcyj8C43^3f)fEN6;0fm}+=i znMtW#(~2^E$!F$=S<)J1 z$m*Q#8vOB1uncERJueeOWcFLwB8Gc@_NPbT+)hBcf%nJDVD+bWktg6k;=phP|KFzF zZXgF9!l;8zh`Lt06-om=>v>Re;!wJ{XU(z80~arW;v?kDI9Yt)vt_SqW4q?e=St6W z@T~!|_{FKtK<}@?kr43qHBkQI zmgOE1PF)9IgT#}wtBGFNdk~JVgM`Cj=XLr^@ci!qwuAQJ8({Jf#&Fu%tyRa~55jYY zz^$W= Sw*dO`om*h*&aJ&aS^5tr?ie}% delta 4777 zcmeHLON`sr6$NcNGj^wO#-8cKcE)y)X6!()MT#Gh1zMZ>jsAa8l(Gp$Qlv;p6ea4r zN!+3^iWEf(#(pU3pf%D@kSuB=Xb0%WPLS5wCf#(=AjmRZcGpGQRMJo**)vX6!!Qz{ zivjNN@x6QRIp^JbscWyT{o{?b8;gqv&NZ46X&Ec4wsmQ3#kSDJui4i1)#q%BKX}3V z)#B35^EHtCJ$%Ogcm6{{I|tYYgVZ13IQaOt@Gh65mHgXVhyJo)@A<)zwT*GmXC)MI zlSoN)iv&ecxFkv_MwTU!6x@$|JvliEm-cdpj3*fW@Em+@OSXC~LS#+v%ny&9|IVi; zwmv-p{WWaA#v>cKxR*^tJ7&Sbv{8(%hPn+kL@32zr0$c$ESDM>U53RR3L7R^laa%& zoKLUi2NAs>#}GOnL`j6jyiFxr)zEk>?e)9+YRNkN{bxY)q)O#kKTm8y8X}^<$;<^ zPI70$rGC{C}Y zhFq?&66Di*6lL2~0g?rRU+Yo>Z^Ua&#o0 zA@EABhx9V8rfG^rxy7~vWlSB^UAl|iY!z`0ZKGYo6EX#~VNht-+t2Enl%)DCR{$>> zP0{1ht-rte4EW%!ojNoRU{jQ?@X+yb$e?l)o>a+EtVvY#MPf-g-Q~QZhL*iWvd%>r z)tzfb{DCx8Nil|?6uK0r)uI8hPRqTv*OPCGbg_aa{8-T2NczYem5@n9kFlB|;_=3q z?3et|GWb&!I=S_d2K@`N*_ws~eq4i+Gjv5#m9Uver0&ZI;NYjt#=ua$QM!+5HIanc}MsMna1Rub}(y zH7la(j$tz6O+_n)oWO)K*Y8pBK(!ihD^#k9I!wG^W~d;~qP37wrnzR)OKEkQ4Oq)V z*(Qw%)3XFjBiT{s6D?D3O84HU9#1ljh^r*YwOp)jAaOb&;BJvG^<&zAt5&?5&1jt^ zYayKXH~G9HRKqecy<;$1DvGS1=>s*T`X9dPS<6jn3O&NaA!OV{92qb??W zDY$q6T$Z87=bR$J)z{$(><==4JZiB`=DYMP36Fn|&fZ_f7_Pm@!-`jt3cBpuei2qOgsP64qTfn#8gYogiWfSt>zRJLukc(~j z?A6$TV_-NqEo}YsCcFY~^E)&4-aW>T96h%6@^9dceYO(5G)($`2cvd&UyLifH { - let p = Promise.resolve() + const enqueue = makeQueue() const get = async (key: string): Promise => { const result = await Preferences.get({key}) @@ -58,22 +58,18 @@ export const kv = call(() => { } const set = async (key: string, value: T): Promise => { - p = p.then(() => Preferences.set({key, value: JSON.stringify(value)})) - - await p + await enqueue(() => Preferences.set({key, value: JSON.stringify(value)})) } const clear = async () => { - p = p.then(() => Preferences.clear()) - - await p + await enqueue(() => Preferences.clear()) } return {get, set, clear} }) export const ss = call(() => { - let p = Promise.resolve() + const enqueue = makeQueue() const get = async (key: string): Promise => { let value = await SecureStorage.getItem(key) @@ -97,16 +93,17 @@ export const ss = call(() => { } } + // Android's SecureStorage rejects undefined const set = async (key: string, value: T): Promise => { - p = p.then(() => SecureStorage.setItem(key, JSON.stringify(value))) - - await p + await enqueue(() => + value === undefined + ? SecureStorage.removeItem(key) + : SecureStorage.setItem(key, JSON.stringify(value)), + ) } const clear = async () => { - p = p.then(() => SecureStorage.clear()) - - await p + await enqueue(() => SecureStorage.clear()) } return {get, set, clear} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index c4009076..32fc047e 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,7 +1,11 @@