DecentraSanta/WebServer/static/exchange_worker.js
2025-04-20 18:08:07 +02:00

56 lines
2.1 KiB
JavaScript

import "./pyodide.js";
async function prepare() {
self.postMessage({type: 'status', stage: 'initialize', text: 'Initializing...'});
let pyodide = await loadPyodide();
await pyodide.loadPackage("pycryptodome");
await pyodide.loadPackage("./santaexchange-0.1-py3-none-any.whl");
let response = await fetch('./exchange_client.py');
pyodide.runPython(await response.text())
function sendMessage(messageString) {
self.postMessage({type: 'message', message: messageString})
}
function receiveUser(username) {
self.postMessage({type: 'new_user', username: username})
}
function announceRecipient(recipient_name, recipient_info) {
self.postMessage({type: 'status', stage: 'finished', text: `Your secret santa receiver is \n${recipient_name}\n${recipient_info}`})
}
function printLogs(record) {
postMessage({type: 'status', stage: 'exchange', text: record});
}
pyodide.globals.set('send_message', sendMessage);
pyodide.globals.set('receive_user', receiveUser);
pyodide.globals.set('announce_recipient', announceRecipient);
pyodide.globals.set('logging_function', printLogs);
pyodide.runPython(`
exchange_worker = ExchangeClient(send_message, receive_user, announce_recipient)
`);
addEventListener('message', e => {
if (e.data.type == 'message') {
pyodide.globals.get('exchange_worker').decode_received_message(e.data.message);
} else if (e.data.type == 'set_user') {
let username = e.data.username;
let userinfo = e.data.userinfo;
pyodide.globals.get('exchange_worker').set_user_info(username, userinfo);
postMessage({type: 'status', stage: 'wait_for_start', text: 'Waiting for other participants'});
} else if (e.data.type == 'start') {
postMessage({
type: 'status',
stage: 'exchanging',
text: 'Performing exchange when all users have pressed start. This may take a minute or so.'
});
pyodide.globals.get('exchange_worker').start_exchange(e.data.users);
}
});
self.postMessage({type: 'status', stage: 'wait_for_user', text: 'Initialized'})
}
prepare();