Skip to content

Commit 19bf106

Browse files
huseeiinpi0
andauthored
refactor: hide internal event._res and event.res._headers (#1185)
Co-authored-by: Pooya Parsa <pooya@pi0.io>
1 parent d97fee3 commit 19bf106

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

src/event.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ import type {
99
} from "./types/handler.ts";
1010
import type { H3Core } from "./h3.ts";
1111

12+
const kEventNS = "h3.internal.event.";
13+
14+
export const kEventRes: unique symbol = /* @__PURE__ */ Symbol.for(
15+
`${kEventNS}res`,
16+
);
17+
18+
export const kEventResHeaders: unique symbol = /* @__PURE__ */ Symbol.for(
19+
`${kEventNS}res.headers`,
20+
);
21+
1222
export interface HTTPEvent<
1323
_RequestT extends EventHandlerRequest = EventHandlerRequest,
1424
> {
@@ -53,11 +63,6 @@ export class H3Event<
5363
*/
5464
static __is_event__ = true;
5565

56-
/**
57-
* @internal
58-
*/
59-
_res?: H3EventResponse;
60-
6166
constructor(req: ServerRequest, context?: H3EventContext, app?: H3Core) {
6267
this.context = context || req.context || new EmptyObject();
6368
this.req = req;
@@ -71,10 +76,7 @@ export class H3Event<
7176
* Prepared HTTP response.
7277
*/
7378
get res(): H3EventResponse {
74-
if (!this._res) {
75-
this._res = new H3EventResponse();
76-
}
77-
return this._res;
79+
return ((this as any)[kEventRes] ||= new H3EventResponse());
7880
}
7981

8082
/**
@@ -145,11 +147,8 @@ export class H3Event<
145147
class H3EventResponse {
146148
status?: number;
147149
statusText?: string;
148-
_headers?: Headers;
150+
149151
get headers(): Headers {
150-
if (!this._headers) {
151-
this._headers = new Headers();
152-
}
153-
return this._headers;
152+
return ((this as any)[kEventResHeaders] ||= new Headers());
154153
}
155154
}

src/response.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { HTTPError } from "./error.ts";
33
import { isJSONSerializable } from "./utils/internal/object.ts";
44

55
import type { H3Config } from "./types/h3.ts";
6-
import type { H3Event } from "./event.ts";
6+
import { kEventRes, kEventResHeaders, type H3Event } from "./event.ts";
77

88
export const kNotFound: symbol = /* @__PURE__ */ Symbol.for("h3.notFound");
99
export const kHandled: symbol = /* @__PURE__ */ Symbol.for("h3.handled");
@@ -74,34 +74,39 @@ function prepareResponse(
7474
}
7575

7676
// Only set if event.res.headers is accessed
77-
const eventHeaders = (event.res as { _headers?: Headers })._headers;
77+
const preparedRes:
78+
| undefined
79+
| { status?: number; statusText?: string; [kEventResHeaders]?: Headers } = (
80+
event as any
81+
)[kEventRes];
82+
const preparedHeaders = preparedRes?.[kEventResHeaders];
7883

7984
if (!(val instanceof Response)) {
8085
const res = prepareResponseBody(val, event, config);
81-
const status = event.res.status;
86+
const status = preparedRes?.status;
8287
return new FastResponse(
8388
nullBody(event.req.method, status) ? null : res.body,
8489
{
8590
status,
86-
statusText: event.res.statusText,
91+
statusText: preparedRes?.statusText,
8792
headers:
88-
res.headers && eventHeaders
89-
? mergeHeaders(res.headers, eventHeaders)
90-
: res.headers || eventHeaders,
93+
res.headers && preparedHeaders
94+
? mergeHeaders(res.headers, preparedHeaders)
95+
: res.headers || preparedHeaders,
9196
},
9297
);
9398
}
9499

95100
// Note: Only check _headers. res.status/statusText are not used as we use them from the response
96-
if (!eventHeaders) {
101+
if (!preparedHeaders) {
97102
return val; // Fast path: no headers to merge
98103
}
99104
return new FastResponse(
100105
nullBody(event.req.method, val.status) ? null : val.body,
101106
{
102107
status: val.status,
103108
statusText: val.statusText,
104-
headers: mergeHeaders(eventHeaders, val.headers),
109+
headers: mergeHeaders(preparedHeaders, val.headers),
105110
},
106111
) as Response;
107112
}

test/bench/bundle.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe("benchmark", () => {
2121
);
2222
}
2323
expect(bundle.bytes).toBeLessThanOrEqual(11_000); // <11kb
24-
expect(bundle.gzipSize).toBeLessThanOrEqual(4000); // <4kb
24+
expect(bundle.gzipSize).toBeLessThanOrEqual(4100); // <4.1kb
2525
});
2626

2727
it("bundle size (H3Core)", async () => {

0 commit comments

Comments
 (0)