diff --git a/package.json b/package.json index 56520ba7..068db0e6 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "jest": "^29.5.0", "prettier": "^2.8.4", "tsc-alias": "^1.8.2", - "typedoc": "^0.23.26", + "typedoc": "^0.25.13", "typescript": "^5.0.4", "yorkie": "^2.0.0" }, diff --git a/packages/jac/README.md b/packages/jac/README.md index 9a05803f..4ba12016 100644 --- a/packages/jac/README.md +++ b/packages/jac/README.md @@ -45,6 +45,11 @@ export const bearerAttachInterceptor: FetcherRequestInterceptor = async ( return request } +const refreshTokenStatus = { + isUpdating: false, + isErrored: false, +}; + export const refreshTokenInterceptor: FetcherErrorResponseInterceptor = async ( response: FetcherResponse, ) => { @@ -63,15 +68,29 @@ export const refreshTokenInterceptor: FetcherErrorResponseInterceptor = async ( const { t } = i18n.global try { - const accessToken = localStorage.getItem('accessToken') + if (!refreshTokenStatus.isUpdating) { + refreshTokenStatus.isUpdating = true; + refreshTokenStatus.isErrored = false; + + // Executes some refresh token logic in the client app + const newToken = await api.get('/refresh', {...}) + localStorage.setItem('accessToken', newToken) + + refreshTokenStatus.isUpdating = false; + } - // Executes some refresh token logic in the client app - toolkitBus.emit(DEFAULT_BUS_EVENTS.refreshToken) + while(refreshTokenStatus.isUpdating) { + await sleep(50); + }; + + if (refreshTokenStatus.isErrored) { return response; } + + const accessToken = localStorage.getItem('accessToken') const url = new URL(config.url) return new Fetcher({ baseUrl: url.origin }).request({ - endpoint: url.pathname, + endpoint: config.url.replace(url.origin, ''), method: config.method as HTTP_METHODS, ...(config.body ? { body: config.body } : {}), headers: { @@ -89,6 +108,9 @@ export const refreshTokenInterceptor: FetcherErrorResponseInterceptor = async ( * emit bus error event to show user that session expired */ + refreshTokenStatus.isErrored = true; + refreshTokenStatus.isUpdating = false; + toolkitBus.emit(DEFAULT_BUS_EVENTS.logout) toolkitBus.emit(DEFAULT_BUS_EVENTS.error, { title: t('api-errors.session-expired-title'), diff --git a/yarn.lock b/yarn.lock index bca266b0..b3e57bcc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6425,7 +6425,7 @@ __metadata: languageName: node linkType: hard -"marked@npm:^4.2.12": +"marked@npm:^4.3.0": version: 4.3.0 resolution: "marked@npm:4.3.0" bin: @@ -6525,15 +6525,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^7.1.3": - version: 7.4.6 - resolution: "minimatch@npm:7.4.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 1a6c8d22618df9d2a88aabeef1de5622eb7b558e9f8010be791cb6b0fa6e102d39b11c28d75b855a1e377b12edc7db8ff12a99c20353441caa6a05e78deb5da9 - languageName: node - linkType: hard - "minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": version: 9.0.4 resolution: "minimatch@npm:9.0.4" @@ -6804,13 +6795,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.2, node-gyp-build@npm:^4.3.0": - version: 4.8.0 - resolution: "node-gyp-build@npm:4.8.0" + version: 4.8.1 + resolution: "node-gyp-build@npm:4.8.1" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: b82a56f866034b559dd3ed1ad04f55b04ae381b22ec2affe74b488d1582473ca6e7f85fccf52da085812d3de2b0bf23109e752a57709ac7b9963951c710fea40 + checksum: fe6e95da6f4608c1a98655f6bf2fe4e8dd9c877cd13256056a8acaf585cc7f98718823fe9366be11b78c2f332d5a184b00cf07a4af96c9d8fea45f640c019f98 languageName: node linkType: hard @@ -7835,7 +7826,7 @@ __metadata: languageName: node linkType: hard -"shiki@npm:^0.14.1": +"shiki@npm:^0.14.7": version: 0.14.7 resolution: "shiki@npm:0.14.7" dependencies: @@ -8500,19 +8491,19 @@ __metadata: languageName: node linkType: hard -"typedoc@npm:^0.23.26": - version: 0.23.28 - resolution: "typedoc@npm:0.23.28" +"typedoc@npm:^0.25.13": + version: 0.25.13 + resolution: "typedoc@npm:0.25.13" dependencies: lunr: ^2.3.9 - marked: ^4.2.12 - minimatch: ^7.1.3 - shiki: ^0.14.1 + marked: ^4.3.0 + minimatch: ^9.0.3 + shiki: ^0.14.7 peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x bin: typedoc: bin/typedoc - checksum: 40eb4e207aac1b734e09400cf03f543642cc7b11000895198dd5a0d3166315759ccf4ac30a2915153597c5c186101c72bac2f1fc12b428184a9274d3a0e44c5e + checksum: 703d1f48137300b0ef3df1998a25ae745db3ca0b126f8dd1f7262918f11243a94d24dfc916cdba2baeb5a7d85d5a94faac811caf7f4fa6b7d07144dc02f7639f languageName: node linkType: hard @@ -8814,7 +8805,7 @@ __metadata: jest: ^29.5.0 prettier: ^2.8.4 tsc-alias: ^1.8.2 - typedoc: ^0.23.26 + typedoc: ^0.25.13 typescript: ^5.0.4 yorkie: ^2.0.0 languageName: unknown