refactor: move affine utils into @affine/workspace (#2611)

This commit is contained in:
Himself65
2023-05-31 13:13:59 +08:00
committed by GitHub
parent 6cbf310a5a
commit ee289706ec
18 changed files with 72 additions and 95 deletions

View File

@@ -10,7 +10,6 @@
"./providers": "./src/providers/index.ts",
"./affine/*": "./src/affine/*.ts",
"./affine/api": "./src/affine/api/index.ts",
"./affine/sync": "./src/affine/sync.js",
"./affine/keck": "./src/affine/keck/index.ts"
},
"peerDependencies": {

View File

@@ -21,6 +21,12 @@ import { uuidv4, Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { WebSocket } from 'ws';
declare module '@blocksuite/store' {
interface PageMeta {
foo: string;
}
}
// @ts-expect-error
globalThis.WebSocket = WebSocket;

View File

@@ -0,0 +1,70 @@
import { prefixUrl } from '@affine/env';
import { rootStore } from '../atom';
import { createUserApis, createWorkspaceApis } from './api/index';
import { currentAffineUserAtom } from './atom';
import type { LoginResponse } from './login';
import { createAffineAuth, parseIdToken, setLoginStorage } from './login';
export const affineAuth = createAffineAuth(prefixUrl);
const affineApis = {} as ReturnType<typeof createUserApis> &
ReturnType<typeof createWorkspaceApis>;
Object.assign(affineApis, createUserApis(prefixUrl));
Object.assign(affineApis, createWorkspaceApis(prefixUrl));
if (!globalThis.AFFINE_APIS) {
globalThis.AFFINE_APIS = affineApis;
globalThis.setLogin = (response: LoginResponse) => {
rootStore.set(currentAffineUserAtom, parseIdToken(response.token));
setLoginStorage(response);
};
const loginMockUser1 = async () => {
const user1 = await import('@affine-test/fixtures/built-in-user1.json');
const data = await fetch(prefixUrl + 'api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugLoginUser',
email: user1.email,
password: user1.password,
}),
}).then(r => r.json());
setLogin(data);
};
const loginMockUser2 = async () => {
const user2 = await import('@affine-test/fixtures/built-in-user2.json');
const data = await fetch(prefixUrl + 'api/user/token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'DebugLoginUser',
email: user2.email,
password: user2.password,
}),
}).then(r => r.json());
setLogin(data);
};
globalThis.AFFINE_DEBUG = {
loginMockUser1,
loginMockUser2,
};
}
declare global {
// eslint-disable-next-line no-var
var setLogin: typeof setLoginStorage;
// eslint-disable-next-line no-var
var AFFINE_APIS:
| undefined
| (ReturnType<typeof createUserApis> &
ReturnType<typeof createWorkspaceApis>);
// eslint-disable-next-line no-var
var AFFINE_DEBUG: Record<string, unknown>;
}
export { affineApis };

View File

@@ -1,10 +1,9 @@
import type { createWorkspaceApis } from '@affine/workspace/affine/api';
import type { BlobStorage } from '@blocksuite/store';
import { createIndexeddbStorage } from '@blocksuite/store';
import { openDB } from 'idb';
import type { DBSchema } from 'idb/build/entry';
import type { createWorkspaceApis } from '../affine/api';
type UploadingBlob = {
key: string;
arrayBuffer: ArrayBuffer;

View File

@@ -0,0 +1,61 @@
import { DebugLogger } from '@affine/debug';
import { assertExists, Workspace } from '@blocksuite/store';
import { affineApis } from '../affine/shared';
import type { AffineDownloadProvider } from '../type';
const hashMap = new Map<string, ArrayBuffer>();
const logger = new DebugLogger('affine:workspace:download-provider');
export const createAffineDownloadProvider = (
blockSuiteWorkspace: Workspace
): AffineDownloadProvider => {
assertExists(blockSuiteWorkspace.id);
const id = blockSuiteWorkspace.id;
let connected = false;
const callbacks = new Set<() => void>();
return {
flavour: 'affine-download',
background: true,
get connected() {
return connected;
},
callbacks,
connect: () => {
logger.info('connect download provider', id);
if (hashMap.has(id)) {
logger.debug('applyUpdate');
Workspace.Y.applyUpdate(
blockSuiteWorkspace.doc,
new Uint8Array(hashMap.get(id) as ArrayBuffer)
);
connected = true;
callbacks.forEach(cb => cb());
return;
}
affineApis
.downloadWorkspace(id, false)
.then(binary => {
hashMap.set(id, binary);
logger.debug('applyUpdate');
Workspace.Y.applyUpdate(
blockSuiteWorkspace.doc,
new Uint8Array(binary)
);
connected = true;
callbacks.forEach(cb => cb());
})
.catch(e => {
logger.error('downloadWorkspace', e);
});
},
disconnect: () => {
logger.info('disconnect download provider', id);
connected = false;
},
cleanup: () => {
hashMap.delete(id);
},
};
};

View File

@@ -1,17 +1,4 @@
import { config, websocketPrefixUrl } from '@affine/env';
import { KeckProvider } from '@affine/workspace/affine/keck';
import {
getLoginStorage,
storageChangeSlot,
} from '@affine/workspace/affine/login';
import type {
AffineWebSocketProvider,
LocalIndexedDBBackgroundProvider,
LocalIndexedDBDownloadProvider,
Provider,
SQLiteProvider,
} from '@affine/workspace/type';
import { CallbackSet } from '@affine/workspace/utils';
import type { BlobManager, Disposable } from '@blocksuite/store';
import {
assertExists,
@@ -23,6 +10,17 @@ import {
EarlyDisconnectError,
} from '@toeverything/y-indexeddb';
import { KeckProvider } from '../affine/keck';
import { getLoginStorage, storageChangeSlot } from '../affine/login';
import type {
AffineWebSocketProvider,
LocalIndexedDBBackgroundProvider,
LocalIndexedDBDownloadProvider,
Provider,
SQLiteProvider,
} from '../type';
import { CallbackSet } from '../utils';
import { createAffineDownloadProvider } from './affine-download';
import { createBroadCastChannelProvider } from './broad-cast-channel';
import { localProviderLogger as logger } from './logger';
@@ -258,6 +256,7 @@ const createSQLiteProvider = (
};
export {
createAffineDownloadProvider,
createAffineWebSocketProvider,
createBroadCastChannelProvider,
createIndexedDBBackgroundProvider,
@@ -278,3 +277,17 @@ export const createLocalProviders = (
] as any[]
).filter(v => Boolean(v));
};
export const createAffineProviders = (
blockSuiteWorkspace: BlockSuiteWorkspace
): Provider[] => {
return (
[
createAffineDownloadProvider(blockSuiteWorkspace),
createAffineWebSocketProvider(blockSuiteWorkspace),
config.enableBroadCastChannelProvider &&
createBroadCastChannelProvider(blockSuiteWorkspace),
createIndexedDBDownloadProvider(blockSuiteWorkspace),
] as any[]
).filter(v => Boolean(v));
};