/
pre-router.ts
46 lines (41 loc) · 1.44 KB
/
pre-router.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { injectable } from '#di';
import { SystemLogMediator } from '#log-mediator/system-log-mediator.js';
import { HttpMethod } from '#types/mix.js';
import { Router } from '#types/router.js';
import { NodeResponse, RequestListener } from '#types/server-options.js';
import { Status } from '#utils/http-status-codes.js';
@injectable()
export class PreRouter {
constructor(
protected router: Router,
protected systemLogMediator: SystemLogMediator,
) {}
requestListener: RequestListener = async (nodeReq, nodeRes) => {
const [uri, queryString] = this.decodeUrl(nodeReq.url || '').split('?', 2);
const { handle, params } = this.router.find(nodeReq.method as HttpMethod, uri);
if (!handle) {
this.sendNotImplemented(nodeRes);
return;
}
await handle(nodeReq, nodeRes, params!, queryString).catch((err) => {
this.sendInternalServerError(nodeRes, err);
});
};
protected decodeUrl(url: string) {
return decodeURI(url);
}
/**
* Logs an error and sends the user message about an internal server error (500).
*
* @param err An error to logs it (not sends).
*/
protected sendInternalServerError(nodeRes: NodeResponse, err: Error) {
this.systemLogMediator.internalServerError(this, err);
nodeRes.statusCode = Status.INTERNAL_SERVER_ERROR;
nodeRes.end();
}
protected sendNotImplemented(nodeRes: NodeResponse) {
nodeRes.statusCode = Status.NOT_IMPLEMENTED;
nodeRes.end();
}
}