You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
V5 bringing RESP3, Sentinel and TypeMapping to node-redis
RESP3 Support - Some commands responses in RESP3 aren't stable yet and therefore return an "untyped" ReplyUnion. Sentinel TypeMapping Correctly types Multi commands Note: some API changes to be further documented in v4-to-v5.md
This commit is contained in:
12
packages/client/lib/sentinel/commands/SENTINEL_MASTER.ts
Normal file
12
packages/client/lib/sentinel/commands/SENTINEL_MASTER.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { RedisArgument, MapReply, BlobStringReply, Command } from '../../RESP/types';
|
||||
import { transformTuplesReply } from '../../commands/generic-transformers';
|
||||
|
||||
export default {
|
||||
transformArguments(dbname: RedisArgument) {
|
||||
return ['SENTINEL', 'MASTER', dbname];
|
||||
},
|
||||
transformReply: {
|
||||
2: transformTuplesReply<BlobStringReply>,
|
||||
3: undefined as unknown as () => MapReply<BlobStringReply, BlobStringReply>
|
||||
}
|
||||
} as const satisfies Command;
|
@@ -0,0 +1,8 @@
|
||||
import { RedisArgument, SimpleStringReply, Command } from '../../RESP/types';
|
||||
|
||||
export default {
|
||||
transformArguments(dbname: RedisArgument, host: RedisArgument, port: RedisArgument, quorum: RedisArgument) {
|
||||
return ['SENTINEL', 'MONITOR', dbname, host, port, quorum];
|
||||
},
|
||||
transformReply: undefined as unknown as () => SimpleStringReply<'OK'>
|
||||
} as const satisfies Command;
|
23
packages/client/lib/sentinel/commands/SENTINEL_REPLICAS.ts
Normal file
23
packages/client/lib/sentinel/commands/SENTINEL_REPLICAS.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { RedisArgument, ArrayReply, BlobStringReply, MapReply, Command, TypeMapping, UnwrapReply } from '../../RESP/types';
|
||||
import { transformTuplesReply } from '../../commands/generic-transformers';
|
||||
|
||||
export default {
|
||||
transformArguments(dbname: RedisArgument) {
|
||||
return ['SENTINEL', 'REPLICAS', dbname];
|
||||
},
|
||||
transformReply: {
|
||||
2: (reply: ArrayReply<ArrayReply<BlobStringReply>>, preserve?: any, typeMapping?: TypeMapping) => {
|
||||
const inferred = reply as unknown as UnwrapReply<typeof reply>;
|
||||
const initial: Array<MapReply<BlobStringReply, BlobStringReply>> = [];
|
||||
|
||||
return inferred.reduce(
|
||||
(sentinels: Array<MapReply<BlobStringReply, BlobStringReply>>, x: ArrayReply<BlobStringReply>) => {
|
||||
sentinels.push(transformTuplesReply(x, undefined, typeMapping));
|
||||
return sentinels;
|
||||
},
|
||||
initial
|
||||
);
|
||||
},
|
||||
3: undefined as unknown as () => ArrayReply<MapReply<BlobStringReply, BlobStringReply>>
|
||||
}
|
||||
} as const satisfies Command;
|
23
packages/client/lib/sentinel/commands/SENTINEL_SENTINELS.ts
Normal file
23
packages/client/lib/sentinel/commands/SENTINEL_SENTINELS.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { RedisArgument, ArrayReply, MapReply, BlobStringReply, Command, TypeMapping, UnwrapReply } from '../../RESP/types';
|
||||
import { transformTuplesReply } from '../../commands/generic-transformers';
|
||||
|
||||
export default {
|
||||
transformArguments(dbname: RedisArgument) {
|
||||
return ['SENTINEL', 'SENTINELS', dbname];
|
||||
},
|
||||
transformReply: {
|
||||
2: (reply: ArrayReply<ArrayReply<BlobStringReply>>, preserve?: any, typeMapping?: TypeMapping) => {
|
||||
const inferred = reply as unknown as UnwrapReply<typeof reply>;
|
||||
const initial: Array<MapReply<BlobStringReply, BlobStringReply>> = [];
|
||||
|
||||
return inferred.reduce(
|
||||
(sentinels: Array<MapReply<BlobStringReply, BlobStringReply>>, x: ArrayReply<BlobStringReply>) => {
|
||||
sentinels.push(transformTuplesReply(x, undefined, typeMapping));
|
||||
return sentinels;
|
||||
},
|
||||
initial
|
||||
);
|
||||
},
|
||||
3: undefined as unknown as () => ArrayReply<MapReply<BlobStringReply, BlobStringReply>>
|
||||
}
|
||||
} as const satisfies Command;
|
19
packages/client/lib/sentinel/commands/SENTINEL_SET.ts
Normal file
19
packages/client/lib/sentinel/commands/SENTINEL_SET.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { RedisArgument, SimpleStringReply, Command } from '../../RESP/types';
|
||||
|
||||
export type SentinelSetOptions = Array<{
|
||||
option: RedisArgument;
|
||||
value: RedisArgument;
|
||||
}>;
|
||||
|
||||
export default {
|
||||
transformArguments(dbname: RedisArgument, options: SentinelSetOptions) {
|
||||
const args = ['SENTINEL', 'SET', dbname];
|
||||
|
||||
for (const option of options) {
|
||||
args.push(option.option, option.value);
|
||||
}
|
||||
|
||||
return args;
|
||||
},
|
||||
transformReply: undefined as unknown as () => SimpleStringReply<'OK'>
|
||||
} as const satisfies Command;
|
19
packages/client/lib/sentinel/commands/index.ts
Normal file
19
packages/client/lib/sentinel/commands/index.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { RedisCommands } from '../../RESP/types';
|
||||
import SENTINEL_MASTER from './SENTINEL_MASTER';
|
||||
import SENTINEL_MONITOR from './SENTINEL_MONITOR';
|
||||
import SENTINEL_REPLICAS from './SENTINEL_REPLICAS';
|
||||
import SENTINEL_SENTINELS from './SENTINEL_SENTINELS';
|
||||
import SENTINEL_SET from './SENTINEL_SET';
|
||||
|
||||
export default {
|
||||
SENTINEL_SENTINELS,
|
||||
sentinelSentinels: SENTINEL_SENTINELS,
|
||||
SENTINEL_MASTER,
|
||||
sentinelMaster: SENTINEL_MASTER,
|
||||
SENTINEL_REPLICAS,
|
||||
sentinelReplicas: SENTINEL_REPLICAS,
|
||||
SENTINEL_MONITOR,
|
||||
sentinelMonitor: SENTINEL_MONITOR,
|
||||
SENTINEL_SET,
|
||||
sentinelSet: SENTINEL_SET
|
||||
} as const satisfies RedisCommands;
|
Reference in New Issue
Block a user