From 2e305b7cd45d355b09400ea4ab27c987e662400d Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Sat, 21 Jan 2023 10:20:35 +0200 Subject: [PATCH] incoming message queue, alreadyHaveEvent check, msg.send catch --- relay.ts | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/relay.ts b/relay.ts index f879ebc..0546309 100644 --- a/relay.ts +++ b/relay.ts @@ -31,10 +31,11 @@ type SubscriptionOptions = { id?: string } -export function relayInit(url: string): Relay { +export function relayInit(url: string, alreadyHaveEvent?: (id: string) => boolean): Relay { var ws: WebSocket var resolveClose: () => void - var untilOpen: Promise + var setOpen: (value: (PromiseLike | void)) => void + var untilOpen = new Promise((resolve) => { setOpen = resolve }) var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {} var listeners: { connect: Array<() => void> @@ -60,6 +61,7 @@ export function relayInit(url: string): Relay { failed: Array<(reason: string) => void> } } = {} + let idRegex = /"id":"([a-fA-F0-9]+)"/; async function connectRelay(): Promise { return new Promise((resolve, reject) => { @@ -67,6 +69,7 @@ export function relayInit(url: string): Relay { ws.onopen = () => { listeners.connect.forEach(cb => cb()) + setOpen() resolve() } ws.onerror = () => { @@ -78,14 +81,30 @@ export function relayInit(url: string): Relay { resolveClose && resolveClose() } - ws.onmessage = async e => { - var data - try { - data = JSON.parse(e.data) - } catch (err) { - data = e.data + let incomingMessageQueue: any[] = [] + let handleNextInterval: any + + const handleNext = () => { + if (incomingMessageQueue.length === 0) { + clearInterval(handleNextInterval) + handleNextInterval = null + return } + var data = incomingMessageQueue.shift() + if (data && !!alreadyHaveEvent) { + const match = idRegex.exec(data) + if (match) { + const id = match[1]; + if (alreadyHaveEvent(id)) { + return + } + } + } + try { + data = JSON.parse(data) + } catch (err) {} + if (data.length >= 1) { switch (data[0]) { case 'EVENT': @@ -126,6 +145,13 @@ export function relayInit(url: string): Relay { } } } + + ws.onmessage = e => { + incomingMessageQueue.push(e.data) + if (!handleNextInterval) { + handleNextInterval = setInterval(handleNext, 0) + } + } }) } @@ -138,7 +164,11 @@ export function relayInit(url: string): Relay { let msg = JSON.stringify(params) await untilOpen - ws.send(msg) + try { + ws.send(msg) + } catch (err) { + console.log(err) + } } const sub = (