diff --git a/.gitignore b/.gitignore index c940295..ef18b05 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ readur_uploads/ readur_watch/ test-results/ uploads/ +.claude/settings.local.json diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9657331..8cc9ed7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -18,6 +18,7 @@ "@types/uuid": "^10.0.0", "axios": "^1.3.0", "date-fns": "^4.1.0", + "eventemitter3": "^5.0.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-dropzone": "^14.2.3", @@ -2785,6 +2786,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/fdir": { "version": "6.4.6", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", diff --git a/frontend/package.json b/frontend/package.json index abea323..981692d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,6 +29,7 @@ "@types/uuid": "^10.0.0", "axios": "^1.3.0", "date-fns": "^4.1.0", + "eventemitter3": "^5.0.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-dropzone": "^14.2.3", diff --git a/frontend/src/services/syncProgress/SyncProgressManager.ts b/frontend/src/services/syncProgress/SyncProgressManager.ts index 51edcc2..cd094cf 100644 --- a/frontend/src/services/syncProgress/SyncProgressManager.ts +++ b/frontend/src/services/syncProgress/SyncProgressManager.ts @@ -1,4 +1,4 @@ -import { EventEmitter } from 'events'; +import { EventEmitter } from 'eventemitter3'; import { SyncProgressInfo } from '../api'; export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error' | 'failed'; @@ -21,7 +21,7 @@ export interface SyncProgressEvents { * Provides a clean interface for components to consume sync progress data * without being coupled to WebSocket implementation details */ -export abstract class SyncProgressManager extends EventEmitter { +export abstract class SyncProgressManager extends EventEmitter { protected state: SyncProgressState = { progressInfo: null, connectionStatus: 'disconnected', @@ -30,7 +30,7 @@ export abstract class SyncProgressManager extends EventEmitter { constructor() { super(); - this.setMaxListeners(20); // Prevent memory leak warnings + // EventEmitter3 doesn't have setMaxListeners, but it handles listeners efficiently } /**