...
Plug-ins communicating between themselves are not solved by this solution.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
```ts export class EventBus implements EventTarget { private _eventListeners: Map<string, EventListenerOrEventListenerObject[]>; constructor() { this._eventListeners = new Map<string, EventListenerOrEventListenerObject[]>(); } addEventListener(type: string, callback: EventListenerOrEventListenerObject): void { if (!this._eventListeners.has(type)) { this._eventListeners.set(type, []); } this._eventListeners.get(type)!.push(callback); } dispatchEvent(event: Event): boolean { if (this._eventListeners.has(event.type)) { this._eventListeners .get(event.type) !.forEach((cb) => typeof cb === 'function' ? cb(event) : cb.handleEvent(event) ); return true; } return false; } removeEventListener(type: string, callback: EventListenerOrEventListenerObject): void { if (this._eventListeners.has(type)) { this._eventListeners.set(type, this._eventListeners.get(type)!.filter((cb) => cb !== callback)); } } } ``` |
Alternatives
Instead of the central EventBus, we can let plugins dispatch events on the plugin itself. If a plugin needs an event from another plugin, It can listen to an event being dispatched to Open-SCD Core
.
...