From 1921e7ec56b39d4a6af111a75cf74c495800abc6 Mon Sep 17 00:00:00 2001 From: AAGaming Date: Mon, 10 Jul 2023 18:41:56 -0400 Subject: JS -> Python WS now functional --- frontend/src/wsrouter.ts | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) (limited to 'frontend/src/wsrouter.ts') diff --git a/frontend/src/wsrouter.ts b/frontend/src/wsrouter.ts index b6437568..3a36b5b0 100644 --- a/frontend/src/wsrouter.ts +++ b/frontend/src/wsrouter.ts @@ -41,10 +41,11 @@ interface PromiseResolver { promise: Promise; } -class WSRouter extends Logger { +export class WSRouter extends Logger { routes: Map any> = new Map(); runningCalls: Map> = new Map(); ws?: WebSocket; + connectPromise?: Promise; // Used to map results and errors to calls reqId: number = 0; constructor() { @@ -52,30 +53,35 @@ class WSRouter extends Logger { } connect() { - this.ws = new WebSocket('ws://127.0.0.1:1337/ws'); - - this.ws.addEventListener('message', this.onMessage.bind(this)); - this.ws.addEventListener('close', this.onError.bind(this)); - this.ws.addEventListener('message', this.onError.bind(this)); + return (this.connectPromise = new Promise((resolve) => { + // Auth is a query param as JS WebSocket doesn't support headers + this.ws = new WebSocket(`ws://127.0.0.1:1337/ws?auth=${window.deckyAuthToken}`); + + this.ws.addEventListener('open', () => { + this.debug('WS Connected'); + resolve(); + delete this.connectPromise; + }); + this.ws.addEventListener('message', this.onMessage.bind(this)); + this.ws.addEventListener('close', this.onError.bind(this)); + // this.ws.addEventListener('error', this.onError.bind(this)); + })); } createPromiseResolver(): PromiseResolver { - let resolver: PromiseResolver; + let resolver: Partial> = {}; const promise = new Promise((resolve, reject) => { - resolver = { - promise, - resolve, - reject, - }; - this.debug('Created new PromiseResolver'); + resolver.resolve = resolve; + resolver.reject = reject; }); - this.debug('Returning new PromiseResolver'); + resolver.promise = promise; // The promise will always run first // @ts-expect-error 2454 return resolver; } - write(data: Message) { + async write(data: Message) { + if (this.connectPromise) await this.connectPromise; this.ws?.send(JSON.stringify(data)); } @@ -129,9 +135,9 @@ class WSRouter extends Logger { } catch (e) { this.error('Error parsing WebSocket message', e); } - this.call<[number, number], string>('methodName', 1, 2); } + // this.call<[number, number], string>('methodName', 1, 2); call(route: string, ...args: Args): Promise { const resolver = this.createPromiseResolver(); @@ -139,12 +145,15 @@ class WSRouter extends Logger { this.runningCalls.set(id, resolver); + this.debug(`Calling PY method ${route} with args`, args); + this.write({ type: MessageType.CALL, route, args, id }); return resolver.promise; } - onError(error: any) { - this.error('WS ERROR', error); + async onError(error: any) { + this.error('WS DISCONNECTED', error); + await this.connect(); } } -- cgit v1.2.3