Skip to content

Commit c5e7e62

Browse files
authored
Merge pull request #1434 from inversify/feat/update-http-adapters-to-inject-http-server
Update InversifyHttpAdapter to bind server
2 parents 7d851bc + cfa358e commit c5e7e62

File tree

4 files changed

+87
-60
lines changed

4 files changed

+87
-60
lines changed

.changeset/cool-keys-like.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@inversifyjs/http-core": minor
3+
---
4+
5+
- Added `httpServerServiceIdentifier`
6+
- Updated `InversifyHttpAdapter.build` to inject http server

packages/framework/http/libraries/core/src/http/adapter/InversifyHttpAdapter.ts

Lines changed: 76 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import { ControllerResponse } from '../models/ControllerResponse';
3838
import { CustomNativeParameterDecoratorHandlerOptions } from '../models/CustomNativeParameterDecoratorHandlerOptions';
3939
import { CustomParameterDecoratorHandlerOptions } from '../models/CustomParameterDecoratorHandlerOptions';
4040
import { HttpAdapterOptions } from '../models/HttpAdapterOptions';
41+
import { httpServerServiceIdentifier } from '../models/httpServerServiceIdentifier';
4142
import { HttpStatusCode } from '../models/HttpStatusCode';
4243
import { MiddlewareHandler } from '../models/MiddlewareHandler';
4344
import { RequestHandler } from '../models/RequestHandler';
@@ -170,6 +171,8 @@ export abstract class InversifyHttpAdapter<
170171
);
171172
}
172173

174+
this.#bindAdapterRelatedServices();
175+
173176
await this.#registerControllers();
174177

175178
this.#isBuilt = true;
@@ -220,6 +223,40 @@ export abstract class InversifyHttpAdapter<
220223
: param;
221224
}
222225

226+
#appendHeaderMetadata(
227+
headerMetadata: Record<string, string> | undefined,
228+
headers: Record<string, string> | undefined,
229+
): Record<string, string> | undefined {
230+
if (headerMetadata === undefined) {
231+
return headers;
232+
}
233+
234+
if (headers === undefined) {
235+
return { ...headerMetadata };
236+
}
237+
238+
for (const key in headerMetadata) {
239+
if (!Object.hasOwn(headers, key)) {
240+
headers[key] = headerMetadata[key] as string;
241+
}
242+
}
243+
244+
return headers;
245+
}
246+
247+
#bindAdapterRelatedServices(): void {
248+
if (this.#container.isBound(httpServerServiceIdentifier)) {
249+
throw new InversifyHttpAdapterError(
250+
InversifyHttpAdapterErrorKind.invalidOperationAfterBuild,
251+
'An HTTP server is already registered in the container',
252+
);
253+
}
254+
255+
this.#container
256+
.bind<TApp>(httpServerServiceIdentifier)
257+
.toConstantValue(this._app);
258+
}
259+
223260
#buildCustomParameterDecoratorHandlerOptions(): CustomParameterDecoratorHandlerOptions<
224261
TRequest,
225262
TResponse
@@ -260,42 +297,6 @@ export abstract class InversifyHttpAdapter<
260297
return httpAdapterOptions.logger;
261298
}
262299

263-
#parseHttpAdapterOptions(
264-
defaultHttpAdapterOptions: RequiredOptions<TOptions>,
265-
httpAdapterOptions: TOptions | undefined,
266-
): RequiredOptions<TOptions> {
267-
return {
268-
...defaultHttpAdapterOptions,
269-
...httpAdapterOptions,
270-
};
271-
}
272-
273-
async #registerControllers(): Promise<void> {
274-
const routerExplorerControllerMetadataList: RouterExplorerControllerMetadata<
275-
TRequest,
276-
TResponse,
277-
TResult
278-
>[] = buildRouterExplorerControllerMetadataList(
279-
this.#container,
280-
this._logger,
281-
);
282-
283-
for (const routerExplorerControllerMetadata of routerExplorerControllerMetadataList) {
284-
await this._buildRouter({
285-
path: routerExplorerControllerMetadata.path,
286-
routeParamsList: this.#builRouteParamdHandlerList(
287-
routerExplorerControllerMetadata,
288-
),
289-
});
290-
291-
this.#printController(
292-
routerExplorerControllerMetadata.target.name,
293-
routerExplorerControllerMetadata.path,
294-
routerExplorerControllerMetadata.controllerMethodMetadataList,
295-
);
296-
}
297-
}
298-
299300
#builRouteParamdHandlerList(
300301
routerExplorerControllerMetadata: RouterExplorerControllerMetadata<
301302
TRequest,
@@ -698,14 +699,14 @@ export abstract class InversifyHttpAdapter<
698699
return handleError;
699700
}
700701

