11import { EventEmitter } from 'stream' ;
2- import RedisClient , { RedisClientType } from '.' ;
2+ import RedisClient from '.' ;
33import { RedisArgument , ReplyUnion , TransformReply , TypeMapping } from '../RESP/types' ;
44import { BasicCommandParser } from './parser' ;
55
66type CachingClient = RedisClient < any , any , any , any , any > ;
7- type CachingClientType = RedisClientType < any , any , any , any , any > ;
87type CmdFunc = ( ) => Promise < ReplyUnion > ;
98
109export interface ClientSideCacheConfig {
@@ -23,6 +22,17 @@ interface ClientSideCacheEntry {
2322 validate ( ) : boolean ;
2423}
2524
25+ function generateCacheKey ( redisArgs : ReadonlyArray < RedisArgument > ) : string {
26+ const tmp = new Array ( redisArgs . length * 2 ) ;
27+
28+ for ( let i = 0 ; i < redisArgs . length ; i ++ ) {
29+ tmp [ i ] = redisArgs [ i ] . length ;
30+ tmp [ i + redisArgs . length ] = redisArgs [ i ] ;
31+ }
32+
33+ return tmp . join ( '_' ) ;
34+ }
35+
2636abstract class ClientSideCacheEntryBase implements ClientSideCacheEntry {
2737 #invalidated = false ;
2838 readonly #expireTime: number ;
@@ -125,7 +135,7 @@ export class BasicClientSideCache extends ClientSideCacheProvider {
125135 ) {
126136 let reply : ReplyUnion ;
127137
128- const cacheKey = parser . cacheKey ;
138+ const cacheKey = generateCacheKey ( parser . redisArgs ) ;
129139
130140 // "2"
131141 let cacheEntry = this . get ( cacheKey ) ;
@@ -339,10 +349,6 @@ export class BasicClientSideCache extends ClientSideCacheProvider {
339349export abstract class PooledClientSideCacheProvider extends BasicClientSideCache {
340350 #disabled = false ;
341351
342- abstract updateRedirect ( id : number ) : void ;
343- abstract addClient ( client : CachingClientType ) : void ;
344- abstract removeClient ( client : CachingClientType ) : void ;
345-
346352 disable ( ) {
347353 this . #disabled = true ;
348354 }
@@ -367,27 +373,13 @@ export abstract class PooledClientSideCacheProvider extends BasicClientSideCache
367373 return super . has ( cacheKey ) ;
368374 }
369375
370- onPoolConnect ( factory : ( ) => CachingClientType ) { } ;
371-
372376 onPoolClose ( ) {
373377 this . clear ( ) ;
374378 } ;
375379}
376380
377381// doesn't do anything special in pooling, clears cache on every client disconnect
378382export class BasicPooledClientSideCache extends PooledClientSideCacheProvider {
379-
380- override updateRedirect ( id : number ) : void {
381- return ;
382- }
383-
384- override addClient ( client : CachingClientType ) : void {
385- return ;
386- }
387- override removeClient ( client : CachingClientType ) : void {
388- return ;
389- }
390-
391383 override onError ( ) {
392384 this . clear ( false ) ;
393385 }
@@ -459,75 +451,4 @@ export class PooledNoRedirectClientSideCache extends BasicPooledClientSideCache
459451 override onError ( ) { }
460452
461453 override onClose ( ) { }
462- }
463-
464- // Only clears cache on "management"/"redirect" client disconnect
465- export class PooledRedirectClientSideCache extends PooledClientSideCacheProvider {
466- #id?: number ;
467- #clients: Set < CachingClientType > = new Set ( ) ;
468- #redirectClient?: CachingClientType ;
469-
470- constructor ( config : ClientSideCacheConfig ) {
471- super ( config ) ;
472- this . disable ( ) ;
473- }
474-
475- override trackingOn ( ) : string [ ] {
476- if ( this . #id) {
477- return [ 'CLIENT' , 'TRACKING' , 'ON' , 'REDIRECT' , this . #id. toString ( ) ] ;
478- } else {
479- return [ ] ;
480- }
481- }
482-
483- override updateRedirect ( id : number ) {
484- this . #id = id ;
485- for ( const client of this . #clients) {
486- client . sendCommand ( this . trackingOn ( ) ) . catch ( ( ) => { } ) ;
487- }
488- }
489-
490- override addClient ( client : CachingClientType ) {
491- this . #clients. add ( client ) ;
492- }
493-
494- override removeClient ( client : CachingClientType ) {
495- this . #clients. delete ( client ) ;
496- }
497-
498- override onError ( ) : void { } ;
499-
500- override async onPoolConnect ( factory : ( ) => CachingClientType ) {
501- const client = factory ( ) ;
502- this . #redirectClient = client ;
503-
504- client . on ( "error" , ( ) => {
505- this . disable ( ) ;
506- this . clear ( ) ;
507- } ) . on ( "ready" , async ( ) => {
508- const clientId = await client . withTypeMapping ( { } ) . clientId ( ) ;
509- this . updateRedirect ( clientId ) ;
510- this . enable ( ) ;
511- } )
512-
513- try {
514- await client . connect ( ) ;
515- } catch ( err ) {
516- throw err ;
517- }
518- }
519-
520- override onClose ( ) { } ;
521-
522- override onPoolClose ( ) {
523- super . onPoolClose ( ) ;
524-
525- if ( this . #redirectClient) {
526- this . #id = undefined ;
527- const client = this . #redirectClient;
528- this . #redirectClient = undefined ;
529-
530- return client . close ( ) ;
531- }
532- }
533- }
454+ }
0 commit comments