a better way to do pubs and subs with SimplePool.

This commit is contained in:
fiatjaf
2023-02-08 14:15:29 -03:00
parent 75d7be5a54
commit b2d1dd2110
3 changed files with 35 additions and 20 deletions

View File

@@ -125,15 +125,34 @@ import 'websocket-polyfill'
```js ```js
import {pool} from 'nostr-tools' import {pool} from 'nostr-tools'
const p = pool() const pool = new SimplePool()
["wss://relay.example.com", "wss://relay.example2.com"].forEach(async url => { let relays = ['wss://relay.example.com', 'wss://relay.example2.com']
relays.forEach(async url => {
let relay = pool.ensureRelay(url) let relay = pool.ensureRelay(url)
await relay.connect() await relay.connect()
relay.sub(...) // same as above
relay.publish(...) // etc
}) })
let relay = pool.ensureRelay('wss://relay.example3.com')
let subs = pool.sub([...relays, relay], {
authors: ['32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245']
})
subs.forEach(sub =>
sub.on('event', event => {
// this will only be called once the first time the event is received
// ...
})
)
let pubs = pool.publish(newEvent)
pubs.forEach(pub =>
pub.on('ok', () => {
// ...
})
)
``` ```
### Querying profile data from a NIP-05 address ### Querying profile data from a NIP-05 address

View File

@@ -2,14 +2,14 @@
require('websocket-polyfill') require('websocket-polyfill')
const { const {
pool, SimplePool,
generatePrivateKey, generatePrivateKey,
getPublicKey, getPublicKey,
getEventHash, getEventHash,
signEvent signEvent
} = require('./lib/nostr.cjs') } = require('./lib/nostr.cjs')
let p = pool() let pool = new SimplePool()
let relays = [ let relays = [
'wss://nostr-dev.wellorder.net/', 'wss://nostr-dev.wellorder.net/',
@@ -23,7 +23,7 @@ beforeAll(async () => {
Promise.all( Promise.all(
relays.map(relay => { relays.map(relay => {
try { try {
let r = p.ensureRelay(relay) let r = pool.ensureRelay(relay)
return r.connect() return r.connect()
} catch (err) { } catch (err) {
/***/ /***/
@@ -35,7 +35,7 @@ beforeAll(async () => {
afterAll(async () => { afterAll(async () => {
relays.forEach(relay => { relays.forEach(relay => {
try { try {
let r = p.ensureRelay(relay) let r = pool.ensureRelay(relay)
r.close() r.close()
} catch (err) { } catch (err) {
/***/ /***/
@@ -47,7 +47,7 @@ test('removing duplicates when querying', async () => {
let priv = generatePrivateKey() let priv = generatePrivateKey()
let pub = getPublicKey(priv) let pub = getPublicKey(priv)
let subs = p.sub(relays, [ let subs = pool.sub(relays, [
{ {
authors: [pub] authors: [pub]
} }
@@ -74,7 +74,7 @@ test('removing duplicates when querying', async () => {
event.id = getEventHash(event) event.id = getEventHash(event)
event.sig = signEvent(event, priv) event.sig = signEvent(event, priv)
p.publish(relays, event) pool.publish(relays, event)
await new Promise(resolve => setTimeout(resolve, 1500)) await new Promise(resolve => setTimeout(resolve, 1500))
@@ -85,8 +85,8 @@ test('removing duplicates correctly when double querying', async () => {
let priv = generatePrivateKey() let priv = generatePrivateKey()
let pub = getPublicKey(priv) let pub = getPublicKey(priv)
let subs1 = p.sub(relays, [ { authors: [pub] } ]) let subs1 = pool.sub(relays, [{authors: [pub]}])
let subs2 = p.sub(relays, [ { authors: [pub] } ]) let subs2 = pool.sub(relays, [{authors: [pub]}])
let received = [] let received = []
@@ -111,7 +111,7 @@ test('removing duplicates correctly when double querying', async () => {
event.id = getEventHash(event) event.id = getEventHash(event)
event.sig = signEvent(event, priv) event.sig = signEvent(event, priv)
p.publish(relays, event) pool.publish(relays, event)
await new Promise(resolve => setTimeout(resolve, 1500)) await new Promise(resolve => setTimeout(resolve, 1500))

View File

@@ -4,14 +4,10 @@ import {Filter} from './filter'
import {Event} from './event' import {Event} from './event'
import {SubscriptionOptions, Sub, Pub} from './relay' import {SubscriptionOptions, Sub, Pub} from './relay'
export function pool(defaultRelays: string[] = []) { export class SimplePool {
return new SimplePool(defaultRelays)
}
class SimplePool {
private _conn: {[url: string]: Relay} private _conn: {[url: string]: Relay}
constructor(defaultRelays: string[]) { constructor(defaultRelays: string[] = []) {
this._conn = {} this._conn = {}
defaultRelays.forEach(this.ensureRelay) defaultRelays.forEach(this.ensureRelay)
} }