tspace-spear 1.2.3 → 1.2.5

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 (48) hide show
  1. package/README.md +268 -19
  2. package/dist/lib/core/const/index.d.ts +153 -0
  3. package/dist/lib/core/const/index.js +105 -0
  4. package/dist/lib/core/const/index.js.map +1 -0
  5. package/dist/lib/core/decorators/context.d.ts +16 -9
  6. package/dist/lib/core/decorators/context.js +85 -59
  7. package/dist/lib/core/decorators/context.js.map +1 -1
  8. package/dist/lib/core/decorators/headers.d.ts +2 -2
  9. package/dist/lib/core/decorators/headers.js +1 -1
  10. package/dist/lib/core/decorators/headers.js.map +1 -1
  11. package/dist/lib/core/decorators/methods.d.ts +7 -7
  12. package/dist/lib/core/decorators/methods.js.map +1 -1
  13. package/dist/lib/core/decorators/middleware.d.ts +3 -3
  14. package/dist/lib/core/decorators/middleware.js +2 -2
  15. package/dist/lib/core/decorators/middleware.js.map +1 -1
  16. package/dist/lib/core/decorators/statusCode.d.ts +1 -1
  17. package/dist/lib/core/decorators/statusCode.js.map +1 -1
  18. package/dist/lib/core/decorators/swagger.d.ts +1 -1
  19. package/dist/lib/core/decorators/swagger.js.map +1 -1
  20. package/dist/lib/core/server/fast-router.d.ts +133 -0
  21. package/dist/lib/core/server/fast-router.js +277 -0
  22. package/dist/lib/core/server/fast-router.js.map +1 -0
  23. package/dist/lib/core/server/index.d.ts +34 -37
  24. package/dist/lib/core/server/index.js +192 -501
  25. package/dist/lib/core/server/index.js.map +1 -1
  26. package/dist/lib/core/server/net/index.d.ts +20 -0
  27. package/dist/lib/core/server/net/index.js +393 -0
  28. package/dist/lib/core/server/net/index.js.map +1 -0
  29. package/dist/lib/core/server/parser-factory.d.ts +10 -11
  30. package/dist/lib/core/server/parser-factory.js +259 -437
  31. package/dist/lib/core/server/parser-factory.js.map +1 -1
  32. package/dist/lib/core/server/response.d.ts +6 -0
  33. package/dist/lib/core/server/response.js +168 -0
  34. package/dist/lib/core/server/response.js.map +1 -0
  35. package/dist/lib/core/server/router.d.ts +2 -12
  36. package/dist/lib/core/server/router.js +2 -13
  37. package/dist/lib/core/server/router.js.map +1 -1
  38. package/dist/lib/core/server/uWS/index.d.ts +30 -0
  39. package/dist/lib/core/server/uWS/index.js +357 -0
  40. package/dist/lib/core/server/uWS/index.js.map +1 -0
  41. package/dist/lib/core/types/index.d.ts +144 -43
  42. package/dist/lib/core/utils/index.d.ts +12 -0
  43. package/dist/lib/core/utils/index.js +137 -0
  44. package/dist/lib/core/utils/index.js.map +1 -0
  45. package/dist/lib/index.d.ts +3 -3
  46. package/dist/lib/index.js +3 -2
  47. package/dist/lib/index.js.map +1 -1
  48. package/package.json +19 -14
