jerkjs 2.1.0 → 2.1.1
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.
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const Jerk = require('../../index.js');
|
|
2
|
+
|
|
3
|
+
// Crear instancia del servidor con configuraciones de rendimiento
|
|
4
|
+
const app = new Jerk({
|
|
5
|
+
port: 3000,
|
|
6
|
+
host: 'localhost',
|
|
7
|
+
enableCompression: true, // Habilitar compresión
|
|
8
|
+
maxBodySize: '50mb', // Permitir bodies extensos
|
|
9
|
+
enableNestedRoutes: true // Habilitar rutas anidadas
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
// Middleware de compresión
|
|
13
|
+
app.use(require('../../lib/middleware/compressor')());
|
|
14
|
+
|
|
15
|
+
// Ruta para probar compresión con respuesta grande
|
|
16
|
+
app.get('/api/compression-test', (req, res) => {
|
|
17
|
+
// Generar una respuesta grande para demostrar compresión
|
|
18
|
+
const largeData = {
|
|
19
|
+
message: 'Esta es una respuesta grande para demostrar compresión',
|
|
20
|
+
data: Array.from({ length: 1000 }, (_, i) => ({
|
|
21
|
+
id: i,
|
|
22
|
+
title: `Item ${i}`,
|
|
23
|
+
description: `Este es un elemento de prueba número ${i} con información detallada`,
|
|
24
|
+
metadata: {
|
|
25
|
+
created: new Date().toISOString(),
|
|
26
|
+
category: `categoria-${i % 10}`,
|
|
27
|
+
tags: [`tag${i % 5}`, `etiqueta${i % 7}`]
|
|
28
|
+
}
|
|
29
|
+
}))
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
res.json(largeData);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Ruta para probar bodies extensos
|
|
36
|
+
app.post('/api/large-body', (req, res) => {
|
|
37
|
+
const bodySize = JSON.stringify(req.body).length;
|
|
38
|
+
|
|
39
|
+
res.json({
|
|
40
|
+
message: 'Body recibido exitosamente',
|
|
41
|
+
size: bodySize,
|
|
42
|
+
status: 'success'
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Rutas anidadas para demostrar jerarquía
|
|
47
|
+
app.get('/api/users/:userId/posts', (req, res) => {
|
|
48
|
+
const { userId } = req.params;
|
|
49
|
+
|
|
50
|
+
res.json({
|
|
51
|
+
message: `Posts del usuario ${userId}`,
|
|
52
|
+
posts: Array.from({ length: 5 }, (_, i) => ({
|
|
53
|
+
id: i + 1,
|
|
54
|
+
title: `Post ${i + 1} de usuario ${userId}`,
|
|
55
|
+
content: 'Contenido del post...'
|
|
56
|
+
}))
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
app.get('/api/users/:userId/posts/:postId/comments', (req, res) => {
|
|
61
|
+
const { userId, postId } = req.params;
|
|
62
|
+
|
|
63
|
+
res.json({
|
|
64
|
+
message: `Comentarios del post ${postId} del usuario ${userId}`,
|
|
65
|
+
comments: Array.from({ length: 3 }, (_, i) => ({
|
|
66
|
+
id: i + 1,
|
|
67
|
+
author: `Usuario${i + 1}`,
|
|
68
|
+
content: `Comentario ${i + 1} en el post ${postId}`
|
|
69
|
+
}))
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Ruta para probar diferentes tipos de payloads grandes
|
|
74
|
+
app.post('/api/upload-large-data', (req, res) => {
|
|
75
|
+
const { dataType, dataSize } = req.body || {};
|
|
76
|
+
|
|
77
|
+
let response;
|
|
78
|
+
switch(dataType) {
|
|
79
|
+
case 'text':
|
|
80
|
+
response = {
|
|
81
|
+
type: 'text',
|
|
82
|
+
content: 'x'.repeat(dataSize || 10000),
|
|
83
|
+
message: 'Texto largo generado para pruebas de compresión'
|
|
84
|
+
};
|
|
85
|
+
break;
|
|
86
|
+
case 'json':
|
|
87
|
+
response = {
|
|
88
|
+
type: 'json',
|
|
89
|
+
data: Array.from({ length: dataSize || 1000 }, (_, i) => ({
|
|
90
|
+
id: i,
|
|
91
|
+
value: Math.random(),
|
|
92
|
+
label: `Elemento ${i}`
|
|
93
|
+
})),
|
|
94
|
+
message: 'JSON grande generado para pruebas de compresión'
|
|
95
|
+
};
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
response = {
|
|
99
|
+
type: 'default',
|
|
100
|
+
message: 'Tipo de dato no especificado, usando valores por defecto',
|
|
101
|
+
sample: Array(100).fill().map((_, i) => `dato_${i}`)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
res.json(response);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Endpoint para medir tiempo de respuesta
|
|
109
|
+
app.get('/api/performance-test', (req, res) => {
|
|
110
|
+
const startTime = Date.now();
|
|
111
|
+
|
|
112
|
+
// Simular procesamiento intensivo
|
|
113
|
+
const processData = () => {
|
|
114
|
+
return Array.from({ length: 50000 }, (_, i) => ({
|
|
115
|
+
id: i,
|
|
116
|
+
computedValue: Math.sqrt(i) * Math.sin(i),
|
|
117
|
+
timestamp: Date.now()
|
|
118
|
+
}));
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const processedData = processData();
|
|
122
|
+
const endTime = Date.now();
|
|
123
|
+
|
|
124
|
+
res.json({
|
|
125
|
+
message: 'Prueba de rendimiento completada',
|
|
126
|
+
processingTime: endTime - startTime,
|
|
127
|
+
dataSize: processedData.length,
|
|
128
|
+
status: 'success'
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Ruta raíz para instrucciones
|
|
133
|
+
app.get('/', (req, res) => {
|
|
134
|
+
res.send(`
|
|
135
|
+
<html>
|
|
136
|
+
<head><title>Demo de Rendimiento - JERK Framework</title></head>
|
|
137
|
+
<body>
|
|
138
|
+
<h1>Demo de Rendimiento - JERK Framework</h1>
|
|
139
|
+
<p>Esta demostración muestra las capacidades de rendimiento del framework:</p>
|
|
140
|
+
<ul>
|
|
141
|
+
<li><strong>Compresión</strong>: <a href="/api/compression-test">/api/compression-test</a> - Respuesta grande comprimida</li>
|
|
142
|
+
<li><strong>Body Extensos</strong>: POST a <code>/api/large-body</code> con grandes cantidades de datos</li>
|
|
143
|
+
<li><strong>Rutas Anidadas</strong>:
|
|
144
|
+
<ul>
|
|
145
|
+
<li><a href="/api/users/123/posts">/api/users/:userId/posts</a></li>
|
|
146
|
+
<li><a href="/api/users/123/posts/456/comments">/api/users/:userId/posts/:postId/comments</a></li>
|
|
147
|
+
</ul>
|
|
148
|
+
</li>
|
|
149
|
+
<li><strong>Upload de Datos Grandes</strong>: POST a <code>/api/upload-large-data</code> con diferentes tipos de datos</li>
|
|
150
|
+
<li><strong>Prueba de Rendimiento</strong>: <a href="/api/performance-test">/api/performance-test</a> - Medición de tiempo de procesamiento</li>
|
|
151
|
+
</ul>
|
|
152
|
+
<p>Para probar bodies extensos, usa curl o Postman para hacer POST requests a los endpoints correspondientes.</p>
|
|
153
|
+
</body>
|
|
154
|
+
</html>
|
|
155
|
+
`);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Iniciar el servidor
|
|
159
|
+
app.listen(() => {
|
|
160
|
+
console.log('Demo de rendimiento iniciado en http://localhost:3000');
|
|
161
|
+
console.log('Endpoints disponibles:');
|
|
162
|
+
console.log(' GET /api/compression-test - Demo de compresión');
|
|
163
|
+
console.log(' POST /api/large-body - Demo de bodies extensos');
|
|
164
|
+
console.log(' GET /api/users/:userId/posts - Demo de rutas anidadas');
|
|
165
|
+
console.log(' GET /api/users/:userId/posts/:postId/comments - Demo de rutas anidadas profundas');
|
|
166
|
+
console.log(' POST /api/upload-large-data - Demo de carga de datos grandes');
|
|
167
|
+
console.log(' GET /api/performance-test - Demo de rendimiento');
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log('Visita http://localhost:3000 para ver la página principal');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
module.exports = app;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Demo de Rendimiento - JERK Framework
|
|
2
|
+
|
|
3
|
+
Este demostración muestra las capacidades de rendimiento del framework JERK, incluyendo:
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- **Compresión de respuestas**: El servidor comprime automáticamente las respuestas grandes para mejorar el rendimiento.
|
|
8
|
+
- **Soporte para bodies extensos**: Capacidad para manejar payloads grandes en requests POST.
|
|
9
|
+
- **Rutas anidadas**: Soporte para rutas jerárquicas complejas.
|
|
10
|
+
- **Verificación de puerto**: El servidor encuentra automáticamente un puerto disponible para evitar conflictos.
|
|
11
|
+
- **Visualización de rutas**: Lista interactiva de todas las rutas disponibles usando hooks.
|
|
12
|
+
|
|
13
|
+
## Endpoints
|
|
14
|
+
|
|
15
|
+
### Compresión
|
|
16
|
+
- `GET /api/compression-test` - Retorna una respuesta grande para demostrar compresión
|
|
17
|
+
|
|
18
|
+
### Bodies Extensos
|
|
19
|
+
- `POST /api/large-body` - Acepta grandes cantidades de datos en el body
|
|
20
|
+
|
|
21
|
+
### Rutas Anidadas
|
|
22
|
+
- `GET /api/users/:userId/posts` - Posts de un usuario específico
|
|
23
|
+
- `GET /api/users/:userId/posts/:postId/comments` - Comentarios de un post específico
|
|
24
|
+
|
|
25
|
+
### Otros Endpoints
|
|
26
|
+
- `POST /api/upload-large-data` - Prueba de carga de datos grandes con diferentes tipos
|
|
27
|
+
- `GET /api/performance-test` - Medición de tiempo de procesamiento
|
|
28
|
+
- `GET /` - Página principal con instrucciones
|
|
29
|
+
- `GET /routes` - Lista interactiva de todas las rutas disponibles
|
|
30
|
+
|
|
31
|
+
## Cómo Ejecutar
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cd examples/performance_demo_with_hooks
|
|
35
|
+
node app.js
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
El servidor se iniciará en un puerto disponible entre 3000 y 3100, y mostrará el puerto asignado en la consola.
|
|
39
|
+
|
|
40
|
+
## Pruebas
|
|
41
|
+
|
|
42
|
+
Para probar la compresión, visita `/api/compression-test` y observa cómo se envía una respuesta grande de manera eficiente.
|
|
43
|
+
|
|
44
|
+
Para probar bodies extensos, puedes usar curl:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
curl -X POST http://localhost:[PUERTO]/api/large-body \
|
|
48
|
+
-H "Content-Type: application/json" \
|
|
49
|
+
-d '{"data": "'"$(printf 'x%.0s' {1..10000})"'"}'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Para ver todas las rutas disponibles, visita `/routes` en tu navegador.
|
|
@@ -0,0 +1,290 @@
|
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jerkjs",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "JERK Framework v2.1 - A comprehensive framework for building secure and scalable APIs with frontend support, sessions, and template engine with performance optimizations",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|