nwinread 1.1.1 → 1.2.0
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/README.md +767 -134
- package/binding.gyp +30 -0
- package/build/binding.sln +6 -0
- package/build/eventlogasync.vcxproj +148 -0
- package/build/eventlogasync.vcxproj.filters +43 -0
- package/doc/ASYNC_STATUS.md +104 -0
- package/doc/COHERENCIA_APIS.md +154 -0
- package/doc/CORRECCION_NAPI.md +74 -0
- package/doc/CPU_EFFICIENCY_GUIDE.md +199 -0
- package/doc/PREBUILDS.md +180 -0
- package/doc/README_eventlogasync.md +134 -0
- package/doc/RESUMABLE_READER.md +250 -0
- package/doc/USAGE.md +527 -0
- package/index.js +206 -5
- package/native/eventlogasync.cc +687 -0
- package/package.json +33 -6
- package/prebuilds/metadata.json +24 -0
- package/prebuilds/win32-x64/eventlog.node +0 -0
- package/prebuilds/win32-x64/eventlogasync.node +0 -0
- package/prebuilds/win32-x64/meta.json +20 -0
- package/prebuilds/win32-x64/nwinread.node +0 -0
- package/scripts/generate-prebuilds-advanced.js +186 -0
- package/scripts/generate-prebuilds.js +86 -0
- package/scripts/prebuilds/win32-x64/meta.json +20 -0
- package/test/README.md +105 -0
- package/test/example_async.js +107 -0
- package/test/example_sync.js +76 -0
- package/test/test_beginning_mode.js +40 -0
- package/test/test_build_version.js +46 -0
- package/test/test_callback_simple.js +46 -0
- package/test/test_modes_comparison.js +74 -0
- package/test/test_watermark_realistic.js +75 -0
- package/test/test_watermark_specific.js +88 -0
- package/test/test_wrapper_vs_native.js +58 -0
- package/test/verify_sync_events.js +19 -0
- package/CHANGES.md +0 -120
- package/test.js +0 -34
- /package/{CONTRIBUTING.md → doc/CONTRIBUTING.md} +0 -0
- /package/{NAPI-SETUP.md → doc/NAPI-SETUP.md} +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Resumable Event Reader - Sistema Resiliente
|
|
2
|
+
|
|
3
|
+
El **Resumable Event Reader** es una clase que implementa un sistema robusto de procesamiento de eventos de Windows que puede recuperarse automáticamente después de reinicios del proceso.
|
|
4
|
+
|
|
5
|
+
## ✨ Características
|
|
6
|
+
|
|
7
|
+
- 🔄 **Recuperación automática** después de reinicios
|
|
8
|
+
- 💾 **Persistencia de estado** en archivo JSON
|
|
9
|
+
- 🎯 **Procesamiento sin pérdidas** usando patrón híbrido sync/async
|
|
10
|
+
- 📊 **Estadísticas** de procesamiento en tiempo real
|
|
11
|
+
- 🛡️ **Manejo de errores** robusto
|
|
12
|
+
|
|
13
|
+
## 🚀 Uso Rápido
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
const ResumableEventReader = require('./lib/ResumableEventReader');
|
|
17
|
+
|
|
18
|
+
const reader = new ResumableEventReader('Application', {
|
|
19
|
+
onEvent: (event) => {
|
|
20
|
+
console.log(`Evento: ${event.recordId} [${event.source}]`);
|
|
21
|
+
// Tu lógica de procesamiento aquí
|
|
22
|
+
},
|
|
23
|
+
onError: (error) => {
|
|
24
|
+
console.error(`Error: ${error.message}`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
reader.start();
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 📋 Opciones de Configuración
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
const options = {
|
|
35
|
+
// Filtro opcional por Event IDs
|
|
36
|
+
eventIds: [1000, 1001, 1002],
|
|
37
|
+
|
|
38
|
+
// Archivo donde guardar el estado (default: channel_state.json)
|
|
39
|
+
stateFile: './mi_estado.json',
|
|
40
|
+
|
|
41
|
+
// Tamaño de lote para recuperación (default: 100)
|
|
42
|
+
catchUpBatchSize: 50,
|
|
43
|
+
|
|
44
|
+
// Callback para cada evento procesado
|
|
45
|
+
onEvent: (event) => {
|
|
46
|
+
// event.recordId - ID del evento
|
|
47
|
+
// event.xml - XML completo del evento
|
|
48
|
+
// event.source - 'CATCH_UP' o 'LIVE'
|
|
49
|
+
// event.processingInfo.totalProcessed - Total eventos procesados
|
|
50
|
+
// event.processingInfo.lastRecordId - Último ID procesado
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
// Callback para errores
|
|
54
|
+
onError: (error) => {
|
|
55
|
+
console.error(error);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 🔄 Flujo de Funcionamiento
|
|
61
|
+
|
|
62
|
+
### 1. Primera Ejecución
|
|
63
|
+
```
|
|
64
|
+
🆕 Inicialización
|
|
65
|
+
↓
|
|
66
|
+
📍 Obtener último Record ID del log
|
|
67
|
+
↓
|
|
68
|
+
📡 Suscripción a eventos futuros
|
|
69
|
+
↓
|
|
70
|
+
💾 Guardar estado
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. Ejecuciones Posteriores (Recuperación)
|
|
74
|
+
```
|
|
75
|
+
📂 Cargar estado desde archivo
|
|
76
|
+
↓
|
|
77
|
+
🔄 Catch-up: Leer eventos perdidos (SYNC)
|
|
78
|
+
↓
|
|
79
|
+
📡 Suscripción a eventos futuros (ASYNC)
|
|
80
|
+
↓
|
|
81
|
+
💾 Guardar estado continuamente
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 📊 Métodos
|
|
85
|
+
|
|
86
|
+
### `start()`
|
|
87
|
+
Inicia el reader. Se encarga automáticamente de:
|
|
88
|
+
- Cargar estado persistido
|
|
89
|
+
- Ejecutar catch-up si es necesario
|
|
90
|
+
- Iniciar suscripción en vivo
|
|
91
|
+
|
|
92
|
+
### `stop()`
|
|
93
|
+
Detiene el reader gracefully:
|
|
94
|
+
- Cancela suscripción activa
|
|
95
|
+
- Guarda estado final
|
|
96
|
+
- Marca como no-running
|
|
97
|
+
|
|
98
|
+
### `getStats()`
|
|
99
|
+
Retorna estadísticas actuales:
|
|
100
|
+
```javascript
|
|
101
|
+
{
|
|
102
|
+
channel: "Application",
|
|
103
|
+
lastRecordId: 12345,
|
|
104
|
+
totalEventsProcessed: 150,
|
|
105
|
+
isRunning: true,
|
|
106
|
+
hasSubscription: true,
|
|
107
|
+
stateFile: "./estado.json"
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### `reset()`
|
|
112
|
+
Resetea el estado (solo para testing):
|
|
113
|
+
- Borra archivo de estado
|
|
114
|
+
- Reinicia contadores
|
|
115
|
+
|
|
116
|
+
## 💾 Formato del Archivo de Estado
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"lastRecordId": 123456,
|
|
121
|
+
"isRunning": false,
|
|
122
|
+
"totalEventsProcessed": 1500
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 🎯 Casos de Uso
|
|
127
|
+
|
|
128
|
+
### Monitoreo de Aplicaciones 24/7
|
|
129
|
+
```javascript
|
|
130
|
+
const appMonitor = new ResumableEventReader('Application', {
|
|
131
|
+
eventIds: [1000, 1001, 1002], // Solo errores críticos
|
|
132
|
+
onEvent: (event) => {
|
|
133
|
+
if (event.xml.includes('Error')) {
|
|
134
|
+
sendAlert(event);
|
|
135
|
+
}
|
|
136
|
+
logToDatabase(event);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
appMonitor.start();
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Auditoría de Seguridad
|
|
144
|
+
```javascript
|
|
145
|
+
const securityAuditor = new ResumableEventReader('Security', {
|
|
146
|
+
eventIds: [4624, 4625, 4634], // Logins/logouts
|
|
147
|
+
stateFile: './security_audit_state.json',
|
|
148
|
+
onEvent: (event) => {
|
|
149
|
+
analyzeSecurityEvent(event);
|
|
150
|
+
updateComplianceReport(event);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Integración con Sistemas Externos
|
|
156
|
+
```javascript
|
|
157
|
+
const systemIntegrator = new ResumableEventReader('System', {
|
|
158
|
+
catchUpBatchSize: 200,
|
|
159
|
+
onEvent: async (event) => {
|
|
160
|
+
// Enviar eventos a SIEM, Elasticsearch, etc.
|
|
161
|
+
await sendToExternalSystem(event);
|
|
162
|
+
},
|
|
163
|
+
onError: (error) => {
|
|
164
|
+
// Implementar retry logic
|
|
165
|
+
scheduleRetry(error);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 🛡️ Manejo de Errores y Reintentos
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
const reader = new ResumableEventReader('Application', {
|
|
174
|
+
onEvent: (event) => {
|
|
175
|
+
try {
|
|
176
|
+
processEvent(event);
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.error(`Error procesando evento ${event.recordId}:`, error);
|
|
179
|
+
// El estado aún se actualiza - el evento no se reprocesará
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
onError: (error) => {
|
|
184
|
+
console.error('Error del reader:', error);
|
|
185
|
+
|
|
186
|
+
// Implementar lógica de reconexión
|
|
187
|
+
setTimeout(() => {
|
|
188
|
+
reader.start(); // Reintentar
|
|
189
|
+
}, 5000);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## ⚠️ Consideraciones Importantes
|
|
195
|
+
|
|
196
|
+
### Permisos
|
|
197
|
+
- **System, Application**: No requieren privilegios especiales
|
|
198
|
+
- **Security**: Requiere ejecutar como Administrador
|
|
199
|
+
|
|
200
|
+
### Rendimiento
|
|
201
|
+
- Los catch-ups grandes pueden tomar tiempo
|
|
202
|
+
- Ajusta `catchUpBatchSize` según tus necesidades
|
|
203
|
+
- El estado se guarda cada 10 eventos para optimizar I/O
|
|
204
|
+
|
|
205
|
+
### Tolerancia a Fallos
|
|
206
|
+
- Si el archivo de estado se corrompe, el reader reinicia desde cero
|
|
207
|
+
- Los eventos duplicados se filtran automáticamente por Record ID
|
|
208
|
+
- Las suscripciones se reestablecen automáticamente en caso de error
|
|
209
|
+
|
|
210
|
+
## 🧪 Testing
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# Ejemplo básico
|
|
214
|
+
npm run example:resumable
|
|
215
|
+
|
|
216
|
+
# Test de recuperación (simula reinicio)
|
|
217
|
+
npm run test:recovery
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 📈 Monitoreo
|
|
221
|
+
|
|
222
|
+
Para monitorear la salud del reader:
|
|
223
|
+
|
|
224
|
+
```javascript
|
|
225
|
+
setInterval(() => {
|
|
226
|
+
const stats = reader.getStats();
|
|
227
|
+
console.log(`Eventos procesados: ${stats.totalEventsProcessed}`);
|
|
228
|
+
console.log(`Último Record ID: ${stats.lastRecordId}`);
|
|
229
|
+
console.log(`Running: ${stats.isRunning}`);
|
|
230
|
+
}, 60000); // Cada minuto
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## 🔧 Troubleshooting
|
|
234
|
+
|
|
235
|
+
### "No events received"
|
|
236
|
+
- Verifica permisos del canal
|
|
237
|
+
- Confirma que hay actividad en el log
|
|
238
|
+
- Revisa que el canal existe
|
|
239
|
+
|
|
240
|
+
### "State file corruption"
|
|
241
|
+
- El archivo se regenera automáticamente
|
|
242
|
+
- Pérdida del progreso - reinicia desde cero
|
|
243
|
+
|
|
244
|
+
### "High memory usage"
|
|
245
|
+
- Reduce `catchUpBatchSize`
|
|
246
|
+
- Implementa procesamiento asíncrono eficiente
|
|
247
|
+
|
|
248
|
+
## 🎉 Conclusión
|
|
249
|
+
|
|
250
|
+
El Resumable Event Reader proporciona una solución robusta para el procesamiento continuo de eventos de Windows con capacidades de recuperación automática, ideal para sistemas de producción que requieren alta disponibilidad y no pueden permitirse pérdida de eventos.
|