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/esm/route.js ADDED
@@ -0,0 +1,83 @@
1
+ import { pathToRegexp } from 'path-to-regexp';
2
+ import { requestContext } from './context.js';
3
+ import chain from 'jchain';
4
+ const cache = {};
5
+ const cacheLimit = 10000;
6
+ let cacheCount = 0;
7
+ function compilePath(path, options) {
8
+ const cacheKey = JSON.stringify(options);
9
+ const pathCache = cache[cacheKey] || (cache[cacheKey] = {});
10
+ if (pathCache[path])
11
+ return pathCache[path];
12
+ const keys = [];
13
+ const regexp = pathToRegexp(path, keys, options);
14
+ const result = {
15
+ regexp,
16
+ keys
17
+ };
18
+ if (cacheCount < cacheLimit) {
19
+ pathCache[path] = result;
20
+ cacheCount++;
21
+ }
22
+ return result;
23
+ }
24
+ export function matchPattern(pathname, pattern, options) {
25
+ options = { ...options };
26
+ options.end ??= true;
27
+ options.strict ??= false;
28
+ options.sensitive ??= false;
29
+ options.start ??= true;
30
+ if (!pattern && pattern !== '')
31
+ return;
32
+ const { regexp, keys } = compilePath(pattern, options);
33
+ const match = regexp.exec(pathname);
34
+ if (!match)
35
+ return;
36
+ const [matched, ...values] = match;
37
+ return {
38
+ matched,
39
+ params: keys.reduce((acc, key, index) => {
40
+ acc[key.name] = values[index];
41
+ return acc;
42
+ }, {})
43
+ };
44
+ }
45
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
46
+ const allMethods = [
47
+ 'get', 'head', 'post', 'put', 'delete', 'connect', 'options', 'trace', 'patch'
48
+ ];
49
+ export const router = {
50
+ method(method, router, { prefix = '', ...options } = {}) {
51
+ return n => {
52
+ const req = requestContext.value;
53
+ if (req.method !== method.toUpperCase())
54
+ return n();
55
+ return chain(...Object.entries(router).map(([pattern, handler]) => next => {
56
+ const match = matchPattern(req.url ?? '', `${prefix}${pattern}`, options);
57
+ if (!match)
58
+ return next();
59
+ return handler({
60
+ ...match,
61
+ next,
62
+ });
63
+ }), n)();
64
+ };
65
+ },
66
+ all(router, { prefix = '', ...options } = {}) {
67
+ return n => {
68
+ const req = requestContext.value;
69
+ return chain(...Object.entries(router).map(([pattern, handler]) => next => {
70
+ const match = matchPattern(req.url ?? '', `${prefix}${pattern}`, options);
71
+ if (!match)
72
+ return next();
73
+ return handler({
74
+ ...match,
75
+ next,
76
+ });
77
+ }), n)();
78
+ };
79
+ }
80
+ };
81
+ for (const method of allMethods)
82
+ router[method] = router.method.bind(router, method);
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxLQUFtQixNQUFNLFFBQVEsQ0FBQTtBQUV4QyxNQUFNLEtBQUssR0FBd0IsRUFBRSxDQUFBO0FBQ3JDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQTtBQUN4QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7QUFjbEIsU0FBUyxXQUFXLENBQUMsSUFBWSxFQUFFLE9BQTRCO0lBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzNELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQTtJQUN0QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxNQUFNLE1BQU0sR0FBRztRQUNkLE1BQU07UUFDTixJQUFJO0tBQ0osQ0FBQTtJQUVELElBQUksVUFBVSxHQUFHLFVBQVUsRUFBRTtRQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFBO1FBQ3hCLFVBQVUsRUFBRSxDQUFBO0tBQ1o7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMzQixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBNkI7SUFFN0IsT0FBTyxH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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/esm/static.js ADDED
@@ -0,0 +1,56 @@
1
+ // @ts-nocheck
2
+ import { requestContext } from './context.js';
3
+ export function staticMiddleware({ root }) {
4
+ return async (next) => {
5
+ const req = requestContext.value;
6
+ if (req.method !== 'GET' && req.method !== 'HEAD')
7
+ return next();
8
+ var forwardError = !fallthrough;
9
+ var originalUrl = parseUrl.original(req);
10
+ var path = parseUrl(req).pathname;
11
+ // make sure redirect occurs at mount
12
+ if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
13
+ path = '';
14
+ }
15
+ // create send stream
16
+ var stream = send(req, path, opts);
17
+ // add directory handler
18
+ stream.on('directory', onDirectory);
19
+ // add headers listener
20
+ if (setHeaders) {
21
+ stream.on('headers', setHeaders);
22
+ }
23
+ // add file listener for fallthrough
24
+ if (fallthrough) {
25
+ stream.on('file', function onFile() {
26
+ // once file is determined, always forward error
27
+ forwardError = true;
28
+ });
29
+ }
30
+ // forward errors
31
+ stream.on('error', function error(err) {
32
+ if (forwardError || !(err.statusCode < 500)) {
33
+ next(err);
34
+ return;
35
+ }
36
+ next();
37
+ });
38
+ // pipe
39
+ stream.pipe(res);
40
+ };
41
+ }
42
+ /**
43
+ * Collapse all leading slashes into a single slash
44
+ * @private
45
+ */
46
+ function collapseLeadingSlashes(str) {
47
+ for (let i = 0; i < str.length; i++) {
48
+ if (str.charCodeAt(i) !== 0x2f /* / */) {
49
+ break;
50
+ }
51
+ }
52
+ return i > 1
53
+ ? '/' + str.slice(i)
54
+ : str;
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUUzQyxNQUFNLFVBQVUsZ0JBQWdCLENBQy9CLEVBQUMsSUFBSSxFQUdKO0lBRUQsT0FBTyxLQUFLLEVBQUUsSUFBZSxFQUFFLEVBQUU7UUFDaEMsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQTtRQUNoQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFaEUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxXQUFXLENBQUE7UUFDL0IsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN4QyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFBO1FBRWpDLHFDQUFxQztRQUNyQyxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDNUQsSUFBSSxHQUFHLEVBQUUsQ0FBQTtTQUNUO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRWxDLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUVuQyx1QkFBdUI7UUFDdkIsSUFBSSxVQUFVLEVBQUU7WUFDZixNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtTQUNoQztRQUVELG9DQUFvQztRQUNwQyxJQUFJLFdBQVcsRUFBRTtZQUNoQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU07Z0JBQ2hDLGdEQUFnRDtnQkFDaEQsWUFBWSxHQUFHLElBQUksQ0FBQTtZQUNwQixDQUFDLENBQUMsQ0FBQTtTQUNGO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUc7WUFDcEMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDVCxPQUFNO2FBQ047WUFFRCxJQUFJLEVBQUUsQ0FBQTtRQUNQLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTztRQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCLENBQUUsR0FBVztJQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxNQUFLO1NBQ0w7S0FDRDtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDWCxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxHQUFHLENBQUE7QUFDUCxDQUFDIn0=
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ import { IncomingMessage } from 'node:http';
5
+ import type { Readable } from 'node:stream';
6
+ export declare function getContentStream(req: IncomingMessage, encoding: string, disableInflate?: boolean): IncomingMessage | import("zlib").Gunzip;
7
+ export declare function readStream(stream: Readable, { length, limit }: {
8
+ length?: number;
9
+ limit?: number;
10
+ }): Promise<any>;
package/esm/stream.js ADDED
@@ -0,0 +1,92 @@
1
+ import { createInflate, createGunzip, createBrotliDecompress } from 'node:zlib';
2
+ import makeDefer from 'jdefer';
3
+ // note: there might be multiple encodings applied to the stream
4
+ // we only support one encoding
5
+ export function getContentStream(req, encoding, disableInflate) {
6
+ if (disableInflate && encoding !== 'identity')
7
+ throw new Error(`content-encoding ${encoding} is not supported`);
8
+ switch (encoding) {
9
+ case 'deflate': {
10
+ const stream = createInflate();
11
+ req.pipe(stream);
12
+ return stream;
13
+ }
14
+ case 'gzip': {
15
+ const stream = createGunzip();
16
+ req.pipe(stream);
17
+ return stream;
18
+ }
19
+ case 'br': {
20
+ const stream = createBrotliDecompress();
21
+ req.pipe(stream);
22
+ return stream;
23
+ }
24
+ case 'identity':
25
+ return req;
26
+ default:
27
+ throw new Error(`unsupported content-encoding ${encoding}`);
28
+ }
29
+ }
30
+ // https://github.com/stream-utils/raw-body/blob/191e4b6506dcf77198eed01c8feb4b6817008342/index.js#L155
31
+ export async function readStream(stream, { length, limit }) {
32
+ let completed = false;
33
+ // check the length and limit options.
34
+ // note: we intentionally leave the stream paused,
35
+ // so users should handle the stream themselves.
36
+ if (limit !== undefined && length !== undefined && length > limit)
37
+ throw new Error('request entity too large');
38
+ let received = 0;
39
+ const buffers = [];
40
+ const defer = makeDefer();
41
+ // attach listeners
42
+ stream.on('aborted', onAborted);
43
+ stream.on('close', onClose);
44
+ stream.on('data', onData);
45
+ stream.on('end', onEnd);
46
+ stream.on('error', onError);
47
+ function done(err, result) {
48
+ if (completed)
49
+ return;
50
+ completed = true;
51
+ onClose();
52
+ if (err) {
53
+ stream.unpipe?.();
54
+ stream.pause?.();
55
+ defer.reject(err);
56
+ }
57
+ else
58
+ defer.resolve(result);
59
+ }
60
+ function onData(chunk) {
61
+ if (completed)
62
+ return;
63
+ received += chunk.length;
64
+ if (limit !== undefined && received > limit) {
65
+ done(new Error('request entity too large'));
66
+ }
67
+ else
68
+ buffers.push(chunk);
69
+ }
70
+ function onError(err) {
71
+ done(err);
72
+ }
73
+ function onEnd() {
74
+ if (length !== undefined && received !== length)
75
+ done(new Error('request size did not match content length'));
76
+ else
77
+ done(undefined, Buffer.concat(buffers));
78
+ }
79
+ function onAborted() {
80
+ done(new Error('request aborted'));
81
+ }
82
+ function onClose() {
83
+ buffers.splice(0, buffers.length);
84
+ stream.off('aborted', onAborted);
85
+ stream.off('data', onData);
86
+ stream.off('end', onEnd);
87
+ stream.off('error', onEnd);
88
+ stream.off('close', onClose);
89
+ }
90
+ return await defer.promise;
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM3RSxPQUFPLFNBQVMsTUFBTSxRQUFRLENBQUE7QUFFOUIsZ0VBQWdFO0FBQ2hFLCtCQUErQjtBQUMvQixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBb0IsRUFBRSxRQUFnQixFQUFFLGNBQXdCO0lBQ2hHLElBQUksY0FBYyxJQUFJLFFBQVEsS0FBSyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsUUFBUSxtQkFBbUIsQ0FBQyxDQUFBO0lBRS9HLFFBQVEsUUFBUSxFQUFFO1FBQ2pCLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQTtZQUM5QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2hCLE9BQU8sTUFBTSxDQUFBO1NBQ2I7UUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ1osTUFBTSxNQUFNLEdBQUcsWUFBWSxFQUFFLENBQUE7WUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQixPQUFPLE1BQU0sQ0FBQTtTQUNiO1FBQ0QsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNWLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixFQUFFLENBQUE7WUFDdkMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQixPQUFPLE1BQU0sQ0FBQTtTQUNiO1FBQ0QsS0FBSyxVQUFVO1lBQ2QsT0FBTyxHQUFHLENBQUE7UUFDWDtZQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLFFBQVEsRUFBRSxDQUFDLENBQUE7S0FDNUQ7QUFDRixDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLE1B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
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "dx-server",
3
+ "version": "0.0.1-pre",
4
+ "main": "./cjs/index.js",
5
+ "repository": "git@github.com:tranvansang/dx-server.git",
6
+ "author": "Sang Tran <t@sang.jp>",
7
+ "files": [
8
+ "cjs",
9
+ "esm"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "import": "./esm/index.js",
14
+ "require": "./cjs/index.js"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "prepublish": "./compile.sh"
19
+ },
20
+ "license": "MIT",
21
+ "packageManager": "yarn@3.6.1",
22
+ "devDependencies": {
23
+ "@types/node": "^20.4.9",
24
+ "@types/path-to-regexp": "^1.7.0",
25
+ "type-fest": "^4.2.0",
26
+ "typescript": "^5.1.6"
27
+ },
28
+ "dependencies": {
29
+ "jchain": "^0.0.2",
30
+ "jdefer": "^0.0.9",
31
+ "jmisc": "^0.0.8",
32
+ "path-to-regexp": "^6.2.1",
33
+ "qs": "^6.11.2"
34
+ }
35
+ }