@trenskow/app 0.9.79 → 0.9.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +12 -16
- package/lib/response.js +23 -8
- package/package.json +2 -2
- package/test/index.js +21 -0
package/.vscode/settings.json
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"[javascript]": {
|
|
15
|
-
"editor.formatOnSave": true,
|
|
16
|
-
"editor.formatOnPaste": true
|
|
17
|
-
}
|
|
2
|
+
"cSpell.words": [
|
|
3
|
+
"caseit",
|
|
4
|
+
"concat",
|
|
5
|
+
"getheader",
|
|
6
|
+
"getheadernames",
|
|
7
|
+
"hasheader",
|
|
8
|
+
"linebreak",
|
|
9
|
+
"quuries",
|
|
10
|
+
"removeheader",
|
|
11
|
+
"setheader",
|
|
12
|
+
"writehead"
|
|
13
|
+
]
|
|
18
14
|
}
|
package/lib/response.js
CHANGED
|
@@ -12,24 +12,31 @@ import { ServerResponse } from 'http';
|
|
|
12
12
|
|
|
13
13
|
export default class Response extends ServerResponse {
|
|
14
14
|
|
|
15
|
-
#
|
|
16
|
-
#
|
|
15
|
+
#_headerListeners;
|
|
16
|
+
#_headersProxy;
|
|
17
|
+
#_vary;
|
|
17
18
|
|
|
18
19
|
constructor(...args) {
|
|
19
20
|
super(...args);
|
|
20
|
-
this.#
|
|
21
|
+
this.#_headerListeners = [];
|
|
22
|
+
this.#_vary = new Set();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
vary(headerName) {
|
|
26
|
+
this.#_vary.add(
|
|
27
|
+
caseit(headerName));
|
|
21
28
|
}
|
|
22
29
|
|
|
23
30
|
get headers() {
|
|
24
|
-
return this.#
|
|
31
|
+
return this.#_headersProxy || (this.#_headersProxy = new Proxy(this, {
|
|
25
32
|
get: function (target, prop) {
|
|
26
33
|
|
|
27
34
|
if (prop === 'on') return (name, callback) => {
|
|
28
35
|
|
|
29
36
|
name = caseit(name);
|
|
30
37
|
|
|
31
|
-
target.#
|
|
32
|
-
target.#
|
|
38
|
+
target.#_headerListeners[name] = target.#_headerListeners[name] || [];
|
|
39
|
+
target.#_headerListeners[name].push(callback);
|
|
33
40
|
|
|
34
41
|
};
|
|
35
42
|
|
|
@@ -58,16 +65,17 @@ export default class Response extends ServerResponse {
|
|
|
58
65
|
|
|
59
66
|
name = caseit(name);
|
|
60
67
|
|
|
61
|
-
if (this.#
|
|
68
|
+
if (this.#_headerListeners[name]?.some((callback) => callback(value) === false)) return;
|
|
62
69
|
|
|
63
70
|
return super.setHeader(caseit(name, 'http'), value);
|
|
71
|
+
|
|
64
72
|
}
|
|
65
73
|
|
|
66
74
|
removeHeader(name) {
|
|
67
75
|
|
|
68
76
|
name = caseit(name);
|
|
69
77
|
|
|
70
|
-
if (this.#
|
|
78
|
+
if (this.#_headerListeners[name]?.some((callback) => callback() === false)) return;
|
|
71
79
|
|
|
72
80
|
return super.removeHeader(caseit(name, 'http'));
|
|
73
81
|
|
|
@@ -91,6 +99,13 @@ export default class Response extends ServerResponse {
|
|
|
91
99
|
Object.entries(headers || {})
|
|
92
100
|
.forEach(([name, value]) => this.setHeader(name, value));
|
|
93
101
|
|
|
102
|
+
const vary = Array.from(this.#_vary)
|
|
103
|
+
.filter((headerName) => this.getHeaderNames().includes(headerName));
|
|
104
|
+
|
|
105
|
+
if (vary.length) {
|
|
106
|
+
this.setHeader('vary', vary.map((name) => caseit(name, 'http')).join(', '));
|
|
107
|
+
}
|
|
108
|
+
|
|
94
109
|
super.writeHead(statusCode, statusMessage);
|
|
95
110
|
|
|
96
111
|
this.emit('writeHead');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trenskow/app",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.81",
|
|
4
4
|
"description": "A small HTTP router.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"supertest": "^7.2.2"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@trenskow/api-error": "^2.5.
|
|
37
|
+
"@trenskow/api-error": "^2.5.64",
|
|
38
38
|
"@trenskow/caseit": "^1.4.24",
|
|
39
39
|
"@trenskow/units": "^0.2.54"
|
|
40
40
|
}
|
package/test/index.js
CHANGED
|
@@ -439,6 +439,27 @@ describe('Application', () => {
|
|
|
439
439
|
|
|
440
440
|
});
|
|
441
441
|
|
|
442
|
+
it ('should come back with `Vary` header set.', async () => {
|
|
443
|
+
|
|
444
|
+
app.root(
|
|
445
|
+
new Endpoint()
|
|
446
|
+
.use(({ response }) => {
|
|
447
|
+
response.vary('contentLanguage');
|
|
448
|
+
})
|
|
449
|
+
.use(({ response }) => {
|
|
450
|
+
response.headers.contentLanguage = 'en';
|
|
451
|
+
})
|
|
452
|
+
.get(() => 'Hello, World!')
|
|
453
|
+
);
|
|
454
|
+
|
|
455
|
+
await request
|
|
456
|
+
.get('/')
|
|
457
|
+
.expect('Content-Language', 'en')
|
|
458
|
+
.expect('Vary', 'Content-Language')
|
|
459
|
+
.expect(200, 'Hello, World!');
|
|
460
|
+
|
|
461
|
+
});
|
|
462
|
+
|
|
442
463
|
after(async () => {
|
|
443
464
|
await app.close({ awaitAllConnections: true });
|
|
444
465
|
});
|