Skip to content

Commit 7a74fda

Browse files
committed
framework performance improvements
1 parent 6276359 commit 7a74fda

16 files changed

Lines changed: 723 additions & 76 deletions

File tree

‎.changeset/empty-groups-take.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@nodeboot/starter-persistence": minor
3+
---
4+
5+
Hnadle async init correctly

‎.changeset/little-beds-share.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@nodeboot/http-server": minor
3+
"@nodeboot/context": minor
4+
"@nodeboot/engine": minor
5+
---
6+
7+
Performance improvements

‎.changeset/odd-planes-heal.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@nodeboot/express-server": minor
3+
---
4+
5+
Improve express server performance

‎.changeset/young-pants-sink.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@nodeboot/encore-server": patch
3+
---
4+
5+
Improve encore server

‎.eslintignore‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ jest.setup.js
1313
memory-leak-detector.js
1414
**.d.ts
1515
/starters/persistence/tests/docker/mongodb/init-replica-set.js
16+
/benchmarking

‎eslint.config.mjs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default [
2626
"**/*.js",
2727
"**/.encore/**",
2828
"**/encore.gen/**",
29+
"benchmarking/**",
2930
],
3031
},
3132

‎package.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"changeset:format": "pnpm prettier --write '{packages,samples,serverless,servers,starters}/*/{package.json,CHANGELOG.md}'",
5050
"release:status": "pnpm changeset status",
5151
"release:publish": "pnpm changeset publish",
52+
"bench:all": "pnpm --dir benchmarking run bench:all",
5253
"nodeboot:update": "turbo run nodeboot:update",
5354
"nodeboot:check:type-deps": "node ./node_modules/@nodeboot/tools/dist/check-type-dependencies.js",
5455
"nodeboot:check:local-deps": "node ./node_modules/@nodeboot/tools/dist/verify-local-dependencies.js",

‎packages/context/src/metadata/ActionMetadata.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ export class ActionMetadata {
172172
* Action metadata can be used only after its build.
173173
*/
174174
build(responseHandlers: ResponseHandlerMetadata[]) {
175+
// Sort params once at boot (this array is static after registration) instead of
176+
// re-sorting on every single request in the hot path (see NodeBootEngine.executeAction).
177+
this.params = this.params.sort((param1, param2) => param1.index - param2.index);
178+
175179
const classTransformerResponseHandler = responseHandlers.find(
176180
handler => handler.type === "response-class-transform-options",
177181
);

‎packages/context/src/services/LoggerService.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,17 @@ export interface LoggerService {
1414
debug(message: string, meta?: Error | JsonObject): void;
1515

1616
child(meta: JsonObject): LoggerService;
17+
18+
/**
19+
* Cheaply checks whether a given log level would actually be emitted, without paying the
20+
* cost of building the log message. Callers on hot paths (e.g. per-request logging in server
21+
* drivers) should guard expensive message construction (string interpolation, property
22+
* access on request/response objects, timing calls) behind this check instead of always
23+
* building the message and letting the logger silently discard it.
24+
*
25+
* Optional for backwards compatibility with custom `LoggerService` implementations that
26+
* don't support level introspection — callers must treat a missing method as "unknown,
27+
* assume enabled" to avoid silently dropping logs.
28+
*/
29+
isLevelEnabled?(level: string): boolean;
1730
}

‎packages/engine/src/core/NodeBootEngine.ts‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,8 @@ export class NodeBootEngine<TServer, TDriver extends NodeBootDriver<TServer>> {
9393
* Executes given controller action.
9494
*/
9595
protected async executeAction(actionMetadata: ActionMetadata, action: Action, interceptorFns: Function[]) {
96-
// compute all parameters
97-
const paramsPromises = actionMetadata.params
98-
.sort((param1, param2) => param1.index - param2.index)
99-
.map(param => this.parameterHandler.handle(action, param));
96+
// compute all parameters (actionMetadata.params is pre-sorted once at boot in ActionMetadata.build())
97+
const paramsPromises = actionMetadata.params.map(param => this.parameterHandler.handle(action, param));
10098

10199
// after all parameters are computed
102100
try {

0 commit comments

Comments
 (0)