Files
nym/wasm/client/internal-dev-node/src/index.mjs
T
Jędrzej Stuczyński e7929d6f6b Feature/wasm client nodejs (#3769)
* 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
2023-09-07 13:30:04 +01:00

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)
})