tezx 2.0.11 → 3.0.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.
- package/README.md +122 -89
- package/bun/getConnInfo.d.ts +21 -0
- package/bun/getConnInfo.js +9 -0
- package/bun/index.d.ts +10 -4
- package/bun/index.js +8 -4
- package/bun/ws.d.ts +48 -0
- package/bun/ws.js +58 -0
- package/cjs/bun/getConnInfo.js +12 -0
- package/cjs/bun/index.js +35 -7
- package/cjs/bun/ws.js +63 -0
- package/cjs/core/config.js +2 -12
- package/cjs/core/context.js +131 -379
- package/cjs/core/error.js +49 -0
- package/cjs/core/request.js +79 -131
- package/cjs/core/router.js +54 -387
- package/cjs/core/server.js +83 -202
- package/cjs/deno/env.js +4 -4
- package/cjs/deno/getConnInfo.js +18 -0
- package/cjs/deno/index.js +11 -18
- package/cjs/deno/serveStatic.js +53 -0
- package/cjs/deno/ws.js +39 -0
- package/cjs/helper/index.js +46 -10
- package/cjs/index.js +5 -7
- package/cjs/jwt/node.js +94 -0
- package/cjs/jwt/web.js +178 -0
- package/cjs/middleware/basic-auth.js +42 -0
- package/cjs/middleware/bearer-auth.js +34 -0
- package/cjs/middleware/cache-control.js +44 -0
- package/cjs/middleware/cors.js +11 -21
- package/cjs/middleware/detect-bot.js +57 -0
- package/cjs/middleware/i18n.js +73 -60
- package/cjs/middleware/index.js +8 -46
- package/cjs/middleware/logger.js +9 -4
- package/cjs/middleware/pagination.js +3 -2
- package/cjs/middleware/powered-by.js +3 -2
- package/cjs/middleware/rate-limiter.js +38 -0
- package/cjs/middleware/request-id.js +4 -5
- package/cjs/middleware/sanitize-headers.js +22 -0
- package/cjs/middleware/secure-headers copy.js +143 -0
- package/cjs/middleware/secure-headers.js +157 -0
- package/cjs/middleware/{xssProtection.js → xss-protection.js} +5 -8
- package/cjs/node/env.js +7 -7
- package/cjs/node/getConnInfo.js +16 -0
- package/cjs/node/index.js +17 -18
- package/cjs/node/mount-node.js +59 -0
- package/cjs/node/serveStatic.js +56 -0
- package/cjs/node/toWebRequest.js +25 -0
- package/cjs/node/ws.js +82 -0
- package/cjs/registry/RadixRouter.js +148 -0
- package/cjs/registry/index.js +17 -0
- package/cjs/types/headers.js +2 -0
- package/cjs/types/index.js +13 -0
- package/cjs/utils/buffer.js +17 -0
- package/cjs/utils/colors.js +2 -0
- package/cjs/utils/cookie.js +59 -0
- package/cjs/utils/file.js +136 -0
- package/cjs/utils/formData.js +60 -10
- package/cjs/utils/generateID.js +37 -0
- package/cjs/utils/low-level.js +115 -0
- package/cjs/utils/{staticFile.js → mimeTypes.js} +0 -87
- package/cjs/utils/rateLimit.js +41 -0
- package/cjs/utils/response.js +65 -0
- package/cjs/{core/environment.js → utils/runtime.js} +2 -1
- package/cjs/utils/url.js +65 -30
- package/core/config.d.ts +2 -7
- package/core/config.js +2 -12
- package/core/context.d.ts +209 -164
- package/core/context.js +131 -346
- package/core/error.d.ts +96 -0
- package/core/error.js +44 -0
- package/core/request.d.ts +67 -107
- package/core/request.js +78 -130
- package/core/router.d.ts +138 -133
- package/core/router.js +53 -352
- package/core/server.d.ts +99 -38
- package/core/server.js +83 -202
- package/deno/env.js +3 -3
- package/deno/getConnInfo.d.ts +21 -0
- package/deno/getConnInfo.js +15 -0
- package/deno/index.d.ts +9 -4
- package/deno/index.js +7 -4
- package/deno/serveStatic.d.ts +28 -0
- package/deno/serveStatic.js +49 -0
- package/deno/ws.d.ts +42 -0
- package/deno/ws.js +36 -0
- package/helper/index.d.ts +29 -15
- package/helper/index.js +27 -7
- package/index.d.ts +10 -8
- package/index.js +4 -5
- package/jwt/node.d.ts +39 -0
- package/jwt/node.js +87 -0
- package/jwt/web.d.ts +14 -0
- package/jwt/web.js +174 -0
- package/middleware/basic-auth.d.ts +56 -0
- package/middleware/basic-auth.js +38 -0
- package/middleware/bearer-auth.d.ts +53 -0
- package/middleware/bearer-auth.js +30 -0
- package/middleware/cache-control.d.ts +30 -0
- package/middleware/cache-control.js +40 -0
- package/middleware/cors.d.ts +30 -3
- package/middleware/cors.js +12 -22
- package/middleware/detect-bot.d.ts +113 -0
- package/middleware/detect-bot.js +53 -0
- package/middleware/i18n.d.ts +166 -73
- package/middleware/i18n.js +73 -60
- package/middleware/index.d.ts +8 -32
- package/middleware/index.js +8 -44
- package/middleware/logger.d.ts +5 -2
- package/middleware/logger.js +9 -4
- package/middleware/pagination.d.ts +9 -6
- package/middleware/pagination.js +3 -2
- package/middleware/powered-by.d.ts +2 -1
- package/middleware/powered-by.js +3 -2
- package/middleware/{rateLimiter.d.ts → rate-limiter.d.ts} +15 -9
- package/middleware/rate-limiter.js +34 -0
- package/middleware/request-id.d.ts +2 -1
- package/middleware/request-id.js +5 -6
- package/middleware/{sanitizeHeader.d.ts → sanitize-headers.d.ts} +5 -19
- package/middleware/sanitize-headers.js +18 -0
- package/middleware/secure-headers copy.d.ts +15 -0
- package/middleware/secure-headers copy.js +136 -0
- package/middleware/secure-headers.d.ts +132 -0
- package/middleware/secure-headers.js +153 -0
- package/middleware/{xssProtection.d.ts → xss-protection.d.ts} +2 -1
- package/middleware/xss-protection.js +19 -0
- package/node/env.js +4 -4
- package/node/getConnInfo.d.ts +21 -0
- package/node/getConnInfo.js +13 -0
- package/node/index.d.ts +13 -4
- package/node/index.js +11 -4
- package/node/mount-node.d.ts +11 -0
- package/node/mount-node.js +56 -0
- package/node/serveStatic.d.ts +36 -0
- package/node/serveStatic.js +52 -0
- package/node/toWebRequest.js +22 -0
- package/node/ws.d.ts +56 -0
- package/node/ws.js +46 -0
- package/package.json +39 -30
- package/registry/RadixRouter.d.ts +40 -0
- package/registry/RadixRouter.js +144 -0
- package/registry/index.d.ts +2 -0
- package/registry/index.js +1 -0
- package/types/headers.d.ts +2 -0
- package/types/headers.js +1 -0
- package/types/index.d.ts +318 -18
- package/types/index.js +12 -1
- package/utils/buffer.d.ts +1 -0
- package/utils/buffer.js +14 -0
- package/utils/colors.d.ts +24 -0
- package/utils/colors.js +2 -0
- package/utils/cookie.d.ts +55 -0
- package/utils/cookie.js +53 -0
- package/utils/file.d.ts +38 -0
- package/utils/file.js +96 -0
- package/utils/formData.d.ts +41 -1
- package/utils/formData.js +58 -9
- package/utils/generateID.d.ts +42 -0
- package/utils/generateID.js +32 -0
- package/utils/httpStatusMap.d.ts +14 -0
- package/utils/low-level.d.ts +58 -0
- package/utils/low-level.js +108 -0
- package/utils/mimeTypes.d.ts +4 -0
- package/utils/{staticFile.js → mimeTypes.js} +0 -53
- package/utils/rateLimit.d.ts +18 -0
- package/utils/rateLimit.js +37 -0
- package/utils/response.d.ts +18 -0
- package/utils/response.js +58 -0
- package/{core/environment.d.ts → utils/runtime.d.ts} +1 -0
- package/{core/environment.js → utils/runtime.js} +1 -0
- package/utils/url.d.ts +42 -14
- package/utils/url.js +61 -27
- package/bun/adapter.d.ts +0 -127
- package/bun/adapter.js +0 -97
- package/cjs/bun/adapter.js +0 -100
- package/cjs/core/MiddlewareConfigure.js +0 -68
- package/cjs/core/common.js +0 -15
- package/cjs/deno/adpater.js +0 -67
- package/cjs/helper/common.js +0 -17
- package/cjs/middleware/basicAuth.js +0 -71
- package/cjs/middleware/cacheControl.js +0 -90
- package/cjs/middleware/detectBot.js +0 -104
- package/cjs/middleware/detectLocale.js +0 -43
- package/cjs/middleware/lazyLoadModules.js +0 -73
- package/cjs/middleware/rateLimiter.js +0 -24
- package/cjs/middleware/requestTimeout.js +0 -42
- package/cjs/middleware/sanitizeHeader.js +0 -51
- package/cjs/middleware/secureHeaders.js +0 -42
- package/cjs/node/adapter.js +0 -138
- package/cjs/utils/regexRouter.js +0 -58
- package/cjs/utils/state.js +0 -34
- package/cjs/utils/toWebRequest.js +0 -35
- package/cjs/ws/deno.js +0 -20
- package/cjs/ws/index.js +0 -53
- package/cjs/ws/node.js +0 -65
- package/core/MiddlewareConfigure.d.ts +0 -15
- package/core/MiddlewareConfigure.js +0 -63
- package/core/common.d.ts +0 -21
- package/core/common.js +0 -11
- package/deno/adpater.d.ts +0 -38
- package/deno/adpater.js +0 -64
- package/helper/common.d.ts +0 -5
- package/helper/common.js +0 -14
- package/middleware/basicAuth.d.ts +0 -81
- package/middleware/basicAuth.js +0 -67
- package/middleware/cacheControl.d.ts +0 -48
- package/middleware/cacheControl.js +0 -53
- package/middleware/detectBot.d.ts +0 -121
- package/middleware/detectBot.js +0 -98
- package/middleware/detectLocale.d.ts +0 -55
- package/middleware/detectLocale.js +0 -39
- package/middleware/lazyLoadModules.d.ts +0 -72
- package/middleware/lazyLoadModules.js +0 -69
- package/middleware/rateLimiter.js +0 -20
- package/middleware/requestTimeout.d.ts +0 -25
- package/middleware/requestTimeout.js +0 -38
- package/middleware/sanitizeHeader.js +0 -47
- package/middleware/secureHeaders.d.ts +0 -78
- package/middleware/secureHeaders.js +0 -38
- package/middleware/xssProtection.js +0 -22
- package/node/adapter.d.ts +0 -46
- package/node/adapter.js +0 -102
- package/utils/regexRouter.d.ts +0 -66
- package/utils/regexRouter.js +0 -53
- package/utils/state.d.ts +0 -50
- package/utils/state.js +0 -30
- package/utils/staticFile.d.ts +0 -10
- package/utils/toWebRequest.js +0 -32
- package/ws/deno.d.ts +0 -6
- package/ws/deno.js +0 -16
- package/ws/index.d.ts +0 -180
- package/ws/index.js +0 -50
- package/ws/node.d.ts +0 -7
- package/ws/node.js +0 -28
- /package/{utils → node}/toWebRequest.d.ts +0 -0
package/cjs/utils/formData.js
CHANGED
|
@@ -1,13 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
exports.useFormData = useFormData;
|
|
4
|
+
exports.processFile = processFile;
|
|
5
|
+
const low_level_js_1 = require("./low-level.js");
|
|
6
|
+
async function useFormData(ctx, options) {
|
|
7
|
+
const fd = await ctx.req.formData();
|
|
8
|
+
const result = {};
|
|
9
|
+
let totalFileBytes = 0;
|
|
10
|
+
for (const [key, originalVal] of fd.entries()) {
|
|
11
|
+
let val = originalVal;
|
|
12
|
+
if (val instanceof File && options) {
|
|
13
|
+
val = await processFile(val, key, options, () => totalFileBytes);
|
|
14
|
+
totalFileBytes += val.size;
|
|
15
|
+
if (typeof options.maxTotalSize === "number" &&
|
|
16
|
+
totalFileBytes > options.maxTotalSize) {
|
|
17
|
+
throw new Error(`Total file bytes exceeded maxTotalSize=${options.maxTotalSize}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else if (typeof val === "string" &&
|
|
21
|
+
options?.maxFieldSize &&
|
|
22
|
+
val.length > options.maxFieldSize) {
|
|
23
|
+
throw new Error(`Field "${key}" length ${val.length} exceeds maxFieldSize=${options.maxFieldSize}`);
|
|
24
|
+
}
|
|
25
|
+
if (key in result) {
|
|
26
|
+
if (!Array.isArray(result[key])) {
|
|
27
|
+
result[key] = [result[key]];
|
|
28
|
+
}
|
|
29
|
+
result[key].push(val);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
result[key] = val;
|
|
33
|
+
}
|
|
34
|
+
if (val instanceof File && typeof options?.maxFiles === "number") {
|
|
35
|
+
const filesForKey = Array.isArray(result[key])
|
|
36
|
+
? result[key].filter((v) => v instanceof File).length
|
|
37
|
+
: result[key] instanceof File
|
|
38
|
+
? 1
|
|
39
|
+
: 0;
|
|
40
|
+
if (filesForKey > options.maxFiles) {
|
|
41
|
+
throw new Error(`Field "${key}" exceeds maxFiles (${options.maxFiles})`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
async function processFile(file, key, options, totalGetter) {
|
|
48
|
+
let name = file.name;
|
|
49
|
+
if (options.sanitized) {
|
|
50
|
+
name = `${Date.now()}-${(0, low_level_js_1.sanitized)(name)}`;
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(options.allowedTypes) &&
|
|
53
|
+
!options.allowedTypes.includes(file.type)) {
|
|
54
|
+
throw new Error(`Field "${key}": invalid file type "${file.type}". Allowed: ${options.allowedTypes.join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
if (typeof options.maxSize === "number" && file.size > options.maxSize) {
|
|
57
|
+
throw new Error(`Field "${key}": file size ${file.size} > maxSize ${options.maxSize}`);
|
|
58
|
+
}
|
|
59
|
+
if (name !== file.name) {
|
|
60
|
+
return new File([await file.arrayBuffer()], name, { type: file.type });
|
|
61
|
+
}
|
|
62
|
+
return file;
|
|
13
63
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateID = generateID;
|
|
4
|
+
exports.generateUUID = generateUUID;
|
|
5
|
+
exports.generateRandomBase64 = generateRandomBase64;
|
|
6
|
+
function generateID() {
|
|
7
|
+
const timestamp = Date.now().toString(16);
|
|
8
|
+
let randomHex = "";
|
|
9
|
+
if (typeof crypto !== "undefined" &&
|
|
10
|
+
typeof crypto.getRandomValues === "function") {
|
|
11
|
+
const array = new Uint8Array(6);
|
|
12
|
+
crypto.getRandomValues(array);
|
|
13
|
+
for (let i = 0; i < array.length; i++) {
|
|
14
|
+
randomHex += array[i].toString(16).padStart(2, "0");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
randomHex = Math.floor(Math.random() * 0xffffffffffff)
|
|
19
|
+
.toString(16)
|
|
20
|
+
.padStart(12, "0");
|
|
21
|
+
}
|
|
22
|
+
return `${timestamp}-${randomHex}`;
|
|
23
|
+
}
|
|
24
|
+
function generateUUID() {
|
|
25
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function")
|
|
26
|
+
return crypto.randomUUID();
|
|
27
|
+
return generateID();
|
|
28
|
+
}
|
|
29
|
+
function generateRandomBase64(length = 16) {
|
|
30
|
+
let result = "";
|
|
31
|
+
const BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
32
|
+
for (let i = 0; i < length; i++) {
|
|
33
|
+
const idx = Math.floor(Math.random() * 64);
|
|
34
|
+
result += BASE64[idx];
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeHeaderKey = normalizeHeaderKey;
|
|
4
|
+
exports.extensionExtract = extensionExtract;
|
|
5
|
+
exports.sanitizePathSplitBasePath = sanitizePathSplitBasePath;
|
|
6
|
+
exports.sanitizePathSplit = sanitizePathSplit;
|
|
7
|
+
exports.sanitized = sanitized;
|
|
8
|
+
function normalizeHeaderKey(key) {
|
|
9
|
+
let result = "";
|
|
10
|
+
let upperNext = true;
|
|
11
|
+
for (let i = 0; i < key.length; i++) {
|
|
12
|
+
const ch = key.charCodeAt(i);
|
|
13
|
+
if (ch === 45) {
|
|
14
|
+
result += "-";
|
|
15
|
+
upperNext = true;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
result += upperNext
|
|
19
|
+
? String.fromCharCode(ch >= 97 && ch <= 122 ? ch - 32 : ch)
|
|
20
|
+
: String.fromCharCode(ch >= 65 && ch <= 90 ? ch + 32 : ch);
|
|
21
|
+
upperNext = false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
function extensionExtract(filePath) {
|
|
27
|
+
let lastDot = -1;
|
|
28
|
+
for (let i = filePath.length - 1; i >= 0; i--) {
|
|
29
|
+
if (filePath[i] === ".") {
|
|
30
|
+
lastDot = i;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (lastDot === -1 || lastDot === filePath.length - 1)
|
|
35
|
+
return "";
|
|
36
|
+
let ext = "";
|
|
37
|
+
for (let i = lastDot + 1; i < filePath.length; i++) {
|
|
38
|
+
let c = filePath.charCodeAt(i);
|
|
39
|
+
if (c >= 65 && c <= 90) {
|
|
40
|
+
c += 32;
|
|
41
|
+
}
|
|
42
|
+
ext += String.fromCharCode(c);
|
|
43
|
+
}
|
|
44
|
+
return ext;
|
|
45
|
+
}
|
|
46
|
+
function sanitizePathSplitBasePath(basePath, path, out) {
|
|
47
|
+
const combined = `${basePath}/${path}`;
|
|
48
|
+
const parts = out ?? [];
|
|
49
|
+
let segStart = 0;
|
|
50
|
+
let i = 0;
|
|
51
|
+
const len = combined.length;
|
|
52
|
+
while (i < len) {
|
|
53
|
+
const code = combined.charCodeAt(i);
|
|
54
|
+
if (code === 47 || code === 92) {
|
|
55
|
+
if (segStart < i) {
|
|
56
|
+
const seg = combined.slice(segStart, i);
|
|
57
|
+
if (seg !== "..")
|
|
58
|
+
parts.push(seg);
|
|
59
|
+
}
|
|
60
|
+
segStart = i + 1;
|
|
61
|
+
}
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
if (segStart < len) {
|
|
65
|
+
const seg = combined.slice(segStart, len);
|
|
66
|
+
if (seg !== "..")
|
|
67
|
+
parts.push(seg);
|
|
68
|
+
}
|
|
69
|
+
return parts;
|
|
70
|
+
}
|
|
71
|
+
function sanitizePathSplit(path, out) {
|
|
72
|
+
const parts = out ?? [];
|
|
73
|
+
let segStart = 0;
|
|
74
|
+
let i = 0;
|
|
75
|
+
const len = path.length;
|
|
76
|
+
while (i < len) {
|
|
77
|
+
const code = path.charCodeAt(i);
|
|
78
|
+
if (code === 47 || code === 92) {
|
|
79
|
+
if (segStart < i) {
|
|
80
|
+
const seg = path.slice(segStart, i);
|
|
81
|
+
if (seg !== "..")
|
|
82
|
+
parts.push(seg);
|
|
83
|
+
}
|
|
84
|
+
segStart = i + 1;
|
|
85
|
+
}
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
if (segStart < len) {
|
|
89
|
+
const seg = path.slice(segStart, len);
|
|
90
|
+
if (seg !== "..")
|
|
91
|
+
parts.push(seg);
|
|
92
|
+
}
|
|
93
|
+
return parts;
|
|
94
|
+
}
|
|
95
|
+
function sanitized(title) {
|
|
96
|
+
const len = title.length;
|
|
97
|
+
let result = "";
|
|
98
|
+
let dash = false;
|
|
99
|
+
for (let i = 0; i < len; i++) {
|
|
100
|
+
let ch = title.charCodeAt(i);
|
|
101
|
+
if (ch >= 65 && ch <= 90)
|
|
102
|
+
ch += 32;
|
|
103
|
+
if ((ch >= 97 && ch <= 122) || (ch >= 48 && ch <= 57) || ch === 46) {
|
|
104
|
+
result += String.fromCharCode(ch);
|
|
105
|
+
dash = false;
|
|
106
|
+
}
|
|
107
|
+
else if (ch === 32 || ch === 95 || ch === 45) {
|
|
108
|
+
if (!dash && result.length > 0) {
|
|
109
|
+
result += "-";
|
|
110
|
+
dash = true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return result.endsWith("-") ? result.slice(0, -1) : result;
|
|
115
|
+
}
|
|
@@ -1,41 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.defaultMimeType = exports.mimeTypes = void 0;
|
|
37
|
-
exports.getFiles = getFiles;
|
|
38
|
-
const environment_js_1 = require("../core/environment.js");
|
|
39
4
|
exports.mimeTypes = {
|
|
40
5
|
html: "text/html",
|
|
41
6
|
htm: "text/html",
|
|
@@ -140,55 +105,3 @@ exports.mimeTypes = {
|
|
|
140
105
|
gcode: "text/x.gcode",
|
|
141
106
|
};
|
|
142
107
|
exports.defaultMimeType = "application/octet-stream";
|
|
143
|
-
async function getFiles(dir, basePath = "/", ref, option) {
|
|
144
|
-
const files = [];
|
|
145
|
-
const runtime = environment_js_1.Environment.getEnvironment;
|
|
146
|
-
if (runtime == "deno") {
|
|
147
|
-
for await (const entry of Deno.readDir(dir)) {
|
|
148
|
-
const path = `${dir}/${entry.name}`;
|
|
149
|
-
if (entry.isDirectory) {
|
|
150
|
-
files.push(...(await getFiles(path, `${basePath}/${entry.name}`, ref, option)));
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
const x = `${basePath}/${entry.name}`;
|
|
154
|
-
files.push({
|
|
155
|
-
file: path,
|
|
156
|
-
path: x.replace(/\\/g, "/"),
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
const fs = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
|
|
163
|
-
const path = await Promise.resolve().then(() => __importStar(require("node:path")));
|
|
164
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
165
|
-
for (const entry of entries) {
|
|
166
|
-
const fullPath = path.join(dir, entry.name);
|
|
167
|
-
if (entry.isDirectory()) {
|
|
168
|
-
files.push(...(await getFiles(fullPath, `${basePath}/${entry.name}`, ref, option)));
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
const path = `${basePath}/${entry.name}`;
|
|
172
|
-
files.push({
|
|
173
|
-
file: fullPath,
|
|
174
|
-
path: path.replace(/\\/g, "/"),
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
files.forEach((r) => {
|
|
180
|
-
ref.get(r.path, (ctx) => {
|
|
181
|
-
if (option.cacheControl) {
|
|
182
|
-
ctx.headers.set("Cache-Control", option.cacheControl);
|
|
183
|
-
}
|
|
184
|
-
if (option.headers) {
|
|
185
|
-
for (const key in option.headers) {
|
|
186
|
-
let value = option.headers?.[key];
|
|
187
|
-
ctx.headers.set(key, value);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return ctx.sendFile(r.file);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
return files;
|
|
194
|
-
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRateLimitDefaultStorage = createRateLimitDefaultStorage;
|
|
4
|
+
exports.isRateLimit = isRateLimit;
|
|
5
|
+
function createRateLimitDefaultStorage() {
|
|
6
|
+
const store = new Map();
|
|
7
|
+
return {
|
|
8
|
+
get: (key) => store.get(key),
|
|
9
|
+
set: (key, value) => store.set(key, value),
|
|
10
|
+
clearExpired: () => {
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
for (const [key, entry] of store.entries()) {
|
|
13
|
+
if (now >= entry.resetTime) {
|
|
14
|
+
store.delete(key);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function isRateLimit(key, store, maxRequests, windowMs) {
|
|
21
|
+
store?.clearExpired();
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
let entry = store.get(key) || { count: 0, resetTime: now + windowMs };
|
|
24
|
+
if (now < entry.resetTime) {
|
|
25
|
+
entry.count++;
|
|
26
|
+
if (entry.count > maxRequests) {
|
|
27
|
+
return {
|
|
28
|
+
check: true,
|
|
29
|
+
entry: entry,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
entry = { count: 1, resetTime: now + windowMs };
|
|
35
|
+
}
|
|
36
|
+
store.set(key, entry);
|
|
37
|
+
return {
|
|
38
|
+
check: false,
|
|
39
|
+
entry: entry,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.notFoundResponse = void 0;
|
|
4
|
+
exports.handleErrorResponse = handleErrorResponse;
|
|
5
|
+
exports.toString = toString;
|
|
6
|
+
exports.determineContentTypeBody = determineContentTypeBody;
|
|
7
|
+
const config_js_1 = require("../core/config.js");
|
|
8
|
+
const error_js_1 = require("../core/error.js");
|
|
9
|
+
let notFoundResponse = (ctx) => {
|
|
10
|
+
const { method, pathname } = ctx;
|
|
11
|
+
return ctx.text(`${method}: '${pathname}' could not find\n`, {
|
|
12
|
+
status: 404,
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
exports.notFoundResponse = notFoundResponse;
|
|
16
|
+
async function handleErrorResponse(err = error_js_1.TezXError.internal(), ctx) {
|
|
17
|
+
if (err instanceof error_js_1.TezXError) {
|
|
18
|
+
config_js_1.GlobalConfig.debugging.error(err.details ?? err?.message);
|
|
19
|
+
return ctx
|
|
20
|
+
.status(err.statusCode ?? 500)
|
|
21
|
+
.send(err.details ?? err?.message ?? "Internal Server Error");
|
|
22
|
+
}
|
|
23
|
+
return await handleErrorResponse(error_js_1.TezXError.internal(), ctx);
|
|
24
|
+
}
|
|
25
|
+
function toString(input, values) {
|
|
26
|
+
if (typeof input === "string") {
|
|
27
|
+
return input;
|
|
28
|
+
}
|
|
29
|
+
let result = "";
|
|
30
|
+
for (let i = 0; i < input.length; i++) {
|
|
31
|
+
result += input[i];
|
|
32
|
+
if (i < values.length)
|
|
33
|
+
result += values[i];
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
function determineContentTypeBody(body) {
|
|
38
|
+
if (typeof body === "string" ||
|
|
39
|
+
typeof body === "number" ||
|
|
40
|
+
typeof body === "boolean") {
|
|
41
|
+
return { type: "text/plain; charset=utf-8", body: String(body) };
|
|
42
|
+
}
|
|
43
|
+
if (body instanceof Uint8Array || body instanceof ArrayBuffer) {
|
|
44
|
+
return { type: "application/octet-stream", body };
|
|
45
|
+
}
|
|
46
|
+
if (typeof Buffer !== "undefined" && Buffer.isBuffer(body)) {
|
|
47
|
+
return { type: "application/octet-stream", body };
|
|
48
|
+
}
|
|
49
|
+
if (typeof ReadableStream !== "undefined" && body instanceof ReadableStream) {
|
|
50
|
+
return { type: "application/octet-stream", body };
|
|
51
|
+
}
|
|
52
|
+
if (typeof Blob !== "undefined" && body instanceof Blob) {
|
|
53
|
+
return { type: body.type || "application/octet-stream", body };
|
|
54
|
+
}
|
|
55
|
+
if (typeof body === "object" && typeof body?.pipe === "function") {
|
|
56
|
+
return { type: "application/octet-stream", body };
|
|
57
|
+
}
|
|
58
|
+
if (typeof body === "object") {
|
|
59
|
+
return {
|
|
60
|
+
type: "application/json; charset=utf-8",
|
|
61
|
+
body: JSON.stringify(body),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { type: "text/plain; charset=utf-8", body: String(body ?? "") };
|
|
65
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Environment = void 0;
|
|
3
|
+
exports.runtime = exports.Environment = void 0;
|
|
4
4
|
class Environment {
|
|
5
5
|
static get getEnvironment() {
|
|
6
6
|
if (typeof Bun !== "undefined")
|
|
@@ -13,3 +13,4 @@ class Environment {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
exports.Environment = Environment;
|
|
16
|
+
exports.runtime = Environment.getEnvironment;
|
package/cjs/utils/url.js
CHANGED
|
@@ -1,35 +1,70 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
5
|
-
exports.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
exports.getPathname = void 0;
|
|
4
|
+
exports.queryParser = queryParser;
|
|
5
|
+
exports.url2query = url2query;
|
|
6
|
+
let getPathname = (url) => {
|
|
7
|
+
const len = url.length;
|
|
8
|
+
if (len === 0)
|
|
9
|
+
return "/";
|
|
10
|
+
const start = url.indexOf("/", url.charCodeAt(9) === 58 ? 13 : 8);
|
|
11
|
+
if (start === -1)
|
|
12
|
+
return "/";
|
|
13
|
+
let end = url.indexOf("?", start);
|
|
14
|
+
if (end === -1)
|
|
15
|
+
end = url.indexOf("#", start);
|
|
16
|
+
if (end === -1)
|
|
17
|
+
end = len;
|
|
18
|
+
return start === end ? "/" : url.slice(start, end);
|
|
19
|
+
};
|
|
20
|
+
exports.getPathname = getPathname;
|
|
21
|
+
function queryParser(qs) {
|
|
22
|
+
if (!qs?.length)
|
|
23
|
+
return {};
|
|
24
|
+
const startPos = qs.charCodeAt(0) === 63 ? 1 : 0;
|
|
25
|
+
const len = qs.length;
|
|
26
|
+
const query = {};
|
|
27
|
+
let keyStart = startPos, valStart = -1;
|
|
28
|
+
let i = startPos;
|
|
29
|
+
const reuseArray = [];
|
|
30
|
+
for (; i <= len; i++) {
|
|
31
|
+
const ch = i < len ? qs.charCodeAt(i) : 38;
|
|
32
|
+
if (ch === 61 && valStart === -1) {
|
|
33
|
+
valStart = i + 1;
|
|
34
|
+
}
|
|
35
|
+
else if (ch === 38 || i === len) {
|
|
36
|
+
const keyEnd = valStart === -1 ? i : valStart - 1;
|
|
37
|
+
const key = qs.slice(keyStart, keyEnd);
|
|
38
|
+
const val = valStart === -1 ? "" : qs.slice(valStart, i);
|
|
39
|
+
const existing = query[key];
|
|
40
|
+
if (existing !== undefined) {
|
|
41
|
+
if (Array.isArray(existing)) {
|
|
42
|
+
existing.push(val);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
reuseArray.length = 0;
|
|
46
|
+
reuseArray[0] = existing;
|
|
47
|
+
reuseArray[1] = val;
|
|
48
|
+
query[key] = reuseArray.slice();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
query[key] = val;
|
|
53
|
+
}
|
|
54
|
+
keyStart = i + 1;
|
|
55
|
+
valStart = -1;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return query;
|
|
16
59
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
});
|
|
60
|
+
function url2query(url) {
|
|
61
|
+
let pathStart = url.indexOf("/", url.charCodeAt(9) === 58 ? 13 : 8);
|
|
62
|
+
if (pathStart === -1)
|
|
63
|
+
pathStart = url.length;
|
|
64
|
+
let queryStart = url.indexOf("?", pathStart);
|
|
65
|
+
if (queryStart === -1) {
|
|
66
|
+
return {};
|
|
25
67
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
query: query,
|
|
29
|
-
protocol: u?.protocol,
|
|
30
|
-
origin: u?.origin,
|
|
31
|
-
hostname: u?.hostname,
|
|
32
|
-
href: url,
|
|
33
|
-
port: u?.port,
|
|
34
|
-
};
|
|
68
|
+
let qs = url.slice(queryStart + 1);
|
|
69
|
+
return queryParser(qs);
|
|
35
70
|
}
|
package/core/config.d.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Runtime } from "../types/index.js";
|
|
2
2
|
export declare let GlobalConfig: {
|
|
3
3
|
new (): {};
|
|
4
|
-
notFound: Callback;
|
|
5
|
-
onError: <T extends Record<string, any> = {}>(err: string, ctx: ctx<T>) => Response;
|
|
6
|
-
allowDuplicateMw?: boolean;
|
|
7
|
-
overwriteMethod?: boolean;
|
|
8
4
|
debugMode?: boolean;
|
|
9
|
-
|
|
10
|
-
adapter: AdapterType;
|
|
5
|
+
adapter: Runtime;
|
|
11
6
|
readonly debugging: {
|
|
12
7
|
info: (msg: string, ...args: unknown[]) => void;
|
|
13
8
|
warn: (msg: string, ...args: unknown[]) => void;
|
package/core/config.js
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
import { loggerOutput } from "../utils/debugging.js";
|
|
2
|
-
import {
|
|
2
|
+
import { runtime } from "../utils/runtime.js";
|
|
3
3
|
export let GlobalConfig = class {
|
|
4
|
-
static notFound = (ctx) => {
|
|
5
|
-
const { method, urlRef: { pathname }, } = ctx.req;
|
|
6
|
-
return ctx.text(`${method}: '${pathname}' could not find\n`, 404);
|
|
7
|
-
};
|
|
8
|
-
static onError = (err, ctx) => {
|
|
9
|
-
return ctx.text(err, 500);
|
|
10
|
-
};
|
|
11
|
-
static allowDuplicateMw = false;
|
|
12
|
-
static overwriteMethod = true;
|
|
13
4
|
static debugMode = false;
|
|
14
|
-
static
|
|
15
|
-
static adapter = Environment.getEnvironment;
|
|
5
|
+
static adapter = runtime;
|
|
16
6
|
static get debugging() {
|
|
17
7
|
return this.debugMode
|
|
18
8
|
? {
|