synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
92 lines (81 loc) • 3.09 kB
JavaScript
import { SingletonMixin } from "../modules/singleton/mixin.util.js";
import { StorageKey } from "../utils/storage-key.js";
import { getValueByPath, removeValueByPath, setValueByPath } from "./path.utils.js";
import { SyncBaseStorage } from "./sync-base-storage.service.js";
class MemoryStorage extends SyncBaseStorage {
static STORAGE_TYPE = 'memory';
type = 'memory';
storage = new Map();
constructor(config, eventEmitter, logger){
super(config, eventEmitter, logger);
}
static create(config, eventEmitter, logger) {
return SingletonMixin.handleSingletonCreation(config, this.STORAGE_TYPE, (finalConfig)=>new MemoryStorage(finalConfig, eventEmitter, logger), logger);
}
async doInitialize() {
try {
this.logger?.debug(`Initializing MemoryStorage "${this.name}"`);
this.initializeMiddlewares();
this.initializeWithMiddlewares();
this.logger?.debug(`MemoryStorage "${this.name}" initialized successfully`);
return this;
} catch (error) {
this.logger?.error('Error initializing MemoryStorage', {
error
});
throw error;
}
}
doGet(key) {
const state = this.storage.get(this.name);
if (!state) return undefined;
if (key instanceof StorageKey && key.isUnparseable()) {
return state[key.valueOf()];
}
return getValueByPath(state, key);
}
doSet(key, value) {
const state = this.storage.get(this.name) || {};
// setValueByPath иммутабелен → не мутирует state/initialState (хранятся по ссылке).
const newState = setValueByPath(state, key, value);
this.storage.set(this.name, newState);
}
doRemove(key) {
const state = this.storage.get(this.name);
if (!state) return false;
const { state: newState, removed } = removeValueByPath(state, key);
if (!removed) return false;
this.storage.set(this.name, newState);
return true;
}
doUpdate(updates) {
let newState = {
...this.storage.get(this.name) || {}
};
for (const { key, value } of updates){
if (key instanceof StorageKey && key.isUnparseable()) {
newState[key.valueOf()] = value;
} else {
newState = setValueByPath(newState, key, value);
}
}
this.storage.set(this.name, newState);
}
doClear() {
this.storage.delete(this.name);
}
doKeys() {
const state = this.storage.get(this.name);
if (!state) return [];
return Object.keys(state);
}
doHas(key) {
const value = this.doGet(key);
return value !== undefined;
}
async doDestroy() {
// Очистка управляется флагом config.clearOnDestroy в performCleanup (memory → по умолчанию true).
}
}
export { MemoryStorage };
//# sourceMappingURL=memory-storage.service.js.map