Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Context

Since  menu  type plugins are siblings in the DOMTree, it is not possible for menu  type plugins to communicate with each other. Next to the menu  type plugin, it is not possible to communicate from an editor  type plugin to another editor  type plugin or a menu  type plugin.


Info

Example use-case

An end-user selects 2 IED's in 1 plug-in. In order to make a connection between IED's, the user want to open the selection in an another plug.


Also, since Addons are not extending from a HTMLElement, Addons cannot subscribe to events on themselves.

HTML Events are only going up in the DOMTree, not down and/or to siblings.

Decision

# OpenSCD Core should make use of a central event-bus

Date: 2023-06-05

## Status

Open

...


If we want plugins for OpenSCD to be asynchronous accessible to each other, OpenSCD Core should make use of a central event-bus.
Instead of dispatching an event on the plugin itself, the plugin can dispatch an event on the central event-bus. HTML Events are only going up in the domtree, not down and/or to siblings.
We can solve this by creating a central event-bus that will be passed down to each plugin.This will take care of the current problems we're facing:


Addons 


```ts
export  class EventBus implements EventTarget {

...

    removeEventListener(type: string, callback: EventListenerOrEventListenerObject): void {
        if (this._eventListeners.has(type)) {
            this._eventListeners.set(type, this._eventListeners.get(type)!.filter((cb) =>  cb !== callback));
        }
    }

}
```

## Decision

T.B.D.

...


Alternatives


Find a (seperate solution) for all problems mentioned.

Pro's:


Con's




Consequences

Implementing a central event-bus means that current OSCD plugins need some refactoring to dispatch events to the event-bus instead of dispatching events on itself.