dx-server 0.0.1-pre

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 (51) hide show
  1. package/README.md +113 -0
  2. package/cjs/body.d.ts +29 -0
  3. package/cjs/body.js +91 -0
  4. package/cjs/contentType.d.ts +4 -0
  5. package/cjs/contentType.js +92 -0
  6. package/cjs/context.d.ts +15 -0
  7. package/cjs/context.js +27 -0
  8. package/cjs/error.d.ts +5 -0
  9. package/cjs/error.js +42 -0
  10. package/cjs/etag.d.ts +7 -0
  11. package/cjs/etag.js +97 -0
  12. package/cjs/express.d.ts +39 -0
  13. package/cjs/express.js +143 -0
  14. package/cjs/expressApp.d.ts +2 -0
  15. package/cjs/expressApp.js +14 -0
  16. package/cjs/file.d.ts +4 -0
  17. package/cjs/file.js +12 -0
  18. package/cjs/index.d.ts +6 -0
  19. package/cjs/index.js +27 -0
  20. package/cjs/route.d.ts +33 -0
  21. package/cjs/route.js +87 -0
  22. package/cjs/static.d.ts +4 -0
  23. package/cjs/static.js +60 -0
  24. package/cjs/stream.d.ts +11 -0
  25. package/cjs/stream.js +97 -0
  26. package/esm/body.d.ts +28 -0
  27. package/esm/body.js +88 -0
  28. package/esm/contentType.d.ts +4 -0
  29. package/esm/contentType.js +88 -0
  30. package/esm/context.d.ts +15 -0
  31. package/esm/context.js +23 -0
  32. package/esm/error.d.ts +5 -0
  33. package/esm/error.js +37 -0
  34. package/esm/etag.d.ts +7 -0
  35. package/esm/etag.js +90 -0
  36. package/esm/express.d.ts +21 -0
  37. package/esm/express.js +135 -0
  38. package/esm/expressApp.d.ts +2 -0
  39. package/esm/expressApp.js +10 -0
  40. package/esm/file.d.ts +3 -0
  41. package/esm/file.js +8 -0
  42. package/esm/index.d.ts +6 -0
  43. package/esm/index.js +7 -0
  44. package/esm/package.json +3 -0
  45. package/esm/route.d.ts +33 -0
  46. package/esm/route.js +83 -0
  47. package/esm/static.d.ts +4 -0
  48. package/esm/static.js +56 -0
  49. package/esm/stream.d.ts +10 -0
  50. package/esm/stream.js +92 -0
  51. package/package.json +35 -0
