e7929d6f6b
* wip * post-cherry pick fixes * wip * wip * using sqlite-based indexeddb shim * running nymClient in worker thread * improved received handling * building node mix-fetch * fixed mix fetch request constructor if args[1] == undefined * fixed build target * nodejs origin bypass * mix fetch in node but I dont think anyone should use it over normal client... * target locking * fixed post-rebasing issues
105 lines
2.9 KiB
JavaScript
105 lines
2.9 KiB
JavaScript
import {Worker} from 'worker_threads';
|
|
|
|
function sleep(ms) {
|
|
return new Promise((resolve) => {
|
|
setTimeout(resolve, ms);
|
|
});
|
|
}
|
|
|
|
class NodeWorkerClient {
|
|
worker = null;
|
|
clientInitialised = false;
|
|
selfAddress = null
|
|
|
|
constructor() {
|
|
this.worker = new Worker('./src/worker.mjs');
|
|
|
|
this.worker.on("message", message => {
|
|
this.handleMessage(message)
|
|
});
|
|
|
|
this.worker.on("error", error => {
|
|
console.log(error);
|
|
});
|
|
|
|
this.worker.on("exit", exitCode => {
|
|
console.log(`It exited with code ${exitCode}`);
|
|
})
|
|
|
|
}
|
|
|
|
initWasmClient = () => {
|
|
this.worker.postMessage({kind: 'initRequest', data: {}})
|
|
}
|
|
|
|
sendMessage = (message, recipient) => {
|
|
this.worker.postMessage({kind: 'sendRequest', data: {message, recipient}})
|
|
}
|
|
|
|
handleReceived = (message, senderTag) => {
|
|
console.log(`received raw message: ${message}`)
|
|
console.log(`with senderTag: ${senderTag}`)
|
|
|
|
let decoded = new TextDecoder().decode(message);
|
|
console.log(`decoded message: "${decoded}"`)
|
|
}
|
|
|
|
handleMessage = (message) => {
|
|
console.log(`handling "${message.kind}"`)
|
|
switch (message.kind) {
|
|
case 'initResponse':
|
|
this.clientInitialised = message.data.done;
|
|
this.selfAddress = message.data.clientAddress
|
|
break;
|
|
case 'receivedMessage':
|
|
this.handleReceived(message.data.message, message.data.senderTag)
|
|
break;
|
|
default:
|
|
console.log("UNKOWN MESSAGE")
|
|
break;
|
|
}
|
|
}
|
|
|
|
// hehe, that's so disgusting, but I don't want to spend ages in the JS callback hell
|
|
// because that's not the point of this example
|
|
waitForWasmClient = async () => {
|
|
let start = new Date();
|
|
let pollingRate = 100;
|
|
let maxWaitSecs = 5;
|
|
while (!this.clientInitialised) {
|
|
let now = new Date();
|
|
let diff = (now.getTime() - start.getTime()) / 1000;
|
|
if (diff > maxWaitSecs) {
|
|
return Promise.reject(new Error('failed to initialise wasm client'))
|
|
}
|
|
await sleep(pollingRate)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
async function main() {
|
|
let client = new NodeWorkerClient()
|
|
client.initWasmClient()
|
|
await client.waitForWasmClient()
|
|
|
|
let ourAddress = client.selfAddress
|
|
console.log("main thread address: ", ourAddress)
|
|
|
|
let message = "hello world"
|
|
let uint8Array = new TextEncoder().encode(message);
|
|
console.log(`sending "${message}" to ourselves...`)
|
|
client.sendMessage(uint8Array, ourAddress)
|
|
}
|
|
|
|
await main()
|
|
|
|
process.on('SIGTERM', signal => {
|
|
console.log(`Process ${process.pid} received a SIGTERM signal`)
|
|
process.exit(0)
|
|
})
|
|
|
|
process.on('SIGINT', signal => {
|
|
console.log(`Process ${process.pid} has been interrupted`)
|
|
process.exit(0)
|
|
}) |