UNPKG

@fortedigital/nextjs-cache-handler

Version:
110 lines (109 loc) 3.14 kB
// 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 };