Mercurial > libervia-web
view libervia/pages/_browser/bridge.py @ 1360:389a83eefe62
server: SàT applications integration:
- a SàT Application can be added to the menu (if necessary values are exposed), by using
the `sat-app:[application_name]` in `menu_json` or `menu_extra_json`. The application
will then be started with Libervia, and embedded, i.e. Libervia menu will appear and
application will be integrated under it.
- the same `sat-app:[application_name]` thing can be used in redirection, in this case the
redirection will reverse proxy directly the application, without embedding it (no
Libervia menu will appear)
- the ReverseProxy will replace headers if necessary to allow embedding in a iframe from
the same domain
- new `embed_app` page to embed a SàT Application
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 28 Sep 2020 21:12:21 +0200 |
parents | 8998f01088ac |
children | b28025a7cc28 |
line wrap: on
line source
from browser import window import javascript class Bridge: def __getattr__(self, attr): return lambda *args, **kwargs: self.call(attr, *args, **kwargs) def on_load(self, xhr, ev, callback, errback): if xhr.status == 200: ret = javascript.JSON.parse(xhr.response) if callback is not None: if ret is None: callback() else: callback(ret) elif xhr.status == 502: # PROXY_ERROR is used for bridge error ret = javascript.JSON.parse(xhr.response) if errback is not None: errback(ret) else: print(f"bridge called failed: code: {xhr.response}, text: {xhr.statusText}") if errback is not None: errback({"fullname": "InternalError", "message": xhr.statusText}) def call(self, method_name, *args, callback, errback, **kwargs): xhr = window.XMLHttpRequest.new() xhr.bind('load', lambda ev: self.on_load(xhr, ev, callback, errback)) xhr.bind('error', lambda ev: errback( {"fullname": "ConnectionError", "message": xhr.statusText})) xhr.open("POST", f"/_bridge/{method_name}", True) data = javascript.JSON.stringify({ "args": args, "kwargs": kwargs, }) xhr.setRequestHeader('X-Csrf-Token', window.csrf_token) xhr.send(data)