11import { EventInterface } from './Event.js' ;
22import { EventListener } from './EventListener.js' ;
3- import { EventListenerIdentifier , getEventListenerIdentifiersFromEventIdentifier } from './EventListenerIdentifier.js' ;
4- import { LoggerInterface } from './Logger.js' ;
3+ import { EventListenerIdentifier } from './EventListenerIdentifier.js' ;
54
65interface EventDispatcherInterface {
76 dispatchEvent ( event : EventInterface ) : Promise < void > ;
@@ -11,114 +10,4 @@ interface EventDispatcherInterface {
1110 hasListeners ( eventListenerIdentifier : EventListenerIdentifier ) : boolean ;
1211}
1312
14- type EventDispatcherEntry = {
15- priority : number ;
16- eventListener : EventListener ;
17- } ;
18-
19- class EventDispatcher implements EventDispatcherInterface {
20- private readonly entries : Map < string , EventDispatcherEntry [ ] > = new Map ( ) ;
21- private logger : LoggerInterface ;
22-
23- public constructor ( logger : LoggerInterface ) {
24- this . logger = logger ;
25- }
26-
27- async dispatchEvent ( event : EventInterface ) : Promise < void > {
28- this . logger . debug ( `Dispatching event of identifier ${ event . getIdentifier ( ) } .` , { event : event } ) ;
29- if ( event . isPropagationStopped ( ) ) {
30- this . logger . debug ( `Stopped event propagation because it is already stopped.` , { event : event } ) ;
31- return undefined ;
32- }
33- const eventListenerIdentifiersToNotify = getEventListenerIdentifiersFromEventIdentifier ( event . getIdentifier ( ) ) ;
34- for ( let i = 0 ; i < eventListenerIdentifiersToNotify . length ; ++ i ) {
35- const eventListenerIdentifier = eventListenerIdentifiersToNotify [ i ] ;
36- const eventListeners = this . entries . get ( eventListenerIdentifier ) ;
37- if ( eventListeners === undefined ) {
38- continue ;
39- }
40- this . logger . debug ( `Iterating over resolved event listeners of identifier ${ eventListenerIdentifier } ` , {
41- event : event ,
42- } ) ;
43- for ( let j = eventListeners . length - 1 ; j >= 0 ; j -- ) {
44- try {
45- await Promise . resolve ( eventListeners [ j ] . eventListener ( event ) ) ;
46- } catch ( e : unknown ) {
47- this . logger . error ( `Event handler threw exception, dispatcher continues with next event listener.` , {
48- event : event ,
49- error : e ,
50- } ) ;
51- }
52- if ( event . isPropagationStopped ( ) ) {
53- this . logger . debug ( `Stopped event propagation as it got stopped.` , { event : event } ) ;
54- return undefined ;
55- }
56- }
57- }
58- this . logger . debug ( `Event got handled by all event listeners.` , { event : event } ) ;
59- return undefined ;
60- }
61-
62- addListener ( eventListenerIdentifier : EventListenerIdentifier , eventListener : EventListener , priority ?: number ) : this {
63- if ( priority === undefined ) {
64- priority = 0 ;
65- }
66-
67- let eventListenersList : EventDispatcherEntry [ ] ;
68- if ( ! this . entries . has ( eventListenerIdentifier ) ) {
69- eventListenersList = [ ] ;
70- } else {
71- eventListenersList = this . entries . get ( eventListenerIdentifier ) ! ;
72- }
73-
74- // find correct index in list to add entry to
75- let left = 0 ;
76- let right = eventListenersList . length - 1 ;
77- let result = - 1 ;
78-
79- while ( left <= right ) {
80- const mid = Math . floor ( ( left + right ) / 2 ) ;
81-
82- if ( eventListenersList [ mid ] . priority >= priority ) {
83- result = mid ; // Found a candidate, but keep searching in the left half
84- right = mid - 1 ;
85- } else {
86- left = mid + 1 ; // Search in the right half
87- }
88- }
89-
90- const insertAt = result === - 1 ? left : result ;
91-
92- eventListenersList . splice ( insertAt , 0 , { priority : priority , eventListener : eventListener } ) ;
93- this . entries . set ( eventListenerIdentifier , eventListenersList ) ;
94- return this ;
95- }
96-
97- removeListener ( eventListenerIdentifier : EventListenerIdentifier , eventListener : EventListener ) : this {
98- const eventListenersList = this . entries . get ( eventListenerIdentifier ) ;
99- if ( ! eventListenersList ) {
100- return this ;
101- }
102- for ( let i = 0 ; i < eventListenersList . length ; ++ i ) {
103- if ( eventListenersList [ i ] . eventListener === eventListener ) {
104- eventListenersList . splice ( i , 1 ) ;
105- break ;
106- }
107- }
108- if ( eventListenersList . length === 0 ) {
109- this . entries . delete ( eventListenerIdentifier ) ;
110- }
111- return this ;
112- }
113-
114- getListeners ( eventListenerIdentifier : EventListenerIdentifier ) : EventListener [ ] {
115- const entries = this . entries . get ( eventListenerIdentifier ) ;
116- return entries ? entries . map ( ( entry ) => entry . eventListener ) : [ ] ;
117- }
118-
119- hasListeners ( eventListenerIdentifier : EventListenerIdentifier ) : boolean {
120- return this . entries . has ( eventListenerIdentifier ) ;
121- }
122- }
123-
124- export { EventDispatcherInterface , EventDispatcher } ;
13+ export { EventDispatcherInterface } ;
0 commit comments