From fd14c50f61ac95e1dea1d5139ed118abfbc041ce Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Tue, 15 Nov 2022 11:32:19 +1100 Subject: [PATCH] add sync expires message and update protobuf --- Session.xcodeproj/project.pbxproj | 4 + .../SyncedExpiriesMessage.swift | 109 ++++++ .../Protos/Generated/SNProto.swift | 341 ++++++++++++++++++ .../Protos/Generated/SessionProtos.pb.swift | 212 +++++++++++ .../Protos/SessionProtos.proto | 19 + 5 files changed, 685 insertions(+) create mode 100644 SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index b25485cda..0f92d8fef 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -156,6 +156,7 @@ 7BC707F227290ACB002817AD /* SessionCallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BC707F127290ACB002817AD /* SessionCallManager.swift */; }; 7BCD116C27016062006330F1 /* WebRTCSession+DataChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BCD116B27016062006330F1 /* WebRTCSession+DataChannel.swift */; }; 7BD01B122921BDDF00E7D9E6 /* MessageSender+TTL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01B112921BDDF00E7D9E6 /* MessageSender+TTL.swift */; }; + 7BD01B142921FD9900E7D9E6 /* SyncedExpiriesMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */; }; 7BD477A827EC39F5004E2822 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD477A727EC39F5004E2822 /* Atomic.swift */; }; 7BDCFC08242186E700641C39 /* NotificationServiceExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BDCFC07242186E700641C39 /* NotificationServiceExtensionContext.swift */; }; 7BDCFC0B2421EB7600641C39 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6F509951AA53F760068F56A /* Localizable.strings */; }; @@ -1227,6 +1228,7 @@ 7BC707F127290ACB002817AD /* SessionCallManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCallManager.swift; sourceTree = ""; }; 7BCD116B27016062006330F1 /* WebRTCSession+DataChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WebRTCSession+DataChannel.swift"; sourceTree = ""; }; 7BD01B112921BDDF00E7D9E6 /* MessageSender+TTL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+TTL.swift"; sourceTree = ""; }; + 7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncedExpiriesMessage.swift; sourceTree = ""; }; 7BD477A727EC39F5004E2822 /* Atomic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = ""; }; 7BD477A927F15F24004E2822 /* OpenGroupServerIdLookup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenGroupServerIdLookup.swift; sourceTree = ""; }; 7BDCFC0424206E7300641C39 /* SessionNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SessionNotificationServiceExtension.entitlements; sourceTree = ""; }; @@ -2654,6 +2656,7 @@ C300A5BC2554B00D00555489 /* ReadReceipt.swift */, C300A5D22554B05A00555489 /* TypingIndicator.swift */, 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */, + 7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */, ); path = "Control Messages"; sourceTree = ""; @@ -5439,6 +5442,7 @@ FD245C6A2850666F00B966DD /* FileServerAPI.swift in Sources */, FDC4386927B4E6B800C60D73 /* String+Utlities.swift in Sources */, FD716E6628502EE200C96BF4 /* CurrentCallProtocol.swift in Sources */, + 7BD01B142921FD9900E7D9E6 /* SyncedExpiriesMessage.swift in Sources */, FD09B7E5288670BB00ED0B66 /* _008_EmojiReacts.swift in Sources */, FDC4385F27B4C4A200C60D73 /* PinnedMessage.swift in Sources */, 7BFD1A8C2747150E00FB91B9 /* TurnServerInfo.swift in Sources */, diff --git a/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift b/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift new file mode 100644 index 000000000..63c1ea4c6 --- /dev/null +++ b/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift @@ -0,0 +1,109 @@ +// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. + +import Foundation +import GRDB +import SessionUtilitiesKit + +public final class SyncedExpiriesMessage: ControlMessage { + private enum CodingKeys: String, CodingKey { + case conversationExpiries + } + + public struct SyncedExpiry: Codable, Equatable { + let serverHash: String + let expirationTimestamp: Int64 + } + + public var conversationExpiries: [String: [SyncedExpiry]] = [:] + + // MARK: - Validation + + public override var isValid: Bool { + guard super.isValid else { return false } + return conversationExpiries.count > 0 + } + + // MARK: - Codable + + required init(from decoder: Decoder) throws { + try super.init(from: decoder) + + let container: KeyedDecodingContainer = try decoder.container(keyedBy: CodingKeys.self) + + conversationExpiries = ((try? container.decode([String: [SyncedExpiry]].self, forKey: .conversationExpiries)) ?? [:]) + } + + public override func encode(to encoder: Encoder) throws { + var container: KeyedEncodingContainer = encoder.container(keyedBy: CodingKeys.self) + + try container.encode(conversationExpiries, forKey: .conversationExpiries) + } + + // MARK: - Initialization + + init(conversationExpiries: [String : [SyncedExpiry]]) { + super.init() + self.conversationExpiries = conversationExpiries + } + + // MARK: - Proto Conversion + + public override class func fromProto(_ proto: SNProtoContent, sender: String) -> SyncedExpiriesMessage? { + guard let syncedExpiriesProto = proto.syncedExpiries else { return nil } + let conversationExpiries = syncedExpiriesProto.conversationExpiries.reduce(into: [String: [SyncedExpiry]]()) { + $0[$1.syncTarget] = $1.expiries.map { syncedExpiryProto in + return SyncedExpiry( + serverHash: syncedExpiryProto.serverHash, + expirationTimestamp: Int64(syncedExpiryProto.expirationTimestamp) + ) + } + } + + return SyncedExpiriesMessage(conversationExpiries: conversationExpiries) + } + + public override func toProto(_ db: Database) -> SNProtoContent? { + let syncedExpiriesProto = SNProtoSyncedExpiries.builder() + + let conversationExpiriesProto = conversationExpiries.compactMap { (syncTarget, expires) in + let syncedConversationExpiriesProto = SNProtoSyncedExpiriesSyncedConversationExpiries + .builder(syncTarget: syncTarget) + + let expiresProto = expires.compactMap { syncedExpiry in + let syncedExpiryProto = SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry + .builder( + serverHash: syncedExpiry.serverHash, + expirationTimestamp: UInt64(syncedExpiry.expirationTimestamp) + ) + + return try? syncedExpiryProto.build() + } + + syncedConversationExpiriesProto.setExpiries(expiresProto) + + return try? syncedConversationExpiriesProto.build() + } + + syncedExpiriesProto.setConversationExpiries(conversationExpiriesProto) + + let contentProto = SNProtoContent.builder() + do { + contentProto.setSyncedExpiries(try syncedExpiriesProto.build()) + return try contentProto.build() + } catch { + SNLog("Couldn't construct synced expiries proto from: \(self).") + return nil + } + } + + // MARK: - Description + + public var description: String { + """ + SyncedExpiriesMessage( + conversationExpiries: \(conversationExpiries.prettifiedDescription) + ) + """ + } +} + diff --git a/SessionMessagingKit/Protos/Generated/SNProto.swift b/SessionMessagingKit/Protos/Generated/SNProto.swift index 1e7f6091f..e747c8490 100644 --- a/SessionMessagingKit/Protos/Generated/SNProto.swift +++ b/SessionMessagingKit/Protos/Generated/SNProto.swift @@ -581,6 +581,330 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { #endif +// MARK: - SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry + +@objc public class SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry: NSObject { + + // MARK: - SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder + + @objc public class func builder(serverHash: String, expirationTimestamp: UInt64) -> SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder { + return SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder(serverHash: serverHash, expirationTimestamp: expirationTimestamp) + } + + // asBuilder() constructs a builder that reflects the proto's contents. + @objc public func asBuilder() -> SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder { + let builder = SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder(serverHash: serverHash, expirationTimestamp: expirationTimestamp) + return builder + } + + @objc public class SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder: NSObject { + + private var proto = SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry() + + @objc fileprivate override init() {} + + @objc fileprivate init(serverHash: String, expirationTimestamp: UInt64) { + super.init() + + setServerHash(serverHash) + setExpirationTimestamp(expirationTimestamp) + } + + @objc public func setServerHash(_ valueParam: String) { + proto.serverHash = valueParam + } + + @objc public func setExpirationTimestamp(_ valueParam: UInt64) { + proto.expirationTimestamp = valueParam + } + + @objc public func build() throws -> SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry { + return try SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry.parseProto(proto) + } + + @objc public func buildSerializedData() throws -> Data { + return try SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry.parseProto(proto).serializedData() + } + } + + fileprivate let proto: SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry + + @objc public let serverHash: String + + @objc public let expirationTimestamp: UInt64 + + private init(proto: SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry, + serverHash: String, + expirationTimestamp: UInt64) { + self.proto = proto + self.serverHash = serverHash + self.expirationTimestamp = expirationTimestamp + } + + @objc + public func serializedData() throws -> Data { + return try self.proto.serializedData() + } + + @objc public class func parseData(_ serializedData: Data) throws -> SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry { + let proto = try SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry(serializedData: serializedData) + return try parseProto(proto) + } + + fileprivate class func parseProto(_ proto: SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry) throws -> SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry { + guard proto.hasServerHash else { + throw SNProtoError.invalidProtobuf(description: "\(logTag) missing required field: serverHash") + } + let serverHash = proto.serverHash + + guard proto.hasExpirationTimestamp else { + throw SNProtoError.invalidProtobuf(description: "\(logTag) missing required field: expirationTimestamp") + } + let expirationTimestamp = proto.expirationTimestamp + + // MARK: - Begin Validation Logic for SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry - + + // MARK: - End Validation Logic for SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry - + + let result = SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry(proto: proto, + serverHash: serverHash, + expirationTimestamp: expirationTimestamp) + return result + } + + @objc public override var debugDescription: String { + return "\(proto)" + } +} + +#if DEBUG + +extension SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry { + @objc public func serializedDataIgnoringErrors() -> Data? { + return try! self.serializedData() + } +} + +extension SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry.SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiryBuilder { + @objc public func buildIgnoringErrors() -> SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry? { + return try! self.build() + } +} + +#endif + +// MARK: - SNProtoSyncedExpiriesSyncedConversationExpiries + +@objc public class SNProtoSyncedExpiriesSyncedConversationExpiries: NSObject { + + // MARK: - SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder + + @objc public class func builder(syncTarget: String) -> SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder { + return SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder(syncTarget: syncTarget) + } + + // asBuilder() constructs a builder that reflects the proto's contents. + @objc public func asBuilder() -> SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder { + let builder = SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder(syncTarget: syncTarget) + builder.setExpiries(expiries) + return builder + } + + @objc public class SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder: NSObject { + + private var proto = SessionProtos_SyncedExpiries.SyncedConversationExpiries() + + @objc fileprivate override init() {} + + @objc fileprivate init(syncTarget: String) { + super.init() + + setSyncTarget(syncTarget) + } + + @objc public func setSyncTarget(_ valueParam: String) { + proto.syncTarget = valueParam + } + + @objc public func addExpiries(_ valueParam: SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry) { + var items = proto.expiries + items.append(valueParam.proto) + proto.expiries = items + } + + @objc public func setExpiries(_ wrappedItems: [SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry]) { + proto.expiries = wrappedItems.map { $0.proto } + } + + @objc public func build() throws -> SNProtoSyncedExpiriesSyncedConversationExpiries { + return try SNProtoSyncedExpiriesSyncedConversationExpiries.parseProto(proto) + } + + @objc public func buildSerializedData() throws -> Data { + return try SNProtoSyncedExpiriesSyncedConversationExpiries.parseProto(proto).serializedData() + } + } + + fileprivate let proto: SessionProtos_SyncedExpiries.SyncedConversationExpiries + + @objc public let syncTarget: String + + @objc public let expiries: [SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry] + + private init(proto: SessionProtos_SyncedExpiries.SyncedConversationExpiries, + syncTarget: String, + expiries: [SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry]) { + self.proto = proto + self.syncTarget = syncTarget + self.expiries = expiries + } + + @objc + public func serializedData() throws -> Data { + return try self.proto.serializedData() + } + + @objc public class func parseData(_ serializedData: Data) throws -> SNProtoSyncedExpiriesSyncedConversationExpiries { + let proto = try SessionProtos_SyncedExpiries.SyncedConversationExpiries(serializedData: serializedData) + return try parseProto(proto) + } + + fileprivate class func parseProto(_ proto: SessionProtos_SyncedExpiries.SyncedConversationExpiries) throws -> SNProtoSyncedExpiriesSyncedConversationExpiries { + guard proto.hasSyncTarget else { + throw SNProtoError.invalidProtobuf(description: "\(logTag) missing required field: syncTarget") + } + let syncTarget = proto.syncTarget + + var expiries: [SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry] = [] + expiries = try proto.expiries.map { try SNProtoSyncedExpiriesSyncedConversationExpiriesSyncedExpiry.parseProto($0) } + + // MARK: - Begin Validation Logic for SNProtoSyncedExpiriesSyncedConversationExpiries - + + // MARK: - End Validation Logic for SNProtoSyncedExpiriesSyncedConversationExpiries - + + let result = SNProtoSyncedExpiriesSyncedConversationExpiries(proto: proto, + syncTarget: syncTarget, + expiries: expiries) + return result + } + + @objc public override var debugDescription: String { + return "\(proto)" + } +} + +#if DEBUG + +extension SNProtoSyncedExpiriesSyncedConversationExpiries { + @objc public func serializedDataIgnoringErrors() -> Data? { + return try! self.serializedData() + } +} + +extension SNProtoSyncedExpiriesSyncedConversationExpiries.SNProtoSyncedExpiriesSyncedConversationExpiriesBuilder { + @objc public func buildIgnoringErrors() -> SNProtoSyncedExpiriesSyncedConversationExpiries? { + return try! self.build() + } +} + +#endif + +// MARK: - SNProtoSyncedExpiries + +@objc public class SNProtoSyncedExpiries: NSObject { + + // MARK: - SNProtoSyncedExpiriesBuilder + + @objc public class func builder() -> SNProtoSyncedExpiriesBuilder { + return SNProtoSyncedExpiriesBuilder() + } + + // asBuilder() constructs a builder that reflects the proto's contents. + @objc public func asBuilder() -> SNProtoSyncedExpiriesBuilder { + let builder = SNProtoSyncedExpiriesBuilder() + builder.setConversationExpiries(conversationExpiries) + return builder + } + + @objc public class SNProtoSyncedExpiriesBuilder: NSObject { + + private var proto = SessionProtos_SyncedExpiries() + + @objc fileprivate override init() {} + + @objc public func addConversationExpiries(_ valueParam: SNProtoSyncedExpiriesSyncedConversationExpiries) { + var items = proto.conversationExpiries + items.append(valueParam.proto) + proto.conversationExpiries = items + } + + @objc public func setConversationExpiries(_ wrappedItems: [SNProtoSyncedExpiriesSyncedConversationExpiries]) { + proto.conversationExpiries = wrappedItems.map { $0.proto } + } + + @objc public func build() throws -> SNProtoSyncedExpiries { + return try SNProtoSyncedExpiries.parseProto(proto) + } + + @objc public func buildSerializedData() throws -> Data { + return try SNProtoSyncedExpiries.parseProto(proto).serializedData() + } + } + + fileprivate let proto: SessionProtos_SyncedExpiries + + @objc public let conversationExpiries: [SNProtoSyncedExpiriesSyncedConversationExpiries] + + private init(proto: SessionProtos_SyncedExpiries, + conversationExpiries: [SNProtoSyncedExpiriesSyncedConversationExpiries]) { + self.proto = proto + self.conversationExpiries = conversationExpiries + } + + @objc + public func serializedData() throws -> Data { + return try self.proto.serializedData() + } + + @objc public class func parseData(_ serializedData: Data) throws -> SNProtoSyncedExpiries { + let proto = try SessionProtos_SyncedExpiries(serializedData: serializedData) + return try parseProto(proto) + } + + fileprivate class func parseProto(_ proto: SessionProtos_SyncedExpiries) throws -> SNProtoSyncedExpiries { + var conversationExpiries: [SNProtoSyncedExpiriesSyncedConversationExpiries] = [] + conversationExpiries = try proto.conversationExpiries.map { try SNProtoSyncedExpiriesSyncedConversationExpiries.parseProto($0) } + + // MARK: - Begin Validation Logic for SNProtoSyncedExpiries - + + // MARK: - End Validation Logic for SNProtoSyncedExpiries - + + let result = SNProtoSyncedExpiries(proto: proto, + conversationExpiries: conversationExpiries) + return result + } + + @objc public override var debugDescription: String { + return "\(proto)" + } +} + +#if DEBUG + +extension SNProtoSyncedExpiries { + @objc public func serializedDataIgnoringErrors() -> Data? { + return try! self.serializedData() + } +} + +extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder { + @objc public func buildIgnoringErrors() -> SNProtoSyncedExpiries? { + return try! self.build() + } +} + +#endif + // MARK: - SNProtoContent @objc public class SNProtoContent: NSObject { @@ -618,6 +942,9 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { if let _value = dataMessage { builder.setDataMessage(_value) } + if let _value = syncedExpiries { + builder.setSyncedExpiries(_value) + } if let _value = callMessage { builder.setCallMessage(_value) } @@ -661,6 +988,10 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { proto.dataMessage = valueParam.proto } + @objc public func setSyncedExpiries(_ valueParam: SNProtoSyncedExpiries) { + proto.syncedExpiries = valueParam.proto + } + @objc public func setCallMessage(_ valueParam: SNProtoCallMessage) { proto.callMessage = valueParam.proto } @@ -714,6 +1045,8 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { @objc public let dataMessage: SNProtoDataMessage? + @objc public let syncedExpiries: SNProtoSyncedExpiries? + @objc public let callMessage: SNProtoCallMessage? @objc public let receiptMessage: SNProtoReceiptMessage? @@ -751,6 +1084,7 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { private init(proto: SessionProtos_Content, dataMessage: SNProtoDataMessage?, + syncedExpiries: SNProtoSyncedExpiries?, callMessage: SNProtoCallMessage?, receiptMessage: SNProtoReceiptMessage?, typingMessage: SNProtoTypingMessage?, @@ -760,6 +1094,7 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { messageRequestResponse: SNProtoMessageRequestResponse?) { self.proto = proto self.dataMessage = dataMessage + self.syncedExpiries = syncedExpiries self.callMessage = callMessage self.receiptMessage = receiptMessage self.typingMessage = typingMessage @@ -785,6 +1120,11 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { dataMessage = try SNProtoDataMessage.parseProto(proto.dataMessage) } + var syncedExpiries: SNProtoSyncedExpiries? = nil + if proto.hasSyncedExpiries { + syncedExpiries = try SNProtoSyncedExpiries.parseProto(proto.syncedExpiries) + } + var callMessage: SNProtoCallMessage? = nil if proto.hasCallMessage { callMessage = try SNProtoCallMessage.parseProto(proto.callMessage) @@ -826,6 +1166,7 @@ extension SNProtoMessageRequestResponse.SNProtoMessageRequestResponseBuilder { let result = SNProtoContent(proto: proto, dataMessage: dataMessage, + syncedExpiries: syncedExpiries, callMessage: callMessage, receiptMessage: receiptMessage, typingMessage: typingMessage, diff --git a/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift b/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift index b131e35e4..9f90f8db9 100644 --- a/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift +++ b/SessionMessagingKit/Protos/Generated/SessionProtos.pb.swift @@ -271,6 +271,75 @@ struct SessionProtos_MessageRequestResponse { fileprivate var _profile: SessionProtos_LokiProfile? = nil } +struct SessionProtos_SyncedExpiries { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var conversationExpiries: [SessionProtos_SyncedExpiries.SyncedConversationExpiries] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + struct SyncedConversationExpiries { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// @required + var syncTarget: String { + get {return _syncTarget ?? String()} + set {_syncTarget = newValue} + } + /// Returns true if `syncTarget` has been explicitly set. + var hasSyncTarget: Bool {return self._syncTarget != nil} + /// Clears the value of `syncTarget`. Subsequent reads from it will return its default value. + mutating func clearSyncTarget() {self._syncTarget = nil} + + var expiries: [SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + struct SyncedExpiry { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// @required + var serverHash: String { + get {return _serverHash ?? String()} + set {_serverHash = newValue} + } + /// Returns true if `serverHash` has been explicitly set. + var hasServerHash: Bool {return self._serverHash != nil} + /// Clears the value of `serverHash`. Subsequent reads from it will return its default value. + mutating func clearServerHash() {self._serverHash = nil} + + /// @required + var expirationTimestamp: UInt64 { + get {return _expirationTimestamp ?? 0} + set {_expirationTimestamp = newValue} + } + /// Returns true if `expirationTimestamp` has been explicitly set. + var hasExpirationTimestamp: Bool {return self._expirationTimestamp != nil} + /// Clears the value of `expirationTimestamp`. Subsequent reads from it will return its default value. + mutating func clearExpirationTimestamp() {self._expirationTimestamp = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _serverHash: String? = nil + fileprivate var _expirationTimestamp: UInt64? = nil + } + + init() {} + + fileprivate var _syncTarget: String? = nil + } + + init() {} +} + struct SessionProtos_Content { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for @@ -285,6 +354,15 @@ struct SessionProtos_Content { /// Clears the value of `dataMessage`. Subsequent reads from it will return its default value. mutating func clearDataMessage() {_uniqueStorage()._dataMessage = nil} + var syncedExpiries: SessionProtos_SyncedExpiries { + get {return _storage._syncedExpiries ?? SessionProtos_SyncedExpiries()} + set {_uniqueStorage()._syncedExpiries = newValue} + } + /// Returns true if `syncedExpiries` has been explicitly set. + var hasSyncedExpiries: Bool {return _storage._syncedExpiries != nil} + /// Clears the value of `syncedExpiries`. Subsequent reads from it will return its default value. + mutating func clearSyncedExpiries() {_uniqueStorage()._syncedExpiries = nil} + var callMessage: SessionProtos_CallMessage { get {return _storage._callMessage ?? SessionProtos_CallMessage()} set {_uniqueStorage()._callMessage = newValue} @@ -1967,10 +2045,136 @@ extension SessionProtos_MessageRequestResponse: SwiftProtobuf.Message, SwiftProt } } +extension SessionProtos_SyncedExpiries: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SyncedExpiries" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "conversationExpiries"), + ] + + public var isInitialized: Bool { + if !SwiftProtobuf.Internal.areAllInitialized(self.conversationExpiries) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.conversationExpiries) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.conversationExpiries.isEmpty { + try visitor.visitRepeatedMessageField(value: self.conversationExpiries, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: SessionProtos_SyncedExpiries, rhs: SessionProtos_SyncedExpiries) -> Bool { + if lhs.conversationExpiries != rhs.conversationExpiries {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension SessionProtos_SyncedExpiries.SyncedConversationExpiries: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = SessionProtos_SyncedExpiries.protoMessageName + ".SyncedConversationExpiries" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "syncTarget"), + 2: .same(proto: "expiries"), + ] + + public var isInitialized: Bool { + if self._syncTarget == nil {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.expiries) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self._syncTarget) }() + case 2: try { try decoder.decodeRepeatedMessageField(value: &self.expiries) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._syncTarget { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if !self.expiries.isEmpty { + try visitor.visitRepeatedMessageField(value: self.expiries, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: SessionProtos_SyncedExpiries.SyncedConversationExpiries, rhs: SessionProtos_SyncedExpiries.SyncedConversationExpiries) -> Bool { + if lhs._syncTarget != rhs._syncTarget {return false} + if lhs.expiries != rhs.expiries {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = SessionProtos_SyncedExpiries.SyncedConversationExpiries.protoMessageName + ".SyncedExpiry" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "serverHash"), + 2: .same(proto: "expirationTimestamp"), + ] + + public var isInitialized: Bool { + if self._serverHash == nil {return false} + if self._expirationTimestamp == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self._serverHash) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self._expirationTimestamp) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._serverHash { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if let v = self._expirationTimestamp { + try visitor.visitSingularUInt64Field(value: v, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry, rhs: SessionProtos_SyncedExpiries.SyncedConversationExpiries.SyncedExpiry) -> Bool { + if lhs._serverHash != rhs._serverHash {return false} + if lhs._expirationTimestamp != rhs._expirationTimestamp {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = _protobuf_package + ".Content" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 1: .same(proto: "dataMessage"), + 2: .same(proto: "syncedExpiries"), 3: .same(proto: "callMessage"), 5: .same(proto: "receiptMessage"), 6: .same(proto: "typingMessage"), @@ -1985,6 +2189,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm fileprivate class _StorageClass { var _dataMessage: SessionProtos_DataMessage? = nil + var _syncedExpiries: SessionProtos_SyncedExpiries? = nil var _callMessage: SessionProtos_CallMessage? = nil var _receiptMessage: SessionProtos_ReceiptMessage? = nil var _typingMessage: SessionProtos_TypingMessage? = nil @@ -2002,6 +2207,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm init(copying source: _StorageClass) { _dataMessage = source._dataMessage + _syncedExpiries = source._syncedExpiries _callMessage = source._callMessage _receiptMessage = source._receiptMessage _typingMessage = source._typingMessage @@ -2025,6 +2231,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm public var isInitialized: Bool { return withExtendedLifetime(_storage) { (_storage: _StorageClass) in if let v = _storage._dataMessage, !v.isInitialized {return false} + if let v = _storage._syncedExpiries, !v.isInitialized {return false} if let v = _storage._callMessage, !v.isInitialized {return false} if let v = _storage._receiptMessage, !v.isInitialized {return false} if let v = _storage._typingMessage, !v.isInitialized {return false} @@ -2045,6 +2252,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { case 1: try { try decoder.decodeSingularMessageField(value: &_storage._dataMessage) }() + case 2: try { try decoder.decodeSingularMessageField(value: &_storage._syncedExpiries) }() case 3: try { try decoder.decodeSingularMessageField(value: &_storage._callMessage) }() case 5: try { try decoder.decodeSingularMessageField(value: &_storage._receiptMessage) }() case 6: try { try decoder.decodeSingularMessageField(value: &_storage._typingMessage) }() @@ -2066,6 +2274,9 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm if let v = _storage._dataMessage { try visitor.visitSingularMessageField(value: v, fieldNumber: 1) } + if let v = _storage._syncedExpiries { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } if let v = _storage._callMessage { try visitor.visitSingularMessageField(value: v, fieldNumber: 3) } @@ -2106,6 +2317,7 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm let _storage = _args.0 let rhs_storage = _args.1 if _storage._dataMessage != rhs_storage._dataMessage {return false} + if _storage._syncedExpiries != rhs_storage._syncedExpiries {return false} if _storage._callMessage != rhs_storage._callMessage {return false} if _storage._receiptMessage != rhs_storage._receiptMessage {return false} if _storage._typingMessage != rhs_storage._typingMessage {return false} diff --git a/SessionMessagingKit/Protos/SessionProtos.proto b/SessionMessagingKit/Protos/SessionProtos.proto index b88c58268..a1b80a58b 100644 --- a/SessionMessagingKit/Protos/SessionProtos.proto +++ b/SessionMessagingKit/Protos/SessionProtos.proto @@ -48,6 +48,24 @@ message MessageRequestResponse { optional LokiProfile profile = 3; } +message SyncedExpiries { + + message SyncedConversationExpiries { + + message SyncedExpiry { + // @required + required string serverHash = 1; // messageHash for desktop and serverHash for iOS + // @required + required uint64 expirationTimestamp = 2; // this is only used for deleteAfterRead + } + // @required + required string syncTarget = 1; // the conversationID those expiries are related to + repeated SyncedExpiry expiries = 2; + } + + repeated SyncedConversationExpiries conversationExpiries = 1; +} + message Content { enum ExpirationType { @@ -56,6 +74,7 @@ message Content { } optional DataMessage dataMessage = 1; + optional SyncedExpiries syncedExpiries = 2; optional CallMessage callMessage = 3; optional ReceiptMessage receiptMessage = 5; optional TypingMessage typingMessage = 6;