Mercurial > libervia-web
changeset 1297:999dccf0093e
browser: new bridge module to access restricted bridge from browser
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 19 Jun 2020 16:47:51 +0200 |
parents | b1215347b5c3 |
children | 8aba2a2078ca |
files | libervia/pages/_browser/bridge.py |
diffstat | 1 files changed, 36 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libervia/pages/_browser/bridge.py Fri Jun 19 16:47:51 2020 +0200 @@ -0,0 +1,36 @@ +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 ret is None: + callback() + else: + callback(ret) + elif xhr.status == 502: + # PROXY_ERROR is used for bridge error + ret = javascript.JSON.parse(xhr.response) + errback(ret) + else: + print(f"bridge called failed: code: {xhr.response}, text: {xhr.statusText}") + 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)