const MAIN_SCHEMA = "__MAIN_SCHEMA"; const SCHEMA_CACHE_PREFIX = "__SCHEMA"; const ALL_KEYS = "__ALL_KEYS"; import { randomString } from '../cryptoUtils'; import defaults from '../defaults'; export default class SchemaCache { cache: Object; constructor(cacheController, ttl = defaults.schemaCacheTTL, singleCache = false) { this.ttl = ttl; if (typeof ttl == 'string') { this.ttl = parseInt(ttl); } this.cache = cacheController; this.prefix = SCHEMA_CACHE_PREFIX; if (!singleCache) { this.prefix += randomString(20); } } put(key, value) { return this.cache.get(this.prefix + ALL_KEYS).then((allKeys) => { allKeys = allKeys || {}; allKeys[key] = true; return Promise.all([this.cache.put(this.prefix + ALL_KEYS, allKeys, this.ttl), this.cache.put(key, value, this.ttl)]); }); } getAllClasses() { if (!this.ttl) { return Promise.resolve(null); } return this.cache.get(this.prefix + MAIN_SCHEMA); } setAllClasses(schema) { if (!this.ttl) { return Promise.resolve(null); } return this.put(this.prefix + MAIN_SCHEMA, schema); } setOneSchema(className, schema) { if (!this.ttl) { return Promise.resolve(null); } return this.put(this.prefix + className, schema); } getOneSchema(className) { if (!this.ttl) { return Promise.resolve(null); } return this.cache.get(this.prefix + className).then((schema) => { if (schema) { return Promise.resolve(schema); } return this.cache.get(this.prefix + MAIN_SCHEMA).then((cachedSchemas) => { cachedSchemas = cachedSchemas || []; schema = cachedSchemas.find((cachedSchema) => { return cachedSchema.className === className; }); if (schema) { return Promise.resolve(schema); } return Promise.resolve(null); }); }); } clear() { // That clears all caches... return this.cache.get(this.prefix + ALL_KEYS).then((allKeys) => { if (!allKeys) { return; } const promises = Object.keys(allKeys).map((key) => { return this.cache.del(key); }); return Promise.all(promises); }); } }