0.1.0•Updated 7 months ago
import { Entity } from "./entity.ts";
interface HangingPromise {
resolve: (...args: any[]) => void
reject: (...args: any[]) => void
}
export class EntityWorker {
private socket: WebSocket
private static resolvers: Record<string, HangingPromise> = {}
readonly uuid: string;
constructor(uuid: string, socket: WebSocket) {
this.uuid = uuid;
this.socket = socket;
this.socket.addEventListener('message', (ev) => {
try {
EntityWorker.receive(JSON.parse(ev.data));
} catch(e: any) {
console.error(`Could not parse incoming message! [${this.uuid}]`, e.message);
}
});
this.socket.addEventListener('close', () => {
Entity.warn(`♾️X Worker lost! [${uuid}]`);
Entity.__RemoveWorker(this);
})
this.socket.addEventListener('open', () => {
console.log(`♾️ Worker initialized! [${this.uuid}]\n Current workers: ${Entity.__worker_count + 1}`);
})
}
static receive(data: I_ProcessorResponse) {
const id = data.id;
if(data.success) {
this.resolvers[id].resolve(data.data);
} else {
this.resolvers[id].reject(data.error ?? data.message);
}
delete this.resolvers[id];
}
async dispatch(request: I_ProcessorRequest) {
return new Promise((resolve, reject) => {
this.socket.send(JSON.stringify(request));
EntityWorker.resolvers[request.id] = { reject, resolve };
})
}
}