mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-25 22:38:56 +08:00
fix: after enabled cloud sync, we should migrate blob db (#757)
This commit is contained in:
@@ -13,7 +13,11 @@ import { getApis, Workspace } from './apis/index.js';
|
|||||||
import type { Apis, WorkspaceDetail, Callback } from './apis';
|
import type { Apis, WorkspaceDetail, Callback } from './apis';
|
||||||
import { token } from './apis/token.js';
|
import { token } from './apis/token.js';
|
||||||
import { WebsocketClient } from './channel';
|
import { WebsocketClient } from './channel';
|
||||||
import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js';
|
import {
|
||||||
|
loadWorkspaceUnit,
|
||||||
|
createWorkspaceUnit,
|
||||||
|
migrateBlobDB,
|
||||||
|
} from './utils.js';
|
||||||
import { WorkspaceUnit } from '../../workspace-unit.js';
|
import { WorkspaceUnit } from '../../workspace-unit.js';
|
||||||
import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js';
|
import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js';
|
||||||
import type { SyncMode } from '../../workspace-unit';
|
import type { SyncMode } from '../../workspace-unit';
|
||||||
@@ -390,6 +394,8 @@ export class AffineProvider extends BaseProvider {
|
|||||||
syncMode: 'core',
|
syncMode: 'core',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await migrateBlobDB(workspaceUnit.id, id);
|
||||||
|
|
||||||
const blocksuiteWorkspace = createBlocksuiteWorkspace(id);
|
const blocksuiteWorkspace = createBlocksuiteWorkspace(id);
|
||||||
assert(workspaceUnit.blocksuiteWorkspace);
|
assert(workspaceUnit.blocksuiteWorkspace);
|
||||||
await applyUpdate(
|
await applyUpdate(
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { createStore, keys, setMany, getMany } from 'idb-keyval';
|
||||||
|
import * as idb from 'lib0/indexeddb.js';
|
||||||
|
|
||||||
|
type IDBInstance<T = ArrayBufferLike> = {
|
||||||
|
keys: () => Promise<string[]>;
|
||||||
|
deleteDB: () => Promise<void>;
|
||||||
|
setMany: (entries: [string, T][]) => Promise<void>;
|
||||||
|
getMany: (keys: string[]) => Promise<T[]>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getDatabase<T = ArrayBufferLike>(
|
||||||
|
type: string,
|
||||||
|
database: string
|
||||||
|
): IDBInstance<T> {
|
||||||
|
const name = `${database}_${type}`;
|
||||||
|
const db = createStore(name, type);
|
||||||
|
return {
|
||||||
|
keys: () => keys(db),
|
||||||
|
deleteDB: () => idb.deleteDB(name),
|
||||||
|
setMany: entries => setMany(entries, db),
|
||||||
|
getMany: keys => getMany(keys, db),
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import { createBlocksuiteWorkspace } from '../../utils/index.js';
|
|||||||
import type { Apis } from './apis';
|
import type { Apis } from './apis';
|
||||||
import { setDefaultAvatar } from '../utils.js';
|
import { setDefaultAvatar } from '../utils.js';
|
||||||
import { applyUpdate } from '../../utils/index.js';
|
import { applyUpdate } from '../../utils/index.js';
|
||||||
|
import { getDatabase } from './idb-kv.js';
|
||||||
|
|
||||||
export const loadWorkspaceUnit = async (
|
export const loadWorkspaceUnit = async (
|
||||||
params: WorkspaceUnitCtorParams,
|
params: WorkspaceUnitCtorParams,
|
||||||
@@ -54,3 +55,34 @@ export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => {
|
|||||||
|
|
||||||
return workspaceUnit;
|
return workspaceUnit;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface PendingTask {
|
||||||
|
id: string;
|
||||||
|
blob: ArrayBufferLike;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const migrateBlobDB = async (
|
||||||
|
oldWorkspaceId: string,
|
||||||
|
newWorkspaceId: string
|
||||||
|
) => {
|
||||||
|
const oldDB = getDatabase('blob', oldWorkspaceId);
|
||||||
|
const oldPendingDB = getDatabase<PendingTask>('pending', newWorkspaceId);
|
||||||
|
|
||||||
|
const newDB = getDatabase('blob', newWorkspaceId);
|
||||||
|
const newPendingDB = getDatabase<PendingTask>('pending', newWorkspaceId);
|
||||||
|
|
||||||
|
const keys = await oldDB.keys();
|
||||||
|
const values = await oldDB.getMany(keys);
|
||||||
|
const entries = keys.map((key, index) => {
|
||||||
|
return [key, values[index]] as [string, ArrayBufferLike];
|
||||||
|
});
|
||||||
|
await newDB.setMany(entries);
|
||||||
|
|
||||||
|
const pendingEntries = entries.map(([id, blob]) => {
|
||||||
|
return [id, { id, blob }] as [string, PendingTask];
|
||||||
|
});
|
||||||
|
await newPendingDB.setMany(pendingEntries);
|
||||||
|
|
||||||
|
await oldDB.deleteDB();
|
||||||
|
await oldPendingDB.deleteDB();
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user