mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-09 16:48:50 +00:00
incoming message queue, alreadyHaveEvent check, msg.send catch
This commit is contained in:
48
relay.ts
48
relay.ts
@@ -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 = (
|
||||||
|
|||||||
Reference in New Issue
Block a user