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.
Files changed (170) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/README.md +1 -1
  3. package/examples.arj +0 -0
  4. package/index.js +1 -1
  5. package/lib/middleware/compressor.js +34 -18
  6. package/package.json +1 -1
  7. package/standard/CompressionTestController.js +38 -0
  8. package/standard/HealthController.js +16 -0
  9. package/standard/HomeController.js +12 -0
  10. package/standard/ProductController.js +18 -0
  11. package/standard/README.md +47 -0
  12. package/standard/UserController.js +23 -0
  13. package/standard/package.json +22 -0
  14. package/standard/routes.json +58 -0
  15. package/standard/server.js +140 -0
  16. package/cookies.txt +0 -5
  17. package/examples/advanced/controllers/productController.js +0 -64
  18. package/examples/advanced/controllers/userController.js +0 -85
  19. package/examples/advanced/routes.json +0 -51
  20. package/examples/advanced_example.js +0 -93
  21. package/examples/basic/controllers/userController.js +0 -85
  22. package/examples/basic_example.js +0 -72
  23. package/examples/frontend/README.md +0 -71
  24. package/examples/frontend/app.js +0 -71
  25. package/examples/frontend/controllers/apiController.js +0 -39
  26. package/examples/frontend/controllers/authController.js +0 -220
  27. package/examples/frontend/controllers/formController.js +0 -47
  28. package/examples/frontend/controllers/messageController.js +0 -96
  29. package/examples/frontend/controllers/pageController.js +0 -178
  30. package/examples/frontend/controllers/staticController.js +0 -167
  31. package/examples/frontend/routes.json +0 -90
  32. package/examples/hooks/app.js +0 -136
  33. package/examples/hooks/controllers/authController.js +0 -54
  34. package/examples/hooks/controllers/mainController.js +0 -41
  35. package/examples/hooks/controllers/productController.js +0 -39
  36. package/examples/hooks/controllers/userController.js +0 -69
  37. package/examples/hooks/routes.json +0 -51
  38. package/examples/hooks/views/home.html +0 -50
  39. package/examples/mvc_example/app.js +0 -138
  40. package/examples/mvc_example/views/home/index.html +0 -26
  41. package/examples/mvc_example/views/home/simple.html +0 -3
  42. package/examples/mvc_example/views/layout.html +0 -23
  43. package/examples/mvc_example/views/test.html +0 -3
  44. package/examples/mvc_example/views/user/invalid.html +0 -6
  45. package/examples/mvc_example/views/user/list.html +0 -36
  46. package/examples/mvc_example/views/user/notfound.html +0 -6
  47. package/examples/mvc_example/views/user/profile.html +0 -11
  48. package/examples/mvc_routes_example/app.js +0 -34
  49. package/examples/mvc_routes_example/controllers/mainController.js +0 -27
  50. package/examples/mvc_routes_example/controllers/productController.js +0 -47
  51. package/examples/mvc_routes_example/controllers/userController.js +0 -76
  52. package/examples/mvc_routes_example/routes.json +0 -30
  53. package/examples/mvc_routes_example/views/layout.html +0 -31
  54. package/examples/mvc_routes_example/views/main/index.html +0 -11
  55. package/examples/mvc_routes_example/views/product/catalog.html +0 -24
  56. package/examples/mvc_routes_example/views/user/invalid.html +0 -6
  57. package/examples/mvc_routes_example/views/user/list.html +0 -40
  58. package/examples/mvc_routes_example/views/user/notfound.html +0 -6
  59. package/examples/mvc_routes_example/views/user/profile.html +0 -18
  60. package/examples/mvc_welcome/README.md +0 -34
  61. package/examples/mvc_welcome/app.js +0 -50
  62. package/examples/mvc_welcome/controllers/welcomeController.js +0 -41
  63. package/examples/mvc_welcome/package.json +0 -26
  64. package/examples/mvc_welcome/views/home/welcome.html +0 -82
  65. package/examples/performance_demo/app.js +0 -172
  66. package/examples/performance_demo_with_hooks/README.md +0 -52
  67. package/examples/performance_demo_with_hooks/app.js +0 -290
  68. package/examples/public/README.md +0 -92
  69. package/examples/public/app.js +0 -72
  70. package/examples/public/controllers/healthController.js +0 -20
  71. package/examples/public/controllers/mainController.js +0 -22
  72. package/examples/public/controllers/userController.js +0 -139
  73. package/examples/public/routes.json +0 -51
  74. package/examples/v2/README.md +0 -72
  75. package/examples/v2/app.js +0 -74
  76. package/examples/v2/app_fixed.js +0 -74
  77. package/examples/v2/controllers/authController.js +0 -64
  78. package/examples/v2/controllers/mainController.js +0 -24
  79. package/examples/v2/controllers/protectedController.js +0 -12
  80. package/examples/v2/controllers/userController.js +0 -16
  81. package/examples/v2/package.json +0 -27
  82. package/examples/v2/routes.json +0 -30
  83. package/examples/v2/test_api.sh +0 -47
  84. package/examples/v2/tokens_example.sqlite +0 -0
  85. package/examples/v2.1_firewall_demo/README.md +0 -113
  86. package/examples/v2.1_firewall_demo/app.js +0 -182
  87. package/examples/v2.1_firewall_demo/package.json +0 -27
  88. package/examples/v2.1_hooks_demo/README.md +0 -85
  89. package/examples/v2.1_hooks_demo/app.js +0 -101
  90. package/examples/v2.1_hooks_demo/controllers/hooksController.js +0 -29
  91. package/examples/v2.1_hooks_demo/controllers/mainController.js +0 -18
  92. package/examples/v2.1_hooks_demo/package.json +0 -27
  93. package/examples/v2.1_hooks_demo/routes.json +0 -16
  94. package/examples/v2.1_openapi_demo/README.md +0 -82
  95. package/examples/v2.1_openapi_demo/app.js +0 -296
  96. package/examples/v2.1_openapi_demo/package.json +0 -26
  97. package/examples/v2_cors/README.md +0 -82
  98. package/examples/v2_cors/app.js +0 -108
  99. package/examples/v2_cors/package.json +0 -23
  100. package/examples/v2_json_auth/README.md +0 -83
  101. package/examples/v2_json_auth/app.js +0 -72
  102. package/examples/v2_json_auth/controllers/authController.js +0 -67
  103. package/examples/v2_json_auth/controllers/mainController.js +0 -16
  104. package/examples/v2_json_auth/controllers/protectedController.js +0 -12
  105. package/examples/v2_json_auth/controllers/tokenController.js +0 -28
  106. package/examples/v2_json_auth/controllers/userController.js +0 -15
  107. package/examples/v2_json_auth/package.json +0 -26
  108. package/examples/v2_json_auth/routes.json +0 -37
  109. package/examples/v2_json_auth/tokens.json +0 -20
  110. package/examples/v2_mariadb_auth/README.md +0 -94
  111. package/examples/v2_mariadb_auth/app.js +0 -81
  112. package/examples/v2_mariadb_auth/controllers/authController.js +0 -95
  113. package/examples/v2_mariadb_auth/controllers/mainController.js +0 -31
  114. package/examples/v2_mariadb_auth/controllers/protectedController.js +0 -12
  115. package/examples/v2_mariadb_auth/controllers/userController.js +0 -17
  116. package/examples/v2_mariadb_auth/package.json +0 -27
  117. package/examples/v2_mariadb_auth/routes.json +0 -37
  118. package/examples/v2_no_auth/README.md +0 -75
  119. package/examples/v2_no_auth/app.js +0 -72
  120. package/examples/v2_no_auth/controllers/healthController.js +0 -14
  121. package/examples/v2_no_auth/controllers/mainController.js +0 -19
  122. package/examples/v2_no_auth/controllers/productController.js +0 -31
  123. package/examples/v2_no_auth/controllers/publicController.js +0 -16
  124. package/examples/v2_no_auth/package.json +0 -22
  125. package/examples/v2_no_auth/routes.json +0 -37
  126. package/examples/v2_oauth/README.md +0 -70
  127. package/examples/v2_oauth/app.js +0 -90
  128. package/examples/v2_oauth/controllers/mainController.js +0 -45
  129. package/examples/v2_oauth/controllers/oauthController.js +0 -247
  130. package/examples/v2_oauth/controllers/protectedController.js +0 -13
  131. package/examples/v2_oauth/controllers/userController.js +0 -17
  132. package/examples/v2_oauth/package.json +0 -26
  133. package/examples/v2_oauth/routes.json +0 -44
  134. package/examples/v2_openapi/README.md +0 -77
  135. package/examples/v2_openapi/app.js +0 -222
  136. package/examples/v2_openapi/controllers/authController.js +0 -52
  137. package/examples/v2_openapi/controllers/mainController.js +0 -26
  138. package/examples/v2_openapi/controllers/productController.js +0 -17
  139. package/examples/v2_openapi/controllers/userController.js +0 -27
  140. package/examples/v2_openapi/package.json +0 -26
  141. package/examples/v2_openapi/routes.json +0 -37
  142. package/v2examplle/v2_json_auth/README.md +0 -83
  143. package/v2examplle/v2_json_auth/app.js +0 -72
  144. package/v2examplle/v2_json_auth/controllers/authController.js +0 -67
  145. package/v2examplle/v2_json_auth/controllers/mainController.js +0 -16
  146. package/v2examplle/v2_json_auth/controllers/protectedController.js +0 -12
  147. package/v2examplle/v2_json_auth/controllers/tokenController.js +0 -28
  148. package/v2examplle/v2_json_auth/controllers/userController.js +0 -15
  149. package/v2examplle/v2_json_auth/package.json +0 -26
  150. package/v2examplle/v2_json_auth/routes.json +0 -37
  151. package/v2examplle/v2_json_auth/tokens.json +0 -20
  152. package/v2examplle/v2_mariadb_auth/README.md +0 -94
  153. package/v2examplle/v2_mariadb_auth/app.js +0 -81
  154. package/v2examplle/v2_mariadb_auth/controllers/authController.js +0 -95
  155. package/v2examplle/v2_mariadb_auth/controllers/mainController.js +0 -31
  156. package/v2examplle/v2_mariadb_auth/controllers/protectedController.js +0 -12
  157. package/v2examplle/v2_mariadb_auth/controllers/userController.js +0 -17
  158. package/v2examplle/v2_mariadb_auth/package.json +0 -27
  159. package/v2examplle/v2_mariadb_auth/routes.json +0 -37
  160. package/v2examplle/v2_sqlite_auth/README.md +0 -72
  161. package/v2examplle/v2_sqlite_auth/app.js +0 -74
  162. package/v2examplle/v2_sqlite_auth/app_fixed.js +0 -74
  163. package/v2examplle/v2_sqlite_auth/controllers/authController.js +0 -64
  164. package/v2examplle/v2_sqlite_auth/controllers/mainController.js +0 -24
  165. package/v2examplle/v2_sqlite_auth/controllers/protectedController.js +0 -12
  166. package/v2examplle/v2_sqlite_auth/controllers/userController.js +0 -16
  167. package/v2examplle/v2_sqlite_auth/package.json +0 -27
  168. package/v2examplle/v2_sqlite_auth/routes.json +0 -30
  169. package/v2examplle/v2_sqlite_auth/test_api.sh +0 -47
  170. package/v2examplle/v2_sqlite_auth/tokens_example.sqlite +0 -0