package/cjs/express.js ADDED
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setRedirect = exports.setJson = exports.setBuffer = exports.setHtml = exports.setText = exports.expressContext = void 0;
4
+ const jdefer_1 = require("jdefer");
5
+ const util_1 = require("util");
6
+ const etag_js_1 = require("./etag.js");
7
+ const context_js_1 = require("./context.js");
8
+ exports.expressContext = (0, context_js_1.makeContext)(async ({ jsonBeautify } = {}) => {
9
+ return {
10
+ beautify: jsonBeautify,
11
+ };
12
+ }, async (ret, { type, data, charset, beautify }) => {
13
+ const res = context_js_1.responseContext.value;
14
+ const setContentType = (contentType) => {
15
+ if (res.headersSent || res.getHeader('content-type'))
16
+ return;
17
+ res.setHeader('content-type', `${contentType}${charset ? `; charset=${charset}` : ''}`);
18
+ };
19
+ let buffer;
20
+ switch (type) {
21
+ case 'text':
22
+ setContentType('text/plain');
23
+ case 'html':
24
+ setContentType('text/html');
25
+ // shared with text
26
+ buffer = Buffer.from(data, charset);
27
+ break;
28
+ case 'buffer':
29
+ setContentType('application/octet-stream');
30
+ buffer = data;
31
+ break;
32
+ case 'json':
33
+ setContentType('application/json');
34
+ buffer = Buffer.from(beautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
35
+ break;
36
+ case 'redirect':
37
+ buffer = Buffer.from(data, charset);
38
+ break;
39
+ case undefined:
40
+ // not found
41
+ buffer = Buffer.from('not found', charset);
42
+ res.statusCode = 404;
43
+ break;
44
+ default:
45
+ if (!res.getHeader('content-type'))
46
+ res.setHeader('content-type', 'text/plain');
47
+ throw new Error(`unsupported response type ${type}`);
48
+ }
49
+ const req = context_js_1.requestContext.value;
50
+ if (res.headersSent) {
51
+ if (res.writableFinished) {
52
+ // skipped: response is already finished
53
+ }
54
+ else if (res.writableEnded) {
55
+ const defer = (0, jdefer_1.default)();
56
+ res.addListener('finish', defer.resolve);
57
+ await defer.promise;
58
+ // skipped: response is already ended
59
+ // chunk is not fully flushed yet
60
+ }
61
+ else
62
+ await (0, util_1.promisify)(res.end.bind(res))(); // to be consistent, we end the response immediately
63
+ }
64
+ else {
65
+ // https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
66
+ if (res.statusCode === 204) { // No Content
67
+ res.removeHeader('content-type');
68
+ res.removeHeader('content-length');
69
+ res.removeHeader('transfer-encoding');
70
+ // write nothing
71
+ }
72
+ if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
73
+ res.setHeader('content-length', 0);
74
+ res.removeHeader('transfer-encoding');
75
+ }
76
+ else if (req.method === 'HEAD') {
77
+ // write nothing
78
+ }
79
+ else {
80
+ // support: 304 (etag), zipping, file etag and last modified
81
+ res.setHeader('content-length', buffer.length);
82
+ const etag = (0, etag_js_1.entityTag)(buffer);
83
+ const lastModified = res.getHeader('last-modified');
84
+ res.setHeader('ETag', etag);
85
+ if ((0, etag_js_1.isFreshETag)(req, etag)) {
86
+ res.removeHeader('content-type');
87
+ res.removeHeader('content-length');
88
+ res.removeHeader('transfer-encoding');
89
+ res.statusCode = 304;
90
+ // write nothing
91
+ }
92
+ else
93
+ res.write(buffer);
94
+ // fixme: not support content-encoding (gzip, deflate, br) for now
95
+ }
96
+ await (0, util_1.promisify)(res.end.bind(res))();
97
+ }
98
+ return ret;
99
+ });
100
+ function setText(text, { status } = {}) {
101
+ const response = context_js_1.responseContext.value;
102
+ const express = exports.expressContext.value;
103
+ if (status)
104
+ response.statusCode = status;
105
+ express.data = text;
106
+ express.type = 'text';
107
+ }
108
+ exports.setText = setText;
109
+ function setHtml(html, opts = {}) {
110
+ setText(html, opts);
111
+ const express = exports.expressContext.value;
112
+ express.type = 'html';
113
+ }
114
+ exports.setHtml = setHtml;
115
+ function setBuffer(buffer, { status } = {}) {
116
+ const response = context_js_1.responseContext.value;
117
+ const express = exports.expressContext.value;
118
+ if (status)
119
+ response.statusCode = status;
120
+ express.data = buffer;
121
+ express.type = 'buffer';
122
+ }
123
+ exports.setBuffer = setBuffer;
124
+ function setJson(json, { status, beautify } = {}) {
125
+ const response = context_js_1.responseContext.value;
126
+ if (status)
127
+ response.statusCode = status;
128
+ const express = exports.expressContext.value;
129
+ express.data = json;
130
+ express.type = 'json';
131
+ if (beautify !== undefined)
132
+ express.beautify = beautify;
133
+ }
134
+ exports.setJson = setJson;
135
+ function setRedirect(url, status) {
136
+ const response = context_js_1.responseContext.value;
137
+ const express = exports.expressContext.value;
138
+ response.statusCode = status;
139
+ express.data = url;
140
+ express.type = 'redirect';
141
+ }
142
+ exports.setRedirect = setRedirect;
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE4QjtBQUM5QiwrQkFBOEI7QUFDOUIsdUNBQWdEO0FBQ2hELDZDQUF5RTtBQUU1RCxRQUFBLGNBQWMsR0FBRyxJQUFBLHdCQUFXLEVBQUMsS0FBSyxFQUM5QyxFQUFDLFlBQVksS0FFVCxFQUFFLEVBQ0wsRUFBRTtJQUNILE9BQU87UUFDTixRQUFRLEVBQUUsWUFBWTtLQTBCckIsQ0FBQTtBQUNILENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLEVBQUUsRUFBRTtJQUNqRCxNQUFNLEdBQUcsR0FBRyw0QkFBZSxDQUFDLEtBQUssQ0FBQTtJQUNqQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLE1BQU0sQ0FBQTtJQUVWLFFBQVEsSUFBSSxFQUFFO1FBQ2IsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ25DLE1BQUs7UUFDTixLQUFLLFFBQVE7WUFDWixjQUFj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
@@ -0,0 +1,2 @@
1
+ import { Express } from 'express';
2
+ export declare const expressApp: (setup: (app: Express) => any) => <V>(next: () => V) => Promise<any>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expressApp = void 0;
4
+ const express_1 = require("express");
5
+ const context_js_1 = require("./context.js");
6
+ const expressApp = (setup) => {
7
+ const app = (0, express_1.default)();
8
+ setup(app);
9
+ return async (next) => {
10
+ return app(context_js_1.requestContext.value, context_js_1.responseContext.value, next);
11
+ };
12
+ };
13
+ exports.expressApp = expressApp;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc0FwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzQXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUF3QztBQUN4Qyw2Q0FBNEQ7QUFFckQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUE0QixFQUFFLEVBQUU7SUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBQSxpQkFBTyxHQUFFLENBQUE7SUFDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ1YsT0FBTyxLQUFLLEVBQUssSUFBYSxFQUFFLEVBQUU7UUFDakMsT0FBTyxHQUFHLENBQUMsMkJBQWMsQ0FBQyxLQUFLLEVBQUUsNEJBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDOUQsQ0FBQyxDQUFBO0FBQ0YsQ0FBQyxDQUFBO0FBTlksUUFBQSxVQUFVLGNBTXRCIn0=
package/cjs/file.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { IChainable } from 'jchain';
2
+ export declare const serveFile: ({ prefix }: {
3
+ prefix?: string | undefined;
4
+ }) => IChainable;
package/cjs/file.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serveFile = void 0;
4
+ const context_js_1 = require("./context.js");
5
+ const serveFile = ({ prefix = '' }) => next => {
6
+ const req = context_js_1.requestContext.value;
7
+ const res = context_js_1.responseContext.value;
8
+ if (req.method !== 'GET' && req.method !== 'HEAD')
9
+ return next();
10
+ };
11
+ exports.serveFile = serveFile;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE0RDtBQUdyRCxNQUFNLFNBQVMsR0FBRyxDQUN4QixFQUFDLE1BQU0sR0FBRyxFQUFFLEVBRVgsRUFDWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDdkIsTUFBTSxHQUFHLEdBQUcsMkJBQWMsQ0FBQyxLQUFLLENBQUE7SUFDaEMsTUFBTSxHQUFHLEdBQUcsNEJBQWUsQ0FBQyxLQUFLLENBQUE7SUFDakMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0FBQ2pFLENBQUMsQ0FBQTtBQVJZLFFBQUEsU0FBUyxhQVFyQiJ9
package/cjs/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export { requestContext, responseContext } from './context.js';
2
+ export { expressContext, setHtml, setJson } from './express.js';
3
+ export { bufferBodyContext, jsonBodyContext, queryContext, rawBodyContext, textBodyContext, urlencodedBodyContext } from './body.js';
4
+ export { router } from './route.js';
5
+ export { catchApiError, catchError, notFound, notFoundApi } from './error.js';
6
+ export { expressApp } from './expressApp.js';
package/cjs/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expressApp = exports.notFoundApi = exports.notFound = exports.catchError = exports.catchApiError = exports.router = exports.urlencodedBodyContext = exports.textBodyContext = exports.rawBodyContext = exports.queryContext = exports.jsonBodyContext = exports.bufferBodyContext = exports.setJson = exports.setHtml = exports.expressContext = exports.responseContext = exports.requestContext = void 0;
4
+ var context_js_1 = require("./context.js");
5
+ Object.defineProperty(exports, "requestContext", { enumerable: true, get: function () { return context_js_1.requestContext; } });
6
+ Object.defineProperty(exports, "responseContext", { enumerable: true, get: function () { return context_js_1.responseContext; } });
7
+ var express_js_1 = require("./express.js");
8
+ Object.defineProperty(exports, "expressContext", { enumerable: true, get: function () { return express_js_1.expressContext; } });
9
+ Object.defineProperty(exports, "setHtml", { enumerable: true, get: function () { return express_js_1.setHtml; } });
10
+ Object.defineProperty(exports, "setJson", { enumerable: true, get: function () { return express_js_1.setJson; } });
11
+ var body_js_1 = require("./body.js");
12
+ Object.defineProperty(exports, "bufferBodyContext", { enumerable: true, get: function () { return body_js_1.bufferBodyContext; } });
13
+ Object.defineProperty(exports, "jsonBodyContext", { enumerable: true, get: function () { return body_js_1.jsonBodyContext; } });
14
+ Object.defineProperty(exports, "queryContext", { enumerable: true, get: function () { return body_js_1.queryContext; } });
15
+ Object.defineProperty(exports, "rawBodyContext", { enumerable: true, get: function () { return body_js_1.rawBodyContext; } });
16
+ Object.defineProperty(exports, "textBodyContext", { enumerable: true, get: function () { return body_js_1.textBodyContext; } });
17
+ Object.defineProperty(exports, "urlencodedBodyContext", { enumerable: true, get: function () { return body_js_1.urlencodedBodyContext; } });
18
+ var route_js_1 = require("./route.js");
19
+ Object.defineProperty(exports, "router", { enumerable: true, get: function () { return route_js_1.router; } });
20
+ var error_js_1 = require("./error.js");
21
+ Object.defineProperty(exports, "catchApiError", { enumerable: true, get: function () { return error_js_1.catchApiError; } });
22
+ Object.defineProperty(exports, "catchError", { enumerable: true, get: function () { return error_js_1.catchError; } });
23
+ Object.defineProperty(exports, "notFound", { enumerable: true, get: function () { return error_js_1.notFound; } });
24
+ Object.defineProperty(exports, "notFoundApi", { enumerable: true, get: function () { return error_js_1.notFoundApi; } });
25
+ var expressApp_js_1 = require("./expressApp.js");
26
+ Object.defineProperty(exports, "expressApp", { enumerable: true, get: function () { return expressApp_js_1.expressApp; } });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTREO0FBQXBELDRHQUFBLGNBQWMsT0FBQTtBQUFFLDZHQUFBLGVBQWUsT0FBQTtBQUN2QywyQ0FBNkQ7QUFBckQsNEdBQUEsY0FBYyxPQUFBO0FBQUUscUdBQUEsT0FBTyxPQUFBO0FBQUUscUdBQUEsT0FBTyxPQUFBO0FBQ3hDLHFDQU9rQjtBQU5qQiw0R0FBQSxpQkFBaUIsT0FBQTtBQUNqQiwwR0FBQSxlQUFlLE9BQUE7QUFDZix1R0FBQSxZQUFZLE9BQUE7QUFDWix5R0FBQSxjQUFjLE9BQUE7QUFDZCwwR0FBQSxlQUFlLE9BQUE7QUFDZixnSEFBQSxxQkFBcUIsT0FBQTtBQUV0Qix1Q0FBaUM7QUFBekIsa0dBQUEsTUFBTSxPQUFBO0FBQ2QsdUNBQTJFO0FBQW5FLHlHQUFBLGFBQWEsT0FBQTtBQUFFLHNHQUFBLFVBQVUsT0FBQTtBQUFFLG9HQUFBLFFBQVEsT0FBQTtBQUFFLHVHQUFBLFdBQVcsT0FBQTtBQUN4RCxpREFBMEM7QUFBbEMsMkdBQUEsVUFBVSxPQUFBIn0=
package/cjs/route.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { Key } from 'path-to-regexp';
2
+ import { IChainable } from 'jchain';
3
+ interface RegexpToPathOptions {
4
+ end?: boolean;
5
+ strict?: boolean;
6
+ sensitive?: boolean;
7
+ start?: boolean;
8
+ delimiter?: string;
9
+ endsWith?: string;
10
+ encode?(value: string): string;
11
+ prefixes?: string;
12
+ }
13
+ export declare function matchPattern<Params extends Record<Key['name'], string>>(pathname: string, pattern: string, options?: RegexpToPathOptions): {
14
+ matched: any;
15
+ params: any;
16
+ } | undefined;
17
+ interface RouteContext {
18
+ matched: string;
19
+ next(): any;
20
+ params: Record<Key['name'], string>;
21
+ }
22
+ interface RouteDefinition {
23
+ [k: string]: (p: RouteContext) => any;
24
+ }
25
+ declare const allMethods: readonly ["get", "head", "post", "put", "delete", "connect", "options", "trace", "patch"];
26
+ type IRouter = {
27
+ [K in typeof allMethods[number]]: (definition: RouteDefinition, options?: RegexpToPathOptions) => IChainable;
28
+ } & {
29
+ all(definition: RouteDefinition, options?: RegexpToPathOptions): IChainable;
30
+ method(method: string, definition: RouteDefinition, options?: RegexpToPathOptions): IChainable;
31
+ };
32
+ export declare const router: IRouter;
33
+ export {};
package/cjs/route.js ADDED
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.router = exports.matchPattern = void 0;
4
+ const path_to_regexp_1 = require("path-to-regexp");
5
+ const context_js_1 = require("./context.js");
6
+ const jchain_1 = require("jchain");
7
+ const cache = {};
8
+ const cacheLimit = 10000;
9
+ let cacheCount = 0;
10
+ function compilePath(path, options) {
11
+ const cacheKey = JSON.stringify(options);
12
+ const pathCache = cache[cacheKey] || (cache[cacheKey] = {});
13
+ if (pathCache[path])
14
+ return pathCache[path];
15
+ const keys = [];
16
+ const regexp = (0, path_to_regexp_1.pathToRegexp)(path, keys, options);
17
+ const result = {
18
+ regexp,
19
+ keys
20
+ };
21
+ if (cacheCount < cacheLimit) {
22
+ pathCache[path] = result;
23
+ cacheCount++;
24
+ }
25
+ return result;
26
+ }
27
+ function matchPattern(pathname, pattern, options) {
28
+ options = { ...options };
29
+ options.end ??= true;
30
+ options.strict ??= false;
31
+ options.sensitive ??= false;
32
+ options.start ??= true;
33
+ if (!pattern && pattern !== '')
34
+ return;
35
+ const { regexp, keys } = compilePath(pattern, options);
36
+ const match = regexp.exec(pathname);
37
+ if (!match)
38
+ return;
39
+ const [matched, ...values] = match;
40
+ return {
41
+ matched,
42
+ params: keys.reduce((acc, key, index) => {
43
+ acc[key.name] = values[index];
44
+ return acc;
45
+ }, {})
46
+ };
47
+ }
48
+ exports.matchPattern = matchPattern;
49
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
50
+ const allMethods = [
51
+ 'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
52
+ ];
53
+ exports.router = {
54
+ method(method, router, { prefix = '', ...options } = {}) {
55
+ return n => {
56
+ const req = context_js_1.requestContext.value;
57
+ if (req.method !== method.toUpperCase())
58
+ return n();
59
+ return (0, jchain_1.default)(...Object.entries(router).map(([pattern, handler]) => next => {
60
+ const match = matchPattern(req.url ?? '', `${prefix}${pattern}`, options);
61
+ if (!match)
62
+ return next();
63
+ return handler({
64
+ ...match,
65
+ next,
66
+ });
67
+ }), n)();
68
+ };
69
+ },
70
+ all(router, { prefix = '', ...options } = {}) {
71
+ return n => {
72
+ const req = context_js_1.requestContext.value;
73
+ return (0, jchain_1.default)(...Object.entries(router).map(([pattern, handler]) => next => {
74
+ const match = matchPattern(req.url ?? '', `${prefix}${pattern}`, options);
75
+ if (!match)
76
+ return next();
77
+ return handler({
78
+ ...match,
79
+ next,
80
+ });
81
+ }), n)();
82
+ };
83
+ }
84
+ };
85
+ for (const method of allMethods)
86
+ exports.router[method] = exports.router.method.bind(exports.router, method);
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQTJDO0FBQzNDLDZDQUEyQztBQUMzQyxtQ0FBd0M7QUFFeEMsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQTtBQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUE7QUFDeEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFBO0FBY2xCLFNBQVMsV0FBVyxDQUFDLElBQVksRUFBRSxPQUE0QjtJQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUMzRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUUzQyxNQUFNLElBQUksR0FBVSxFQUFFLENBQUE7SUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBQSw2QkFBWSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsTUFBTSxNQUFNLEdBQUc7UUFDZCxNQUFNO1FBQ04sSUFBSTtLQUNKLENBQUE7SUFFRCxJQUFJLFVBQVUsR0FBRyxVQUFVLEVBQUU7UUFDNUIsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQTtRQUN4QixVQUFVLEVBQUUsQ0FBQTtLQUNaO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUMzQixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBNkI7SUFFN0IsT0FBTyxHQUFHLEVBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN0QixPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQTtJQUNwQixP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
@@ -0,0 +1,4 @@
1
+ export declare function staticMiddleware({ root }: {
2
+ root: string;
3
+ maxAge?: number;
4
+ }): (next: () => any) => Promise<any>;
package/cjs/static.js ADDED
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.staticMiddleware = void 0;
4
+ // @ts-nocheck
5
+ const context_js_1 = require("./context.js");
6
+ function staticMiddleware({ root }) {
7
+ return async (next) => {
8
+ const req = context_js_1.requestContext.value;
9
+ if (req.method !== 'GET' && req.method !== 'HEAD')
10
+ return next();
11
+ var forwardError = !fallthrough;
12
+ var originalUrl = parseUrl.original(req);
13
+ var path = parseUrl(req).pathname;
14
+ // make sure redirect occurs at mount
15
+ if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
16
+ path = '';
17
+ }
18
+ // create send stream
19
+ var stream = send(req, path, opts);
20
+ // add directory handler
21
+ stream.on('directory', onDirectory);
22
+ // add headers listener
23
+ if (setHeaders) {
24
+ stream.on('headers', setHeaders);
25
+ }
26
+ // add file listener for fallthrough
27
+ if (fallthrough) {
28
+ stream.on('file', function onFile() {
29
+ // once file is determined, always forward error
30
+ forwardError = true;
31
+ });
32
+ }
33
+ // forward errors
34
+ stream.on('error', function error(err) {
35
+ if (forwardError || !(err.statusCode < 500)) {
36
+ next(err);
37
+ return;
38
+ }
39
+ next();
40
+ });
41
+ // pipe
42
+ stream.pipe(res);
43
+ };
44
+ }
45
+ exports.staticMiddleware = staticMiddleware;
46
+ /**
47
+ * Collapse all leading slashes into a single slash
48
+ * @private
49
+ */
50
+ function collapseLeadingSlashes(str) {
51
+ for (let i = 0; i < str.length; i++) {
52
+ if (str.charCodeAt(i) !== 0x2f /* / */) {
53
+ break;
54
+ }
55
+ }
56
+ return i > 1
57
+ ? '/' + str.slice(i)
58
+ : str;
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxjQUFjO0FBQ2QsNkNBQTJDO0FBRTNDLFNBQWdCLGdCQUFnQixDQUMvQixFQUFDLElBQUksRUFHSjtJQUVELE9BQU8sS0FBSyxFQUFFLElBQWUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLDJCQUFjLENBQUMsS0FBSyxDQUFBO1FBQ2hDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLFlBQVksR0FBRyxDQUFDLFdBQVcsQ0FBQTtRQUMvQixJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3hDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFFakMscUNBQXFDO1FBQ3JDLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUM1RCxJQUFJLEdBQUcsRUFBRSxDQUFBO1NBQ1Q7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFbEMsd0JBQXdCO1FBQ3hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBRW5DLHVCQUF1QjtRQUN2QixJQUFJLFVBQVUsRUFBRTtZQUNmLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1NBQ2hDO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUksV0FBVyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsTUFBTTtnQkFDaEMsZ0RBQWdEO2dCQUNoRCxZQUFZLEdBQUcsSUFBSSxDQUFBO1lBQ3BCLENBQUMsQ0FBQyxDQUFBO1NBQ0Y7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxLQUFLLENBQUMsR0FBRztZQUNwQyxJQUFJLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNULE9BQU07YUFDTjtZQUVELElBQUksRUFBRSxDQUFBO1FBQ1AsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPO1FBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqQixDQUFDLENBQUE7QUFDRixDQUFDO0FBbkRELDRDQW1EQztBQUVEOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCLENBQUUsR0FBVztJQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxNQUFLO1NBQ0w7S0FDRDtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxHQUFHLENBQUE7QUFDUCxDQUFDIn0=
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ /// <reference types="node" />
5
+ import { IncomingMessage } from 'node:http';
6
+ import type { Readable } from 'node:stream';
7
+ export declare function getContentStream(req: IncomingMessage, encoding: string, disableInflate?: boolean): IncomingMessage | import("zlib").Gunzip;
8
+ export declare function readStream(stream: Readable, { length, limit }: {
9
+ length?: number;
10
+ limit?: number;
11
+ }): Promise<Buffer>;
package/cjs/stream.js ADDED
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readStream = exports.getContentStream = void 0;
4
+ const node_zlib_1 = require("node:zlib");
5
+ const jdefer_1 = require("jdefer");
6
+ // note: there might be multiple encodings applied to the stream
7
+ // we only support one encoding
8
+ function getContentStream(req, encoding, disableInflate) {
9
+ if (disableInflate && encoding !== 'identity')
10
+ throw new Error(`content-encoding ${encoding} is not supported`);
11
+ switch (encoding) {
12
+ case 'deflate': {
13
+ const stream = (0, node_zlib_1.createInflate)();
14
+ req.pipe(stream);
15
+ return stream;
16
+ }
17
+ case 'gzip': {
18
+ const stream = (0, node_zlib_1.createGunzip)();
19
+ req.pipe(stream);
20
+ return stream;
21
+ }
22
+ case 'br': {
23
+ const stream = (0, node_zlib_1.createBrotliDecompress)();
24
+ req.pipe(stream);
25
+ return stream;
26
+ }
27
+ case 'identity':
28
+ return req;
29
+ default:
30
+ throw new Error(`unsupported content-encoding ${encoding}`);
31
+ }
32
+ }
33
+ exports.getContentStream = getContentStream;
34
+ // https://github.com/stream-utils/raw-body/blob/191e4b6506dcf77198eed01c8feb4b6817008342/index.js#L155
35
+ async function readStream(stream, { length, limit }) {
36
+ let completed = false;
37
+ // check the length and limit options.
38
+ // note: we intentionally leave the stream paused,
39
+ // so users should handle the stream themselves.
40
+ if (limit !== undefined && length !== undefined && length > limit)
41
+ throw new Error('request entity too large');
42
+ let received = 0;
43
+ const buffers = [];
44
+ const defer = (0, jdefer_1.default)();
45
+ // attach listeners
46
+ stream.on('aborted', onAborted);
47
+ stream.on('close', onClose);
48
+ stream.on('data', onData);
49
+ stream.on('end', onEnd);
50
+ stream.on('error', onError);
51
+ function done(err, result) {
52
+ if (completed)
53
+ return;
54
+ completed = true;
55
+ onClose();
56
+ if (err) {
57
+ stream.unpipe?.();
58
+ stream.pause?.();
59
+ defer.reject(err);
60
+ }
61
+ else
62
+ defer.resolve(result);
63
+ }
64
+ function onData(chunk) {
65
+ if (completed)
66
+ return;
67
+ received += chunk.length;
68
+ if (limit !== undefined && received > limit) {
69
+ done(new Error('request entity too large'));
70
+ }
71
+ else
72
+ buffers.push(chunk);
73
+ }
74
+ function onError(err) {
75
+ done(err);
76
+ }
77
+ function onEnd() {
78
+ if (length !== undefined && received !== length)
79
+ done(new Error('request size did not match content length'));
80
+ else
81
+ done(undefined, Buffer.concat(buffers));
82
+ }
83
+ function onAborted() {
84
+ done(new Error('request aborted'));
85
+ }
86
+ function onClose() {
87
+ buffers.splice(0, buffers.length);
88
+ stream.off('aborted', onAborted);
89
+ stream.off('data', onData);
90
+ stream.off('end', onEnd);
91
+ stream.off('error', onEnd);
92
+ stream.off('close', onClose);
93
+ }
94
+ return await defer.promise;
95
+ }
96
+ exports.readStream = readStream;
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx5Q0FBNkU7QUFDN0UsbUNBQThCO0FBRTlCLGdFQUFnRTtBQUNoRSwrQkFBK0I7QUFDL0IsU0FBZ0IsZ0JBQWdCLENBQUMsR0FBb0IsRUFBRSxRQUFnQixFQUFFLGNBQXdCO0lBQ2hHLElBQUksY0FBYyxJQUFJLFFBQVEsS0FBSyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsUUFBUSxtQkFBbUIsQ0FBQyxDQUFBO0lBRS9HLFFBQVEsUUFBUSxFQUFFO1FBQ2pCLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxJQUFBLHlCQUFhLEdBQUUsQ0FBQTtZQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2hCLE9BQU8sTUFBTSxDQUFBO1NBQ2I7UUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ1osTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBWSxHQUFFLENBQUE7WUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQixPQUFPLE1BQU0sQ0FBQTtTQUNiO1FBQ0QsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNWLE1BQU0sTUFBTSxHQUFHLElBQUEsa0NBQXNCLEdBQUUsQ0FBQTtZQUN2QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2hCLE9BQU8sTUFBTSxDQUFBO1NBQ2I7UUFDRCxLQUFLLFVBQVU7WUFDZCxPQUFPLEdBQUcsQ0FBQTtRQUNYO1lBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUM1RDtBQUNGLENBQUM7QUF4QkQsNENBd0JDO0FBRUQsdUdBQXVHO0FBQ2hHLEtBQUssVUFBVSxVQUFVLENBQy9CLE1BQWdCLEVBQ2hCLEVBQUMsTUFB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
package/esm/body.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ export declare const bufferBodyContext: {
2
+ readonly value: unknown;
3
+ chain(params_0?: {
4
+ limit?: number | undefined;
5
+ } | undefined): <V>(next: () => V) => Promise<any>;
6
+ };
7
+ export declare const jsonBodyContext: {
8
+ readonly value: unknown;
9
+ chain(): <V>(next: () => V) => Promise<any>;
10
+ };
11
+ export declare const rawBodyContext: {
12
+ readonly value: unknown;
13
+ chain(): <V>(next: () => V) => Promise<any>;
14
+ };
15
+ export declare const textBodyContext: {
16
+ readonly value: unknown;
17
+ chain(): <V>(next: () => V) => Promise<any>;
18
+ };
19
+ export declare const urlencodedBodyContext: {
20
+ readonly value: unknown;
21
+ chain(params_0?: {
22
+ simplify?: boolean | undefined;
23
+ } | undefined): <V>(next: () => V) => Promise<any>;
24
+ };
25
+ export declare const queryContext: {
26
+ readonly value: unknown;
27
+ chain(): <V>(next: () => V) => Promise<any>;
28
+ };