prisma-extension-cache-manager
Version:
Prisma client extension for caching model queries
62 lines (61 loc) • 2.73 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultKeyGenerator = void 0;
const extension_1 = require("@prisma/client/extension");
const object_code_1 = require("object-code");
const types_1 = require("./types");
const defaultKeyGenerator = (args) => (0, object_code_1.hash)(args).toString();
exports.defaultKeyGenerator = defaultKeyGenerator;
const _parseConfig = (config) => {
let options = {};
if (typeof config === 'object') {
options = config;
}
else if (typeof config === 'number') {
options.ttl = config;
}
return options;
};
exports.default = (config) => {
var _a;
const { cache } = config;
const keyGenerator = (_a = config.keyGenerator) !== null && _a !== void 0 ? _a : exports.defaultKeyGenerator;
return extension_1.Prisma.defineExtension({
name: 'cache',
client: {
$cache: cache,
},
model: {
$allModels: {},
},
query: {
$allModels: {
$allOperations(_a) {
return __awaiter(this, arguments, void 0, function* ({ model, operation, args, query }) {
var _b;
const useCache = !!(['number', 'boolean', 'object'].includes(typeof args.cache) &&
args.cache !== null &&
types_1.CACHE_OPERATIONS.includes(operation));
if (!useCache) {
return query(args);
}
const queryArgs = Object.assign({}, args);
delete queryArgs.cache;
const options = _parseConfig(args.cache);
const key = (_b = options.key) !== null && _b !== void 0 ? _b : (yield keyGenerator({ model, operation, args: queryArgs }));
return cache.wrap(key, () => query(queryArgs), options.ttl);
});
},
},
},
});
};