feat: proper token refresh

This commit is contained in:
ThaUnknown 2025-05-17 02:57:09 +02:00
parent 7157869fe8
commit d3ce9a629d
No known key found for this signature in database
6 changed files with 1369 additions and 1246 deletions

View file

@ -1,6 +1,6 @@
{
"name": "ui",
"version": "6.3.13",
"version": "6.3.14",
"license": "BUSL-1.1",
"private": true,
"packageManager": "pnpm@9.14.4",
@ -18,63 +18,61 @@
},
"devDependencies": {
"@gql.tada/svelte-support": "^1.0.1",
"@sveltejs/adapter-auto": "^3.2.5",
"@sveltejs/adapter-static": "^3.0.5",
"@sveltejs/kit": "^2.8.1",
"@sveltejs/adapter-static": "^3.0.8",
"@sveltejs/kit": "^2.21.0",
"@sveltejs/vite-plugin-svelte": "^3.1.2",
"@types/debug": "^4.1.12",
"@types/semver": "^7.7.0",
"@urql/introspection": "^1.1.0",
"autoprefixer": "^10.4.20",
"@urql/introspection": "^1.2.1",
"autoprefixer": "^10.4.21",
"bits-ui": "^0.22.0",
"cmdk-sv": "^0.0.18",
"cmdk-sv": "^0.0.19",
"eslint-config-standard-universal": "^1.0.6",
"globals": "^15.11.0",
"gql.tada": "^1.8.10",
"hayase-extensions": "github:hayase-app/extensions",
"jassub": "^1.7.18",
"svelte": "^4.2.19",
"svelte-check": "^4.0.5",
"svelte-check": "^4.2.1",
"svelte-radix": "^1.1.1",
"svelte-sonner": "^0.3.28",
"tailwindcss": "^3.4.13",
"tailwindcss": "^3.4.17",
"vaul-svelte": "^0.3.2",
"vite": "^5.4.11"
},
"type": "module",
"dependencies": {
"@cloudflare/speedtest": "^1.4.1",
"@fontsource-variable/nunito": "^5.1.0",
"@fontsource-variable/nunito": "^5.2.5",
"@prgm/sveltekit-progress-bar": "2.0.0",
"@thaunknown/web-irc": "^1.0.1",
"@urql/exchange-auth": "^2.2.0",
"@urql/exchange-graphcache": "^7.2.1",
"@urql/exchange-refocus": "^1.1.0",
"@urql/exchange-request-policy": "^1.2.0",
"@urql/exchange-retry": "^1.3.0",
"@urql/svelte": "^4.2.1",
"@urql/exchange-auth": "^2.2.1",
"@urql/exchange-graphcache": "^7.2.3",
"@urql/exchange-refocus": "^1.1.1",
"@urql/exchange-request-policy": "^1.2.1",
"@urql/exchange-retry": "^1.3.1",
"@urql/svelte": "^4.2.3",
"abslink": "^1.1.0",
"anitomyscript": "github:thaunknown/anitomyscript",
"bottleneck": "^2.19.5",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"debug": "^4.3.7",
"debug": "^4.4.1",
"dompurify": "^3.2.5",
"events": "^3.3.0",
"idb-keyval": "^6.2.1",
"idb-keyval": "^6.2.2",
"js-levenshtein": "^1.1.6",
"lucide-svelte": "^0.452.0",
"lucide-svelte": "^0.511.0",
"marked": "^15.0.11",
"p2pt": "^1.5.1",
"rollup-plugin-license": "^3.6.0",
"semver": "^7.7.1",
"semver": "^7.7.2",
"simple-store-svelte": "^1.0.6",
"svelte-keybinds": "^1.0.9",
"svelte-persisted-store": "^0.12.0",
"tailwind-merge": "^2.5.4",
"tailwind-variants": "^0.2.1",
"tailwind-merge": "^3.3.0",
"tailwind-variants": "^1.0.0",
"uint8-util": "^2.2.5",
"urql": "^4.2.1",
"urql": "^4.2.2",
"video-deband": "^1.0.7",
"workbox-core": "^7.3.0",
"workbox-precaching": "^7.3.0"

File diff suppressed because it is too large Load diff

View file

@ -19,7 +19,7 @@
media: file.metadata.media,
session: {
title: title(file.metadata.media),
description: 'Episode ' + file.metadata.episode, // TODO
description: 'Episode ' + file.metadata.episode,
image: cover(file.metadata.media) ?? ''
}
}

