ndb: make NostrEvents immutable

Since we can't mutate NdbNotes, let's update the existing codebase to
generate and sign ids on NostrEvent constructions. This will allow us to
match NdbNote's constructor
This commit is contained in:
William Casarin
2023-07-25 08:58:06 -07:00
parent e3c04465fc
commit 2f8aa29e92
47 changed files with 2211 additions and 462 deletions

View File

@@ -140,12 +140,11 @@ struct EventActionBar: View {
}
func send_like() {
guard let privkey = damus_state.keypair.privkey else {
guard let keypair = damus_state.keypair.to_full(),
let like_ev = make_like_event(keypair: keypair, liked: event) else {
return
}
let like_ev = make_like_event(pubkey: damus_state.pubkey, privkey: privkey, liked: event)
self.bar.our_like = like_ev
generator.impactOccurred()
@@ -222,10 +221,9 @@ struct LikeButton: View {
struct EventActionBar_Previews: PreviewProvider {
static var previews: some View {
let pk = "pubkey"
let ds = test_damus_state()
let ev = NostrEvent(content: "hi", pubkey: pk)
let ev = NostrEvent(content: "hi", keypair: test_keypair)!
let bar = ActionBarModel.empty()
let likedbar = ActionBarModel(likes: 10, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: nil, our_boost: nil, our_zap: nil, our_reply: nil)
let likedbar_ours = ActionBarModel(likes: 10, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: test_event, our_boost: nil, our_zap: nil, our_reply: nil)

View File

@@ -20,12 +20,11 @@ struct RepostAction: View {
Button {
dismiss()
guard let privkey = self.damus_state.keypair.privkey else {
guard let keypair = self.damus_state.keypair.to_full(),
let boost = make_boost_event(keypair: keypair, boosted: self.event) else {
return
}
let boost = make_boost_event(pubkey: damus_state.keypair.pubkey, privkey: privkey, boosted: self.event)
damus_state.postbox.send(boost)
} label: {
Label(NSLocalizedString("Repost", comment: "Button to repost a note"), image: "repost")

View File

@@ -116,15 +116,11 @@ struct ConfigView: View {
confirm_delete_account = false
}
Button(NSLocalizedString("Delete", comment: "Button for deleting the users account."), role: .destructive) {
guard let full_kp = state.keypair.to_full() else {
guard let keypair = state.keypair.to_full(),
delete_text == DELETE_KEYWORD,
let ev = created_deleted_account_profile(keypair: keypair) else {
return
}
guard delete_text == DELETE_KEYWORD else {
return
}
let ev = created_deleted_account_profile(keypair: full_kp)
state.postbox.send(ev)
notify(.logout, ())
}

View File

@@ -177,9 +177,9 @@ struct DMChatView: View, KeyboardReadable {
struct DMChatView_Previews: PreviewProvider {
static var previews: some View {
let ev = NostrEvent(content: "hi", pubkey: "pubkey", kind: 1, tags: [])
let ev = NostrEvent(content: "hi", keypair: test_keypair, kind: 1, tags: [])!
let model = DirectMessageModel(events: [ev], our_pubkey: "pubkey", pubkey: "the_pk")
let model = DirectMessageModel(events: [ev], our_pubkey: test_pubkey, pubkey: test_pubkey)
DMChatView(damus_state: test_damus_state(), dms: model)
}
@@ -216,11 +216,7 @@ func create_encrypted_event(_ message: String, to_pk: String, tags: [[String]],
return nil
}
let ev = NostrEvent(content: enc_content, pubkey: keypair.pubkey, kind: kind, tags: tags, createdAt: created_at)
ev.calculate_id()
ev.sign(privkey: privkey)
return ev
return NostrEvent(content: enc_content, keypair: keypair.to_keypair(), kind: kind, tags: tags, createdAt: created_at)
}
func create_dm(_ message: String, to_pk: String, tags: [[String]], keypair: Keypair, created_at: UInt32? = nil) -> NostrEvent?

View File

@@ -73,7 +73,7 @@ struct DMView: View {
struct DMView_Previews: PreviewProvider {
static var previews: some View {
let ev = NostrEvent(content: "Hey there *buddy*, want to grab some drinks later? 🍻", pubkey: "pubkey", kind: 1, tags: [])
let ev = NostrEvent(content: "Hey there *buddy*, want to grab some drinks later? 🍻", keypair: test_keypair, kind: 1, tags: [])!
DMView(event: ev, damus_state: test_damus_state())
}
}

View File

@@ -59,19 +59,18 @@ struct LongformView: View {
}
}
let test_longform_event = LongformEvent.parse(from:
.init(id: "longform_id",
content: longform_long_test_data,
pubkey: "pk",
kind: NostrKind.longform.rawValue,
tags: [
["title", "What is WASTOIDS?"],
["summary", "WASTOIDS is an audio/visual feed, created by Sam Means..."],
["published_at", "1685638715"],
["t", "coffee"],
["t", "coffeechain"],
["image", "https://cdn.jb55.com/s/038fe8f558153b52.jpg"],
])
let test_longform_event = LongformEvent.parse(from: NostrEvent(
content: longform_long_test_data,
keypair: test_keypair,
kind: NostrKind.longform.rawValue,
tags: [
["title", "What is WASTOIDS?"],
["summary", "WASTOIDS is an audio/visual feed, created by Sam Means..."],
["published_at", "1685638715"],
["t", "coffee"],
["t", "coffeechain"],
["image", "https://cdn.jb55.com/s/038fe8f558153b52.jpg"],
])!
)
struct LongformView_Previews: PreviewProvider {

View File

@@ -48,15 +48,6 @@ struct ZapEvent: View {
}
let test_zap_invoice = ZapInvoice(description: .description("description"), amount: 10000, string: "lnbc1", expiry: 1000000, payment_hash: Data(), created_at: 1000000)
let test_zap_request_ev = NostrEvent(content: "hi", pubkey: "pk", kind: 9734)
let test_zap_request = ZapRequest(ev: test_zap_request_ev)
let test_zap = Zap(event: test_event, invoice: test_zap_invoice, zapper: "zapper", target: .profile("pk"), raw_request: test_zap_request, is_anon: false, private_request: nil)
let test_private_zap = Zap(event: test_event, invoice: test_zap_invoice, zapper: "zapper", target: .profile("pk"), raw_request: test_zap_request, is_anon: false, private_request: .init(ev: test_event))
let test_pending_zap = PendingZap(amount_msat: 10000, target: .note(id: "id", author: "pk"), request: .normal(test_zap_request), type: .pub, state: .external(.init(state: .fetching_invoice)))
struct ZapEvent_Previews: PreviewProvider {
static var previews: some View {
VStack {

View File

@@ -258,12 +258,6 @@ struct EventGroupView: View {
}
}
let test_encoded_post = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}"
let test_repost_1 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk1", kind: 6, tags: [], createdAt: 1)
let test_repost_2 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk2", kind: 6, tags: [], createdAt: 1)
let test_reposts = [test_repost_1, test_repost_2]
let test_event_group = EventGroup(events: test_reposts)
struct EventGroupView_Previews: PreviewProvider {
static var previews: some View {
VStack {

View File

@@ -62,10 +62,12 @@ struct EditMetadataView: View {
func save() {
let profile = to_profile()
guard let keypair = damus_state.keypair.to_full() else {
guard let keypair = damus_state.keypair.to_full(),
let metadata_ev = make_metadata_event(keypair: keypair, metadata: profile)
else {
return
}
let metadata_ev = make_metadata_event(keypair: keypair, metadata: profile)
damus_state.postbox.send(metadata_ev)
}

View File

@@ -28,6 +28,6 @@ struct ReactionView: View {
struct ReactionView_Previews: PreviewProvider {
static var previews: some View {
ReactionView(damus_state: test_damus_state(), reaction: NostrEvent(id: "", content: "🤙🏼", pubkey: ""))
ReactionView(damus_state: test_damus_state(), reaction: NostrEvent(content: "🤙🏼", keypair: test_keypair)!)
}
}

View File

@@ -24,9 +24,9 @@ struct RecommendedRelayView: View {
var body: some View {
ZStack {
HStack {
if let privkey = damus.keypair.privkey {
if let keypair = damus.keypair.to_full() {
if showActionButtons && add_button {
AddButton(privkey: privkey, showText: false)
AddButton(keypair: keypair, showText: false)
}
}
@@ -59,8 +59,8 @@ struct RecommendedRelayView: View {
}
.swipeActions {
if add_button {
if let privkey = damus.keypair.privkey {
AddButton(privkey: privkey, showText: false)
if let keypair = damus.keypair.to_full() {
AddButton(keypair: keypair, showText: false)
.tint(.accentColor)
}
}
@@ -68,8 +68,8 @@ struct RecommendedRelayView: View {
.contextMenu {
CopyAction(relay: relay)
if let privkey = damus.keypair.privkey {
AddButton(privkey: privkey, showText: true)
if let keypair = damus.keypair.to_full() {
AddButton(keypair: keypair, showText: true)
}
}
}
@@ -82,9 +82,9 @@ struct RecommendedRelayView: View {
}
}
func AddButton(privkey: String, showText: Bool) -> some View {
func AddButton(keypair: FullKeypair, showText: Bool) -> some View {
Button(action: {
add_action(privkey: privkey)
add_action(keypair: keypair)
}) {
if showText {
Text(NSLocalizedString("Connect", comment: "Button to connect to recommended relay server."))
@@ -97,11 +97,11 @@ struct RecommendedRelayView: View {
}
}
func add_action(privkey: String) {
func add_action(keypair: FullKeypair) {
guard let ev_before_add = damus.contacts.event else {
return
}
guard let ev_after_add = add_relay(ev: ev_before_add, privkey: privkey, current_relays: damus.pool.our_descriptors, relay: relay, info: .rw) else {
guard let ev_after_add = add_relay(ev: ev_before_add, keypair: keypair, current_relays: damus.pool.our_descriptors, relay: relay, info: .rw) else {
return
}
process_contact_event(state: damus, ev: ev_after_add)

View File

@@ -54,7 +54,7 @@ struct RelayConfigView: View {
VStack {
HStack {
Spacer()
if(!new_relay.isEmpty) {
if !new_relay.isEmpty {
Button(NSLocalizedString("Cancel", comment: "Button to cancel out of view adding user inputted relay.")) {
new_relay = ""
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
@@ -76,15 +76,9 @@ struct RelayConfigView: View {
new_relay.removeLast();
}
guard let url = RelayURL(new_relay) else {
return
}
guard let ev = state.contacts.event else {
return
}
guard let privkey = state.keypair.privkey else {
guard let url = RelayURL(new_relay),
let ev = state.contacts.event,
let keypair = state.keypair.to_full() else {
return
}
@@ -103,7 +97,7 @@ struct RelayConfigView: View {
state.pool.connect(to: [new_relay])
guard let new_ev = add_relay(ev: ev, privkey: privkey, current_relays: state.pool.our_descriptors, relay: new_relay, info: info) else {
guard let new_ev = add_relay(ev: ev, keypair: keypair, current_relays: state.pool.our_descriptors, relay: new_relay, info: info) else {
return
}

View File

@@ -40,35 +40,38 @@ struct RelayDetailView: View {
return Text("No data available", comment: "Text indicating that there is no data available to show for specific metadata about a relay server.")
}
}
func RemoveRelayButton(_ keypair: FullKeypair) -> some View {
Button(action: {
guard let ev = state.contacts.event else {
return
}
let descriptors = state.pool.our_descriptors
guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, keypair: keypair, relay: relay) else {
return
}
process_contact_event(state: state, ev: new_ev)
state.postbox.send(new_ev)
dismiss()
}) {
Text("Disconnect From Relay", comment: "Button to disconnect from the relay.")
}
}
var body: some View {
Group {
Form {
if let privkey = state.keypair.privkey {
if let keypair = state.keypair.to_full() {
if check_connection() {
Button(action: {
guard let ev = state.contacts.event else {
return
}
let descriptors = state.pool.our_descriptors
guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, privkey: privkey, relay: relay) else {
return
}
process_contact_event(state: state, ev: new_ev)
state.postbox.send(new_ev)
dismiss()
}) {
Text("Disconnect From Relay", comment: "Button to disconnect from the relay.")
}
RemoveRelayButton(keypair)
} else {
Button(action: {
guard let ev_before_add = state.contacts.event else {
return
}
guard let ev_after_add = add_relay(ev: ev_before_add, privkey: privkey, current_relays: state.pool.our_descriptors, relay: relay, info: .rw) else {
guard let ev_after_add = add_relay(ev: ev_before_add, keypair: keypair, current_relays: state.pool.our_descriptors, relay: relay, info: .rw) else {
return
}
process_contact_event(state: state, ev: ev_after_add)

View File

@@ -95,7 +95,8 @@ struct RelayView: View {
}
let descriptors = state.pool.our_descriptors
guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, privkey: privkey, relay: relay) else {
guard let keypair = state.keypair.to_full(),
let new_ev = remove_relay(ev: ev, current_relays: descriptors, keypair: keypair, relay: relay) else {
return
}

View File

@@ -10,8 +10,8 @@ import SwiftUI
struct ReportView: View {
let postbox: PostBox
let target: ReportTarget
let privkey: String
let keypair: FullKeypair
@State var report_sent: Bool = false
@State var report_id: String = ""
@State var report_message: String = ""
@@ -46,7 +46,8 @@ struct ReportView: View {
}
func do_send_report() {
guard let selected_report_type, let ev = send_report(privkey: privkey, postbox: postbox, target: target, type: selected_report_type, message: report_message) else {
guard let selected_report_type,
let ev = send_report(keypair: keypair, postbox: postbox, target: target, type: selected_report_type, message: report_message) else {
return
}
@@ -116,9 +117,9 @@ struct ReportView: View {
}
}
func send_report(privkey: String, postbox: PostBox, target: ReportTarget, type: ReportType, message: String) -> NostrEvent? {
func send_report(keypair: FullKeypair, postbox: PostBox, target: ReportTarget, type: ReportType, message: String) -> NostrEvent? {
let report = Report(type: type, target: target, message: message)
guard let ev = create_report_event(privkey: privkey, report: report) else {
guard let ev = create_report_event(keypair: keypair, report: report) else {
return nil
}
postbox.send(ev)
@@ -130,10 +131,10 @@ struct ReportView_Previews: PreviewProvider {
let ds = test_damus_state()
VStack {
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), privkey: "")
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), privkey: "", report_sent: true, report_id: "report_id")
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), keypair: test_keypair.to_full()!)
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), keypair: test_keypair.to_full()!, report_sent: true, report_id: "report_id")
}
}
}

View File

@@ -18,7 +18,7 @@ struct RepostView: View {
struct RepostView_Previews: PreviewProvider {
static var previews: some View {
RepostView(damus_state: test_damus_state(), repost: NostrEvent(id: "", content: "", pubkey: ""))
RepostView(damus_state: test_damus_state(), repost: NostrEvent(content: "", keypair: test_keypair)!)
}
}

View File

@@ -130,8 +130,8 @@ struct SaveKeysView: View {
let metadata = create_account_to_metadata(account)
let contacts_ev = make_first_contact_event(keypair: account.keypair)
if let keypair = account.keypair.to_full() {
let metadata_ev = make_metadata_event(keypair: keypair, metadata: metadata)
if let keypair = account.keypair.to_full(),
let metadata_ev = make_metadata_event(keypair: keypair, metadata: metadata) {
self.pool.send(.event(metadata_ev))
}

View File

@@ -181,7 +181,9 @@ struct WalletView: View {
}
profile.damus_donation = settings.donation_percent
let meta = make_metadata_event(keypair: keypair, metadata: profile)
guard let meta = make_metadata_event(keypair: keypair, metadata: profile) else {
return
}
let tsprofile = TimestampedProfile(profile: profile, timestamp: meta.created_at, event: meta)
damus_state.profiles.add(id: damus_state.pubkey, profile: tsprofile)
damus_state.postbox.send(meta)