@deepkit/http 1.0.19 → 1.1.0

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.
Files changed (85) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/cjs/index.d.ts +2 -0
  3. package/dist/cjs/index.js +2 -0
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/src/decorator.js +11 -7
  6. package/dist/cjs/src/decorator.js.map +1 -1
  7. package/dist/cjs/src/filter.js +1 -1
  8. package/dist/cjs/src/filter.js.map +1 -1
  9. package/dist/cjs/src/http.d.ts +3 -0
  10. package/dist/cjs/src/http.js +90 -61
  11. package/dist/cjs/src/http.js.map +1 -1
  12. package/dist/cjs/src/logger.js +0 -7
  13. package/dist/cjs/src/logger.js.map +1 -1
  14. package/dist/cjs/src/middleware.d.ts +2 -2
  15. package/dist/cjs/src/middleware.js +2 -2
  16. package/dist/cjs/src/mime.d.ts +19 -0
  17. package/dist/cjs/src/mime.js +147 -0
  18. package/dist/cjs/src/mime.js.map +1 -0
  19. package/dist/cjs/src/model.d.ts +7 -0
  20. package/dist/cjs/src/model.js +16 -7
  21. package/dist/cjs/src/model.js.map +1 -1
  22. package/dist/cjs/src/module.js +9 -5
  23. package/dist/cjs/src/module.js.map +1 -1
  24. package/dist/cjs/src/query-string.d.ts +6 -0
  25. package/dist/cjs/src/query-string.js +229 -0
  26. package/dist/cjs/src/query-string.js.map +1 -0
  27. package/dist/cjs/src/request-parser.js +12 -10
  28. package/dist/cjs/src/request-parser.js.map +1 -1
  29. package/dist/cjs/src/router.js +14 -15
  30. package/dist/cjs/src/router.js.map +1 -1
  31. package/dist/cjs/src/static-serving.d.ts +6 -0
  32. package/dist/cjs/src/static-serving.js +232 -28
  33. package/dist/cjs/src/static-serving.js.map +1 -1
  34. package/dist/cjs/src/utils.js +1 -1
  35. package/dist/cjs/src/utils.js.map +1 -1
  36. package/dist/esm/index.d.ts +2 -0
  37. package/dist/esm/index.js +2 -0
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/src/decorator.js +11 -7
  40. package/dist/esm/src/decorator.js.map +1 -1
  41. package/dist/esm/src/filter.js +1 -1
  42. package/dist/esm/src/filter.js.map +1 -1
  43. package/dist/esm/src/http.d.ts +3 -0
  44. package/dist/esm/src/http.js +55 -60
  45. package/dist/esm/src/http.js.map +1 -1
  46. package/dist/esm/src/logger.js +0 -7
  47. package/dist/esm/src/logger.js.map +1 -1
  48. package/dist/esm/src/middleware.d.ts +2 -2
  49. package/dist/esm/src/middleware.js +2 -2
  50. package/dist/esm/src/mime.d.ts +19 -0
  51. package/dist/esm/src/mime.js +142 -0
  52. package/dist/esm/src/mime.js.map +1 -0
  53. package/dist/esm/src/model.d.ts +7 -0
  54. package/dist/esm/src/model.js +16 -7
  55. package/dist/esm/src/model.js.map +1 -1
  56. package/dist/esm/src/module.js +9 -5
  57. package/dist/esm/src/module.js.map +1 -1
  58. package/dist/esm/src/query-string.d.ts +6 -0
  59. package/dist/esm/src/query-string.js +226 -0
  60. package/dist/esm/src/query-string.js.map +1 -0
  61. package/dist/esm/src/request-parser.js +12 -10
  62. package/dist/esm/src/request-parser.js.map +1 -1
  63. package/dist/esm/src/router.js +14 -12
  64. package/dist/esm/src/router.js.map +1 -1
  65. package/dist/esm/src/static-serving.d.ts +6 -0
  66. package/dist/esm/src/static-serving.js +234 -27
  67. package/dist/esm/src/static-serving.js.map +1 -1
  68. package/dist/esm/src/utils.js +1 -1
  69. package/dist/esm/src/utils.js.map +1 -1
  70. package/index.ts +2 -0
  71. package/package.json +22 -25
  72. package/src/http.ts +40 -6
  73. package/src/middleware.ts +2 -2
  74. package/src/mime.ts +141 -0
  75. package/src/model.ts +10 -2
  76. package/src/module.ts +4 -2
  77. package/src/query-string.ts +228 -0
  78. package/src/request-parser.ts +6 -4
  79. package/src/router.ts +3 -3
  80. package/src/static-serving.ts +221 -8
  81. package/tsconfig.json +3 -17
  82. package/tsconfig.spec.json +4 -1
  83. package/LICENSE +0 -21
  84. package/dist/cjs/tsconfig.tsbuildinfo +0 -1
  85. package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
