|
<config lang="json"> |
|
{ |
|
"name": "SharedWebPython", |
|
"type": "web-python", |
|
"version": "0.1.1", |
|
"api_version": "0.1.2", |
|
"description": "Sunning plugins in a shared web-python worker", |
|
"tags": [], |
|
"ui": "", |
|
"inputs": null, |
|
"outputs": null, |
|
"flags": ["engine"], |
|
"icon": "extension", |
|
"env": [], |
|
"requirements": [], |
|
"dependencies": [], |
|
"runnable": false |
|
} |
|
</config> |
|
|
|
<script lang="python"> |
|
from imjoy import api |
|
import sys |
|
from types import ModuleType |
|
import asyncio |
|
import micropip |
|
|
|
def wrap_promise(promise): |
|
loop = asyncio.get_event_loop() |
|
fut = loop.create_future() |
|
promise.then(fut.set_result).catch(fut.set_exception) |
|
return fut |
|
|
|
async def start_plugin(config, imjoy_interface, engine_utils): |
|
script = config["scripts"][0] |
|
content = script["content"] |
|
lang = script["attrs"]["lang"] |
|
assert lang == 'python', "lang must be python" |
|
loop = asyncio.get_event_loop() |
|
fut = loop.create_future() |
|
|
|
def export(api, config=None): |
|
fut.set_result(api) |
|
imjoy_interface["export"] = export |
|
|
|
# make a imjoy module for the plugin |
|
m = ModuleType("imjoy") |
|
sys.modules[m.__name__] = m |
|
m.__file__ = m.__name__ + ".py" |
|
m.api = imjoy_interface |
|
import micropip |
|
for r in config["requirements"]: |
|
await wrap_promise(micropip.install(r)) |
|
# run the script |
|
exec(content) |
|
return await fut |
|
|
|
def connect(): |
|
return True |
|
|
|
def disconnect(): |
|
return True |
|
|
|
def heartbeat(): |
|
return True |
|
|
|
async def setup(): |
|
await api.register({ |
|
"_rintf": True, |
|
"type": "engine", |
|
"pluginType": "shared-web-python", |
|
"icon": "🐍", |
|
"name": 'Shared Web Python', |
|
"url": 'local/shared-web-python', |
|
"connect": connect, |
|
"disconnect": disconnect, |
|
"startPlugin": start_plugin, |
|
"heartbeat": heartbeat |
|
}) |
|
|
|
api.export({"setup": setup}) |
|
</script> |