701-
#setHeaders(
702-
request: TRequest,
703-
response: TResponse,
704-
headers: Record<string, string>,
705-
): void {
706-
for (const key in headers) {
707-
this._setHeader(request, response, key, headers[key] as string);
708-
}
702+
#parseHttpAdapterOptions(
703+
defaultHttpAdapterOptions: RequiredOptions<TOptions>,
704+
httpAdapterOptions: TOptions | undefined,
705+
): RequiredOptions<TOptions> {
706+
return {
707+
...defaultHttpAdapterOptions,
708+
...httpAdapterOptions,
709+
};
709710
}
710711

711712
#reply(
@@ -751,6 +752,16 @@ export abstract class InversifyHttpAdapter<
751752
}
752753
}
753754

755+
#setHeaders(
756+
request: TRequest,
757+
response: TResponse,
758+
headers: Record<string, string>,
759+
): void {
760+
for (const key in headers) {
761+
this._setHeader(request, response, key, headers[key] as string);
762+
}
763+
}
764+
754765
#getMiddlewareHandlerFromMetadata(
755766
routerExplorerControllerMethodMetadata: RouterExplorerControllerMethodMetadata<
756767
TRequest,
@@ -883,25 +894,30 @@ export abstract class InversifyHttpAdapter<
883894
this._logger.error(errorMessage);
884895
}
885896

886-
#appendHeaderMetadata(
887-
headerMetadata: Record<string, string> | undefined,
888-
headers: Record<string, string> | undefined,
889-
): Record<string, string> | undefined {
890-
if (headerMetadata === undefined) {
891-
return headers;
892-
}
897+
async #registerControllers(): Promise<void> {
898+
const routerExplorerControllerMetadataList: RouterExplorerControllerMetadata<
899+
TRequest,
900+
TResponse,
901+
TResult
902+
>[] = buildRouterExplorerControllerMetadataList(
903+
this.#container,
904+
this._logger,
905+
);
893906

894-
if (headers === undefined) {
895-
return { ...headerMetadata };
896-
}
907+
for (const routerExplorerControllerMetadata of routerExplorerControllerMetadataList) {
908+
await this._buildRouter({
909+
path: routerExplorerControllerMetadata.path,
910+
routeParamsList: this.#builRouteParamdHandlerList(
911+
routerExplorerControllerMetadata,
912+
),
913+
});
897914

898-
for (const key in headerMetadata) {
899-
if (!Object.hasOwn(headers, key)) {
900-
headers[key] = headerMetadata[key] as string;
901-
}
915+
this.#printController(
916+
routerExplorerControllerMetadata.target.name,
917+
routerExplorerControllerMetadata.path,
918+
routerExplorerControllerMetadata.controllerMethodMetadataList,
919+
);
902920
}
903-
904-
return headers;
905921
}
906922

907923
#setGlobalErrorFilter(errorFilter: Newable<ErrorFilter>): void {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const httpServerServiceIdentifier: unique symbol = Symbol.for(
2+
'@inversifyjs/http-core/httpServer',
3+
);

packages/framework/http/libraries/core/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import { CustomNativeParameterDecoratorHandlerOptions } from './http/models/Cust
4545
import { CustomParameterDecoratorHandler } from './http/models/CustomParameterDecoratorHandler';
4646
import { CustomParameterDecoratorHandlerOptions } from './http/models/CustomParameterDecoratorHandlerOptions';
4747
import { HttpAdapterOptions } from './http/models/HttpAdapterOptions';
48+
import { httpServerServiceIdentifier } from './http/models/httpServerServiceIdentifier';
4849
import { HttpStatusCode } from './http/models/HttpStatusCode';
4950
import { MiddlewareHandler } from './http/models/MiddlewareHandler';
5051
import { RequestHandler } from './http/models/RequestHandler';
@@ -150,6 +151,7 @@ export {
150151
Head,
151152
Headers,
152153
HttpResponse,
154+
httpServerServiceIdentifier,
153155
HttpStatusCode,
154156
HttpVersionNotSupportedHttpResponse,
155157
InsufficientStorageHttpResponse,

0 commit comments

Comments
 (0)