@@ -4,13 +4,26 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
7
  function __assignType(fn, args) {
11
8
  fn.__type = args;
12
9
  return fn;
13
10
  }
11
+ escapeHtml.__type = ['value', 'escapeHtml', 'P&2!&/"'];
12
+ sendHtml.__type = [() => HttpResponse, 'response', 'status', 'title', 'body', 'headers', () => ({}), 'sendHtml', 'PP7!2"\'2#&2$&2%P&&LM2&>\'"/('];
13
+ sendError.__type = [() => HttpResponse, 'response', 'status', 'headers', () => ({}), 'sendError', 'PP7!2"\'2#P&&LM2$>%"/&'];
14
+ encodeUrl.__type = ['url', 'encodeUrl', 'P&2!&/"'];
15
+ parseHttpDate.__type = ['date', 'parseHttpDate', 'PP&\'&FJ2!8\'/"'];
16
+ parseTokenList.__type = ['value', 'parseTokenList', 'P&2!&F/"'];
17
+ matchesETag.__type = ['header', 'etag', 'matchesETag', 'P&2!&2")/#'];
18
+ parseRange.__type = ['size', 'header', 'start', 'end', -1, 'parseRange', 'P\'2!&2"PP\'4#\'4$MF.%-J/&'];
19
+ sendFile.__type = [() => HttpRequest, 'request', () => HttpResponse, 'response', 'path', 'stats', 'sendFile', 'PP7!2"P7#2$&2%!2&"/\''];
20
+ staticServe.__type = ['localPath', 'path', () => HttpRequest, 'request', () => HttpResponse, 'response', 'staticServe', 'P&2!&2"P7#2$P7%2&"/\''];
21
+ staticOnRoute.__type = [() => httpWorkflow.onRoute.event, 'event', 'path', 'localPath', 'staticOnRoute', 'Pi!2"&2#&2$"/%'];
22
+ serveStaticListener.__type = [() => AppModule, 'module', 'path', 'localPath', () => path, () => __ΩClassType, 'serveStaticListener', 'PP"7!2"&2#&2$>%n&/\''];
23
+ loadHtml.__type = ['localPath', 'path', 'loadHtml', 'P&2!&2"&/#'];
24
+ registerStaticHttpController.__type = [() => AppModule, 'module', () => __ΩStaticHttpOptions, 'options', 'registerStaticHttpController', 'PP"7!2"n#2$$/%'];
25
+ const Ωt0 = [() => HttpRouter, 'P7!'];
26
+ const Ωt1 = [() => HttpRouter, 'P7!'];
14
27
  /*
15
28
  * Deepkit Framework
16
29
  * Copyright (C) 2021 Deepkit UG, Marc J. Schmidt
@@ -21,8 +34,9 @@ function __assignType(fn, args) {
21
34
  * You should have received a copy of the MIT License along with this program.
22
35
  */
23
36
  import { http } from './decorator.js';
24
- import { join } from 'path';
25
- import { readFileSync, stat } from 'fs';
37
+ import { join, normalize, resolve, sep } from 'path';
38
+ import { createReadStream, readFileSync, stat } from 'fs';
39
+ import { STATUS_CODES } from 'http';
26
40
  import { HtmlResponse, httpWorkflow } from './http.js';
27
41
  import { AppModule } from '@deepkit/app';
28
42
  import { normalizeDirectory } from './utils.js';
@@ -30,17 +44,216 @@ import { normalizeDirectory } from './utils.js';
30
44
  import { __ΩClassType } from '@deepkit/core';
31
45
  import { urlJoin } from '@deepkit/core';
32
46
  import { HttpRequest, HttpResponse } from './model.js';
33
- import send from 'send';
47
+ import { getContentType } from './mime.js';
34
48
  import { eventDispatcher } from '@deepkit/event';
35
49
  import { HttpRouter, RouteConfig } from './router.js';
