1347
|
1 from browser import window, aio |
|
2 import javascript |
|
3 |
|
4 |
|
5 class BridgeException(Exception): |
|
6 """An exception which has been raised from the backend and arrived to the frontend.""" |
|
7 |
|
8 def __init__(self, name, message="", condition=""): |
|
9 """ |
|
10 |
|
11 @param name (str): full exception class name (with module) |
|
12 @param message (str): error message |
|
13 @param condition (str) : error condition |
|
14 """ |
|
15 Exception.__init__(self) |
|
16 self.fullname = str(name) |
|
17 self.message = str(message) |
|
18 self.condition = str(condition) if condition else "" |
|
19 self.module, __, self.classname = str(self.fullname).rpartition(".") |
|
20 |
|
21 def __str__(self): |
|
22 message = (": %s" % self.message) if self.message else "" |
|
23 return self.classname + message |
|
24 |
|
25 def __eq__(self, other): |
|
26 return self.classname == other |
|
27 |
|
28 |
|
29 class Bridge: |
|
30 |
|
31 def __getattr__(self, attr): |
|
32 return lambda *args, **kwargs: self.call(attr, *args, **kwargs) |
|
33 |
|
34 async def call(self, method_name, *args, **kwargs): |
|
35 data = javascript.JSON.stringify({ |
|
36 "args": args, |
|
37 "kwargs": kwargs, |
|
38 }) |
|
39 url = f"/_bridge/{method_name}" |
|
40 r = await aio.post( |
|
41 url, |
|
42 headers={ |
|
43 'X-Csrf-Token': window.csrf_token, |
|
44 }, |
|
45 data=data, |
|
46 ) |
|
47 |
|
48 if r.status == 200: |
|
49 return javascript.JSON.parse(r.data) |
|
50 elif r.status == 502: |
|
51 ret = javascript.JSON.parse(r.data) |
|
52 raise BridgeException(ret['fullname'], ret['message'], ret['condition']) |
|
53 else: |
|
54 print(f"bridge called failed: code: {r.status}, text: {r.statusText}") |
|
55 raise BridgeException("InternalError", r.statusText) |