Client Plugins
Currently, user supplied plugins can only really serve as data sources, but adding something like a custom data view or even just a custom window in the client is relatively impossible
Here’s a rough sketch of what needs to be considered:
How does the plugin get to the client? The web components get compiled from the relatively readable vue code to mangled ES2017 javascript. They are also usually bundled into the application executable. For simple plugins, we could just upload a JS file which evaluates to a function which we can just run. This would also work with deployed instances, so if someone wrote a useful plugin, it would immediately be usable on every instance. We could also accept it as a class instance that derives from some sort of plugin superclass.
The Services Broker singleton is already available through the window variable, but what else would the plugin need? Probably it would be good to have access to some sort of UI prototyping mechanism, can we pass through the vue instance so plugins can use the templating support it brings?
What would we do with plugins that need to bundle ressources (images, data, templates, maybe AI models or whatever)? Could we say there’s just a folder called plugins and you can put subfolders there which can be accessed by the plugins? That would depend on the server again, but would probably be okay.
Lastly, is there any way that we could modify existing functionality through plugins? Say, add a new layer type, control the camera or rendering, modify the list of available colormaps? This would probably have to happen through accessor methods on the existing services.
More research needs to be done.