mirror of
https://github.com/ThaUnknown/miru.git
synced 2026-03-11 22:15:35 +00:00
feat: proper token refresh
This commit is contained in:
parent
7157869fe8
commit
d3ce9a629d
6 changed files with 1369 additions and 1246 deletions
46
package.json
46
package.json
|
|
@ -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"
|
||||
|
|
|
|||
2545
pnpm-lock.yaml
2545
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
|
|
@ -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) ?? ''
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 => {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ export default new class AuthAggregator {
|
|||
// AUTH
|
||||
|
||||
anilist () {
|
||||
return !!client.viewer.value
|
||||
return !!client.viewer.value?.viewer?.id
|
||||
}
|
||||
|
||||
checkAuth () {
|
||||
|
|
|
|||
Loading…
Reference in a new issue