UNPKG

@fdm-monster/server

Version:

FDM Monster is a bulk OctoPrint manager to set up, configure and monitor 3D printers. Our aim is to provide extremely optimized websocket performance and reliability.

128 lines (127 loc) 3.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "KeyDiffCache", { enumerable: true, get: function() { return KeyDiffCache; } }); class KeyDiffCache { deletedKeys = []; updatedKeys = []; keyValueStore = {}; async getAllValues() { const keys = Object.keys(this.keyValueStore); return await this.getValuesBatch(keys); } async getAllKeyValues() { return this.keyValueStore; } async getValue(key) { const keyString = key?.toString(); if (!keyString?.length) { throw new Error("Key must be a non-empty serializable string"); } return this.keyValueStore[keyString]; } async processStateDiffs() { const updatedKeys = [ ...this.updatedKeys ]; const updatedValues = await this.getValuesBatch(updatedKeys); const deletedKeys = [ ...this.deletedKeys ]; this.resetDiffs(); return { updatedKeys, updatedValues, deletedKeys }; } async setKeyValuesBatch(keyValues, markUpdated = true) { keyValues.forEach(({ key, value })=>{ this.setKeyValue(key, value); }); if (markUpdated) { const updatedKeys = keyValues.map(({ key })=>key); this.batchMarkUpdated(updatedKeys); } } async deleteKeysBatch(keys, markDeleted = true) { keys.forEach((key)=>{ this.deleteKeyValue(key); }); if (markDeleted) { this.batchMarkDeleted(keys); } } async getValuesBatch(keys) { const keyStrings = keys.map((key)=>key?.toString()); if (keyStrings.some((key)=>!key?.length)) { throw new Error("Key must be a non-empty serializable string, and one of them is not"); } const values = []; for (const keyString of keyStrings){ const value = await this.getValue(keyString.toString()); values.push(value); } return values; } async setKeyValue(key, value, markUpdated = true) { const keyString = this.convertToKeyString(key); if (!keyString?.length) { throw new Error("Key must be a non-empty serializable string"); } this.keyValueStore[keyString] = value; if (markUpdated) { this.markUpdated(keyString); } } async deleteKeyValue(key, markDeleted = true) { const keyString = this.convertToKeyString(key); if (!keyString?.length) { throw new Error("Key must be a non-empty serializable string"); } delete this.keyValueStore[keyString]; if (markDeleted) { this.markDeleted(keyString); } } batchMarkDeleted(keys) { for (const key of keys){ this.markDeleted(key); } } markUpdated(key) { if (this.deletedKeys.includes(key)) { this.deletedKeys.splice(this.deletedKeys.indexOf(key), 1); } if (!this.updatedKeys.includes(key)) { this.updatedKeys.push(key); } } markDeleted(key) { if (this.updatedKeys.includes(key)) { this.updatedKeys.splice(this.updatedKeys.indexOf(key), 1); } if (!this.deletedKeys.includes(key)) { this.deletedKeys.push(key); } } convertToKeyString(key) { return key?.toString(); } resetDiffs() { this.deletedKeys = []; this.updatedKeys = []; } batchMarkUpdated(keys) { for (const key of keys){ this.markUpdated(key); } } } //# sourceMappingURL=key-diff.cache.js.map