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/node/adapter.js
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.nodeAdapter = nodeAdapter;
|
|
37
|
-
const node_buffer_1 = require("node:buffer");
|
|
38
|
-
const node_http_1 = require("node:http");
|
|
39
|
-
const node_https_1 = require("node:https");
|
|
40
|
-
const config_js_1 = require("../core/config.js");
|
|
41
|
-
const context_js_1 = require("../core/context.js");
|
|
42
|
-
function nodeAdapter(TezX, options = {}) {
|
|
43
|
-
function listen(...arg) {
|
|
44
|
-
let ssl = options?.enableSSL;
|
|
45
|
-
let createServerFn = ssl ? node_https_1.createServer : node_http_1.createServer;
|
|
46
|
-
config_js_1.GlobalConfig.adapter = "node";
|
|
47
|
-
let server = createServerFn(options, async (req, res) => {
|
|
48
|
-
let address = {};
|
|
49
|
-
if (req.socket) {
|
|
50
|
-
address = {
|
|
51
|
-
remoteAddr: {
|
|
52
|
-
family: req.socket.remoteFamily,
|
|
53
|
-
address: req.socket.remoteAddress,
|
|
54
|
-
port: req.socket.remotePort,
|
|
55
|
-
},
|
|
56
|
-
localAddr: {
|
|
57
|
-
address: req.socket.localAddress,
|
|
58
|
-
port: req.socket.localPort,
|
|
59
|
-
family: req.socket.localFamily,
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
let options = {
|
|
64
|
-
connInfo: address,
|
|
65
|
-
};
|
|
66
|
-
const response = await TezX.serve(req, options);
|
|
67
|
-
if (typeof response?.websocket === "function" &&
|
|
68
|
-
response.ctx instanceof context_js_1.Context &&
|
|
69
|
-
response.ctx.wsProtocol) {
|
|
70
|
-
response.websocket(response.ctx, server);
|
|
71
|
-
return res.end();
|
|
72
|
-
}
|
|
73
|
-
const statusText = response?.statusText;
|
|
74
|
-
if (!(response instanceof Response)) {
|
|
75
|
-
throw new Error("Invalid response from TezX.serve");
|
|
76
|
-
}
|
|
77
|
-
if (statusText) {
|
|
78
|
-
res.statusMessage = statusText;
|
|
79
|
-
}
|
|
80
|
-
res.writeHead(response.status, [...response.headers.entries()]);
|
|
81
|
-
const { Readable } = await Promise.resolve().then(() => __importStar(require("node:stream")));
|
|
82
|
-
const body = response.body;
|
|
83
|
-
if (response.headers.get("Content-Type") === "text/event-stream") {
|
|
84
|
-
req.socket.setTimeout(0);
|
|
85
|
-
}
|
|
86
|
-
if (body instanceof Readable) {
|
|
87
|
-
return body.pipe(res);
|
|
88
|
-
}
|
|
89
|
-
else if (body?.pipeTo || body?.getReader) {
|
|
90
|
-
try {
|
|
91
|
-
return Readable.fromWeb(body).pipe(res);
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
config_js_1.GlobalConfig.debugging.warn("Failed to stream web body:", err);
|
|
95
|
-
return res.end();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
else if (typeof body?.[Symbol.asyncIterator] === "function") {
|
|
99
|
-
const readable = Readable.from(body);
|
|
100
|
-
return readable.pipe(res);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
try {
|
|
104
|
-
const buffer = await response.arrayBuffer?.();
|
|
105
|
-
if (buffer && buffer.byteLength > 0) {
|
|
106
|
-
return res.end(node_buffer_1.Buffer.from(buffer));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
return res.end();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
catch (err) {
|
|
113
|
-
config_js_1.GlobalConfig.debugging.warn("Body extraction failed, trying text fallback...");
|
|
114
|
-
const text = await response.text?.();
|
|
115
|
-
return res.end(text ?? "");
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
const port = typeof arg[0] === "function" ? undefined : arg[0];
|
|
120
|
-
const callback = typeof arg[0] === "function" ? arg[0] : arg[1];
|
|
121
|
-
server.listen(options?.unix || port || 0, () => {
|
|
122
|
-
const protocol = ssl ? "\x1b[1;35mhttps\x1b[0m" : "\x1b[1;34mhttp\x1b[0m";
|
|
123
|
-
const address = server.address();
|
|
124
|
-
const message = typeof address === "string"
|
|
125
|
-
? `\x1b[1mNodeJS TezX Server running at unix://${address}\x1b[0m`
|
|
126
|
-
: `\x1b[1mNodeJS TezX Server running at ${protocol}://localhost:${address?.port}/\x1b[0m`;
|
|
127
|
-
config_js_1.GlobalConfig.server = server;
|
|
128
|
-
config_js_1.GlobalConfig.debugging.success(message);
|
|
129
|
-
if (typeof callback == "function")
|
|
130
|
-
callback();
|
|
131
|
-
return server;
|
|
132
|
-
});
|
|
133
|
-
return server;
|
|
134
|
-
}
|
|
135
|
-
return {
|
|
136
|
-
listen,
|
|
137
|
-
};
|
|
138
|
-
}
|
package/cjs/utils/regexRouter.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compileRegexRoute = compileRegexRoute;
|
|
4
|
-
exports.addBaseToRegex = addBaseToRegex;
|
|
5
|
-
exports.regexMatchRoute = regexMatchRoute;
|
|
6
|
-
const url_js_1 = require("./url.js");
|
|
7
|
-
function compileRegexRoute(seg) {
|
|
8
|
-
const segments = typeof seg == 'string' ? seg.split("/").filter(Boolean) : seg;
|
|
9
|
-
let regexStr = "^";
|
|
10
|
-
const paramNames = [];
|
|
11
|
-
for (let seg of segments) {
|
|
12
|
-
if (seg.startsWith(":")) {
|
|
13
|
-
const isOptional = seg.endsWith("?");
|
|
14
|
-
const name = seg.replace(":", "").replace("?", "");
|
|
15
|
-
paramNames.push(name);
|
|
16
|
-
regexStr += isOptional
|
|
17
|
-
? `(?:\\/([^\\/]+))?`
|
|
18
|
-
: `\\/([^\\/]+)`;
|
|
19
|
-
}
|
|
20
|
-
else if (seg.startsWith("*")) {
|
|
21
|
-
const name = seg.slice(1) || "*";
|
|
22
|
-
paramNames.push(name);
|
|
23
|
-
regexStr += `\\/(.+)`;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
regexStr += `\\/${seg}`;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
regexStr += "\\/?$";
|
|
30
|
-
return {
|
|
31
|
-
regex: new RegExp(regexStr),
|
|
32
|
-
paramNames,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function addBaseToRegex(basePath, routeRegex) {
|
|
36
|
-
basePath = "/" + (0, url_js_1.sanitizePathSplit)("/", basePath)?.join("/");
|
|
37
|
-
if (basePath === "/")
|
|
38
|
-
basePath = "";
|
|
39
|
-
let body = routeRegex.source.replace(/^(\^)/, '').replace(/(\$)$/, '');
|
|
40
|
-
body = body.replace(/\\\//g, "/");
|
|
41
|
-
if (body.startsWith("/")) {
|
|
42
|
-
body = body.slice(1);
|
|
43
|
-
}
|
|
44
|
-
const cleaned = body.replace(/^\/+|\/+$/g, "").replace(/\/?\?$/, "");
|
|
45
|
-
const combined = basePath + "/" + cleaned + "/?";
|
|
46
|
-
const finalRegex = new RegExp(`^${combined}$`);
|
|
47
|
-
return finalRegex;
|
|
48
|
-
}
|
|
49
|
-
function regexMatchRoute(regex, url, paramNames = []) {
|
|
50
|
-
const match = url.match(regex);
|
|
51
|
-
if (!match)
|
|
52
|
-
return { success: false, params: {} };
|
|
53
|
-
const params = {};
|
|
54
|
-
paramNames.forEach((name, idx) => {
|
|
55
|
-
params[name] = match[idx + 1] ?? null;
|
|
56
|
-
});
|
|
57
|
-
return { params, success: true };
|
|
58
|
-
}
|
package/cjs/utils/state.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.State = void 0;
|
|
4
|
-
class State {
|
|
5
|
-
state;
|
|
6
|
-
constructor() {
|
|
7
|
-
this.state = new Map();
|
|
8
|
-
}
|
|
9
|
-
set(key, value) {
|
|
10
|
-
this.state.set(key, value);
|
|
11
|
-
}
|
|
12
|
-
get(key) {
|
|
13
|
-
return this.state.get(key);
|
|
14
|
-
}
|
|
15
|
-
delete(key) {
|
|
16
|
-
return this.state.delete(key);
|
|
17
|
-
}
|
|
18
|
-
has(key) {
|
|
19
|
-
return this.state.has(key);
|
|
20
|
-
}
|
|
21
|
-
keys() {
|
|
22
|
-
return Array.from(this.state.keys());
|
|
23
|
-
}
|
|
24
|
-
values() {
|
|
25
|
-
return Array.from(this.state.values());
|
|
26
|
-
}
|
|
27
|
-
entries() {
|
|
28
|
-
return Array.from(this.state.entries());
|
|
29
|
-
}
|
|
30
|
-
clear() {
|
|
31
|
-
this.state.clear();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.State = State;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toWebRequest = toWebRequest;
|
|
4
|
-
const node_stream_1 = require("node:stream");
|
|
5
|
-
function toWebRequest(req, method = "GET") {
|
|
6
|
-
const headers = {};
|
|
7
|
-
for (const [key, value] of Object.entries(req.headers)) {
|
|
8
|
-
if (Array.isArray(value)) {
|
|
9
|
-
headers[key] = value.join(", ");
|
|
10
|
-
}
|
|
11
|
-
else if (typeof value === "string") {
|
|
12
|
-
headers[key] = value;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
const isEncrypted = (req.socket && req.socket.encrypted) || false;
|
|
16
|
-
const protocol = isEncrypted ? "https:" : "http:";
|
|
17
|
-
let host = "localhost";
|
|
18
|
-
const hostHeader = req.headers.host;
|
|
19
|
-
if (typeof hostHeader === "string") {
|
|
20
|
-
host = hostHeader;
|
|
21
|
-
}
|
|
22
|
-
const urlStr = req.url ?? "/";
|
|
23
|
-
const fullUrl = new URL(urlStr, `${protocol}//${host}`);
|
|
24
|
-
const hasBody = !["GET", "HEAD"].includes(method.toUpperCase());
|
|
25
|
-
const body = hasBody ? node_stream_1.Readable.toWeb(req) : undefined;
|
|
26
|
-
const abortController = new AbortController();
|
|
27
|
-
req?.once("close", () => abortController.abort());
|
|
28
|
-
return new Request(fullUrl.href, {
|
|
29
|
-
method,
|
|
30
|
-
headers,
|
|
31
|
-
body,
|
|
32
|
-
signal: abortController.signal,
|
|
33
|
-
duplex: hasBody ? "half" : undefined,
|
|
34
|
-
});
|
|
35
|
-
}
|
package/cjs/ws/deno.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DenoTransport = void 0;
|
|
4
|
-
class DenoTransport {
|
|
5
|
-
async upgrade(ctx, event, options) {
|
|
6
|
-
const { socket, response } = Deno.upgradeWebSocket(ctx.req.rawRequest, {
|
|
7
|
-
protocol: options.protocol,
|
|
8
|
-
idleTimeout: options.idleTimeout,
|
|
9
|
-
});
|
|
10
|
-
this.setupHandlers(socket, ctx, event);
|
|
11
|
-
return response;
|
|
12
|
-
}
|
|
13
|
-
setupHandlers(ws, ctx, event) {
|
|
14
|
-
ws.onopen = () => event.open?.(ws, ctx);
|
|
15
|
-
ws.onmessage = (e) => event.message?.(ws, e.data);
|
|
16
|
-
ws.onclose = (e) => event.close?.(ws, { code: e.code, reason: e.reason });
|
|
17
|
-
ws.onerror = (err) => event.error?.(ws, err);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
exports.DenoTransport = DenoTransport;
|
package/cjs/ws/index.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.upgradeWebSocket = upgradeWebSocket;
|
|
4
|
-
const environment_js_1 = require("../core/environment.js");
|
|
5
|
-
const deno_js_1 = require("./deno.js");
|
|
6
|
-
const node_js_1 = require("./node.js");
|
|
7
|
-
function upgradeWebSocket(callback, options = {}) {
|
|
8
|
-
const { onUpgradeError = (error, ctx) => {
|
|
9
|
-
ctx.setStatus = 401;
|
|
10
|
-
return ctx.text(error.message);
|
|
11
|
-
}, protocol, idleTimeout = 30000, perMessageDeflate, maxPayload = 1048576, } = options;
|
|
12
|
-
return async (ctx, next) => {
|
|
13
|
-
const upgrade = ctx.req.headers.get("upgrade")?.toLowerCase();
|
|
14
|
-
const connection = ctx.req.headers.get("connection")?.toLowerCase();
|
|
15
|
-
const key = ctx.req.headers.get("sec-websocket-key");
|
|
16
|
-
if (upgrade !== "websocket" || !connection?.includes("upgrade") || !key) {
|
|
17
|
-
if (next) {
|
|
18
|
-
ctx.body = { error: "401 Bad Request: Invalid WebSocket headers" };
|
|
19
|
-
return next();
|
|
20
|
-
}
|
|
21
|
-
ctx.setStatus = 401;
|
|
22
|
-
return onUpgradeError(new Error("401 Bad Request: Invalid WebSocket headers"), ctx);
|
|
23
|
-
}
|
|
24
|
-
ctx.wsProtocol = ctx.req.urlRef.protocol === "https:" ? "wss" : "ws";
|
|
25
|
-
try {
|
|
26
|
-
const env = environment_js_1.Environment.getEnvironment;
|
|
27
|
-
if (!callback) {
|
|
28
|
-
throw new Error("WebSocket callback is missing. Please provide a valid callback function to handle the WebSocket events.");
|
|
29
|
-
}
|
|
30
|
-
let websocketCallback = callback(ctx);
|
|
31
|
-
switch (env) {
|
|
32
|
-
case "deno":
|
|
33
|
-
return new deno_js_1.DenoTransport().upgrade(ctx, websocketCallback, {
|
|
34
|
-
idleTimeout,
|
|
35
|
-
protocol,
|
|
36
|
-
});
|
|
37
|
-
case "bun":
|
|
38
|
-
return callback;
|
|
39
|
-
case "node":
|
|
40
|
-
return new node_js_1.NodeTransport().upgrade(ctx, websocketCallback, {
|
|
41
|
-
maxPayload,
|
|
42
|
-
perMessageDeflate,
|
|
43
|
-
});
|
|
44
|
-
default:
|
|
45
|
-
throw new Error("Unsupported environment for WebSocket upgrade.");
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
return onUpgradeError(new Error("WebSocket Upgrade Failed"), ctx);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
exports.default = upgradeWebSocket;
|
package/cjs/ws/node.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.NodeTransport = void 0;
|
|
37
|
-
class NodeTransport {
|
|
38
|
-
wss;
|
|
39
|
-
async upgrade(ctx, event, options) {
|
|
40
|
-
let { WebSocketServer } = await Promise.resolve().then(() => __importStar(require("ws")));
|
|
41
|
-
return (ctx, server) => {
|
|
42
|
-
this.wss = new WebSocketServer({
|
|
43
|
-
noServer: true,
|
|
44
|
-
maxPayload: options.maxPayload ?? 1048576,
|
|
45
|
-
perMessageDeflate: options.perMessageDeflate ?? false,
|
|
46
|
-
});
|
|
47
|
-
server?.on("upgrade", (request, socket, head) => {
|
|
48
|
-
this.wss?.handleUpgrade(request, socket, head, (ws) => {
|
|
49
|
-
this.wss?.emit("connection", ws, request);
|
|
50
|
-
this.setupHandlers(ws, event, options);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
setupHandlers(ws, event, options) {
|
|
56
|
-
event.open?.(ws);
|
|
57
|
-
ws.on("open", () => event.open?.(ws));
|
|
58
|
-
ws.on("message", (data) => event.message?.(ws, data));
|
|
59
|
-
ws.on("close", (code, reason) => event.close?.(ws, { code, reason }));
|
|
60
|
-
ws.on("error", (err) => event.error?.(ws, err));
|
|
61
|
-
ws.on("ping", (data) => event.ping?.(ws, data));
|
|
62
|
-
ws.on("pong", (data) => event.pong?.(ws, data));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
exports.NodeTransport = NodeTransport;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DuplicateMiddlewares, Middleware, UniqueMiddlewares } from "../types/index.js";
|
|
2
|
-
import { CommonHandler } from "./common.js";
|
|
3
|
-
export declare class TriMiddleware {
|
|
4
|
-
children: Map<string, TriMiddleware>;
|
|
5
|
-
middlewares: DuplicateMiddlewares | UniqueMiddlewares;
|
|
6
|
-
isOptional: boolean;
|
|
7
|
-
pathname: string;
|
|
8
|
-
constructor(pathname?: string);
|
|
9
|
-
}
|
|
10
|
-
export default class MiddlewareConfigure<T extends Record<string, any> = {}> extends CommonHandler {
|
|
11
|
-
protected triMiddlewares: TriMiddleware;
|
|
12
|
-
protected basePath: string;
|
|
13
|
-
constructor(basePath?: string);
|
|
14
|
-
protected addMiddleware(pathname: string, middlewares: Middleware<T>[]): void;
|
|
15
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { sanitizePathSplit } from "../utils/url.js";
|
|
2
|
-
import { CommonHandler } from "./common.js";
|
|
3
|
-
import { GlobalConfig } from "./config.js";
|
|
4
|
-
export class TriMiddleware {
|
|
5
|
-
children = new Map();
|
|
6
|
-
middlewares = new Set();
|
|
7
|
-
isOptional = false;
|
|
8
|
-
pathname;
|
|
9
|
-
constructor(pathname = "/") {
|
|
10
|
-
this.pathname = pathname;
|
|
11
|
-
if (GlobalConfig.allowDuplicateMw) {
|
|
12
|
-
this.middlewares = [];
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
this.middlewares = new Set();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export default class MiddlewareConfigure extends CommonHandler {
|
|
20
|
-
triMiddlewares = new TriMiddleware();
|
|
21
|
-
basePath;
|
|
22
|
-
constructor(basePath = "/") {
|
|
23
|
-
super();
|
|
24
|
-
this.basePath = basePath;
|
|
25
|
-
}
|
|
26
|
-
addMiddleware(pathname, middlewares) {
|
|
27
|
-
const parts = sanitizePathSplit(this.basePath, pathname);
|
|
28
|
-
let node = this.triMiddlewares;
|
|
29
|
-
for (const part of parts) {
|
|
30
|
-
if (part.startsWith("*")) {
|
|
31
|
-
if (!node.children.has("*")) {
|
|
32
|
-
node.children.set("*", new TriMiddleware());
|
|
33
|
-
}
|
|
34
|
-
node = node.children.get("*");
|
|
35
|
-
}
|
|
36
|
-
else if (part.startsWith(":")) {
|
|
37
|
-
const isOptional = part?.endsWith("?");
|
|
38
|
-
if (isOptional) {
|
|
39
|
-
node.isOptional = isOptional;
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
if (!node.children.has(":")) {
|
|
43
|
-
node.children.set(":", new TriMiddleware());
|
|
44
|
-
}
|
|
45
|
-
node = node.children.get(":");
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
if (!node.children.has(part)) {
|
|
49
|
-
node.children.set(part, new TriMiddleware());
|
|
50
|
-
}
|
|
51
|
-
node = node.children.get(part);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (GlobalConfig.allowDuplicateMw) {
|
|
55
|
-
node.middlewares.push(...middlewares);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
for (const middleware of middlewares) {
|
|
59
|
-
node.middlewares.add(middleware);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
package/core/common.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Callback, ctx } from "../types/index.js";
|
|
2
|
-
import { Context } from "./context.js";
|
|
3
|
-
export interface option {
|
|
4
|
-
status?: number;
|
|
5
|
-
}
|
|
6
|
-
export type onError<T> = (error: string, ctx: Context) => void;
|
|
7
|
-
export declare class CommonHandler {
|
|
8
|
-
/**
|
|
9
|
-
* Register a custom 404 handler for missing routes
|
|
10
|
-
* @param {Callback} callback - Handler function to execute when no route matches
|
|
11
|
-
* @returns {this} - Returns current instance for chaining
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* // Register a custom not-found handler
|
|
15
|
-
* app.notFound((ctx) => {
|
|
16
|
-
* ctx.status(404).text('Custom not found message');
|
|
17
|
-
* });
|
|
18
|
-
*/
|
|
19
|
-
notFound(callback: Callback): this;
|
|
20
|
-
onError(callback: <T extends Record<string, any> = {}>(err: string, ctx: ctx<T>) => any): this;
|
|
21
|
-
}
|
package/core/common.js
DELETED
package/deno/adpater.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { TezX } from "../core/server.js";
|
|
2
|
-
/**
|
|
3
|
-
* Starts the TezX server using Deno's built-in serve APIs.
|
|
4
|
-
*
|
|
5
|
-
* Automatically selects between Unix socket and TCP server based on options.
|
|
6
|
-
* Supports TLS if TLS options are provided.
|
|
7
|
-
*
|
|
8
|
-
* ### Usage examples:
|
|
9
|
-
* ```ts
|
|
10
|
-
* // Start TCP server on port 3000
|
|
11
|
-
* denoAdapter(app).listen(3000, () => {
|
|
12
|
-
* console.log("Server running on port 3000");
|
|
13
|
-
* });
|
|
14
|
-
*
|
|
15
|
-
* // Start Unix socket server
|
|
16
|
-
* denoAdapter(app, { transport: "unix", path: "/tmp/tezx.sock" }).listen(() => {
|
|
17
|
-
* console.log("Server running on unix socket");
|
|
18
|
-
* });
|
|
19
|
-
*
|
|
20
|
-
* // With TLS
|
|
21
|
-
* denoAdapter(app, {
|
|
22
|
-
* port: 443,
|
|
23
|
-
* cert: Deno.readTextFileSync("./cert.pem"),
|
|
24
|
-
* key: Deno.readTextFileSync("./key.pem"),
|
|
25
|
-
* }).listen();
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @param {number} [port] - TCP port number to listen on (ignored if using Unix socket).
|
|
29
|
-
* @param {(message: string) => void} [callback] - Optional callback invoked after server starts.
|
|
30
|
-
* @returns {Deno.Listener | Deno.Server | null} Returns the server instance or null if Deno runtime is not detected.
|
|
31
|
-
*/
|
|
32
|
-
export declare function denoAdapter<T extends Record<string, any> = {}>(TezX: TezX<T>, options?: Deno.ServeUnixOptions | Deno.ServeTcpOptions | (Deno.ServeTcpOptions & Deno.TlsCertifiedKeyPem)): {
|
|
33
|
-
listen: {
|
|
34
|
-
(callback?: (message: string) => void): any;
|
|
35
|
-
(port?: number): any;
|
|
36
|
-
(port?: number, callback?: (message: string) => void): any;
|
|
37
|
-
};
|
|
38
|
-
};
|
package/deno/adpater.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { GlobalConfig } from "../core/config.js";
|
|
2
|
-
export function denoAdapter(TezX, options = {}) {
|
|
3
|
-
function listen(...arg) {
|
|
4
|
-
const port = typeof arg[0] === "function" ? undefined : arg[0];
|
|
5
|
-
const callback = typeof arg[0] === "function" ? arg[0] : arg[1];
|
|
6
|
-
const isDeno = typeof Deno !== "undefined";
|
|
7
|
-
try {
|
|
8
|
-
async function handleRequest(req, connInfo) {
|
|
9
|
-
let remoteAddr = connInfo.remoteAddr;
|
|
10
|
-
let localAddr = { ...server?.addr };
|
|
11
|
-
let address = {
|
|
12
|
-
remoteAddr: {
|
|
13
|
-
port: remoteAddr?.port,
|
|
14
|
-
address: remoteAddr?.hostname,
|
|
15
|
-
transport: remoteAddr?.transport,
|
|
16
|
-
family: remoteAddr?.family,
|
|
17
|
-
},
|
|
18
|
-
localAddr: {
|
|
19
|
-
port: localAddr?.port,
|
|
20
|
-
address: localAddr?.hostname,
|
|
21
|
-
transport: localAddr?.transport,
|
|
22
|
-
family: localAddr?.family,
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
let options = {
|
|
26
|
-
connInfo: address,
|
|
27
|
-
};
|
|
28
|
-
const response = await TezX.serve(req, options);
|
|
29
|
-
if (response instanceof Response) {
|
|
30
|
-
return response;
|
|
31
|
-
}
|
|
32
|
-
return new Response(response.body ?? null, {
|
|
33
|
-
status: response.status ?? 200,
|
|
34
|
-
statusText: response.statusText || "",
|
|
35
|
-
headers: new Headers(response.headers ?? {}),
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
const server = isDeno
|
|
39
|
-
? options.transport === "unix"
|
|
40
|
-
? Deno.serve(options, handleRequest)
|
|
41
|
-
: Deno.serve({ ...options, port }, handleRequest)
|
|
42
|
-
: null;
|
|
43
|
-
if (!server) {
|
|
44
|
-
throw new Error("Deno is not find");
|
|
45
|
-
}
|
|
46
|
-
GlobalConfig.adapter = "deno";
|
|
47
|
-
GlobalConfig.server = server;
|
|
48
|
-
const protocol = `\x1b[1;34m${options?.cert && options?.key ? "https" : "http"}\x1b[0m`;
|
|
49
|
-
const message = options?.transport !== "unix"
|
|
50
|
-
? `\x1b[1m🚀 Deno TezX Server running at ${protocol}://${(server?.addr).hostname}:${server?.addr?.port}/\x1b[0m`
|
|
51
|
-
: `\x1b[1m🚀 Deno TezX Server running at ${server?.addr?.transport}://${server?.addr?.path}\x1b[0m`;
|
|
52
|
-
GlobalConfig.debugging.success(message);
|
|
53
|
-
if (typeof callback === "function")
|
|
54
|
-
callback();
|
|
55
|
-
return server;
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
throw new Error(err?.message);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
listen,
|
|
63
|
-
};
|
|
64
|
-
}
|
package/helper/common.d.ts
DELETED
package/helper/common.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export function generateID() {
|
|
2
|
-
const timestamp = Date.now().toString(16);
|
|
3
|
-
const random = Math.floor(Math.random() * 0xffffffffffff)
|
|
4
|
-
.toString(16)
|
|
5
|
-
.padStart(12, "0");
|
|
6
|
-
let pid = Math.floor(Math.random() * 0xffff).toString(16).padStart(4, "0");
|
|
7
|
-
if (typeof Deno !== "undefined" && typeof Deno.pid === "number") {
|
|
8
|
-
pid = (Deno.pid % 0xffff).toString(16).padStart(4, "0");
|
|
9
|
-
}
|
|
10
|
-
else if (typeof process !== "undefined" && typeof process.pid === "number") {
|
|
11
|
-
pid = (process.pid % 0xffff).toString(16).padStart(4, "0");
|
|
12
|
-
}
|
|
13
|
-
return `${timestamp}-${random}-${pid}`;
|
|
14
|
-
}
|