# HG changeset patch # User Goffi # Date 1592578071 -7200 # Node ID 999dccf0093e4a8f61fe17ddee584daecfbe8c87 # Parent b1215347b5c33ae536ad41ba9f7e41c9ae2d540a browser: new bridge module to access restricted bridge from browser diff -r b1215347b5c3 -r 999dccf0093e libervia/pages/_browser/bridge.py --- /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)