feat: bare client for non-auth apis

This commit is contained in:
DarkSky
2022-12-22 19:05:16 +08:00
parent c2ce4927c8
commit 593bb77921
7 changed files with 53 additions and 47 deletions
@@ -13,7 +13,7 @@ import type {
LoadWorkspaceHandler,
CreateEditorHandler,
} from './context';
import { downloadWorkspace, getToken } from '@pathfinder/data-services';
import { downloadWorkspace, token } from '@pathfinder/data-services';
import { WebsocketProvider } from './y-websocket';
const getEditorParams = (workspaceId: string) => {
@@ -55,11 +55,9 @@ const DynamicBlocksuite = ({
providers: [IndexedDBDocProvider],
}).register(BlockSchema);
const refreshToken = getToken()?.refreshToken;
if (
websocket &&
refreshToken &&
token.refresh &&
location.search.includes('sync=websocket')
) {
// FIXME: if add websocket provider, the first page will be blank
@@ -71,7 +69,7 @@ const DynamicBlocksuite = ({
workspace.doc,
{
params: {
token: refreshToken,
token: token.refresh,
},
awareness: workspace.meta.awareness.awareness,
}
@@ -2,11 +2,9 @@ import { useMemo, useState, useEffect, useCallback, useRef } from 'react';
import type { ReactNode } from 'react';
import dynamic from 'next/dynamic';
import {
authorizationEvent,
token,
AccessTokenMessage,
getWorkspaces,
WorkspaceType,
getWorkspaceDetail,
} from '@pathfinder/data-services';
import { AppState, AppStateContext } from './context';
import type {
@@ -171,10 +169,10 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
synced: true,
}));
};
authorizationEvent.onChange(callback);
token.onChange(callback);
return () => {
authorizationEvent.removeCallback(callback);
token.offChange(callback);
};
}, [loadWorkspaceHandler]);
+1 -1
View File
@@ -1,6 +1,6 @@
import { AccessTokenMessage } from './token';
type Callback = (user: AccessTokenMessage | null) => void;
export type Callback = (user: AccessTokenMessage | null) => void;
export class AuthorizationEvent {
private callbacks: Callback[] = [];
+14 -11
View File
@@ -1,19 +1,9 @@
import ky from 'ky';
import { token } from './token';
export const request = ky.extend({
export const bareClient = ky.extend({
retry: 1,
hooks: {
beforeRequest: [
async request => {
if (!request.headers.has('token') || request.headers.get('token')) {
if (token.isLogin) {
if (token.isExpired) await token.refreshToken();
request.headers.set('Authorization', token.token);
}
}
},
],
// afterResponse: [
// async (_request, _options, response) => {
// if (response.status === 200) {
@@ -27,6 +17,19 @@ export const request = ky.extend({
// return response;
// },
// ],
},
});
export const client = bareClient.extend({
hooks: {
beforeRequest: [
async request => {
if (token.isLogin) {
if (token.isExpired) await token.refreshToken();
request.headers.set('Authorization', token.token);
}
},
],
beforeRetry: [
async ({ request }) => {
await token.refreshToken();
+17 -10
View File
@@ -1,5 +1,5 @@
import { request } from '.';
import { AuthorizationEvent } from './events';
import { bareClient } from '.';
import { AuthorizationEvent, Callback } from './events';
export interface AccessTokenMessage {
create_at: number;
@@ -25,12 +25,7 @@ type LoginResponse = {
};
const login = (params: LoginParams): Promise<LoginResponse> =>
request
.post('/api/user/token', {
json: params,
headers: { token: undefined },
})
.json();
bareClient.post('/api/user/token', { json: params }).json();
function b64DecodeUnicode(str: string) {
// Going backwards: from byte stream, to percent-encoding, to original string.
@@ -80,6 +75,8 @@ class Token {
this._refreshToken = login.refresh;
this._user = Token.parse(login.token);
this._event.triggerChange(this._user);
setRefreshToken(login.refresh);
}
@@ -99,14 +96,16 @@ class Token {
}
this._setToken(await this._padding);
this._padding = undefined;
this._event.triggerChange(this._user);
}
get token() {
return this._accessToken;
}
get refresh() {
return this._refreshToken;
}
get isLogin() {
return !!this._refreshToken;
}
@@ -126,6 +125,14 @@ class Token {
return null;
}
}
onChange(callback: Callback) {
this._event.onChange(callback);
}
offChange(callback: Callback) {
this._event.removeCallback(callback);
}
}
export const token = new Token();
+2 -2
View File
@@ -1,4 +1,4 @@
import { request } from '../request';
import { client } from '../request';
export interface GetUserByEmailParams {
email: string;
@@ -16,5 +16,5 @@ export interface User {
export async function getUserByEmail(
params: GetUserByEmailParams
): Promise<User | null> {
return request.get('/api/user', { json: params }).json<User | null>();
return client.get('/api/user', { json: params }).json<User | null>();
}
+13 -13
View File
@@ -1,4 +1,4 @@
import { request } from '../request';
import { client } from '../request';
import { User } from './user';
export interface GetWorkspaceDetailParams {
@@ -26,7 +26,7 @@ export interface Workspace {
}
export async function getWorkspaces(): Promise<Workspace[]> {
return request.get('/api/workspace').json();
return client.get('/api/workspace').json();
}
export interface WorkspaceDetail extends Workspace {
@@ -37,7 +37,7 @@ export interface WorkspaceDetail extends Workspace {
export async function getWorkspaceDetail(
params: GetWorkspaceDetailParams
): Promise<WorkspaceDetail | null> {
return request.get(`/api/workspace/${params.id}`).json();
return client.get(`/api/workspace/${params.id}`).json();
}
export interface Permission {
@@ -68,7 +68,7 @@ export interface GetWorkspaceMembersParams {
export async function getWorkspaceMembers(
params: GetWorkspaceDetailParams
): Promise<Member[]> {
return request.get(`/api/workspace/${params.id}/permission`).json();
return client.get(`/api/workspace/${params.id}/permission`).json();
}
export interface CreateWorkspaceParams {
@@ -79,7 +79,7 @@ export interface CreateWorkspaceParams {
export async function createWorkspace(
params: CreateWorkspaceParams
): Promise<void> {
return request.post('/api/workspace', { json: params }).json();
return client.post('/api/workspace', { json: params }).json();
}
export interface UpdateWorkspaceParams {
@@ -90,7 +90,7 @@ export interface UpdateWorkspaceParams {
export async function updateWorkspace(
params: UpdateWorkspaceParams
): Promise<void> {
return request
return client
.post(`/api/workspace/${params.id}`, {
json: {
public: params.public,
@@ -106,7 +106,7 @@ export interface DeleteWorkspaceParams {
export async function deleteWorkspace(
params: DeleteWorkspaceParams
): Promise<void> {
await request.delete(`/api/workspace/${params.id}`);
await client.delete(`/api/workspace/${params.id}`);
}
export interface InviteMemberParams {
@@ -118,7 +118,7 @@ export interface InviteMemberParams {
* Notice: Only support normal(contrast to private) workspace.
*/
export async function inviteMember(params: InviteMemberParams): Promise<void> {
return request
return client
.post(`/api/workspace/${params.id}/permission`, {
json: {
email: params.email,
@@ -132,7 +132,7 @@ export interface RemoveMemberParams {
}
export async function removeMember(params: RemoveMemberParams): Promise<void> {
await request.delete(`/api/permission/${params.permissionId}`);
await client.delete(`/api/permission/${params.permissionId}`);
}
export interface AcceptInvitingParams {
@@ -142,7 +142,7 @@ export interface AcceptInvitingParams {
export async function acceptInviting(
params: AcceptInvitingParams
): Promise<void> {
await request.post(`/api/invitation/${params.invitingCode}`);
await client.post(`/api/invitation/${params.invitingCode}`);
}
export interface DownloadWOrkspaceParams {
@@ -151,15 +151,15 @@ export interface DownloadWOrkspaceParams {
export async function downloadWorkspace(
params: DownloadWOrkspaceParams
): Promise<ArrayBuffer> {
return request.get(`/api/workspace/${params.workspaceId}/doc`).arrayBuffer();
return client.get(`/api/workspace/${params.workspaceId}/doc`).arrayBuffer();
}
export async function uploadBlob(params: { blob: Blob }): Promise<string> {
return request.post('/api/blob', { body: params.blob }).text();
return client.post('/api/blob', { body: params.blob }).text();
}
export async function getBlob(params: {
blobId: string;
}): Promise<ArrayBuffer> {
return request.get(`/api/blob/${params.blobId}`).arrayBuffer();
return client.get(`/api/blob/${params.blobId}`).arrayBuffer();
}