Load results from repository when possible
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import {Repository, Relay} from "@welshman/util"
|
import {isNil} from "@welshman/lib"
|
||||||
import type {TrustedEvent} from "@welshman/util"
|
import {Repository, Relay, LOCAL_RELAY_URL, getFilterResultCardinality} from "@welshman/util"
|
||||||
|
import type {TrustedEvent, Filter} from "@welshman/util"
|
||||||
import {Tracker, subscribe as baseSubscribe} from "@welshman/net"
|
import {Tracker, subscribe as baseSubscribe} from "@welshman/net"
|
||||||
import type {SubscribeRequest} from "@welshman/net"
|
import type {SubscribeRequest} from "@welshman/net"
|
||||||
import {createEventStore} from "@welshman/store"
|
import {createEventStore} from "@welshman/store"
|
||||||
@@ -21,17 +22,45 @@ export const relay = new Relay(repository)
|
|||||||
|
|
||||||
export const tracker = new Tracker()
|
export const tracker = new Tracker()
|
||||||
|
|
||||||
export const subscribe = (request: SubscribeRequest) => {
|
export const subscribe = (request: Partial<SubscribeRequest> & {filters: Filter[]}) => {
|
||||||
const sub = baseSubscribe({delay: 50, authTimeout: 3000, ...request})
|
const events: TrustedEvent[] = []
|
||||||
|
|
||||||
|
// If we already have all results for any filter, don't send the filter to the network
|
||||||
|
for (const filter of request.filters.splice(0)) {
|
||||||
|
const cardinality = getFilterResultCardinality(filter)
|
||||||
|
|
||||||
|
if (!isNil(cardinality)) {
|
||||||
|
const results = repository.query([filter])
|
||||||
|
|
||||||
|
if (results.length === cardinality) {
|
||||||
|
for (const event of results) {
|
||||||
|
events.push(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
request.filters.push(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
const sub = baseSubscribe({delay: 50, authTimeout: 3000, relays: [], ...request})
|
||||||
|
|
||||||
sub.emitter.on("event", (url: string, e: TrustedEvent) => {
|
sub.emitter.on("event", (url: string, e: TrustedEvent) => {
|
||||||
repository.publish(e)
|
repository.publish(e)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Keep cached results async so the caller can set up handlers
|
||||||
|
setTimeout(() => {
|
||||||
|
for (const event of events) {
|
||||||
|
sub.emitter.emit("event", LOCAL_RELAY_URL, event)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return sub
|
return sub
|
||||||
}
|
}
|
||||||
|
|
||||||
export const load = (request: SubscribeRequest) =>
|
export const load = (request: Partial<SubscribeRequest> & {filters: Filter[]}) =>
|
||||||
new Promise<TrustedEvent[]>(resolve => {
|
new Promise<TrustedEvent[]>(resolve => {
|
||||||
const sub = subscribe({closeOnEose: true, timeout: 3000, ...request})
|
const sub = subscribe({closeOnEose: true, timeout: 3000, ...request})
|
||||||
const events: TrustedEvent[] = []
|
const events: TrustedEvent[] = []
|
||||||
@@ -40,7 +69,7 @@ export const load = (request: SubscribeRequest) =>
|
|||||||
sub.emitter.on("complete", () => resolve(events))
|
sub.emitter.on("complete", () => resolve(events))
|
||||||
})
|
})
|
||||||
|
|
||||||
export const loadOne = (request: SubscribeRequest) =>
|
export const loadOne = (request: Partial<SubscribeRequest> & {filters: Filter[]}) =>
|
||||||
new Promise<TrustedEvent | null>(resolve => {
|
new Promise<TrustedEvent | null>(resolve => {
|
||||||
const sub = subscribe({closeOnEose: true, timeout: 3000, ...request})
|
const sub = subscribe({closeOnEose: true, timeout: 3000, ...request})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user