@chord-ts/rpc
Version:
💎 Cutting edge transport framework vanishing borders between frontend and backend
45 lines (44 loc) • 1.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.callToKey = callToKey;
exports.cacheMiddleware = cacheMiddleware;
const specs_1 = require("../specs");
const specs_2 = require("../specs");
function callToKey({ method, params }) {
return `${method}(${JSON.stringify(params)})`;
}
function cacheMiddleware(cache, ttl) {
return async function cacheIntercept(event, ctx, next) {
const { target, descriptor } = ctx.methodDesc;
const call = ctx.body;
const cacheKey = callToKey(call);
const stored = await cache
.get(cacheKey)
.catch((e) => console.error(`Failed at read cache "${cacheKey}"\n`, e));
if (stored) {
return (0, specs_2.buildResponse)({ request: ctx.body, result: stored });
}
let resp;
let result;
try {
await next();
result = await descriptor.value.apply(target, call.params);
resp = (0, specs_2.buildResponse)({
request: ctx.body,
result
});
}
catch (e) {
console.error(e);
resp = (0, specs_2.buildError)({
code: specs_1.ErrorCode.InternalError,
message: e?.message || '',
data: [e]
});
}
finally {
cache.set(cacheKey, result, ttl).catch((e) => console.error('Failed at cache storing\n', e));
}
return resp;
};
}