@@ -0,0 +1,12 @@
1
+ import { IncomingMessage, ServerResponse } from "http";
2
+ import { Stream } from "stream";
3
+ export declare const normalizeRequestBody: ({ contentType, payload, }: {
4
+ contentType: string | null;
5
+ payload: any;
6
+ }) => Promise<any>;
7
+ export declare const pipeStream: ({ req, res, filePath, isUwebSocket, }: {
8
+ req: IncomingMessage;
9
+ res: ServerResponse;
10
+ filePath: string;
11
+ isUwebSocket?: boolean;
12
+ }) => Promise<Stream>;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.pipeStream = exports.normalizeRequestBody = void 0;
7
+ const const_1 = require("../const");
8
+ const uWS_1 = require("../server/uWS");
9
+ const querystring_1 = __importDefault(require("querystring"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const mime_types_1 = __importDefault(require("mime-types"));
13
+ const xml2js_1 = __importDefault(require("xml2js"));
14
+ const crypto_1 = __importDefault(require("crypto"));
15
+ const normalizeRequestBody = async ({ contentType, payload, }) => {
16
+ if (contentType == null || payload == null || payload === "") {
17
+ return {};
18
+ }
19
+ if (contentType.includes("x-www-form-urlencoded")) {
20
+ return querystring_1.default.parse(payload);
21
+ }
22
+ if (contentType.includes("application/json")) {
23
+ try {
24
+ return JSON.parse(payload);
25
+ }
26
+ catch (err) {
27
+ throw new Error("Invalid JSON format in request body.");
28
+ }
29
+ }
30
+ if (contentType.includes("application/xml") ||
31
+ contentType.includes("text/xml")) {
32
+ try {
33
+ const result = await xml2js_1.default.parseStringPromise(payload, {
34
+ explicitArray: false,
35
+ });
36
+ return result;
37
+ }
38
+ catch (err) {
39
+ throw new Error("Invalid XML format in request body.");
40
+ }
41
+ }
42
+ if (contentType.includes("text/plain") ||
43
+ contentType.includes("text/javascript") ||
44
+ contentType.includes("application/javascript") ||
45
+ contentType.includes("application/x-javascript")) {
46
+ return { contentType, text: payload };
47
+ }
48
+ return {};
49
+ };
50
+ exports.normalizeRequestBody = normalizeRequestBody;
51
+ const pipeStream = async ({ req, res, filePath, isUwebSocket, }) => {
52
+ if (!fs_1.default.existsSync(filePath)) {
53
+ return res
54
+ .writeHead(404, const_1.HEADER_CONTENT_TYPES["text"])
55
+ .end(`File not found: ${path_1.default.basename(filePath)}`);
56
+ }
57
+ if (isUwebSocket) {
58
+ return (0, uWS_1.uWSPipeStream)({ req, res, filePath });
59
+ }
60
+ const stat = fs_1.default.statSync(filePath);
61
+ const fileSize = stat.size;
62
+ const range = req.headers["range"] ?? null;
63
+ const contentType = mime_types_1.default.lookup(filePath) || "application/octet-stream";
64
+ const isVideo = contentType.startsWith("video/");
65
+ const writeHead = (header, code = 200) => {
66
+ const extension = filePath.split(".").pop();
67
+ const previews = Object.values({
68
+ video: [
69
+ "mp4",
70
+ "webm",
71
+ "ogg",
72
+ "ogv",
73
+ "avi",
74
+ "mov",
75
+ "mkv",
76
+ "flv",
77
+ "f4v",
78
+ "wmv",
79
+ "ts",
80
+ "mpeg",
81
+ ],
82
+ audio: ["wav", "mp3"],
83
+ document: ["pdf"],
84
+ image: ["png", "jpeg", "jpg", "gif", "webp", "svg", "ico"],
85
+ }).flat();
86
+ if (previews.some((p) => extension?.toLocaleLowerCase().includes(p))) {
87
+ res.writeHead(code, header);
88
+ return;
89
+ }
90
+ res.setHeader("Content-Disposition", `attachment; filename=${+new Date()}.${extension}`);
91
+ res.setHeader("Content-Type", "application/octet-stream");
92
+ };
93
+ const maxAge = 1000 * 60 * 60 * 24 * 7;
94
+ const etag = crypto_1.default.createHash("md5").update(`${stat.size}-${stat.mtimeMs}`).digest("hex");
95
+ const baseHeader = {
96
+ "Connection": "keep-alive",
97
+ "Keep-Alive": "timeout=60, max=1000",
98
+ "Cache-Control": `public, max-age=${maxAge}, immutable`,
99
+ "Strict-transport-security": `max-age=${maxAge}; includeSubDomains`,
100
+ "ETag": `"${etag}"`,
101
+ "Date": new Date(stat.birthtimeMs).toUTCString(),
102
+ "Last-modified": new Date(stat.birthtimeMs).toUTCString(),
103
+ "Vary": "Origin, Accept-Encoding",
104
+ "Accept-Ranges": "bytes",
105
+ "Content-Length": fileSize,
106
+ "Content-Type": contentType,
107
+ "X-Content-type-options": "nosniff",
108
+ "X-Xss-protection": "1; mode=block",
109
+ };
110
+ if (!isVideo || range == null) {
111
+ const header = {
112
+ ...baseHeader,
113
+ "Content-Length": fileSize,
114
+ "Content-Type": contentType,
115
+ };
116
+ const stream = fs_1.default.createReadStream(filePath);
117
+ writeHead(header);
118
+ stream.on("error", () => res.end());
119
+ return stream.pipe(res);
120
+ }
121
+ const parts = range.replace(/bytes=/, "").split("-");
122
+ const start = parseInt(parts[0], 10);
123
+ const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
124
+ const chunksize = end - start + 1;
125
+ const stream = fs_1.default.createReadStream(filePath, { start, end });
126
+ const header = {
127
+ ...baseHeader,
128
+ "Content-Range": `bytes ${start}-${end}/${fileSize}`,
129
+ "Content-Length": chunksize,
130
+ "Accept-Ranges": "bytes"
131
+ };
132
+ writeHead(header, 206);
133
+ stream.on("error", () => res.end());
134
+ return stream.pipe(res);
135
+ };
136
+ exports.pipeStream = pipeStream;
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/core/utils/index.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * @module tspace-spear
5
5
  */
6
+ import Spear from './core/server';
6
7
  export * from './core/decorators';
7
- export * from './core/server/router';
8
+ export * from './core/types';
8
9
  export * from './core/server';
9
- export { T } from './core/types';
10
- import Spear from './core/server';
10
+ export * from './core/server/router';
11
11
  export default Spear;
package/dist/lib/index.js CHANGED
@@ -22,9 +22,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
22
22
  *
23
23
  * @module tspace-spear
24
24
  */
25
+ const server_1 = __importDefault(require("./core/server"));
25
26
  __exportStar(require("./core/decorators"), exports);
26
- __exportStar(require("./core/server/router"), exports);
27
+ __exportStar(require("./core/types"), exports);
27
28
  __exportStar(require("./core/server"), exports);
28
- const server_1 = __importDefault(require("./core/server"));
29
+ __exportStar(require("./core/server/router"), exports);
29
30
  exports.default = server_1.default;
30
31
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;;;IAII;AACJ,oDAAiC;AACjC,uDAAoC;AACpC,gDAA6B;AAG7B,2DAAkC;AAElC,kBAAe,gBAAK,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;;;IAII;AACJ,2DAAkC;AAElC,oDAAkC;AAClC,+CAA6B;AAC7B,gDAA8B;AAC9B,uDAAqC;AAErC,kBAAe,gBAAK,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tspace-spear",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "tspace-spear is a lightweight, high-performance API framework for Node.js that leverages the native HTTP server and supports uWebSockets.js (C++) for maximum speed and efficiency.",
5
5
  "main": "./dist/lib/index.js",
6
6
  "types": "./dist/lib/index.d.ts",
@@ -18,6 +18,8 @@
18
18
  "api",
19
19
  "rest api",
20
20
  "fast",
21
+ "fast-api",
22
+ "fast api",
21
23
  "low overhead",
22
24
  "http",
23
25
  "uWS",
@@ -35,9 +37,12 @@
35
37
  "prepare": "npm run build",
36
38
  "release": "npm run build && npm publish",
37
39
  "beta": "npm run build && npm publish --tag beta",
38
- "benchmark": "npm run build && ts-node __tests__/benchmark.test.ts",
40
+ "bm:node": "npm run benchmark:node",
41
+ "bm:bun": "npm run benchmark:bun",
42
+ "benchmark:node": "npm run build && node benchmarks/tests/benchmark.node.js",
43
+ "benchmark:bun": "npm run build && bun run benchmarks/tests/benchmark.bun.js",
39
44
  "test": "mocha dist/tests/**/0*.test.js",
40
- "load": "autocannon -c 100 -d 30 -p 10 localhost:3000",
45
+ "load": "autocannon -c 100 -d 30 -p 10 localhost:5000",
41
46
  "docs": "npx docsify-cli serve docs"
42
47
  },
43
48
  "engines": {
@@ -45,36 +50,36 @@
45
50
  },
46
51
  "dependencies": {
47
52
  "busboy": "1.6.0",
48
- "find-my-way": "8.2.2",
53
+ "fast-querystring": "1.1.2",
49
54
  "mime-types": "2.1.35",
50
55
  "on-finished": "2.4.1",
51
56
  "reflect-metadata": "0.2.2",
52
57
  "swagger-ui-dist": "5.32.0",
53
- "ws": "8.19.0"
58
+ "ws": "8.19.0",
59
+ "xml2js": "0.6.2"
54
60
  },
55
61
  "devDependencies": {
62
+ "@elysiajs/node": "1.4.5",
63
+ "@hono/node-server": "1.19.11",
56
64
  "@types/autocannon": "7.12.5",
57
65
  "@types/busboy": "1.5.4",
58
- "@types/chai": "5.2.3",
59
- "@types/chai-http": "4.2.4",
60
66
  "@types/express": "4.17.21",
61
- "@types/jest": "30.0.0",
62
67
  "@types/mime-types": "2.1.4",
63
- "@types/mocha": "10.0.10",
64
- "@types/node": "16.4.0",
68
+ "@types/node": "16.18.126",
65
69
  "@types/on-finished": "2.3.4",
66
70
  "@types/swagger-ui-dist": "3.30.4",
67
71
  "@types/ws": "8.18.1",
68
- "@types/yargs": "17.0.32",
72
+ "@types/xml2js": "0.4.14",
73
+ "0http": "4.4.0",
69
74
  "autocannon": "7.15.0",
70
- "chai": "4.5.0",
71
- "chai-http": "5.1.2",
72
75
  "docsify-cli": "4.4.4",
76
+ "elysia": "1.4.28",
73
77
  "express": "4.19.2",
74
78
  "fastify": "4.28.1",
79
+ "hono": "4.12.9",
75
80
  "ts-node": "10.9.2",
76
81
  "typescript": "5.9.3",
77
- "yargs": "17.7.2",
82
+ "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.63.0",
78
83
  "zod": "4.3.6"
79
84
  }
80
85
  }