feat(client): start to use a better eventemitter

This commit is contained in:
perfectra1n 2025-07-30 20:30:04 -07:00
parent 0fbb106668
commit 08a195edd5
4 changed files with 12 additions and 3 deletions

1
.gitignore vendored
View File

@ -9,3 +9,4 @@ readur_uploads/
readur_watch/ readur_watch/
test-results/ test-results/
uploads/ uploads/
.claude/settings.local.json

View File

@ -18,6 +18,7 @@
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"axios": "^1.3.0", "axios": "^1.3.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"eventemitter3": "^5.0.1",
"react": "^19.0.0", "react": "^19.0.0",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-dropzone": "^14.2.3", "react-dropzone": "^14.2.3",
@ -2785,6 +2786,12 @@
"url": "https://github.com/sponsors/sindresorhus" "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": { "node_modules/fdir": {
"version": "6.4.6", "version": "6.4.6",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",

View File

@ -29,6 +29,7 @@
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"axios": "^1.3.0", "axios": "^1.3.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"eventemitter3": "^5.0.1",
"react": "^19.0.0", "react": "^19.0.0",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-dropzone": "^14.2.3", "react-dropzone": "^14.2.3",

View File

@ -1,4 +1,4 @@
import { EventEmitter } from 'events'; import { EventEmitter } from 'eventemitter3';
import { SyncProgressInfo } from '../api'; import { SyncProgressInfo } from '../api';
export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error' | 'failed'; 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 * Provides a clean interface for components to consume sync progress data
* without being coupled to WebSocket implementation details * without being coupled to WebSocket implementation details
*/ */
export abstract class SyncProgressManager extends EventEmitter { export abstract class SyncProgressManager extends EventEmitter<keyof SyncProgressEvents> {
protected state: SyncProgressState = { protected state: SyncProgressState = {
progressInfo: null, progressInfo: null,
connectionStatus: 'disconnected', connectionStatus: 'disconnected',
@ -30,7 +30,7 @@ export abstract class SyncProgressManager extends EventEmitter {
constructor() { constructor() {
super(); super();
this.setMaxListeners(20); // Prevent memory leak warnings // EventEmitter3 doesn't have setMaxListeners, but it handles listeners efficiently
} }
/** /**