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)