Skip to content

Commit 1fc9d31

Browse files
geroplroboquat
authored andcommitted
[server] Refactor: Push methods into RpcConnectionHandler
1 parent 6be4928 commit 1fc9d31

File tree

1 file changed

+25
-30
lines changed

1 file changed

+25
-30
lines changed

components/server/src/websocket/websocket-connection-manager.ts

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ export namespace ClientMetadata {
7373
}
7474
return { id, authLevel, userId, sessionId, type };
7575
}
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+
}
7684
}
7785

7886
export class WebsocketClientContext {
@@ -120,9 +128,7 @@ export class WebsocketConnectionManager implements ConnectionHandler {
120128
this.jsonRpcConnectionHandler = new GitpodJsonRpcConnectionHandler<GitpodApiClient>(
121129
this.path,
122130
this.createProxyTarget.bind(this),
123-
this.createAccessGuard.bind(this),
124-
this.createRateLimiter.bind(this),
125-
this.getClientMetadata.bind(this),
131+
this.rateLimiterConfig,
126132
);
127133
}
128134

@@ -131,10 +137,6 @@ export class WebsocketConnectionManager implements ConnectionHandler {
131137
this.jsonRpcConnectionHandler.onConnection(connection, session);
132138
}
133139

134-
protected createAccessGuard(request?: object): FunctionAccessGuard {
135-
return (request && (request as WithFunctionAccessGuard).functionGuard) || new AllAccessFunctionGuard();
136-
}
137-
138140
protected createProxyTarget(client: JsonRpcProxy<GitpodApiClient>, request?: object): GitpodServerImpl {
139141
const expressReq = request as express.Request;
140142
const session = expressReq.session;
@@ -191,7 +193,7 @@ export class WebsocketConnectionManager implements ConnectionHandler {
191193
}
192194

193195
protected getOrCreateClientContext(expressReq: express.Request): WebsocketClientContext {
194-
const metadata = this.getClientMetadata(expressReq);
196+
const metadata = ClientMetadata.fromRequest(expressReq);
195197
let ctx = this.contexts.get(metadata.id);
196198
if (!ctx) {
197199
ctx = new WebsocketClientContext(metadata);
@@ -201,22 +203,6 @@ export class WebsocketConnectionManager implements ConnectionHandler {
201203
return ctx;
202204
}
203205

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-
220206
public onConnectionCreated(l: (server: GitpodServerImpl, req: express.Request) => void): Disposable {
221207
this.events.on(EVENT_CONNECTION_CREATED, l)
222208
return {
@@ -250,25 +236,34 @@ class GitpodJsonRpcConnectionHandler<T extends object> extends JsonRpcConnection
250236
constructor(
251237
readonly path: string,
252238
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,
256240
) {
257241
super(path, targetFactory);
258242
}
259243

260244
onConnection(connection: MessageConnection, request?: object): void {
245+
const clientMetadata = ClientMetadata.fromRequest(request);
246+
261247
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,
265251
);
266252
const proxy = factory.createProxy();
267253
factory.target = this.targetFactory(proxy, request);
268254
factory.listen(connection);
269255
}
270256

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+
}
271263

264+
protected createAccessGuard(request?: object): FunctionAccessGuard {
265+
return (request && (request as WithFunctionAccessGuard).functionGuard) || new AllAccessFunctionGuard();
266+
}
272267
}
273268

274269
class GitpodJsonRpcProxyFactory<T extends object> extends JsonRpcProxyFactory<T> {

0 commit comments

Comments
 (0)