lobe-chat
67 строк · 1.6 Кб
1import { t } from 'i18next';
2
3/**
4* 迁移接口
5* @template T - 状态类型
6*/
7export interface Migration<T = any> {
8/**
9* 迁移数据
10* @param data - 迁移数据
11* @returns 迁移后的数据
12*/
13migrate(data: MigrationData<T>): MigrationData;
14/**
15* 迁移版本号
16*/
17version: number;
18}
19
20/**
21* 迁移数据接口
22* @template T - 状态类型
23*/
24export interface MigrationData<T = any> {
25/**
26* 状态数据
27*/
28state: T;
29/**
30* 迁移版本号
31*/
32version: number;
33}
34export class VersionController<T> {
35private migrations: Migration[];
36targetVersion: number;
37
38constructor(migrations: any[], targetVersion: number = migrations.length) {
39this.migrations = migrations
40.map((cls) => {
41return new cls() as Migration;
42})
43.sort((a, b) => a.version - b.version);
44
45this.targetVersion = targetVersion;
46}
47
48migrate(data: MigrationData<T>): MigrationData<T> {
49let nextData = data;
50const targetVersion = this.targetVersion || this.migrations.length;
51if (data.version === undefined)
52throw new Error(t('migrateError.missVersion', { ns: 'migration' }));
53const currentVersion = data.version;
54
55for (let i = currentVersion || 0; i < targetVersion; i++) {
56const migration = this.migrations.find((m) => m.version === i);
57if (!migration) throw new Error(t('migrateError.noMigration', { ns: 'migration' }));
58
59nextData = migration.migrate(nextData);
60
61nextData.version += 1;
62console.debug('迁移器:', migration, '数据:', nextData, '迁移后版本:', nextData.version);
63}
64
65return nextData;
66}
67}
68