86 lines
2.2 KiB
JavaScript
86 lines
2.2 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
}
|