diff --git a/packages-user/data-common/src/save/index.ts b/packages-user/data-common/src/save/index.ts index 1603d0d..213e667 100644 --- a/packages-user/data-common/src/save/index.ts +++ b/packages-user/data-common/src/save/index.ts @@ -1,3 +1,2 @@ export * from './system'; -export * from './memory'; export * from './types'; diff --git a/packages-user/data-common/src/save/memory.ts b/packages-user/data-common/src/save/memory.ts deleted file mode 100644 index 2802e3b..0000000 --- a/packages-user/data-common/src/save/memory.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Dexie, Table } from 'dexie'; -import { isNil } from 'lodash-es'; -import { - IGlobalTrasaction, - ISaveRead, - ISaveSystem, - ISaveSystemConfig, - ISaveableContent, - SaveCompression -} from './types'; - -interface MemorySaveRecord { - readonly compression: SaveCompression; - readonly data: Map; -} - -class MemoryGlobalTransaction implements IGlobalTrasaction { - readonly table!: Table; - - constructor(private readonly values: Map) {} - - async get(key: string): Promise { - return this.values.get(key) as T; - } - - async set(key: string, value: unknown): Promise { - this.values.set(key, value); - } -} - -export class MemorySaveSystem implements ISaveSystem { - db!: Dexie; - - private readonly saves: Map = new Map(); - private readonly values: Map = new Map(); - private readonly undoStack: ISaveRead[] = []; - private readonly redoStack: ISaveRead[] = []; - private stackSize: number = 20; - private autosaveLevel: SaveCompression = SaveCompression.LowCompression; - private commonSaveLevel: SaveCompression = SaveCompression.HighCompression; - - init(): void {} - - config(config: Readonly>): void { - if (!isNil(config.autosaveLevel)) { - this.autosaveLevel = config.autosaveLevel; - } - if (!isNil(config.commonSaveLevel)) { - this.commonSaveLevel = config.commonSaveLevel; - } - if (!isNil(config.autosaveStackSize)) { - this.stackSize = config.autosaveStackSize; - this.trim(this.undoStack); - this.trim(this.redoStack); - } - } - - undoAutosave( - current: Map> - ): ISaveRead | null { - if (this.undoStack.length === 0) return null; - this.redoStack.push(this.capture(current, this.autosaveLevel)); - this.trim(this.redoStack); - return this.undoStack.pop()!; - } - - redoAutosave( - current: Map> - ): ISaveRead | null { - if (this.redoStack.length === 0) return null; - this.undoStack.push(this.capture(current, this.autosaveLevel)); - this.trim(this.undoStack); - return this.redoStack.pop()!; - } - - getUndoStack(): ISaveRead[] { - return this.undoStack.slice(); - } - - getRedoStack(): ISaveRead[] { - return this.redoStack.slice(); - } - - autosave(state: Map>): void { - this.undoStack.push(this.capture(state, this.autosaveLevel)); - this.redoStack.length = 0; - this.trim(this.undoStack); - } - - async saveAutosaveToDB(): Promise {} - - async save( - id: number, - state: Map> - ): Promise { - this.saves.set(id, this.captureRecord(state, this.commonSaveLevel)); - await this.setGlobal('lastSlot', id); - } - - async load(id: number): Promise { - const record = this.saves.get(id); - if (!record) return null; - return { compression: record.compression, data: record.data }; - } - - async deleteSave(id: number): Promise { - this.saves.delete(id); - } - - async getLastSlot(): Promise { - return (await this.getGlobal('lastSlot')) ?? 0; - } - - async getGlobal(key: string): Promise { - return this.values.has(key) ? (this.values.get(key) as T) : null; - } - - async setGlobal(key: string, value: unknown): Promise { - this.values.set(key, value); - } - - async startGlobalTransaction( - handle: (transaction: IGlobalTrasaction) => PromiseLike - ): Promise { - return handle(new MemoryGlobalTransaction(this.values)); - } - - private capture( - state: Map>, - compression: SaveCompression - ): ISaveRead { - const record = this.captureRecord(state, compression); - return { compression: record.compression, data: record.data }; - } - - private captureRecord( - state: Map>, - compression: SaveCompression - ): MemorySaveRecord { - const data = new Map(); - for (const [key, content] of state) { - data.set(key, content.saveState(compression)); - } - return { compression, data }; - } - - private trim(stack: ISaveRead[]): void { - if (stack.length > this.stackSize) { - stack.splice(0, stack.length - this.stackSize); - } - } -}