Skip to content

Commit 0712346

Browse files
feature(): use metadata cache for headers and status code
1 parent 1dfc814 commit 0712346

6 files changed

Lines changed: 35 additions & 30 deletions

File tree

integration/hello-world/e2e/interceptors.spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ export class TransformInterceptor {
3030

3131
@Injectable()
3232
export class StatusInterceptor {
33-
34-
constructor(private statusCode: number){}
33+
constructor(private statusCode: number) {}
3534

3635
intercept(context: ExecutionContext, next: CallHandler) {
3736
const ctx = context.switchToHttp();
@@ -43,8 +42,7 @@ export class StatusInterceptor {
4342

4443
@Injectable()
4544
export class HeaderInterceptor {
46-
47-
constructor(private headers: object){}
45+
constructor(private headers: object) {}
4846

4947
intercept(context: ExecutionContext, next: CallHandler) {
5048
const ctx = context.switchToHttp();

integration/hello-world/src/hello/hello.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { HelloService } from './hello.service';
2-
import { Controller, Get, Header, Param, Post } from '@nestjs/common';
1+
import { Controller, Get, Header, Param } from '@nestjs/common';
32
import { Observable, of } from 'rxjs';
3+
import { HelloService } from './hello.service';
44
import { UserByIdPipe } from './users/user-by-id.pipe';
55

66
@Controller('hello')

packages/core/helpers/handler-metadata-storage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export const HANDLER_METADATA_SYMBOL = Symbol.for('handler_metadata:cache');
77
export interface HandlerMetadata {
88
argsLength: number;
99
paramtypes: any[];
10+
httpStatusCode: number;
11+
responseHeaders: any[];
12+
hasCustomHeaders: boolean;
1013
getParamsMetadata: (
1114
moduleKey: string,
1215
contextId?: ContextId,

packages/core/router/router-execution-context.ts

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ export class RouterExecutionContext {
8383
fnHandleResponse,
8484
paramtypes,
8585
getParamsMetadata,
86-
} = this.getMetadata(instance, callback, methodName, module);
86+
httpStatusCode,
87+
responseHeaders,
88+
hasCustomHeaders,
89+
} = this.getMetadata(instance, callback, methodName, module, requestMethod);
90+
8791
const paramsOptions = this.contextUtils.mergeParamsMetatypes(
8892
getParamsMetadata(module, contextId, inquirerId),
8993
paramtypes,
@@ -131,17 +135,7 @@ export class RouterExecutionContext {
131135
const args = this.contextUtils.createNullArray(argsLength);
132136
fnCanActivate && (await fnCanActivate([req, res]));
133137

134-
const httpCode = this.reflectHttpStatusCode(callback);
135-
136-
const httpStatusCode = httpCode
137-
? httpCode
138-
: this.responseController.getStatusByMethod(requestMethod);
139-
140-
this.responseController.status(res, httpStatusCode);
141-
142-
const responseHeaders = this.reflectResponseHeaders(callback);
143-
const hasCustomHeaders = !isEmpty(responseHeaders);
144-
138+
this.responseController.setStatus(res, httpStatusCode);
145139
hasCustomHeaders &&
146140
this.responseController.setHeaders(res, responseHeaders);
147141

@@ -160,7 +154,8 @@ export class RouterExecutionContext {
160154
instance: Controller,
161155
callback: (...args: any[]) => any,
162156
methodName: string,
163-
module: string
157+
module: string,
158+
requestMethod: RequestMethod,
164159
): HandlerMetadata {
165160
const cacheMetadata = this.handlerMetadataStorage.get(instance, methodName);
166161
if (cacheMetadata) {
@@ -199,13 +194,25 @@ export class RouterExecutionContext {
199194

200195
const fnHandleResponse = this.createHandleResponseFn(
201196
callback,
202-
isResponseHandled
197+
isResponseHandled,
203198
);
199+
200+
const httpCode = this.reflectHttpStatusCode(callback);
201+
const httpStatusCode = httpCode
202+
? httpCode
203+
: this.responseController.getStatusByMethod(requestMethod);
204+
205+
const responseHeaders = this.reflectResponseHeaders(callback);
206+
const hasCustomHeaders = !isEmpty(responseHeaders);
207+
204208
const handlerMetadata: HandlerMetadata = {
205209
argsLength,
206210
fnHandleResponse,
207211
paramtypes,
208212
getParamsMetadata,
213+
httpStatusCode,
214+
hasCustomHeaders,
215+
responseHeaders,
209216
};
210217
this.handlerMetadataStorage.set(instance, methodName, handlerMetadata);
211218
return handlerMetadata;
@@ -350,7 +357,7 @@ export class RouterExecutionContext {
350357
public createHandleResponseFn(
351358
callback: (...args: any[]) => any,
352359
isResponseHandled: boolean,
353-
httpStatusCode?: number
360+
httpStatusCode?: number,
354361
) {
355362
const renderTemplate = this.reflectRenderTemplate(callback);
356363

packages/core/router/router-response-controller.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,7 @@ export class RouterResponseController {
5151
);
5252
}
5353

54-
public status<TResponse = any>(
55-
response: TResponse,
56-
statusCode: number
57-
) {
54+
public setStatus<TResponse = any>(response: TResponse, statusCode: number) {
5855
this.applicationRef.status(response, statusCode);
5956
}
6057
}

packages/core/test/router/router-response-controller.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ describe('RouterResponseController', () => {
3535
if (isNil(body)) {
3636
return responseRef.send();
3737
}
38-
return isObject(body) ? responseRef.json(body) : responseRef.send(String(body));
38+
return isObject(body)
39+
? responseRef.json(body)
40+
: responseRef.send(String(body));
3941
});
4042
});
4143
describe('nil', () => {
@@ -162,10 +164,8 @@ describe('RouterResponseController', () => {
162164
const response = {};
163165
const statusCode = 400;
164166

165-
routerResponseController.status(response, statusCode);
166-
expect(
167-
statusStub.calledWith(response, statusCode),
168-
).to.be.true;
167+
routerResponseController.setStatus(response, statusCode);
168+
expect(statusStub.calledWith(response, statusCode)).to.be.true;
169169
});
170170
});
171171
});

0 commit comments

Comments
 (0)