From 6ca420f15e91f3214c34355c78d585b6585ffa87 Mon Sep 17 00:00:00 2001 From: Leibale Date: Thu, 6 Jul 2023 11:07:52 -0400 Subject: [PATCH] fix #2561 --- docs/v4-to-v5.md | 2 +- packages/client/lib/commands/HSCAN.spec.ts | 31 +++++++++++----------- packages/client/lib/commands/HSCAN.ts | 4 +-- packages/client/lib/commands/SCAN.spec.ts | 14 +++++----- packages/client/lib/commands/SCAN.ts | 6 ++--- packages/client/lib/commands/SSCAN.spec.ts | 12 ++++----- packages/client/lib/commands/SSCAN.ts | 4 +-- packages/client/lib/commands/ZSCAN.spec.ts | 12 ++++----- packages/client/lib/commands/ZSCAN.ts | 4 +-- 9 files changed, 45 insertions(+), 44 deletions(-) diff --git a/docs/v4-to-v5.md b/docs/v4-to-v5.md index cfe91df18a..a4cdf09b17 100644 --- a/docs/v4-to-v5.md +++ b/docs/v4-to-v5.md @@ -131,7 +131,7 @@ Some command arguments/replies have changed to align more closely to data types - `LCS IDX`: `length` has been changed to `len`, `matches` has been changed from `Array<{ key1: RangeReply; key2: RangeReply; }>` to `Array<[key1: RangeReply, key2: RangeReply]>` - `HEXISTS`: `boolean` -> `number` [^boolean-to-number] - `HRANDFIELD_COUNT_WITHVALUES`: `Record` -> `Array<{ field: BlobString; value: BlobString; }>` (it can return duplicates). -- `SCAN`, `HSCAN`, `SSCAN`, and `ZSCAN`: cursor type is `string` instead of `number`? +- `SCAN`, `HSCAN`, `SSCAN`, and `ZSCAN`: `cursor` type is `string | Buffer` instead of `number` - `HSETNX`: `boolean` -> `number` [^boolean-to-number] - `ZINTER`: instead of `client.ZINTER('key', { WEIGHTS: [1] })` use `client.ZINTER({ key: 'key', weight: 1 }])` - `ZINTER_WITHSCORES`: instead of `client.ZINTER_WITHSCORES('key', { WEIGHTS: [1] })` use `client.ZINTER_WITHSCORES({ key: 'key', weight: 1 }])` diff --git a/packages/client/lib/commands/HSCAN.spec.ts b/packages/client/lib/commands/HSCAN.spec.ts index c655f5a1a5..0a3dfd19be 100644 --- a/packages/client/lib/commands/HSCAN.spec.ts +++ b/packages/client/lib/commands/HSCAN.spec.ts @@ -6,14 +6,14 @@ describe('HSCAN', () => { describe('transformArguments', () => { it('cusror only', () => { assert.deepEqual( - HSCAN.transformArguments('key', 0), + HSCAN.transformArguments('key', '0'), ['HSCAN', 'key', '0'] ); }); it('with MATCH', () => { assert.deepEqual( - HSCAN.transformArguments('key', 0, { + HSCAN.transformArguments('key', '0', { MATCH: 'pattern' }), ['HSCAN', 'key', '0', 'MATCH', 'pattern'] @@ -22,7 +22,7 @@ describe('HSCAN', () => { it('with COUNT', () => { assert.deepEqual( - HSCAN.transformArguments('key', 0, { + HSCAN.transformArguments('key', '0', { COUNT: 1 }), ['HSCAN', 'key', '0', 'COUNT', '1'] @@ -31,7 +31,7 @@ describe('HSCAN', () => { it('with MATCH & COUNT', () => { assert.deepEqual( - HSCAN.transformArguments('key', 0, { + HSCAN.transformArguments('key', '0', { MATCH: 'pattern', COUNT: 1 }), @@ -41,16 +41,17 @@ describe('HSCAN', () => { }); testUtils.testWithClient('client.hScan', async client => { - await client.hSet('key', 'field', 'value'); - assert.deepEqual( - await client.hScan('key', 0), - { - cursor: 0, - entries: [{ - field: 'field', - value: 'value' - }] - } - ); + const [, reply] = await Promise.all([ + client.hSet('key', 'field', 'value'), + client.hScan('key', '0') + ]); + + assert.deepEqual(reply, { + cursor: '0', + entries: [{ + field: 'field', + value: 'value' + }] + }); }, GLOBAL.SERVERS.OPEN); }); diff --git a/packages/client/lib/commands/HSCAN.ts b/packages/client/lib/commands/HSCAN.ts index 2391424eb2..db52db99fe 100644 --- a/packages/client/lib/commands/HSCAN.ts +++ b/packages/client/lib/commands/HSCAN.ts @@ -11,7 +11,7 @@ export default { IS_READ_ONLY: true, transformArguments( key: RedisArgument, - cursor: number, + cursor: RedisArgument, options?: ScanCommonOptions ) { return pushScanArguments(['HSCAN', key], cursor, options); @@ -27,7 +27,7 @@ export default { } return { - cursor: Number(cursor), + cursor, entries }; } diff --git a/packages/client/lib/commands/SCAN.spec.ts b/packages/client/lib/commands/SCAN.spec.ts index baf3682954..ccffde48d2 100644 --- a/packages/client/lib/commands/SCAN.spec.ts +++ b/packages/client/lib/commands/SCAN.spec.ts @@ -6,14 +6,14 @@ describe('SCAN', () => { describe('transformArguments', () => { it('cusror only', () => { assert.deepEqual( - SCAN.transformArguments(0), + SCAN.transformArguments('0'), ['SCAN', '0'] ); }); it('with MATCH', () => { assert.deepEqual( - SCAN.transformArguments(0, { + SCAN.transformArguments('0', { MATCH: 'pattern' }), ['SCAN', '0', 'MATCH', 'pattern'] @@ -22,7 +22,7 @@ describe('SCAN', () => { it('with COUNT', () => { assert.deepEqual( - SCAN.transformArguments(0, { + SCAN.transformArguments('0', { COUNT: 1 }), ['SCAN', '0', 'COUNT', '1'] @@ -31,7 +31,7 @@ describe('SCAN', () => { it('with TYPE', () => { assert.deepEqual( - SCAN.transformArguments(0, { + SCAN.transformArguments('0', { TYPE: 'stream' }), ['SCAN', '0', 'TYPE', 'stream'] @@ -40,7 +40,7 @@ describe('SCAN', () => { it('with MATCH & COUNT & TYPE', () => { assert.deepEqual( - SCAN.transformArguments(0, { + SCAN.transformArguments('0', { MATCH: 'pattern', COUNT: 1, TYPE: 'stream' @@ -52,9 +52,9 @@ describe('SCAN', () => { testUtils.testAll('scan', async client => { assert.deepEqual( - await client.scan(0), + await client.scan('0'), { - cursor: 0, + cursor: '0', keys: [] } ); diff --git a/packages/client/lib/commands/SCAN.ts b/packages/client/lib/commands/SCAN.ts index da64a7969e..b8db505b00 100644 --- a/packages/client/lib/commands/SCAN.ts +++ b/packages/client/lib/commands/SCAN.ts @@ -7,7 +7,7 @@ export interface ScanCommonOptions { export function pushScanArguments( args: CommandArguments, - cursor: number, + cursor: RedisArgument, options?: ScanOptions ): CommandArguments { args.push(cursor.toString()); @@ -30,7 +30,7 @@ export interface ScanOptions extends ScanCommonOptions { export default { FIRST_KEY_INDEX: undefined, IS_READ_ONLY: true, - transformArguments(cursor: number, options?: ScanOptions) { + transformArguments(cursor: string, options?: ScanOptions) { const args = pushScanArguments(['SCAN'], cursor, options); if (options?.TYPE) { @@ -41,7 +41,7 @@ export default { }, transformReply([cursor, keys]: [BlobStringReply, ArrayReply]) { return { - cursor: Number(cursor), + cursor, keys }; } diff --git a/packages/client/lib/commands/SSCAN.spec.ts b/packages/client/lib/commands/SSCAN.spec.ts index 3fe9edec8c..2b394511f5 100644 --- a/packages/client/lib/commands/SSCAN.spec.ts +++ b/packages/client/lib/commands/SSCAN.spec.ts @@ -6,14 +6,14 @@ describe('SSCAN', () => { describe('transformArguments', () => { it('cusror only', () => { assert.deepEqual( - SSCAN.transformArguments('key', 0), + SSCAN.transformArguments('key', '0'), ['SSCAN', 'key', '0'] ); }); it('with MATCH', () => { assert.deepEqual( - SSCAN.transformArguments('key', 0, { + SSCAN.transformArguments('key', '0', { MATCH: 'pattern' }), ['SSCAN', 'key', '0', 'MATCH', 'pattern'] @@ -22,7 +22,7 @@ describe('SSCAN', () => { it('with COUNT', () => { assert.deepEqual( - SSCAN.transformArguments('key', 0, { + SSCAN.transformArguments('key', '0', { COUNT: 1 }), ['SSCAN', 'key', '0', 'COUNT', '1'] @@ -31,7 +31,7 @@ describe('SSCAN', () => { it('with MATCH & COUNT', () => { assert.deepEqual( - SSCAN.transformArguments('key', 0, { + SSCAN.transformArguments('key', '0', { MATCH: 'pattern', COUNT: 1 }), @@ -42,9 +42,9 @@ describe('SSCAN', () => { testUtils.testAll('sScan', async client => { assert.deepEqual( - await client.sScan('key', 0), + await client.sScan('key', '0'), { - cursor: 0, + cursor: '0', members: [] } ); diff --git a/packages/client/lib/commands/SSCAN.ts b/packages/client/lib/commands/SSCAN.ts index c36bc52ca1..f47144d834 100644 --- a/packages/client/lib/commands/SSCAN.ts +++ b/packages/client/lib/commands/SSCAN.ts @@ -6,14 +6,14 @@ export default { IS_READ_ONLY: true, transformArguments( key: RedisArgument, - cursor: number, + cursor: RedisArgument, options?: ScanCommonOptions ) { return pushScanArguments(['SSCAN', key], cursor, options); }, transformReply([cursor, members]: [BlobStringReply, Array]) { return { - cursor: Number(cursor), + cursor, members }; } diff --git a/packages/client/lib/commands/ZSCAN.spec.ts b/packages/client/lib/commands/ZSCAN.spec.ts index f420fc0806..d4d5f56546 100644 --- a/packages/client/lib/commands/ZSCAN.spec.ts +++ b/packages/client/lib/commands/ZSCAN.spec.ts @@ -6,14 +6,14 @@ describe('ZSCAN', () => { describe('transformArguments', () => { it('cusror only', () => { assert.deepEqual( - ZSCAN.transformArguments('key', 0), + ZSCAN.transformArguments('key', '0'), ['ZSCAN', 'key', '0'] ); }); it('with MATCH', () => { assert.deepEqual( - ZSCAN.transformArguments('key', 0, { + ZSCAN.transformArguments('key', '0', { MATCH: 'pattern' }), ['ZSCAN', 'key', '0', 'MATCH', 'pattern'] @@ -22,7 +22,7 @@ describe('ZSCAN', () => { it('with COUNT', () => { assert.deepEqual( - ZSCAN.transformArguments('key', 0, { + ZSCAN.transformArguments('key', '0', { COUNT: 1 }), ['ZSCAN', 'key', '0', 'COUNT', '1'] @@ -31,7 +31,7 @@ describe('ZSCAN', () => { it('with MATCH & COUNT', () => { assert.deepEqual( - ZSCAN.transformArguments('key', 0, { + ZSCAN.transformArguments('key', '0', { MATCH: 'pattern', COUNT: 1 }), @@ -42,9 +42,9 @@ describe('ZSCAN', () => { testUtils.testWithClient('zScan', async client => { assert.deepEqual( - await client.zScan('key', 0), + await client.zScan('key', '0'), { - cursor: 0, + cursor: '0', members: [] } ); diff --git a/packages/client/lib/commands/ZSCAN.ts b/packages/client/lib/commands/ZSCAN.ts index 1938e67da2..68186afc0e 100644 --- a/packages/client/lib/commands/ZSCAN.ts +++ b/packages/client/lib/commands/ZSCAN.ts @@ -12,14 +12,14 @@ export default { IS_READ_ONLY: true, transformArguments( key: RedisArgument, - cursor: number, + cursor: RedisArgument, options?: ScanCommonOptions ) { return pushScanArguments(['ZSCAN', key], cursor, options); }, transformReply([cursor, rawMembers]: [BlobStringReply, ArrayReply]) { return { - cursor: Number(cursor), + cursor, members: transformSortedSetReply[2](rawMembers) }; }