From 24cd9ba9a41feca43da7dea4ff8639e2cc6c223b Mon Sep 17 00:00:00 2001 From: Avital Fine <98389525+Avital-Fine@users.noreply.github.com> Date: Thu, 24 Mar 2022 15:17:01 +0100 Subject: [PATCH] Support new expire features (#2036) * Support new expire features * Update PEXPIRETIME.ts * Update EXPIRETIME.ts * fix version skip * clean code Co-authored-by: leibale --- packages/client/lib/cluster/commands.ts | 6 ++++++ packages/client/lib/commands/EXPIRE.spec.ts | 19 ++++++++++++----- packages/client/lib/commands/EXPIRE.ts | 11 ++++++++-- packages/client/lib/commands/EXPIREAT.spec.ts | 7 +++++++ packages/client/lib/commands/EXPIREAT.ts | 11 ++++++++-- .../client/lib/commands/EXPIRETIME.spec.ts | 21 +++++++++++++++++++ packages/client/lib/commands/EXPIRETIME.ts | 9 ++++++++ packages/client/lib/commands/PEXPIRE.spec.ts | 19 ++++++++++++----- packages/client/lib/commands/PEXPIRE.ts | 11 ++++++++-- .../client/lib/commands/PEXPIREAT.spec.ts | 7 +++++++ packages/client/lib/commands/PEXPIREAT.ts | 11 ++++++++-- .../client/lib/commands/PEXPIRETIME.spec.ts | 21 +++++++++++++++++++ packages/client/lib/commands/PEXPIRETIME.ts | 9 ++++++++ 13 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 packages/client/lib/commands/EXPIRETIME.spec.ts create mode 100644 packages/client/lib/commands/EXPIRETIME.ts create mode 100644 packages/client/lib/commands/PEXPIRETIME.spec.ts create mode 100644 packages/client/lib/commands/PEXPIRETIME.ts diff --git a/packages/client/lib/cluster/commands.ts b/packages/client/lib/cluster/commands.ts index bbfe237b09..a43a6a38dc 100644 --- a/packages/client/lib/cluster/commands.ts +++ b/packages/client/lib/cluster/commands.ts @@ -21,6 +21,7 @@ import * as EVALSHA from '../commands/EVALSHA'; import * as EXISTS from '../commands/EXISTS'; import * as EXPIRE from '../commands/EXPIRE'; import * as EXPIREAT from '../commands/EXPIREAT'; +import * as EXPIRETIME from '../commands/EXPIRETIME'; import * as GEOADD from '../commands/GEOADD'; import * as GEODIST from '../commands/GEODIST'; import * as GEOHASH from '../commands/GEOHASH'; @@ -75,6 +76,7 @@ import * as MSETNX from '../commands/MSETNX'; import * as PERSIST from '../commands/PERSIST'; import * as PEXPIRE from '../commands/PEXPIRE'; import * as PEXPIREAT from '../commands/PEXPIREAT'; +import * as PEXPIRETIME from '../commands/PEXPIRETIME'; import * as PFADD from '../commands/PFADD'; import * as PFCOUNT from '../commands/PFCOUNT'; import * as PFMERGE from '../commands/PFMERGE'; @@ -224,6 +226,8 @@ export default { expire: EXPIRE, EXPIREAT, expireAt: EXPIREAT, + EXPIRETIME, + expireTime: EXPIRETIME, GEOADD, geoAdd: GEOADD, GEODIST, @@ -332,6 +336,8 @@ export default { pExpire: PEXPIRE, PEXPIREAT, pExpireAt: PEXPIREAT, + PEXPIRETIME, + pExpireTime: PEXPIRETIME, PFADD, pfAdd: PFADD, PFCOUNT, diff --git a/packages/client/lib/commands/EXPIRE.spec.ts b/packages/client/lib/commands/EXPIRE.spec.ts index e2dc6e0312..39f9d70bd9 100644 --- a/packages/client/lib/commands/EXPIRE.spec.ts +++ b/packages/client/lib/commands/EXPIRE.spec.ts @@ -3,11 +3,20 @@ import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './EXPIRE'; describe('EXPIRE', () => { - it('transformArguments', () => { - assert.deepEqual( - transformArguments('key', 1), - ['EXPIRE', 'key', '1'] - ); + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key', 1), + ['EXPIRE', 'key', '1'] + ); + }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'NX'), + ['EXPIRE', 'key', '1', 'NX'] + ); + }); }); testUtils.testWithClient('client.expire', async client => { diff --git a/packages/client/lib/commands/EXPIRE.ts b/packages/client/lib/commands/EXPIRE.ts index 291b544c6a..d9e85595c3 100644 --- a/packages/client/lib/commands/EXPIRE.ts +++ b/packages/client/lib/commands/EXPIRE.ts @@ -4,9 +4,16 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - seconds: number + seconds: number, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return ['EXPIRE', key, seconds.toString()]; + const args = ['EXPIRE', key, seconds.toString()]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/EXPIREAT.spec.ts b/packages/client/lib/commands/EXPIREAT.spec.ts index 1a11af1a73..0335b36f5f 100644 --- a/packages/client/lib/commands/EXPIREAT.spec.ts +++ b/packages/client/lib/commands/EXPIREAT.spec.ts @@ -18,6 +18,13 @@ describe('EXPIREAT', () => { ['EXPIREAT', 'key', Math.floor(d.getTime() / 1000).toString()] ); }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'GT'), + ['EXPIREAT', 'key', '1', 'GT'] + ); + }); }); testUtils.testWithClient('client.expireAt', async client => { diff --git a/packages/client/lib/commands/EXPIREAT.ts b/packages/client/lib/commands/EXPIREAT.ts index 3ddb75fe18..84e7760fe7 100644 --- a/packages/client/lib/commands/EXPIREAT.ts +++ b/packages/client/lib/commands/EXPIREAT.ts @@ -5,13 +5,20 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - timestamp: number | Date + timestamp: number | Date, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return [ + const args = [ 'EXPIREAT', key, transformEXAT(timestamp) ]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/EXPIRETIME.spec.ts b/packages/client/lib/commands/EXPIRETIME.spec.ts new file mode 100644 index 0000000000..3f33693d89 --- /dev/null +++ b/packages/client/lib/commands/EXPIRETIME.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './EXPIRETIME'; + +describe('EXPIRETIME', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['EXPIRETIME', 'key'] + ); + }); + + testUtils.testWithClient('client.expireTime', async client => { + assert.equal( + await client.expireTime('key'), + -2 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/EXPIRETIME.ts b/packages/client/lib/commands/EXPIRETIME.ts new file mode 100644 index 0000000000..8c1bb07599 --- /dev/null +++ b/packages/client/lib/commands/EXPIRETIME.ts @@ -0,0 +1,9 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['EXPIRETIME', key]; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/PEXPIRE.spec.ts b/packages/client/lib/commands/PEXPIRE.spec.ts index 4738edcf8f..03bde65610 100644 --- a/packages/client/lib/commands/PEXPIRE.spec.ts +++ b/packages/client/lib/commands/PEXPIRE.spec.ts @@ -3,11 +3,20 @@ import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PEXPIRE'; describe('PEXPIRE', () => { - it('transformArguments', () => { - assert.deepEqual( - transformArguments('key', 1), - ['PEXPIRE', 'key', '1'] - ); + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key', 1), + ['PEXPIRE', 'key', '1'] + ); + }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'GT'), + ['PEXPIRE', 'key', '1', 'GT'] + ); + }); }); testUtils.testWithClient('client.pExpire', async client => { diff --git a/packages/client/lib/commands/PEXPIRE.ts b/packages/client/lib/commands/PEXPIRE.ts index 428bfd9d26..cbb5666a51 100644 --- a/packages/client/lib/commands/PEXPIRE.ts +++ b/packages/client/lib/commands/PEXPIRE.ts @@ -4,9 +4,16 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - milliseconds: number + milliseconds: number, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return ['PEXPIRE', key, milliseconds.toString()]; + const args = ['PEXPIRE', key, milliseconds.toString()]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/PEXPIREAT.spec.ts b/packages/client/lib/commands/PEXPIREAT.spec.ts index 19fc3b888d..fec03c8fb7 100644 --- a/packages/client/lib/commands/PEXPIREAT.spec.ts +++ b/packages/client/lib/commands/PEXPIREAT.spec.ts @@ -18,6 +18,13 @@ describe('PEXPIREAT', () => { ['PEXPIREAT', 'key', d.getTime().toString()] ); }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'XX'), + ['PEXPIREAT', 'key', '1', 'XX'] + ); + }); }); testUtils.testWithClient('client.pExpireAt', async client => { diff --git a/packages/client/lib/commands/PEXPIREAT.ts b/packages/client/lib/commands/PEXPIREAT.ts index 49872877f6..da912ec4fc 100644 --- a/packages/client/lib/commands/PEXPIREAT.ts +++ b/packages/client/lib/commands/PEXPIREAT.ts @@ -5,13 +5,20 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - millisecondsTimestamp: number | Date + millisecondsTimestamp: number | Date, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return [ + const args = [ 'PEXPIREAT', key, transformPXAT(millisecondsTimestamp) ]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/PEXPIRETIME.spec.ts b/packages/client/lib/commands/PEXPIRETIME.spec.ts new file mode 100644 index 0000000000..8874346296 --- /dev/null +++ b/packages/client/lib/commands/PEXPIRETIME.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './PEXPIRETIME'; + +describe('PEXPIRETIME', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['PEXPIRETIME', 'key'] + ); + }); + + testUtils.testWithClient('client.pExpireTime', async client => { + assert.equal( + await client.pExpireTime('key'), + -2 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/PEXPIRETIME.ts b/packages/client/lib/commands/PEXPIRETIME.ts new file mode 100644 index 0000000000..4c1acba8f0 --- /dev/null +++ b/packages/client/lib/commands/PEXPIRETIME.ts @@ -0,0 +1,9 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['PEXPIRETIME', key]; +} + +export declare function transformReply(): number;