From 7d1a9b41c1379f92f988a8ace32156952b2c33ae Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 29 Apr 2025 15:44:52 +0000 Subject: [PATCH 1/2] keyv - fix: serialize entries in setMany before passing them to the store --- packages/keyv/src/index.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/keyv/src/index.ts b/packages/keyv/src/index.ts index 752233e8d..b2ff85d12 100644 --- a/packages/keyv/src/index.ts +++ b/packages/keyv/src/index.ts @@ -619,7 +619,25 @@ export class Keyv extends EventManager { try { // If the store has a setMany method then use it if (this._store.setMany !== undefined) { - results = await this._store.setMany(entries); + const serializedEntries = await Promise.all(entries.map(async ({ key, value, ttl }) => { + if (ttl === undefined) { + ttl = this._ttl; + } + if (ttl === 0) { + ttl = undefined; + } + const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null; + + if (typeof value === 'symbol') { + this.emit('error', 'symbol cannot be serialized'); + throw new Error('symbol cannot be serialized'); + } + + const formattedValue = { value, expires }; + const serializedValue = await this.serializeData(formattedValue); + return { key, value: serializedValue, ttl }; + })); + results = await this._store.setMany(serializedEntries); return results; } From e87961815b774516f04efc46374e18719f2e9c37 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 1 May 2025 15:41:44 -0400 Subject: [PATCH 2/2] fix linting issues --- packages/keyv/src/index.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/keyv/src/index.ts b/packages/keyv/src/index.ts index b2ff85d12..3a4e55ee9 100644 --- a/packages/keyv/src/index.ts +++ b/packages/keyv/src/index.ts @@ -619,13 +619,15 @@ export class Keyv extends EventManager { try { // If the store has a setMany method then use it if (this._store.setMany !== undefined) { - const serializedEntries = await Promise.all(entries.map(async ({ key, value, ttl }) => { + const serializedEntries = await Promise.all(entries.map(async ({key, value, ttl}) => { if (ttl === undefined) { ttl = this._ttl; } + if (ttl === 0) { ttl = undefined; } + const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null; if (typeof value === 'symbol') { @@ -633,9 +635,9 @@ export class Keyv extends EventManager { throw new Error('symbol cannot be serialized'); } - const formattedValue = { value, expires }; + const formattedValue = {value, expires}; const serializedValue = await this.serializeData(formattedValue); - return { key, value: serializedValue, ttl }; + return {key, value: serializedValue, ttl}; })); results = await this._store.setMany(serializedEntries); return results;