typeorm
Version:
Data-Mapper ORM for TypeScript and ES2023+. Supports MySQL/MariaDB, PostgreSQL, MS SQL Server, Oracle, SAP HANA, SQLite, MongoDB databases.
185 lines • 6.12 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RedisQueryResultCache = void 0;
const PlatformTools_1 = require("../platform/PlatformTools");
const TypeORMError_1 = require("../error/TypeORMError");
/**
* Caches query result into Redis database.
*/
class RedisQueryResultCache {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(dataSource, clientType) {
this.dataSource = dataSource;
this.clientType = clientType;
this.redis = this.loadRedis();
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Creates a connection with given cache provider.
*/
async connect() {
const cacheOptions = this.dataSource.options.cache;
if (this.clientType === "redis") {
const clientOptions = {
...cacheOptions?.options,
};
this.client = this.redis.createClient(clientOptions);
if (typeof this.dataSource.options.cache === "object" &&
this.dataSource.options.cache.ignoreErrors) {
this.client.on("error", (err) => {
this.dataSource.logger.log("warn", err);
});
}
await this.client.connect();
}
else if (this.clientType === "ioredis") {
if (cacheOptions?.port) {
if (cacheOptions.options) {
this.client = new this.redis(cacheOptions.port, cacheOptions.options);
}
else {
this.client = new this.redis(cacheOptions.port);
}
}
else if (cacheOptions?.options) {
this.client = new this.redis(cacheOptions.options);
}
else {
this.client = new this.redis();
}
}
else if (this.clientType === "ioredis/cluster") {
if (cacheOptions?.options && Array.isArray(cacheOptions.options)) {
this.client = new this.redis.Cluster(cacheOptions.options);
}
else if (cacheOptions?.options?.startupNodes) {
this.client = new this.redis.Cluster(cacheOptions.options.startupNodes, cacheOptions.options.options);
}
else {
throw new TypeORMError_1.TypeORMError(`options.startupNodes required for ${this.clientType}.`);
}
}
}
/**
* Disconnects the connection
*/
async disconnect() {
const client = this.client;
this.client = undefined;
await client.quit();
}
/**
* Creates table for storing cache if it does not exist yet.
*
* @param queryRunner
*/
async synchronize(queryRunner) { }
/**
* Get data from cache.
* Returns cache result if found.
* Returns undefined if result is not cached.
*
* @param options
* @param queryRunner
*/
async getFromCache(options, queryRunner) {
const identifier = options.identifier === "" ? undefined : options.identifier;
const key = identifier ?? options.query;
if (!key)
return undefined;
const result = await this.client.get(key);
return result ? JSON.parse(result) : undefined;
}
/**
* Checks if cache is expired or not.
*
* @param savedCache
*/
isExpired(savedCache) {
return savedCache.time + savedCache.duration < Date.now();
}
/**
* Stores given query result in the cache.
*
* @param options
* @param savedCache
* @param queryRunner
*/
async storeInCache(options, savedCache, queryRunner) {
const identifier = options.identifier === "" ? undefined : options.identifier;
const key = identifier ?? options.query;
if (!key)
return;
const value = JSON.stringify(options);
const duration = options.duration;
if (this.isNodeRedisClient()) {
await this.client.set(key, value, {
expiration: {
type: "PX",
value: duration,
},
});
}
else {
await this.client.set(key, value, "PX", duration);
}
}
/**
* Clears everything stored in the cache.
*
* @param queryRunner
*/
async clear(queryRunner) {
if (this.isNodeRedisClient()) {
await this.client.flushDb();
}
else {
await this.client.flushdb();
}
}
/**
* Removes all cached results by given identifiers from cache.
*
* @param identifiers
* @param queryRunner
*/
async remove(identifiers, queryRunner) {
await this.client.del(identifiers);
}
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
/**
* Removes a single key from redis database.
*
* @param key
*/
async deleteKey(key) {
await this.client.del([key]);
}
/**
* Loads redis dependency.
*/
loadRedis() {
try {
if (this.clientType === "ioredis/cluster") {
return PlatformTools_1.PlatformTools.load("ioredis");
}
else {
return PlatformTools_1.PlatformTools.load(this.clientType);
}
}
catch {
throw new TypeORMError_1.TypeORMError(`Cannot use cache because ${this.clientType} is not installed. Please run "npm i ${this.clientType}".`);
}
}
isNodeRedisClient() {
return this.clientType === "redis";
}
}
exports.RedisQueryResultCache = RedisQueryResultCache;
//# sourceMappingURL=RedisQueryResultCache.js.map