Update welshman stuff again

This commit is contained in:
Jon Staab
2025-04-11 09:27:19 -07:00
parent acddff79f0
commit 84af4d2d8e
9 changed files with 82 additions and 75 deletions

View File

@@ -113,7 +113,9 @@
})
const observer = new ResizeObserver(() => {
dynamicPadding!.style.minHeight = `${chatCompose!.offsetHeight}px`
if (dynamicPadding && chatCompose) {
dynamicPadding.style.minHeight = `${chatCompose.offsetHeight}px`
}
})
observer.observe(chatCompose!)

View File

@@ -5,8 +5,7 @@
import {REACTION, getTag, REPORT, DELETE} from "@welshman/util"
import type {TrustedEvent} from "@welshman/util"
import {deriveEvents} from "@welshman/store"
import type {MultiRequest} from "@welshman/net"
import {load, request, RequestEvent} from "@welshman/net"
import {load} from "@welshman/net"
import {pubkey, repository, displayProfileByPubkey} from "@welshman/app"
import {displayList} from "@lib/util"
import {isMobile, preventDefault, stopPropagation} from "@lib/html"
@@ -53,27 +52,24 @@
)
onMount(() => {
let req: MultiRequest
const controller = new AbortController()
if (url) {
req = request({
load({
relays: [url],
signal: controller.signal,
filters: [{kinds: [REACTION, REPORT, DELETE], "#e": [event.id]}],
})
req.on(
RequestEvent.Event,
batch(300, (events: TrustedEvent[]) => {
onEvent: batch(300, (events: TrustedEvent[]) => {
load({
relays: [url],
filters: [{kinds: [DELETE], "#e": events.map(e => e.id)}],
})
}),
)
})
}
return () => {
req?.close()
controller.abort()
}
})
</script>

View File

@@ -28,8 +28,7 @@ import {
} from "@welshman/util"
import type {TrustedEvent, Filter, List} from "@welshman/util"
import {feedFromFilters, makeRelayFeed, makeIntersectionFeed} from "@welshman/feeds"
import {load, request, RequestEvent} from "@welshman/net"
import type {MultiRequest} from "@welshman/net"
import {load, request} from "@welshman/net"
import type {AppSyncOpts, Thunk} from "@welshman/app"
import {
repository,
@@ -101,6 +100,7 @@ export const makeFeed = ({
const seen = new Set<string>()
const buffer = writable<TrustedEvent[]>([])
const events = writable(initialEvents)
const controller = new AbortController()
for (const event of initialEvents) {
if (!seen.has(event.id)) {
@@ -151,11 +151,14 @@ export const makeFeed = ({
onExhausted,
})
const req = request({relays, filters: subscriptionFilters})
req.on(RequestEvent.Event, (e: TrustedEvent) => {
if (matchFilters(feedFilters, e)) insertEvent(e)
if (e.kind === DELETE) handleDelete(e)
request({
relays,
signal: controller.signal,
filters: subscriptionFilters,
onEvent: (e: TrustedEvent) => {
if (matchFilters(feedFilters, e)) insertEvent(e)
if (e.kind === DELETE) handleDelete(e)
},
})
const scroller = createScroller({
@@ -178,9 +181,9 @@ export const makeFeed = ({
return {
events,
cleanup: () => {
req.close()
unsubscribe()
scroller.stop()
controller.abort()
},
}
}
@@ -201,6 +204,7 @@ export const makeCalendarFeed = ({
initialEvents?: TrustedEvent[]
}) => {
const interval = int(5, DAY)
const controller = new AbortController()
let exhaustedScrollers = 0
let backwardWindow = [now() - interval, now()]
@@ -242,22 +246,25 @@ export const makeCalendarFeed = ({
}
}
const req = request({relays, filters: subscriptionFilters})
req.on(RequestEvent.Event, (e: TrustedEvent) => {
if (matchFilters(feedFilters, e)) insertEvent(e)
request({
relays,
signal: controller.signal,
filters: subscriptionFilters,
onEvent: (e: TrustedEvent) => {
if (matchFilters(feedFilters, e)) insertEvent(e)
},
})
const loadTimeframe = (since: number, until: number) => {
const hashes = daysBetween(since, until).map(String)
const req = request({
request({
relays,
signal: controller.signal,
autoClose: true,
filters: [{kinds: [EVENT_TIME], "#D": hashes}],
onEvent: insertEvent,
})
req.on(RequestEvent.Event, insertEvent)
}
const maybeExhausted = () => {
@@ -306,8 +313,8 @@ export const makeCalendarFeed = ({
cleanup: () => {
backwardScroller.stop()
forwardScroller.stop()
controller.abort()
unsubscribe()
req.close()
},
}
}
@@ -329,7 +336,7 @@ export const loadAlertStatuses = (pubkey: string) =>
// Application requests
export const listenForNotifications = () => {
const reqs: MultiRequest[] = []
const controller = new AbortController()
for (const [url, allRooms] of userRoomsByUrl.get()) {
// Limit how many rooms we load at a time, since we have to send a separate filter
@@ -337,6 +344,7 @@ export const listenForNotifications = () => {
const rooms = shuffle(Array.from(allRooms)).slice(0, 30)
load({
signal: controller.signal,
relays: [url],
filters: [
{kinds: [THREAD], limit: 1},
@@ -347,23 +355,18 @@ export const listenForNotifications = () => {
],
})
reqs.push(
request({
relays: [url],
filters: [
{kinds: [THREAD, EVENT_TIME], since: now()},
{kinds: [COMMENT], "#K": [String(THREAD), String(EVENT_TIME)], since: now()},
...rooms.map(room => ({kinds: [MESSAGE], "#h": [room], since: now()})),
],
}),
)
request({
signal: controller.signal,
relays: [url],
filters: [
{kinds: [THREAD, EVENT_TIME], since: now()},
{kinds: [COMMENT], "#K": [String(THREAD), String(EVENT_TIME)], since: now()},
...rooms.map(room => ({kinds: [MESSAGE], "#h": [room], since: now()})),
],
})
}
return () => {
for (const req of reqs) {
req.close()
}
}
return () => controller.abort()
}
export const loadUserData = (pubkey: string, relays: string[] = []) => {

View File

@@ -332,7 +332,7 @@ export const {
name: "settings",
store: settings,
getKey: settings => settings.event.pubkey,
load: makeOutboxLoader([SETTINGS]),
load: makeOutboxLoader(SETTINGS),
})
// Alerts
@@ -409,7 +409,7 @@ export const {
name: "memberships",
store: memberships,
getKey: list => list.event.pubkey,
load: makeOutboxLoader([GROUPS]),
load: makeOutboxLoader(GROUPS),
})
// Chats

View File

@@ -160,14 +160,16 @@
)
// Listen for chats, populate chat-based notifications
let chatsReq: any
let controller: AbortController
derived([pubkey, canDecrypt, userInboxRelaySelections], identity).subscribe(
([$pubkey, $canDecrypt, $userInboxRelaySelections]) => {
chatsReq?.close()
controller?.abort()
controller = new AbortController()
if ($pubkey && $canDecrypt) {
chatsReq = request({
request({
signal: controller.signal,
filters: [
{kinds: [WRAP], "#p": [$pubkey], since: ago(WEEK, 2)},
{kinds: [WRAP], "#p": [$pubkey], limit: 100},

View File

@@ -3,7 +3,7 @@
import * as nip19 from "nostr-tools/nip19"
import type {TrustedEvent} from "@welshman/util"
import {Address, getIdFilters, getTagValue} from "@welshman/util"
import {request, RequestEvent} from "@welshman/net"
import {request} from "@welshman/net"
import {page} from "$app/stores"
import {goto} from "$app/navigation"
import {scrollToEvent} from "@lib/html"
@@ -21,29 +21,27 @@
let found = false
const req = request({
request({
autoClose: true,
filters: getIdFilters([type === "nevent" ? data.id : Address.fromNaddr(bech32).toString()]),
relays: data.relays,
})
onEvent: (event: TrustedEvent) => {
found = true
req.on(RequestEvent.Event, (event: TrustedEvent) => {
found = true
if (event.kind === 9) {
goto(makeRoomPath(data.relays[0], getTagValue("h", event.tags)!), {replaceState: true})
scrollToEvent(event.id)
} else if (event.kind === 11) {
goto(makeThreadPath(data.relays[0], event.id), {replaceState: true})
} else {
goto("/", {replaceState: true})
}
})
req.on(RequestEvent.Close, () => {
if (!found) {
goto("/", {replaceState: true})
}
if (event.kind === 9) {
goto(makeRoomPath(data.relays[0], getTagValue("h", event.tags)!), {replaceState: true})
scrollToEvent(event.id)
} else if (event.kind === 11) {
goto(makeThreadPath(data.relays[0], event.id), {replaceState: true})
} else {
goto("/", {replaceState: true})
}
},
onClose: () => {
if (!found) {
goto("/", {replaceState: true})
}
},
})
}

View File

@@ -65,10 +65,12 @@
})
// Completely refresh our groups list and listen for new ones
const req = request({relays, filters: [{kinds: [GROUPS]}]})
const controller = new AbortController()
request({relays, filters: [{kinds: [GROUPS]}], signal: controller.signal})
return () => {
req.close()
controller.abort()
}
})
</script>

View File

@@ -46,10 +46,12 @@
let showReply = $state(false)
onMount(() => {
const req = request({relays: [url], filters})
const controller = new AbortController()
request({relays: [url], filters, signal: controller.signal})
return () => {
req.close()
controller.abort()
setChecked($page.url.pathname)
}
})

View File

@@ -43,10 +43,12 @@
let showReply = $state(false)
onMount(() => {
const req = request({relays: [url], filters})
const controller = new AbortController()
request({relays: [url], filters, signal: controller.signal})
return () => {
req.close()
controller.abort()
setChecked($page.url.pathname)
}
})