diff --git a/packages/cache-manager/package.json b/packages/cache-manager/package.json index ec71d7cb..90d02f8c 100644 --- a/packages/cache-manager/package.json +++ b/packages/cache-manager/package.json @@ -71,6 +71,7 @@ "@keyv/redis": "^5.1.6", "cache-manager-redis-yet": "^5.1.5", "cacheable": "workspace:^", + "keyv6": "npm:keyv@^6.1.0", "tsdown": "^0.23.0", "typescript": "^7.0.2" } diff --git a/packages/cache-manager/src/index.ts b/packages/cache-manager/src/index.ts index 8ebc1a80..697836e9 100644 --- a/packages/cache-manager/src/index.ts +++ b/packages/cache-manager/src/index.ts @@ -185,7 +185,7 @@ export const createCache = (options?: CreateCacheOptions): Cache => { if (nonBlocking) { try { result = await Promise.race( - stores.map(async (store) => store.get(key, { raw: true })), + stores.map(async (store) => store.getRaw(key)), ); if (result === undefined) { return undefined; @@ -196,7 +196,7 @@ export const createCache = (options?: CreateCacheOptions): Cache => { } else { for (const store of stores) { try { - const cacheValue = await store.get(key, { raw: true }); + const cacheValue = await store.getRaw(key); if (cacheValue !== undefined) { result = cacheValue; eventEmitter.emit("ttl", { key, value: result }); @@ -349,7 +349,7 @@ export const createCache = (options?: CreateCacheOptions): Cache => { for (; i < stores.length; i++) { try { - const data = await stores[i].get(key, { raw: true }); + const data = await stores[i].getRaw(key); if (data !== undefined) { value = data.value; rawData = data; diff --git a/packages/cache-manager/test/keyv6.test.ts b/packages/cache-manager/test/keyv6.test.ts new file mode 100644 index 00000000..72496181 --- /dev/null +++ b/packages/cache-manager/test/keyv6.test.ts @@ -0,0 +1,30 @@ +import { faker } from "@faker-js/faker"; +import type { Keyv } from "keyv"; +import { Keyv as Keyv6 } from "keyv6"; +import { describe, expect, it, vi } from "vitest"; +import { createCache } from "../src/index.js"; + +describe("Keyv 6 store", () => { + const ttl = 1000; + // The `stores` option has the Keyv 5 type, so a Keyv 6 instance needs a cast. + const createKeyv6Cache = () => + createCache({ stores: [new Keyv6() as unknown as Keyv] }); + + it("wrap returns the cached value", async () => { + const cache = createKeyv6Cache(); + const key = faker.string.alpha(20); + const getValue = vi.fn(() => ({ id: 1 })); + + await cache.wrap(key, getValue, ttl); + await expect(cache.wrap(key, getValue, ttl)).resolves.toEqual({ id: 1 }); + expect(getValue).toBeCalledTimes(1); + }); + + it("ttl returns the expiration", async () => { + const cache = createKeyv6Cache(); + const key = faker.string.alpha(20); + + await cache.set(key, faker.string.sample(), ttl); + await expect(cache.ttl(key)).resolves.toBeGreaterThan(Date.now()); + }); +}); diff --git a/packages/cache-manager/test/multiple-stores.test.ts b/packages/cache-manager/test/multiple-stores.test.ts index c5c405fb..62db511a 100644 --- a/packages/cache-manager/test/multiple-stores.test.ts +++ b/packages/cache-manager/test/multiple-stores.test.ts @@ -70,7 +70,7 @@ describe("multiple stores", () => { await expect(keyv2.get(data.key)).resolves.toEqual(data.value); // Store 1 get error - keyv1.get = () => { + keyv1.getRaw = () => { throw new Error("store 1 get error"); }; @@ -92,12 +92,12 @@ describe("multiple stores", () => { await expect(keyv2.get(data.key)).resolves.toEqual(data.value); // Store 1 get error - const getOk = keyv1.get; + const getOk = keyv1.getRaw; const getError = () => { throw new Error("store 1 get error"); }; - keyv1.get = getError; + keyv1.getRaw = getError; await sleep(ttl - refreshThreshold + 100); @@ -105,7 +105,7 @@ describe("multiple stores", () => { cache.wrap(data.key, () => "new", ttl, refreshThreshold), ).resolves.toEqual(data.value); - keyv1.get = getOk; + keyv1.getRaw = getOk; // Store 1 has been updated the latest value await expect(keyv1.get(data.key)).resolves.toEqual("new"); await expect(cache.wrap(data.key, () => "latest", ttl)).resolves.toEqual( diff --git a/packages/cache-manager/test/ttl.test.ts b/packages/cache-manager/test/ttl.test.ts index 692ddc53..5c763748 100644 --- a/packages/cache-manager/test/ttl.test.ts +++ b/packages/cache-manager/test/ttl.test.ts @@ -31,7 +31,7 @@ describe("get", () => { it("error", async () => { await cache.set(data.key, data.value); - keyv.get = () => { + keyv.getRaw = () => { throw new Error("get error"); }; @@ -39,7 +39,7 @@ describe("get", () => { }); it("error on non-blocking enabled", async () => { const secondKeyv = new Keyv(); - keyv.get = () => { + keyv.getRaw = () => { throw new Error("get error"); }; diff --git a/packages/cache-manager/test/wrap.test.ts b/packages/cache-manager/test/wrap.test.ts index ed5bdea7..ab4b48c8 100644 --- a/packages/cache-manager/test/wrap.test.ts +++ b/packages/cache-manager/test/wrap.test.ts @@ -247,7 +247,7 @@ describe("wrap", () => { it("store get failed", async () => { const getValue = vi.fn(() => data.value); - keyv.get = () => { + keyv.getRaw = () => { throw new Error("get failed"); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e4a6e0b..e7de21d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,6 +268,9 @@ importers: cacheable: specifier: workspace:^ version: link:../cacheable + keyv6: + specifier: npm:keyv@^6.1.0 + version: keyv@6.1.0 tsdown: specifier: ^0.23.0 version: 0.23.0(@arethetypeswrong/core@0.18.5)(publint@0.3.24)(tsx@4.23.15)(typescript@7.0.2) @@ -2927,6 +2930,10 @@ packages: keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + keyv@6.1.0: + resolution: {integrity: sha512-0OO64DxKOITdyQljNCcO+vc+iyaPmm3OV5eKOWRxWCp3V0QnXenpqcKfjGjycNILUJNV+erm1ose6Hsgr1fNFA==} + engines: {node: '>= 22.19.0'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -6294,6 +6301,10 @@ snapshots: dependencies: '@keyv/serialize': 1.1.1 + keyv@6.1.0: + dependencies: + hookified: 3.0.4 + kleur@4.1.5: {} ky@1.14.3: {}