View file

@ -7,7 +7,6 @@ interface RenderItem {
export default class Thumbnailer {
video = document.createElement('video')
canvas = new OffscreenCanvas(0, 0)
// TODO: consider using bitmap renderer for better performance, this might not be worth the performance hit
ctx = this.canvas.getContext('2d')!
thumbnails: string[] = []
size = 700

View file

@ -124,7 +124,7 @@ class AnilistClient {
lists.push(fallback)
targetList = fallback
}
if (!targetList.entries) targetList.entries = []
targetList.entries ??= []
targetList.entries.push(oldEntry)
return { ...data, MediaListCollection: { ...data.MediaListCollection, lists } }
})
@ -235,10 +235,12 @@ class AnilistClient {
})
},
didAuthError (error, _operation) {
return error.graphQLErrors.some(e => e.extensions.code === 'FORBIDDEN') // TODO: verify how anilist handles auth errors: {"data":null,"errors":[{"message":"Invalid token","status":400}]}
return error.graphQLErrors.some(e => e.message === 'Invalid token')
},
refreshAuth: async () => {
await this.auth()
const oauth = this.token()
this.auth(oauth) // TODO: this should be awaited, but it utils doesnt expose query, only mutation, so need to wait for it to be added
await oauth
},
willAuthError: () => {
if (!this.viewer.value?.expires) return false
@ -271,11 +273,16 @@ class AnilistClient {
return res
})
async auth () {
async token () {
const res = await native.authAL(`https://anilist.co/api/v2/oauth/authorize?client_id=${dev ? 26159 : 3461}&response_type=token`)
const token = res.access_token
const expires = '' + (Date.now() + (parseInt(res.expires_in) * 1000))
this.viewer.value = { viewer: this.viewer.value?.viewer ?? null, token, expires }
return { token, expires }
}
async auth (oauth = this.token()) {
const { token, expires } = await oauth
const viewerRes = await this.client.query(Viewer, {}, { fetchOptions: { headers: { Authorization: `Bearer ${token}` } } })
if (!viewerRes.data?.Viewer) throw new Error('Failed to fetch viewer data')
@ -296,7 +303,7 @@ class AnilistClient {
setRateLimit (sec: number) {
toast.error('Anilist Error', { description: 'Rate limit exceeded, retrying in ' + Math.round(sec / 1000) + ' seconds.' })
if (!this.rateLimitPromise) this.rateLimitPromise = sleep(sec).then(() => { this.rateLimitPromise = null })
this.rateLimitPromise ??= sleep(sec).then(() => { this.rateLimitPromise = null })
return sec
}
@ -324,7 +331,6 @@ class AnilistClient {
})
// WARN: these 3 sections are hacky, i use oldvalue to prevent re-running loops, I DO NOT KNOW WHY THE LOOPS HAPPEN!
// TODO: these should be optimised to be called with ids.slice(index, index + perPage)
continueIDs = readable<number[]>([], set => {
let oldvalue: number[] = []
const sub = this.userlists.subscribe(values => {
@ -346,7 +352,6 @@ class AnilistClient {
return sub
})
// TODO: this needs to be called with onList: false
sequelIDs = readable<number[]>([], set => {
let oldvalue: number[] = []
const sub = this.userlists.subscribe(values => {

View file

@ -23,7 +23,7 @@ export default new class AuthAggregator {
// AUTH
anilist () {
return !!client.viewer.value
return !!client.viewer.value?.viewer?.id
}
checkAuth () {