@aj-archipelago/cortex
Version:
Cortex is a GraphQL API for AI. It provides a simple, extensible interface for using AI services from OpenAI, Azure and others.
48 lines (42 loc) • 1.58 kB
JavaScript
import Keyv from 'keyv';
import { config } from '../config.js';
import { encrypt, decrypt } from './crypto.js';
import logger from './logger.js';
const storageConnectionString = config.get('storageConnectionString');
const cortexId = config.get('cortexId');
const redisEncryptionKey = config.get('redisEncryptionKey');
// Create a keyv client to store data
const keyValueStorageClient = new Keyv(storageConnectionString, {
ssl: true,
abortConnect: false,
serialize: (data) => redisEncryptionKey ? encrypt(JSON.stringify(data), redisEncryptionKey) : JSON.stringify(data),
deserialize: (data) => {
try {
// Try to parse the data normally
return JSON.parse(data);
} catch (error) {
// If it fails, the data may be encrypted so attempt to decrypt it if we have a key
try {
return JSON.parse(decrypt(data, redisEncryptionKey));
} catch (decryptError) {
// If decryption also fails, log an error and return an empty object
logger.error(`Failed to parse or decrypt stored key value data: ${decryptError}`);
return {};
}
}
},
namespace: `${cortexId}-cortex-context`
});
// Set values to keyv
async function setv(key, value) {
return keyValueStorageClient && (await keyValueStorageClient.set(key, value));
}
// Get values from keyv
async function getv(key) {
return keyValueStorageClient && (await keyValueStorageClient.get(key));
}
export {
keyValueStorageClient,
setv,
getv
};