From adede32af237aa1d5973a00887a5ee0320e05c4b Mon Sep 17 00:00:00 2001 From: DarkSky Date: Thu, 22 Dec 2022 15:40:25 +0800 Subject: [PATCH] feat: clearly fetcher implement --- packages/data-services/src/request/axios.ts | 61 ------------- packages/data-services/src/request/index.ts | 51 ++++++++++- packages/data-services/src/request/token.ts | 1 + packages/data-services/src/sdks/user.ts | 17 +--- packages/data-services/src/sdks/workspace.ts | 92 +++++--------------- 5 files changed, 76 insertions(+), 146 deletions(-) delete mode 100644 packages/data-services/src/request/axios.ts diff --git a/packages/data-services/src/request/axios.ts b/packages/data-services/src/request/axios.ts deleted file mode 100644 index 8693325837..0000000000 --- a/packages/data-services/src/request/axios.ts +++ /dev/null @@ -1,61 +0,0 @@ -import axios from 'axios'; -import { getToken, isAccessTokenExpired, refreshToken } from './token'; - -declare module 'axios' { - interface AxiosRequestConfig { - /** - * If true, indicate this request is refreshing token. - */ - refreshTokenRequest?: boolean; - } -} - -export const request = axios.create(); - -request.interceptors.request.use(async config => { - if (!config.headers) { - config.headers = {}; - } - - const token = getToken(); - if (token) { - if (isAccessTokenExpired(token.accessToken)) { - await refreshToken(); - } - if (!config.headers) { - config.headers = {}; - } - config.headers['Authorization'] = token.accessToken; - } - - return config; -}); -request.interceptors.response.use( - response => { - const { status, data } = response; - if (status === 200) { - if (data.error) { - // TODO - common error handling - throw new Error(data.error.message, { cause: data.error.code }); - } - return response; - } - return response; - }, - async error => { - const { response, config, message } = error; - const status = response?.status; - - if (status === 401) { - if (!config) { - throw new Error(message, { cause: status.toString() }); - } - if (config.refreshTokenRequest) { - throw new Error(message, { cause: status.toString() }); - } - await refreshToken(); - return request({ ...config, refreshTokenRequest: true }); - } - return response; - } -); diff --git a/packages/data-services/src/request/index.ts b/packages/data-services/src/request/index.ts index 5a70e5256f..bbd2f2e73d 100644 --- a/packages/data-services/src/request/index.ts +++ b/packages/data-services/src/request/index.ts @@ -1,3 +1,50 @@ -export { request } from './axios'; +import ky from 'ky'; +import { + getToken, + setToken, + isAccessTokenExpired, + refreshToken, + authorizationEvent, +} from './token'; + +export const request = ky.extend({ + retry: 1, + hooks: { + beforeRequest: [ + async request => { + if (!request.headers.has('token') || request.headers.get('token')) { + const token = getToken(); + if (token) { + if (isAccessTokenExpired(token.accessToken)) { + await refreshToken(); + } + + request.headers.set('Authorization', token.accessToken); + } + } + }, + ], + // afterResponse: [ + // async (_request, _options, response) => { + // if (response.status === 200) { + // const data = await response.json(); + // if (data.error) { + // return new Response(data.error.message, { + // status: data.error.code, + // }); + // } + // } + // return response; + // }, + // ], + beforeRetry: [ + async ({ request }) => { + const token = await refreshToken(); + request.headers.set('Authorization', token.accessToken); + }, + ], + }, +}); + export type { AccessTokenMessage } from './token'; -export { authorizationEvent, getToken, setToken } from './token'; +export { authorizationEvent, getToken, setToken }; diff --git a/packages/data-services/src/request/token.ts b/packages/data-services/src/request/token.ts index 92d22e98e3..057bae13f0 100644 --- a/packages/data-services/src/request/token.ts +++ b/packages/data-services/src/request/token.ts @@ -96,4 +96,5 @@ export const refreshToken = async () => { }; setToken(token); refreshingToken = undefined; + return token; }; diff --git a/packages/data-services/src/sdks/user.ts b/packages/data-services/src/sdks/user.ts index 0ba0e64107..1b319e0385 100644 --- a/packages/data-services/src/sdks/user.ts +++ b/packages/data-services/src/sdks/user.ts @@ -27,13 +27,9 @@ export interface LoginResponse { } export async function login(params: LoginParams): Promise { - const data = await request({ - url: '/api/user/token', - method: 'POST', - data: params, - withAuthorization: false, - } as any); - return data.data; + return request + .post('/api/user/token', { json: params, headers: { token: undefined } }) + .json(); } export interface GetUserByEmailParams { @@ -52,10 +48,5 @@ export interface User { export async function getUserByEmail( params: GetUserByEmailParams ): Promise { - const data = await request({ - url: '/api/user', - method: 'GET', - params, - }); - return data.data; + return request.get('/api/user', { json: params }).json(); } diff --git a/packages/data-services/src/sdks/workspace.ts b/packages/data-services/src/sdks/workspace.ts index 155cbef12b..d806c69ef7 100644 --- a/packages/data-services/src/sdks/workspace.ts +++ b/packages/data-services/src/sdks/workspace.ts @@ -26,12 +26,7 @@ export interface Workspace { } export async function getWorkspaces(): Promise { - const data = await request({ - url: '/api/workspace', - method: 'GET', - }); - - return data.data; + return request.get('/api/workspace').json(); } export interface WorkspaceDetail extends Workspace { @@ -42,14 +37,7 @@ export interface WorkspaceDetail extends Workspace { export async function getWorkspaceDetail( params: GetWorkspaceDetailParams ): Promise { - const data = await request({ - url: `/api/workspace/${params.id}`, - method: 'GET', - }); - if (data.data?.owner.id) { - data.data.owner.id = String(data.data?.owner.id); - } - return data.data; + return request.get(`/api/workspace/${params.id}`).json(); } export interface Permission { @@ -80,12 +68,7 @@ export interface GetWorkspaceMembersParams { export async function getWorkspaceMembers( params: GetWorkspaceDetailParams ): Promise { - const data = await request({ - url: `/api/workspace/${params.id}/permission`, - method: 'GET', - }); - - return data.data; + return request.get(`/api/workspace/${params.id}/permission`).json(); } export interface CreateWorkspaceParams { @@ -96,13 +79,7 @@ export interface CreateWorkspaceParams { export async function createWorkspace( params: CreateWorkspaceParams ): Promise { - const data = await request({ - url: '/api/workspace', - method: 'POST', - data: params, - }); - - return data.data; + return request.post('/api/workspace', { json: params }).json(); } export interface UpdateWorkspaceParams { @@ -113,15 +90,13 @@ export interface UpdateWorkspaceParams { export async function updateWorkspace( params: UpdateWorkspaceParams ): Promise { - const data = await request({ - url: `/api/workspace/${params.id}`, - method: 'POST', - data: { - public: params.public, - }, - }); - - return data.data; + return request + .post(`/api/workspace/${params.id}`, { + json: { + public: params.public, + }, + }) + .json(); } export interface DeleteWorkspaceParams { @@ -131,12 +106,7 @@ export interface DeleteWorkspaceParams { export async function deleteWorkspace( params: DeleteWorkspaceParams ): Promise { - const data = await request({ - url: `/api/workspace/${params.id}`, - method: 'DELETE', - }); - - return data.data; + await request.delete(`/api/workspace/${params.id}`); } export interface InviteMemberParams { @@ -148,15 +118,13 @@ export interface InviteMemberParams { * Notice: Only support normal(contrast to private) workspace. */ export async function inviteMember(params: InviteMemberParams): Promise { - const data = await request({ - url: `/api/workspace/${params.id}/permission`, - method: 'POST', - data: { - email: params.email, - }, - }); - - return data.data; + return request + .post(`/api/workspace/${params.id}/permission`, { + json: { + email: params.email, + }, + }) + .json(); } export interface RemoveMemberParams { @@ -164,12 +132,7 @@ export interface RemoveMemberParams { } export async function removeMember(params: RemoveMemberParams): Promise { - const data = await request({ - url: `/api/permission/${params.permissionId}`, - method: 'DELETE', - }); - - return data.data; + await request.delete(`/api/permission/${params.permissionId}`); } export interface AcceptInvitingParams { @@ -179,12 +142,7 @@ export interface AcceptInvitingParams { export async function acceptInviting( params: AcceptInvitingParams ): Promise { - const data = await request({ - url: `/api/invite/${params.invitingCode}`, - method: 'POST', - }); - - return data.data; + await request.post(`/api/invite/${params.invitingCode}`); } export interface DownloadWOrkspaceParams { @@ -193,13 +151,7 @@ export interface DownloadWOrkspaceParams { export async function downloadWorkspace( params: DownloadWOrkspaceParams ): Promise { - const data = await request({ - url: `/api/workspace/${params.workspaceId}/doc`, - method: 'GET', - responseType: 'arraybuffer', - }); - - return data?.data; + return request.get(`/api/workspace/${params.workspaceId}/doc`).arrayBuffer(); } export async function uploadBlob(params: { blob: Blob }): Promise {