1
1
import { EventEmitter } from 'stream' ;
2
- import RedisClient , { RedisClientType } from '.' ;
2
+ import RedisClient from '.' ;
3
3
import { RedisArgument , ReplyUnion , TransformReply , TypeMapping } from '../RESP/types' ;
4
4
import { BasicCommandParser } from './parser' ;
5
5
6
6
type CachingClient = RedisClient < any , any , any , any , any > ;
7
- type CachingClientType = RedisClientType < any , any , any , any , any > ;
8
7
type CmdFunc = ( ) => Promise < ReplyUnion > ;
9
8
10
9
export interface ClientSideCacheConfig {
@@ -23,6 +22,17 @@ interface ClientSideCacheEntry {
23
22
validate ( ) : boolean ;
24
23
}
25
24
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
+
26
36
abstract class ClientSideCacheEntryBase implements ClientSideCacheEntry {
27
37
#invalidated = false ;
28
38
readonly #expireTime: number ;
@@ -125,7 +135,7 @@ export class BasicClientSideCache extends ClientSideCacheProvider {
125
135
) {
126
136
let reply : ReplyUnion ;
127
137
128
- const cacheKey = parser . cacheKey ;
138
+ const cacheKey = generateCacheKey ( parser . redisArgs ) ;
129
139
130
140
// "2"
131
141
let cacheEntry = this . get ( cacheKey ) ;
@@ -339,10 +349,6 @@ export class BasicClientSideCache extends ClientSideCacheProvider {
339
349
export abstract class PooledClientSideCacheProvider extends BasicClientSideCache {
340
350
#disabled = false ;
341
351
342
- abstract updateRedirect ( id : number ) : void ;
343
- abstract addClient ( client : CachingClientType ) : void ;
344
- abstract removeClient ( client : CachingClientType ) : void ;
345
-
346
352
disable ( ) {
347
353
this . #disabled = true ;
348
354
}
@@ -367,27 +373,13 @@ export abstract class PooledClientSideCacheProvider extends BasicClientSideCache
367
373
return super . has ( cacheKey ) ;
368
374
}
369
375
370
- onPoolConnect ( factory : ( ) => CachingClientType ) { } ;
371
-
372
376
onPoolClose ( ) {
373
377
this . clear ( ) ;
374
378
} ;
375
379
}
376
380
377
381
// doesn't do anything special in pooling, clears cache on every client disconnect
378
382
export 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
-
391
383
override onError ( ) {
392
384
this . clear ( false ) ;
393
385
}
@@ -459,75 +451,4 @@ export class PooledNoRedirectClientSideCache extends BasicPooledClientSideCache
459
451
override onError ( ) { }
460
452
461
453
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