Harden relay configuration and message delivery

This commit is contained in:
diyaa
2026-07-26 19:40:58 +02:00
parent 2bd9c1b3ae
commit 97628aa9e9
6 changed files with 57 additions and 5 deletions
@@ -23,7 +23,7 @@ struct ChatView: View {
ForEach(session.messages) { message in
MessageBubble(
message: message,
isSent: message.fromName == "You"
isSent: message.from == KeychainStore.installationID
)
.id(message.id)
}
@@ -313,6 +313,7 @@ struct WSMessage: Codable, Equatable {
var token: String?
var peerID: String?
var reason: String?
var sentAt: String? // ISO-8601 timestamp set by the sender; preserved through the relay
var messageIDs: [String]? // used by read receipts: { type: "read", messageIDs: [...] }
var attachment: WSAttachment? // file metadata attached to a chat.message
@@ -326,6 +327,7 @@ struct WSMessage: Codable, Equatable {
token: String? = nil,
peerID: String? = nil,
reason: String? = nil,
sentAt: String? = nil,
messageIDs: [String]? = nil,
attachment: WSAttachment? = nil
) {
@@ -338,6 +340,7 @@ struct WSMessage: Codable, Equatable {
self.token = token
self.peerID = peerID
self.reason = reason
self.sentAt = sentAt
self.messageIDs = messageIDs
self.attachment = attachment
}
@@ -159,18 +159,32 @@ final class AppSession: ObservableObject {
}
}
private static let iso8601: ISO8601DateFormatter = {
let f = ISO8601DateFormatter()
f.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
return f
}()
private func handleIncomingMessage(_ message: WSMessage) async {
switch message.type {
case "chat.message":
let attachment = message.attachment.map {
AttachmentInfo(fileID: $0.fileID, name: $0.name, size: $0.size)
}
// Use the timestamp the sender embedded; fall back to now only if missing.
let sentAt: Date
if let raw = message.sentAt,
let parsed = AppSession.iso8601.date(from: raw) {
sentAt = parsed
} else {
sentAt = Date()
}
let chatMessage = ChatMessage(
id: message.id ?? UUID().uuidString,
from: message.from ?? "unknown",
fromName: message.fromName ?? "Unknown",
body: message.body ?? "",
sentAt: Date(),
sentAt: sentAt,
attachment: attachment,
isRead: false
)
@@ -196,6 +210,7 @@ final class AppSession: ObservableObject {
type: "chat.message",
id: message.id,
body: message.body,
sentAt: AppSession.iso8601.string(from: message.sentAt),
attachment: attachment
)
@@ -8,7 +8,8 @@ final class WSMessageTests: XCTestCase {
id: "message-id",
body: "Hello",
from: "peer-id",
fromName: "Alex"
fromName: "Alex",
sentAt: "2026-07-26T18:12:00.123Z"
)
let decodedMessage = try JSONDecoder().decode(