diff --git a/src/hooks/useRepos.hook.ts b/src/hooks/useRepos.hook.ts index cbbc643..36fbf91 100644 --- a/src/hooks/useRepos.hook.ts +++ b/src/hooks/useRepos.hook.ts @@ -1,7 +1,7 @@ -import { Octokit } from '@octokit/rest' import { RepoBase } from '@/modules/repo/interfaces/RepoBase' import { useAsyncState } from '@vueuse/core' import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook' +import { getOctokit } from '@/modules/repo/services/octo' export const useRepos = () => { const { username, accessToken } = useGitHubLogin() @@ -10,9 +10,7 @@ export const useRepos = () => { return [] } - const octokit = new Octokit({ - auth: accessToken.value - }) + const octokit = await getOctokit() const repoList = await octokit.request('GET /search/repositories', { q: `user:${username.value}`, diff --git a/src/modules/repo/services/octo.ts b/src/modules/repo/services/octo.ts new file mode 100644 index 0000000..c0df59f --- /dev/null +++ b/src/modules/repo/services/octo.ts @@ -0,0 +1,37 @@ +import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook' +import { needToRefreshToken, refreshToken } from '@/modules/user/service/signIn' +import { Octokit } from '@octokit/rest' + +let refreshingToken = false +let octokit = new Octokit() + +const sleep = async (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +export const getOctokit = async (): Promise => { + const { accessToken } = useGitHubLogin() + octokit = new Octokit({ + auth: accessToken.value + }) + + if (refreshingToken) { + await sleep(100) + return getOctokit() + } + + if (!refreshingToken) { + refreshingToken = true + if (await needToRefreshToken()) { + const accessToken = await refreshToken() + if (accessToken) { + octokit = new Octokit({ + auth: accessToken?.token + }) + } + } + refreshingToken = false + } + + return octokit +} diff --git a/src/modules/repo/services/repo.ts b/src/modules/repo/services/repo.ts index 750a993..676ac35 100644 --- a/src/modules/repo/services/repo.ts +++ b/src/modules/repo/services/repo.ts @@ -1,10 +1,8 @@ -import { useGitHubLogin } from '@/hooks/useGitHubLogin.hook' import { useMarkdown } from '@/hooks/useMarkdown.hook' import { useNoteCache } from '@/modules/note/hooks/useNoteCache' import { RepoFile } from '@/modules/repo/interfaces/RepoFile' import { UserSettings } from '@/modules/repo/interfaces/UserSettings' -import { refreshToken } from '@/modules/user/service/signIn' -import { Octokit } from '@octokit/rest' +import { getOctokit } from '@/modules/repo/services/octo' export const getFiles = async ( owner: string, @@ -13,13 +11,7 @@ export const getFiles = async ( if (!owner || !repo) { return [] } - await refreshToken() - - const { accessToken } = useGitHubLogin() - - const octokit = new Octokit({ - auth: accessToken.value - }) + const octokit = await getOctokit() const commits = await octokit.request('GET /repos/{owner}/{repo}/commits', { owner, @@ -56,11 +48,7 @@ export const getMainReadme = async (owner: string, repo: string) => { const cachedReadme = await getCachedNote() try { - await refreshToken() - const { accessToken } = useGitHubLogin() - const octokit = new Octokit({ - auth: accessToken.value - }) + const octokit = await getOctokit() const README = await octokit.repos.getReadme({ owner, @@ -105,12 +93,7 @@ export const getFileContent = async ( repo: string, sha: string ) => { - await refreshToken() - const { accessToken } = useGitHubLogin() - - const octokit = new Octokit({ - auth: accessToken.value - }) + const octokit = await getOctokit() if (!user || !repo) { null diff --git a/src/modules/repo/store/userRepo.store.ts b/src/modules/repo/store/userRepo.store.ts index f4d844a..63f3bc8 100644 --- a/src/modules/repo/store/userRepo.store.ts +++ b/src/modules/repo/store/userRepo.store.ts @@ -28,10 +28,8 @@ export const useUserRepoStore = defineStore({ async setUserRepo(newUser: string, newRepo: string) { this.user = newUser this.repo = newRepo - const [readme, files] = await Promise.all([ - getMainReadme(newUser, newRepo), - getFiles(newUser, newRepo) - ]) + const readme = await getMainReadme(newUser, newRepo) + const files = await getFiles(newUser, newRepo) this.userSettings = await getUserSettingsContent(newUser, newRepo, files) this.readme = readme diff --git a/src/modules/user/service/signIn.ts b/src/modules/user/service/signIn.ts index 236f716..c9c9cf2 100644 --- a/src/modules/user/service/signIn.ts +++ b/src/modules/user/service/signIn.ts @@ -21,6 +21,19 @@ export const signIn = async ( return body } +export const needToRefreshToken = async () => { + const accessToken = await data.get< + DataType.GithubAccessToken, + GithubAccessToken + >(data.generateId(DataType.GithubAccessToken, personalTokenId)) + + if (!accessToken) { + return false + } + + return new Date(accessToken.expirationDate) <= new Date() +} + export const refreshToken = async () => { const accessToken = await data.get< DataType.GithubAccessToken, @@ -31,13 +44,9 @@ export const refreshToken = async () => { return null } - console.log( - new Date(accessToken.expirationDate) >= new Date(), - accessToken.expirationDate, - accessToken - ) + console.log(accessToken.refreshToken) - if (new Date(accessToken.expirationDate) >= new Date()) { + if (await needToRefreshToken()) { const authenticationServerURL = new URL(AUTHENTICATION_SERVER) authenticationServerURL.searchParams.set('type', 'refresh') authenticationServerURL.searchParams.set('code', accessToken.refreshToken) @@ -47,7 +56,7 @@ export const refreshToken = async () => { | GithubToken | GithubTokenError - console.log(response) + console.log(githubToken) if ('error' in githubToken) { return null @@ -94,8 +103,10 @@ export const saveAccessToken = async (githubToken: GithubToken) => { username: '' } + console.log(accessToken) + const octokit = new Octokit({ - auth: accessToken.token + auth: accessToken?.token }) const user = await octokit.request('GET /user')