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.
Files changed (234) hide show
  1. package/README.md +122 -89
  2. package/bun/getConnInfo.d.ts +21 -0
  3. package/bun/getConnInfo.js +9 -0
  4. package/bun/index.d.ts +10 -4
  5. package/bun/index.js +8 -4
  6. package/bun/ws.d.ts +48 -0
  7. package/bun/ws.js +58 -0
  8. package/cjs/bun/getConnInfo.js +12 -0
  9. package/cjs/bun/index.js +35 -7
  10. package/cjs/bun/ws.js +63 -0
  11. package/cjs/core/config.js +2 -12
  12. package/cjs/core/context.js +131 -379
  13. package/cjs/core/error.js +49 -0
  14. package/cjs/core/request.js +79 -131
  15. package/cjs/core/router.js +54 -387
  16. package/cjs/core/server.js +83 -202
  17. package/cjs/deno/env.js +4 -4
  18. package/cjs/deno/getConnInfo.js +18 -0
  19. package/cjs/deno/index.js +11 -18
  20. package/cjs/deno/serveStatic.js +53 -0
  21. package/cjs/deno/ws.js +39 -0
  22. package/cjs/helper/index.js +46 -10
  23. package/cjs/index.js +5 -7
  24. package/cjs/jwt/node.js +94 -0
  25. package/cjs/jwt/web.js +178 -0
  26. package/cjs/middleware/basic-auth.js +42 -0
  27. package/cjs/middleware/bearer-auth.js +34 -0
  28. package/cjs/middleware/cache-control.js +44 -0
  29. package/cjs/middleware/cors.js +11 -21
  30. package/cjs/middleware/detect-bot.js +57 -0
  31. package/cjs/middleware/i18n.js +73 -60
  32. package/cjs/middleware/index.js +8 -46
  33. package/cjs/middleware/logger.js +9 -4
  34. package/cjs/middleware/pagination.js +3 -2
  35. package/cjs/middleware/powered-by.js +3 -2
  36. package/cjs/middleware/rate-limiter.js +38 -0
  37. package/cjs/middleware/request-id.js +4 -5
  38. package/cjs/middleware/sanitize-headers.js +22 -0
  39. package/cjs/middleware/secure-headers copy.js +143 -0
  40. package/cjs/middleware/secure-headers.js +157 -0
  41. package/cjs/middleware/{xssProtection.js → xss-protection.js} +5 -8
  42. package/cjs/node/env.js +7 -7
  43. package/cjs/node/getConnInfo.js +16 -0
  44. package/cjs/node/index.js +17 -18
  45. package/cjs/node/mount-node.js +59 -0
  46. package/cjs/node/serveStatic.js +56 -0
  47. package/cjs/node/toWebRequest.js +25 -0
  48. package/cjs/node/ws.js +82 -0
  49. package/cjs/registry/RadixRouter.js +148 -0
  50. package/cjs/registry/index.js +17 -0
  51. package/cjs/types/headers.js +2 -0
  52. package/cjs/types/index.js +13 -0
  53. package/cjs/utils/buffer.js +17 -0
  54. package/cjs/utils/colors.js +2 -0
  55. package/cjs/utils/cookie.js +59 -0
  56. package/cjs/utils/file.js +136 -0
  57. package/cjs/utils/formData.js +60 -10
  58. package/cjs/utils/generateID.js +37 -0
  59. package/cjs/utils/low-level.js +115 -0
  60. package/cjs/utils/{staticFile.js → mimeTypes.js} +0 -87
  61. package/cjs/utils/rateLimit.js +41 -0
  62. package/cjs/utils/response.js +65 -0
  63. package/cjs/{core/environment.js → utils/runtime.js} +2 -1
  64. package/cjs/utils/url.js +65 -30
  65. package/core/config.d.ts +2 -7
  66. package/core/config.js +2 -12
  67. package/core/context.d.ts +209 -164
  68. package/core/context.js +131 -346
  69. package/core/error.d.ts +96 -0
  70. package/core/error.js +44 -0
  71. package/core/request.d.ts +67 -107
  72. package/core/request.js +78 -130
  73. package/core/router.d.ts +138 -133
  74. package/core/router.js +53 -352
  75. package/core/server.d.ts +99 -38
  76. package/core/server.js +83 -202
  77. package/deno/env.js +3 -3
  78. package/deno/getConnInfo.d.ts +21 -0
  79. package/deno/getConnInfo.js +15 -0
  80. package/deno/index.d.ts +9 -4
  81. package/deno/index.js +7 -4
  82. package/deno/serveStatic.d.ts +28 -0
  83. package/deno/serveStatic.js +49 -0
  84. package/deno/ws.d.ts +42 -0
  85. package/deno/ws.js +36 -0
  86. package/helper/index.d.ts +29 -15
  87. package/helper/index.js +27 -7
  88. package/index.d.ts +10 -8
  89. package/index.js +4 -5
  90. package/jwt/node.d.ts +39 -0
  91. package/jwt/node.js +87 -0
  92. package/jwt/web.d.ts +14 -0
  93. package/jwt/web.js +174 -0
  94. package/middleware/basic-auth.d.ts +56 -0
  95. package/middleware/basic-auth.js +38 -0
  96. package/middleware/bearer-auth.d.ts +53 -0
  97. package/middleware/bearer-auth.js +30 -0
  98. package/middleware/cache-control.d.ts +30 -0
  99. package/middleware/cache-control.js +40 -0
  100. package/middleware/cors.d.ts +30 -3
  101. package/middleware/cors.js +12 -22
  102. package/middleware/detect-bot.d.ts +113 -0
  103. package/middleware/detect-bot.js +53 -0
  104. package/middleware/i18n.d.ts +166 -73
  105. package/middleware/i18n.js +73 -60
  106. package/middleware/index.d.ts +8 -32
  107. package/middleware/index.js +8 -44
  108. package/middleware/logger.d.ts +5 -2
  109. package/middleware/logger.js +9 -4
  110. package/middleware/pagination.d.ts +9 -6
  111. package/middleware/pagination.js +3 -2
  112. package/middleware/powered-by.d.ts +2 -1
  113. package/middleware/powered-by.js +3 -2
  114. package/middleware/{rateLimiter.d.ts → rate-limiter.d.ts} +15 -9
  115. package/middleware/rate-limiter.js +34 -0
  116. package/middleware/request-id.d.ts +2 -1
  117. package/middleware/request-id.js +5 -6
  118. package/middleware/{sanitizeHeader.d.ts → sanitize-headers.d.ts} +5 -19
  119. package/middleware/sanitize-headers.js +18 -0
  120. package/middleware/secure-headers copy.d.ts +15 -0
  121. package/middleware/secure-headers copy.js +136 -0
  122. package/middleware/secure-headers.d.ts +132 -0
  123. package/middleware/secure-headers.js +153 -0
  124. package/middleware/{xssProtection.d.ts → xss-protection.d.ts} +2 -1
  125. package/middleware/xss-protection.js +19 -0
  126. package/node/env.js +4 -4
  127. package/node/getConnInfo.d.ts +21 -0
  128. package/node/getConnInfo.js +13 -0
  129. package/node/index.d.ts +13 -4
  130. package/node/index.js +11 -4
  131. package/node/mount-node.d.ts +11 -0
  132. package/node/mount-node.js +56 -0
  133. package/node/serveStatic.d.ts +36 -0
  134. package/node/serveStatic.js +52 -0
  135. package/node/toWebRequest.js +22 -0
  136. package/node/ws.d.ts +56 -0
  137. package/node/ws.js +46 -0
  138. package/package.json +39 -30
  139. package/registry/RadixRouter.d.ts +40 -0
  140. package/registry/RadixRouter.js +144 -0
  141. package/registry/index.d.ts +2 -0
  142. package/registry/index.js +1 -0
  143. package/types/headers.d.ts +2 -0
  144. package/types/headers.js +1 -0
  145. package/types/index.d.ts +318 -18
  146. package/types/index.js +12 -1
  147. package/utils/buffer.d.ts +1 -0
  148. package/utils/buffer.js +14 -0
  149. package/utils/colors.d.ts +24 -0
  150. package/utils/colors.js +2 -0
  151. package/utils/cookie.d.ts +55 -0
  152. package/utils/cookie.js +53 -0
  153. package/utils/file.d.ts +38 -0
  154. package/utils/file.js +96 -0
  155. package/utils/formData.d.ts +41 -1
  156. package/utils/formData.js +58 -9
  157. package/utils/generateID.d.ts +42 -0
  158. package/utils/generateID.js +32 -0
  159. package/utils/httpStatusMap.d.ts +14 -0
  160. package/utils/low-level.d.ts +58 -0
  161. package/utils/low-level.js +108 -0
  162. package/utils/mimeTypes.d.ts +4 -0
  163. package/utils/{staticFile.js → mimeTypes.js} +0 -53
  164. package/utils/rateLimit.d.ts +18 -0
  165. package/utils/rateLimit.js +37 -0
  166. package/utils/response.d.ts +18 -0
  167. package/utils/response.js +58 -0
  168. package/{core/environment.d.ts → utils/runtime.d.ts} +1 -0
  169. package/{core/environment.js → utils/runtime.js} +1 -0
  170. package/utils/url.d.ts +42 -14
  171. package/utils/url.js +61 -27
  172. package/bun/adapter.d.ts +0 -127
  173. package/bun/adapter.js +0 -97
  174. package/cjs/bun/adapter.js +0 -100
  175. package/cjs/core/MiddlewareConfigure.js +0 -68
  176. package/cjs/core/common.js +0 -15
  177. package/cjs/deno/adpater.js +0 -67
  178. package/cjs/helper/common.js +0 -17
  179. package/cjs/middleware/basicAuth.js +0 -71
  180. package/cjs/middleware/cacheControl.js +0 -90
  181. package/cjs/middleware/detectBot.js +0 -104
  182. package/cjs/middleware/detectLocale.js +0 -43
  183. package/cjs/middleware/lazyLoadModules.js +0 -73
  184. package/cjs/middleware/rateLimiter.js +0 -24
  185. package/cjs/middleware/requestTimeout.js +0 -42
  186. package/cjs/middleware/sanitizeHeader.js +0 -51
  187. package/cjs/middleware/secureHeaders.js +0 -42
  188. package/cjs/node/adapter.js +0 -138
  189. package/cjs/utils/regexRouter.js +0 -58
  190. package/cjs/utils/state.js +0 -34
  191. package/cjs/utils/toWebRequest.js +0 -35
  192. package/cjs/ws/deno.js +0 -20
  193. package/cjs/ws/index.js +0 -53
  194. package/cjs/ws/node.js +0 -65
  195. package/core/MiddlewareConfigure.d.ts +0 -15
  196. package/core/MiddlewareConfigure.js +0 -63
  197. package/core/common.d.ts +0 -21
  198. package/core/common.js +0 -11
  199. package/deno/adpater.d.ts +0 -38
  200. package/deno/adpater.js +0 -64
  201. package/helper/common.d.ts +0 -5
  202. package/helper/common.js +0 -14
  203. package/middleware/basicAuth.d.ts +0 -81
  204. package/middleware/basicAuth.js +0 -67
  205. package/middleware/cacheControl.d.ts +0 -48
  206. package/middleware/cacheControl.js +0 -53
  207. package/middleware/detectBot.d.ts +0 -121
  208. package/middleware/detectBot.js +0 -98
  209. package/middleware/detectLocale.d.ts +0 -55
  210. package/middleware/detectLocale.js +0 -39
  211. package/middleware/lazyLoadModules.d.ts +0 -72
  212. package/middleware/lazyLoadModules.js +0 -69
  213. package/middleware/rateLimiter.js +0 -20
  214. package/middleware/requestTimeout.d.ts +0 -25
  215. package/middleware/requestTimeout.js +0 -38
  216. package/middleware/sanitizeHeader.js +0 -47
  217. package/middleware/secureHeaders.d.ts +0 -78
  218. package/middleware/secureHeaders.js +0 -38
  219. package/middleware/xssProtection.js +0 -22
  220. package/node/adapter.d.ts +0 -46
  221. package/node/adapter.js +0 -102
  222. package/utils/regexRouter.d.ts +0 -66
  223. package/utils/regexRouter.js +0 -53
  224. package/utils/state.d.ts +0 -50
  225. package/utils/state.js +0 -30
  226. package/utils/staticFile.d.ts +0 -10
  227. package/utils/toWebRequest.js +0 -32
  228. package/ws/deno.d.ts +0 -6
  229. package/ws/deno.js +0 -16
  230. package/ws/index.d.ts +0 -180
  231. package/ws/index.js +0 -50
  232. package/ws/node.d.ts +0 -7
  233. package/ws/node.js +0 -28
  234. /package/{utils → node}/toWebRequest.d.ts +0 -0
@@ -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
- }
@@ -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
- }
@@ -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
@@ -1,11 +0,0 @@
1
- import { GlobalConfig } from "./config.js";
2
- export class CommonHandler {
3
- notFound(callback) {
4
- GlobalConfig.notFound = callback;
5
- return this;
6
- }
7
- onError(callback) {
8
- GlobalConfig.onError = callback;
9
- return this;
10
- }
11
- }
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
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Generate a unique request ID
3
- * @returns {string} - A unique request identifier
4
- */
5
- export declare function generateID(): string;
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
- }