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