diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index b5624c4df2..cd4bbf905a 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -4,11 +4,12 @@ import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; import { BaseProvider } from './provider/base'; import { LocalProvider } from './provider/local/local'; import { AffineProvider } from './provider'; -import type { WorkspaceMeta } from './types'; +import type { Message, WorkspaceMeta } from './types'; import assert from 'assert'; import { getLogger } from './logger'; import { applyUpdate, encodeStateAsUpdate } from 'yjs'; import { createBlocksuiteWorkspace } from './utils/index.js'; +import { MessageCenter } from './message/message'; /** * @class DataCenter @@ -18,6 +19,7 @@ export class DataCenter { private readonly _workspaceMetaCollection = new WorkspaceMetaCollection(); private readonly _logger = getLogger('dc'); private _workspaceInstances: Map = new Map(); + private _messageCenter = new MessageCenter(); /** * A mainProvider must exist as the only data trustworthy source. */ @@ -30,19 +32,16 @@ export class DataCenter { static async init(debug: boolean): Promise { const dc = new DataCenter(debug); + const getInitParams = () => { + return { + logger: dc._logger, + workspaces: dc._workspaceMetaCollection.createScope(), + messageCenter: dc._messageCenter, + }; + }; // TODO: switch different provider - dc.registerProvider( - new LocalProvider({ - logger: dc._logger, - workspaces: dc._workspaceMetaCollection.createScope(), - }) - ); - dc.registerProvider( - new AffineProvider({ - logger: dc._logger, - workspaces: dc._workspaceMetaCollection.createScope(), - }) - ); + dc.registerProvider(new LocalProvider(getInitParams())); + dc.registerProvider(new AffineProvider(getInitParams())); return dc; } @@ -371,4 +370,8 @@ export class DataCenter { const blobStorage = await workspace.blobs; return (await blobStorage?.set(blob)) || ''; } + + onMessage(cb: (message: Message) => void) { + return this._messageCenter.onMessage(cb); + } } diff --git a/packages/data-center/src/index.ts b/packages/data-center/src/index.ts index f07335c0d1..f758d9c336 100644 --- a/packages/data-center/src/index.ts +++ b/packages/data-center/src/index.ts @@ -28,3 +28,4 @@ export const getDataCenter = _initializeDataCenter(); export type { AccessTokenMessage } from './provider/affine/apis'; export type { WorkspaceInfo } from './types'; export { getLogger } from './logger'; +export * from './message'; diff --git a/packages/data-center/src/message/code.ts b/packages/data-center/src/message/code.ts new file mode 100644 index 0000000000..271ffc8d38 --- /dev/null +++ b/packages/data-center/src/message/code.ts @@ -0,0 +1,3 @@ +export enum MessageCode { + loginError, +} diff --git a/packages/data-center/src/message/index.ts b/packages/data-center/src/message/index.ts new file mode 100644 index 0000000000..b04581df15 --- /dev/null +++ b/packages/data-center/src/message/index.ts @@ -0,0 +1,2 @@ +export { MessageCenter } from './message'; +export { MessageCode } from './code'; diff --git a/packages/data-center/src/message/message.ts b/packages/data-center/src/message/message.ts new file mode 100644 index 0000000000..7a59f15bf4 --- /dev/null +++ b/packages/data-center/src/message/message.ts @@ -0,0 +1,24 @@ +import { Observable } from 'lib0/observable'; +import { Message } from 'src/types'; +import { MessageCode } from './code'; + +export class MessageCenter extends Observable { + constructor() { + super(); + } + + public send(message: MessageCode) { + this.emit('message', [message]); + } + + public onMessage(callback: (message: Message) => void) { + this.on('message', callback); + } + + private messages: Record = { + [MessageCode.loginError]: { + code: MessageCode.loginError, + message: 'Login failed', + }, + }; +} diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index b01766d906..537f54cd74 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -11,6 +11,7 @@ import { WebsocketProvider } from './sync.js'; import { getApis } from './apis/index.js'; import type { Apis, WorkspaceDetail, Callback } from './apis'; import { setDefaultAvatar } from '../utils.js'; +import { MessageCode } from 'src/message/code.js'; export interface AffineProviderConstructorParams extends ProviderConstructorParams { @@ -196,7 +197,10 @@ export class AffineProvider extends BaseProvider { return; } } - await this._apis.signInWithGoogle?.(); + const user = await this._apis.signInWithGoogle?.(); + if (!user) { + this._messageCenter.send(MessageCode.loginError); + } } public override async getUserInfo(): Promise { diff --git a/packages/data-center/src/provider/base.ts b/packages/data-center/src/provider/base.ts index c21939103f..be075fefe6 100644 --- a/packages/data-center/src/provider/base.ts +++ b/packages/data-center/src/provider/base.ts @@ -1,4 +1,5 @@ import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store'; +import { MessageCenter } from 'src/message'; import { Logger, User, WorkspaceInfo, WorkspaceMeta } from '../types'; import type { WorkspaceMetaCollectionScope } from '../workspace-meta-collection'; @@ -9,16 +10,23 @@ const defaultLogger = () => { export interface ProviderConstructorParams { logger?: Logger; workspaces: WorkspaceMetaCollectionScope; + messageCenter: MessageCenter; } export class BaseProvider { public readonly id: string = 'base'; protected _workspaces!: WorkspaceMetaCollectionScope; protected _logger!: Logger; + protected _messageCenter!: MessageCenter; - public constructor({ logger, workspaces }: ProviderConstructorParams) { + public constructor({ + logger, + workspaces, + messageCenter, + }: ProviderConstructorParams) { this._logger = (logger || defaultLogger) as Logger; this._workspaces = workspaces; + this._messageCenter = messageCenter; } /** diff --git a/packages/data-center/src/types/index.ts b/packages/data-center/src/types/index.ts index 1155ee325a..29e3a2f255 100644 --- a/packages/data-center/src/types/index.ts +++ b/packages/data-center/src/types/index.ts @@ -21,3 +21,8 @@ export type User = { export type WorkspaceMeta = Pick; export type Logger = ReturnType; + +export type Message = { + code: number; + message: string; +};