UNPKG

asksuite-core

Version:
121 lines (101 loc) 3.04 kB
const { CacheRedis } = require('../util/CacheRedis'); const AsksuiteProcessingNaturalUtils = require('../AsksuiteProcessingNaturalUtils'); const StringUtils = require('../util/StringUtils'); class GlobalCacheManager { constructor(redisConfig, defaultTTL) { /** @private */ this._DEFAULT_PREFIX = 'global'; /** @private */ this._DEFAULT_TTL = defaultTTL || 86400; // default 1 day /** @private */ this._redisClient = this._getCacheConfig(redisConfig); /** @private */ this._layersCache = {}; /** @private */ this._utils = new AsksuiteProcessingNaturalUtils(); } /** * @typedef {Object} LayerConfig * @property {string} name - The name of the layer. * @property {number} ttl - Time to live (TTL) for the layer. * @param {LayerConfig[]} layers - An array of LayerConfig objects. */ addLayers(layers) { this._layersCache = layers.reduce((acc, item) => { acc[item.name] = item; return acc; }, this._layersCache); } /** * @param {string} layer * @param {*} request * @param {*} intent */ async set(layer, request, intent) { const text = request.text; const key = this._generateCacheKey(layer, request.language, request.languages, text); const processingStep = intent.processingStep || (intent.processingSteps && intent.processingSteps.find((p) => p.resolver === layer)[0]); const value = { text, processingStep, resolver: layer, intent: intent.intent, extractedData: intent.extractedData, fromCache: true, }; await this._redisClient.set(key, value, this._layersCache[layer].ttl); } /** * @param {string} layer * @param {*} request */ async get(layer, request) { const key = this._generateCacheKey(layer, request.language, request.languages, request.text); let value = await this._redisClient.get(key); if (!value) { return null; } value = this._utils.findDialogByIntent(request, value.intent); return value; } /** * @param {string} layerName * @returns {boolean} boolean */ isGlobalLayer(layerName) { return layerName in this._layersCache; } /** * @private * @param {*} redis * @param {string} prefix * @param {number} ttl */ _getCacheConfig(redis) { if (!redis) { return null; } return new CacheRedis({ client: redis, prefixKey: this._DEFAULT_PREFIX, expirationTime: this._DEFAULT_TTL, isJson: true, }); } /** * @private * @param {string} layer * @param {string} language * @param {string[]} languages * @param {string} text */ _generateCacheKey(layer, language, languages, text) { const resolvedLanguage = this._utils.resolveLanguage(language, languages); const normalizedText = StringUtils.normalizeText(text); const textHash = StringUtils.generateHash(normalizedText); return `${layer.toLowerCase()}:${resolvedLanguage}:${textHash}`; } } module.exports = GlobalCacheManager;