tspace-spear 1.2.2 → 1.2.4

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 (57) hide show
  1. package/README.md +304 -23
  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/express.d.ts +295 -0
  21. package/dist/lib/core/server/express.js +1356 -0
  22. package/dist/lib/core/server/express.js.map +1 -0
  23. package/dist/lib/core/server/fast-router.d.ts +133 -0
  24. package/dist/lib/core/server/fast-router.js +277 -0
  25. package/dist/lib/core/server/fast-router.js.map +1 -0
  26. package/dist/lib/core/server/index.d.ts +43 -36
  27. package/dist/lib/core/server/index.js +300 -426
  28. package/dist/lib/core/server/index.js.map +1 -1
  29. package/dist/lib/core/server/net/index.d.ts +20 -0
  30. package/dist/lib/core/server/net/index.js +393 -0
  31. package/dist/lib/core/server/net/index.js.map +1 -0
  32. package/dist/lib/core/server/parser-factory.d.ts +20 -12
  33. package/dist/lib/core/server/parser-factory.js +283 -196
  34. package/dist/lib/core/server/parser-factory.js.map +1 -1
  35. package/dist/lib/core/server/request.d.ts +2 -0
  36. package/dist/lib/core/server/request.js +7 -0
  37. package/dist/lib/core/server/request.js.map +1 -0
  38. package/dist/lib/core/server/response.d.ts +6 -0
  39. package/dist/lib/core/server/response.js +168 -0
  40. package/dist/lib/core/server/response.js.map +1 -0
  41. package/dist/lib/core/server/router.d.ts +2 -2
  42. package/dist/lib/core/server/router.js +2 -1
  43. package/dist/lib/core/server/router.js.map +1 -1
  44. package/dist/lib/core/server/uWS/index.d.ts +30 -0
  45. package/dist/lib/core/server/uWS/index.js +357 -0
  46. package/dist/lib/core/server/uWS/index.js.map +1 -0
  47. package/dist/lib/core/types/index.d.ts +159 -38
  48. package/dist/lib/core/utils/index.d.ts +12 -0
  49. package/dist/lib/core/utils/index.js +137 -0
  50. package/dist/lib/core/utils/index.js.map +1 -0
  51. package/dist/lib/index.d.ts +3 -3
  52. package/dist/lib/index.js +3 -2
  53. package/dist/lib/index.js.map +1 -1
  54. package/package.json +27 -11
  55. package/dist/tests/benchmark.test.d.ts +0 -1
  56. package/dist/tests/benchmark.test.js +0 -145
  57. package/dist/tests/benchmark.test.js.map +0 -1
@@ -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,7 +1,7 @@
1
1
  {
2
2
  "name": "tspace-spear",
3
- "version": "1.2.2",
4
- "description": "tspace-spear is a lightweight API framework for Node.js that is fast and highly focused on providing the best developer experience. It utilizes the native HTTP server",
3
+ "version": "1.2.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",
7
7
  "files": [
@@ -18,7 +18,13 @@
18
18
  "api",
19
19
  "rest api",
20
20
  "fast",
21
- "low overhead"
21
+ "fast-api",
22
+ "fast api",
23
+ "low overhead",
24
+ "http",
25
+ "uWS",
26
+ "uWebSockets",
27
+ "uWebSockets.js"
22
28
  ],
23
29
  "author": "Thanathip (https://github.com/thanathip41)",
24
30
  "license": "MIT",
@@ -31,8 +37,12 @@
31
37
  "prepare": "npm run build",
32
38
  "release": "npm run build && npm publish",
33
39
  "beta": "npm run build && npm publish --tag beta",
34
- "test": "npm run build && node dist/tests/benchmark.test.js",
35
- "load": "autocannon -c 100 -d 40 -p 10 localhost:3000",
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",
44
+ "test": "mocha dist/tests/**/0*.test.js",
45
+ "load": "autocannon -c 100 -d 30 -p 10 localhost:5000",
36
46
  "docs": "npx docsify-cli serve docs"
37
47
  },
38
48
  "engines": {
@@ -40,30 +50,36 @@
40
50
  },
41
51
  "dependencies": {
42
52
  "busboy": "1.6.0",
43
- "find-my-way": "8.2.2",
53
+ "fast-querystring": "1.1.2",
44
54
  "mime-types": "2.1.35",
45
55
  "on-finished": "2.4.1",
46
56
  "reflect-metadata": "0.2.2",
47
- "swagger-ui-dist": "5.32.0"
57
+ "swagger-ui-dist": "5.32.0",
58
+ "ws": "8.19.0",
59
+ "xml2js": "0.6.2"
48
60
  },
49
61
  "devDependencies": {
62
+ "@elysiajs/node": "1.4.5",
63
+ "@hono/node-server": "1.19.11",
50
64
  "@types/autocannon": "7.12.5",
51
65
  "@types/busboy": "1.5.4",
52
66
  "@types/express": "4.17.21",
53
67
  "@types/mime-types": "2.1.4",
54
- "@types/node": "16.4.0",
68
+ "@types/node": "16.18.126",
55
69
  "@types/on-finished": "2.3.4",
56
70
  "@types/swagger-ui-dist": "3.30.4",
57
71
  "@types/ws": "8.18.1",
58
- "@types/yargs": "17.0.32",
72
+ "@types/xml2js": "0.4.14",
73
+ "0http": "4.4.0",
59
74
  "autocannon": "7.15.0",
60
75
  "docsify-cli": "4.4.4",
76
+ "elysia": "1.4.28",
61
77
  "express": "4.19.2",
62
78
  "fastify": "4.28.1",
79
+ "hono": "4.12.9",
63
80
  "ts-node": "10.9.2",
64
81
  "typescript": "5.9.3",
65
- "ws": "8.18.3",
66
- "yargs": "17.7.2",
82
+ "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.63.0",
67
83
  "zod": "4.3.6"
68
84
  }
