Harden relay configuration and message delivery
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user