fix(y-indexeddb): test cases (#2832)
This commit is contained in:
20
packages/y-indexeddb/benchmark/index.ts
Normal file → Executable file
20
packages/y-indexeddb/benchmark/index.ts
Normal file → Executable file
@@ -17,7 +17,13 @@ import { IndexeddbPersistence } from 'y-indexeddb';
|
||||
const Y = Workspace.Y;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
||||
import { createIndexedDBProvider } from '../src/index.js';
|
||||
import { createIndexedDBProvider } from '../dist/index.js';
|
||||
|
||||
// @ts-expect-error
|
||||
globalThis.window = {
|
||||
addEventListener: () => void 0,
|
||||
removeEventListener: () => void 0,
|
||||
};
|
||||
|
||||
async function yjs_create_persistence(n = 1e3) {
|
||||
for (let i = 0; i < n; i++) {
|
||||
@@ -48,20 +54,24 @@ async function yjs_single_persistence(n = 1e5) {
|
||||
|
||||
async function toeverything_create_provider(n = 1e3) {
|
||||
for (let i = 0; i < n; i++) {
|
||||
const yDoc = new Y.Doc();
|
||||
const provider = createIndexedDBProvider('test', yDoc);
|
||||
const yDoc = new Y.Doc({
|
||||
guid: 'test',
|
||||
});
|
||||
const provider = createIndexedDBProvider(yDoc);
|
||||
provider.connect();
|
||||
await provider.whenSynced;
|
||||
provider.disconnect();
|
||||
}
|
||||
}
|
||||
async function toeverything_single_persistence(n = 1e5) {
|
||||
const yDoc = new Y.Doc();
|
||||
const yDoc = new Y.Doc({
|
||||
guid: 'test',
|
||||
});
|
||||
const map = yDoc.getMap();
|
||||
for (let i = 0; i < n; i++) {
|
||||
map.set(`${i}`, i);
|
||||
}
|
||||
const provider = createIndexedDBProvider('test', yDoc, 'test');
|
||||
const provider = createIndexedDBProvider(yDoc, 'test');
|
||||
provider.connect();
|
||||
await provider.whenSynced;
|
||||
provider.disconnect();
|
||||
|
||||
@@ -36,8 +36,8 @@
|
||||
"idb": "^7.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blocksuite/blocks": "0.0.0-20230613142146-d72d4600-nightly",
|
||||
"@blocksuite/store": "0.0.0-20230613142146-d72d4600-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20230620110032-d8041266-nightly",
|
||||
"@blocksuite/store": "0.0.0-20230620110032-d8041266-nightly",
|
||||
"vite": "^4.3.9",
|
||||
"vite-plugin-dts": "^2.3.0",
|
||||
"y-indexeddb": "^9.0.11"
|
||||
|
||||
@@ -29,12 +29,12 @@ function initEmptyPage(page: Page) {
|
||||
title: new page.Text(''),
|
||||
});
|
||||
const surfaceBlockId = page.addBlock('affine:surface', {}, pageBlockId);
|
||||
const frameBLockId = page.addBlock('affine:frame', {}, pageBlockId);
|
||||
const paragraphBlockId = page.addBlock('affine:paragraph', {}, frameBLockId);
|
||||
const frameBlockId = page.addBlock('affine:note', {}, pageBlockId);
|
||||
const paragraphBlockId = page.addBlock('affine:paragraph', {}, frameBlockId);
|
||||
return {
|
||||
pageBlockId,
|
||||
surfaceBlockId,
|
||||
frameBLockId,
|
||||
frameBlockId,
|
||||
paragraphBlockId,
|
||||
};
|
||||
}
|
||||
@@ -91,7 +91,7 @@ describe('indexeddb provider', () => {
|
||||
const page = workspace.createPage({ id: 'page0' });
|
||||
await page.waitForLoaded();
|
||||
const pageBlockId = page.addBlock('affine:page', { title: '' });
|
||||
const frameId = page.addBlock('affine:frame', {}, pageBlockId);
|
||||
const frameId = page.addBlock('affine:note', {}, pageBlockId);
|
||||
page.addBlock('affine:paragraph', {}, frameId);
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
@@ -110,8 +110,20 @@ describe('indexeddb provider', () => {
|
||||
data.updates.forEach(({ update }) => {
|
||||
Workspace.Y.applyUpdate(testWorkspace.doc, update);
|
||||
});
|
||||
const binary = Workspace.Y.encodeStateAsUpdate(testWorkspace.doc);
|
||||
expect(binary).toEqual(Workspace.Y.encodeStateAsUpdate(workspace.doc));
|
||||
const subPage = testWorkspace.doc.spaces.get('space:page0');
|
||||
{
|
||||
assertExists(subPage);
|
||||
await store.get(subPage.guid);
|
||||
const data = (await store.get(subPage.guid)) as
|
||||
| WorkspacePersist
|
||||
| undefined;
|
||||
assertExists(data);
|
||||
await testWorkspace.getPage('page0')?.waitForLoaded();
|
||||
data.updates.forEach(({ update }) => {
|
||||
Workspace.Y.applyUpdate(subPage, update);
|
||||
});
|
||||
}
|
||||
expect(workspace.doc.toJSON()).toEqual(testWorkspace.doc.toJSON());
|
||||
}
|
||||
|
||||
const secondWorkspace = new Workspace({
|
||||
@@ -122,9 +134,10 @@ describe('indexeddb provider', () => {
|
||||
const provider2 = createIndexedDBProvider(secondWorkspace.doc, rootDBName);
|
||||
provider2.connect();
|
||||
await provider2.whenSynced;
|
||||
expect(Workspace.Y.encodeStateAsUpdate(secondWorkspace.doc)).toEqual(
|
||||
Workspace.Y.encodeStateAsUpdate(workspace.doc)
|
||||
);
|
||||
const page = secondWorkspace.getPage('page0');
|
||||
assertExists(page);
|
||||
await page.waitForLoaded();
|
||||
expect(workspace.doc.toJSON()).toEqual(secondWorkspace.doc.toJSON());
|
||||
});
|
||||
|
||||
test('disconnect suddenly', async () => {
|
||||
@@ -150,7 +163,7 @@ describe('indexeddb provider', () => {
|
||||
const page = workspace.createPage({ id: 'page0' });
|
||||
await page.waitForLoaded();
|
||||
const pageBlockId = page.addBlock('affine:page', { title: '' });
|
||||
const frameId = page.addBlock('affine:frame', {}, pageBlockId);
|
||||
const frameId = page.addBlock('affine:note', {}, pageBlockId);
|
||||
page.addBlock('affine:paragraph', {}, frameId);
|
||||
}
|
||||
{
|
||||
@@ -218,7 +231,7 @@ describe('indexeddb provider', () => {
|
||||
const page = workspace.createPage({ id: 'page0' });
|
||||
await page.waitForLoaded();
|
||||
const pageBlockId = page.addBlock('affine:page', { title: '' });
|
||||
const frameId = page.addBlock('affine:frame', {}, pageBlockId);
|
||||
const frameId = page.addBlock('affine:note', {}, pageBlockId);
|
||||
for (let i = 0; i < 99; i++) {
|
||||
page.addBlock('affine:paragraph', {}, frameId);
|
||||
}
|
||||
|
||||
@@ -12,9 +12,9 @@ import type {
|
||||
BlockSuiteBinaryDB,
|
||||
IndexedDBProvider,
|
||||
WorkspaceMilestone,
|
||||
} from './shared';
|
||||
import { dbVersion, DEFAULT_DB_NAME, upgradeDB } from './shared';
|
||||
import { tryMigrate } from './utils';
|
||||
} from './shared.js';
|
||||
import { dbVersion, DEFAULT_DB_NAME, upgradeDB } from './shared.js';
|
||||
import { tryMigrate } from './utils.js';
|
||||
|
||||
const indexeddbOrigin = Symbol('indexeddb-provider-origin');
|
||||
const snapshotOrigin = Symbol('snapshot-origin');
|
||||
@@ -268,6 +268,10 @@ export const createIndexedDBProvider = (
|
||||
doc.on('update', createOrGetHandleUpdate(id, doc));
|
||||
doc.on('destroy', createOrGetHandleDestroy(id, doc));
|
||||
doc.on('subdocs', createOrGetHandleSubDocs(id, doc));
|
||||
|
||||
doc.subdocs.forEach(doc => {
|
||||
trackDoc(doc.guid, doc);
|
||||
});
|
||||
}
|
||||
|
||||
function unTrackDoc(id: string, doc: Doc) {
|
||||
@@ -343,6 +347,7 @@ export const createIndexedDBProvider = (
|
||||
});
|
||||
connected = true;
|
||||
trackDoc(doc.guid, doc);
|
||||
|
||||
// only the runs `await` below, otherwise the logic is incorrect
|
||||
const db = await dbPromise;
|
||||
if (migrate) {
|
||||
|
||||
Reference in New Issue
Block a user