perf: reduce unused provider connection (#3090)

This commit is contained in:
Alex Yang
2023-07-07 16:13:32 +08:00
committed by GitHub
parent 152fbaabda
commit 3294043180
5 changed files with 48 additions and 41 deletions

View File

@@ -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);
},
};