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,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ejemplo de API con funcionalidades de firewall avanzado (v2.1.0)
|
|
3
|
-
* Demostrando el uso del sistema de firewall con el sistema de hooks
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const {
|
|
7
|
-
APIServer,
|
|
8
|
-
Authenticator,
|
|
9
|
-
RateLimiter,
|
|
10
|
-
Logger,
|
|
11
|
-
HookSystem,
|
|
12
|
-
Firewall
|
|
13
|
-
} = require('../../index.js');
|
|
14
|
-
|
|
15
|
-
async function startServer() {
|
|
16
|
-
// Crear instancia del servidor
|
|
17
|
-
const server = new APIServer({
|
|
18
|
-
port: 8097,
|
|
19
|
-
host: 'localhost'
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// Crear instancia del logger
|
|
23
|
-
const logger = new Logger({ level: 'info' });
|
|
24
|
-
|
|
25
|
-
// Crear instancia del sistema de hooks
|
|
26
|
-
const hooks = new HookSystem();
|
|
27
|
-
|
|
28
|
-
// Crear instancia del firewall
|
|
29
|
-
const firewall = new Firewall({
|
|
30
|
-
maxAttempts: 3,
|
|
31
|
-
blockDuration: 300000, // 5 minutos para pruebas
|
|
32
|
-
whitelist: ['127.0.0.1', '::1'], // IPs locales
|
|
33
|
-
blacklist: [], // Ninguna IP bloqueada por defecto
|
|
34
|
-
rules: [
|
|
35
|
-
{
|
|
36
|
-
name: 'large_payload',
|
|
37
|
-
condition: (req) => {
|
|
38
|
-
// Bloquear solicitudes con cuerpo muy grande
|
|
39
|
-
const contentLength = req.headers['content-length'];
|
|
40
|
-
return contentLength && parseInt(contentLength) > 1024 * 100; // 100KB
|
|
41
|
-
},
|
|
42
|
-
action: 'block',
|
|
43
|
-
reason: 'Solicitud con payload excesivamente grande'
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: 'suspicious_user_agent',
|
|
47
|
-
condition: (req) => {
|
|
48
|
-
const userAgent = req.headers['user-agent'] || '';
|
|
49
|
-
// Detectar user agents sospechosos
|
|
50
|
-
const suspiciousAgents = [
|
|
51
|
-
/sqlmap/i,
|
|
52
|
-
/nikto/i,
|
|
53
|
-
/nessus/i,
|
|
54
|
-
/nmap/i,
|
|
55
|
-
/dirbuster/i
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
return suspiciousAgents.some(agent => agent.test(userAgent));
|
|
59
|
-
},
|
|
60
|
-
action: 'block',
|
|
61
|
-
reason: 'User agent sospechoso detectado'
|
|
62
|
-
}
|
|
63
|
-
],
|
|
64
|
-
logger
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
// Registrar hooks para eventos de firewall
|
|
69
|
-
hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
|
|
70
|
-
logger.info(`[[FIREWALL-HOOK]] Regla activada: ${rule.name} para IP: ${clientIP}`);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
hooks.addAction('firewall_ip_blocked', (ip, reason) => {
|
|
74
|
-
logger.warn(`[[FIREWALL-HOOK]] IP bloqueada: ${ip} por razón: ${reason}`);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
hooks.addAction('firewall_security_event', (event, details) => {
|
|
78
|
-
logger.info(`[[FIREWALL-HOOK]] Evento de seguridad: ${event}`, details);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Aplicar middleware de firewall al servidor
|
|
82
|
-
server.use(firewall.middleware());
|
|
83
|
-
|
|
84
|
-
// Ruta pública
|
|
85
|
-
server.addRoute('GET', '/', (req, res) => {
|
|
86
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
87
|
-
res.end(JSON.stringify({
|
|
88
|
-
message: 'API con funcionalidades de firewall avanzado (v2.1.0)',
|
|
89
|
-
features: [
|
|
90
|
-
'Detección de patrones de ataque (SQL Injection, XSS, Path Traversal)',
|
|
91
|
-
'Bloqueo de IPs tras intentos fallidos',
|
|
92
|
-
'Listas blancas y negras de IPs',
|
|
93
|
-
'Reglas personalizadas de firewall',
|
|
94
|
-
'Sistema de hooks para eventos de seguridad',
|
|
95
|
-
'Monitoreo de solicitudes sospechosas'
|
|
96
|
-
],
|
|
97
|
-
firewallStatus: firewall.getStatus(),
|
|
98
|
-
timestamp: new Date().toISOString()
|
|
99
|
-
}));
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Ruta para probar diferentes tipos de ataques
|
|
103
|
-
server.addRoute('GET', '/test-attacks', (req, res) => {
|
|
104
|
-
// Disparar un hook personalizado para demostrar el sistema
|
|
105
|
-
hooks.doAction('firewall_security_event', 'attack_test_requested', {
|
|
106
|
-
clientIP: firewall.getClientIP(req),
|
|
107
|
-
userAgent: req.headers['user-agent'],
|
|
108
|
-
timestamp: new Date().toISOString()
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
112
|
-
res.end(JSON.stringify({
|
|
113
|
-
message: 'Prueba de ataques completada',
|
|
114
|
-
clientIP: firewall.getClientIP(req),
|
|
115
|
-
securityLevel: 'monitored',
|
|
116
|
-
timestamp: new Date().toISOString()
|
|
117
|
-
}));
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// Ruta para probar SQL injection (esta debería ser bloqueada)
|
|
121
|
-
server.addRoute('GET', '/test-sql-injection', (req, res) => {
|
|
122
|
-
// Esta ruta no debería ser accesible si se detecta SQL injection en la URL
|
|
123
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
124
|
-
res.end(JSON.stringify({
|
|
125
|
-
message: '¡Esto no debería verse si se detectó SQL injection!',
|
|
126
|
-
status: 'compromised',
|
|
127
|
-
timestamp: new Date().toISOString()
|
|
128
|
-
}));
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
// Ruta para probar XSS (esta debería ser bloqueada)
|
|
132
|
-
server.addRoute('GET', '/test-xss', (req, res) => {
|
|
133
|
-
// Esta ruta no debería ser accesible si se detecta XSS en la URL
|
|
134
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
135
|
-
res.end(JSON.stringify({
|
|
136
|
-
message: '¡Esto no debería verse si se detectó XSS!',
|
|
137
|
-
status: 'compromised',
|
|
138
|
-
timestamp: new Date().toISOString()
|
|
139
|
-
}));
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// Ruta para probar path traversal (esta debería ser bloqueada)
|
|
143
|
-
server.addRoute('GET', '/test-path-traversal', (req, res) => {
|
|
144
|
-
// Esta ruta no debería ser accesible si se detecta path traversal
|
|
145
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
146
|
-
res.end(JSON.stringify({
|
|
147
|
-
message: '¡Esto no debería verse si se detectó path traversal!',
|
|
148
|
-
status: 'compromised',
|
|
149
|
-
timestamp: new Date().toISOString()
|
|
150
|
-
}));
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// Ruta para verificar estado del firewall
|
|
154
|
-
server.addRoute('GET', '/firewall-status', (req, res) => {
|
|
155
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
156
|
-
res.end(JSON.stringify({
|
|
157
|
-
firewall: firewall.getStatus(),
|
|
158
|
-
timestamp: new Date().toISOString()
|
|
159
|
-
}));
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// Iniciar el servidor
|
|
163
|
-
server.start();
|
|
164
|
-
|
|
165
|
-
logger.info('Servidor con firewall avanzado iniciado en http://localhost:8097');
|
|
166
|
-
logger.info('Endpoints disponibles:');
|
|
167
|
-
logger.info('- GET / - Página de inicio con información de firewall');
|
|
168
|
-
logger.info('- GET /test-attacks - Prueba de detección de ataques');
|
|
169
|
-
logger.info('- GET /test-sql-injection - Prueba de detección de SQL injection (será bloqueada)');
|
|
170
|
-
logger.info('- GET /test-xss - Prueba de detección de XSS (será bloqueada)');
|
|
171
|
-
logger.info('- GET /test-path-traversal - Prueba de detección de path traversal (será bloqueada)');
|
|
172
|
-
logger.info('- GET /firewall-status - Estado actual del firewall');
|
|
173
|
-
} catch (error) {
|
|
174
|
-
logger.error('Error iniciando el servidor:', error.message);
|
|
175
|
-
process.exit(1);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Iniciar el servidor
|
|
180
|
-
startServer();
|
|
181
|
-
|
|
182
|
-
module.exports = { startServer };
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "jerk-firewall-demo",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Ejemplo de API con funcionalidades de firewall avanzado usando el Framework JERK",
|
|
5
|
-
"main": "app.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"start": "node app.js",
|
|
8
|
-
"dev": "nodemon app.js"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"api",
|
|
12
|
-
"sdk",
|
|
13
|
-
"firewall",
|
|
14
|
-
"security",
|
|
15
|
-
"advanced",
|
|
16
|
-
"protection",
|
|
17
|
-
"framework"
|
|
18
|
-
],
|
|
19
|
-
"author": "JERK Framework",
|
|
20
|
-
"license": "MIT",
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"jsonwebtoken": "^9.0.0"
|
|
23
|
-
},
|
|
24
|
-
"devDependencies": {
|
|
25
|
-
"nodemon": "^3.0.0"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
# Ejemplo de Sistema de Hooks en Framework JERK
|
|
2
|
-
|
|
3
|
-
Este ejemplo demuestra cómo usar el sistema de hooks como el core de WordPress para extender la funcionalidad del Framework JERK en diferentes puntos del ciclo de vida.
|
|
4
|
-
|
|
5
|
-
## Características del Sistema de Hooks
|
|
6
|
-
|
|
7
|
-
- **Acciones (Actions)**: Puntos de extensión donde se pueden ejecutar funciones
|
|
8
|
-
- **Filtros (Filters)**: Puntos donde se pueden modificar datos antes de ser procesados
|
|
9
|
-
- **Extensibilidad**: Capacidad para agregar funcionalidades en múltiples puntos del ciclo de vida
|
|
10
|
-
- **Ciclo de Vida**: Hooks disponibles en diferentes etapas del proceso
|
|
11
|
-
|
|
12
|
-
## Hooks Disponibles
|
|
13
|
-
|
|
14
|
-
### Hooks de Servidor
|
|
15
|
-
- `framework_init`: Se ejecuta cuando se inicializa el framework
|
|
16
|
-
- `pre_server_start`: Antes de iniciar el servidor
|
|
17
|
-
- `post_server_start`: Después de iniciar el servidor
|
|
18
|
-
|
|
19
|
-
### Hooks de Carga de Rutas
|
|
20
|
-
- `pre_route_load`: Antes de cargar rutas desde archivo
|
|
21
|
-
- `post_route_load`: Después de cargar rutas desde archivo
|
|
22
|
-
|
|
23
|
-
### Hooks de Carga de Controladores
|
|
24
|
-
- `pre_controller_load`: Antes de cargar un controlador
|
|
25
|
-
- `post_controller_load`: Después de cargar un controlador
|
|
26
|
-
|
|
27
|
-
## Configuración
|
|
28
|
-
|
|
29
|
-
No se requieren dependencias adicionales más allá del Framework JERK.
|
|
30
|
-
|
|
31
|
-
## Uso
|
|
32
|
-
|
|
33
|
-
1. Inicia el servidor:
|
|
34
|
-
```bash
|
|
35
|
-
node app.js
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
2. El servidor escuchará en `http://localhost:8096`
|
|
39
|
-
|
|
40
|
-
## Endpoints
|
|
41
|
-
|
|
42
|
-
- `GET /` - Página de inicio con información del sistema de hooks
|
|
43
|
-
- `GET /hooks-info` - Información sobre el sistema de hooks
|
|
44
|
-
|
|
45
|
-
## Ejemplo de uso de Hooks
|
|
46
|
-
|
|
47
|
-
```javascript
|
|
48
|
-
const { hooks } = require('jerkjs');
|
|
49
|
-
|
|
50
|
-
// Registrar una acción
|
|
51
|
-
hooks.addAction('nombre_del_hook', (param1, param2) => {
|
|
52
|
-
console.log('Hook ejecutado con:', param1, param2);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// Registrar un filtro
|
|
56
|
-
hooks.addFilter('nombre_del_filtro', (valor, parametroAdicional) => {
|
|
57
|
-
return valor + parametroAdicional;
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// Ejecutar una acción
|
|
61
|
-
hooks.doAction('nombre_del_hook', 'dato1', 'dato2');
|
|
62
|
-
|
|
63
|
-
// Aplicar un filtro
|
|
64
|
-
const resultado = hooks.applyFilters('nombre_del_filtro', 'valorInicial', 'datoAdicional');
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Estructura del proyecto
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
examples/v2.1_hooks_demo/
|
|
71
|
-
├── app.js # Punto de entrada de la aplicación con hooks
|
|
72
|
-
├── routes.json # Definición de rutas
|
|
73
|
-
├── controllers/ # Controladores de las rutas
|
|
74
|
-
│ ├── mainController.js
|
|
75
|
-
│ └── hooksController.js
|
|
76
|
-
└── README.md
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Beneficios del Sistema de Hooks
|
|
80
|
-
|
|
81
|
-
1. **Extensibilidad**: Permite extender la funcionalidad sin modificar el código base
|
|
82
|
-
2. **Modularidad**: Módulos pueden añadir funcionalidades sin interferir entre sí
|
|
83
|
-
3. **Flexibilidad**: Hooks disponibles en múltiples puntos del ciclo de vida
|
|
84
|
-
4. **Personalización**: Capacidad para modificar comportamientos predeterminados
|
|
85
|
-
5. **Integración**: Fácil integración con sistemas de terceros
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ejemplo de uso del sistema de hooks en el Framework JERK
|
|
3
|
-
* Demostrando extensibilidad en diferentes puntos del ciclo de vida
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const jerk = require('../../index.js');
|
|
7
|
-
const {
|
|
8
|
-
APIServer,
|
|
9
|
-
Logger
|
|
10
|
-
} = jerk;
|
|
11
|
-
const RouteLoader = require('../../lib/loader/routeLoader.js');
|
|
12
|
-
const ControllerLoader = require('../../lib/loader/controllerLoader.js');
|
|
13
|
-
const hooks = jerk.hooks;
|
|
14
|
-
|
|
15
|
-
async function startServer() {
|
|
16
|
-
// Crear instancia del servidor
|
|
17
|
-
const server = new APIServer({
|
|
18
|
-
port: 8096,
|
|
19
|
-
host: 'localhost'
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// Crear instancia del logger
|
|
23
|
-
const logger = new Logger({ level: 'info' });
|
|
24
|
-
|
|
25
|
-
try {
|
|
26
|
-
// Registrar hooks para diferentes eventos del ciclo de vida
|
|
27
|
-
|
|
28
|
-
// Hook que se ejecuta cuando se inicializa el framework
|
|
29
|
-
hooks.addAction('framework_init', () => {
|
|
30
|
-
logger.info('[[FRAMEWORK]] - El framework ha sido inicializado');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// Hook que se ejecuta antes de iniciar el servidor
|
|
34
|
-
hooks.addAction('pre_server_start', (serverInstance) => {
|
|
35
|
-
logger.info('[[HOOK]] - Antes de iniciar el servidor');
|
|
36
|
-
logger.info('[[HOOK]] - Puerto configurado:', serverInstance.port);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
// Hook que se ejecuta después de iniciar el servidor
|
|
40
|
-
hooks.addAction('post_server_start', (serverInstance) => {
|
|
41
|
-
logger.info('[[HOOK]] - Servidor iniciado exitosamente');
|
|
42
|
-
logger.info('[[HOOK]] - Escuchando en:', `http://${serverInstance.host}:${serverInstance.port}`);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// Hook que se ejecuta antes de cargar rutas
|
|
46
|
-
hooks.addAction('pre_route_load', (filePath, serverInstance) => {
|
|
47
|
-
logger.info('[[HOOK]] - A punto de cargar rutas desde:', filePath);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Hook que se ejecuta después de cargar rutas
|
|
51
|
-
hooks.addAction('post_route_load', (routes, serverInstance) => {
|
|
52
|
-
logger.info('[[HOOK]] - Rutas cargadas exitosamente:', routes.length, 'rutas');
|
|
53
|
-
routes.forEach((route, index) => {
|
|
54
|
-
logger.info(`[[HOOK]] - Ruta ${index + 1}: ${route.method} ${route.path}`);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// Hook que se ejecuta antes de cargar un controlador
|
|
59
|
-
hooks.addAction('pre_controller_load', (controllerPath) => {
|
|
60
|
-
logger.info('[[HOOK]] - A punto de cargar controlador:', controllerPath);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// Hook que se ejecuta después de cargar un controlador
|
|
64
|
-
hooks.addAction('post_controller_load', (controllerModule, absolutePath) => {
|
|
65
|
-
logger.info('[[HOOK]] - Controlador cargado exitosamente:', absolutePath);
|
|
66
|
-
// Podríamos inspeccionar las funciones disponibles en el módulo
|
|
67
|
-
const availableHandlers = Object.keys(controllerModule).filter(key =>
|
|
68
|
-
typeof controllerModule[key] === 'function'
|
|
69
|
-
);
|
|
70
|
-
logger.info('[[HOOK]] - Handlers disponibles en el controlador:', availableHandlers);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// Ejemplo de uso de filtros
|
|
74
|
-
hooks.addFilter('modify_response_data', (data, endpoint) => {
|
|
75
|
-
// Añadir información de auditoría a todas las respuestas
|
|
76
|
-
return {
|
|
77
|
-
...data,
|
|
78
|
-
_hook_processed: true,
|
|
79
|
-
_timestamp: new Date().toISOString(),
|
|
80
|
-
_endpoint: endpoint
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Cargar rutas desde archivo JSON
|
|
85
|
-
const routeLoader = new RouteLoader();
|
|
86
|
-
await routeLoader.loadRoutes(server, './routes.json');
|
|
87
|
-
|
|
88
|
-
// Iniciar el servidor
|
|
89
|
-
server.start();
|
|
90
|
-
|
|
91
|
-
logger.info('Servidor iniciado con sistema de hooks activo');
|
|
92
|
-
} catch (error) {
|
|
93
|
-
logger.error('Error iniciando el servidor:', error.message);
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Iniciar el servidor
|
|
99
|
-
startServer();
|
|
100
|
-
|
|
101
|
-
module.exports = { startServer };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
const jerk = require('../../../index.js');
|
|
2
|
-
const hooks = jerk.hooks;
|
|
3
|
-
|
|
4
|
-
const hooksController = {
|
|
5
|
-
getHooksInfo: (req, res) => {
|
|
6
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
7
|
-
res.end(JSON.stringify({
|
|
8
|
-
message: 'Información sobre el sistema de hooks',
|
|
9
|
-
hooksSystem: {
|
|
10
|
-
'actionsRegistradas': hooks.actions ? hooks.actions.size : 0,
|
|
11
|
-
'filtersRegistrados': hooks.filters ? hooks.filters.size : 0,
|
|
12
|
-
'accionesDisponibles': [
|
|
13
|
-
'framework_init',
|
|
14
|
-
'pre_server_start',
|
|
15
|
-
'post_server_start',
|
|
16
|
-
'pre_route_load',
|
|
17
|
-
'post_route_load',
|
|
18
|
-
'pre_controller_load',
|
|
19
|
-
'post_controller_load'
|
|
20
|
-
],
|
|
21
|
-
'ejemploUso': 'hooks.addAction(nombreHook, funcionCallback)',
|
|
22
|
-
'ejemploFiltro': 'hooks.addFilter(nombreFiltro, funcionCallback)'
|
|
23
|
-
},
|
|
24
|
-
timestamp: new Date().toISOString()
|
|
25
|
-
}));
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
module.exports = hooksController;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
const mainController = {
|
|
2
|
-
home: (req, res) => {
|
|
3
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4
|
-
res.end(JSON.stringify({
|
|
5
|
-
message: 'API con sistema de hooks activo',
|
|
6
|
-
features: [
|
|
7
|
-
'Pre/Post hooks para carga de rutas',
|
|
8
|
-
'Pre/Post hooks para carga de controladores',
|
|
9
|
-
'Pre/Post hooks para inicio de servidor',
|
|
10
|
-
'Filtros para modificar datos de respuesta',
|
|
11
|
-
'Extensibilidad en múltiples puntos del ciclo de vida'
|
|
12
|
-
],
|
|
13
|
-
timestamp: new Date().toISOString()
|
|
14
|
-
}));
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
module.exports = mainController;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "jerk-hooks-demo",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Ejemplo de API con sistema de hooks para extensibilidad usando el Framework JERK",
|
|
5
|
-
"main": "app.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"start": "node app.js",
|
|
8
|
-
"dev": "nodemon app.js"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"api",
|
|
12
|
-
"sdk",
|
|
13
|
-
"hooks",
|
|
14
|
-
"filters",
|
|
15
|
-
"extensibility",
|
|
16
|
-
"wordpress",
|
|
17
|
-
"framework"
|
|
18
|
-
],
|
|
19
|
-
"author": "JERK Framework",
|
|
20
|
-
"license": "MIT",
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"jsonwebtoken": "^9.0.0"
|
|
23
|
-
},
|
|
24
|
-
"devDependencies": {
|
|
25
|
-
"nodemon": "^3.0.0"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"path": "/",
|
|
4
|
-
"method": "GET",
|
|
5
|
-
"controller": "./controllers/mainController.js",
|
|
6
|
-
"handler": "home",
|
|
7
|
-
"auth": "none"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"path": "/hooks-info",
|
|
11
|
-
"method": "GET",
|
|
12
|
-
"controller": "./controllers/hooksController.js",
|
|
13
|
-
"handler": "getHooksInfo",
|
|
14
|
-
"auth": "none"
|
|
15
|
-
}
|
|
16
|
-
]
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# Ejemplo API con Funcionalidades OpenAPI (v2.1.0)
|
|
2
|
-
|
|
3
|
-
Este ejemplo demuestra cómo crear una API con funcionalidades OpenAPI integradas utilizando el Framework JERK.
|
|
4
|
-
|
|
5
|
-
## Características de OpenAPI
|
|
6
|
-
|
|
7
|
-
- **Generación automática de documentación OpenAPI 3.0**
|
|
8
|
-
- **Interfaz Swagger UI interactiva**
|
|
9
|
-
- **Definición de esquemas de datos**
|
|
10
|
-
- **Documentación de seguridad y autenticación**
|
|
11
|
-
- **Especificación de endpoints, parámetros y respuestas**
|
|
12
|
-
- **Soporte para diferentes formatos de contenido**
|
|
13
|
-
- **Validación de peticiones y respuestas**
|
|
14
|
-
|
|
15
|
-
## Configuración
|
|
16
|
-
|
|
17
|
-
No se requieren dependencias adicionales más allá del Framework JERK.
|
|
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:8096`
|
|
27
|
-
|
|
28
|
-
## Endpoints
|
|
29
|
-
|
|
30
|
-
- `GET /` - Página de inicio con información de OpenAPI
|
|
31
|
-
- `POST /login` - Iniciar sesión y obtener token
|
|
32
|
-
- `GET /users` - Lista de usuarios (requiere token)
|
|
33
|
-
- `GET /products` - Lista de productos (requiere token)
|
|
34
|
-
- `GET /docs` - Documentación interactiva OpenAPI/Swagger
|
|
35
|
-
- `GET /openapi.json` - Especificación OpenAPI
|
|
36
|
-
|
|
37
|
-
## Ejemplo de uso
|
|
38
|
-
|
|
39
|
-
1. Iniciar sesión:
|
|
40
|
-
```bash
|
|
41
|
-
curl -X POST http://localhost:8096/login \
|
|
42
|
-
-H "Content-Type: application/json" \
|
|
43
|
-
-d '{"username": "admin", "password": "password"}'
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
2. Acceder a usuarios con el token:
|
|
47
|
-
```bash
|
|
48
|
-
curl -X GET http://localhost:8096/users \
|
|
49
|
-
-H "Authorization: Bearer TU_TOKEN_AQUI"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
3. Ver documentación interactiva:
|
|
53
|
-
Visita `http://localhost:8096/docs` en tu navegador
|
|
54
|
-
|
|
55
|
-
4. Obtener especificación OpenAPI:
|
|
56
|
-
```bash
|
|
57
|
-
curl -X GET http://localhost:8096/openapi.json
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Estructura del proyecto
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
examples/v2.1_openapi_demo/
|
|
64
|
-
├── app.js # Punto de entrada de la aplicación
|
|
65
|
-
├── controllers/ # Controladores de las rutas
|
|
66
|
-
│ ├── mainController.js
|
|
67
|
-
│ ├── authController.js
|
|
68
|
-
│ ├── userController.js
|
|
69
|
-
│ └── productController.js
|
|
70
|
-
└── README.md
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Documentación OpenAPI
|
|
74
|
-
|
|
75
|
-
El framework genera automáticamente:
|
|
76
|
-
|
|
77
|
-
- Una especificación OpenAPI 3.0 en `/openapi.json`
|
|
78
|
-
- Una interfaz Swagger UI interactiva en `/docs`
|
|
79
|
-
- Esquemas de datos definidos para reutilización
|
|
80
|
-
- Documentación detallada de endpoints, parámetros y respuestas
|
|
81
|
-
- Soporte para diferentes códigos de respuesta HTTP
|
|
82
|
-
- Definición de esquemas de seguridad
|