@@ -73,6 +73,14 @@ export namespace ClientMetadata {
73
73
}
74
74
return { id, authLevel, userId, sessionId, type } ;
75
75
}
76
+
77
+ export function fromRequest ( req : any ) {
78
+ const expressReq = req as express . Request ;
79
+ const user = expressReq . user ;
80
+ const sessionId = expressReq . session ?. id ;
81
+ const type = WebsocketClientType . getClientType ( expressReq ) ;
82
+ return ClientMetadata . from ( user ?. id , sessionId , type ) ;
83
+ }
76
84
}
77
85
78
86
export class WebsocketClientContext {
@@ -120,9 +128,7 @@ export class WebsocketConnectionManager implements ConnectionHandler {
120
128
this . jsonRpcConnectionHandler = new GitpodJsonRpcConnectionHandler < GitpodApiClient > (
121
129
this . path ,
122
130
this . createProxyTarget . bind ( this ) ,
123
- this . createAccessGuard . bind ( this ) ,
124
- this . createRateLimiter . bind ( this ) ,
125
- this . getClientMetadata . bind ( this ) ,
131
+ this . rateLimiterConfig ,
126
132
) ;
127
133
}
128
134
@@ -131,10 +137,6 @@ export class WebsocketConnectionManager implements ConnectionHandler {
131
137
this . jsonRpcConnectionHandler . onConnection ( connection , session ) ;
132
138
}
133
139
134
- protected createAccessGuard ( request ?: object ) : FunctionAccessGuard {
135
- return ( request && ( request as WithFunctionAccessGuard ) . functionGuard ) || new AllAccessFunctionGuard ( ) ;
136
- }
137
-
138
140
protected createProxyTarget ( client : JsonRpcProxy < GitpodApiClient > , request ?: object ) : GitpodServerImpl {
139
141
const expressReq = request as express . Request ;
140
142
const session = expressReq . session ;
@@ -191,7 +193,7 @@ export class WebsocketConnectionManager implements ConnectionHandler {
191
193
}
192
194
193
195
protected getOrCreateClientContext ( expressReq : express . Request ) : WebsocketClientContext {
194
- const metadata = this . getClientMetadata ( expressReq ) ;
196
+ const metadata = ClientMetadata . fromRequest ( expressReq ) ;
195
197
let ctx = this . contexts . get ( metadata . id ) ;
196
198
if ( ! ctx ) {
197
199
ctx = new WebsocketClientContext ( metadata ) ;
@@ -201,22 +203,6 @@ export class WebsocketConnectionManager implements ConnectionHandler {
201
203
return ctx ;
202
204
}
203
205
204
- protected getClientMetadata ( req ?: object ) : ClientMetadata {
205
- const expressReq = req as express . Request ;
206
- const user = expressReq . user ;
207
- const sessionId = expressReq . session ?. id ;
208
- const type = WebsocketClientType . getClientType ( expressReq ) ;
209
- return ClientMetadata . from ( user ?. id , sessionId , type ) ;
210
- }
211
-
212
- protected createRateLimiter ( req ?: object ) : RateLimiter {
213
- const { id : clientId } = this . getClientMetadata ( req ) ;
214
- return {
215
- user : clientId ,
216
- consume : ( method ) => UserRateLimiter . instance ( this . rateLimiterConfig ) . consume ( clientId , method ) ,
217
- }
218
- }
219
-
220
206
public onConnectionCreated ( l : ( server : GitpodServerImpl , req : express . Request ) => void ) : Disposable {
221
207
this . events . on ( EVENT_CONNECTION_CREATED , l )
222
208
return {
@@ -250,25 +236,34 @@ class GitpodJsonRpcConnectionHandler<T extends object> extends JsonRpcConnection
250
236
constructor (
251
237
readonly path : string ,
252
238
readonly targetFactory : ( proxy : JsonRpcProxy < T > , request ?: object ) => any ,
253
- readonly accessGuard : ( request ?: object ) => FunctionAccessGuard ,
254
- readonly rateLimiterFactory : ( request ?: object ) => RateLimiter ,
255
- readonly getClientId : ( request ?: object ) => ClientMetadata ,
239
+ readonly rateLimiterConfig : RateLimiterConfig ,
256
240
) {
257
241
super ( path , targetFactory ) ;
258
242
}
259
243
260
244
onConnection ( connection : MessageConnection , request ?: object ) : void {
245
+ const clientMetadata = ClientMetadata . fromRequest ( request ) ;
246
+
261
247
const factory = new GitpodJsonRpcProxyFactory < T > (
262
- this . accessGuard ( request ) ,
263
- this . rateLimiterFactory ( request ) ,
264
- this . getClientId ( request ) ,
248
+ this . createAccessGuard ( request ) ,
249
+ this . createRateLimiter ( clientMetadata . id , request ) ,
250
+ clientMetadata ,
265
251
) ;
266
252
const proxy = factory . createProxy ( ) ;
267
253
factory . target = this . targetFactory ( proxy , request ) ;
268
254
factory . listen ( connection ) ;
269
255
}
270
256
257
+ protected createRateLimiter ( clientId : string , req ?: object ) : RateLimiter {
258
+ return {
259
+ user : clientId ,
260
+ consume : ( method ) => UserRateLimiter . instance ( this . rateLimiterConfig ) . consume ( clientId , method ) ,
261
+ }
262
+ }
271
263
264
+ protected createAccessGuard ( request ?: object ) : FunctionAccessGuard {
265
+ return ( request && ( request as WithFunctionAccessGuard ) . functionGuard ) || new AllAccessFunctionGuard ( ) ;
266
+ }
272
267
}
273
268
274
269
class GitpodJsonRpcProxyFactory < T extends object > extends JsonRpcProxyFactory < T > {
0 commit comments