From fc2a5879bd526e5fd2f76bd499ea4f6c74a913db Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Wed, 11 Jan 2023 20:57:56 +0800 Subject: [PATCH 1/4] feat: add channel for get new affine list --- .../data-center/src/provider/affine/affine.ts | 71 ++++++++++++++----- .../src/provider/affine/channel.ts | 19 +++-- 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index a3142b74ac..c116492099 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -11,12 +11,13 @@ import { storage } from './storage.js'; import assert from 'assert'; import { WebsocketProvider } from './sync.js'; // import { IndexedDBProvider } from '../local/indexeddb'; -import { getApis } from './apis/index.js'; +import { getApis, Workspace } from './apis/index.js'; import type { Apis, WorkspaceDetail, Callback } from './apis'; import { setDefaultAvatar } from '../utils.js'; import { MessageCode } from '../../message'; import { token } from './apis/token.js'; import { WebsocketClient } from './channel'; +import { SyncMode } from '../../workspace-unit'; export interface AffineProviderConstructorParams extends ProviderConstructorParams { @@ -33,21 +34,12 @@ export class AffineProvider extends BaseProvider { private _onTokenRefresh?: Callback = undefined; private _wsMap: Map = new Map(); private _apis: Apis; - private _channel: WebsocketClient; + private _channel?: WebsocketClient; // private _idbMap: Map = new Map(); constructor({ apis, ...params }: AffineProviderConstructorParams) { super(params); this._apis = apis || getApis(); - this._channel = new WebsocketClient( - `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${ - window.location.host - }/global/sync/`, - this._logger - ); - if (token.isLogin) { - this._connectChannel(); - } } override async init() { @@ -76,14 +68,59 @@ export class AffineProvider extends BaseProvider { } else { storage.setItem('token', this._apis.token.refresh); } + + if (token.isLogin) { + this._connectChannel(); + } } private _connectChannel() { - this._channel.connect(); + if (!this._channel) { + this._channel = new WebsocketClient( + `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${ + window.location.host + }/api/global/sync/`, + this._logger, + { + params: { + token: this._apis.token.refresh, + }, + } + ); + } + this._channel.on('message', this.handlerAffineListMessage); + } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this._channel.on('message', (message: any) => { - console.log('message', message); + private handlerAffineListMessage({ + ws_details, + metadata, + }: { + ws_list: Workspace[]; + ws_details: Record; + metadata: Record; + }) { + Object.entries(ws_details).forEach(([id, detail]) => { + const { name, avatar } = metadata[id]; + assert(name); + const workspace = { + name: name, + avatar, + owner: { + name: detail.owner.name, + id: detail.owner.id, + email: detail.owner.email, + avatar: detail.owner.avatar_url, + }, + published: detail.public, + memberCount: detail.member_count, + provider: 'affine', + syncMode: 'core' as SyncMode, + }; + if (this._workspaces.get(id)) { + this._workspaces.update(id, workspace); + } else { + this._workspaces.add({ id, ...workspace }); + } }); } @@ -237,7 +274,7 @@ export class AffineProvider extends BaseProvider { } } const user = await this._apis.signInWithGoogle?.(); - if (!this._channel.connected) { + if (!this._channel?.connected) { this._connectChannel(); } if (!user) { @@ -397,7 +434,7 @@ export class AffineProvider extends BaseProvider { public override async logout(): Promise { token.clear(); - this._channel.disconnect(); + this._channel?.disconnect(); this._wsMap.forEach(ws => ws.disconnect()); storage.removeItem('token'); } diff --git a/packages/data-center/src/provider/affine/channel.ts b/packages/data-center/src/provider/affine/channel.ts index 8d4ae85b09..1503a8b450 100644 --- a/packages/data-center/src/provider/affine/channel.ts +++ b/packages/data-center/src/provider/affine/channel.ts @@ -1,6 +1,7 @@ -import websocket from 'lib0/websocket'; +import * as websocket from 'lib0/websocket'; import { Logger } from 'src/types'; import { token } from './apis/token'; +import * as url from 'lib0/url'; const RECONNECT_INTERVAL_TIME = 5000; const MAX_RECONNECT_TIMES = 50; @@ -10,11 +11,21 @@ export class WebsocketClient extends websocket.WebsocketClient { private _reconnectInterval: number | null = null; private _logger: Logger; constructor( - url: string, + serverUrl: string, logger: Logger, - options?: { binaryType: 'arraybuffer' | 'blob' | null } + options?: ConstructorParameters[1] & { + params: Record; + } ) { - super(url, options); + const params = options?.params || {}; + // ensure that url is always ends with / + while (serverUrl[serverUrl.length - 1] === '/') { + serverUrl = serverUrl.slice(0, serverUrl.length - 1); + } + const encodedParams = url.encodeQueryParams(params); + const newUrl = + serverUrl + '/' + (encodedParams.length === 0 ? '' : '?' + encodedParams); + super(newUrl, options); this._logger = logger; this._setupChannel(); } From 932f5f02c44cd494bc40256b36597825afd6affc Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Wed, 11 Jan 2023 21:10:31 +0800 Subject: [PATCH 2/4] feat: fix users list --- packages/data-center/src/provider/affine/affine.ts | 12 ++++++------ .../data-center/src/provider/affine/apis/user.ts | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index c116492099..41b93b7dc2 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -403,13 +403,13 @@ export class AffineProvider extends BaseProvider { workspace_id: string, email: string ): Promise { - const user = await this._apis.getUserByEmail({ workspace_id, email }); - return user + const users = await this._apis.getUserByEmail({ workspace_id, email }); + return users?.length ? { - id: user.id, - name: user.name, - avatar: user.avatar_url, - email: user.email, + id: users[0].id, + name: users[0].name, + avatar: users[0].avatar_url, + email: users[0].email, } : null; } diff --git a/packages/data-center/src/provider/affine/apis/user.ts b/packages/data-center/src/provider/affine/apis/user.ts index 2848a9b673..58ede20fc3 100644 --- a/packages/data-center/src/provider/affine/apis/user.ts +++ b/packages/data-center/src/provider/affine/apis/user.ts @@ -15,7 +15,7 @@ export interface User { export async function getUserByEmail( params: GetUserByEmailParams -): Promise { +): Promise { const searchParams = new URLSearchParams({ ...params }); - return client.get('api/user', { searchParams }).json(); + return client.get('api/user', { searchParams }).json(); } From 49eff042fe66cbc2e3c8aac287c370aebb199e97 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Wed, 11 Jan 2023 21:35:40 +0800 Subject: [PATCH 3/4] feat: add accept invite --- packages/data-center/src/datacenter.ts | 12 ++++++++++++ packages/data-center/src/provider/affine/affine.ts | 5 +++++ packages/data-center/src/provider/base.ts | 10 ++++++++++ 3 files changed, 27 insertions(+) diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index c15861223e..add13ec0ee 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -438,6 +438,18 @@ export class DataCenter { return []; } + /** + * accept invitation + * @param {string} inviteCode + */ + async acceptInvitation(inviteCode: string, providerStr = 'affine') { + const provider = this.providerMap.get(providerStr); + if (provider) { + return await provider.acceptInvitation(inviteCode); + } + return []; + } + onMessage(cb: (message: Message) => void) { return this._messageCenter.onMessage(cb); } diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index 41b93b7dc2..acc1ce0cfb 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -99,6 +99,7 @@ export class AffineProvider extends BaseProvider { ws_details: Record; metadata: Record; }) { + this._logger('receive server message'); Object.entries(ws_details).forEach(([id, detail]) => { const { name, avatar } = metadata[id]; assert(name); @@ -442,4 +443,8 @@ export class AffineProvider extends BaseProvider { public override async getWorkspaceMembers(id: string) { return this._apis.getWorkspaceMembers({ id }); } + + public override async acceptInvitation(invitingCode: string): Promise { + await this._apis.acceptInviting({ invitingCode }); + } } diff --git a/packages/data-center/src/provider/base.ts b/packages/data-center/src/provider/base.ts index fed8626811..11547c6a66 100644 --- a/packages/data-center/src/provider/base.ts +++ b/packages/data-center/src/provider/base.ts @@ -233,4 +233,14 @@ export class BaseProvider { workspaceId; return Promise.resolve([]); } + + /** + * accept invitation + * @param {string} inviteCode + * @returns + */ + public async acceptInvitation(inviteCode: string): Promise { + inviteCode; + return; + } } From 2fe58960f3a000a056b09236811f8761a24f0d3e Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Wed, 11 Jan 2023 22:49:52 +0800 Subject: [PATCH 4/4] feat: fix type --- .../data-center/src/provider/affine/affine.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index acc1ce0cfb..1b69259258 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -19,6 +19,12 @@ import { token } from './apis/token.js'; import { WebsocketClient } from './channel'; import { SyncMode } from '../../workspace-unit'; +type ChannelMessage = { + ws_list: Workspace[]; + ws_details: Record; + metadata: Record; +}; + export interface AffineProviderConstructorParams extends ProviderConstructorParams { apis?: Apis; @@ -88,17 +94,12 @@ export class AffineProvider extends BaseProvider { } ); } - this._channel.on('message', this.handlerAffineListMessage); + this._channel.on('message', (msg: ChannelMessage) => { + this.handlerAffineListMessage(msg); + }); } - private handlerAffineListMessage({ - ws_details, - metadata, - }: { - ws_list: Workspace[]; - ws_details: Record; - metadata: Record; - }) { + private handlerAffineListMessage({ ws_details, metadata }: ChannelMessage) { this._logger('receive server message'); Object.entries(ws_details).forEach(([id, detail]) => { const { name, avatar } = metadata[id];