You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
Merge branch 'master' of github.com:redis/node-redis into v5
This commit is contained in:
30
packages/client/lib/commands/CLIENT_NO-TOUCH.spec.ts
Normal file
30
packages/client/lib/commands/CLIENT_NO-TOUCH.spec.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import testUtils, { GLOBAL } from '../test-utils';
|
||||
import { transformArguments } from './CLIENT_NO-TOUCH';
|
||||
|
||||
describe('CLIENT NO-TOUCH', () => {
|
||||
testUtils.isVersionGreaterThanHook([7, 2]);
|
||||
|
||||
describe('transformArguments', () => {
|
||||
it('true', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments(true),
|
||||
['CLIENT', 'NO-TOUCH', 'ON']
|
||||
);
|
||||
});
|
||||
|
||||
it('false', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments(false),
|
||||
['CLIENT', 'NO-TOUCH', 'OFF']
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
testUtils.testWithClient('client.clientNoTouch', async client => {
|
||||
assert.equal(
|
||||
await client.clientNoTouch(true),
|
||||
'OK'
|
||||
);
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
});
|
11
packages/client/lib/commands/CLIENT_NO-TOUCH.ts
Normal file
11
packages/client/lib/commands/CLIENT_NO-TOUCH.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { RedisCommandArguments } from '.';
|
||||
|
||||
export function transformArguments(value: boolean): RedisCommandArguments {
|
||||
return [
|
||||
'CLIENT',
|
||||
'NO-TOUCH',
|
||||
value ? 'ON' : 'OFF'
|
||||
];
|
||||
}
|
||||
|
||||
export declare function transformReply(): 'OK' | Buffer;
|
22
packages/client/lib/commands/CLUSTER_MYSHARDID.spec.ts
Normal file
22
packages/client/lib/commands/CLUSTER_MYSHARDID.spec.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import testUtils, { GLOBAL } from '../test-utils';
|
||||
import { transformArguments } from './CLUSTER_MYSHARDID';
|
||||
|
||||
describe('CLUSTER MYSHARDID', () => {
|
||||
testUtils.isVersionGreaterThanHook([7, 2]);
|
||||
|
||||
it('transformArguments', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments(),
|
||||
['CLUSTER', 'MYSHARDID']
|
||||
);
|
||||
});
|
||||
|
||||
testUtils.testWithCluster('clusterNode.clusterMyShardId', async cluster => {
|
||||
const client = await cluster.nodeClient(cluster.masters[0]);
|
||||
assert.equal(
|
||||
typeof await client.clusterMyShardId(),
|
||||
'string'
|
||||
);
|
||||
}, GLOBAL.CLUSTERS.OPEN);
|
||||
});
|
7
packages/client/lib/commands/CLUSTER_MYSHARDID.ts
Normal file
7
packages/client/lib/commands/CLUSTER_MYSHARDID.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export const IS_READ_ONLY = true;
|
||||
|
||||
export function transformArguments() {
|
||||
return ['CLUSTER', 'MYSHARDID'];
|
||||
}
|
||||
|
||||
export declare function transformReply(): string | Buffer;
|
26
packages/client/lib/commands/LATENCY_HISTORY.spec.ts
Normal file
26
packages/client/lib/commands/LATENCY_HISTORY.spec.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import {strict as assert} from 'assert';
|
||||
import testUtils, {GLOBAL} from '../test-utils';
|
||||
import { transformArguments } from './LATENCY_HISTORY';
|
||||
|
||||
describe('LATENCY HISTORY', () => {
|
||||
it('transformArguments', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('command'),
|
||||
['LATENCY', 'HISTORY', 'command']
|
||||
);
|
||||
});
|
||||
|
||||
testUtils.testWithClient('client.latencyHistory', async client => {
|
||||
await Promise.all([
|
||||
client.configSet('latency-monitor-threshold', '100'),
|
||||
client.sendCommand(['DEBUG', 'SLEEP', '1'])
|
||||
]);
|
||||
|
||||
const latencyHisRes = await client.latencyHistory('command');
|
||||
assert.ok(Array.isArray(latencyHisRes));
|
||||
for (const [timestamp, latency] of latencyHisRes) {
|
||||
assert.equal(typeof timestamp, 'number');
|
||||
assert.equal(typeof latency, 'number');
|
||||
}
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
});
|
27
packages/client/lib/commands/LATENCY_HISTORY.ts
Normal file
27
packages/client/lib/commands/LATENCY_HISTORY.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
export type EventType = (
|
||||
'active-defrag-cycle' |
|
||||
'aof-fsync-always' |
|
||||
'aof-stat' |
|
||||
'aof-rewrite-diff-write' |
|
||||
'aof-rename' |
|
||||
'aof-write' |
|
||||
'aof-write-active-child' |
|
||||
'aof-write-alone' |
|
||||
'aof-write-pending-fsync' |
|
||||
'command' |
|
||||
'expire-cycle' |
|
||||
'eviction-cycle' |
|
||||
'eviction-del' |
|
||||
'fast-command' |
|
||||
'fork' |
|
||||
'rdb-unlink-temp-file'
|
||||
);
|
||||
|
||||
export function transformArguments(event: EventType) {
|
||||
return ['LATENCY', 'HISTORY', event];
|
||||
}
|
||||
|
||||
export declare function transformReply(): Array<[
|
||||
timestamp: number,
|
||||
latency: number,
|
||||
]>;
|
48
packages/client/lib/commands/PUBSUB_SHARDNUMSUB.spec.ts
Normal file
48
packages/client/lib/commands/PUBSUB_SHARDNUMSUB.spec.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import testUtils, { GLOBAL } from '../test-utils';
|
||||
import { transformArguments } from './PUBSUB_SHARDNUMSUB';
|
||||
|
||||
describe('PUBSUB SHARDNUMSUB', () => {
|
||||
testUtils.isVersionGreaterThanHook([7]);
|
||||
|
||||
describe('transformArguments', () => {
|
||||
it('simple', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments(),
|
||||
['PUBSUB', 'SHARDNUMSUB']
|
||||
);
|
||||
});
|
||||
|
||||
it('string', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('channel'),
|
||||
['PUBSUB', 'SHARDNUMSUB', 'channel']
|
||||
);
|
||||
});
|
||||
|
||||
it('array', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments(['1', '2']),
|
||||
['PUBSUB', 'SHARDNUMSUB', '1', '2']
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
testUtils.testWithClient('client.pubSubShardNumSub', async client => {
|
||||
assert.deepEqual(
|
||||
await client.pubSubShardNumSub(['foo', 'bar']),
|
||||
Object.create(null, {
|
||||
foo: {
|
||||
value: 0,
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
},
|
||||
bar: {
|
||||
value: 0,
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
}
|
||||
})
|
||||
);
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
});
|
24
packages/client/lib/commands/PUBSUB_SHARDNUMSUB.ts
Normal file
24
packages/client/lib/commands/PUBSUB_SHARDNUMSUB.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { pushVerdictArguments } from './generic-transformers';
|
||||
import { RedisCommandArgument, RedisCommandArguments } from '.';
|
||||
|
||||
export const IS_READ_ONLY = true;
|
||||
|
||||
export function transformArguments(
|
||||
channels?: Array<RedisCommandArgument> | RedisCommandArgument
|
||||
): RedisCommandArguments {
|
||||
const args = ['PUBSUB', 'SHARDNUMSUB'];
|
||||
|
||||
if (channels) return pushVerdictArguments(args, channels);
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
export function transformReply(rawReply: Array<string | number>): Record<string, number> {
|
||||
const transformedReply = Object.create(null);
|
||||
|
||||
for (let i = 0; i < rawReply.length; i += 2) {
|
||||
transformedReply[rawReply[i]] = rawReply[i + 1];
|
||||
}
|
||||
|
||||
return transformedReply;
|
||||
}
|
74
packages/client/lib/commands/RESTORE.spec.ts
Normal file
74
packages/client/lib/commands/RESTORE.spec.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import testUtils, { GLOBAL } from '../test-utils';
|
||||
import { transformArguments } from './RESTORE';
|
||||
|
||||
describe('RESTORE', () => {
|
||||
describe('transformArguments', () => {
|
||||
it('simple', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('key', 0, 'value'),
|
||||
['RESTORE', 'key', '0', 'value']
|
||||
);
|
||||
});
|
||||
|
||||
it('with REPLACE', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('key', 0, 'value', {
|
||||
REPLACE: true
|
||||
}),
|
||||
['RESTORE', 'key', '0', 'value', 'REPLACE']
|
||||
);
|
||||
});
|
||||
|
||||
it('with ABSTTL', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('key', 0, 'value', {
|
||||
ABSTTL: true
|
||||
}),
|
||||
['RESTORE', 'key', '0', 'value', 'ABSTTL']
|
||||
);
|
||||
});
|
||||
|
||||
it('with IDLETIME', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('key', 0, 'value', {
|
||||
IDLETIME: 1
|
||||
}),
|
||||
['RESTORE', 'key', '0', 'value', 'IDLETIME', '1']
|
||||
);
|
||||
});
|
||||
|
||||
it('with FREQ', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('key', 0, 'value', {
|
||||
FREQ: 1
|
||||
}),
|
||||
['RESTORE', 'key', '0', 'value', 'FREQ', '1']
|
||||
);
|
||||
});
|
||||
|
||||
it('with REPLACE, ABSTTL, IDLETIME and FREQ', () => {
|
||||
assert.deepEqual(
|
||||
transformArguments('key', 0, 'value', {
|
||||
REPLACE: true,
|
||||
ABSTTL: true,
|
||||
IDLETIME: 1,
|
||||
FREQ: 2
|
||||
}),
|
||||
['RESTORE', 'key', '0', 'value', 'REPLACE', 'ABSTTL', 'IDLETIME', '1', 'FREQ', '2']
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
testUtils.testWithClient('client.restore', async client => {
|
||||
const [, dump] = await Promise.all([
|
||||
client.set('source', 'value'),
|
||||
client.dump(client.commandOptions({ returnBuffers: true }), 'source')
|
||||
]);
|
||||
|
||||
assert.equal(
|
||||
await client.restore('destination', 0, dump),
|
||||
'OK'
|
||||
);
|
||||
}, GLOBAL.SERVERS.OPEN);
|
||||
});
|
39
packages/client/lib/commands/RESTORE.ts
Normal file
39
packages/client/lib/commands/RESTORE.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { RedisCommandArgument, RedisCommandArguments } from '.';
|
||||
|
||||
export const FIRST_KEY_INDEX = 1;
|
||||
|
||||
interface RestoreOptions {
|
||||
REPLACE?: true;
|
||||
ABSTTL?: true;
|
||||
IDLETIME?: number;
|
||||
FREQ?: number;
|
||||
}
|
||||
|
||||
export function transformArguments(
|
||||
key: RedisCommandArgument,
|
||||
ttl: number,
|
||||
serializedValue: RedisCommandArgument,
|
||||
options?: RestoreOptions
|
||||
): RedisCommandArguments {
|
||||
const args = ['RESTORE', key, ttl.toString(), serializedValue];
|
||||
|
||||
if (options?.REPLACE) {
|
||||
args.push('REPLACE');
|
||||
}
|
||||
|
||||
if (options?.ABSTTL) {
|
||||
args.push('ABSTTL');
|
||||
}
|
||||
|
||||
if (options?.IDLETIME) {
|
||||
args.push('IDLETIME', options.IDLETIME.toString());
|
||||
}
|
||||
|
||||
if (options?.FREQ) {
|
||||
args.push('FREQ', options.FREQ.toString());
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
export declare function transformReply(): 'OK';
|
Reference in New Issue
Block a user