tinny-backend 1.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 +207 -0
- package/dist/admin/auth.d.ts +2 -0
- package/dist/admin/auth.d.ts.map +1 -0
- package/dist/admin/auth.js +2 -0
- package/dist/admin/auth.js.map +1 -0
- package/dist/admin/monitor.d.ts +2 -0
- package/dist/admin/monitor.d.ts.map +1 -0
- package/dist/admin/monitor.js +2 -0
- package/dist/admin/monitor.js.map +1 -0
- package/dist/admin/routes.d.ts +2 -0
- package/dist/admin/routes.d.ts.map +1 -0
- package/dist/admin/routes.js +2 -0
- package/dist/admin/routes.js.map +1 -0
- package/dist/app/index.d.ts +2 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +19 -0
- package/dist/app/index.js.map +1 -0
- package/dist/core/Request.d.ts +4 -0
- package/dist/core/Request.d.ts.map +1 -0
- package/dist/core/Request.js +24 -0
- package/dist/core/Request.js.map +1 -0
- package/dist/core/Response.d.ts +4 -0
- package/dist/core/Response.d.ts.map +1 -0
- package/dist/core/Response.js +78 -0
- package/dist/core/Response.js.map +1 -0
- package/dist/core/Server.d.ts +30 -0
- package/dist/core/Server.d.ts.map +1 -0
- package/dist/core/Server.js +533 -0
- package/dist/core/Server.js.map +1 -0
- package/dist/core/types.d.ts +89 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/examples/example.d.ts +2 -0
- package/dist/examples/example.d.ts.map +1 -0
- package/dist/examples/example.js +11 -0
- package/dist/examples/example.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +127 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +625 -0
- package/dist/server.js.map +1 -0
- package/dist/src/admin/auth.d.ts +13 -0
- package/dist/src/admin/auth.d.ts.map +1 -0
- package/dist/src/admin/auth.js +60 -0
- package/dist/src/admin/auth.js.map +1 -0
- package/dist/src/admin/monitor.d.ts +3 -0
- package/dist/src/admin/monitor.d.ts.map +1 -0
- package/dist/src/admin/monitor.js +83 -0
- package/dist/src/admin/monitor.js.map +1 -0
- package/dist/src/admin/routes.d.ts +14 -0
- package/dist/src/admin/routes.d.ts.map +1 -0
- package/dist/src/admin/routes.js +150 -0
- package/dist/src/admin/routes.js.map +1 -0
- package/dist/src/core/Request.d.ts +4 -0
- package/dist/src/core/Request.d.ts.map +1 -0
- package/dist/src/core/Request.js +24 -0
- package/dist/src/core/Request.js.map +1 -0
- package/dist/src/core/Response.d.ts +4 -0
- package/dist/src/core/Response.d.ts.map +1 -0
- package/dist/src/core/Response.js +78 -0
- package/dist/src/core/Response.js.map +1 -0
- package/dist/src/core/Server.d.ts +34 -0
- package/dist/src/core/Server.d.ts.map +1 -0
- package/dist/src/core/Server.js +290 -0
- package/dist/src/core/Server.js.map +1 -0
- package/dist/src/core/types.d.ts +89 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +3 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/utils/constants.d.ts +12 -0
- package/dist/src/utils/constants.d.ts.map +1 -0
- package/dist/src/utils/constants.js +12 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/utils/constants.d.ts +12 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +12 -0
- package/dist/utils/constants.js.map +1 -0
- package/package.json +89 -0
package/README.md
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# TinnyBackend
|
|
2
|
+
|
|
3
|
+
A lightweight routing system for Node.js with built-in file serving, JWT authentication, and monitoring capabilities.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- HTTP routing with support for GET, POST, PUT, DELETE methods
|
|
8
|
+
- Dynamic route parameters (e.g., `/users/:id`)
|
|
9
|
+
- Middleware chain support
|
|
10
|
+
- Static file serving with automatic MIME type detection
|
|
11
|
+
- Cookie management
|
|
12
|
+
- JWT authentication and session management
|
|
13
|
+
- Built-in admin monitoring dashboard
|
|
14
|
+
- TypeScript support with full type definitions
|
|
15
|
+
- Session tracking and rate limiting
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install tinnybackend
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import Server from 'tinnybackend';
|
|
27
|
+
|
|
28
|
+
const server = new Server({
|
|
29
|
+
port: 3000,
|
|
30
|
+
hostname: 'localhost',
|
|
31
|
+
ServerName: 'MyApp'
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Basic route
|
|
35
|
+
server.add({
|
|
36
|
+
method: 'GET',
|
|
37
|
+
path: '/',
|
|
38
|
+
handler: (req, res) => {
|
|
39
|
+
res.send(200, { message: 'Hello World!' });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Route with parameters
|
|
44
|
+
server.add({
|
|
45
|
+
method: 'GET',
|
|
46
|
+
path: '/users/:id',
|
|
47
|
+
handler: (req, res) => {
|
|
48
|
+
const userId = req.params.id;
|
|
49
|
+
res.send(200, { userId });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Route with middleware
|
|
54
|
+
server.add({
|
|
55
|
+
method: 'POST',
|
|
56
|
+
path: '/api/data',
|
|
57
|
+
middelWares: [authMiddleware],
|
|
58
|
+
handler: (req, res) => {
|
|
59
|
+
res.send(200, { received: req.body });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Serve static files
|
|
64
|
+
server.servDir('./public', 'static');
|
|
65
|
+
|
|
66
|
+
server.listen();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## API Reference
|
|
70
|
+
|
|
71
|
+
### Server Constructor
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
new Server(options: ServerOptions)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Options:**
|
|
78
|
+
|
|
79
|
+
| Option | Type | Default | Description |
|
|
80
|
+
|--------|------|---------|-------------|
|
|
81
|
+
| `port` | number | 3000 | Server port |
|
|
82
|
+
| `hostname` | string | 'localhost' | Server hostname |
|
|
83
|
+
| `ServerName` | string | 'Server' | Server display name |
|
|
84
|
+
| `DefaultHandler` | HandlerFun | 404 handler | Default route handler |
|
|
85
|
+
|
|
86
|
+
### Adding Routes
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
server.add({
|
|
90
|
+
method: 'GET' | 'POST' | 'PUT' | 'DELETE',
|
|
91
|
+
path: string,
|
|
92
|
+
handler: HandlerFun,
|
|
93
|
+
middelWares?: HandlerFun[],
|
|
94
|
+
next?: HandlerFun
|
|
95
|
+
})
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Request Object (ServerReq)
|
|
99
|
+
|
|
100
|
+
| Property | Type | Description |
|
|
101
|
+
|----------|------|-------------|
|
|
102
|
+
| `ReqUrl` | URL | Parsed request URL |
|
|
103
|
+
| `Query` | URLSearchParams | Query parameters |
|
|
104
|
+
| `queries` | object | Query parameters as object |
|
|
105
|
+
| `body` | any | Request body (parsed JSON) |
|
|
106
|
+
| `ip` | string | Client IP address |
|
|
107
|
+
| `params` | Record<string, string> | Route parameters |
|
|
108
|
+
| `server` | Server | Server instance |
|
|
109
|
+
|
|
110
|
+
### Response Object (ServerRes)
|
|
111
|
+
|
|
112
|
+
| Method | Description |
|
|
113
|
+
|--------|-------------|
|
|
114
|
+
| `send(status, data?, headers?)` | Send JSON response |
|
|
115
|
+
| `sendFile(status, contentType, data, headers?)` | Send file response |
|
|
116
|
+
| `addCookie(name, value)` | Add cookie |
|
|
117
|
+
| `getCookie(name)` | Get cookie |
|
|
118
|
+
| `setCookie(name, value)` | Update cookie |
|
|
119
|
+
| `getAllCookies()` | Get all cookies |
|
|
120
|
+
|
|
121
|
+
### File Serving
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// Serve a directory
|
|
125
|
+
server.servDir('./public', 'static');
|
|
126
|
+
|
|
127
|
+
// Read directory contents
|
|
128
|
+
const files = await server.readDir('./public', 'static');
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Monitoring
|
|
132
|
+
|
|
133
|
+
The server includes a built-in monitoring system that provides an admin dashboard with real-time metrics.
|
|
134
|
+
|
|
135
|
+
Enable monitoring:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
server.listen(true); // Enables monitoring
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Environment Variables Required:**
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
ADMIN_USERNAME=admin
|
|
145
|
+
ADMIN_PASSWORD=secure_password
|
|
146
|
+
ADMIN_KEY=your_jwt_secret_key
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Monitoring Routes:**
|
|
150
|
+
|
|
151
|
+
- `/` - Admin dashboard
|
|
152
|
+
- `/api/login` - Login endpoint
|
|
153
|
+
- `/api/logout` - Logout endpoint
|
|
154
|
+
- `/admin/status` - Server status and metrics
|
|
155
|
+
- `/messages` - Server logs
|
|
156
|
+
|
|
157
|
+
## Examples
|
|
158
|
+
|
|
159
|
+
### Authentication Middleware
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const authMiddleware = (req: ServerReq, res: ServerRes) => {
|
|
163
|
+
const token = res.getCookie('token');
|
|
164
|
+
if (!token) {
|
|
165
|
+
res.send(401, { error: 'Unauthorized' });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Verify token logic
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### File Upload Handling
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
server.add({
|
|
176
|
+
method: 'POST',
|
|
177
|
+
path: '/upload',
|
|
178
|
+
handler: async (req, res) => {
|
|
179
|
+
// Handle file upload
|
|
180
|
+
const fileData = req.body;
|
|
181
|
+
res.send(200, { success: true });
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Configuration
|
|
187
|
+
|
|
188
|
+
Create a `.env` file for monitoring configuration:
|
|
189
|
+
|
|
190
|
+
```env
|
|
191
|
+
ADMIN_USERNAME=admin
|
|
192
|
+
ADMIN_PASSWORD=your_password
|
|
193
|
+
ADMIN_KEY=your_jwt_secret
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
MIT
|
|
199
|
+
|
|
200
|
+
## Author
|
|
201
|
+
|
|
202
|
+
Yassine Ajagrou
|
|
203
|
+
|
|
204
|
+
## Links
|
|
205
|
+
|
|
206
|
+
- [GitHub Repository](https://github.com/iaceene/TinnyBackend)
|
|
207
|
+
- [npm Package](https://www.npmjs.com/package/tinnybackend)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/admin/auth.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/admin/auth.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/admin/monitor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/admin/monitor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/admin/routes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/admin/routes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../app/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { uptime } from "node:process";
|
|
2
|
+
import Server from "../src/index.js";
|
|
3
|
+
const srv = new Server({});
|
|
4
|
+
srv.add({
|
|
5
|
+
path: "/",
|
|
6
|
+
handler: async (req, res) => {
|
|
7
|
+
return await srv.SendFile(res, "public/example/default.html", 200);
|
|
8
|
+
},
|
|
9
|
+
method: "GET"
|
|
10
|
+
});
|
|
11
|
+
srv.add({
|
|
12
|
+
path: "/api/info",
|
|
13
|
+
handler: async (req, res) => {
|
|
14
|
+
return res.send(200, { uptime: uptime() });
|
|
15
|
+
},
|
|
16
|
+
method: "GET"
|
|
17
|
+
});
|
|
18
|
+
srv.listen(true);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,CAAA;AAE1B,GAAG,CAAC,GAAG,CAAC;IACJ,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,EAAE,KAAK;CAChB,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC;IACJ,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,EAAC,CAAC,CAAA;IAC5C,CAAC;IACD,MAAM,EAAE,KAAK;CAChB,CAAC,CAAA;AAGF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/core/Request.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAO,aAAa,CAAA;AACjC,OAAO,KAAK,EACR,SAAS,EACZ,MAAM,YAAY,CAAA;AAEnB,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CA2B/E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Server from "./Server.js";
|
|
2
|
+
export default function RequestParser(req, server) {
|
|
3
|
+
let body = "";
|
|
4
|
+
try {
|
|
5
|
+
const NewUrl = "http://" + server.getHost() + ":" + server.getPort() + (req.url ?? "");
|
|
6
|
+
req.ReqUrl = URL.parse(NewUrl);
|
|
7
|
+
req.ReqUrl.pathname = req.ReqUrl?.pathname.replace(/(?<=.)\/+$/, "");
|
|
8
|
+
req.Query = new URLSearchParams(req.ReqUrl.searchParams);
|
|
9
|
+
req.queries = Object.fromEntries(req.Query);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
server.log(`Cannot parse ${req.url}`, "error");
|
|
13
|
+
req.ReqUrl.pathname = req.url;
|
|
14
|
+
req.queries = {};
|
|
15
|
+
}
|
|
16
|
+
req.ip = req.socket.remoteAddress?.split(':').pop() ?? "DEVICE IP";
|
|
17
|
+
req.server = server;
|
|
18
|
+
server.log(`${req.ip} requested METHOD ${req.method}, PATH ${req.ReqUrl?.pathname}`);
|
|
19
|
+
req.on("data", (chunk) => {
|
|
20
|
+
body += chunk.toString();
|
|
21
|
+
});
|
|
22
|
+
return req;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=Request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Request.js","sourceRoot":"","sources":["../../src/core/Request.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAO,aAAa,CAAA;AAKjC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAc,EAAE,MAAc;IAChE,IAAI,IAAI,GAAW,EAAE,CAAC;IAEtB,IACA,CAAC;QACG,MAAM,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACvF,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,GAAG,CAAC,MAAc,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC9E,GAAG,CAAC,KAAK,GAAG,IAAI,eAAe,CAAE,GAAG,CAAC,MAAc,CAAC,YAAY,CAAC,CAAC;QAClE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;IACD,MACA,CAAC;QACG,MAAM,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9C,GAAG,CAAC,MAAc,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;QACvC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAA;IACpB,CAAC;IACD,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC;IACnE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAA;IAEnB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,qBAAqB,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAErF,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACrB,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Response.d.ts","sourceRoot":"","sources":["../../src/core/Response.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,OAAO,KAAK,EACR,SAAS,EACT,SAAS,EAEZ,MAAM,YAAY,CAAA;AAGnB,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CA4FhG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import Server from "./Server.js";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
export default function ResponseParser(res, req, server) {
|
|
4
|
+
let cookies = [];
|
|
5
|
+
res.isClosed = false;
|
|
6
|
+
res.ip = req.ip;
|
|
7
|
+
res.getCookie = (name) => {
|
|
8
|
+
if (cookies.length !== 0) {
|
|
9
|
+
for (let i = 0; i < cookies.length; i++)
|
|
10
|
+
if (cookies[i]?.key === name)
|
|
11
|
+
return cookies[i] ?? null;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
};
|
|
15
|
+
res.setCookie = (name, value) => {
|
|
16
|
+
for (let i = 0; i < cookies.length; i++)
|
|
17
|
+
if (name === cookies[i]?.key)
|
|
18
|
+
cookies[i].value = value;
|
|
19
|
+
};
|
|
20
|
+
res.addCookie = (name, value) => {
|
|
21
|
+
if (name === "" || value === "")
|
|
22
|
+
return;
|
|
23
|
+
if (res.getCookie(name) != null)
|
|
24
|
+
return res.setCookie(name, value);
|
|
25
|
+
cookies.push({ key: name, value });
|
|
26
|
+
};
|
|
27
|
+
res.getAllCookies = () => {
|
|
28
|
+
const ArrayBuffer = [];
|
|
29
|
+
for (let i = 0; i < cookies.length; i++)
|
|
30
|
+
ArrayBuffer.push(`${cookies[i]?.key}=${cookies[i]?.value};`);
|
|
31
|
+
return ArrayBuffer;
|
|
32
|
+
};
|
|
33
|
+
const setCookies = (cookies) => {
|
|
34
|
+
if (!cookies || cookies === "")
|
|
35
|
+
return;
|
|
36
|
+
const pairs = cookies.split("; ");
|
|
37
|
+
if (!pairs)
|
|
38
|
+
return;
|
|
39
|
+
for (let i = 0; i < pairs.length; i++)
|
|
40
|
+
res.addCookie(pairs[i]?.split("=")[0] ?? "", pairs[i]?.split("=")[1] ?? "");
|
|
41
|
+
};
|
|
42
|
+
setCookies(req.headers["cookie"]);
|
|
43
|
+
res.server = server;
|
|
44
|
+
res.send = (status, data, headers) => {
|
|
45
|
+
if (!res.isClosed) {
|
|
46
|
+
res.writeHead(status, { 'Content-Type': 'application/json', ...headers });
|
|
47
|
+
res.end(data ? JSON.stringify(data) : "");
|
|
48
|
+
res.isClosed = true;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
server.log(`Multipple replays on ${req.url}`, "error");
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
res.sendFile = async (status, ContentType, data, headers) => {
|
|
55
|
+
if (!res.isClosed) {
|
|
56
|
+
try {
|
|
57
|
+
const fileData = await fs.promises.readFile(data.PATH);
|
|
58
|
+
if (res.isClosed)
|
|
59
|
+
return;
|
|
60
|
+
res.writeHead(status, { 'Content-Type': ContentType, ...headers });
|
|
61
|
+
res.end(fileData);
|
|
62
|
+
res.isClosed = true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
if (res.isClosed)
|
|
66
|
+
return;
|
|
67
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
68
|
+
res.end('500 - Internal Error or File Not Found');
|
|
69
|
+
res.isClosed = true;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else
|
|
74
|
+
server.log(`Multipple replays on ${req.url}`, "error");
|
|
75
|
+
};
|
|
76
|
+
return res;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=Response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Response.js","sourceRoot":"","sources":["../../src/core/Response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ServerOptions, ServerRes, AddOption, HandlerFun, Decorator, DirFiles } from "./types.js";
|
|
2
|
+
export default class Server {
|
|
3
|
+
private PORT;
|
|
4
|
+
private hostname;
|
|
5
|
+
private methodHandler;
|
|
6
|
+
private decorators;
|
|
7
|
+
private server;
|
|
8
|
+
private sessions;
|
|
9
|
+
private uptime;
|
|
10
|
+
private reqCount;
|
|
11
|
+
private logs;
|
|
12
|
+
private ServerName;
|
|
13
|
+
private defaultHandler;
|
|
14
|
+
private generateKey;
|
|
15
|
+
private generateSession;
|
|
16
|
+
private getSession;
|
|
17
|
+
getHost(): string;
|
|
18
|
+
getPort(): number;
|
|
19
|
+
add(opt: AddOption): void;
|
|
20
|
+
decorate(name: string, data: any): void;
|
|
21
|
+
useDecorator(name: string): Decorator | null | undefined;
|
|
22
|
+
readDir(DIR: string, prefix: string): Promise<DirFiles | null>;
|
|
23
|
+
servDir(DIR: string, pref: string, middelWares?: HandlerFun[]): Promise<void>;
|
|
24
|
+
SendFile(res: ServerRes, FILE: string, status: number): Promise<void>;
|
|
25
|
+
log(message: string, type?: "error" | "message"): void;
|
|
26
|
+
constructor(args: ServerOptions);
|
|
27
|
+
monitor(server: Server): void;
|
|
28
|
+
listen(enableMon?: boolean, callback?: () => void): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=Server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Server.d.ts","sourceRoot":"","sources":["../../src/core/Server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,aAAa,EAEb,SAAS,EAET,SAAS,EAET,UAAU,EACV,SAAS,EAGT,QAAQ,EAIX,MAAM,YAAY,CAAC;AAkBpB,MAAM,CAAC,OAAO,OAAO,MAAM;IACvB,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAA;IACd,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,cAAc,CAAY;IAElC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,UAAU;IAIlB,OAAO;IAIP,OAAO;IAIP,GAAG,CAAC,GAAG,EAAE,SAAS;IAoBlB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAOhC,YAAY,CAAC,IAAI,EAAE,MAAM;IAKnB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgB9D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE;IA+D7D,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B3E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS;gBAkBnC,IAAI,EAAE,aAAa;IAyF/B,OAAO,CAAC,MAAM,EAAE,MAAM;IA8StB,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI;CAOpD"}
|