event: separate logic from data using extensions

I'm not a huge fan of this pattern but it's getting messy in here
This commit is contained in:
William Casarin
2023-07-21 14:38:30 -07:00
parent 12594e35c1
commit 5e7b1f4ff3

View File

@@ -47,6 +47,56 @@ struct ReferencedId: Identifiable, Hashable, Equatable {
} }
class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Hashable, Comparable { class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Hashable, Comparable {
// TODO: memory mapped db events
/*
private var note_data: UnsafeMutablePointer<ndb_note>
init(data: UnsafeMutablePointer<ndb_note>) {
self.note_data = data
}
var id: [UInt8] {
let buffer = UnsafeBufferPointer(start: ndb_note_id(note_data), count: 32)
return Array(buffer)
}
var content: String {
String(cString: ndb_note_content(self.note_data))
}
var sig: [UInt8] {
let buffer = UnsafeBufferPointer(start: ndb_note_signature(note_data), count: 64)
return Array(buffer)
}
var tags: TagIterator
*/
var id: String
var content: String
var sig: String
var tags: [[String]]
//var boosted_by: String?
// cached field for pow calc
//var pow: Int?
// custom flags for internal use
var flags: Int = 0
let pubkey: String
let created_at: Int64
let kind: Int
// cached stuff
private var _event_refs: [EventRef]? = nil
var decrypted_content: String? = nil
private var _blocks: Blocks? = nil
private lazy var inner_event: NostrEvent? = {
return event_from_json(dat: self.content)
}()
static func == (lhs: NostrEvent, rhs: NostrEvent) -> Bool { static func == (lhs: NostrEvent, rhs: NostrEvent) -> Bool {
return lhs.id == rhs.id return lhs.id == rhs.id
} }
@@ -59,22 +109,20 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has
hasher.combine(id) hasher.combine(id)
} }
var id: String init(id: String = "", content: String, pubkey: String, kind: Int = 1, tags: [[String]] = [], createdAt: Int64 = Int64(Date().timeIntervalSince1970)) {
var sig: String
var tags: [[String]]
var boosted_by: String?
// cached field for pow calc self.id = id
//var pow: Int? self.sig = ""
// custom flags for internal use self.content = content
var flags: Int = 0 self.pubkey = pubkey
self.kind = kind
let pubkey: String self.tags = tags
let created_at: Int64 self.created_at = createdAt
let kind: Int }
let content: String }
extension NostrEvent {
var is_textlike: Bool { var is_textlike: Bool {
return kind == 1 || kind == 42 || kind == 30023 return kind == 1 || kind == 42 || kind == 30023
} }
@@ -91,7 +139,6 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has
return calculate_event_id(ev: self) == self.id return calculate_event_id(ev: self) == self.id
} }
private var _blocks: Blocks? = nil
func blocks(_ privkey: String?) -> Blocks { func blocks(_ privkey: String?) -> Blocks {
if let bs = _blocks { if let bs = _blocks {
return bs return bs
@@ -105,9 +152,6 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has
return parse_note_content(content: content, tags: self.tags) return parse_note_content(content: content, tags: self.tags)
} }
private lazy var inner_event: NostrEvent? = {
return event_from_json(dat: self.content)
}()
func get_inner_event(cache: EventCache) -> NostrEvent? { func get_inner_event(cache: EventCache) -> NostrEvent? {
guard self.known_kind == .boost else { guard self.known_kind == .boost else {
@@ -121,7 +165,6 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has
return self.inner_event return self.inner_event
} }
private var _event_refs: [EventRef]? = nil
func event_refs(_ privkey: String?) -> [EventRef] { func event_refs(_ privkey: String?) -> [EventRef] {
if let rs = _event_refs { if let rs = _event_refs {
return rs return rs
@@ -131,7 +174,6 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has
return refs return refs
} }
var decrypted_content: String? = nil
func decrypted(privkey: String?) -> String? { func decrypted(privkey: String?) -> String? {
if let decrypted_content = decrypted_content { if let decrypted_content = decrypted_content {
@@ -268,17 +310,6 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible, Equatable, Has
return (self.flags & 1) != 0 return (self.flags & 1) != 0
} }
init(id: String = "", content: String, pubkey: String, kind: Int = 1, tags: [[String]] = [], createdAt: Int64 = Int64(Date().timeIntervalSince1970)) {
self.id = id
self.sig = ""
self.content = content
self.pubkey = pubkey
self.kind = kind
self.tags = tags
self.created_at = createdAt
}
func calculate_id() { func calculate_id() {
self.id = calculate_event_id(ev: self) self.id = calculate_event_id(ev: self)
} }
@@ -322,6 +353,31 @@ func decode_nostr_event_json(json: String) -> NostrEvent? {
return decode_json(json) return decode_json(json)
} }
/*
func decode_nostr_event_json(json: String) -> NostrEvent? {
guard let json_str = json.cString(using: .utf8) else {
return nil
}
// Allocate a double pointer (pointer to pointer) for ndb_note
var notePtr: UnsafeMutablePointer<ndb_note>? = nil
// Create the buffer
var buf = [Int8](repeating: 0, count: 2<<18)
// Call the C function
let result = withUnsafeMutablePointer(to: &notePtr) { (ptr) -> Int32 in
return ndb_note_from_json(json_str, Int32(json_str.count), ptr, &buf, Int32(buf.count))
}
guard result == 0, let note = notePtr?.pointee else {
return nil
}
return .init(data: note)
}
*/
func decode_json<T: Decodable>(_ val: String) -> T? { func decode_json<T: Decodable>(_ val: String) -> T? {
return try? JSONDecoder().decode(T.self, from: Data(val.utf8)) return try? JSONDecoder().decode(T.self, from: Data(val.utf8))
} }