-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement event listener priority queue for optimized event handling (#…
…45) * feat: performance metrics * removed temp benchmark * Implement event listener priority queue for optimized event handling (#44) * refactor: Implement event listener priority queue for optimized event handling * refactor: Implement event listener priority queue for optimized event handling * refactor: improved test for complex scenario * removed temp benchmark * version and deps * refactor: Implement event listener priority queue for optimized event handling
- Loading branch information
1 parent
1f9c185
commit 5c0f0e0
Showing
6 changed files
with
196 additions
and
129 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
const Emitter = require('../dist/core/Emitter').default; | ||
|
||
const userEmitter = new Emitter(); | ||
|
||
// High-priority listener for userLoggedIn | ||
userEmitter.subscribe('userLoggedIn', (username) => { | ||
console.log(`[High Priority] ${username} logged in`); | ||
}, 100); | ||
|
||
// Medium-priority listener for userLoggedIn | ||
userEmitter.subscribe('userLoggedIn', (username) => { | ||
for (let i = 0; i < 1000; i++) {} // Simulate processing delay | ||
console.log(`[Medium Priority] Welcome message sent to ${username}`); | ||
}, 50); | ||
|
||
// Low-priority listener for userLoggedIn | ||
userEmitter.subscribe('userLoggedIn', (username) => { | ||
for (let i = 0; i < 10000; i++) {} // Simulate heavier task | ||
console.log(`[Low Priority] Analytics updated for ${username}`); | ||
}, 10); | ||
|
||
// Additional listeners for systemCheck and dataUpdate | ||
userEmitter.subscribe('systemCheck', (message) => { | ||
console.log(`[System Check] ${message}`); | ||
}); | ||
|
||
userEmitter.subscribe('dataUpdate', (message) => { | ||
console.log(`[Data Update] ${message}`); | ||
}); | ||
|
||
console.time('emitLoop'); | ||
|
||
// Emitting a mix of events | ||
for (let i = 0; i < 1000000; i++) { | ||
userEmitter.emit('userLoggedIn', `User${i}`); | ||
if (i % 100 === 0) { | ||
userEmitter.emit('systemCheck', `System Check at ${i}`); | ||
userEmitter.emit('dataUpdate', `Data Update at ${i}`); | ||
} | ||
} | ||
|
||
console.timeEnd('emitLoop'); | ||
|
||
module.exports = Emitter; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
import { Listener } from "../types"; | ||
|
||
export default class PriorityQueue<T extends (...args: any[]) => any> { | ||
private items: Array<Listener<T>> = []; | ||
|
||
enqueue(listener: Listener<T>): void { | ||
let index = this.items.findIndex(item => item.priority < listener.priority); | ||
index = index === -1 ? this.items.length : index; | ||
this.items.splice(index, 0, listener); | ||
} | ||
|
||
getListeners(): Array<Listener<T>> { | ||
return [...this.items]; | ||
} | ||
|
||
remove(listenerToRemove: Listener<T>): void { | ||
const index = this.items.findIndex(listener => | ||
listener.callback === listenerToRemove.callback && | ||
listener.priority === listenerToRemove.priority | ||
); | ||
|
||
if (index !== -1) { | ||
this.items.splice(index, 1); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,4 @@ | ||
import { Callback } from "./Callback"; | ||
|
||
export type Listener<T extends Callback<any[]>> = { | ||
export type Listener<T> = { | ||
callback: T; | ||
priority: number; | ||
}; |
Oops, something went wrong.