jerkjs 2.1.1 → 2.1.2
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/CHANGELOG.md +3 -2
- package/README.md +1 -1
- package/examples.arj +0 -0
- package/index.js +1 -1
- package/lib/middleware/compressor.js +34 -18
- package/package.json +1 -1
- package/standard/CompressionTestController.js +38 -0
- package/standard/HealthController.js +16 -0
- package/standard/HomeController.js +12 -0
- package/standard/ProductController.js +18 -0
- package/standard/README.md +47 -0
- package/standard/UserController.js +23 -0
- package/standard/package.json +22 -0
- package/standard/routes.json +58 -0
- package/standard/server.js +140 -0
- package/cookies.txt +0 -5
- package/examples/advanced/controllers/productController.js +0 -64
- package/examples/advanced/controllers/userController.js +0 -85
- package/examples/advanced/routes.json +0 -51
- package/examples/advanced_example.js +0 -93
- package/examples/basic/controllers/userController.js +0 -85
- package/examples/basic_example.js +0 -72
- package/examples/frontend/README.md +0 -71
- package/examples/frontend/app.js +0 -71
- package/examples/frontend/controllers/apiController.js +0 -39
- package/examples/frontend/controllers/authController.js +0 -220
- package/examples/frontend/controllers/formController.js +0 -47
- package/examples/frontend/controllers/messageController.js +0 -96
- package/examples/frontend/controllers/pageController.js +0 -178
- package/examples/frontend/controllers/staticController.js +0 -167
- package/examples/frontend/routes.json +0 -90
- package/examples/hooks/app.js +0 -136
- package/examples/hooks/controllers/authController.js +0 -54
- package/examples/hooks/controllers/mainController.js +0 -41
- package/examples/hooks/controllers/productController.js +0 -39
- package/examples/hooks/controllers/userController.js +0 -69
- package/examples/hooks/routes.json +0 -51
- package/examples/hooks/views/home.html +0 -50
- package/examples/mvc_example/app.js +0 -138
- package/examples/mvc_example/views/home/index.html +0 -26
- package/examples/mvc_example/views/home/simple.html +0 -3
- package/examples/mvc_example/views/layout.html +0 -23
- package/examples/mvc_example/views/test.html +0 -3
- package/examples/mvc_example/views/user/invalid.html +0 -6
- package/examples/mvc_example/views/user/list.html +0 -36
- package/examples/mvc_example/views/user/notfound.html +0 -6
- package/examples/mvc_example/views/user/profile.html +0 -11
- package/examples/mvc_routes_example/app.js +0 -34
- package/examples/mvc_routes_example/controllers/mainController.js +0 -27
- package/examples/mvc_routes_example/controllers/productController.js +0 -47
- package/examples/mvc_routes_example/controllers/userController.js +0 -76
- package/examples/mvc_routes_example/routes.json +0 -30
- package/examples/mvc_routes_example/views/layout.html +0 -31
- package/examples/mvc_routes_example/views/main/index.html +0 -11
- package/examples/mvc_routes_example/views/product/catalog.html +0 -24
- package/examples/mvc_routes_example/views/user/invalid.html +0 -6
- package/examples/mvc_routes_example/views/user/list.html +0 -40
- package/examples/mvc_routes_example/views/user/notfound.html +0 -6
- package/examples/mvc_routes_example/views/user/profile.html +0 -18
- package/examples/mvc_welcome/README.md +0 -34
- package/examples/mvc_welcome/app.js +0 -50
- package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
- package/examples/mvc_welcome/package.json +0 -26
- package/examples/mvc_welcome/views/home/welcome.html +0 -82
- package/examples/performance_demo/app.js +0 -172
- package/examples/performance_demo_with_hooks/README.md +0 -52
- package/examples/performance_demo_with_hooks/app.js +0 -290
- package/examples/public/README.md +0 -92
- package/examples/public/app.js +0 -72
- package/examples/public/controllers/healthController.js +0 -20
- package/examples/public/controllers/mainController.js +0 -22
- package/examples/public/controllers/userController.js +0 -139
- package/examples/public/routes.json +0 -51
- package/examples/v2/README.md +0 -72
- package/examples/v2/app.js +0 -74
- package/examples/v2/app_fixed.js +0 -74
- package/examples/v2/controllers/authController.js +0 -64
- package/examples/v2/controllers/mainController.js +0 -24
- package/examples/v2/controllers/protectedController.js +0 -12
- package/examples/v2/controllers/userController.js +0 -16
- package/examples/v2/package.json +0 -27
- package/examples/v2/routes.json +0 -30
- package/examples/v2/test_api.sh +0 -47
- package/examples/v2/tokens_example.sqlite +0 -0
- package/examples/v2.1_firewall_demo/README.md +0 -113
- package/examples/v2.1_firewall_demo/app.js +0 -182
- package/examples/v2.1_firewall_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/README.md +0 -85
- package/examples/v2.1_hooks_demo/app.js +0 -101
- package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
- package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
- package/examples/v2.1_hooks_demo/package.json +0 -27
- package/examples/v2.1_hooks_demo/routes.json +0 -16
- package/examples/v2.1_openapi_demo/README.md +0 -82
- package/examples/v2.1_openapi_demo/app.js +0 -296
- package/examples/v2.1_openapi_demo/package.json +0 -26
- package/examples/v2_cors/README.md +0 -82
- package/examples/v2_cors/app.js +0 -108
- package/examples/v2_cors/package.json +0 -23
- package/examples/v2_json_auth/README.md +0 -83
- package/examples/v2_json_auth/app.js +0 -72
- package/examples/v2_json_auth/controllers/authController.js +0 -67
- package/examples/v2_json_auth/controllers/mainController.js +0 -16
- package/examples/v2_json_auth/controllers/protectedController.js +0 -12
- package/examples/v2_json_auth/controllers/tokenController.js +0 -28
- package/examples/v2_json_auth/controllers/userController.js +0 -15
- package/examples/v2_json_auth/package.json +0 -26
- package/examples/v2_json_auth/routes.json +0 -37
- package/examples/v2_json_auth/tokens.json +0 -20
- package/examples/v2_mariadb_auth/README.md +0 -94
- package/examples/v2_mariadb_auth/app.js +0 -81
- package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
- package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
- package/examples/v2_mariadb_auth/package.json +0 -27
- package/examples/v2_mariadb_auth/routes.json +0 -37
- package/examples/v2_no_auth/README.md +0 -75
- package/examples/v2_no_auth/app.js +0 -72
- package/examples/v2_no_auth/controllers/healthController.js +0 -14
- package/examples/v2_no_auth/controllers/mainController.js +0 -19
- package/examples/v2_no_auth/controllers/productController.js +0 -31
- package/examples/v2_no_auth/controllers/publicController.js +0 -16
- package/examples/v2_no_auth/package.json +0 -22
- package/examples/v2_no_auth/routes.json +0 -37
- package/examples/v2_oauth/README.md +0 -70
- package/examples/v2_oauth/app.js +0 -90
- package/examples/v2_oauth/controllers/mainController.js +0 -45
- package/examples/v2_oauth/controllers/oauthController.js +0 -247
- package/examples/v2_oauth/controllers/protectedController.js +0 -13
- package/examples/v2_oauth/controllers/userController.js +0 -17
- package/examples/v2_oauth/package.json +0 -26
- package/examples/v2_oauth/routes.json +0 -44
- package/examples/v2_openapi/README.md +0 -77
- package/examples/v2_openapi/app.js +0 -222
- package/examples/v2_openapi/controllers/authController.js +0 -52
- package/examples/v2_openapi/controllers/mainController.js +0 -26
- package/examples/v2_openapi/controllers/productController.js +0 -17
- package/examples/v2_openapi/controllers/userController.js +0 -27
- package/examples/v2_openapi/package.json +0 -26
- package/examples/v2_openapi/routes.json +0 -37
- package/v2examplle/v2_json_auth/README.md +0 -83
- package/v2examplle/v2_json_auth/app.js +0 -72
- package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
- package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
- package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
- package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
- package/v2examplle/v2_json_auth/package.json +0 -26
- package/v2examplle/v2_json_auth/routes.json +0 -37
- package/v2examplle/v2_json_auth/tokens.json +0 -20
- package/v2examplle/v2_mariadb_auth/README.md +0 -94
- package/v2examplle/v2_mariadb_auth/app.js +0 -81
- package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
- package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
- package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
- package/v2examplle/v2_mariadb_auth/package.json +0 -27
- package/v2examplle/v2_mariadb_auth/routes.json +0 -37
- package/v2examplle/v2_sqlite_auth/README.md +0 -72
- package/v2examplle/v2_sqlite_auth/app.js +0 -74
- package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
- package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
- package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
- package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
- package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
- package/v2examplle/v2_sqlite_auth/package.json +0 -27
- package/v2examplle/v2_sqlite_auth/routes.json +0 -30
- package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
- package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
const Jerk = require('../../index.js');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
// Función para verificar la disponibilidad del puerto
|
|
6
|
-
const checkPortAvailability = async (port) => {
|
|
7
|
-
const net = require('net');
|
|
8
|
-
|
|
9
|
-
return new Promise((resolve) => {
|
|
10
|
-
const server = net.createServer();
|
|
11
|
-
|
|
12
|
-
server.listen(port, () => {
|
|
13
|
-
server.close(() => {
|
|
14
|
-
resolve(true); // Puerto disponible
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
server.on('error', (err) => {
|
|
19
|
-
if (err.code === 'EADDRINUSE') {
|
|
20
|
-
resolve(false); // Puerto ocupado
|
|
21
|
-
} else {
|
|
22
|
-
resolve(false);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// Buscar un puerto disponible entre 3000 y 3100
|
|
29
|
-
const findAvailablePort = async () => {
|
|
30
|
-
for (let port = 3000; port <= 3100; port++) {
|
|
31
|
-
const isAvailable = await checkPortAvailability(port);
|
|
32
|
-
if (isAvailable) {
|
|
33
|
-
return port;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
throw new Error('No se encontró un puerto disponible entre 3000 y 3100');
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// Función para obtener todas las rutas registradas
|
|
40
|
-
const getAllRoutes = (app) => {
|
|
41
|
-
// Acceder a las rutas desde la instancia de Jerk
|
|
42
|
-
return app.routes || [];
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// Crear instancia del servidor con configuraciones de rendimiento
|
|
46
|
-
const createApp = async () => {
|
|
47
|
-
const availablePort = await findAvailablePort();
|
|
48
|
-
|
|
49
|
-
const app = new Jerk({
|
|
50
|
-
port: availablePort,
|
|
51
|
-
host: 'localhost',
|
|
52
|
-
enableCompression: true, // Habilitar compresión
|
|
53
|
-
maxBodySize: '50mb', // Permitir bodies extensos
|
|
54
|
-
enableNestedRoutes: true // Habilitar rutas anidadas
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// Middleware de compresión
|
|
58
|
-
app.use(require('../../lib/middleware/compressor')());
|
|
59
|
-
|
|
60
|
-
// Hook para registrar las rutas después de definirlas
|
|
61
|
-
const routesInfo = [];
|
|
62
|
-
|
|
63
|
-
// Sobreescribir métodos para capturar rutas
|
|
64
|
-
const originalGet = app.get;
|
|
65
|
-
const originalPost = app.post;
|
|
66
|
-
const originalPut = app.put;
|
|
67
|
-
const originalDelete = app.delete;
|
|
68
|
-
|
|
69
|
-
app.get = function(path, handler) {
|
|
70
|
-
routesInfo.push({ method: 'GET', path, description: 'Ruta registrada' });
|
|
71
|
-
return originalGet.call(this, path, handler);
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
app.post = function(path, handler) {
|
|
75
|
-
routesInfo.push({ method: 'POST', path, description: 'Ruta registrada' });
|
|
76
|
-
return originalPost.call(this, path, handler);
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
app.put = function(path, handler) {
|
|
80
|
-
routesInfo.push({ method: 'PUT', path, description: 'Ruta registrada' });
|
|
81
|
-
return originalPut.call(this, path, handler);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
app.delete = function(path, handler) {
|
|
85
|
-
routesInfo.push({ method: 'DELETE', path, description: 'Ruta registrada' });
|
|
86
|
-
return originalDelete.call(this, path, handler);
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// Ruta para probar compresión con respuesta grande
|
|
90
|
-
app.get('/api/compression-test', (req, res) => {
|
|
91
|
-
// Generar una respuesta grande para demostrar compresión
|
|
92
|
-
const largeData = {
|
|
93
|
-
message: 'Esta es una respuesta grande para demostrar compresión',
|
|
94
|
-
data: Array.from({ length: 1000 }, (_, i) => ({
|
|
95
|
-
id: i,
|
|
96
|
-
title: `Item ${i}`,
|
|
97
|
-
description: `Este es un elemento de prueba número ${i} con información detallada`,
|
|
98
|
-
metadata: {
|
|
99
|
-
created: new Date().toISOString(),
|
|
100
|
-
category: `categoria-${i % 10}`,
|
|
101
|
-
tags: [`tag${i % 5}`, `etiqueta${i % 7}`]
|
|
102
|
-
}
|
|
103
|
-
}))
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
res.json(largeData);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// Ruta para probar bodies extensos
|
|
110
|
-
app.post('/api/large-body', (req, res) => {
|
|
111
|
-
const bodySize = JSON.stringify(req.body).length;
|
|
112
|
-
|
|
113
|
-
res.json({
|
|
114
|
-
message: 'Body recibido exitosamente',
|
|
115
|
-
size: bodySize,
|
|
116
|
-
status: 'success'
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// Rutas anidadas para demostrar jerarquía
|
|
121
|
-
app.get('/api/users/:userId/posts', (req, res) => {
|
|
122
|
-
const { userId } = req.params;
|
|
123
|
-
|
|
124
|
-
res.json({
|
|
125
|
-
message: `Posts del usuario ${userId}`,
|
|
126
|
-
posts: Array.from({ length: 5 }, (_, i) => ({
|
|
127
|
-
id: i + 1,
|
|
128
|
-
title: `Post ${i + 1} de usuario ${userId}`,
|
|
129
|
-
content: 'Contenido del post...'
|
|
130
|
-
}))
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
app.get('/api/users/:userId/posts/:postId/comments', (req, res) => {
|
|
135
|
-
const { userId, postId } = req.params;
|
|
136
|
-
|
|
137
|
-
res.json({
|
|
138
|
-
message: `Comentarios del post ${postId} del usuario ${userId}`,
|
|
139
|
-
comments: Array.from({ length: 3 }, (_, i) => ({
|
|
140
|
-
id: i + 1,
|
|
141
|
-
author: `Usuario${i + 1}`,
|
|
142
|
-
content: `Comentario ${i + 1} en el post ${postId}`
|
|
143
|
-
}))
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
// Ruta para probar diferentes tipos de payloads grandes
|
|
148
|
-
app.post('/api/upload-large-data', (req, res) => {
|
|
149
|
-
const { dataType, dataSize } = req.body || {};
|
|
150
|
-
|
|
151
|
-
let response;
|
|
152
|
-
switch(dataType) {
|
|
153
|
-
case 'text':
|
|
154
|
-
response = {
|
|
155
|
-
type: 'text',
|
|
156
|
-
content: 'x'.repeat(dataSize || 10000),
|
|
157
|
-
message: 'Texto largo generado para pruebas de compresión'
|
|
158
|
-
};
|
|
159
|
-
break;
|
|
160
|
-
case 'json':
|
|
161
|
-
response = {
|
|
162
|
-
type: 'json',
|
|
163
|
-
data: Array.from({ length: dataSize || 1000 }, (_, i) => ({
|
|
164
|
-
id: i,
|
|
165
|
-
value: Math.random(),
|
|
166
|
-
label: `Elemento ${i}`
|
|
167
|
-
})),
|
|
168
|
-
message: 'JSON grande generado para pruebas de compresión'
|
|
169
|
-
};
|
|
170
|
-
break;
|
|
171
|
-
default:
|
|
172
|
-
response = {
|
|
173
|
-
type: 'default',
|
|
174
|
-
message: 'Tipo de dato no especificado, usando valores por defecto',
|
|
175
|
-
sample: Array(100).fill().map((_, i) => `dato_${i}`)
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
res.json(response);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
// Endpoint para medir tiempo de respuesta
|
|
183
|
-
app.get('/api/performance-test', (req, res) => {
|
|
184
|
-
const startTime = Date.now();
|
|
185
|
-
|
|
186
|
-
// Simular procesamiento intensivo
|
|
187
|
-
const processData = () => {
|
|
188
|
-
return Array.from({ length: 50000 }, (_, i) => ({
|
|
189
|
-
id: i,
|
|
190
|
-
computedValue: Math.sqrt(i) * Math.sin(i),
|
|
191
|
-
timestamp: Date.now()
|
|
192
|
-
}));
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
const processedData = processData();
|
|
196
|
-
const endTime = Date.now();
|
|
197
|
-
|
|
198
|
-
res.json({
|
|
199
|
-
message: 'Prueba de rendimiento completada',
|
|
200
|
-
processingTime: endTime - startTime,
|
|
201
|
-
dataSize: processedData.length,
|
|
202
|
-
status: 'success'
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
// Ruta para mostrar todas las rutas disponibles usando hooks
|
|
207
|
-
app.get('/routes', (req, res) => {
|
|
208
|
-
const routesHtml = `
|
|
209
|
-
<html>
|
|
210
|
-
<head>
|
|
211
|
-
<title>Rutas Disponibles - Demo de Rendimiento</title>
|
|
212
|
-
<style>
|
|
213
|
-
body { font-family: Arial, sans-serif; margin: 40px; }
|
|
214
|
-
table { border-collapse: collapse; width: 100%; }
|
|
215
|
-
th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
|
|
216
|
-
th { background-color: #f2f2f2; }
|
|
217
|
-
.method-get { color: green; }
|
|
218
|
-
.method-post { color: orange; }
|
|
219
|
-
.method-put { color: blue; }
|
|
220
|
-
.method-delete { color: red; }
|
|
221
|
-
</style>
|
|
222
|
-
</head>
|
|
223
|
-
<body>
|
|
224
|
-
<h1>Rutas Disponibles - Demo de Rendimiento</h1>
|
|
225
|
-
<p>Puerto: ${availablePort}</p>
|
|
226
|
-
<table>
|
|
227
|
-
<tr>
|
|
228
|
-
<th>Método</th>
|
|
229
|
-
<th>Ruta</th>
|
|
230
|
-
<th>Descripción</th>
|
|
231
|
-
</tr>
|
|
232
|
-
${routesInfo.map(route => `
|
|
233
|
-
<tr>
|
|
234
|
-
<td class="method-${route.method.toLowerCase()}">${route.method}</td>
|
|
235
|
-
<td>${route.path}</td>
|
|
236
|
-
<td>${route.description}</td>
|
|
237
|
-
</tr>
|
|
238
|
-
`).join('')}
|
|
239
|
-
</table>
|
|
240
|
-
<br>
|
|
241
|
-
<a href="/">← Volver a la página principal</a>
|
|
242
|
-
</body>
|
|
243
|
-
</html>
|
|
244
|
-
`;
|
|
245
|
-
|
|
246
|
-
res.send(routesHtml);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
// Ruta raíz para instrucciones
|
|
250
|
-
app.get('/', (req, res) => {
|
|
251
|
-
res.send(`
|
|
252
|
-
<html>
|
|
253
|
-
<head><title>Demo de Rendimiento - JERK Framework</title></head>
|
|
254
|
-
<body>
|
|
255
|
-
<h1>Demo de Rendimiento - JERK Framework</h1>
|
|
256
|
-
<p>Puerto: ${availablePort}</p>
|
|
257
|
-
<p>Esta demostración muestra las capacidades de rendimiento del framework:</p>
|
|
258
|
-
<ul>
|
|
259
|
-
<li><strong>Compresión</strong>: <a href="/api/compression-test">/api/compression-test</a> - Respuesta grande comprimida</li>
|
|
260
|
-
<li><strong>Body Extensos</strong>: POST a <code>/api/large-body</code> con grandes cantidades de datos</li>
|
|
261
|
-
<li><strong>Rutas Anidadas</strong>:
|
|
262
|
-
<ul>
|
|
263
|
-
<li><a href="/api/users/123/posts">/api/users/:userId/posts</a></li>
|
|
264
|
-
<li><a href="/api/users/123/posts/456/comments">/api/users/:userId/posts/:postId/comments</a></li>
|
|
265
|
-
</ul>
|
|
266
|
-
</li>
|
|
267
|
-
<li><strong>Upload de Datos Grandes</strong>: POST a <code>/api/upload-large-data</code> con diferentes tipos de datos</li>
|
|
268
|
-
<li><strong>Prueba de Rendimiento</strong>: <a href="/api/performance-test">/api/performance-test</a> - Medición de tiempo de procesamiento</li>
|
|
269
|
-
</ul>
|
|
270
|
-
<p>Para ver todas las rutas disponibles: <a href="/routes">/routes</a></p>
|
|
271
|
-
<p>Para probar bodies extensos, usa curl o Postman para hacer POST requests a los endpoints correspondientes.</p>
|
|
272
|
-
</body>
|
|
273
|
-
</html>
|
|
274
|
-
`);
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
// Iniciar el servidor
|
|
278
|
-
app.listen(() => {
|
|
279
|
-
console.log(`Demo de rendimiento iniciado en http://localhost:${availablePort}`);
|
|
280
|
-
console.log('Puerto asignado automáticamente para evitar conflictos');
|
|
281
|
-
console.log('Visita http://localhost:' + availablePort + '/routes para ver todas las rutas disponibles');
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
return app;
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
// Ejecutar la aplicación
|
|
288
|
-
createApp().catch(console.error);
|
|
289
|
-
|
|
290
|
-
module.exports = createApp;
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# API Pública de Ejemplo
|
|
2
|
-
|
|
3
|
-
Este ejemplo demuestra cómo crear una API pública usando el Framework JERK JS. La API incluye endpoints para gestionar usuarios y está protegida con CORS y rate limiting.
|
|
4
|
-
|
|
5
|
-
## Características
|
|
6
|
-
|
|
7
|
-
- API REST pública sin autenticación requerida
|
|
8
|
-
- Endpoints para gestión de usuarios (CRUD completo)
|
|
9
|
-
- Protección con CORS para permitir solicitudes desde cualquier origen
|
|
10
|
-
- Rate limiting para prevenir abusos
|
|
11
|
-
- Endpoints de salud del sistema
|
|
12
|
-
- Controladores organizados por funcionalidad
|
|
13
|
-
|
|
14
|
-
## Configuración
|
|
15
|
-
|
|
16
|
-
1. Asegúrate de tener instaladas las dependencias del framework JERK
|
|
17
|
-
2. No se requiere configuración adicional para esta API pública
|
|
18
|
-
|
|
19
|
-
## Uso
|
|
20
|
-
|
|
21
|
-
1. Inicia el servidor:
|
|
22
|
-
```bash
|
|
23
|
-
node app.js
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
2. El servidor escuchará en `http://localhost:8081`
|
|
27
|
-
|
|
28
|
-
## Endpoints
|
|
29
|
-
|
|
30
|
-
- `GET /` - Información general de la API (público)
|
|
31
|
-
- `GET /users` - Lista todos los usuarios (público)
|
|
32
|
-
- `GET /users/:id` - Obtiene un usuario específico (público)
|
|
33
|
-
- `POST /users` - Crea un nuevo usuario (público)
|
|
34
|
-
- `PUT /users/:id` - Actualiza un usuario existente (público)
|
|
35
|
-
- `DELETE /users/:id` - Elimina un usuario (público)
|
|
36
|
-
- `GET /health` - Verifica el estado del servicio (público)
|
|
37
|
-
|
|
38
|
-
## Ejemplos de uso
|
|
39
|
-
|
|
40
|
-
1. Obtener todos los usuarios:
|
|
41
|
-
```bash
|
|
42
|
-
curl -X GET http://localhost:8081/users
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
2. Obtener un usuario específico:
|
|
46
|
-
```bash
|
|
47
|
-
curl -X GET http://localhost:8081/users/1
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
3. Crear un nuevo usuario:
|
|
51
|
-
```bash
|
|
52
|
-
curl -X POST http://localhost:8081/users \
|
|
53
|
-
-H "Content-Type: application/json" \
|
|
54
|
-
-d '{"name": "Nuevo Usuario", "email": "nuevo@ejemplo.com", "age": 28}'
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
4. Actualizar un usuario:
|
|
58
|
-
```bash
|
|
59
|
-
curl -X PUT http://localhost:8081/users/1 \
|
|
60
|
-
-H "Content-Type: application/json" \
|
|
61
|
-
-d '{"name": "Usuario Actualizado", "email": "actualizado@ejemplo.com"}'
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
5. Eliminar un usuario:
|
|
65
|
-
```bash
|
|
66
|
-
curl -X DELETE http://localhost:8081/users/1
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
6. Verificar estado del servicio:
|
|
70
|
-
```bash
|
|
71
|
-
curl -X GET http://localhost:8081/health
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Estructura del proyecto
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
examples/public/
|
|
78
|
-
├── app.js # Punto de entrada de la aplicación
|
|
79
|
-
├── routes.json # Definición de rutas
|
|
80
|
-
├── controllers/ # Controladores de las rutas
|
|
81
|
-
│ ├── mainController.js
|
|
82
|
-
│ ├── userController.js
|
|
83
|
-
│ └── healthController.js
|
|
84
|
-
└── README.md
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Seguridad
|
|
88
|
-
|
|
89
|
-
- CORS configurado para permitir solicitudes desde cualquier origen
|
|
90
|
-
- Rate limiting configurado para prevenir abusos (100 solicitudes por 15 minutos)
|
|
91
|
-
- No se requiere autenticación para acceder a los endpoints
|
|
92
|
-
- Validación de entrada en endpoints de creación/actualización
|
package/examples/public/app.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
APIServer,
|
|
3
|
-
Router,
|
|
4
|
-
RouteLoader,
|
|
5
|
-
Logger,
|
|
6
|
-
Cors,
|
|
7
|
-
RateLimiter
|
|
8
|
-
} = require('../../index.js');
|
|
9
|
-
|
|
10
|
-
async function startServer() {
|
|
11
|
-
// Crear instancia del servidor
|
|
12
|
-
const server = new APIServer({
|
|
13
|
-
port: 8081,
|
|
14
|
-
host: 'localhost',
|
|
15
|
-
requestTimeout: 30000, // 30 segundos
|
|
16
|
-
connectionTimeout: 30000 // 30 segundos
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
// Crear instancia del logger
|
|
20
|
-
const logger = new Logger({ level: 'info' });
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
// Configurar CORS para permitir solicitudes desde cualquier origen
|
|
24
|
-
const cors = new Cors({
|
|
25
|
-
origin: '*',
|
|
26
|
-
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
27
|
-
allowedHeaders: [
|
|
28
|
-
'Content-Type',
|
|
29
|
-
'Authorization',
|
|
30
|
-
'X-Requested-With',
|
|
31
|
-
'Accept',
|
|
32
|
-
'Origin'
|
|
33
|
-
]
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Aplicar middleware de CORS
|
|
37
|
-
server.use(cors.middleware());
|
|
38
|
-
|
|
39
|
-
// Configurar Rate Limiter para prevenir abusos
|
|
40
|
-
const rateLimiter = new RateLimiter({
|
|
41
|
-
windowMs: 15 * 60 * 1000, // 15 minutos
|
|
42
|
-
maxRequests: 100 // Límite de 100 solicitudes por ventana
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// Aplicar middleware de rate limiting
|
|
46
|
-
server.use(rateLimiter.middleware());
|
|
47
|
-
|
|
48
|
-
// Cargar rutas desde archivo JSON
|
|
49
|
-
const routeLoader = new RouteLoader();
|
|
50
|
-
await routeLoader.loadRoutes(server, './routes.json');
|
|
51
|
-
|
|
52
|
-
// Iniciar el servidor
|
|
53
|
-
server.start();
|
|
54
|
-
|
|
55
|
-
logger.info('Servidor público iniciado en http://localhost:8081');
|
|
56
|
-
logger.info('Endpoints disponibles:');
|
|
57
|
-
logger.info('- GET / (Información del API)');
|
|
58
|
-
logger.info('- GET /users (Lista de usuarios)');
|
|
59
|
-
logger.info('- GET /users/:id (Obtener usuario específico)');
|
|
60
|
-
logger.info('- POST /users (Crear nuevo usuario)');
|
|
61
|
-
logger.info('- PUT /users/:id (Actualizar usuario)');
|
|
62
|
-
logger.info('- DELETE /users/:id (Eliminar usuario)');
|
|
63
|
-
} catch (error) {
|
|
64
|
-
logger.error('Error iniciando el servidor:', error.message);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Iniciar el servidor
|
|
70
|
-
startServer();
|
|
71
|
-
|
|
72
|
-
module.exports = { startServer };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const healthController = {
|
|
2
|
-
checkHealth: (req, res) => {
|
|
3
|
-
const healthStatus = {
|
|
4
|
-
status: 'healthy',
|
|
5
|
-
timestamp: new Date().toISOString(),
|
|
6
|
-
uptime: process.uptime(),
|
|
7
|
-
message: 'API Pública de Ejemplo está operando correctamente',
|
|
8
|
-
version: '1.0.0',
|
|
9
|
-
endpoints: {
|
|
10
|
-
total: 7,
|
|
11
|
-
active: true
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
16
|
-
res.end(JSON.stringify(healthStatus));
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
module.exports = healthController;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const mainController = {
|
|
2
|
-
home: (req, res) => {
|
|
3
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4
|
-
res.end(JSON.stringify({
|
|
5
|
-
message: 'Bienvenido a la API Pública de Ejemplo',
|
|
6
|
-
version: '1.0.0',
|
|
7
|
-
description: 'Esta es una API pública de ejemplo creada con el Framework JERK JS',
|
|
8
|
-
endpoints: {
|
|
9
|
-
'GET /': 'Este mensaje',
|
|
10
|
-
'GET /users': 'Obtener lista de usuarios',
|
|
11
|
-
'GET /users/:id': 'Obtener usuario específico',
|
|
12
|
-
'POST /users': 'Crear nuevo usuario',
|
|
13
|
-
'PUT /users/:id': 'Actualizar usuario',
|
|
14
|
-
'DELETE /users/:id': 'Eliminar usuario',
|
|
15
|
-
'GET /health': 'Verificar estado del servicio'
|
|
16
|
-
},
|
|
17
|
-
documentation: 'Visita el README para más información sobre cómo usar esta API'
|
|
18
|
-
}));
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
module.exports = mainController;
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
// Simulación de base de datos en memoria
|
|
2
|
-
let users = [
|
|
3
|
-
{ id: 1, name: 'Juan Pérez', email: 'juan@example.com', age: 30 },
|
|
4
|
-
{ id: 2, name: 'María García', email: 'maria@example.com', age: 25 },
|
|
5
|
-
{ id: 3, name: 'Pedro Rodríguez', email: 'pedro@example.com', age: 35 }
|
|
6
|
-
];
|
|
7
|
-
|
|
8
|
-
let nextId = 4;
|
|
9
|
-
|
|
10
|
-
const userController = {
|
|
11
|
-
getAllUsers: (req, res) => {
|
|
12
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
13
|
-
res.end(JSON.stringify({
|
|
14
|
-
success: true,
|
|
15
|
-
data: users,
|
|
16
|
-
count: users.length
|
|
17
|
-
}));
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
getUserById: (req, res) => {
|
|
21
|
-
const userId = parseInt(req.params.id);
|
|
22
|
-
const user = users.find(u => u.id === userId);
|
|
23
|
-
|
|
24
|
-
if (!user) {
|
|
25
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
26
|
-
res.end(JSON.stringify({
|
|
27
|
-
success: false,
|
|
28
|
-
error: 'Usuario no encontrado'
|
|
29
|
-
}));
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
34
|
-
res.end(JSON.stringify({
|
|
35
|
-
success: true,
|
|
36
|
-
data: user
|
|
37
|
-
}));
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
createUser: (req, res) => {
|
|
41
|
-
try {
|
|
42
|
-
const { name, email, age } = req.body;
|
|
43
|
-
|
|
44
|
-
// Validación simple
|
|
45
|
-
if (!name || !email) {
|
|
46
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
47
|
-
res.end(JSON.stringify({
|
|
48
|
-
success: false,
|
|
49
|
-
error: 'Nombre y correo electrónico son obligatorios'
|
|
50
|
-
}));
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Crear nuevo usuario
|
|
55
|
-
const newUser = {
|
|
56
|
-
id: nextId++,
|
|
57
|
-
name,
|
|
58
|
-
email,
|
|
59
|
-
age: age || null
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
users.push(newUser);
|
|
63
|
-
|
|
64
|
-
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
65
|
-
res.end(JSON.stringify({
|
|
66
|
-
success: true,
|
|
67
|
-
data: newUser,
|
|
68
|
-
message: 'Usuario creado exitosamente'
|
|
69
|
-
}));
|
|
70
|
-
} catch (error) {
|
|
71
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
72
|
-
res.end(JSON.stringify({
|
|
73
|
-
success: false,
|
|
74
|
-
error: 'Error interno del servidor'
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
updateUser: (req, res) => {
|
|
80
|
-
try {
|
|
81
|
-
const userId = parseInt(req.params.id);
|
|
82
|
-
const { name, email, age } = req.body;
|
|
83
|
-
|
|
84
|
-
const userIndex = users.findIndex(u => u.id === userId);
|
|
85
|
-
|
|
86
|
-
if (userIndex === -1) {
|
|
87
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
88
|
-
res.end(JSON.stringify({
|
|
89
|
-
success: false,
|
|
90
|
-
error: 'Usuario no encontrado'
|
|
91
|
-
}));
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Actualizar usuario
|
|
96
|
-
if (name) users[userIndex].name = name;
|
|
97
|
-
if (email) users[userIndex].email = email;
|
|
98
|
-
if (age !== undefined) users[userIndex].age = age;
|
|
99
|
-
|
|
100
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
101
|
-
res.end(JSON.stringify({
|
|
102
|
-
success: true,
|
|
103
|
-
data: users[userIndex],
|
|
104
|
-
message: 'Usuario actualizado exitosamente'
|
|
105
|
-
}));
|
|
106
|
-
} catch (error) {
|
|
107
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
108
|
-
res.end(JSON.stringify({
|
|
109
|
-
success: false,
|
|
110
|
-
error: 'Error interno del servidor'
|
|
111
|
-
}));
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
deleteUser: (req, res) => {
|
|
116
|
-
const userId = parseInt(req.params.id);
|
|
117
|
-
const userIndex = users.findIndex(u => u.id === userId);
|
|
118
|
-
|
|
119
|
-
if (userIndex === -1) {
|
|
120
|
-
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
121
|
-
res.end(JSON.stringify({
|
|
122
|
-
success: false,
|
|
123
|
-
error: 'Usuario no encontrado'
|
|
124
|
-
}));
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const deletedUser = users.splice(userIndex, 1)[0];
|
|
129
|
-
|
|
130
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
131
|
-
res.end(JSON.stringify({
|
|
132
|
-
success: true,
|
|
133
|
-
data: deletedUser,
|
|
134
|
-
message: 'Usuario eliminado exitosamente'
|
|
135
|
-
}));
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
module.exports = userController;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"path": "/",
|
|
4
|
-
"method": "GET",
|
|
5
|
-
"controller": "./controllers/mainController.js",
|
|
6
|
-
"handler": "home",
|
|
7
|
-
"auth": "none"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"path": "/users",
|
|
11
|
-
"method": "GET",
|
|
12
|
-
"controller": "./controllers/userController.js",
|
|
13
|
-
"handler": "getAllUsers",
|
|
14
|
-
"auth": "none"
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"path": "/users/:id",
|
|
18
|
-
"method": "GET",
|
|
19
|
-
"controller": "./controllers/userController.js",
|
|
20
|
-
"handler": "getUserById",
|
|
21
|
-
"auth": "none"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"path": "/users",
|
|
25
|
-
"method": "POST",
|
|
26
|
-
"controller": "./controllers/userController.js",
|
|
27
|
-
"handler": "createUser",
|
|
28
|
-
"auth": "none"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"path": "/users/:id",
|
|
32
|
-
"method": "PUT",
|
|
33
|
-
"controller": "./controllers/userController.js",
|
|
34
|
-
"handler": "updateUser",
|
|
35
|
-
"auth": "none"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"path": "/users/:id",
|
|
39
|
-
"method": "DELETE",
|
|
40
|
-
"controller": "./controllers/userController.js",
|
|
41
|
-
"handler": "deleteUser",
|
|
42
|
-
"auth": "none"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"path": "/health",
|
|
46
|
-
"method": "GET",
|
|
47
|
-
"controller": "./controllers/healthController.js",
|
|
48
|
-
"handler": "checkHealth",
|
|
49
|
-
"auth": "none"
|
|
50
|
-
}
|
|
51
|
-
]
|