bfd91f2d39
tests / tests (push) Failing after 5m7s
Replace the single DomainObject/EncryptableList classes with a read/write split that removes the optional-event ambiguity: - base.ts: EventReader<P> (static kind; fromEvent(event, signer?) eagerly computes a generic `plain`, validates leniently, throws-or-passes; lazy method accessors; group/protect/expires + extraTags carry-over; builder()) and EventBuilder<P> (chainable setters, buildTags/buildContent, validate-on-emit). - List.ts: ListReader/ListBuilder for NIP-51 lists (decrypt-on-read into `plain`, re-encrypt-on-emit, tag mutators). - Every kind converted to a <Noun> reader + <Noun>Builder pair; membership ops split into per-kind reader/builder pairs over a shared abstract base. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V67tPYdvh1qCkjEBhJGZUR
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import {uniqBy} from "@welshman/lib"
|
|
import {MESSAGING_RELAYS, getTagValues, normalizeRelayUrl} from "@welshman/util"
|
|
import {ListReader, ListBuilder} from "./List.js"
|
|
|
|
// NIP-17 kind-10050 messaging/inbox relays. Entries are marker-less
|
|
// ['relay', url] tags (NOT NIP-65 'r' tags with read/write markers, and the
|
|
// RelayMode.Messaging marker is not used per-tag here). `urls()` drives where
|
|
// encrypted DM gift-wraps are sent and fetched, so it stays a flat, normalized
|
|
// set. Identical structure to BlockedRelayList/SearchRelayList.
|
|
export class MessagingRelayList extends ListReader {
|
|
static kind = MESSAGING_RELAYS
|
|
|
|
urls() {
|
|
return uniqBy(normalizeRelayUrl, getTagValues("relay", this.tags()))
|
|
}
|
|
|
|
builder() {
|
|
return this.seedList(new MessagingRelayListBuilder())
|
|
}
|
|
}
|
|
|
|
export class MessagingRelayListBuilder extends ListBuilder {
|
|
static kind = MESSAGING_RELAYS
|
|
|
|
addRelay(url: string) {
|
|
return this.addPublicTags(["relay", normalizeRelayUrl(url)])
|
|
}
|
|
|
|
removeRelay(url: string) {
|
|
return this.removeTagsWithValue(normalizeRelayUrl(url))
|
|
}
|
|
|
|
setRelays(urls: string[]) {
|
|
this.clearTags()
|
|
|
|
return this.addPublicTags(...urls.map(url => ["relay", normalizeRelayUrl(url)]))
|
|
}
|
|
}
|