1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-04 15:02:09 +03:00

fix #1914 - CLIENT TRACKING (#2126)

This commit is contained in:
Leibale Eidelman
2022-05-12 12:56:09 -04:00
committed by GitHub
parent 429b11e020
commit d8db974980
3 changed files with 187 additions and 0 deletions

View File

@@ -0,0 +1,101 @@
import { strict as assert } from 'assert';
import testUtils, { GLOBAL } from '../test-utils';
import { transformArguments } from './CLIENT_TRACKING';
describe('CLIENT TRACKING', () => {
testUtils.isVersionGreaterThanHook([6]);
describe('transformArguments', () => {
describe('true', () => {
it('simple', () => {
assert.deepEqual(
transformArguments(true),
['CLIENT', 'TRACKING', 'ON']
);
});
it('with REDIRECT', () => {
assert.deepEqual(
transformArguments(true, {
REDIRECT: 1
}),
['CLIENT', 'TRACKING', 'ON', 'REDIRECT', '1']
);
});
describe('with BCAST', () => {
it('simple', () => {
assert.deepEqual(
transformArguments(true, {
BCAST: true
}),
['CLIENT', 'TRACKING', 'ON', 'BCAST']
);
});
describe('with PREFIX', () => {
it('string', () => {
assert.deepEqual(
transformArguments(true, {
BCAST: true,
PREFIX: 'prefix'
}),
['CLIENT', 'TRACKING', 'ON', 'BCAST', 'PREFIX', 'prefix']
);
});
it('array', () => {
assert.deepEqual(
transformArguments(true, {
BCAST: true,
PREFIX: ['1', '2']
}),
['CLIENT', 'TRACKING', 'ON', 'BCAST', 'PREFIX', '1', 'PREFIX', '2']
);
});
});
});
it('with OPTIN', () => {
assert.deepEqual(
transformArguments(true, {
OPTIN: true
}),
['CLIENT', 'TRACKING', 'ON', 'OPTIN']
);
});
it('with OPTOUT', () => {
assert.deepEqual(
transformArguments(true, {
OPTOUT: true
}),
['CLIENT', 'TRACKING', 'ON', 'OPTOUT']
);
});
it('with NOLOOP', () => {
assert.deepEqual(
transformArguments(true, {
NOLOOP: true
}),
['CLIENT', 'TRACKING', 'ON', 'NOLOOP']
);
});
});
it('false', () => {
assert.deepEqual(
transformArguments(false),
['CLIENT', 'TRACKING', 'OFF']
);
});
});
testUtils.testWithClient('client.clientTracking', async client => {
assert.equal(
await client.clientTracking(false),
'OK'
);
}, GLOBAL.SERVERS.OPEN);
});

View File

@@ -0,0 +1,83 @@
import { RedisCommandArgument, RedisCommandArguments } from '.';
interface CommonOptions {
REDIRECT?: number;
NOLOOP?: boolean;
}
interface BroadcastOptions {
BCAST?: boolean;
PREFIX?: RedisCommandArgument | Array<RedisCommandArgument>;
}
interface OptInOptions {
OPTIN?: boolean;
}
interface OptOutOptions {
OPTOUT?: boolean;
}
type ClientTrackingOptions = CommonOptions & (
BroadcastOptions |
OptInOptions |
OptOutOptions
);
export function transformArguments<M extends boolean>(
mode: M,
options?: M extends true ? ClientTrackingOptions : undefined
): RedisCommandArguments {
const args: RedisCommandArguments = [
'CLIENT',
'TRACKING',
mode ? 'ON' : 'OFF'
];
if (mode) {
if (options?.REDIRECT) {
args.push(
'REDIRECT',
options.REDIRECT.toString()
);
}
if (isBroadcast(options)) {
args.push('BCAST');
if (options?.PREFIX) {
if (Array.isArray(options.PREFIX)) {
for (const prefix of options.PREFIX) {
args.push('PREFIX', prefix);
}
} else {
args.push('PREFIX', options.PREFIX);
}
}
} else if (isOptIn(options)) {
args.push('OPTIN');
} else if (isOptOut(options)) {
args.push('OPTOUT');
}
if (options?.NOLOOP) {
args.push('NOLOOP');
}
}
return args;
}
function isBroadcast(options?: ClientTrackingOptions): options is BroadcastOptions {
return (options as BroadcastOptions)?.BCAST === true;
}
function isOptIn(options?: ClientTrackingOptions): options is OptInOptions {
return (options as OptInOptions)?.OPTIN === true;
}
function isOptOut(options?: ClientTrackingOptions): options is OptOutOptions {
return (options as OptOutOptions)?.OPTOUT === true;
}
export declare function transformReply(): 'OK' | Buffer;