@@ -1,81 +0,0 @@
1
- const {
2
- APIServer,
3
- Authenticator,
4
- RouteLoader,
5
- Logger,
6
- MariaDBTokenAdapter
7
- } = require('../../index.js');
8
-
9
- async function startServer() {
10
- // Crear instancia del servidor
11
- const server = new APIServer({
12
- port: 8090,
13
- host: 'localhost'
14
- });
15
-
16
- // Crear instancia del logger
17
- const logger = new Logger({ level: 'info' });
18
-
19
- try {
20
- // Crear instancia del adaptador de tokens MariaDB
21
- const tokenAdapter = new MariaDBTokenAdapter({
22
- host: 'localhost',
23
- user: 'root',
24
- password: '', // Dejar vacío si no hay contraseña para root
25
- database: 'token_db',
26
- tableName: 'mariadb_tokens'
27
- });
28
-
29
- // Inicializar el adaptador de tokens
30
- await tokenAdapter.initialize();
31
- logger.info('MariaDB Token Adapter inicializado correctamente');
32
-
33
- // Crear instancia del autenticador
34
- const authenticator = new Authenticator({ logger });
35
-
36
- // Registrar estrategia de autenticación JWT que utiliza el adaptador MariaDB
37
- authenticator.use('jwt-mariadb', async (req, options = {}) => {
38
- const authHeader = req.headers.authorization;
39
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
40
-
41
- if (!token) {
42
- return false;
43
- }
44
-
45
- // Validar el token contra la base de datos MariaDB
46
- const tokenRecord = await tokenAdapter.validateToken(token);
47
-
48
- if (tokenRecord) {
49
- // Agregar información del usuario a la solicitud
50
- req.user = {
51
- userId: tokenRecord.user_id,
52
- tokenType: tokenRecord.token_type,
53
- expiresAt: tokenRecord.expires_at
54
- };
55
- return true;
56
- }
57
-
58
- return false;
59
- });
60
-
61
- // Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
62
- server.authenticator = authenticator;
63
-
64
- // Cargar rutas desde archivo JSON
65
- const routeLoader = new RouteLoader();
66
- await routeLoader.loadRoutes(server, './routes.json');
67
-
68
- // Iniciar el servidor
69
- server.start();
70
-
71
- logger.info('Servidor iniciado en http://localhost:8090');
72
- } catch (error) {
73
- logger.error('Error iniciando el servidor:', error.message);
74
- process.exit(1);
75
- }
76
- }
77
-
78
- // Iniciar el servidor
79
- startServer();
80
-
81
- module.exports = { startServer };
@@ -1,95 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { MariaDBTokenAdapter } = require('../../../index.js');
3
-
4
- // Adaptador de tokens para este controlador
5
- const tokenAdapter = new MariaDBTokenAdapter({
6
- host: 'localhost',
7
- user: 'root',
8
- password: '',
9
- database: 'token_db',
10
- tableName: 'mariadb_tokens'
11
- });
12
-
13
- // Asegurarse de que el adaptador esté inicializado
14
- tokenAdapter.initialize().catch(console.error);
15
-
16
- const authController = {
17
- login: async (req, res) => {
18
- try {
19
- const { username, password } = req.body;
20
-
21
- // Validación simple de credenciales (esto debería ser más robusto en producción)
22
- if (!username || !password) {
23
- res.writeHead(400, { 'Content-Type': 'application/json' });
24
- res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
25
- return;
26
- }
27
-
28
- // Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
29
- if (username === 'admin' && password === 'password') {
30
- // Generar un token JWT
31
- const payload = {
32
- userId: 1,
33
- username: username,
34
- role: 'admin'
35
- };
36
-
37
- // Secret para firmar el token (en producción, debería estar en variables de entorno)
38
- const secret = 'super-secret-key-for-mariadb-example';
39
- const token = jwt.sign(payload, secret, { expiresIn: '1h' });
40
-
41
- // Guardar el token en la base de datos MariaDB
42
- await tokenAdapter.saveToken(
43
- token,
44
- { userId: 1 },
45
- 'access',
46
- new Date(Date.now() + 60 * 60 * 1000) // 1 hora
47
- );
48
-
49
- res.writeHead(200, { 'Content-Type': 'application/json' });
50
- res.end(JSON.stringify({
51
- message: 'Inicio de sesión exitoso',
52
- token: token,
53
- user: payload
54
- }));
55
- } else {
56
- res.writeHead(401, { 'Content-Type': 'application/json' });
57
- res.end(JSON.stringify({ error: 'Credenciales inválidas' }));
58
- }
59
- } catch (error) {
60
- console.error('Error en login:', error);
61
- res.writeHead(500, { 'Content-Type': 'application/json' });
62
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
63
- }
64
- },
65
-
66
- logout: async (req, res) => {
67
- try {
68
- const authHeader = req.headers.authorization;
69
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
70
-
71
- if (!token) {
72
- res.writeHead(400, { 'Content-Type': 'application/json' });
73
- res.end(JSON.stringify({ error: 'Token no proporcionado' }));
74
- return;
75
- }
76
-
77
- // Revocar el token en la base de datos MariaDB
78
- const revoked = await tokenAdapter.revokeToken(token);
79
-
80
- if (revoked) {
81
- res.writeHead(200, { 'Content-Type': 'application/json' });
82
- res.end(JSON.stringify({ message: 'Sesión cerrada exitosamente' }));
83
- } else {
84
- res.writeHead(400, { 'Content-Type': 'application/json' });
85
- res.end(JSON.stringify({ error: 'No se pudo revocar el token' }));
86
- }
87
- } catch (error) {
88
- console.error('Error en logout:', error);
89
- res.writeHead(500, { 'Content-Type': 'application/json' });
90
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
91
- }
92
- }
93
- };
94
-
95
- module.exports = authController;
@@ -1,31 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { MariaDBTokenAdapter } = require('../../../index.js');
3
-
4
- // Adaptador de tokens para este controlador
5
- const tokenAdapter = new MariaDBTokenAdapter({
6
- host: 'localhost',
7
- user: 'root',
8
- password: '',
9
- database: 'token_db',
10
- tableName: 'mariadb_tokens'
11
- });
12
-
13
- // Asegurarse de que el adaptador esté inicializado
14
- tokenAdapter.initialize().catch(console.error);
15
-
16
- const mainController = {
17
- home: (req, res) => {
18
- res.writeHead(200, { 'Content-Type': 'application/json' });
19
- res.end(JSON.stringify({
20
- message: 'Bienvenido a la API de ejemplo con autenticación MariaDB',
21
- endpoints: {
22
- 'POST /login': 'Iniciar sesión y obtener token',
23
- 'GET /protected': 'Contenido protegido (requiere token)',
24
- 'GET /profile': 'Perfil de usuario (requiere token)',
25
- 'POST /logout': 'Cerrar sesión y revocar token (requiere token)'
26
- }
27
- }));
28
- }
29
- };
30
-
31
- module.exports = mainController;
@@ -1,12 +0,0 @@
1
- const protectedController = {
2
- getProtectedData: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- message: 'Datos protegidos accesados exitosamente',
6
- user: req.user,
7
- timestamp: new Date().toISOString()
8
- }));
9
- }
10
- };
11
-
12
- module.exports = protectedController;
@@ -1,17 +0,0 @@
1
- const userController = {
2
- getProfile: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- profile: {
6
- id: req.user.userId,
7
- username: req.user.username || 'Usuario',
8
- role: req.user.role || 'guest',
9
- tokenType: req.user.tokenType,
10
- expiresAt: req.user.expiresAt
11
- },
12
- message: 'Perfil de usuario obtenido exitosamente'
13
- }));
14
- }
15
- };
16
-
17
- module.exports = userController;
@@ -1,27 +0,0 @@
1
- {
2
- "name": "jerk-mariadb-example",
3
- "version": "1.0.0",
4
- "description": "Ejemplo de API con autenticación MariaDB 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
- "authentication",
14
- "mariadb",
15
- "jwt",
16
- "framework"
17
- ],
18
- "author": "JERK Framework",
19
- "license": "Apache-2.0",
20
- "dependencies": {
21
- "jsonwebtoken": "^9.0.0",
22
- "mariadb": "^3.0.0"
23
- },
24
- "devDependencies": {
25
- "nodemon": "^3.0.0"
26
- }
27
- }
@@ -1,37 +0,0 @@
1
- [
2
- {
3
- "path": "/",
4
- "method": "GET",
5
- "controller": "./controllers/mainController.js",
6
- "handler": "home",
7
- "auth": "none"
8
- },
9
- {
10
- "path": "/login",
11
- "method": "POST",
12
- "controller": "./controllers/authController.js",
13
- "handler": "login",
14
- "auth": "none"
15
- },
16
- {
17
- "path": "/protected",
18
- "method": "GET",
19
- "controller": "./controllers/protectedController.js",
20
- "handler": "getProtectedData",
21
- "auth": "jwt-mariadb"
22
- },
23
- {
24
- "path": "/profile",
25
- "method": "GET",
26
- "controller": "./controllers/userController.js",
27
- "handler": "getProfile",
28
- "auth": "jwt-mariadb"
29
- },
30
- {
31
- "path": "/logout",
32
- "method": "POST",
33
- "controller": "./controllers/authController.js",
34
- "handler": "logout",
35
- "auth": "jwt-mariadb"
36
- }
37
- ]
@@ -1,72 +0,0 @@
1
- # Ejemplo API con Autenticación SQLite
2
-
3
- Este ejemplo demuestra cómo crear una API con autenticación basada en tokens almacenados en SQLite utilizando el Framework JERK.
4
-
5
- ## Características
6
-
7
- - Autenticación JWT con tokens almacenados en SQLite
8
- - Rutas protegidas y públicas
9
- - Sistema de login para obtener tokens
10
- - Controladores organizados por funcionalidad
11
-
12
- ## Configuración
13
-
14
- 1. Asegúrate de tener instaladas las dependencias del framework JERK
15
- 2. Instala sqlite3 si aún no está instalado: `npm install sqlite3`
16
-
17
- ## Uso
18
-
19
- 1. Inicia el servidor:
20
- ```bash
21
- node app.js
22
- ```
23
-
24
- 2. El servidor escuchará en `http://localhost:8088`
25
-
26
- ## Endpoints
27
-
28
- - `GET /` - Página de inicio (público)
29
- - `POST /login` - Iniciar sesión y obtener token (público)
30
- - `GET /protected` - Contenido protegido (requiere token)
31
- - `GET /profile` - Perfil de usuario (requiere token)
32
-
33
- ## Ejemplo de uso
34
-
35
- 1. Iniciar sesión:
36
- ```bash
37
- curl -X POST http://localhost:8088/login \
38
- -H "Content-Type: application/json" \
39
- -d '{"username": "admin", "password": "password"}'
40
- ```
41
-
42
- 2. Acceder a contenido protegido:
43
- ```bash
44
- curl -X GET http://localhost:8088/protected \
45
- -H "Authorization: Bearer TU_TOKEN_AQUI"
46
- ```
47
-
48
- 3. Ver perfil de usuario:
49
- ```bash
50
- curl -X GET http://localhost:8088/profile \
51
- -H "Authorization: Bearer TU_TOKEN_AQUI"
52
- ```
53
-
54
- ## Estructura del proyecto
55
-
56
- ```
57
- examples/v2/
58
- ├── app.js # Punto de entrada de la aplicación
59
- ├── routes.json # Definición de rutas
60
- ├── controllers/ # Controladores de las rutas
61
- │ ├── mainController.js
62
- │ ├── authController.js
63
- │ ├── protectedController.js
64
- │ └── userController.js
65
- └── tokens_example.sqlite # Base de datos SQLite para tokens (generada automáticamente)
66
- ```
67
-
68
- ## Seguridad
69
-
70
- - Los tokens se almacenan en una base de datos SQLite
71
- - Los tokens expiran después de 1 hora
72
- - Las rutas protegidas requieren un token válido en el header Authorization
@@ -1,74 +0,0 @@
1
- const {
2
- APIServer,
3
- Authenticator,
4
- RouteLoader,
5
- Logger,
6
- SQLiteTokenAdapter
7
- } = require('../../index.js');
8
-
9
- async function startServer() {
10
- // Crear instancia del servidor
11
- const server = new APIServer({
12
- port: 8088,
13
- host: 'localhost'
14
- });
15
-
16
- // Crear instancia del logger
17
- const logger = new Logger({ level: 'info' });
18
-
19
- try {
20
- // Crear instancia del adaptador de tokens SQLite
21
- const tokenAdapter = new SQLiteTokenAdapter({
22
- dbPath: './tokens_example.sqlite',
23
- tableName: 'example_tokens'
24
- });
25
-
26
- // Inicializar el adaptador de tokens
27
- await tokenAdapter.initialize();
28
- logger.info('SQLite Token Adapter inicializado correctamente');
29
-
30
- // Crear instancia del autenticador
31
- const authenticator = new Authenticator({ logger });
32
-
33
- // Registrar estrategia de autenticación JWT que utiliza el adaptador SQLite
34
- authenticator.use('jwt-sqlite', async (req, options = {}) => {
35
- const authHeader = req.headers.authorization;
36
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
37
-
38
- if (!token) {
39
- return false;
40
- }
41
-
42
- // Validar el token contra la base de datos SQLite
43
- const tokenRecord = await tokenAdapter.validateToken(token);
44
-
45
- if (tokenRecord) {
46
- // Agregar información del usuario a la solicitud
47
- req.user = { userId: tokenRecord.user_id, tokenType: tokenRecord.token_type };
48
- return true;
49
- }
50
-
51
- return false;
52
- });
53
-
54
- // Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
55
- server.authenticator = authenticator;
56
-
57
- // Cargar rutas desde archivo JSON
58
- const routeLoader = new RouteLoader();
59
- await routeLoader.loadRoutes(server, './routes.json');
60
-
61
- // Iniciar el servidor
62
- server.start();
63
-
64
- logger.info('Servidor iniciado en http://localhost:8088');
65
- } catch (error) {
66
- logger.error('Error iniciando el servidor:', error.message);
67
- process.exit(1);
68
- }
69
- }
70
-
71
- // Iniciar el servidor
72
- startServer();
73
-
74
- module.exports = { startServer };
@@ -1,74 +0,0 @@
1
- const {
2
- APIServer,
3
- Authenticator,
4
- RouteLoader,
5
- Logger,
6
- SQLiteTokenAdapter
7
- } = require('../../index.js');
8
-
9
- async function startServer() {
10
- // Crear instancia del servidor
11
- const server = new APIServer({
12
- port: 8088,
13
- host: 'localhost'
14
- });
15
-
16
- // Crear instancia del logger
17
- const logger = new Logger({ level: 'info' });
18
-
19
- try {
20
- // Crear instancia del adaptador de tokens SQLite
21
- const tokenAdapter = new SQLiteTokenAdapter({
22
- dbPath: './tokens_example.sqlite',
23
- tableName: 'example_tokens'
24
- });
25
-
26
- // Inicializar el adaptador de tokens
27
- await tokenAdapter.initialize();
28
- logger.info('SQLite Token Adapter inicializado correctamente');
29
-
30
- // Crear instancia del autenticador
31
- const authenticator = new Authenticator({ logger });
32
-
33
- // Registrar estrategia de autenticación JWT que utiliza el adaptador SQLite
34
- authenticator.use('jwt-sqlite', async (req, options = {}) => {
35
- const authHeader = req.headers.authorization;
36
- const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
37
-
38
- if (!token) {
39
- return false;
40
- }
41
-
42
- // Validar el token contra la base de datos SQLite
43
- const tokenRecord = await tokenAdapter.validateToken(token);
44
-
45
- if (tokenRecord) {
46
- // Agregar información del usuario a la solicitud
47
- req.user = { userId: tokenRecord.user_id, tokenType: tokenRecord.token_type };
48
- return true;
49
- }
50
-
51
- return false;
52
- });
53
-
54
- // Agregar el autenticador al servidor para que pueda ser usado por el RouteLoader
55
- server.authenticator = authenticator;
56
-
57
- // Cargar rutas desde archivo JSON
58
- const routeLoader = new RouteLoader();
59
- await routeLoader.loadRoutes(server, './routes.json');
60
-
61
- // Iniciar el servidor
62
- server.start();
63
-
64
- logger.info('Servidor iniciado en http://localhost:8088');
65
- } catch (error) {
66
- logger.error('Error iniciando el servidor:', error.message);
67
- process.exit(1);
68
- }
69
- }
70
-
71
- // Iniciar el servidor
72
- startServer();
73
-
74
- module.exports = { startServer };
@@ -1,64 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { SQLiteTokenAdapter } = require('../../../index.js');
3
-
4
- // Adaptador de tokens para este controlador
5
- const tokenAdapter = new SQLiteTokenAdapter({
6
- dbPath: './tokens_example.sqlite',
7
- tableName: 'example_tokens'
8
- });
9
-
10
- // Asegurarse de que el adaptador esté inicializado
11
- tokenAdapter.initialize().catch(console.error);
12
-
13
- const authController = {
14
- login: async (req, res) => {
15
- try {
16
- const { username, password } = req.body;
17
-
18
- // Validación simple de credenciales (esto debería ser más robusto en producción)
19
- if (!username || !password) {
20
- res.writeHead(400, { 'Content-Type': 'application/json' });
21
- res.end(JSON.stringify({ error: 'Nombre de usuario y contraseña requeridos' }));
22
- return;
23
- }
24
-
25
- // Simulación de autenticación (en una aplicación real, esto verificaría contra una base de datos)
26
- if (username === 'admin' && password === 'password') {
27
- // Generar un token JWT
28
- const payload = {
29
- userId: 1,
30
- username: username,
31
- role: 'admin'
32
- };
33
-
34
- // Secret para firmar el token (en producción, debería estar en variables de entorno)
35
- const secret = 'super-secret-key-for-example';
36
- const token = jwt.sign(payload, secret, { expiresIn: '1h' });
37
-
38
- // Guardar el token en la base de datos SQLite
39
- await tokenAdapter.saveToken(
40
- token,
41
- { userId: 1 },
42
- 'access',
43
- new Date(Date.now() + 60 * 60 * 1000) // 1 hora
44
- );
45
-
46
- res.writeHead(200, { 'Content-Type': 'application/json' });
47
- res.end(JSON.stringify({
48
- message: 'Inicio de sesión exitoso',
49
- token: token,
50
- user: payload
51
- }));
52
- } else {
53
- res.writeHead(401, { 'Content-Type': 'application/json' });
54
- res.end(JSON.stringify({ error: 'Credenciales inválidas' }));
55
- }
56
- } catch (error) {
57
- console.error('Error en login:', error);
58
- res.writeHead(500, { 'Content-Type': 'application/json' });
59
- res.end(JSON.stringify({ error: 'Error interno del servidor' }));
60
- }
61
- }
62
- };
63
-
64
- module.exports = authController;
@@ -1,24 +0,0 @@
1
- const jwt = require('jsonwebtoken');
2
- const { SQLiteTokenAdapter } = require('../../../index.js');
3
-
4
- // Adaptador de tokens para este controlador
5
- const tokenAdapter = new SQLiteTokenAdapter({
6
- dbPath: './tokens_example.sqlite',
7
- tableName: 'example_tokens'
8
- });
9
-
10
- const mainController = {
11
- home: (req, res) => {
12
- res.writeHead(200, { 'Content-Type': 'application/json' });
13
- res.end(JSON.stringify({
14
- message: 'Bienvenido a la API de ejemplo con autenticación SQLite',
15
- endpoints: {
16
- 'POST /login': 'Iniciar sesión y obtener token',
17
- 'GET /protected': 'Contenido protegido (requiere token)',
18
- 'GET /profile': 'Perfil de usuario (requiere token)'
19
- }
20
- }));
21
- }
22
- };
23
-
24
- module.exports = mainController;
@@ -1,12 +0,0 @@
1
- const protectedController = {
2
- getProtectedData: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- message: 'Datos protegidos accesados exitosamente',
6
- user: req.user,
7
- timestamp: new Date().toISOString()
8
- }));
9
- }
10
- };
11
-
12
- module.exports = protectedController;
@@ -1,16 +0,0 @@
1
- const userController = {
2
- getProfile: (req, res) => {
3
- res.writeHead(200, { 'Content-Type': 'application/json' });
4
- res.end(JSON.stringify({
5
- profile: {
6
- id: req.user.userId,
7
- username: req.user.username || 'Usuario',
8
- role: req.user.role || 'guest',
9
- tokenType: req.user.tokenType
10
- },
11
- message: 'Perfil de usuario obtenido exitosamente'
12
- }));
13
- }
14
- };
15
-
16
- module.exports = userController;
@@ -1,27 +0,0 @@
1
- {
2
- "name": "jerk-example-v2",
3
- "version": "1.0.0",
4
- "description": "Ejemplo de API con autenticación SQLite 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
- "authentication",
14
- "sqlite",
15
- "jwt",
16
- "framework"
17
- ],
18
- "author": "JERK Framework",
19
- "license": "Apache-2.0",
20
- "dependencies": {
21
- "jsonwebtoken": "^9.0.0",
22
- "sqlite3": "^5.1.6"
23
- },
24
- "devDependencies": {
25
- "nodemon": "^3.0.0"
26
- }
27
- }