mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 12:28:42 +00:00
perf: reduce unused provider connection (#3090)
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import type {
|
||||
LocalIndexedDBBackgroundProvider,
|
||||
LocalIndexedDBDownloadProvider,
|
||||
@@ -13,26 +14,25 @@ import {
|
||||
} from '@toeverything/y-indexeddb';
|
||||
import type { Doc } from 'yjs';
|
||||
|
||||
import { CallbackSet } from '../utils';
|
||||
import { localProviderLogger as logger } from './logger';
|
||||
import {
|
||||
createSQLiteDBDownloadProvider,
|
||||
createSQLiteProvider,
|
||||
} from './sqlite-providers';
|
||||
|
||||
const Y = Workspace.Y;
|
||||
const logger = new DebugLogger('indexeddb-provider');
|
||||
|
||||
const createIndexedDBBackgroundProvider: DocProviderCreator = (
|
||||
id,
|
||||
blockSuiteWorkspace
|
||||
): LocalIndexedDBBackgroundProvider => {
|
||||
const indexeddbProvider = create(blockSuiteWorkspace);
|
||||
const callbacks = new CallbackSet();
|
||||
let connected = false;
|
||||
return {
|
||||
flavour: 'local-indexeddb-background',
|
||||
passive: true,
|
||||
get connected() {
|
||||
return callbacks.ready;
|
||||
return connected;
|
||||
},
|
||||
cleanup: () => {
|
||||
indexeddbProvider.cleanup().catch(console.error);
|
||||
@@ -42,27 +42,27 @@ const createIndexedDBBackgroundProvider: DocProviderCreator = (
|
||||
indexeddbProvider.connect();
|
||||
indexeddbProvider.whenSynced
|
||||
.then(() => {
|
||||
callbacks.ready = true;
|
||||
callbacks.forEach(cb => cb());
|
||||
connected = true;
|
||||
})
|
||||
.catch(error => {
|
||||
callbacks.ready = false;
|
||||
connected = false;
|
||||
if (error instanceof EarlyDisconnectError) {
|
||||
return;
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
throw error;
|
||||
});
|
||||
},
|
||||
disconnect: () => {
|
||||
assertExists(indexeddbProvider);
|
||||
logger.info('disconnect indexeddb provider', id);
|
||||
indexeddbProvider.disconnect();
|
||||
callbacks.ready = false;
|
||||
connected = false;
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
const cache: WeakMap<Doc, Uint8Array> = new WeakMap();
|
||||
|
||||
const createIndexedDBDownloadProvider: DocProviderCreator = (
|
||||
id,
|
||||
doc
|
||||
@@ -74,11 +74,17 @@ const createIndexedDBDownloadProvider: DocProviderCreator = (
|
||||
_reject = reject;
|
||||
});
|
||||
async function downloadBinaryRecursively(doc: Doc) {
|
||||
const binary = await downloadBinary(doc.guid);
|
||||
if (binary) {
|
||||
if (cache.has(doc)) {
|
||||
const binary = cache.get(doc) as Uint8Array;
|
||||
Y.applyUpdate(doc, binary);
|
||||
await Promise.all([...doc.subdocs].map(downloadBinaryRecursively));
|
||||
} else {
|
||||
const binary = await downloadBinary(doc.guid);
|
||||
if (binary) {
|
||||
Y.applyUpdate(doc, binary);
|
||||
cache.set(doc, binary);
|
||||
}
|
||||
}
|
||||
await Promise.all([...doc.subdocs].map(downloadBinaryRecursively));
|
||||
}
|
||||
return {
|
||||
flavour: 'local-indexeddb',
|
||||
@@ -90,7 +96,7 @@ const createIndexedDBDownloadProvider: DocProviderCreator = (
|
||||
// todo: cleanup data
|
||||
},
|
||||
sync: () => {
|
||||
logger.info('connect indexeddb provider', id);
|
||||
logger.info('sync indexeddb provider', id);
|
||||
downloadBinaryRecursively(doc).then(_resolve).catch(_reject);
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user