From c9dae346a295030adc10c46d1b7bf26bc4b46bc5 Mon Sep 17 00:00:00 2001 From: Leibale Date: Wed, 19 Jul 2023 13:59:44 -0400 Subject: [PATCH] ref #2565 - handle null message in `XAUTOCLAIM` --- .../client/lib/commands/XAUTOCLAIM.spec.ts | 23 +++++++++++++------ packages/client/lib/commands/XAUTOCLAIM.ts | 10 ++++---- .../lib/commands/generic-transformers.ts | 6 ++++- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/packages/client/lib/commands/XAUTOCLAIM.spec.ts b/packages/client/lib/commands/XAUTOCLAIM.spec.ts index bb4b1d6594..5efdc4f115 100644 --- a/packages/client/lib/commands/XAUTOCLAIM.spec.ts +++ b/packages/client/lib/commands/XAUTOCLAIM.spec.ts @@ -2,7 +2,7 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL } from '../test-utils'; import XAUTOCLAIM from './XAUTOCLAIM'; -describe('XAUTOCLAIM', () => { +describe.only('XAUTOCLAIM', () => { testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { @@ -31,26 +31,35 @@ describe('XAUTOCLAIM', () => { } }); - const [, , id, , reply] = await Promise.all([ + const [, , id1, id2, , , reply] = await Promise.all([ client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }), client.xGroupCreateConsumer('key', 'group', 'consumer'), client.xAdd('key', '*', message), + client.xAdd('key', '*', message), client.xReadGroup('group', 'consumer', { key: 'key', id: '>' }), + client.xTrim('key', 'MAXLEN', 1), client.xAutoClaim('key', 'group', 'consumer', 0, '0-0') ]); assert.deepEqual(reply, { nextId: '0-0', - messages: [{ - id, - message - }], - deletedMessages: testUtils.isVersionGreaterThan([7, 0]) ? [] : undefined + ...(testUtils.isVersionGreaterThan([7, 0]) ? { + messages: [{ + id: id2, + message + }], + deletedMessages: [id1] + } : { + messages: [null, { + id: id2, + message + }] + }) }); }, { client: GLOBAL.SERVERS.OPEN, diff --git a/packages/client/lib/commands/XAUTOCLAIM.ts b/packages/client/lib/commands/XAUTOCLAIM.ts index 4c78aa1231..1fcd1cf32d 100644 --- a/packages/client/lib/commands/XAUTOCLAIM.ts +++ b/packages/client/lib/commands/XAUTOCLAIM.ts @@ -1,5 +1,5 @@ -import { RedisArgument, TuplesReply, BlobStringReply, ArrayReply, UnwrapReply, Command } from '../RESP/types'; -import { StreamMessagesRawReply, transformStreamMessagesReply } from './generic-transformers'; +import { RedisArgument, TuplesReply, BlobStringReply, ArrayReply, NullReply, UnwrapReply, Command } from '../RESP/types'; +import { StreamMessageRawReply, isNullReply, transformStreamMessageReply } from './generic-transformers'; export interface XAutoClaimOptions { COUNT?: number; @@ -7,7 +7,7 @@ export interface XAutoClaimOptions { export type XAutoClaimRawReply = TuplesReply<[ nextId: BlobStringReply, - messages: StreamMessagesRawReply, + messages: ArrayReply, deletedMessages: ArrayReply ]>; @@ -40,7 +40,9 @@ export default { transformReply(reply: UnwrapReply) { return { nextId: reply[0], - messages: transformStreamMessagesReply(reply[1]), + messages: (reply[1] as unknown as UnwrapReply).map(message => { + return isNullReply(message) ? null : transformStreamMessageReply(message); + }), deletedMessages: reply[2] }; } diff --git a/packages/client/lib/commands/generic-transformers.ts b/packages/client/lib/commands/generic-transformers.ts index 017b1922ad..3c51100cc7 100644 --- a/packages/client/lib/commands/generic-transformers.ts +++ b/packages/client/lib/commands/generic-transformers.ts @@ -1,4 +1,8 @@ -import { UnwrapReply, ArrayReply, BlobStringReply, BooleanReply, CommandArguments, DoubleReply, MapReply, NullReply, NumberReply, RedisArgument, TuplesReply } from '../RESP/types'; +import { UnwrapReply, ArrayReply, BlobStringReply, BooleanReply, CommandArguments, DoubleReply, MapReply, NullReply, NumberReply, RedisArgument, TuplesReply, RespType } from '../RESP/types'; + +export function isNullReply(reply: unknown): reply is NullReply { + return reply === null; +} export const transformBooleanReply = { 2: (reply: NumberReply<0 | 1>) => reply as unknown as UnwrapReply === 1,