Skip to content
This repository was archived by the owner on Jun 22, 2025. It is now read-only.

Commit dbffb4a

Browse files
committed
Add custom json encoder/decoder support.
1 parent 2db3c83 commit dbffb4a

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

eel/__init__.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
mimetypes.add_type('application/javascript', '.js')
1919
_eel_js_file = pkg.resource_filename('eel', 'eel.js')
2020
_eel_js = open(_eel_js_file, encoding='utf-8').read()
21+
_eel_json_dumps_default_function = lambda o: None
2122
_websockets = []
2223
_call_return_values = {}
2324
_call_return_callbacks = {}
@@ -44,6 +45,8 @@
4445
'position': None, # (left, top) of main window
4546
'geometry': {}, # Dictionary of size/position for all windows
4647
'close_callback': None, # Callback for when all windows have closed
48+
'json_encoder': None, # Custom JSONEncoder to customize json data dumping
49+
'json_decoder': None, # Custom JSONDecoder to customize json data loading
4750
'app_mode': True, # (Chrome specific option)
4851
'all_interfaces': False, # Allow bottle server to listen for connections on all interfaces
4952
'disable_cache': True, # Sets the no-store response header when serving assets
@@ -188,7 +191,7 @@ def _eel():
188191
page = _eel_js.replace('/** _py_functions **/',
189192
'_py_functions: %s,' % list(_exposed_functions.keys()))
190193
page = page.replace('/** _start_geometry **/',
191-
'_start_geometry: %s,' % _safe_json(start_geometry))
194+
'_start_geometry: %s,' % _safe_json_dumps(start_geometry))
192195
btl.response.content_type = 'application/javascript'
193196
_set_response_headers(btl.response)
194197
return page
@@ -217,15 +220,15 @@ def _websocket(ws):
217220
page = btl.request.query.page
218221
if page not in _mock_queue_done:
219222
for call in _mock_queue:
220-
_repeated_send(ws, _safe_json(call))
223+
_repeated_send(ws, _safe_json_dumps(call))
221224
_mock_queue_done.add(page)
222225

223226
_websockets += [(page, ws)]
224227

225228
while True:
226229
msg = ws.receive()
227230
if msg is not None:
228-
message = jsn.loads(msg)
231+
message = _safe_json_loads(msg)
229232
spawn(_process_message, message, ws)
230233
else:
231234
_websockets.remove((page, ws))
@@ -242,8 +245,12 @@ def _websocket(ws):
242245

243246
# Private functions
244247

245-
def _safe_json(obj):
246-
return jsn.dumps(obj, default=lambda o: None)
248+
def _safe_json_loads(obj):
249+
return jsn.loads(obj, cls=_start_args['json_decoder'])
250+
251+
def _safe_json_dumps(obj):
252+
return jsn.dumps(obj, cls=_start_args['json_encoder'],
253+
default=_eel_json_dumps_default_function if not _start_args['json_encoder'] else None)
247254

248255

249256
def _repeated_send(ws, msg):
@@ -258,7 +265,7 @@ def _repeated_send(ws, msg):
258265
def _process_message(message, ws):
259266
if 'call' in message:
260267
return_val = _exposed_functions[message['name']](*message['args'])
261-
_repeated_send(ws, _safe_json({ 'return': message['call'],
268+
_repeated_send(ws, _safe_json_dumps({ 'return': message['call'],
262269
'value': return_val }))
263270
elif 'return' in message:
264271
call_id = message['return']
@@ -303,7 +310,7 @@ def _mock_call(name, args):
303310
def _js_call(name, args):
304311
call_object = _call_object(name, args)
305312
for _, ws in _websockets:
306-
_repeated_send(ws, _safe_json(call_object))
313+
_repeated_send(ws, _safe_json_dumps(call_object))
307314
return _call_return(call_object)
308315

309316

0 commit comments

Comments
 (0)