mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-09 00:28:51 +00:00
remove all the auto-reconnection code from relay.
This commit is contained in:
69
relay.ts
69
relay.ts
@@ -33,11 +33,8 @@ type SubscriptionOptions = {
|
|||||||
|
|
||||||
export function relayInit(url: string): Relay {
|
export function relayInit(url: string): Relay {
|
||||||
var ws: WebSocket
|
var ws: WebSocket
|
||||||
var resolveOpen: () => void
|
|
||||||
var resolveClose: () => void
|
var resolveClose: () => void
|
||||||
var untilOpen: Promise<void>
|
var untilOpen: Promise<void>
|
||||||
var wasClosed: boolean
|
|
||||||
var closed: boolean
|
|
||||||
var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}
|
var openSubs: {[id: string]: {filters: Filter[]} & SubscriptionOptions} = {}
|
||||||
var listeners: {
|
var listeners: {
|
||||||
connect: Array<() => void>
|
connect: Array<() => void>
|
||||||
@@ -63,64 +60,19 @@ export function relayInit(url: string): Relay {
|
|||||||
failed: Array<(reason: string) => void>
|
failed: Array<(reason: string) => void>
|
||||||
}
|
}
|
||||||
} = {}
|
} = {}
|
||||||
let attemptNumber = 1
|
|
||||||
let nextAttemptSeconds = 1
|
|
||||||
let isConnected = false
|
|
||||||
|
|
||||||
function resetOpenState() {
|
|
||||||
untilOpen = new Promise(resolve => {
|
|
||||||
resolveOpen = resolve
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function connectRelay() {
|
function connectRelay() {
|
||||||
ws = new WebSocket(url)
|
ws = new WebSocket(url)
|
||||||
|
|
||||||
ws.onopen = () => {
|
ws.onopen = () => {
|
||||||
listeners.connect.forEach(cb => cb())
|
listeners.connect.forEach(cb => cb())
|
||||||
resolveOpen()
|
|
||||||
isConnected = true
|
|
||||||
|
|
||||||
// restablish old subscriptions
|
|
||||||
if (wasClosed) {
|
|
||||||
wasClosed = false
|
|
||||||
for (let id in openSubs) {
|
|
||||||
let {filters} = openSubs[id]
|
|
||||||
sub(filters, openSubs[id])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ws.onerror = () => {
|
ws.onerror = () => {
|
||||||
isConnected = false
|
|
||||||
listeners.error.forEach(cb => cb())
|
listeners.error.forEach(cb => cb())
|
||||||
}
|
}
|
||||||
ws.onclose = async () => {
|
ws.onclose = async () => {
|
||||||
isConnected = false
|
|
||||||
listeners.disconnect.forEach(cb => cb())
|
listeners.disconnect.forEach(cb => cb())
|
||||||
|
resolveClose()
|
||||||
if (closed) {
|
|
||||||
// we've closed this because we wanted, so end everything
|
|
||||||
resolveClose()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise keep trying to reconnect
|
|
||||||
resetOpenState()
|
|
||||||
attemptNumber++
|
|
||||||
nextAttemptSeconds += attemptNumber ** 3
|
|
||||||
if (nextAttemptSeconds > 14400) {
|
|
||||||
nextAttemptSeconds = 14400 // 4 hours
|
|
||||||
}
|
|
||||||
console.log(
|
|
||||||
`relay ${url} connection closed. reconnecting in ${nextAttemptSeconds} seconds.`
|
|
||||||
)
|
|
||||||
setTimeout(async () => {
|
|
||||||
try {
|
|
||||||
connectRelay()
|
|
||||||
} catch (err) {}
|
|
||||||
}, nextAttemptSeconds * 1000)
|
|
||||||
|
|
||||||
wasClosed = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ws.onmessage = async e => {
|
ws.onmessage = async e => {
|
||||||
@@ -173,13 +125,9 @@ export function relayInit(url: string): Relay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resetOpenState()
|
|
||||||
|
|
||||||
async function connect(): Promise<void> {
|
async function connect(): Promise<void> {
|
||||||
if (ws?.readyState && ws.readyState === 1) return // ws already open
|
if (ws?.readyState && ws.readyState === 1) return // ws already open
|
||||||
try {
|
connectRelay()
|
||||||
connectRelay()
|
|
||||||
} catch (err) {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function trySend(params: [string, ...any]) {
|
async function trySend(params: [string, ...any]) {
|
||||||
@@ -233,13 +181,19 @@ export function relayInit(url: string): Relay {
|
|||||||
return {
|
return {
|
||||||
url,
|
url,
|
||||||
sub,
|
sub,
|
||||||
on: (type: 'connect' | 'disconnect' | 'notice', cb: any): void => {
|
on: (
|
||||||
|
type: 'connect' | 'disconnect' | 'error' | 'notice',
|
||||||
|
cb: any
|
||||||
|
): void => {
|
||||||
listeners[type].push(cb)
|
listeners[type].push(cb)
|
||||||
if (type === 'connect' && isConnected) {
|
if (type === 'connect' && ws?.readyState === 1) {
|
||||||
cb()
|
cb()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
off: (type: 'connect' | 'disconnect' | 'notice', cb: any): void => {
|
off: (
|
||||||
|
type: 'connect' | 'disconnect' | 'error' | 'notice',
|
||||||
|
cb: any
|
||||||
|
): void => {
|
||||||
let index = listeners[type].indexOf(cb)
|
let index = listeners[type].indexOf(cb)
|
||||||
if (index !== -1) listeners[type].splice(index, 1)
|
if (index !== -1) listeners[type].splice(index, 1)
|
||||||
},
|
},
|
||||||
@@ -298,7 +252,6 @@ export function relayInit(url: string): Relay {
|
|||||||
},
|
},
|
||||||
connect,
|
connect,
|
||||||
close(): Promise<void> {
|
close(): Promise<void> {
|
||||||
closed = true // prevent ws from trying to reconnect
|
|
||||||
ws.close()
|
ws.close()
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
resolveClose = resolve
|
resolveClose = resolve
|
||||||
|
|||||||
Reference in New Issue
Block a user