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.
Files changed (39) hide show
  1. package/README.md +767 -134
  2. package/binding.gyp +30 -0
  3. package/build/binding.sln +6 -0
  4. package/build/eventlogasync.vcxproj +148 -0
  5. package/build/eventlogasync.vcxproj.filters +43 -0
  6. package/doc/ASYNC_STATUS.md +104 -0
  7. package/doc/COHERENCIA_APIS.md +154 -0
  8. package/doc/CORRECCION_NAPI.md +74 -0
  9. package/doc/CPU_EFFICIENCY_GUIDE.md +199 -0
  10. package/doc/PREBUILDS.md +180 -0
  11. package/doc/README_eventlogasync.md +134 -0
  12. package/doc/RESUMABLE_READER.md +250 -0
  13. package/doc/USAGE.md +527 -0
  14. package/index.js +206 -5
  15. package/native/eventlogasync.cc +687 -0
  16. package/package.json +33 -6
  17. package/prebuilds/metadata.json +24 -0
  18. package/prebuilds/win32-x64/eventlog.node +0 -0
  19. package/prebuilds/win32-x64/eventlogasync.node +0 -0
  20. package/prebuilds/win32-x64/meta.json +20 -0
  21. package/prebuilds/win32-x64/nwinread.node +0 -0
  22. package/scripts/generate-prebuilds-advanced.js +186 -0
  23. package/scripts/generate-prebuilds.js +86 -0
  24. package/scripts/prebuilds/win32-x64/meta.json +20 -0
  25. package/test/README.md +105 -0
  26. package/test/example_async.js +107 -0
  27. package/test/example_sync.js +76 -0
  28. package/test/test_beginning_mode.js +40 -0
  29. package/test/test_build_version.js +46 -0
  30. package/test/test_callback_simple.js +46 -0
  31. package/test/test_modes_comparison.js +74 -0
  32. package/test/test_watermark_realistic.js +75 -0
  33. package/test/test_watermark_specific.js +88 -0
  34. package/test/test_wrapper_vs_native.js +58 -0
  35. package/test/verify_sync_events.js +19 -0
  36. package/CHANGES.md +0 -120
  37. package/test.js +0 -34
  38. /package/{CONTRIBUTING.md → doc/CONTRIBUTING.md} +0 -0
  39. /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.