69
85
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,145 +0,0 @@
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
- const autocannon_1 = __importDefault(require("autocannon"));
7
- const fastify_1 = __importDefault(require("fastify"));
8
- const express_1 = __importDefault(require("express"));
9
- const http_1 = __importDefault(require("http"));
10
- const yargs_1 = __importDefault(require("yargs"));
11
- const lib_1 = __importDefault(require("../lib"));
12
- const MESSAGE = 'Hello world!';
13
- const { argv } = (0, yargs_1.default)(process.argv.slice(2));
14
- let duration = argv.d || argv.duration;
15
- let connections = argv.c || argv.connections;
16
- let pipelining = argv.p || argv.pipelining;
17
- connections = connections == null ? 100 : Number(connections);
18
- pipelining = pipelining == null ? 10 : Number(pipelining);
19
- duration = duration == null ? 10 : Number(duration);
20
- function runExpress() {
21
- const port = 3000;
22
- (0, express_1.default)()
23
- .get('/', (req, res) => {
24
- res.setHeader('Content-Type', 'text/plain');
25
- return res.send(MESSAGE);
26
- })
27
- .listen(port, () => {
28
- console.log(`Server 'Express' running at http://localhost:${port}`);
29
- });
30
- }
31
- function runHttp() {
32
- const port = 3001;
33
- const server = http_1.default.createServer((req, res) => {
34
- res.statusCode = 200;
35
- res.setHeader('Content-Type', 'text/plain');
36
- res.end(MESSAGE);
37
- });
38
- server.listen(port, () => {
39
- console.log(`Server 'Http' running at http://localhost:${port}`);
40
- });
41
- }
42
- function runFastify() {
43
- const port = 3002;
44
- (0, fastify_1.default)()
45
- .get('/', (request, reply) => {
46
- return reply
47
- .header('Content-Type', 'text/plain')
48
- .send(MESSAGE);
49
- })
50
- .listen({ port }, (err, address) => {
51
- if (err)
52
- throw err;
53
- console.log(`server 'Fastify' running at : http://localhost:${port}`);
54
- });
55
- }
56
- function runSpear() {
57
- const port = 3003;
58
- new lib_1.default()
59
- .get('/', () => MESSAGE)
60
- .listen(port, () => console.log(`server 'Spear' running at : http://localhost:${port}`));
61
- }
62
- const url = (port) => `http://localhost:${port}`;
63
- const urls = [
64
- { name: 'express', url: url(3000) },
65
- { name: 'http', url: url(3001) },
66
- { name: 'fastify', url: url(3002) },
67
- { name: 'tspace-spear', url: url(3003) }
68
- ];
69
- const sleep = (ms) => {
70
- return new Promise(resolve => setTimeout(resolve, ms, null));
71
- };
72
- const runBenchmark = async () => {
73
- const results = [];
74
- const randomized = shuffle(urls);
75
- await new Promise((resolve, reject) => {
76
- (0, autocannon_1.default)({
77
- url: randomized[0].url,
78
- connections,
79
- duration: 3
80
- }, (err) => {
81
- if (err)
82
- return reject(err);
83
- resolve(null);
84
- });
85
- });
86
- for (const { name, url } of randomized) {
87
- const result = await new Promise((resolve, reject) => {
88
- (0, autocannon_1.default)({
89
- url,
90
- connections,
91
- duration,
92
- pipelining
93
- }, (err, result) => {
94
- if (err)
95
- return reject(err);
96
- return resolve(result);
97
- });
98
- });
99
- const toMs = (v) => Number((v / 1000).toFixed(3));
100
- const latency = result.latency;
101
- results.push({
102
- name,
103
- url,
104
- "req/sec": Number(result.requests.average.toFixed(0)),
105
- "avg(ms)": toMs(latency.average),
106
- "p50(ms)": toMs(latency.p50),
107
- "p90(ms)": toMs(latency.p90),
108
- "p97(ms)": toMs(latency.p97_5),
109
- "p99(ms)": toMs(latency.p99),
110
- "max(ms)": toMs(latency.max),
111
- "stddev": Number(latency.stddev.toFixed(2)),
112
- "requests": result.requests.total
113
- });
114
- }
115
- // sort ตาม performance
116
- results.sort((a, b) => Number(b["req/sec"]) - Number(a["req/sec"]));
117
- console.log({
118
- connections,
119
- duration,
120
- pipelining
121
- });
122
- console.table(results);
123
- };
124
- const shuffle = (arr) => {
125
- const a = [...arr];
126
- for (let i = a.length - 1; i > 0; i--) {
127
- const j = Math.floor(Math.random() * (i + 1));
128
- [a[i], a[j]] = [a[j], a[i]];
129
- }
130
- return a;
131
- };
132
- async function runApps() {
133
- await Promise.all([
134
- runSpear,
135
- runFastify,
136
- runExpress,
137
- runHttp
138
- ].map(v => v()));
139
- await sleep(5000);
140
- console.log('benchmarking !!');
141
- await runBenchmark();
142
- console.log('benchmarking done !!');
143
- }
144
- runApps();
145
- //# sourceMappingURL=benchmark.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"benchmark.test.js","sourceRoot":"","sources":["../../src/tests/benchmark.test.ts"],"names":[],"mappings":"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"}