@fortedigital/nextjs-cache-handler
Version:
Next.js cache handlers
110 lines (109 loc) • 3.14 kB
JavaScript
// src/helpers/ioredisAdapter.ts
function ioredisAdapter(client) {
return new Proxy(client, {
get(target, prop, receiver) {
if (prop === "isReady") {
return target.status === "ready";
}
if (prop === "hScan") {
return async (key, cursor, options) => {
let result;
if (options?.COUNT) {
result = await target.hscan(key, cursor, "COUNT", options.COUNT);
} else {
result = await target.hscan(key, cursor);
}
const [newCursor, items] = result;
const entries = [];
for (let i = 0; i < items.length; i += 2) {
entries.push({ field: items[i], value: items[i + 1] });
}
return {
cursor: newCursor,
entries
};
};
}
if (prop === "hDel") {
return async (key, fields) => {
const args = Array.isArray(fields) ? fields : [fields];
if (args.length === 0) {
return 0;
}
return target.hdel(key, ...args);
};
}
if (prop === "unlink") {
return async (keys) => {
const args = Array.isArray(keys) ? keys : [keys];
if (args.length === 0) {
return 0;
}
return target.unlink(...args);
};
}
if (prop === "set") {
return async (key, value, options) => {
if (!options) {
return target.set(key, value);
}
const extraArgs = [];
if (options.EXAT) {
extraArgs.push("EXAT", options.EXAT);
} else if (options.PXAT) {
extraArgs.push("PXAT", options.PXAT);
} else if (options.EX) {
extraArgs.push("EX", options.EX);
} else if (options.PX) {
extraArgs.push("PX", options.PX);
} else if (options.KEEPTTL) {
extraArgs.push("KEEPTTL");
}
if (options.NX) {
extraArgs.push("NX");
} else if (options.XX) {
extraArgs.push("XX");
}
if (options.GET) {
extraArgs.push("GET");
}
const setFn = target.set;
return setFn(key, value, ...extraArgs);
};
}
if (prop === "hmGet") {
return async (key, fields) => {
const args = Array.isArray(fields) ? fields : [fields];
if (args.length === 0) {
return [];
}
return target.hmget(key, ...args);
};
}
if (prop === "get") {
return target.get.bind(target);
}
if (prop === "expireAt") {
return target.expireat.bind(target);
}
if (prop === "hSet") {
return target.hset.bind(target);
}
if (prop === "hExists") {
return target.hexists.bind(target);
}
if (prop === "on") {
return target.on.bind(target);
}
if (prop === "destroy") {
return async () => {
await target.quit();
};
}
return Reflect.get(target, prop, receiver);
}
});
}
export {
ioredisAdapter
};