blackcoffee2 2.1.0 → 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/.env.example +67 -0
- package/CHANGELOG.md +167 -0
- package/README.md +1 -3
- package/config/database.json +11 -0
- package/controllers/admin/AuthController.js +2 -1
- package/core/ViewHelper.js +75 -0
- package/core/hotReload.js +1 -1
- package/data/blackcoffee_admin.db-shm +0 -0
- package/data/blackcoffee_admin.db-wal +0 -0
- package/includes/adminAuth.js +5 -3
- package/includes/sessions.js +1 -1
- package/otrack.tar.gz +0 -0
- package/package.json +4 -2
- package/programatically/initFlow.js +2 -2
- package/test-aplicacion.con-logisession/BlackCoffee.js +0 -226
- package/test-aplicacion.con-logisession/SSL_SETUP.md +0 -53
- package/test-aplicacion.con-logisession/certs/ca-certificate.pem +0 -32
- package/test-aplicacion.con-logisession/certs/ca-private-key.pem +0 -52
- package/test-aplicacion.con-logisession/certs/certificate-2048.pem +0 -22
- package/test-aplicacion.con-logisession/certs/certificate.pem +0 -32
- package/test-aplicacion.con-logisession/certs/private-key-2048.pem +0 -28
- package/test-aplicacion.con-logisession/certs/private-key.pem +0 -52
- package/test-aplicacion.con-logisession/config/iaQueueSetup.js +0 -84
- package/test-aplicacion.con-logisession/config/qwen-rules.json +0 -39
- package/test-aplicacion.con-logisession/controllers/analyticsController.js +0 -117
- package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +0 -142
- package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +0 -439
- package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +0 -223
- package/test-aplicacion.con-logisession/controllers/endpointController.js +0 -66
- package/test-aplicacion.con-logisession/controllers/example.js +0 -183
- package/test-aplicacion.con-logisession/controllers/iaQueueController.js +0 -367
- package/test-aplicacion.con-logisession/controllers/queueController.js +0 -206
- package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +0 -197
- package/test-aplicacion.con-logisession/controllers/test.js +0 -0
- package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +0 -78
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +0 -412
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +0 -437
- package/test-aplicacion.con-logisession/hooks/admin-hooks.js +0 -20
- package/test-aplicacion.con-logisession/hooks/general-hooks.js +0 -97
- package/test-aplicacion.con-logisession/hooks/queue-hooks.js +0 -64
- package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +0 -38
- package/test-aplicacion.con-logisession/hooks/security-hooks.js +0 -24
- package/test-aplicacion.con-logisession/insitu-admin-client/README.md +0 -69
- package/test-aplicacion.con-logisession/insitu-admin-client/package.json +0 -23
- package/test-aplicacion.con-logisession/insitu-admin-client.js +0 -257
- package/test-aplicacion.con-logisession/models/ExampleModel.js +0 -88
- package/test-aplicacion.con-logisession/models/QueueJobModel.js +0 -263
- package/test-aplicacion.con-logisession/models/TokenModel.js +0 -207
- package/test-aplicacion.con-logisession/models/auth/AuthModel.js +0 -66
- package/test-aplicacion.con-logisession/models/auth/UserModel.js +0 -189
- package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +0 -213
- package/test-aplicacion.con-logisession/models/tracking/EventModel.js +0 -366
- package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +0 -131
- package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +0 -360
- package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +0 -286
- package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +0 -207
- package/test-aplicacion.con-logisession/package-lock.json +0 -3313
- package/test-aplicacion.con-logisession/package.json +0 -32
- package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +0 -1339
- package/test-aplicacion.con-logisession/public/css/style.css +0 -64
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +0 -18
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +0 -16
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +0 -43
- package/test-aplicacion.con-logisession/public/images/logo.svg +0 -7
- package/test-aplicacion.con-logisession/public/js/main.js +0 -67
- package/test-aplicacion.con-logisession/routes/analytics-routes.json +0 -8
- package/test-aplicacion.con-logisession/routes/auth-routes.json +0 -98
- package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +0 -20
- package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +0 -16
- package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +0 -11
- package/test-aplicacion.con-logisession/routes/endpoints-routes.json +0 -8
- package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +0 -26
- package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +0 -20
- package/test-aplicacion.con-logisession/routes/queue-routes.json +0 -32
- package/test-aplicacion.con-logisession/routes/qwen-routes.json +0 -14
- package/test-aplicacion.con-logisession/routes/static-routes.json +0 -29
- package/test-aplicacion.con-logisession/routes/tracking-routes.json +0 -58
- package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +0 -51
- package/test-aplicacion.con-logisession/utils/dbAdapter.js +0 -88
- package/test-aplicacion.con-logisession/utils/qbWrapper.js +0 -4
- package/test-aplicacion.con-logisession/utils/queueProcessor.js +0 -305
- package/test-aplicacion.con-logisession/utils/qwenRulesService.js +0 -131
- package/test-aplicacion.con-logisession/utils/tokenHelper.js +0 -22
- package/test-aplicacion.con-logisession/views/auth/dashboard.html +0 -443
- package/test-aplicacion.con-logisession/views/auth/forgot-password.html +0 -200
- package/test-aplicacion.con-logisession/views/auth/login.html +0 -213
- package/test-aplicacion.con-logisession/views/auth/register.html +0 -294
- package/test-aplicacion.con-logisession/views/contact/form.html +0 -47
- package/test-aplicacion.con-logisession/views/products/index.html +0 -39
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Módulo de adaptador centralizado para la base de datos
|
|
3
|
-
* dbAdapter.js
|
|
4
|
-
*
|
|
5
|
-
* Proporciona una instancia singleton del adaptador MariaDB
|
|
6
|
-
* para ser utilizada por todos los modelos del sistema
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const { MariaDBAdapter } = require('insitu-js');
|
|
10
|
-
|
|
11
|
-
// Variable para almacenar la instancia única del adaptador
|
|
12
|
-
let sharedAdapterInstance = null;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Obtiene la instancia del adaptador de base de datos
|
|
16
|
-
* Si no existe una instancia activa, crea una nueva
|
|
17
|
-
* @returns {Object} - Instancia del adaptador de base de datos
|
|
18
|
-
*/
|
|
19
|
-
function getSharedAdapter() {
|
|
20
|
-
if (!sharedAdapterInstance) {
|
|
21
|
-
// Configuración de la conexión desde variables de entorno
|
|
22
|
-
const dbConfig = {
|
|
23
|
-
host: process.env.DB_HOST || 'localhost',
|
|
24
|
-
user: process.env.DB_USER || 'root',
|
|
25
|
-
password: process.env.DB_PASSWORD || '',
|
|
26
|
-
database: process.env.DB_NAME || 'BlackCoffee_db',
|
|
27
|
-
connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT) || 10,
|
|
28
|
-
acquireTimeout: 10000, // Reducido para evitar cuelgues
|
|
29
|
-
timeout: 10000, // Reducido para evitar cuelgues
|
|
30
|
-
// Opciones adicionales para mejorar la estabilidad
|
|
31
|
-
connectTimeout: 10000, // Reducido para evitar cuelgues
|
|
32
|
-
allowLocalInfiles: true,
|
|
33
|
-
initSql: 'SET SESSION sql_mode = "TRADITIONAL"',
|
|
34
|
-
extraFiles: [],
|
|
35
|
-
insertIdAsNumber: false,
|
|
36
|
-
bigIntAsNumber: false,
|
|
37
|
-
dateStrings: false
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// Crear una nueva instancia del adaptador MariaDB
|
|
41
|
-
sharedAdapterInstance = new MariaDBAdapter(dbConfig);
|
|
42
|
-
|
|
43
|
-
// Guardar la función original de query
|
|
44
|
-
const originalQuery = sharedAdapterInstance.query;
|
|
45
|
-
|
|
46
|
-
// Reemplazar el método query con uno que maneje la desconexión
|
|
47
|
-
sharedAdapterInstance.query = async function(query, params = []) {
|
|
48
|
-
try {
|
|
49
|
-
// Intentar la consulta directamente
|
|
50
|
-
return await originalQuery.call(this, query, params);
|
|
51
|
-
} catch (error) {
|
|
52
|
-
// Si hay un error de conexión, lanzar un error más específico
|
|
53
|
-
if (error.errno || error.code === 'ECONNREFUSED' ||
|
|
54
|
-
error.code === 'ENOTFOUND' || error.code === 'PROTOCOL_CONNECTION_LOST') {
|
|
55
|
-
console.error('[DB_ADAPTER] Error de conexión a la base de datos:', error.message);
|
|
56
|
-
throw new Error('No hay conexión disponible a la base de datos. Por favor, verifique que el servidor de base de datos esté activo.');
|
|
57
|
-
}
|
|
58
|
-
// Si es otro tipo de error, lanzarlo tal cual
|
|
59
|
-
throw error;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
console.log('[DB_ADAPTER] Adaptador centralizado creado exitosamente');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return sharedAdapterInstance;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Cierra la conexión del adaptador centralizado
|
|
71
|
-
*/
|
|
72
|
-
async function closeSharedAdapter() {
|
|
73
|
-
if (sharedAdapterInstance && sharedAdapterInstance.pool) {
|
|
74
|
-
try {
|
|
75
|
-
await sharedAdapterInstance.pool.end();
|
|
76
|
-
console.log('[DB_ADAPTER] Adaptador centralizado cerrado exitosamente');
|
|
77
|
-
sharedAdapterInstance = null;
|
|
78
|
-
} catch (error) {
|
|
79
|
-
console.error('[DB_ADAPTER] Error cerrando el adaptador centralizado:', error.message);
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
module.exports = {
|
|
86
|
-
getSharedAdapter,
|
|
87
|
-
closeSharedAdapter
|
|
88
|
-
};
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
const QueueJobModel = require('../models/QueueJobModel');
|
|
2
|
-
const { hooks } = require('insitu-js');
|
|
3
|
-
|
|
4
|
-
class QueueProcessor {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.jobModel = QueueJobModel;
|
|
7
|
-
this.isRunning = false;
|
|
8
|
-
this.processingDelay = 1000; // Milisegundos entre procesamientos
|
|
9
|
-
this.workers = new Map(); // Mapa de workers por cola
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Iniciar el procesador de colas
|
|
13
|
-
start() {
|
|
14
|
-
if (this.isRunning) {
|
|
15
|
-
console.log('El procesador de colas ya está en ejecución');
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Disparar hook antes de iniciar el procesador
|
|
20
|
-
hooks.doAction('queue_processor_started');
|
|
21
|
-
|
|
22
|
-
this.isRunning = true;
|
|
23
|
-
console.log('Iniciando procesador de colas...');
|
|
24
|
-
this.run();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Detener el procesador de colas
|
|
28
|
-
stop() {
|
|
29
|
-
// Disparar hook antes de detener el procesador
|
|
30
|
-
hooks.doAction('queue_processor_stopped');
|
|
31
|
-
|
|
32
|
-
this.isRunning = false;
|
|
33
|
-
console.log('Deteniendo procesador de colas...');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Ejecutar el bucle principal del procesador
|
|
37
|
-
async run() {
|
|
38
|
-
if (!this.isRunning) return;
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
// Disparar hook al comienzo de cada iteración del bucle principal
|
|
42
|
-
await hooks.doActionAsync('queue_processor_iteration_start');
|
|
43
|
-
|
|
44
|
-
// Filtrar las colas que se van a procesar
|
|
45
|
-
const queuesToProcess = await hooks.applyFiltersAsync('filter_queue_names_to_process', Array.from(this.jobModel.queues.keys()));
|
|
46
|
-
|
|
47
|
-
// Procesar trabajos de todas las colas
|
|
48
|
-
for (const queueName of queuesToProcess) {
|
|
49
|
-
await this.processQueue(queueName);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Disparar hook al final de cada iteración del bucle principal
|
|
53
|
-
await hooks.doActionAsync('queue_processor_iteration_end');
|
|
54
|
-
} catch (error) {
|
|
55
|
-
console.error('Error en el procesador de colas:', error);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Continuar ejecutando después de un delay
|
|
59
|
-
setTimeout(() => this.run(), this.processingDelay);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Procesar una cola específica
|
|
63
|
-
async processQueue(queueName) {
|
|
64
|
-
// Disparar hook antes de procesar una cola específica
|
|
65
|
-
await hooks.doActionAsync('queue_before_process_specific', queueName);
|
|
66
|
-
|
|
67
|
-
// Obtener el siguiente trabajo pendiente
|
|
68
|
-
const job = await this.jobModel.getNextPendingJob(queueName);
|
|
69
|
-
|
|
70
|
-
if (job) {
|
|
71
|
-
// Disparar hook antes de marcar como en proceso
|
|
72
|
-
await hooks.doActionAsync('queue_job_mark_processing_before', job);
|
|
73
|
-
|
|
74
|
-
// Marcar como en proceso
|
|
75
|
-
await this.jobModel.markJobAsProcessing(job.id);
|
|
76
|
-
|
|
77
|
-
// Disparar hook después de marcar como en proceso
|
|
78
|
-
await hooks.doActionAsync('queue_job_mark_processing_after', job);
|
|
79
|
-
|
|
80
|
-
// Ejecutar el trabajo
|
|
81
|
-
await this.executeJob(job);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Disparar hook después de procesar una cola específica
|
|
85
|
-
await hooks.doActionAsync('queue_after_process_specific', queueName);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Ejecutar un trabajo específico
|
|
89
|
-
async executeJob(job) {
|
|
90
|
-
try {
|
|
91
|
-
// Disparar hook antes de ejecutar un trabajo específico
|
|
92
|
-
await hooks.doActionAsync('queue_job_execute_start', job);
|
|
93
|
-
|
|
94
|
-
// Simular un delay para dar tiempo a otros procesos
|
|
95
|
-
await this.delay(100);
|
|
96
|
-
|
|
97
|
-
// Obtener el manejador de trabajo para esta cola
|
|
98
|
-
const handler = this.getHandlerForQueue(job.queue);
|
|
99
|
-
|
|
100
|
-
if (handler) {
|
|
101
|
-
// Filtrar el payload antes de ejecutarlo
|
|
102
|
-
const filteredPayload = await hooks.applyFiltersAsync('filter_job_payload_before_execution', job.payload, job);
|
|
103
|
-
|
|
104
|
-
// Ejecutar el manejador con los datos del trabajo
|
|
105
|
-
const result = await handler(filteredPayload);
|
|
106
|
-
|
|
107
|
-
// Filtrar el resultado antes de guardarlo
|
|
108
|
-
const filteredResult = await hooks.applyFiltersAsync('filter_job_result_before_save', result, job);
|
|
109
|
-
|
|
110
|
-
// Marcar como completado
|
|
111
|
-
await this.jobModel.markJobAsCompleted(job.id, filteredResult);
|
|
112
|
-
console.log(`Trabajo ${job.id} completado exitosamente`);
|
|
113
|
-
|
|
114
|
-
// Disparar hook después de completar un trabajo exitosamente
|
|
115
|
-
await hooks.doActionAsync('queue_job_execute_end', job, filteredResult, 'success');
|
|
116
|
-
} else {
|
|
117
|
-
// Si no hay manejador, marcar como fallido
|
|
118
|
-
const error = `No se encontró un manejador para la cola: ${job.queue}`;
|
|
119
|
-
await this.jobModel.markJobAsFailed(job.id, error);
|
|
120
|
-
console.error(error);
|
|
121
|
-
|
|
122
|
-
// Disparar hook después de completar un trabajo con error
|
|
123
|
-
await hooks.doActionAsync('queue_job_execute_end', job, error, 'failure');
|
|
124
|
-
}
|
|
125
|
-
} catch (error) {
|
|
126
|
-
// Disparar hook cuando ocurre un error durante la ejecución de un trabajo
|
|
127
|
-
await hooks.doActionAsync('queue_job_error_occurred', job, error);
|
|
128
|
-
|
|
129
|
-
// Manejar error en la ejecución del trabajo
|
|
130
|
-
console.error(`Error ejecutando el trabajo ${job.id}:`, error);
|
|
131
|
-
|
|
132
|
-
// Verificar si se debe reintentar
|
|
133
|
-
if (await this.jobModel.shouldRetryJob(job.id, error.message)) {
|
|
134
|
-
// Disparar hook antes de reintentar un trabajo
|
|
135
|
-
await hooks.doActionAsync('queue_job_retry', job, error);
|
|
136
|
-
|
|
137
|
-
// Si se debe reintentar, volver a poner en cola pendiente
|
|
138
|
-
const originalJob = this.jobModel.jobs.get(job.id);
|
|
139
|
-
if (originalJob) {
|
|
140
|
-
originalJob.status = 'pending';
|
|
141
|
-
originalJob.updated_at = new Date().toISOString();
|
|
142
|
-
|
|
143
|
-
// Añadir de nuevo a la cola
|
|
144
|
-
const queue = this.jobModel.queues.get(originalJob.queue);
|
|
145
|
-
if (queue) {
|
|
146
|
-
queue.push(originalJob);
|
|
147
|
-
|
|
148
|
-
// Reordenar la cola
|
|
149
|
-
queue.sort((a, b) => {
|
|
150
|
-
if (b.priority !== a.priority) {
|
|
151
|
-
return b.priority - a.priority;
|
|
152
|
-
}
|
|
153
|
-
return new Date(a.created_at) - new Date(b.created_at);
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
} else {
|
|
158
|
-
// Si no se debe reintentar, marcar como fallido permanentemente
|
|
159
|
-
await this.jobModel.markJobAsFailed(job.id, error.message);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Obtener el manejador de trabajo para una cola específica
|
|
165
|
-
getHandlerForQueue(queueName) {
|
|
166
|
-
// Disparar hook antes de seleccionar un manejador
|
|
167
|
-
hooks.doAction('queue_job_handler_selected_before', queueName);
|
|
168
|
-
|
|
169
|
-
// Manejadores predeterminados para colas comunes
|
|
170
|
-
const defaultHandlers = {
|
|
171
|
-
'default': this.defaultHandler.bind(this),
|
|
172
|
-
'analytics': this.analyticsHandler.bind(this),
|
|
173
|
-
'email': this.emailHandler.bind(this),
|
|
174
|
-
'notifications': this.notificationsHandler.bind(this),
|
|
175
|
-
'qwen': this.qwenHandler.bind(this)
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
// Obtener el manejador
|
|
179
|
-
const handler = defaultHandlers[queueName] || defaultHandlers['default'];
|
|
180
|
-
|
|
181
|
-
// Disparar hook después de seleccionar un manejador
|
|
182
|
-
hooks.doAction('queue_job_handler_selected', queueName, handler);
|
|
183
|
-
|
|
184
|
-
// Devolver el manejador específico o el predeterminado
|
|
185
|
-
return handler;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Manejador predeterminado
|
|
189
|
-
async defaultHandler(payload) {
|
|
190
|
-
console.log('Ejecutando trabajo predeterminado con payload:', payload);
|
|
191
|
-
// Simular trabajo
|
|
192
|
-
await this.delay(500);
|
|
193
|
-
return { success: true, message: 'Trabajo predeterminado completado', payload };
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Manejador para trabajos de analytics
|
|
197
|
-
async analyticsHandler(payload) {
|
|
198
|
-
console.log('Ejecutando trabajo de analytics con payload:', payload);
|
|
199
|
-
// Simular análisis de datos
|
|
200
|
-
await this.delay(1000);
|
|
201
|
-
return { success: true, message: 'Análisis completado', payload };
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Manejador para trabajos de correo electrónico
|
|
205
|
-
async emailHandler(payload) {
|
|
206
|
-
console.log('Ejecutando trabajo de email con payload:', payload);
|
|
207
|
-
// Simular envío de correo
|
|
208
|
-
await this.delay(800);
|
|
209
|
-
return { success: true, message: 'Correo enviado', payload };
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Manejador para trabajos de notificaciones
|
|
213
|
-
async notificationsHandler(payload) {
|
|
214
|
-
console.log('Ejecutando trabajo de notificaciones con payload:', payload);
|
|
215
|
-
// Simular envío de notificación
|
|
216
|
-
await this.delay(300);
|
|
217
|
-
return { success: true, message: 'Notificación enviada', payload };
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Manejador para trabajos de Qwen
|
|
221
|
-
async qwenHandler(payload) {
|
|
222
|
-
console.log('Ejecutando trabajo de Qwen con payload:', payload);
|
|
223
|
-
|
|
224
|
-
// Disparar hook antes de la verificación de seguridad
|
|
225
|
-
await hooks.doActionAsync('qwen_queue_before_security_check', payload);
|
|
226
|
-
|
|
227
|
-
try {
|
|
228
|
-
// Importar el servicio de reglas
|
|
229
|
-
const { qwenRulesService } = require('../utils/qwenRulesService');
|
|
230
|
-
|
|
231
|
-
// Verificar si el prompt original es seguro ANTES de aplicar reglas
|
|
232
|
-
if (!qwenRulesService.isPromptSafe(payload.prompt)) {
|
|
233
|
-
// Si el prompt es inseguro, lanzar un error específico que no se reintente
|
|
234
|
-
throw new Error('SECURITY_ERROR: El prompt contiene patrones no seguros según las reglas de seguridad');
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Disparar hook después de la verificación de seguridad
|
|
238
|
-
await hooks.doActionAsync('qwen_queue_after_security_check', payload);
|
|
239
|
-
|
|
240
|
-
// Aplicar reglas al prompt
|
|
241
|
-
const securedPrompt = qwenRulesService.applyRulesToPrompt(payload.prompt, payload.data);
|
|
242
|
-
|
|
243
|
-
// Disparar hook antes de ejecutar el comando Qwen
|
|
244
|
-
await hooks.doActionAsync('qwen_queue_before_command_execution', securedPrompt, payload);
|
|
245
|
-
|
|
246
|
-
// Importar exec aquí para evitar problemas de dependencias
|
|
247
|
-
const { exec } = require('child_process');
|
|
248
|
-
const util = require('util');
|
|
249
|
-
const execAsync = util.promisify(exec);
|
|
250
|
-
|
|
251
|
-
// Preparar el comando para Qwen con el prompt modificado
|
|
252
|
-
const dataString = JSON.stringify(payload.data).replace(/"/g, '\\"');
|
|
253
|
-
const qwenCommand = `qwen -p "${securedPrompt} ${dataString}"`;
|
|
254
|
-
|
|
255
|
-
// Ejecutar el comando de Qwen
|
|
256
|
-
const result = await execAsync(qwenCommand);
|
|
257
|
-
|
|
258
|
-
// Disparar hook después de ejecutar el comando Qwen
|
|
259
|
-
await hooks.doActionAsync('qwen_queue_after_command_execution', result, qwenCommand);
|
|
260
|
-
|
|
261
|
-
// Validar la respuesta según las reglas
|
|
262
|
-
const validatedResponse = qwenRulesService.validateResponse(result.stdout);
|
|
263
|
-
|
|
264
|
-
// Disparar hook después de validar la respuesta
|
|
265
|
-
await hooks.doActionAsync('qwen_queue_response_validated', validatedResponse, payload);
|
|
266
|
-
|
|
267
|
-
return {
|
|
268
|
-
success: true,
|
|
269
|
-
response: validatedResponse,
|
|
270
|
-
command: qwenCommand,
|
|
271
|
-
userId: payload.userId,
|
|
272
|
-
requestId: payload.requestId
|
|
273
|
-
};
|
|
274
|
-
} catch (error) {
|
|
275
|
-
console.error('Error executing Qwen command:', error);
|
|
276
|
-
throw new Error(`Qwen execution failed: ${error.message}`);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Método para registrar un manejador personalizado
|
|
281
|
-
registerHandler(queueName, handlerFunction) {
|
|
282
|
-
if (typeof handlerFunction !== 'function') {
|
|
283
|
-
throw new Error('El manejador debe ser una función');
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Disparar hook antes de registrar un manejador
|
|
287
|
-
hooks.doAction('queue_handler_registered_before', queueName, handlerFunction);
|
|
288
|
-
|
|
289
|
-
// Añadir el manejador al mapa de workers
|
|
290
|
-
this.workers.set(queueName, handlerFunction);
|
|
291
|
-
|
|
292
|
-
// Disparar hook después de registrar un manejador
|
|
293
|
-
hooks.doAction('queue_handler_registered', queueName, handlerFunction);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// Método de utilidad para crear un delay
|
|
297
|
-
delay(ms) {
|
|
298
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Instancia global del procesador de colas
|
|
303
|
-
const queueProcessor = new QueueProcessor();
|
|
304
|
-
|
|
305
|
-
module.exports = { QueueProcessor, queueProcessor };
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
class QwenRulesService {
|
|
5
|
-
constructor(configPath = './config/qwen-rules.json') {
|
|
6
|
-
// Construir la ruta absoluta desde la raíz del proyecto
|
|
7
|
-
this.configPath = path.join(__dirname, '..', 'config', 'qwen-rules.json');
|
|
8
|
-
this.rulesConfig = this.loadConfig();
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// Cargar la configuración de reglas
|
|
12
|
-
loadConfig() {
|
|
13
|
-
try {
|
|
14
|
-
const configData = fs.readFileSync(this.configPath, 'utf8');
|
|
15
|
-
return JSON.parse(configData);
|
|
16
|
-
} catch (error) {
|
|
17
|
-
console.error('Error loading Qwen rules configuration:', error.message);
|
|
18
|
-
// Devolver configuración por defecto si hay error
|
|
19
|
-
return {
|
|
20
|
-
qwenRules: {
|
|
21
|
-
restrictSystemInfo: true,
|
|
22
|
-
preventDataLeakage: true,
|
|
23
|
-
allowExternalContext: false,
|
|
24
|
-
maxResponseTokens: 2000,
|
|
25
|
-
prohibitedTopics: [
|
|
26
|
-
"sistema de archivos",
|
|
27
|
-
"estructura de directorios",
|
|
28
|
-
"archivos del sistema",
|
|
29
|
-
"información interna",
|
|
30
|
-
"código fuente del sistema",
|
|
31
|
-
"configuración interna"
|
|
32
|
-
],
|
|
33
|
-
customInstructions: [
|
|
34
|
-
"Solo responde sobre los datos que se te proporcionan explícitamente",
|
|
35
|
-
"No hagas suposiciones sobre la estructura interna del sistema",
|
|
36
|
-
"Si se te pregunta sobre archivos o estructura del sistema, redirige a los datos proporcionados"
|
|
37
|
-
]
|
|
38
|
-
},
|
|
39
|
-
queueSettings: {
|
|
40
|
-
defaultPriority: 0,
|
|
41
|
-
maxRetries: 3,
|
|
42
|
-
processingTimeout: 60000,
|
|
43
|
-
maxPayloadSize: 1048576
|
|
44
|
-
},
|
|
45
|
-
security: {
|
|
46
|
-
sanitizeInputs: true,
|
|
47
|
-
validateOutputs: true,
|
|
48
|
-
blockSuspiciousPatterns: true
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Aplicar reglas al prompt antes de enviarlo a Qwen
|
|
55
|
-
applyRulesToPrompt(prompt, data) {
|
|
56
|
-
const { qwenRules } = this.rulesConfig;
|
|
57
|
-
let enhancedPrompt = prompt;
|
|
58
|
-
|
|
59
|
-
// Añadir instrucciones personalizadas al principio del prompt
|
|
60
|
-
if (qwenRules.customInstructions && qwenRules.customInstructions.length > 0) {
|
|
61
|
-
const instructions = qwenRules.customInstructions.join('\n');
|
|
62
|
-
enhancedPrompt = `Instrucciones de seguridad:\n${instructions}\n\nPrompt original: ${enhancedPrompt}`;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Añadir restricciones si están habilitadas
|
|
66
|
-
if (qwenRules.restrictSystemInfo) {
|
|
67
|
-
enhancedPrompt += "\n\nImportante: No proporciones información sobre el sistema, archivos o estructura interna. Responde solo basándote en los datos proporcionados.";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return enhancedPrompt;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Validar la respuesta de Qwen según las reglas
|
|
74
|
-
validateResponse(response) {
|
|
75
|
-
const { qwenRules } = this.rulesConfig;
|
|
76
|
-
|
|
77
|
-
// Verificar si la respuesta contiene temas prohibidos
|
|
78
|
-
if (qwenRules.prohibitedTopics) {
|
|
79
|
-
for (const topic of qwenRules.prohibitedTopics) {
|
|
80
|
-
if (response.toLowerCase().includes(topic.toLowerCase())) {
|
|
81
|
-
throw new Error(`La respuesta contiene información prohibida sobre: ${topic}`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return response;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Verificar si un prompt es seguro para procesar
|
|
90
|
-
isPromptSafe(prompt) {
|
|
91
|
-
const { qwenRules } = this.rulesConfig;
|
|
92
|
-
|
|
93
|
-
if (!qwenRules || !qwenRules.preventDataLeakage) {
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Verificar si el prompt solicita información sensible
|
|
98
|
-
const unsafePatterns = [
|
|
99
|
-
/archivo.*sistema/i,
|
|
100
|
-
/estructura.*interna/i,
|
|
101
|
-
/configuraci.n.*interna/i,
|
|
102
|
-
/c.digo.*fuente/i,
|
|
103
|
-
/sistema.*archivo/i,
|
|
104
|
-
/directorio.*interno/i,
|
|
105
|
-
/informaci.n.*interna/i
|
|
106
|
-
];
|
|
107
|
-
|
|
108
|
-
for (const pattern of unsafePatterns) {
|
|
109
|
-
if (pattern.test(prompt)) {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Obtener configuración de cola
|
|
118
|
-
getQueueSettings() {
|
|
119
|
-
return this.rulesConfig.queueSettings || {};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Obtener configuración de seguridad
|
|
123
|
-
getSecuritySettings() {
|
|
124
|
-
return this.rulesConfig.security || {};
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Instancia global del servicio de reglas
|
|
129
|
-
const qwenRulesService = new QwenRulesService();
|
|
130
|
-
|
|
131
|
-
module.exports = { QwenRulesService, qwenRulesService };
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Helper para la validación de tokens en el framework JERK
|
|
3
|
-
* tokenHelper.js
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const TokenModel = require('../models/tracking/TokenModel');
|
|
7
|
-
|
|
8
|
-
// Instancia del modelo de tokens
|
|
9
|
-
const tokenModel = new TokenModel();
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Valida un token contra la base de datos
|
|
13
|
-
* @param {string} token - Token a validar
|
|
14
|
-
* @returns {Promise<boolean>} - True si el token es válido, false en caso contrario
|
|
15
|
-
*/
|
|
16
|
-
async function validateToken(token) {
|
|
17
|
-
return await tokenModel.validateToken(token);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
module.exports = {
|
|
21
|
-
validateToken
|
|
22
|
-
};
|