incoming message queue, alreadyHaveEvent check, msg.send catch

This commit is contained in:
Martti Malmi
2023-01-21 10:20:35 +02:00
committed by fiatjaf
parent 51c1a54ddf
commit 2e305b7cd4

View File

@@ -31,10 +31,11 @@ type SubscriptionOptions = {
id?: string id?: string
} }
export function relayInit(url: string): Relay { export function relayInit(url: string, alreadyHaveEvent?: (id: string) => boolean): Relay {
var ws: WebSocket var ws: WebSocket
var resolveClose: () => void var resolveClose: () => void
var untilOpen: Promise<void> var setOpen: (value: (PromiseLike<void> | void)) => void
var untilOpen = new Promise<void>((resolve) => { setOpen = resolve })
var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {} var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}
var listeners: { var listeners: {
connect: Array<() => void> connect: Array<() => void>
@@ -60,6 +61,7 @@ export function relayInit(url: string): Relay {
failed: Array<(reason: string) => void> failed: Array<(reason: string) => void>
} }
} = {} } = {}
let idRegex = /"id":"([a-fA-F0-9]+)"/;
async function connectRelay(): Promise<void> { async function connectRelay(): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@@ -67,6 +69,7 @@ export function relayInit(url: string): Relay {
ws.onopen = () => { ws.onopen = () => {
listeners.connect.forEach(cb => cb()) listeners.connect.forEach(cb => cb())
setOpen()
resolve() resolve()
} }
ws.onerror = () => { ws.onerror = () => {
@@ -78,14 +81,30 @@ export function relayInit(url: string): Relay {
resolveClose && resolveClose() resolveClose && resolveClose()
} }
ws.onmessage = async e => { let incomingMessageQueue: any[] = []
var data let handleNextInterval: any
try {
data = JSON.parse(e.data) const handleNext = () => {
} catch (err) { if (incomingMessageQueue.length === 0) {
data = e.data 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) { if (data.length >= 1) {
switch (data[0]) { switch (data[0]) {
case 'EVENT': 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) let msg = JSON.stringify(params)
await untilOpen await untilOpen
ws.send(msg) try {
ws.send(msg)
} catch (err) {
console.log(err)
}
} }
const sub = ( const sub = (