@@ -10,7 +10,8 @@ import { PubSubListener } from '../client/pub-sub';
1010import { ErrorReply } from '../errors' ;
1111import { RedisTcpSocketOptions } from '../client/socket' ;
1212import ASKING from '../commands/ASKING' ;
13- import { BasicCommandParser , CommandParser } from '../client/parser' ;
13+ import { BasicCommandParser } from '../client/parser' ;
14+ import { parseArgs } from '../commands/generic-transformers' ;
1415;
1516
1617interface ClusterCommander <
@@ -175,7 +176,7 @@ export default class RedisCluster<
175176
176177 return async function ( this : ProxyCluster , ...args : Array < unknown > ) {
177178 if ( command . parseCommand ) {
178- const parser = this . _self . #newCommandParser ( resp ) ;
179+ const parser = new BasicCommandParser ( resp ) ;
179180 command . parseCommand ( parser , ...args ) ;
180181
181182 return this . _self . #execute(
@@ -212,7 +213,7 @@ export default class RedisCluster<
212213
213214 return async function ( this : NamespaceProxyCluster , ...args : Array < unknown > ) {
214215 if ( command . parseCommand ) {
215- const parser = this . _self . _self . #newCommandParser ( resp ) ;
216+ const parser = new BasicCommandParser ( resp ) ;
216217 command . parseCommand ( parser , ...args ) ;
217218
218219 return this . _self . #execute(
@@ -249,7 +250,7 @@ export default class RedisCluster<
249250
250251 return async function ( this : NamespaceProxyCluster , ...args : Array < unknown > ) {
251252 if ( fn . parseCommand ) {
252- const parser = this . _self . _self . #newCommandParser ( resp ) ;
253+ const parser = new BasicCommandParser ( resp ) ;
253254 parser . pushVariadic ( prefix ) ;
254255 fn . parseCommand ( parser , ...args ) ;
255256
@@ -288,7 +289,7 @@ export default class RedisCluster<
288289
289290 return async function ( this : ProxyCluster , ...args : Array < unknown > ) {
290291 if ( script . parseCommand ) {
291- const parser = this . _self . #newCommandParser ( resp ) ;
292+ const parser = new BasicCommandParser ( resp ) ;
292293 parser . pushVariadic ( prefix ) ;
293294 script . parseCommand ( parser , ...args ) ;
294295
@@ -409,10 +410,6 @@ export default class RedisCluster<
409410 return this . _self . #slots. isOpen ;
410411 }
411412
412- #newCommandParser( resp : RespVersions ) : CommandParser {
413- return new BasicCommandParser ( resp ) ;
414- }
415-
416413 constructor ( options : RedisClusterOptions < M , F , S , RESP , TYPE_MAPPING /*, POLICIES*/ > ) {
417414 super ( ) ;
418415
@@ -495,25 +492,6 @@ export default class RedisCluster<
495492 // return this._commandOptionsProxy('policies', policies);
496493 // }
497494
498- #handleAsk< T > (
499- fn : ( client : RedisClientType < M , F , S , RESP , TYPE_MAPPING > , opts ?: ClusterCommandOptions ) => Promise < T >
500- ) {
501- return async ( client : RedisClientType < M , F , S , RESP , TYPE_MAPPING > , options ?: ClusterCommandOptions ) => {
502- const chainId = Symbol ( "asking chain" ) ;
503- const opts = options ? { ...options } : { } ;
504- opts . chainId = chainId ;
505-
506- const ret = await Promise . all (
507- [
508- client . sendCommand ( ASKING . transformArguments ( ) , { chainId : chainId } ) ,
509- fn ( client , opts )
510- ]
511- ) ;
512-
513- return ret [ 1 ] ;
514- } ;
515- }
516-
517495 async #execute< T > (
518496 firstKey : RedisArgument | undefined ,
519497 isReadonly : boolean | undefined ,
@@ -523,13 +501,14 @@ export default class RedisCluster<
523501 const maxCommandRedirections = this . #options. maxCommandRedirections ?? 16 ;
524502 let client = await this . #slots. getClient ( firstKey , isReadonly ) ;
525503 let i = 0 ;
526- let myFn = fn ;
504+ let myOpts = options ;
527505
528506 while ( true ) {
529507 try {
530- return await myFn ( client , options ) ;
508+ return await fn ( client , myOpts ) ;
531509 } catch ( err ) {
532- myFn = fn ;
510+ // reset to passed in options, if changed by an ask request
511+ myOpts = options ;
533512 // TODO: error class
534513 if ( ++ i > maxCommandRedirections || ! ( err instanceof Error ) ) {
535514 throw err ;
@@ -547,8 +526,14 @@ export default class RedisCluster<
547526 throw new Error ( `Cannot find node ${ address } ` ) ;
548527 }
549528
550- myFn = this . #handleAsk( fn ) ;
551529 client = redirectTo ;
530+
531+ const chainId = Symbol ( 'Asking Chain' ) ;
532+ const myOpts = options ? { ...options } : { } ;
533+ myOpts . chainId = chainId ;
534+
535+ client . sendCommand ( parseArgs ( ASKING ) , { chainId : chainId } ) . catch ( err => { console . log ( `Asking Failed: ${ err } ` ) } ) ;
536+
552537 continue ;
553538 }
554539
0 commit comments