You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-03 04:01:40 +03:00
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
686 lines
20 KiB
TypeScript
686 lines
20 KiB
TypeScript
// import { strict as assert } from 'node:assert';
|
|
// import {
|
|
// transformBooleanReply,
|
|
// transformBooleanArrayReply,
|
|
// pushScanArguments,
|
|
// transformNumberInfinityReply,
|
|
// transformNumberInfinityNullReply,
|
|
// transformNumberInfinityArgument,
|
|
// transformStringNumberInfinityArgument,
|
|
// transformTuplesReply,
|
|
// transformStreamMessagesReply,
|
|
// transformStreamsMessagesReply,
|
|
// transformSortedSetWithScoresReply,
|
|
// pushGeoCountArgument,
|
|
// pushGeoSearchArguments,
|
|
// GeoReplyWith,
|
|
// transformGeoMembersWithReply,
|
|
// transformEXAT,
|
|
// transformPXAT,
|
|
// pushEvalArguments,
|
|
// pushVariadicArguments,
|
|
// pushVariadicNumberArguments,
|
|
// pushVariadicArgument,
|
|
// pushOptionalVariadicArgument,
|
|
// transformCommandReply,
|
|
// CommandFlags,
|
|
// CommandCategories,
|
|
// pushSlotRangesArguments
|
|
// } from './generic-transformers';
|
|
|
|
// describe('Generic Transformers', () => {
|
|
// describe('transformBooleanReply', () => {
|
|
// it('0', () => {
|
|
// assert.equal(
|
|
// transformBooleanReply(0),
|
|
// false
|
|
// );
|
|
// });
|
|
|
|
// it('1', () => {
|
|
// assert.equal(
|
|
// transformBooleanReply(1),
|
|
// true
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformBooleanArrayReply', () => {
|
|
// it('empty array', () => {
|
|
// assert.deepEqual(
|
|
// transformBooleanArrayReply([]),
|
|
// []
|
|
// );
|
|
// });
|
|
|
|
// it('0, 1', () => {
|
|
// assert.deepEqual(
|
|
// transformBooleanArrayReply([0, 1]),
|
|
// [false, true]
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('pushScanArguments', () => {
|
|
// it('cusror only', () => {
|
|
// assert.deepEqual(
|
|
// pushScanArguments([], 0),
|
|
// ['0']
|
|
// );
|
|
// });
|
|
|
|
// it('with MATCH', () => {
|
|
// assert.deepEqual(
|
|
// pushScanArguments([], 0, {
|
|
// MATCH: 'pattern'
|
|
// }),
|
|
// ['0', 'MATCH', 'pattern']
|
|
// );
|
|
// });
|
|
|
|
// it('with COUNT', () => {
|
|
// assert.deepEqual(
|
|
// pushScanArguments([], 0, {
|
|
// COUNT: 1
|
|
// }),
|
|
// ['0', 'COUNT', '1']
|
|
// );
|
|
// });
|
|
|
|
// it('with MATCH & COUNT', () => {
|
|
// assert.deepEqual(
|
|
// pushScanArguments([], 0, {
|
|
// MATCH: 'pattern',
|
|
// COUNT: 1
|
|
// }),
|
|
// ['0', 'MATCH', 'pattern', 'COUNT', '1']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformNumberInfinityReply', () => {
|
|
// it('0.5', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityReply('0.5'),
|
|
// 0.5
|
|
// );
|
|
// });
|
|
|
|
// it('+inf', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityReply('+inf'),
|
|
// Infinity
|
|
// );
|
|
// });
|
|
|
|
// it('-inf', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityReply('-inf'),
|
|
// -Infinity
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformNumberInfinityNullReply', () => {
|
|
// it('null', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityNullReply(null),
|
|
// null
|
|
// );
|
|
// });
|
|
|
|
// it('1', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityNullReply('1'),
|
|
// 1
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformNumberInfinityArgument', () => {
|
|
// it('0.5', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityArgument(0.5),
|
|
// '0.5'
|
|
// );
|
|
// });
|
|
|
|
// it('Infinity', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityArgument(Infinity),
|
|
// '+inf'
|
|
// );
|
|
// });
|
|
|
|
// it('-Infinity', () => {
|
|
// assert.equal(
|
|
// transformNumberInfinityArgument(-Infinity),
|
|
// '-inf'
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformStringNumberInfinityArgument', () => {
|
|
// it("'0.5'", () => {
|
|
// assert.equal(
|
|
// transformStringNumberInfinityArgument('0.5'),
|
|
// '0.5'
|
|
// );
|
|
// });
|
|
|
|
// it('0.5', () => {
|
|
// assert.equal(
|
|
// transformStringNumberInfinityArgument(0.5),
|
|
// '0.5'
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// it('transformTuplesReply', () => {
|
|
// assert.deepEqual(
|
|
// transformTuplesReply(['key1', 'value1', 'key2', 'value2']),
|
|
// Object.create(null, {
|
|
// key1: {
|
|
// value: 'value1',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// },
|
|
// key2: {
|
|
// value: 'value2',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// }
|
|
// })
|
|
// );
|
|
// });
|
|
|
|
// it('transformStreamMessagesReply', () => {
|
|
// assert.deepEqual(
|
|
// transformStreamMessagesReply([['0-0', ['0key', '0value']], ['1-0', ['1key', '1value']]]),
|
|
// [{
|
|
// id: '0-0',
|
|
// message: Object.create(null, {
|
|
// '0key': {
|
|
// value: '0value',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// }
|
|
// })
|
|
// }, {
|
|
// id: '1-0',
|
|
// message: Object.create(null, {
|
|
// '1key': {
|
|
// value: '1value',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// }
|
|
// })
|
|
// }]
|
|
// );
|
|
// });
|
|
|
|
// describe('transformStreamsMessagesReply', () => {
|
|
// it('null', () => {
|
|
// assert.equal(
|
|
// transformStreamsMessagesReply(null),
|
|
// null
|
|
// );
|
|
// });
|
|
|
|
// it('with messages', () => {
|
|
// assert.deepEqual(
|
|
// transformStreamsMessagesReply([['stream1', [['0-1', ['11key', '11value']], ['1-1', ['12key', '12value']]]], ['stream2', [['0-2', ['2key1', '2value1', '2key2', '2value2']]]]]),
|
|
// [{
|
|
// name: 'stream1',
|
|
// messages: [{
|
|
// id: '0-1',
|
|
// message: Object.create(null, {
|
|
// '11key': {
|
|
// value: '11value',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// }
|
|
// })
|
|
// }, {
|
|
// id: '1-1',
|
|
// message: Object.create(null, {
|
|
// '12key': {
|
|
// value: '12value',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// }
|
|
// })
|
|
// }]
|
|
// }, {
|
|
// name: 'stream2',
|
|
// messages: [{
|
|
// id: '0-2',
|
|
// message: Object.create(null, {
|
|
// '2key1': {
|
|
// value: '2value1',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// },
|
|
// '2key2': {
|
|
// value: '2value2',
|
|
// configurable: true,
|
|
// enumerable: true
|
|
// }
|
|
// })
|
|
// }]
|
|
// }]
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// it('transformSortedSetWithScoresReply', () => {
|
|
// assert.deepEqual(
|
|
// transformSortedSetWithScoresReply(['member1', '0.5', 'member2', '+inf', 'member3', '-inf']),
|
|
// [{
|
|
// value: 'member1',
|
|
// score: 0.5
|
|
// }, {
|
|
// value: 'member2',
|
|
// score: Infinity
|
|
// }, {
|
|
// value: 'member3',
|
|
// score: -Infinity
|
|
// }]
|
|
// );
|
|
// });
|
|
|
|
// describe('pushGeoCountArgument', () => {
|
|
// it('undefined', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoCountArgument([], undefined),
|
|
// []
|
|
// );
|
|
// });
|
|
|
|
// it('number', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoCountArgument([], 1),
|
|
// ['COUNT', '1']
|
|
// );
|
|
// });
|
|
|
|
// describe('with COUNT', () => {
|
|
// it('number', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoCountArgument([], 1),
|
|
// ['COUNT', '1']
|
|
// );
|
|
// });
|
|
|
|
// describe('object', () => {
|
|
// it('value', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoCountArgument([], { value: 1 }),
|
|
// ['COUNT', '1']
|
|
// );
|
|
// });
|
|
|
|
// it('value, ANY', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoCountArgument([], {
|
|
// value: 1,
|
|
// ANY: true
|
|
// }),
|
|
// ['COUNT', '1', 'ANY']
|
|
// );
|
|
// });
|
|
// });
|
|
// });
|
|
// });
|
|
|
|
// describe('pushGeoSearchArguments', () => {
|
|
// it('FROMMEMBER, BYRADIUS', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoSearchArguments([], 'key', 'member', {
|
|
// radius: 1,
|
|
// unit: 'm'
|
|
// }),
|
|
// ['key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm']
|
|
// );
|
|
// });
|
|
|
|
// it('FROMLONLAT, BYBOX', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoSearchArguments([], 'key', {
|
|
// longitude: 1,
|
|
// latitude: 2
|
|
// }, {
|
|
// width: 1,
|
|
// height: 2,
|
|
// unit: 'm'
|
|
// }),
|
|
// ['key', 'FROMLONLAT', '1', '2', 'BYBOX', '1', '2', 'm']
|
|
// );
|
|
// });
|
|
|
|
// it('with SORT', () => {
|
|
// assert.deepEqual(
|
|
// pushGeoSearchArguments([], 'key', 'member', {
|
|
// radius: 1,
|
|
// unit: 'm'
|
|
// }, {
|
|
// SORT: 'ASC'
|
|
// }),
|
|
// ['key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm', 'ASC']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformGeoMembersWithReply', () => {
|
|
// it('DISTANCE', () => {
|
|
// assert.deepEqual(
|
|
// transformGeoMembersWithReply([
|
|
// [
|
|
// '1',
|
|
// '2'
|
|
// ],
|
|
// [
|
|
// '3',
|
|
// '4'
|
|
// ]
|
|
// ], [GeoReplyWith.DISTANCE]),
|
|
// [{
|
|
// member: '1',
|
|
// distance: '2'
|
|
// }, {
|
|
// member: '3',
|
|
// distance: '4'
|
|
// }]
|
|
// );
|
|
// });
|
|
|
|
// it('HASH', () => {
|
|
// assert.deepEqual(
|
|
// transformGeoMembersWithReply([
|
|
// [
|
|
// '1',
|
|
// 2
|
|
// ],
|
|
// [
|
|
// '3',
|
|
// 4
|
|
// ]
|
|
// ], [GeoReplyWith.HASH]),
|
|
// [{
|
|
// member: '1',
|
|
// hash: 2
|
|
// }, {
|
|
// member: '3',
|
|
// hash: 4
|
|
// }]
|
|
// );
|
|
// });
|
|
|
|
// it('COORDINATES', () => {
|
|
// assert.deepEqual(
|
|
// transformGeoMembersWithReply([
|
|
// [
|
|
// '1',
|
|
// [
|
|
// '2',
|
|
// '3'
|
|
// ]
|
|
// ],
|
|
// [
|
|
// '4',
|
|
// [
|
|
// '5',
|
|
// '6'
|
|
// ]
|
|
// ]
|
|
// ], [GeoReplyWith.COORDINATES]),
|
|
// [{
|
|
// member: '1',
|
|
// coordinates: {
|
|
// longitude: '2',
|
|
// latitude: '3'
|
|
// }
|
|
// }, {
|
|
// member: '4',
|
|
// coordinates: {
|
|
// longitude: '5',
|
|
// latitude: '6'
|
|
// }
|
|
// }]
|
|
// );
|
|
// });
|
|
|
|
// it('DISTANCE, HASH, COORDINATES', () => {
|
|
// assert.deepEqual(
|
|
// transformGeoMembersWithReply([
|
|
// [
|
|
// '1',
|
|
// '2',
|
|
// 3,
|
|
// [
|
|
// '4',
|
|
// '5'
|
|
// ]
|
|
// ],
|
|
// [
|
|
// '6',
|
|
// '7',
|
|
// 8,
|
|
// [
|
|
// '9',
|
|
// '10'
|
|
// ]
|
|
// ]
|
|
// ], [GeoReplyWith.DISTANCE, GeoReplyWith.HASH, GeoReplyWith.COORDINATES]),
|
|
// [{
|
|
// member: '1',
|
|
// distance: '2',
|
|
// hash: 3,
|
|
// coordinates: {
|
|
// longitude: '4',
|
|
// latitude: '5'
|
|
// }
|
|
// }, {
|
|
// member: '6',
|
|
// distance: '7',
|
|
// hash: 8,
|
|
// coordinates: {
|
|
// longitude: '9',
|
|
// latitude: '10'
|
|
// }
|
|
// }]
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformEXAT', () => {
|
|
// it('number', () => {
|
|
// assert.equal(
|
|
// transformEXAT(1),
|
|
// '1'
|
|
// );
|
|
// });
|
|
|
|
// it('date', () => {
|
|
// const d = new Date();
|
|
// assert.equal(
|
|
// transformEXAT(d),
|
|
// Math.floor(d.getTime() / 1000).toString()
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('transformPXAT', () => {
|
|
// it('number', () => {
|
|
// assert.equal(
|
|
// transformPXAT(1),
|
|
// '1'
|
|
// );
|
|
// });
|
|
|
|
// it('date', () => {
|
|
// const d = new Date();
|
|
// assert.equal(
|
|
// transformPXAT(d),
|
|
// d.getTime().toString()
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('pushEvalArguments', () => {
|
|
// it('empty', () => {
|
|
// assert.deepEqual(
|
|
// pushEvalArguments([]),
|
|
// ['0']
|
|
// );
|
|
// });
|
|
|
|
// it('with keys', () => {
|
|
// assert.deepEqual(
|
|
// pushEvalArguments([], {
|
|
// keys: ['key']
|
|
// }),
|
|
// ['1', 'key']
|
|
// );
|
|
// });
|
|
|
|
// it('with arguments', () => {
|
|
// assert.deepEqual(
|
|
// pushEvalArguments([], {
|
|
// arguments: ['argument']
|
|
// }),
|
|
// ['0', 'argument']
|
|
// );
|
|
// });
|
|
|
|
// it('with keys and arguments', () => {
|
|
// assert.deepEqual(
|
|
// pushEvalArguments([], {
|
|
// keys: ['key'],
|
|
// arguments: ['argument']
|
|
// }),
|
|
// ['1', 'key', 'argument']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('pushVariadicArguments', () => {
|
|
// it('string', () => {
|
|
// assert.deepEqual(
|
|
// pushVariadicArguments([], 'string'),
|
|
// ['string']
|
|
// );
|
|
// });
|
|
|
|
// it('array', () => {
|
|
// assert.deepEqual(
|
|
// pushVariadicArguments([], ['1', '2']),
|
|
// ['1', '2']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('pushVariadicNumberArguments', () => {
|
|
// it('number', () => {
|
|
// assert.deepEqual(
|
|
// pushVariadicNumberArguments([], 0),
|
|
// ['0']
|
|
// );
|
|
// });
|
|
|
|
// it('array', () => {
|
|
// assert.deepEqual(
|
|
// pushVariadicNumberArguments([], [0, 1]),
|
|
// ['0', '1']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('pushVariadicArgument', () => {
|
|
// it('string', () => {
|
|
// assert.deepEqual(
|
|
// pushVariadicArgument([], 'string'),
|
|
// ['1', 'string']
|
|
// );
|
|
// });
|
|
|
|
// it('array', () => {
|
|
// assert.deepEqual(
|
|
// pushVariadicArgument([], ['1', '2']),
|
|
// ['2', '1', '2']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// describe('pushOptionalVariadicArgument', () => {
|
|
// it('undefined', () => {
|
|
// assert.deepEqual(
|
|
// pushOptionalVariadicArgument([], 'name', undefined),
|
|
// []
|
|
// );
|
|
// });
|
|
|
|
// it('string', () => {
|
|
// assert.deepEqual(
|
|
// pushOptionalVariadicArgument([], 'name', 'string'),
|
|
// ['name', '1', 'string']
|
|
// );
|
|
// });
|
|
|
|
// it('array', () => {
|
|
// assert.deepEqual(
|
|
// pushOptionalVariadicArgument([], 'name', ['1', '2']),
|
|
// ['name', '2', '1', '2']
|
|
// );
|
|
// });
|
|
// });
|
|
|
|
// it('transformCommandReply', () => {
|
|
// assert.deepEqual(
|
|
// transformCommandReply([
|
|
// 'ping',
|
|
// -1,
|
|
// [CommandFlags.STALE, CommandFlags.FAST],
|
|
// 0,
|
|
// 0,
|
|
// 0,
|
|
// [CommandCategories.FAST, CommandCategories.CONNECTION]
|
|
// ]),
|
|
// {
|
|
// name: 'ping',
|
|
// arity: -1,
|
|
// flags: new Set([CommandFlags.STALE, CommandFlags.FAST]),
|
|
// firstKeyIndex: 0,
|
|
// lastKeyIndex: 0,
|
|
// step: 0,
|
|
// categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION])
|
|
// }
|
|
// );
|
|
// });
|
|
|
|
// describe('pushSlotRangesArguments', () => {
|
|
// it('single range', () => {
|
|
// assert.deepEqual(
|
|
// pushSlotRangesArguments([], {
|
|
// start: 0,
|
|
// end: 1
|
|
// }),
|
|
// ['0', '1']
|
|
// );
|
|
// });
|
|
|
|
// it('multiple ranges', () => {
|
|
// assert.deepEqual(
|
|
// pushSlotRangesArguments([], [{
|
|
// start: 0,
|
|
// end: 1
|
|
// }, {
|
|
// start: 2,
|
|
// end: 3
|
|
// }]),
|
|
// ['0', '1', '2', '3']
|
|
// );
|
|
// });
|
|
// });
|
|
// });
|