mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-13 10:28:51 +00:00
use per-subscription alreadyHaveEvent handler instead of per-relay.
now pools are much smarter.
This commit is contained in:
56
pool.ts
56
pool.ts
@@ -2,7 +2,7 @@ import {Relay, relayInit} from './relay'
|
||||
import {normalizeURL} from './utils'
|
||||
import {Filter} from './filter'
|
||||
import {Event} from './event'
|
||||
import {SubscriptionOptions, Sub} from './relay'
|
||||
import {SubscriptionOptions, Sub, Pub} from './relay'
|
||||
|
||||
export function pool(defaultRelays: string[] = []) {
|
||||
return new SimplePool(defaultRelays)
|
||||
@@ -10,7 +10,6 @@ export function pool(defaultRelays: string[] = []) {
|
||||
|
||||
class SimplePool {
|
||||
private _conn: {[url: string]: Relay}
|
||||
private _knownIds: Set<string> = new Set()
|
||||
|
||||
constructor(defaultRelays: string[]) {
|
||||
this._conn = {}
|
||||
@@ -22,17 +21,52 @@ class SimplePool {
|
||||
const existing = this._conn[nm]
|
||||
if (existing) return existing
|
||||
|
||||
const hasEventId = (id: string): boolean => this._knownIds.has(id)
|
||||
const relay = relayInit(nm, hasEventId)
|
||||
const relay = relayInit(nm)
|
||||
this._conn[nm] = relay
|
||||
|
||||
let sub = relay.sub
|
||||
relay.sub = (filters: Filter[], opts?: SubscriptionOptions): Sub => {
|
||||
let s = sub(filters, opts)
|
||||
s.on('event', (event: Event) => this._knownIds.add(event.id as string))
|
||||
return s
|
||||
}
|
||||
|
||||
return relay
|
||||
}
|
||||
|
||||
sub(relays: string[], filters: Filter[], opts?: SubscriptionOptions): Sub[] {
|
||||
let _knownIds: Set<string> = new Set()
|
||||
let modifiedOpts = opts || {}
|
||||
modifiedOpts.alreadyHaveEvent = id => _knownIds.has(id)
|
||||
|
||||
return relays.map(relay => {
|
||||
let r = this._conn[relay]
|
||||
if (!r) return badSub()
|
||||
let s = r.sub(filters, modifiedOpts)
|
||||
s.on('event', (event: Event) => _knownIds.add(event.id as string))
|
||||
return s
|
||||
})
|
||||
}
|
||||
|
||||
publish(relays: string[], event: Event): Pub[] {
|
||||
return relays.map(relay => {
|
||||
let r = this._conn[relay]
|
||||
if (!r) return badPub(relay)
|
||||
let s = r.publish(event)
|
||||
return s
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function badSub(): Sub {
|
||||
return {
|
||||
on() {},
|
||||
off() {},
|
||||
sub(): Sub {
|
||||
return badSub()
|
||||
},
|
||||
unsub() {}
|
||||
}
|
||||
}
|
||||
|
||||
function badPub(relay: string): Pub {
|
||||
return {
|
||||
on(typ, cb) {
|
||||
if (typ === 'failed') cb(`relay ${relay} not connected`)
|
||||
},
|
||||
off() {}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user