174 lines
5.7 KiB
JavaScript
174 lines
5.7 KiB
JavaScript
eel = {
|
|
_host: window.location.origin,
|
|
|
|
set_host: function (hostname) {
|
|
eel._host = hostname
|
|
},
|
|
|
|
expose: function(f, name) {
|
|
if(name === undefined){
|
|
name = f.toString();
|
|
let i = 'function '.length, j = name.indexOf('(');
|
|
name = name.substring(i, j).trim();
|
|
}
|
|
|
|
eel._exposed_functions[name] = f;
|
|
},
|
|
|
|
guid: function() {
|
|
return eel._guid;
|
|
},
|
|
|
|
// These get dynamically added by library when file is served
|
|
/** _py_functions **/
|
|
/** _start_geometry **/
|
|
|
|
_guid: ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
|
|
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
|
|
),
|
|
|
|
_exposed_functions: {},
|
|
|
|
_mock_queue: [],
|
|
|
|
_mock_py_functions: function() {
|
|
for(let i = 0; i < eel._py_functions.length; i++) {
|
|
let name = eel._py_functions[i];
|
|
eel[name] = function() {
|
|
let call_object = eel._call_object(name, arguments);
|
|
eel._mock_queue.push(call_object);
|
|
return eel._call_return(call_object);
|
|
}
|
|
}
|
|
},
|
|
|
|
_import_py_function: function(name) {
|
|
let func_name = name;
|
|
eel[name] = function() {
|
|
let call_object = eel._call_object(func_name, arguments);
|
|
eel._websocket.send(eel._toJSON(call_object));
|
|
return eel._call_return(call_object);
|
|
}
|
|
},
|
|
|
|
_call_number: 0,
|
|
|
|
_call_return_callbacks: {},
|
|
|
|
_call_object: function(name, args) {
|
|
let arg_array = [];
|
|
for(let i = 0; i < args.length; i++){
|
|
arg_array.push(args[i]);
|
|
}
|
|
|
|
let call_id = (eel._call_number += 1) + Math.random();
|
|
return {'call': call_id, 'name': name, 'args': arg_array};
|
|
},
|
|
|
|
_sleep: function(ms) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
},
|
|
|
|
_toJSON: function(obj) {
|
|
return JSON.stringify(obj, (k, v) => v === undefined ? null : v);
|
|
},
|
|
|
|
_call_return: function(call) {
|
|
return function(callback = null) {
|
|
if(callback != null) {
|
|
eel._call_return_callbacks[call.call] = {resolve: callback};
|
|
} else {
|
|
return new Promise(function(resolve, reject) {
|
|
eel._call_return_callbacks[call.call] = {resolve: resolve, reject: reject};
|
|
});
|
|
}
|
|
}
|
|
},
|
|
|
|
_position_window: function(page) {
|
|
let size = eel._start_geometry['default'].size;
|
|
let position = eel._start_geometry['default'].position;
|
|
|
|
if(page in eel._start_geometry.pages) {
|
|
size = eel._start_geometry.pages[page].size;
|
|
position = eel._start_geometry.pages[page].position;
|
|
}
|
|
|
|
if(size != null){
|
|
window.resizeTo(size[0], size[1]);
|
|
}
|
|
|
|
if(position != null){
|
|
window.moveTo(position[0], position[1]);
|
|
}
|
|
},
|
|
|
|
_init: function() {
|
|
eel._mock_py_functions();
|
|
|
|
document.addEventListener("DOMContentLoaded", function(event) {
|
|
let page = window.location.pathname.substring(1);
|
|
eel._position_window(page);
|
|
|
|
let websocket_addr = (eel._host + '/eel').replace('http', 'ws');
|
|
websocket_addr += ('?page=' + page);
|
|
eel._websocket = new WebSocket(websocket_addr);
|
|
|
|
eel._websocket.onopen = function() {
|
|
for(let i = 0; i < eel._py_functions.length; i++){
|
|
let py_function = eel._py_functions[i];
|
|
eel._import_py_function(py_function);
|
|
}
|
|
|
|
while(eel._mock_queue.length > 0) {
|
|
let call = eel._mock_queue.shift();
|
|
eel._websocket.send(eel._toJSON(call));
|
|
}
|
|
};
|
|
|
|
eel._websocket.onmessage = function (e) {
|
|
let message = JSON.parse(e.data);
|
|
if(message.hasOwnProperty('call') ) {
|
|
// Python making a function call into us
|
|
if(message.name in eel._exposed_functions) {
|
|
try {
|
|
let return_val = eel._exposed_functions[message.name](...message.args);
|
|
eel._websocket.send(eel._toJSON({'return': message.call, 'status':'ok', 'value': return_val}));
|
|
} catch(err) {
|
|
debugger
|
|
eel._websocket.send(eel._toJSON(
|
|
{'return': message.call,
|
|
'status':'error',
|
|
'error': err.message,
|
|
'stack': err.stack}));
|
|
}
|
|
}
|
|
} else if(message.hasOwnProperty('return')) {
|
|
// Python returning a value to us
|
|
if(message['return'] in eel._call_return_callbacks) {
|
|
if(message['status']==='ok'){
|
|
eel._call_return_callbacks[message['return']].resolve(message.value);
|
|
}
|
|
else if(message['status']==='error' && eel._call_return_callbacks[message['return']].reject) {
|
|
eel._call_return_callbacks[message['return']].reject(message['error']);
|
|
}
|
|
}
|
|
} else {
|
|
throw 'Invalid message ' + message;
|
|
}
|
|
|
|
};
|
|
});
|
|
}
|
|
};
|
|
|
|
eel._init();
|
|
|
|
if(typeof require !== 'undefined'){
|
|
// Avoid name collisions when using Electron, so jQuery etc work normally
|
|
window.nodeRequire = require;
|
|
delete window.require;
|
|
delete window.exports;
|
|
delete window.module;
|
|
}
|