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:
@@ -1,24 +1,119 @@
|
||||
import { RedisCommandArguments } from '@redis/client/dist/lib/commands';
|
||||
import { RangeOptions, Timestamp, pushRangeArguments, SampleRawReply, SampleReply, transformRangeReply } from '.';
|
||||
import { CommandArguments, RedisArgument, Command } from '@redis/client/dist/lib/RESP/types';
|
||||
import { Timestamp, transformTimestampArgument, SamplesRawReply, transformSamplesReply } from '.';
|
||||
import { TimeSeriesAggregationType } from './CREATERULE';
|
||||
import { Resp2Reply } from '@redis/client/dist/lib/RESP/types';
|
||||
|
||||
export const FIRST_KEY_INDEX = 1;
|
||||
export const TIME_SERIES_BUCKET_TIMESTAMP = {
|
||||
LOW: '-',
|
||||
MIDDLE: '~',
|
||||
END: '+'
|
||||
};
|
||||
|
||||
export const IS_READ_ONLY = true;
|
||||
export type TimeSeriesBucketTimestamp = typeof TIME_SERIES_BUCKET_TIMESTAMP[keyof typeof TIME_SERIES_BUCKET_TIMESTAMP];
|
||||
|
||||
export function transformArguments(
|
||||
key: string,
|
||||
fromTimestamp: Timestamp,
|
||||
toTimestamp: Timestamp,
|
||||
options?: RangeOptions
|
||||
): RedisCommandArguments {
|
||||
return pushRangeArguments(
|
||||
['TS.RANGE', key],
|
||||
fromTimestamp,
|
||||
toTimestamp,
|
||||
options
|
||||
export interface TsRangeOptions {
|
||||
LATEST?: boolean;
|
||||
FILTER_BY_TS?: Array<Timestamp>;
|
||||
FILTER_BY_VALUE?: {
|
||||
min: number;
|
||||
max: number;
|
||||
};
|
||||
COUNT?: number;
|
||||
ALIGN?: Timestamp;
|
||||
AGGREGATION?: {
|
||||
ALIGN?: Timestamp;
|
||||
type: TimeSeriesAggregationType;
|
||||
timeBucket: Timestamp;
|
||||
BUCKETTIMESTAMP?: TimeSeriesBucketTimestamp;
|
||||
EMPTY?: boolean;
|
||||
};
|
||||
}
|
||||
|
||||
export function pushRangeArguments(
|
||||
args: CommandArguments,
|
||||
fromTimestamp: Timestamp,
|
||||
toTimestamp: Timestamp,
|
||||
options?: TsRangeOptions
|
||||
) {
|
||||
args.push(
|
||||
transformTimestampArgument(fromTimestamp),
|
||||
transformTimestampArgument(toTimestamp)
|
||||
);
|
||||
|
||||
if (options?.LATEST) {
|
||||
args.push('LATEST');
|
||||
}
|
||||
|
||||
if (options?.FILTER_BY_TS) {
|
||||
args.push('FILTER_BY_TS');
|
||||
for (const timestamp of options.FILTER_BY_TS) {
|
||||
args.push(transformTimestampArgument(timestamp));
|
||||
}
|
||||
}
|
||||
|
||||
if (options?.FILTER_BY_VALUE) {
|
||||
args.push(
|
||||
'FILTER_BY_VALUE',
|
||||
options.FILTER_BY_VALUE.min.toString(),
|
||||
options.FILTER_BY_VALUE.max.toString()
|
||||
);
|
||||
}
|
||||
|
||||
if (options?.COUNT !== undefined) {
|
||||
args.push('COUNT', options.COUNT.toString());
|
||||
}
|
||||
|
||||
if (options?.AGGREGATION) {
|
||||
if (options?.ALIGN !== undefined) {
|
||||
args.push('ALIGN', transformTimestampArgument(options.ALIGN));
|
||||
}
|
||||
|
||||
args.push(
|
||||
'AGGREGATION',
|
||||
options.AGGREGATION.type,
|
||||
transformTimestampArgument(options.AGGREGATION.timeBucket)
|
||||
);
|
||||
|
||||
if (options.AGGREGATION.BUCKETTIMESTAMP) {
|
||||
args.push(
|
||||
'BUCKETTIMESTAMP',
|
||||
options.AGGREGATION.BUCKETTIMESTAMP
|
||||
);
|
||||
}
|
||||
|
||||
if (options.AGGREGATION.EMPTY) {
|
||||
args.push('EMPTY');
|
||||
}
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
export function transformReply(reply: Array<SampleRawReply>): Array<SampleReply> {
|
||||
return transformRangeReply(reply);
|
||||
export function transformRangeArguments(
|
||||
command: RedisArgument,
|
||||
key: RedisArgument,
|
||||
fromTimestamp: Timestamp,
|
||||
toTimestamp: Timestamp,
|
||||
options?: TsRangeOptions
|
||||
) {
|
||||
return pushRangeArguments(
|
||||
[command, key],
|
||||
fromTimestamp,
|
||||
toTimestamp,
|
||||
options
|
||||
);
|
||||
}
|
||||
|
||||
export default {
|
||||
FIRST_KEY_INDEX: 1,
|
||||
IS_READ_ONLY: true,
|
||||
transformArguments: transformRangeArguments.bind(undefined, 'TS.RANGE'),
|
||||
transformReply: {
|
||||
2(reply: Resp2Reply<SamplesRawReply>) {
|
||||
return transformSamplesReply[2](reply);
|
||||
},
|
||||
3(reply: SamplesRawReply) {
|
||||
return transformSamplesReply[3](reply);
|
||||
}
|
||||
}
|
||||
} as const satisfies Command;
|
||||
|
Reference in New Issue
Block a user