list() and get() methods.

This commit is contained in:
fiatjaf
2023-02-08 16:37:53 -03:00
parent df169ea42b
commit 7ff97b5488
4 changed files with 106 additions and 2 deletions

View File

@@ -111,6 +111,11 @@ pub.on('failed', reason => {
console.log(`failed to publish to ${relay.url}: ${reason}`)
})
let events = await relay.list([{kinds: [0, 1]}])
let event = await relay.get({
ids: ['44e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245']
})
await relay.close()
```
@@ -147,12 +152,17 @@ subs.forEach(sub =>
})
)
let pubs = pool.publish(newEvent)
let pubs = pool.publish(relays, newEvent)
pubs.forEach(pub =>
pub.on('ok', () => {
// ...
})
)
let events = await pool.list(relays, [{kinds: [0, 1]}])
let event = await pool.get(relays, {
ids: ['44e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245']
})
```
### Querying profile data from a NIP-05 address

View File

@@ -1,6 +1,6 @@
{
"name": "nostr-tools",
"version": "1.2.4",
"version": "1.3.0",
"description": "Tools for making a Nostr client.",
"repository": {
"type": "git",

62
pool.ts
View File

@@ -37,6 +37,68 @@ export class SimplePool {
})
}
get(
relays: string[],
filter: Filter,
opts?: SubscriptionOptions
): Promise<Event | null> {
return new Promise(resolve => {
let subs = this.sub(relays, [filter], opts)
let timeout = setTimeout(() => {
subs.forEach(sub => sub.unsub(), 1500)
resolve(null)
})
subs.forEach(sub => {
sub.on('event', (event: Event) => {
resolve(event)
clearTimeout(timeout)
subs.forEach(sub => {
sub.unsub()
})
})
})
})
}
list(
relays: string[],
filters: Filter[],
opts?: SubscriptionOptions
): Promise<Event[]> {
return new Promise(resolve => {
let _knownIds: Set<string> = new Set()
let modifiedOpts = opts || {}
modifiedOpts.alreadyHaveEvent = id => _knownIds.has(id)
let events: Event[] = []
let subs = this.sub(relays, filters, modifiedOpts)
let timeout = setTimeout(() => {
subs.forEach(sub => sub.unsub(), 1500)
resolve(events)
})
let pendingEoses = relays.length
subs.forEach(sub => {
sub.on('event', (event: Event) => {
events.push(event)
})
sub.on('eose', () => {
pendingEoses--
if (pendingEoses === 0) {
resolve(events)
clearTimeout(timeout)
subs.forEach(sub => {
sub.unsub()
})
}
})
})
})
}
publish(relays: string[], event: Event): Pub[] {
return relays.map(relay => {
let r = this._conn[relay]

View File

@@ -12,6 +12,8 @@ export type Relay = {
connect: () => Promise<void>
close: () => Promise<void>
sub: (filters: Filter[], opts?: SubscriptionOptions) => Sub
list: (filters: Filter[], opts?: SubscriptionOptions) => Promise<Event[]>
get: (filter: Filter, opts?: SubscriptionOptions) => Promise<Event | null>
publish: (event: Event) => Pub
on: (type: RelayEvent, cb: any) => void
off: (type: RelayEvent, cb: any) => void
@@ -231,6 +233,36 @@ export function relayInit(url: string): Relay {
let index = listeners[type].indexOf(cb)
if (index !== -1) listeners[type].splice(index, 1)
},
list: (filters: Filter[], opts?: SubscriptionOptions): Promise<Event[]> =>
new Promise(resolve => {
let s = sub(filters, opts)
let events: Event[] = []
let timeout = setTimeout(() => {
s.unsub()
resolve(events)
}, 1500)
s.on('eose', () => {
s.unsub()
clearTimeout(timeout)
resolve(events)
})
s.on('event', (event: Event) => {
events.push(event)
})
}),
get: (filter: Filter, opts?: SubscriptionOptions): Promise<Event | null> =>
new Promise(resolve => {
let s = sub([filter], opts)
let timeout = setTimeout(() => {
s.unsub()
resolve(null)
}, 1500)
s.on('event', (event: Event) => {
s.unsub()
clearTimeout(timeout)
resolve(event)
})
}),
publish(event: Event): Pub {
if (!event.id) throw new Error(`event ${event} has no id`)
let id = event.id