11import http from "node:http" ;
22import packageJson from "../package.json" with { type : "json" } ;
3+ import { Authenticator } from "./auth/Authenticator.js" ;
34import { Request } from "./Request.js" ;
45import { Response } from "./response/Response.js" ;
56import { RouteRegistry } from "./routing/RouteRegistry.js" ;
67import { ServerErrorRegistry } from "./ServerErrorRegistry.js" ;
78
8- class Server {
9+ class Server < A > {
910 /**
1011 * Headers sent with every response.
1112 */
1213 public readonly globalHeaders : Headers ;
1314 /**
1415 * This server's route registry.
1516 */
16- public readonly routes = new RouteRegistry ( ) ;
17+ public readonly routes = new RouteRegistry < A > ( ) ;
1718 private readonly server : http . Server ;
1819 private readonly copyOrigin : boolean ;
19- private readonly errors = new ServerErrorRegistry ( ) ;
20+ private readonly errors = new ServerErrorRegistry < A > ( ) ;
21+ /** @internal */
22+ public readonly _authenticators : Authenticator < A > [ ] ;
2023
2124 /**
2225 * Create a new HTTP server.
2326 * @param options Server options.
2427 */
25- public constructor ( options : Server . Options ) {
28+ public constructor ( options : Server . Options < A > ) {
2629 this . server = http . createServer ( {
2730 joinDuplicateHeaders : true ,
2831 } , this . listener . bind ( this ) ) ;
2932
3033 this . globalHeaders = new Headers ( options . globalHeaders ) ;
3134 if ( ! this . globalHeaders . has ( "server" ) )
32- this . globalHeaders . set ( "Server" , `cldn /${ packageJson . version } ` ) ;
35+ this . globalHeaders . set ( "Server" , `${ packageJson . name } /${ packageJson . version } ` ) ;
3336
3437 this . copyOrigin = options . copyOrigin ?? false ;
38+ this . _authenticators = options . authenticators ?? [ ] ;
3539
3640 this . server . listen ( options . port ) ;
3741 }
@@ -42,13 +46,13 @@ class Server {
4246 }
4347
4448 private async listener ( req : http . IncomingMessage , res : http . ServerResponse ) {
45- let apiRequest : Request ;
49+ let apiRequest : Request < A > ;
4650 try {
47- apiRequest = Request . incomingMessage ( req ) ;
51+ apiRequest = Request . incomingMessage ( req , this ) ;
4852 }
4953 catch ( e ) {
5054 if ( e instanceof Request . BadUrlError ) {
51- this . errors . _get ( ServerErrorRegistry . ErrorCodes . BAD_URL , null ) . _send ( res , this ) ;
55+ await this . errors . _get ( ServerErrorRegistry . ErrorCodes . BAD_URL , null ) . _send ( res , this ) ;
5256 return ;
5357 }
5458 if ( e instanceof Request . SocketClosedError )
@@ -64,7 +68,7 @@ class Server {
6468 apiRequest . _responseHeaders . set ( "vary" , "origin" ) ;
6569 }
6670
67- let response : Response ;
71+ let response : Response < A > ;
6872 try {
6973 response = await this . routes . handle ( apiRequest ) ;
7074 }
@@ -76,7 +80,7 @@ class Server {
7680 response = this . errors . _get ( ServerErrorRegistry . ErrorCodes . INTERNAL , apiRequest ) ;
7781 }
7882 }
79- response . _send ( res , this , apiRequest ) ;
83+ await response . _send ( res , apiRequest ) ;
8084 }
8185
8286 public close ( ) : Promise < void > {
@@ -96,7 +100,7 @@ namespace Server {
96100 /**
97101 * Server options
98102 */
99- export interface Options {
103+ export interface Options < A > {
100104 /**
101105 * The HTTP listener port. From 1 to 65535. Ports 1–1023 require
102106 * privileges.
@@ -115,6 +119,11 @@ namespace Server {
115119 * @default false
116120 */
117121 readonly copyOrigin ?: boolean ;
122+
123+ /**
124+ * Authenticators for handling request authentication.
125+ */
126+ readonly authenticators ?: Authenticator < A > [ ] ;
118127 }
119128}
120129
0 commit comments