50
+ const upPathRegExp = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
51
+ function escapeHtml(value) {
52
+ return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
53
+ }
54
+ function sendHtml(response, status, title, body, headers = {}) {
55
+ const doc = `<!DOCTYPE html>\n<html lang="en">\n<head>\n<meta charset="utf-8">\n<title>${title}</title>\n</head>\n<body>\n<pre>${escapeHtml(body)}</pre>\n</body>\n</html>\n`;
56
+ for (const [name, value] of Object.entries(headers))
57
+ response.setHeader(name, value);
58
+ response.statusCode = status;
59
+ response.setHeader('Content-Type', 'text/html; charset=UTF-8');
60
+ response.setHeader('Content-Length', Buffer.byteLength(doc));
61
+ response.setHeader('Content-Security-Policy', "default-src 'none'");
62
+ response.setHeader('X-Content-Type-Options', 'nosniff');
63
+ response.end(doc);
64
+ }
65
+ function sendError(response, status, headers = {}) {
66
+ for (const name of response.getHeaderNames())
67
+ response.removeHeader(name);
68
+ sendHtml(response, status, 'Error', STATUS_CODES[status] || String(status), headers);
69
+ }
70
+ /**
71
+ * Encodes characters not allowed in a URL, but keeps already percent-encoded sequences.
72
+ */
73
+ function encodeUrl(url) {
74
+ return url
75
+ .replace(/(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g, '$1\uFFFD$2')
76
+ .replace(/(?:[^\x21\x23-\x3B\x3D\x3F-\x5F\x61-\x7A\x7C\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g, encodeURI);
77
+ }
78
+ function parseHttpDate(date) {
79
+ const timestamp = 'string' === typeof date ? Date.parse(date) : NaN;
80
+ return 'number' === typeof timestamp ? timestamp : NaN;
81
+ }
82
+ function parseTokenList(value) {
83
+ return value.split(',').map(__assignType(v => v.trim(), ['v', '', 'P"2!"/"'])).filter(__assignType(v => v !== '', ['v', '', 'P"2!"/"']));
84
+ }
85
+ function matchesETag(header, etag) {
86
+ return parseTokenList(header).some(__assignType(match => match === etag || match === 'W/' + etag || 'W/' + match === etag, ['match', '', 'P"2!"/"']));
87
+ }
88
+ /**
89
+ * Parses a `Range: bytes=...` header. Returns undefined for a syntactically invalid header, -1 if not satisfiable,
90
+ * and the ranges otherwise (overlapping and adjacent ranges are combined).
91
+ */
92
+ function parseRange(size, header) {
93
+ const index = header.indexOf('=');
94
+ if (index === -1)
95
+ return;
96
+ const ranges = [];
97
+ for (const part of header.slice(index + 1).split(',')) {
98
+ const [startString, endString] = part.split('-');
99
+ let start = parseInt(startString, 10);
100
+ let end = parseInt(endString, 10);
101
+ if (isNaN(start)) {
102
+ // -nnn: the last nnn bytes
103
+ start = size - end;
104
+ end = size - 1;
105
+ }
106
+ else if (isNaN(end)) {
107
+ // nnn-: from nnn to the end
108
+ end = size - 1;
109
+ }
110
+ if (end > size - 1)
111
+ end = size - 1;
112
+ if (isNaN(start) || isNaN(end) || start > end || start < 0)
113
+ continue;
114
+ ranges.push({ start, end, index: ranges.length });
115
+ }
116
+ if (!ranges.length)
117
+ return -1;
118
+ const ordered = ranges.sort(__assignType((a, b) => a.start - b.start, ['a', 'b', '', 'P"2!"2""/#']));
119
+ let j = 0;
120
+ for (let i = 1; i < ordered.length; i++) {
121
+ const range = ordered[i];
122
+ const current = ordered[j];
123
+ if (range.start > current.end + 1) {
124
+ ordered[++j] = range;
125
+ }
126
+ else if (range.end > current.end) {
127
+ current.end = range.end;
128
+ current.index = Math.min(current.index, range.index);
129
+ }
130
+ }
131
+ ordered.length = j + 1;
132
+ return ordered.sort(__assignType((a, b) => a.index - b.index, ['a', 'b', '', 'P"2!"2""/#'])).map(__assignType(v => ({ start: v.start, end: v.end }), ['v', '', 'P"2!"/"']));
133
+ }
134
+ function sendFile(request, response, path, stats) {
135
+ if (response.headersSent)
136
+ return sendError(response, 500);
137
+ if (!response.getHeader('Accept-Ranges'))
138
+ response.setHeader('Accept-Ranges', 'bytes');
139
+ if (!response.getHeader('Cache-Control'))
140
+ response.setHeader('Cache-Control', 'public, max-age=0');
141
+ if (!response.getHeader('Last-Modified'))
142
+ response.setHeader('Last-Modified', stats.mtime.toUTCString());
143
+ if (!response.getHeader('ETag'))
144
+ response.setHeader('ETag', `W/"${stats.size.toString(16)}-${stats.mtime.getTime().toString(16)}"`);
145
+ if (!response.getHeader('Content-Type'))
146
+ response.setHeader('Content-Type', getContentType(path) || 'application/octet-stream');
147
+ const etag = String(response.getHeader('ETag'));
148
+ const lastModified = parseHttpDate(response.getHeader('Last-Modified'));
149
+ const headers = request.headers;
150
+ // precondition failure
151
+ const ifMatch = headers['if-match'];
152
+ if (ifMatch ? ifMatch !== '*' && !matchesETag(ifMatch, etag) : lastModified > parseHttpDate(headers['if-unmodified-since'])) {
153
+ return sendError(response, 412);
154
+ }
155
+ // not modified
156
+ const ifNoneMatch = headers['if-none-match'];
157
+ const ifModifiedSince = headers['if-modified-since'];
158
+ const noCache = /(?:^|,)\s*?no-cache\s*?(?:,|$)/.test(headers['cache-control'] || '');
159
+ const isCachable = (response.statusCode >= 200 && response.statusCode < 300) || response.statusCode === 304;
160
+ if (isCachable && (ifNoneMatch || ifModifiedSince) && !noCache) {
161
+ const fresh = ifNoneMatch
162
+ ? ifNoneMatch === '*' || matchesETag(ifNoneMatch, etag)
163
+ : lastModified <= parseHttpDate(ifModifiedSince);
164
+ if (fresh) {
165
+ for (const name of ['Content-Encoding', 'Content-Language', 'Content-Length', 'Content-Range', 'Content-Type']) {
166
+ response.removeHeader(name);
167
+ }
168
+ response.statusCode = 304;
169
+ response.end();
170
+ return;
171
+ }
172
+ }
173
+ let start = 0;
174
+ let length = stats.size;
175
+ const rangeHeader = headers.range;
176
+ if (rangeHeader && /^ *bytes=/.test(rangeHeader)) {
177
+ let ranges = parseRange(length, rangeHeader);
178
+ // If-Range: only send the range if the representation is unchanged, otherwise the whole file
179
+ const ifRange = headers['if-range'];
180
+ if (ifRange && (ifRange.includes('"') ? !ifRange.includes(etag) : !(lastModified <= parseHttpDate(ifRange)))) {
181
+ ranges = undefined;
182
+ }
183
+ if (ranges === -1) {
184
+ return sendError(response, 416, { 'Content-Range': `bytes */${length}` });
185
+ }
186
+ // multiple ranges are answered with the whole file
187
+ if (ranges && ranges.length === 1) {
188
+ response.statusCode = 206;
189
+ response.setHeader('Content-Range', `bytes ${ranges[0].start}-${ranges[0].end}/${length}`);
190
+ start = ranges[0].start;
191
+ length = ranges[0].end - ranges[0].start + 1;
192
+ }
193
+ }
194
+ response.setHeader('Content-Length', length);
195
+ if (request.method === 'HEAD') {
196
+ response.end();
197
+ return;
198
+ }
199
+ const stream = createReadStream(path, { start, end: Math.max(start, start + length - 1) });
200
+ response.once('close', () => stream.destroy());
201
+ stream.once('error', () => {
202
+ stream.destroy();
203
+ if (response.headersSent) {
204
+ response.destroy();
205
+ }
206
+ else {
207
+ sendError(response, 500);
208
+ }
209
+ });
210
+ stream.pipe(response);
211
+ }
212
+ /**
213
+ * Sends the file at `path` (URL encoded, relative to `localPath`) as response.
214
+ *
215
+ * Supports HEAD, Range requests, and conditional requests (ETag, Last-Modified).
216
+ * Paths with `..` are rejected with 403, paths to dotfiles (or in dot-directories) with 404.
217
+ */
36
218
  export function staticServe(localPath, path, request, response) {
37
- return new Promise(__assignType((resolve, reject) => {
38
- const res = send(request, path, { root: localPath });
39
- res.pipe(response);
40
- res.on('end', resolve);
41
- }, ['resolve', 'reject', '', 'P"2!"2""/#']));
219
+ return new Promise(__assignType(resolvePromise => {
220
+ response.once('finish', resolvePromise);
221
+ response.once('close', resolvePromise);
222
+ let decodedPath;
223
+ try {
224
+ decodedPath = decodeURIComponent(path);
225
+ }
226
+ catch {
227
+ return sendError(response, 400);
228
+ }
229
+ if (decodedPath.includes('\0'))
230
+ return sendError(response, 400);
231
+ // normalize relative to root
232
+ if (decodedPath)
233
+ decodedPath = normalize('.' + sep + decodedPath);
234
+ if (upPathRegExp.test(decodedPath))
235
+ return sendError(response, 403);
236
+ // dotfiles are ignored
237
+ if (decodedPath.split(sep).some(__assignType(part => part.length > 1 && part[0] === '.', ['part', '', 'P"2!"/"'])))
238
+ return sendError(response, 404);
239
+ const filePath = normalize(join(resolve(localPath), decodedPath));
240
+ const hasTrailingSlash = path[path.length - 1] === '/';
241
+ stat(hasTrailingSlash ? join(filePath, 'index.html') : filePath, __assignType((error, stats) => {
242
+ if (error) {
243
+ const notFound = error.code === 'ENOENT' || error.code === 'ENOTDIR' || error.code === 'ENAMETOOLONG';
244
+ return sendError(response, notFound ? 404 : 500);
245
+ }
246
+ if (stats.isDirectory()) {
247
+ if (hasTrailingSlash)
248
+ return sendError(response, 404);
249
+ const location = encodeUrl((path + '/').replace(/^\/+/, '/'));
250
+ sendHtml(response, 301, 'Redirecting', 'Redirecting to ' + location, { Location: location });
251
+ return;
252
+ }
253
+ sendFile(request, response, hasTrailingSlash ? join(filePath, 'index.html') : filePath, stats);
254
+ }, ['error', 'stats', '', 'P"2!"2""/#']));
255
+ }, ['resolvePromise', '', 'P"2!"/"']));
42
256
  }
43
- staticServe.__type = ['localPath', 'path', () => HttpRequest, 'request', () => HttpResponse, 'response', 'staticServe', 'P&2!&2"P7#2$P7%2&"/\''];
44
257
  export async function staticOnRoute(event, path, localPath) {
45
258
  if (event.sent)
46
259
  return;
@@ -49,7 +262,12 @@ export async function staticOnRoute(event, path, localPath) {
49
262
  if (!event.request.url?.startsWith(path))
50
263
  return;
51
264
  const relativePath = urlJoin('/', event.url.substr(path.length));
52
- const finalLocalPath = join(localPath, relativePath);
265
+ const root = resolve(localPath);
266
+ const finalLocalPath = join(root, relativePath);
267
+ // paths outside of the root (e.g. /../../etc/passwd) are not checked at all, otherwise 403 (exists) and
268
+ // 404 (doesn't exist) would tell whether a file exists anywhere on the server
269
+ if (finalLocalPath !== root && !finalLocalPath.startsWith(root + sep))
270
+ return;
53
271
  return new Promise(__assignType(resolve => {
54
272
  stat(finalLocalPath, __assignType((err, stat) => {
55
273
  if (stat && stat.isFile()) {
@@ -59,7 +277,6 @@ export async function staticOnRoute(event, path, localPath) {
59
277
  }, ['err', 'stat', '', 'P"2!"2""/#']));
60
278
  }, ['resolve', '', 'P"2!"/"']));
61
279
  }
62
- staticOnRoute.__type = [() => httpWorkflow.onRoute.event, 'event', 'path', 'localPath', 'staticOnRoute', 'Pi!2"&2#&2$"/%'];
63
280
  export function serveStaticListener(module, path, localPath = path) {
64
281
  class HttpRequestStaticServingListener {
65
282
  onRoute(event) {
@@ -69,14 +286,9 @@ export function serveStaticListener(module, path, localPath = path) {
69
286
  HttpRequestStaticServingListener.__type = [() => httpWorkflow.onRoute.event, 'event', 'onRoute', 'HttpRequestStaticServingListener', 'Pi!2""0#5w$'];
70
287
  __decorate([
71
288
  eventDispatcher.listen(httpWorkflow.onRoute, 101) //after default route listener at 100
72
- ,
73
- __metadata("design:type", Function),
74
- __metadata("design:paramtypes", [Object]),
75
- __metadata("design:returntype", void 0)
76
289
  ], HttpRequestStaticServingListener.prototype, "onRoute", null);
77
290
  return HttpRequestStaticServingListener;
78
291
  }
79
- serveStaticListener.__type = [() => AppModule, 'module', 'path', 'localPath', () => path, () => __ΩClassType, 'serveStaticListener', 'PP"7!2"&2#&2$>%n&/\''];
80
292
  function loadHtml(localPath, path) {
81
293
  try {
82
294
  let indexHtml = readFileSync(join(localPath, 'index.html')).toString('utf8');
@@ -87,7 +299,6 @@ function loadHtml(localPath, path) {
87
299
  return '';
88
300
  }
89
301
  }
90
- loadHtml.__type = ['localPath', 'path', 'loadHtml', 'P&2!&2"&/#'];
91
302
  const __ΩStaticHttpOptions = ['path', 'localPath', 'groups', 'controllerName', 'indexReplace', 'StaticHttpOptions', 'P&4!&4"&F4#8&4$8P&&LM4%8Mw&y'];
92
303
  export { __ΩStaticHttpOptions as __ΩStaticHttpOptions };
93
304
  /**
@@ -114,10 +325,7 @@ export function registerStaticHttpController(module, options) {
114
325
  }
115
326
  StaticController.__type = [() => HttpRequest, 'request', () => HttpResponse, 'response', 'serveIndex', 'StaticController', 'PP7!2"P7#2$"0%5w&'];
116
327
  __decorate([
117
- (http.GET().group(...groups)),
118
- __metadata("design:type", Function),
119
- __metadata("design:paramtypes", [HttpRequest, HttpResponse]),
120
- __metadata("design:returntype", void 0)
328
+ (http.GET().group(...groups))
121
329
  ], StaticController.prototype, "serveIndex", null);
122
330
  if (options.controllerName) {
123
331
  Object.defineProperty(StaticController, 'name', { value: options.controllerName, writable: true });
@@ -130,7 +338,7 @@ export function registerStaticHttpController(module, options) {
130
338
  methodName: 'serveIndex',
131
339
  });
132
340
  route1.groups = groups;
133
- (module.configureProvider.Ω = [[() => HttpRouter, 'P7!']], module.configureProvider(__assignType(router => router.addRoute(route1), ['router', '', 'P"2!"/"']), { global: true }));
341
+ (module.configureProvider.Ω = [Ωt0], module.configureProvider(__assignType(router => router.addRoute(route1), ['router', '', 'P"2!"/"']), { global: true }));
134
342
  if (path !== '/') {
135
343
  const route2 = new RouteConfig('static', ['GET'], path.slice(0, -1), {
136
344
  type: 'controller',
@@ -139,10 +347,9 @@ export function registerStaticHttpController(module, options) {
139
347
  methodName: 'serveIndex',
140
348
  });
141
349
  route2.groups = groups;
142
- (module.configureProvider.Ω = [[() => HttpRouter, 'P7!']], module.configureProvider(__assignType(router => router.addRoute(route2), ['router', '', 'P"2!"/"']), { global: true }));
350
+ (module.configureProvider.Ω = [Ωt1], module.configureProvider(__assignType(router => router.addRoute(route2), ['router', '', 'P"2!"/"']), { global: true }));
143
351
  }
144
352
  module.addProvider(StaticController);
145
353
  module.addListener(serveStaticListener(module, normalizeDirectory(options.path), options.localPath));
146
354
  }
147
- registerStaticHttpController.__type = [() => AppModule, 'module', () => __ΩStaticHttpOptions, 'options', 'registerStaticHttpController', 'PP"7!2"n#2$$/%'];
148
355
  //# sourceMappingURL=static-serving.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static-serving.js","sourceRoot":"","sources":["../../../src/static-serving.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static-serving.js","sourceRoot":"","sources":["../../../src/static-serving.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ normalizeDirectory.__type = ['path', 'normalizeDirectory', 'P&2!&/"'];
1
2
  export function normalizeDirectory(path) {
2
3
  if (path[0] !== '/')
3
4
  path = '/' + path;
@@ -5,5 +6,4 @@ export function normalizeDirectory(path) {
5
6
  path = path + '/';
6
7
  return path;
7
8
  }
8
- normalizeDirectory.__type = ['path', 'normalizeDirectory', 'P&2!&/"'];
9
9
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IACrD,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":";AAAA,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IACrD,OAAO,IAAI,CAAC;AAChB,CAAC"}
package/index.ts CHANGED
@@ -12,3 +12,5 @@ export * from './src/controllers.js';
12
12
  export * from './src/middleware.js';
13
13
  export * from './src/filter.js';
14
14
  export * from './src/utils.js';
15
+ export * from './src/query-string.js';
16
+ export * from './src/mime.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepkit/http",
3
- "version": "1.0.19",
3
+ "version": "1.1.0",
4
4
  "description": "Deepkit HTTP server and router.",
5
5
  "type": "commonjs",
6
6
  "main": "./dist/cjs/index.js",
@@ -23,34 +23,31 @@
23
23
  "build": "echo '{\"type\": \"module\"}' > ./dist/esm/package.json"
24
24
  },
25
25
  "peerDependencies": {
26
- "@deepkit/app": "^1.0.1",
27
- "@deepkit/core": "^1.0.1",
28
- "@deepkit/event": "^1.0.1",
29
- "@deepkit/injector": "^1.0.1",
30
- "@deepkit/logger": "^1.0.1",
31
- "@deepkit/stopwatch": "^1.0.1",
32
- "@deepkit/template": "^1.0.1",
33
- "@deepkit/type": "^1.0.1",
34
- "@deepkit/workflow": "^1.0.1"
26
+ "@deepkit/app": "^1.1.0",
27
+ "@deepkit/core": "^1.1.0",
28
+ "@deepkit/event": "^1.1.0",
29
+ "@deepkit/injector": "^1.1.0",
30
+ "@deepkit/logger": "^1.1.0",
31
+ "@deepkit/stopwatch": "^1.1.0",
32
+ "@deepkit/template": "^1.1.0",
33
+ "@deepkit/type": "^1.1.0",
34
+ "@deepkit/workflow": "^1.1.0"
35
35
  },
36
36
  "dependencies": {
37
- "formidable": "^3.5.2",
38
- "qs": "^6.14.0",
39
- "send": "^1.1.0"
37
+ "formidable": "^3.5.2"
40
38
  },
41
39
  "devDependencies": {
42
- "@deepkit/app": "^1.0.19",
43
- "@deepkit/core": "^1.0.19",
44
- "@deepkit/event": "^1.0.19",
45
- "@deepkit/injector": "^1.0.19",
46
- "@deepkit/logger": "^1.0.19",
47
- "@deepkit/stopwatch": "^1.0.19",
48
- "@deepkit/template": "^1.0.19",
49
- "@deepkit/type": "^1.0.19",
50
- "@deepkit/workflow": "^1.0.19",
40
+ "@deepkit/app": "^1.1.0",
41
+ "@deepkit/core": "^1.1.0",
42
+ "@deepkit/event": "^1.1.0",
43
+ "@deepkit/injector": "^1.1.0",
44
+ "@deepkit/logger": "^1.1.0",
45
+ "@deepkit/stopwatch": "^1.1.0",
46
+ "@deepkit/template": "^1.1.0",
47
+ "@deepkit/type": "^1.1.0",
48
+ "@deepkit/workflow": "^1.1.0",
51
49
  "@types/formidable": "^3.4.5",
52
- "@types/node": "^22.13.1",
53
- "@types/send": "^0.14.6"
50
+ "@types/node": "^22.13.1"
54
51
  },
55
52
  "jest": {
56
53
  "testEnvironment": "node",
@@ -70,5 +67,5 @@
70
67
  "**/tests/**/*.spec.ts"
71
68
  ]
72
69
  },
73
- "gitHead": "e8ce2fe13cfaec38a3f702be203db50b618de38e"
70
+ "gitHead": "56081823b559bb68b77a8781957af5d9c2e019a7"
74
71
  }
package/src/http.ts CHANGED
@@ -27,9 +27,10 @@ export function isElementStruct(v: any): v is ElementStruct {
27
27
 
28
28
  let templateRender: typeof render;
29
29
 
30
- function getTemplateRender(): typeof render {
30
+ // @deepkit/template is optional, so it's only loaded when a controller returns a JSX element.
31
+ async function getTemplateRender(): Promise<typeof render> {
31
32
  if (!templateRender) {
32
- const template = require('@deepkit/template');
33
+ const template = await import('@deepkit/template');
33
34
  templateRender = template.render;
34
35
  }
35
36
 
@@ -110,6 +111,9 @@ export class HttpInternalServerError extends createHttpError(500, 'Internal serv
110
111
  export class HttpNotImplementedError extends createHttpError(501, 'Not implemented') {
111
112
  }
112
113
 
114
+ export class HttpGatewayTimeoutError extends createHttpError(504, 'Gateway timeout') {
115
+ }
116
+
113
117
  export class HttpWorkflowEvent extends BaseEvent {
114
118
  public nextState?: any;
115
119
  public nextStateEvent?: any;
@@ -318,7 +322,7 @@ export const httpWorkflow = createWorkflow('http', {
318
322
  }, {
319
323
  start: 'request',
320
324
  request: 'route',
321
- route: ['auth', 'routeNotFound'],
325
+ route: ['auth', 'routeNotFound', 'response'],
322
326
  auth: ['resolveParameters', 'accessDenied'],
323
327
  resolveParameters: ['controller', 'parametersFailed'],
324
328
  accessDenied: 'response',
@@ -543,7 +547,7 @@ export class HttpListener {
543
547
  protected injector: Injector,
544
548
  protected stopwatch: Stopwatch,
545
549
  ) {
546
- this.setRouteConfig = injector.createSetter(RouteConfig, {name: 'http'});
550
+ this.setRouteConfig = injector.createSetter(RouteConfig, 'http');
547
551
  }
548
552
 
549
553
  @eventDispatcher.listen(httpWorkflow.onRequest, 100)
@@ -559,6 +563,7 @@ export class HttpListener {
559
563
  if (event.sent) return;
560
564
  if (event.hasNext()) return;
561
565
  const logger = this.logger;
566
+ let inMiddleware = false;
562
567
 
563
568
  try {
564
569
  const resolved = this.router.resolveRequest(event.request);
@@ -570,6 +575,7 @@ export class HttpListener {
570
575
  if (resolved.middlewares) {
571
576
  const middlewares = resolved.middlewares(event.injectorContext);
572
577
  if (middlewares.length) {
578
+ inMiddleware = true;
573
579
  await asyncOperation(async (resolve, reject) => {
574
580
  let lastTimer: any = undefined;
575
581
 
@@ -581,6 +587,7 @@ export class HttpListener {
581
587
 
582
588
  event.response.once('finish', finish);
583
589
  let i = -1;
590
+ let timedOut = false;
584
591
 
585
592
  async function next() {
586
593
  i++;
@@ -594,14 +601,18 @@ export class HttpListener {
594
601
  const timeout = middlewares[i].timeout;
595
602
  if (timeout !== undefined && timeout > 0) {
596
603
  lastTimer = setTimeout(() => {
604
+ //a middleware that neither calls next() nor ends the response in time fails the request
605
+ timedOut = true;
597
606
  logger.warn(`Middleware timed out. Increase the timeout or fix the middleware. (${middlewares[i].fn})`);
598
- next();
607
+ event.response.off('finish', finish);
608
+ reject(new HttpGatewayTimeoutError('Middleware timed out'));
599
609
  }, timeout);
600
610
  }
601
611
 
602
612
  try {
603
613
  await middlewares[i].fn(event.request, event.response, (error?: any) => {
604
614
  if (lastTimer) clearTimeout(lastTimer);
615
+ if (timedOut) return;
605
616
  if (error) {
606
617
  event.response.off('finish', finish);
607
618
  reject(error);
@@ -610,19 +621,42 @@ export class HttpListener {
610
621
  }
611
622
  });
612
623
  } catch (error) {
624
+ event.response.off('finish', finish);
613
625
  reject(error);
614
626
  }
615
627
  }
616
628
 
617
629
  await next();
618
630
  });
631
+ inMiddleware = false;
619
632
  }
620
633
  }
621
634
 
635
+ if (event.sent) {
636
+ //a middleware ended the request, so we skip the controller but still trigger onResponse (e.g. for logging)
637
+ event.next('response', new HttpResponseEvent(event.injectorContext, event.request, event.response, undefined, resolved.routeConfig));
638
+ return;
639
+ }
640
+
622
641
  this.setRouteConfig(resolved.routeConfig, event.injectorContext.scope);
623
642
  event.routeFound(resolved.routeConfig, resolved.parameters);
624
643
  }
625
644
  } catch (error) {
645
+ if (error instanceof HttpError) {
646
+ if (event.request.throwErrorOnNotFound && error.httpCode === 404) {
647
+ throw error;
648
+ }
649
+ event.send(new JSONResponse({
650
+ message: error.message
651
+ }, error.httpCode).disableAutoSerializing());
652
+ return;
653
+ }
654
+ if (inMiddleware) {
655
+ //like a failing controller, an error of a middleware is a server error (#439)
656
+ this.logger.error('Middleware error', error);
657
+ event.send(new HtmlResponse('Internal error', 500));
658
+ return;
659
+ }
626
660
  this.logger.error('Could not resolve request', error);
627
661
  event.notFound();
628
662
  }
@@ -702,7 +736,7 @@ export class HttpListener {
702
736
  }
703
737
 
704
738
  if (isElementStruct(result)) {
705
- const html = await getTemplateRender()(event.injectorContext.getRootInjector(), result, this.stopwatch ? this.stopwatch : undefined);
739
+ const html = await (await getTemplateRender())(event.injectorContext.getRootInjector(), result, this.stopwatch ? this.stopwatch : undefined);
706
740
  result = new HtmlResponse(html, 200).header('Content-Type', 'text/html; charset=utf-8');
707
741
  }
708
742
  if (result instanceof stream.Readable) {
package/src/middleware.ts CHANGED
@@ -79,8 +79,8 @@ export class HttpMiddlewareApi {
79
79
  }
80
80
 
81
81
  /**
82
- * When the middleware does not respond (either calling next() or sending headers) withing <timeout> milliseconds,
83
- * automatically the next is executed and warning printed.
82
+ * When the middleware neither calls next() nor ends the response within <timeout> milliseconds,
83
+ * the request fails with HttpGatewayTimeoutError (504) and a warning is logged.
84
84
  */
85
85
  timeout(timeout: number) {
86
86
  this.t.timeout = timeout;