forked from coracle/flotilla
Update welshman stuff again
This commit is contained in:
@@ -113,7 +113,9 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
const observer = new ResizeObserver(() => {
|
const observer = new ResizeObserver(() => {
|
||||||
dynamicPadding!.style.minHeight = `${chatCompose!.offsetHeight}px`
|
if (dynamicPadding && chatCompose) {
|
||||||
|
dynamicPadding.style.minHeight = `${chatCompose.offsetHeight}px`
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
observer.observe(chatCompose!)
|
observer.observe(chatCompose!)
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
import {REACTION, getTag, REPORT, DELETE} from "@welshman/util"
|
import {REACTION, getTag, REPORT, DELETE} from "@welshman/util"
|
||||||
import type {TrustedEvent} from "@welshman/util"
|
import type {TrustedEvent} from "@welshman/util"
|
||||||
import {deriveEvents} from "@welshman/store"
|
import {deriveEvents} from "@welshman/store"
|
||||||
import type {MultiRequest} from "@welshman/net"
|
import {load} from "@welshman/net"
|
||||||
import {load, request, RequestEvent} from "@welshman/net"
|
|
||||||
import {pubkey, repository, displayProfileByPubkey} from "@welshman/app"
|
import {pubkey, repository, displayProfileByPubkey} from "@welshman/app"
|
||||||
import {displayList} from "@lib/util"
|
import {displayList} from "@lib/util"
|
||||||
import {isMobile, preventDefault, stopPropagation} from "@lib/html"
|
import {isMobile, preventDefault, stopPropagation} from "@lib/html"
|
||||||
@@ -53,27 +52,24 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
let req: MultiRequest
|
const controller = new AbortController()
|
||||||
|
|
||||||
if (url) {
|
if (url) {
|
||||||
req = request({
|
load({
|
||||||
relays: [url],
|
relays: [url],
|
||||||
|
signal: controller.signal,
|
||||||
filters: [{kinds: [REACTION, REPORT, DELETE], "#e": [event.id]}],
|
filters: [{kinds: [REACTION, REPORT, DELETE], "#e": [event.id]}],
|
||||||
})
|
onEvent: batch(300, (events: TrustedEvent[]) => {
|
||||||
|
|
||||||
req.on(
|
|
||||||
RequestEvent.Event,
|
|
||||||
batch(300, (events: TrustedEvent[]) => {
|
|
||||||
load({
|
load({
|
||||||
relays: [url],
|
relays: [url],
|
||||||
filters: [{kinds: [DELETE], "#e": events.map(e => e.id)}],
|
filters: [{kinds: [DELETE], "#e": events.map(e => e.id)}],
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
)
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
req?.close()
|
controller.abort()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
+35
-32
@@ -28,8 +28,7 @@ import {
|
|||||||
} from "@welshman/util"
|
} from "@welshman/util"
|
||||||
import type {TrustedEvent, Filter, List} from "@welshman/util"
|
import type {TrustedEvent, Filter, List} from "@welshman/util"
|
||||||
import {feedFromFilters, makeRelayFeed, makeIntersectionFeed} from "@welshman/feeds"
|
import {feedFromFilters, makeRelayFeed, makeIntersectionFeed} from "@welshman/feeds"
|
||||||
import {load, request, RequestEvent} from "@welshman/net"
|
import {load, request} from "@welshman/net"
|
||||||
import type {MultiRequest} from "@welshman/net"
|
|
||||||
import type {AppSyncOpts, Thunk} from "@welshman/app"
|
import type {AppSyncOpts, Thunk} from "@welshman/app"
|
||||||
import {
|
import {
|
||||||
repository,
|
repository,
|
||||||
@@ -101,6 +100,7 @@ export const makeFeed = ({
|
|||||||
const seen = new Set<string>()
|
const seen = new Set<string>()
|
||||||
const buffer = writable<TrustedEvent[]>([])
|
const buffer = writable<TrustedEvent[]>([])
|
||||||
const events = writable(initialEvents)
|
const events = writable(initialEvents)
|
||||||
|
const controller = new AbortController()
|
||||||
|
|
||||||
for (const event of initialEvents) {
|
for (const event of initialEvents) {
|
||||||
if (!seen.has(event.id)) {
|
if (!seen.has(event.id)) {
|
||||||
@@ -151,11 +151,14 @@ export const makeFeed = ({
|
|||||||
onExhausted,
|
onExhausted,
|
||||||
})
|
})
|
||||||
|
|
||||||
const req = request({relays, filters: subscriptionFilters})
|
request({
|
||||||
|
relays,
|
||||||
req.on(RequestEvent.Event, (e: TrustedEvent) => {
|
signal: controller.signal,
|
||||||
if (matchFilters(feedFilters, e)) insertEvent(e)
|
filters: subscriptionFilters,
|
||||||
if (e.kind === DELETE) handleDelete(e)
|
onEvent: (e: TrustedEvent) => {
|
||||||
|
if (matchFilters(feedFilters, e)) insertEvent(e)
|
||||||
|
if (e.kind === DELETE) handleDelete(e)
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const scroller = createScroller({
|
const scroller = createScroller({
|
||||||
@@ -178,9 +181,9 @@ export const makeFeed = ({
|
|||||||
return {
|
return {
|
||||||
events,
|
events,
|
||||||
cleanup: () => {
|
cleanup: () => {
|
||||||
req.close()
|
|
||||||
unsubscribe()
|
unsubscribe()
|
||||||
scroller.stop()
|
scroller.stop()
|
||||||
|
controller.abort()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,6 +204,7 @@ export const makeCalendarFeed = ({
|
|||||||
initialEvents?: TrustedEvent[]
|
initialEvents?: TrustedEvent[]
|
||||||
}) => {
|
}) => {
|
||||||
const interval = int(5, DAY)
|
const interval = int(5, DAY)
|
||||||
|
const controller = new AbortController()
|
||||||
|
|
||||||
let exhaustedScrollers = 0
|
let exhaustedScrollers = 0
|
||||||
let backwardWindow = [now() - interval, now()]
|
let backwardWindow = [now() - interval, now()]
|
||||||
@@ -242,22 +246,25 @@ export const makeCalendarFeed = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const req = request({relays, filters: subscriptionFilters})
|
request({
|
||||||
|
relays,
|
||||||
req.on(RequestEvent.Event, (e: TrustedEvent) => {
|
signal: controller.signal,
|
||||||
if (matchFilters(feedFilters, e)) insertEvent(e)
|
filters: subscriptionFilters,
|
||||||
|
onEvent: (e: TrustedEvent) => {
|
||||||
|
if (matchFilters(feedFilters, e)) insertEvent(e)
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const loadTimeframe = (since: number, until: number) => {
|
const loadTimeframe = (since: number, until: number) => {
|
||||||
const hashes = daysBetween(since, until).map(String)
|
const hashes = daysBetween(since, until).map(String)
|
||||||
|
|
||||||
const req = request({
|
request({
|
||||||
relays,
|
relays,
|
||||||
|
signal: controller.signal,
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
filters: [{kinds: [EVENT_TIME], "#D": hashes}],
|
filters: [{kinds: [EVENT_TIME], "#D": hashes}],
|
||||||
|
onEvent: insertEvent,
|
||||||
})
|
})
|
||||||
|
|
||||||
req.on(RequestEvent.Event, insertEvent)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const maybeExhausted = () => {
|
const maybeExhausted = () => {
|
||||||
@@ -306,8 +313,8 @@ export const makeCalendarFeed = ({
|
|||||||
cleanup: () => {
|
cleanup: () => {
|
||||||
backwardScroller.stop()
|
backwardScroller.stop()
|
||||||
forwardScroller.stop()
|
forwardScroller.stop()
|
||||||
|
controller.abort()
|
||||||
unsubscribe()
|
unsubscribe()
|
||||||
req.close()
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -329,7 +336,7 @@ export const loadAlertStatuses = (pubkey: string) =>
|
|||||||
// Application requests
|
// Application requests
|
||||||
|
|
||||||
export const listenForNotifications = () => {
|
export const listenForNotifications = () => {
|
||||||
const reqs: MultiRequest[] = []
|
const controller = new AbortController()
|
||||||
|
|
||||||
for (const [url, allRooms] of userRoomsByUrl.get()) {
|
for (const [url, allRooms] of userRoomsByUrl.get()) {
|
||||||
// Limit how many rooms we load at a time, since we have to send a separate filter
|
// 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)
|
const rooms = shuffle(Array.from(allRooms)).slice(0, 30)
|
||||||
|
|
||||||
load({
|
load({
|
||||||
|
signal: controller.signal,
|
||||||
relays: [url],
|
relays: [url],
|
||||||
filters: [
|
filters: [
|
||||||
{kinds: [THREAD], limit: 1},
|
{kinds: [THREAD], limit: 1},
|
||||||
@@ -347,23 +355,18 @@ export const listenForNotifications = () => {
|
|||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
reqs.push(
|
request({
|
||||||
request({
|
signal: controller.signal,
|
||||||
relays: [url],
|
relays: [url],
|
||||||
filters: [
|
filters: [
|
||||||
{kinds: [THREAD, EVENT_TIME], since: now()},
|
{kinds: [THREAD, EVENT_TIME], since: now()},
|
||||||
{kinds: [COMMENT], "#K": [String(THREAD), String(EVENT_TIME)], since: now()},
|
{kinds: [COMMENT], "#K": [String(THREAD), String(EVENT_TIME)], since: now()},
|
||||||
...rooms.map(room => ({kinds: [MESSAGE], "#h": [room], since: now()})),
|
...rooms.map(room => ({kinds: [MESSAGE], "#h": [room], since: now()})),
|
||||||
],
|
],
|
||||||
}),
|
})
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return () => {
|
return () => controller.abort()
|
||||||
for (const req of reqs) {
|
|
||||||
req.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const loadUserData = (pubkey: string, relays: string[] = []) => {
|
export const loadUserData = (pubkey: string, relays: string[] = []) => {
|
||||||
|
|||||||
+2
-2
@@ -332,7 +332,7 @@ export const {
|
|||||||
name: "settings",
|
name: "settings",
|
||||||
store: settings,
|
store: settings,
|
||||||
getKey: settings => settings.event.pubkey,
|
getKey: settings => settings.event.pubkey,
|
||||||
load: makeOutboxLoader([SETTINGS]),
|
load: makeOutboxLoader(SETTINGS),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Alerts
|
// Alerts
|
||||||
@@ -409,7 +409,7 @@ export const {
|
|||||||
name: "memberships",
|
name: "memberships",
|
||||||
store: memberships,
|
store: memberships,
|
||||||
getKey: list => list.event.pubkey,
|
getKey: list => list.event.pubkey,
|
||||||
load: makeOutboxLoader([GROUPS]),
|
load: makeOutboxLoader(GROUPS),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Chats
|
// Chats
|
||||||
|
|||||||
@@ -160,14 +160,16 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Listen for chats, populate chat-based notifications
|
// Listen for chats, populate chat-based notifications
|
||||||
let chatsReq: any
|
let controller: AbortController
|
||||||
|
|
||||||
derived([pubkey, canDecrypt, userInboxRelaySelections], identity).subscribe(
|
derived([pubkey, canDecrypt, userInboxRelaySelections], identity).subscribe(
|
||||||
([$pubkey, $canDecrypt, $userInboxRelaySelections]) => {
|
([$pubkey, $canDecrypt, $userInboxRelaySelections]) => {
|
||||||
chatsReq?.close()
|
controller?.abort()
|
||||||
|
controller = new AbortController()
|
||||||
|
|
||||||
if ($pubkey && $canDecrypt) {
|
if ($pubkey && $canDecrypt) {
|
||||||
chatsReq = request({
|
request({
|
||||||
|
signal: controller.signal,
|
||||||
filters: [
|
filters: [
|
||||||
{kinds: [WRAP], "#p": [$pubkey], since: ago(WEEK, 2)},
|
{kinds: [WRAP], "#p": [$pubkey], since: ago(WEEK, 2)},
|
||||||
{kinds: [WRAP], "#p": [$pubkey], limit: 100},
|
{kinds: [WRAP], "#p": [$pubkey], limit: 100},
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import * as nip19 from "nostr-tools/nip19"
|
import * as nip19 from "nostr-tools/nip19"
|
||||||
import type {TrustedEvent} from "@welshman/util"
|
import type {TrustedEvent} from "@welshman/util"
|
||||||
import {Address, getIdFilters, getTagValue} 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 {page} from "$app/stores"
|
||||||
import {goto} from "$app/navigation"
|
import {goto} from "$app/navigation"
|
||||||
import {scrollToEvent} from "@lib/html"
|
import {scrollToEvent} from "@lib/html"
|
||||||
@@ -21,29 +21,27 @@
|
|||||||
|
|
||||||
let found = false
|
let found = false
|
||||||
|
|
||||||
const req = request({
|
request({
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
filters: getIdFilters([type === "nevent" ? data.id : Address.fromNaddr(bech32).toString()]),
|
filters: getIdFilters([type === "nevent" ? data.id : Address.fromNaddr(bech32).toString()]),
|
||||||
relays: data.relays,
|
relays: data.relays,
|
||||||
})
|
onEvent: (event: TrustedEvent) => {
|
||||||
|
found = true
|
||||||
|
|
||||||
req.on(RequestEvent.Event, (event: TrustedEvent) => {
|
if (event.kind === 9) {
|
||||||
found = true
|
goto(makeRoomPath(data.relays[0], getTagValue("h", event.tags)!), {replaceState: true})
|
||||||
|
scrollToEvent(event.id)
|
||||||
if (event.kind === 9) {
|
} else if (event.kind === 11) {
|
||||||
goto(makeRoomPath(data.relays[0], getTagValue("h", event.tags)!), {replaceState: true})
|
goto(makeThreadPath(data.relays[0], event.id), {replaceState: true})
|
||||||
scrollToEvent(event.id)
|
} else {
|
||||||
} else if (event.kind === 11) {
|
goto("/", {replaceState: true})
|
||||||
goto(makeThreadPath(data.relays[0], event.id), {replaceState: true})
|
}
|
||||||
} else {
|
},
|
||||||
goto("/", {replaceState: true})
|
onClose: () => {
|
||||||
}
|
if (!found) {
|
||||||
})
|
goto("/", {replaceState: true})
|
||||||
|
}
|
||||||
req.on(RequestEvent.Close, () => {
|
},
|
||||||
if (!found) {
|
|
||||||
goto("/", {replaceState: true})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,10 +65,12 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Completely refresh our groups list and listen for new ones
|
// 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 () => {
|
return () => {
|
||||||
req.close()
|
controller.abort()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -46,10 +46,12 @@
|
|||||||
let showReply = $state(false)
|
let showReply = $state(false)
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
const req = request({relays: [url], filters})
|
const controller = new AbortController()
|
||||||
|
|
||||||
|
request({relays: [url], filters, signal: controller.signal})
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
req.close()
|
controller.abort()
|
||||||
setChecked($page.url.pathname)
|
setChecked($page.url.pathname)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -43,10 +43,12 @@
|
|||||||
let showReply = $state(false)
|
let showReply = $state(false)
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
const req = request({relays: [url], filters})
|
const controller = new AbortController()
|
||||||
|
|
||||||
|
request({relays: [url], filters, signal: controller.signal})
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
req.close()
|
controller.abort()
|
||||||
setChecked($page.url.pathname)
|
setChecked($page.url.pathname)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user