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.0",
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": {