Windshaft-cartodb/lib/cache/named-map-provider-cache.js

83 lines
2.6 KiB
JavaScript
Raw Normal View History

'use strict';
2019-09-14 00:11:47 +08:00
const LruCache = require('lru-cache');
2019-09-14 00:03:39 +08:00
const NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider');
2019-10-07 16:50:14 +08:00
const { templateName } = require('../backends/template-maps');
2019-09-14 00:03:39 +08:00
const TEN_MINUTES_IN_MILLISECONDS = 1000 * 60 * 10;
const ACTIONS = ['update', 'delete'];
2019-09-14 00:07:50 +08:00
module.exports = class NamedMapProviderCache {
constructor (
templateMaps,
pgConnection,
metadataBackend,
userLimitsBackend,
mapConfigAdapter,
affectedTablesCache
) {
this.templateMaps = templateMaps;
this.pgConnection = pgConnection;
this.metadataBackend = metadataBackend;
this.userLimitsBackend = userLimitsBackend;
this.mapConfigAdapter = mapConfigAdapter;
this.affectedTablesCache = affectedTablesCache;
this.providerCache = new LruCache({ max: 2000, maxAge: TEN_MINUTES_IN_MILLISECONDS });
2019-09-14 00:15:11 +08:00
ACTIONS.forEach(action => templateMaps.on(action, (user, templateId) => this.invalidate(user, templateId)));
2019-09-14 00:07:50 +08:00
}
2019-09-14 00:07:50 +08:00
get (user, templateId, config, authToken, params, callback) {
const namedMapKey = createNamedMapKey(user, templateId);
const namedMapProviders = this.providerCache.get(namedMapKey) || {};
const providerKey = createProviderKey(config, authToken, params);
if (Object.prototype.hasOwnProperty.call(namedMapProviders, providerKey)) {
2019-09-14 00:07:50 +08:00
return callback(null, namedMapProviders[providerKey]);
}
namedMapProviders[providerKey] = new NamedMapMapConfigProvider(
this.templateMaps,
this.pgConnection,
this.metadataBackend,
this.userLimitsBackend,
this.mapConfigAdapter,
this.affectedTablesCache,
user,
templateId,
config,
authToken,
params
);
this.providerCache.set(namedMapKey, namedMapProviders);
return callback(null, namedMapProviders[providerKey]);
}
2019-09-14 00:07:50 +08:00
invalidate (user, templateId) {
this.providerCache.del(createNamedMapKey(user, templateId));
}
};
2019-09-14 00:03:39 +08:00
function createNamedMapKey (user, templateId) {
return `${user}:${templateName(templateId)}`;
}
2019-09-14 00:00:13 +08:00
const providerKeyTpl = ctx => `${ctx.authToken}:${ctx.configHash}:${ctx.format}:${ctx.layer}:${ctx.scale_factor}`;
2019-09-14 00:03:39 +08:00
function createProviderKey (config, authToken, params) {
const defaults = {
authToken: authToken || '',
configHash: NamedMapMapConfigProvider.configHash(config),
layer: '',
format: '',
scale_factor: 1
};
const ctx = Object.assign({}, defaults, params);
return providerKeyTpl(ctx);
}