@@ -4,6 +4,8 @@ import { type Client } from "./client";
4
4
import { reuseInFlight } from "@cocalc/util/reuse-in-flight" ;
5
5
import { getLogger } from "@cocalc/conat/client" ;
6
6
7
+ const DEBUG = true ;
8
+
7
9
const logger = getLogger ( "conat:core:sticky" ) ;
8
10
9
11
export function consistentHashingChoice (
@@ -85,9 +87,13 @@ export async function createStickyRouter({
85
87
choiceTtl ?: number ;
86
88
clientTtl ?: number ;
87
89
} ) {
90
+ logger . debug ( "Creating Sticky Router: " , { choiceTtl, clientTtl } ) ;
91
+ await client . waitUntilConnected ( ) ;
88
92
const sub = await client . subscribe ( SUBJECT ) ;
93
+ logger . debug ( "Creating Sticky Router: subscription created" ) ;
89
94
const stickyCache : { [ key : string ] : { target : string ; expire : number } } = { } ;
90
95
96
+ let counter = 0 ;
91
97
const handle = async ( mesg ) => {
92
98
try {
93
99
const { pattern, subject, targets } = mesg . data ;
@@ -97,11 +103,24 @@ export async function createStickyRouter({
97
103
pattern,
98
104
subject,
99
105
} ) ;
106
+ let madeChoice = false ;
100
107
if ( target == null || ! targets . includes ( target ) ) {
101
108
// make a new choice
109
+ madeChoice = true ;
102
110
target = consistentHashingChoice ( targets , subject ) ;
103
111
stickyCache [ key ] = { target, expire : Date . now ( ) + choiceTtl } ;
104
112
}
113
+ counter ++ ;
114
+ if ( DEBUG ) {
115
+ logger . debug ( "handle request" , {
116
+ counter,
117
+ madeChoice,
118
+ pattern,
119
+ subject,
120
+ targets,
121
+ target,
122
+ } ) ;
123
+ }
105
124
await mesg . respond ( { target, ttl : clientTtl } ) ;
106
125
} catch ( err ) {
107
126
logger . debug ( "WARNING: unable to handle routing message" , err ) ;
@@ -113,7 +132,6 @@ export async function createStickyRouter({
113
132
}
114
133
} ;
115
134
listen ( ) ;
116
- return sub ;
117
135
}
118
136
119
137
const stickyRequest = reuseInFlight (
0 commit comments