mirror of
https://github.com/coracle-social/flotilla.git
synced 2025-12-10 02:47:06 +00:00
Update welshman
This commit is contained in:
22
package.json
22
package.json
@@ -52,17 +52,17 @@
|
|||||||
"@types/qrcode": "^1.5.5",
|
"@types/qrcode": "^1.5.5",
|
||||||
"@vite-pwa/assets-generator": "^0.2.6",
|
"@vite-pwa/assets-generator": "^0.2.6",
|
||||||
"@vite-pwa/sveltekit": "^0.6.6",
|
"@vite-pwa/sveltekit": "^0.6.6",
|
||||||
"@welshman/app": "^0.3.5",
|
"@welshman/app": "^0.3.7",
|
||||||
"@welshman/content": "^0.3.5",
|
"@welshman/content": "^0.3.7",
|
||||||
"@welshman/editor": "^0.3.5",
|
"@welshman/editor": "^0.3.7",
|
||||||
"@welshman/feeds": "^0.3.5",
|
"@welshman/feeds": "^0.3.7",
|
||||||
"@welshman/lib": "^0.3.5",
|
"@welshman/lib": "^0.3.7",
|
||||||
"@welshman/net": "^0.3.5",
|
"@welshman/net": "^0.3.7",
|
||||||
"@welshman/relay": "^0.3.5",
|
"@welshman/relay": "^0.3.7",
|
||||||
"@welshman/router": "^0.3.5",
|
"@welshman/router": "^0.3.7",
|
||||||
"@welshman/signer": "^0.3.5",
|
"@welshman/signer": "^0.3.7",
|
||||||
"@welshman/store": "^0.3.5",
|
"@welshman/store": "^0.3.7",
|
||||||
"@welshman/util": "^0.3.5",
|
"@welshman/util": "^0.3.7",
|
||||||
"compressorjs": "^1.2.1",
|
"compressorjs": "^1.2.1",
|
||||||
"daisyui": "^4.12.10",
|
"daisyui": "^4.12.10",
|
||||||
"date-picker-svelte": "^2.13.0",
|
"date-picker-svelte": "^2.13.0",
|
||||||
|
|||||||
BIN
pnpm-lock.yaml
generated
BIN
pnpm-lock.yaml
generated
Binary file not shown.
@@ -12,7 +12,7 @@ import {
|
|||||||
FOLLOWS,
|
FOLLOWS,
|
||||||
REACTION,
|
REACTION,
|
||||||
AUTH_JOIN,
|
AUTH_JOIN,
|
||||||
GROUPS,
|
ROOMS,
|
||||||
COMMENT,
|
COMMENT,
|
||||||
isSignedEvent,
|
isSignedEvent,
|
||||||
makeEvent,
|
makeEvent,
|
||||||
@@ -124,7 +124,7 @@ export const broadcastUserData = async (relays: string[]) => {
|
|||||||
// List updates
|
// List updates
|
||||||
|
|
||||||
export const addSpaceMembership = async (url: string) => {
|
export const addSpaceMembership = async (url: string) => {
|
||||||
const list = get(userMembership) || makeList({kind: GROUPS})
|
const list = get(userMembership) || makeList({kind: ROOMS})
|
||||||
const event = await addToListPublicly(list, ["r", url]).reconcile(nip44EncryptToSelf)
|
const event = await addToListPublicly(list, ["r", url]).reconcile(nip44EncryptToSelf)
|
||||||
const relays = uniq([...Router.get().FromUser().getUrls(), ...getRelayTagValues(event.tags)])
|
const relays = uniq([...Router.get().FromUser().getUrls(), ...getRelayTagValues(event.tags)])
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ export const addSpaceMembership = async (url: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const removeSpaceMembership = async (url: string) => {
|
export const removeSpaceMembership = async (url: string) => {
|
||||||
const list = get(userMembership) || makeList({kind: GROUPS})
|
const list = get(userMembership) || makeList({kind: ROOMS})
|
||||||
const pred = (t: string[]) => t[t[0] === "r" ? 1 : 2] === url
|
const pred = (t: string[]) => t[t[0] === "r" ? 1 : 2] === url
|
||||||
const event = await removeFromListByPredicate(list, pred).reconcile(nip44EncryptToSelf)
|
const event = await removeFromListByPredicate(list, pred).reconcile(nip44EncryptToSelf)
|
||||||
const relays = uniq([url, ...Router.get().FromUser().getUrls(), ...getRelayTagValues(event.tags)])
|
const relays = uniq([url, ...Router.get().FromUser().getUrls(), ...getRelayTagValues(event.tags)])
|
||||||
@@ -141,7 +141,7 @@ export const removeSpaceMembership = async (url: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const addRoomMembership = async (url: string, room: string) => {
|
export const addRoomMembership = async (url: string, room: string) => {
|
||||||
const list = get(userMembership) || makeList({kind: GROUPS})
|
const list = get(userMembership) || makeList({kind: ROOMS})
|
||||||
const newTags = [
|
const newTags = [
|
||||||
["r", url],
|
["r", url],
|
||||||
["group", room, url],
|
["group", room, url],
|
||||||
@@ -153,7 +153,7 @@ export const addRoomMembership = async (url: string, room: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const removeRoomMembership = async (url: string, room: string) => {
|
export const removeRoomMembership = async (url: string, room: string) => {
|
||||||
const list = get(userMembership) || makeList({kind: GROUPS})
|
const list = get(userMembership) || makeList({kind: ROOMS})
|
||||||
const pred = (t: string[]) => equals(["group", room, url], t.slice(0, 3))
|
const pred = (t: string[]) => equals(["group", room, url], t.slice(0, 3))
|
||||||
const event = await removeFromListByPredicate(list, pred).reconcile(nip44EncryptToSelf)
|
const event = await removeFromListByPredicate(list, pred).reconcile(nip44EncryptToSelf)
|
||||||
const relays = uniq([url, ...Router.get().FromUser().getUrls(), ...getRelayTagValues(event.tags)])
|
const relays = uniq([url, ...Router.get().FromUser().getUrls(), ...getRelayTagValues(event.tags)])
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
import type {Filter} from "@welshman/util"
|
import type {Filter} from "@welshman/util"
|
||||||
import {deriveEvents} from "@welshman/store"
|
import {deriveEvents} from "@welshman/store"
|
||||||
import {formatTimestampRelative} from "@welshman/lib"
|
import {formatTimestampRelative} from "@welshman/lib"
|
||||||
import {NOTE, GROUPS, MESSAGE, THREAD, COMMENT, getRelayTags, getListTags} from "@welshman/util"
|
import {NOTE, ROOMS, MESSAGE, THREAD, COMMENT, getRelayTags, getListTags} from "@welshman/util"
|
||||||
import {repository, loadRelaySelections} from "@welshman/app"
|
import {repository, loadRelaySelections} from "@welshman/app"
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
import ProfileSpaces from "@app/components/ProfileSpaces.svelte"
|
import ProfileSpaces from "@app/components/ProfileSpaces.svelte"
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
// Load groups and at least one note, regardless of time frame
|
// Load groups and at least one note, regardless of time frame
|
||||||
load({
|
load({
|
||||||
filters: [
|
filters: [
|
||||||
{authors: [pubkey], kinds: [GROUPS]},
|
{authors: [pubkey], kinds: [ROOMS]},
|
||||||
{authors: [pubkey], limit: 1, kinds: [NOTE, MESSAGE, THREAD, COMMENT]},
|
{authors: [pubkey], limit: 1, kinds: [NOTE, MESSAGE, THREAD, COMMENT]},
|
||||||
],
|
],
|
||||||
relays: Router.get().FromPubkeys([pubkey]).getUrls(),
|
relays: Router.get().FromPubkeys([pubkey]).getUrls(),
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import {nthEq} from "@welshman/lib"
|
||||||
import type {Profile} from "@welshman/util"
|
import type {Profile} from "@welshman/util"
|
||||||
import {
|
import {
|
||||||
getTag,
|
getTag,
|
||||||
@@ -29,10 +30,10 @@
|
|||||||
|
|
||||||
if (shouldBroadcast) {
|
if (shouldBroadcast) {
|
||||||
const router = Router.get()
|
const router = Router.get()
|
||||||
|
const scenario = router.merge([router.FromUser(), router.Index()])
|
||||||
|
|
||||||
relays.push(
|
relays.push(...scenario.policy(addMaximalFallbacks).getUrls())
|
||||||
...router.merge([router.FromUser(), router.Index()]).policy(addMaximalFallbacks).getUrls(),
|
template.tags = template.tags.filter(nthEq(0, "-"))
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
template.tags = uniqTags([...template.tags, PROTECTED])
|
template.tags = uniqTags([...template.tags, PROTECTED])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {goto} from "$app/navigation"
|
import {goto} from "$app/navigation"
|
||||||
import {randomId} from "@welshman/lib"
|
import {uniqBy, nth} from "@welshman/lib"
|
||||||
import {displayRelayUrl} from "@welshman/util"
|
import {displayRelayUrl, makeRoomMeta} from "@welshman/util"
|
||||||
import {deriveRelay, getThunkError, createRoom, editRoom, joinRoom} from "@welshman/app"
|
import {deriveRelay, getThunkError, createRoom, editRoom, joinRoom} from "@welshman/app"
|
||||||
import {preventDefault} from "@lib/html"
|
import {preventDefault} from "@lib/html"
|
||||||
import Field from "@lib/components/Field.svelte"
|
import Field from "@lib/components/Field.svelte"
|
||||||
@@ -16,19 +16,21 @@
|
|||||||
|
|
||||||
const {url} = $props()
|
const {url} = $props()
|
||||||
|
|
||||||
const room = randomId()
|
const room = makeRoomMeta()
|
||||||
const relay = deriveRelay(url)
|
const relay = deriveRelay(url)
|
||||||
|
|
||||||
const back = () => history.back()
|
const back = () => history.back()
|
||||||
|
|
||||||
const tryCreate = async () => {
|
const tryCreate = async () => {
|
||||||
|
room.tags = uniqBy(nth(0), [...room.tags, ["name", name]])
|
||||||
|
|
||||||
const createMessage = await getThunkError(createRoom(url, room))
|
const createMessage = await getThunkError(createRoom(url, room))
|
||||||
|
|
||||||
if (createMessage && !createMessage.match(/^duplicate:|already a member/)) {
|
if (createMessage && !createMessage.match(/^duplicate:|already a member/)) {
|
||||||
return pushToast({theme: "error", message: createMessage})
|
return pushToast({theme: "error", message: createMessage})
|
||||||
}
|
}
|
||||||
|
|
||||||
const editMessage = await getThunkError(editRoom(url, room, {name}))
|
const editMessage = await getThunkError(editRoom(url, room))
|
||||||
|
|
||||||
if (editMessage) {
|
if (editMessage) {
|
||||||
return pushToast({theme: "error", message: editMessage})
|
return pushToast({theme: "error", message: editMessage})
|
||||||
@@ -40,9 +42,9 @@
|
|||||||
return pushToast({theme: "error", message: joinMessage})
|
return pushToast({theme: "error", message: joinMessage})
|
||||||
}
|
}
|
||||||
|
|
||||||
await loadChannel(url, room)
|
await loadChannel(url, room.id)
|
||||||
|
|
||||||
goto(makeSpacePath(url, room))
|
goto(makeSpacePath(url, room.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
const create = async () => {
|
const create = async () => {
|
||||||
|
|||||||
@@ -33,14 +33,14 @@ import {
|
|||||||
ZAP_RESPONSE,
|
ZAP_RESPONSE,
|
||||||
DIRECT_MESSAGE,
|
DIRECT_MESSAGE,
|
||||||
DIRECT_MESSAGE_FILE,
|
DIRECT_MESSAGE_FILE,
|
||||||
GROUP_META,
|
ROOM_META,
|
||||||
MESSAGE,
|
MESSAGE,
|
||||||
GROUPS,
|
ROOMS,
|
||||||
THREAD,
|
THREAD,
|
||||||
COMMENT,
|
COMMENT,
|
||||||
GROUP_JOIN,
|
ROOM_JOIN,
|
||||||
GROUP_ADD_USER,
|
ROOM_ADD_USER,
|
||||||
GROUP_REMOVE_USER,
|
ROOM_REMOVE_USER,
|
||||||
getGroupTags,
|
getGroupTags,
|
||||||
getRelayTagValues,
|
getRelayTagValues,
|
||||||
getPubkeyTagValues,
|
getPubkeyTagValues,
|
||||||
@@ -124,7 +124,7 @@ export const REACTION_KINDS = [REACTION, ZAP_RESPONSE]
|
|||||||
|
|
||||||
export const NIP46_PERMS =
|
export const NIP46_PERMS =
|
||||||
"nip44_encrypt,nip44_decrypt," +
|
"nip44_encrypt,nip44_decrypt," +
|
||||||
[CLIENT_AUTH, AUTH_JOIN, MESSAGE, THREAD, COMMENT, GROUPS, WRAP, REACTION]
|
[CLIENT_AUTH, AUTH_JOIN, MESSAGE, THREAD, COMMENT, ROOMS, WRAP, REACTION]
|
||||||
.map(k => `sign_event:${k}`)
|
.map(k => `sign_event:${k}`)
|
||||||
.join(",")
|
.join(",")
|
||||||
|
|
||||||
@@ -397,7 +397,7 @@ export const getMembershipRoomsByUrl = (url: string, list?: List) =>
|
|||||||
sort(getGroupTags(getListTags(list)).filter(nthEq(2, url)).map(nth(1)))
|
sort(getGroupTags(getListTags(list)).filter(nthEq(2, url)).map(nth(1)))
|
||||||
|
|
||||||
export const memberships = deriveEventsMapped<PublishedList>(repository, {
|
export const memberships = deriveEventsMapped<PublishedList>(repository, {
|
||||||
filters: [{kinds: [GROUPS]}],
|
filters: [{kinds: [ROOMS]}],
|
||||||
itemToEvent: item => item.event,
|
itemToEvent: item => item.event,
|
||||||
eventToItem: (event: TrustedEvent) => readList(asDecryptedEvent(event)),
|
eventToItem: (event: TrustedEvent) => readList(asDecryptedEvent(event)),
|
||||||
})
|
})
|
||||||
@@ -410,7 +410,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(ROOMS),
|
||||||
})
|
})
|
||||||
|
|
||||||
// Chats
|
// Chats
|
||||||
@@ -508,7 +508,7 @@ export const splitChannelId = (id: string) => id.split("'")
|
|||||||
export const hasNip29 = (relay?: Relay) =>
|
export const hasNip29 = (relay?: Relay) =>
|
||||||
relay?.profile?.supported_nips?.map?.(String)?.includes?.("29")
|
relay?.profile?.supported_nips?.map?.(String)?.includes?.("29")
|
||||||
|
|
||||||
export const channelEvents = deriveEvents(repository, {filters: [{kinds: [GROUP_META]}]})
|
export const channelEvents = deriveEvents(repository, {filters: [{kinds: [ROOM_META]}]})
|
||||||
|
|
||||||
export const channels = derived(
|
export const channels = derived(
|
||||||
[channelEvents, getUrlsForEvent],
|
[channelEvents, getUrlsForEvent],
|
||||||
@@ -557,7 +557,7 @@ export const {
|
|||||||
|
|
||||||
await load({
|
await load({
|
||||||
relays: [url],
|
relays: [url],
|
||||||
filters: [{kinds: [GROUP_META], "#d": [room]}],
|
filters: [{kinds: [ROOM_META], "#d": [room]}],
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -643,22 +643,22 @@ export const deriveUserMembershipStatus = (url: string, room: string) =>
|
|||||||
[
|
[
|
||||||
pubkey,
|
pubkey,
|
||||||
deriveEventsForUrl(url, [
|
deriveEventsForUrl(url, [
|
||||||
{kinds: [GROUP_JOIN, GROUP_ADD_USER, GROUP_REMOVE_USER], "#h": [room]},
|
{kinds: [ROOM_JOIN, ROOM_ADD_USER, ROOM_REMOVE_USER], "#h": [room]},
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
([$pubkey, $events]) => {
|
([$pubkey, $events]) => {
|
||||||
let status = MembershipStatus.Initial
|
let status = MembershipStatus.Initial
|
||||||
|
|
||||||
for (const event of $events) {
|
for (const event of $events) {
|
||||||
if (event.kind === GROUP_JOIN && event.pubkey === $pubkey) {
|
if (event.kind === ROOM_JOIN && event.pubkey === $pubkey) {
|
||||||
status = MembershipStatus.Pending
|
status = MembershipStatus.Pending
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.kind === GROUP_REMOVE_USER && getTagValues("p", event.tags).includes($pubkey!)) {
|
if (event.kind === ROOM_REMOVE_USER && getTagValues("p", event.tags).includes($pubkey!)) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.kind === GROUP_ADD_USER && getTagValues("p", event.tags).includes($pubkey!)) {
|
if (event.kind === ROOM_ADD_USER && getTagValues("p", event.tags).includes($pubkey!)) {
|
||||||
return MembershipStatus.Granted
|
return MembershipStatus.Granted
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {onMount} from "svelte"
|
import {onMount} from "svelte"
|
||||||
import {addToMapKey, dec, gt} from "@welshman/lib"
|
import {addToMapKey, dec, gt} from "@welshman/lib"
|
||||||
import {GROUPS} from "@welshman/util"
|
import {ROOMS} from "@welshman/util"
|
||||||
import {Router} from "@welshman/router"
|
import {Router} from "@welshman/router"
|
||||||
import {load} from "@welshman/net"
|
import {load} from "@welshman/net"
|
||||||
import type {Relay} from "@welshman/app"
|
import type {Relay} from "@welshman/app"
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
const discoverRelays = () =>
|
const discoverRelays = () =>
|
||||||
Promise.all([
|
Promise.all([
|
||||||
load({
|
load({
|
||||||
filters: [{kinds: [GROUPS]}],
|
filters: [{kinds: [ROOMS]}],
|
||||||
relays: Router.get().Index().getUrls(),
|
relays: Router.get().Index().getUrls(),
|
||||||
}),
|
}),
|
||||||
...getDefaultPubkeys().map(async pubkey => {
|
...getDefaultPubkeys().map(async pubkey => {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import {onMount} from "svelte"
|
import {onMount} from "svelte"
|
||||||
import {page} from "$app/stores"
|
import {page} from "$app/stores"
|
||||||
import {ago, MONTH} from "@welshman/lib"
|
import {ago, MONTH} from "@welshman/lib"
|
||||||
import {GROUP_META, EVENT_TIME, THREAD, COMMENT, MESSAGE} from "@welshman/util"
|
import {ROOM_META, EVENT_TIME, THREAD, COMMENT, MESSAGE} from "@welshman/util"
|
||||||
import Page from "@lib/components/Page.svelte"
|
import Page from "@lib/components/Page.svelte"
|
||||||
import SecondaryNav from "@lib/components/SecondaryNav.svelte"
|
import SecondaryNav from "@lib/components/SecondaryNav.svelte"
|
||||||
import MenuSpace from "@app/components/MenuSpace.svelte"
|
import MenuSpace from "@app/components/MenuSpace.svelte"
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
pullConservatively({
|
pullConservatively({
|
||||||
relays,
|
relays,
|
||||||
filters: [
|
filters: [
|
||||||
{kinds: [GROUP_META]},
|
{kinds: [ROOM_META]},
|
||||||
{kinds: [THREAD, EVENT_TIME], since},
|
{kinds: [THREAD, EVENT_TIME], since},
|
||||||
{kinds: [COMMENT], "#K": [String(THREAD), String(EVENT_TIME)], since},
|
{kinds: [COMMENT], "#K": [String(THREAD), String(EVENT_TIME)], since},
|
||||||
...rooms.map(room => ({kinds: [MESSAGE], "#h": [room], since})),
|
...rooms.map(room => ({kinds: [MESSAGE], "#h": [room], since})),
|
||||||
|
|||||||
@@ -9,11 +9,12 @@
|
|||||||
import type {TrustedEvent, EventContent} from "@welshman/util"
|
import type {TrustedEvent, EventContent} from "@welshman/util"
|
||||||
import {
|
import {
|
||||||
makeEvent,
|
makeEvent,
|
||||||
|
makeRoomMeta,
|
||||||
MESSAGE,
|
MESSAGE,
|
||||||
DELETE,
|
DELETE,
|
||||||
REACTION,
|
REACTION,
|
||||||
GROUP_ADD_USER,
|
ROOM_ADD_USER,
|
||||||
GROUP_REMOVE_USER,
|
ROOM_REMOVE_USER,
|
||||||
} from "@welshman/util"
|
} from "@welshman/util"
|
||||||
import {pubkey, publishThunk, getThunkError, joinRoom, leaveRoom} from "@welshman/app"
|
import {pubkey, publishThunk, getThunkError, joinRoom, leaveRoom} from "@welshman/app"
|
||||||
import {slide, fade, fly} from "@lib/transition"
|
import {slide, fade, fly} from "@lib/transition"
|
||||||
@@ -61,7 +62,7 @@
|
|||||||
joining = true
|
joining = true
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const message = await getThunkError(joinRoom(url, room))
|
const message = await getThunkError(joinRoom(url, makeRoomMeta({id: room})))
|
||||||
|
|
||||||
if (message && !message.startsWith("duplicate:")) {
|
if (message && !message.startsWith("duplicate:")) {
|
||||||
return pushToast({theme: "error", message})
|
return pushToast({theme: "error", message})
|
||||||
@@ -77,7 +78,7 @@
|
|||||||
const leave = async () => {
|
const leave = async () => {
|
||||||
leaving = true
|
leaving = true
|
||||||
try {
|
try {
|
||||||
const message = await getThunkError(leaveRoom(url, room))
|
const message = await getThunkError(leaveRoom(url, makeRoomMeta({id: room})))
|
||||||
|
|
||||||
if (message && !message.startsWith("duplicate:")) {
|
if (message && !message.startsWith("duplicate:")) {
|
||||||
pushToast({theme: "error", message})
|
pushToast({theme: "error", message})
|
||||||
@@ -244,7 +245,7 @@
|
|||||||
relays: [url],
|
relays: [url],
|
||||||
filters: [
|
filters: [
|
||||||
{
|
{
|
||||||
kinds: [GROUP_ADD_USER, GROUP_REMOVE_USER],
|
kinds: [ROOM_ADD_USER, ROOM_REMOVE_USER],
|
||||||
"#p": [$pubkey!],
|
"#p": [$pubkey!],
|
||||||
"#h": [room],
|
"#h": [room],
|
||||||
limit: 10,
|
limit: 10,
|
||||||
|
|||||||
Reference in New Issue
Block a user