clean up SyncedExpiries

pull/941/head
ryanzhao 1 year ago
parent 0bfc337bcc
commit 4c366dedc2

@ -143,7 +143,6 @@
7BA68909272A27BE00EFC32F /* SessionCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA68908272A27BE00EFC32F /* SessionCall.swift */; };
7BA6890D27325CCC00EFC32F /* SessionCallManager+CXCallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6890C27325CCC00EFC32F /* SessionCallManager+CXCallController.swift */; };
7BA6890F27325CE300EFC32F /* SessionCallManager+CXProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6890E27325CE300EFC32F /* SessionCallManager+CXProvider.swift */; };
7BA7F0EF2942C33600CF6B05 /* SyncExpiriesJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA7F0EE2942C33600CF6B05 /* SyncExpiriesJob.swift */; };
7BAA7B6628D2DE4700AE1489 /* _009_OpenGroupPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAA7B6528D2DE4700AE1489 /* _009_OpenGroupPermission.swift */; };
7BAADFCC27B0EF23007BCF92 /* CallVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAADFCB27B0EF23007BCF92 /* CallVideoView.swift */; };
7BAADFCE27B215FE007BCF92 /* UIView+Draggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAADFCD27B215FE007BCF92 /* UIView+Draggable.swift */; };
@ -159,8 +158,6 @@
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 */; };
7BD01B1629233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01B1529233F3B00E7D9E6 /* MessageReceiver+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 */; };
@ -1218,7 +1215,6 @@
7BA68908272A27BE00EFC32F /* SessionCall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCall.swift; sourceTree = "<group>"; };
7BA6890C27325CCC00EFC32F /* SessionCallManager+CXCallController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+CXCallController.swift"; sourceTree = "<group>"; };
7BA6890E27325CE300EFC32F /* SessionCallManager+CXProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+CXProvider.swift"; sourceTree = "<group>"; };
7BA7F0EE2942C33600CF6B05 /* SyncExpiriesJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncExpiriesJob.swift; sourceTree = "<group>"; };
7BAA7B6528D2DE4700AE1489 /* _009_OpenGroupPermission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _009_OpenGroupPermission.swift; sourceTree = "<group>"; };
7BAADFCB27B0EF23007BCF92 /* CallVideoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallVideoView.swift; sourceTree = "<group>"; };
7BAADFCD27B215FE007BCF92 /* UIView+Draggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Draggable.swift"; sourceTree = "<group>"; };
@ -1236,8 +1232,6 @@
7BC707F127290ACB002817AD /* SessionCallManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCallManager.swift; sourceTree = "<group>"; };
7BCD116B27016062006330F1 /* WebRTCSession+DataChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WebRTCSession+DataChannel.swift"; sourceTree = "<group>"; };
7BD01B112921BDDF00E7D9E6 /* MessageSender+TTL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+TTL.swift"; sourceTree = "<group>"; };
7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncedExpiriesMessage.swift; sourceTree = "<group>"; };
7BD01B1529233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+SyncedExpiriesMessage.swift"; sourceTree = "<group>"; };
7BD477A727EC39F5004E2822 /* Atomic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = "<group>"; };
7BD477A927F15F24004E2822 /* OpenGroupServerIdLookup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenGroupServerIdLookup.swift; sourceTree = "<group>"; };
7BDCFC0424206E7300641C39 /* SessionNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SessionNotificationServiceExtension.entitlements; sourceTree = "<group>"; };
@ -2668,7 +2662,6 @@
C300A5BC2554B00D00555489 /* ReadReceipt.swift */,
C300A5D22554B05A00555489 /* TypingIndicator.swift */,
7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */,
7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */,
);
path = "Control Messages";
sourceTree = "<group>";
@ -3915,7 +3908,6 @@
FD5C7304284F0FF30029977D /* MessageReceiver+VisibleMessages.swift */,
C32C5A87256DBCF9003C73A2 /* MessageReceiver+ClosedGroups.swift */,
FD5C7306284F103B0029977D /* MessageReceiver+MessageRequests.swift */,
7BD01B1529233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift */,
);
path = "Message Handling";
sourceTree = "<group>";
@ -4153,7 +4145,6 @@
FDF0B74E28079E5E004C14C5 /* SendReadReceiptsJob.swift */,
C352A348255781F400338F3E /* AttachmentDownloadJob.swift */,
C352A35A2557824E00338F3E /* AttachmentUploadJob.swift */,
7BA7F0EE2942C33600CF6B05 /* SyncExpiriesJob.swift */,
);
path = Types;
sourceTree = "<group>";
@ -5458,7 +5449,6 @@
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 */,
@ -5478,7 +5468,6 @@
FD09797F27FCFBFF00936362 /* OWSAES256Key+Utilities.swift in Sources */,
FDB4BBC72838B91E00B7C95D /* LinkPreviewError.swift in Sources */,
FD09798327FD1A1500936362 /* ClosedGroup.swift in Sources */,
7BA7F0EF2942C33600CF6B05 /* SyncExpiriesJob.swift in Sources */,
B8B320B7258C30D70020074B /* HTMLMetadata.swift in Sources */,
FD09798727FD1B7800936362 /* GroupMember.swift in Sources */,
FDB4BBC92839BEF000B7C95D /* ProfileManagerError.swift in Sources */,
@ -5534,7 +5523,6 @@
B8D0A25925E367AC00C1835E /* Notification+MessageReceiver.swift in Sources */,
FD245C53285065DB00B966DD /* ProximityMonitoringManager.swift in Sources */,
FD245C55285065E500B966DD /* OpenGroupManager.swift in Sources */,
7BD01B1629233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift in Sources */,
FDC4387227B5BB3B00C60D73 /* FileUploadResponse.swift in Sources */,
C32C599E256DB02B003C73A2 /* TypingIndicators.swift in Sources */,
FD716E682850318E00C96BF4 /* CallMode.swift in Sources */,

@ -45,6 +45,5 @@ public enum SNMessagingKit { // Just to make the external API nice
JobRunner.add(executor: SendReadReceiptsJob.self, for: .sendReadReceipts)
JobRunner.add(executor: AttachmentDownloadJob.self, for: .attachmentDownload)
JobRunner.add(executor: AttachmentUploadJob.self, for: .attachmentUpload)
JobRunner.add(executor: SyncExpiriesJob.self, for: .syncExpires)
}
}

@ -41,7 +41,6 @@ public struct ControlMessageProcessRecord: Codable, FetchableRecord, Persistable
case unsendRequest = 7
case messageRequestResponse = 8
case call = 9
case syncedExpiries = 10
}
/// The id for the thread the control message is associated to
@ -108,7 +107,6 @@ public struct ControlMessageProcessRecord: Codable, FetchableRecord, Persistable
case is UnsendRequest: return .unsendRequest
case is MessageRequestResponse: return .messageRequestResponse
case is CallMessage: return .call
case is SyncedExpiriesMessage: return .syncedExpiries
default: preconditionFailure("[ControlMessageProcessRecord] Unsupported message type")
}
}()

@ -76,20 +76,6 @@ public extension DisappearingMessagesJob {
let id: Int64
let expiresInSeconds: TimeInterval
}
let interactionIdsByExpiresInSeconds: [TimeInterval: [Int64]] = (try? Interaction
.filter(interactionIds.contains(Interaction.Columns.id))
.filter(
Interaction.Columns.expiresInSeconds != nil &&
Interaction.Columns.expiresStartedAtMs == nil
)
.select(Interaction.Columns.id, Interaction.Columns.expiresInSeconds)
.asRequest(of: ExpirationInfo.self)
.fetchAll(db))
.defaulting(to: [])
.grouped(by: \.expiresInSeconds)
.mapValues { $0.map { $0.id } }
// Update the expiring messages expiresStartedAtMs value
let changeCount: Int? = try? Interaction
@ -103,22 +89,6 @@ public extension DisappearingMessagesJob {
// If there were no changes then none of the provided `interactionIds` are expiring messages
guard (changeCount ?? 0) > 0 else { return nil }
if DisappearingMessagesConfiguration.isNewConfigurationEnabled {
if !interactionIdsByExpiresInSeconds.isEmpty {
JobRunner.upsert(
db,
job: Job(
variant: .syncExpires,
details: SyncExpiriesJob.Details(
interactionIdsByExpiresInSeconds: interactionIdsByExpiresInSeconds,
startedAtMs: startedAtMs,
threadId: threadId
)
)
)
}
}
return updateNextRunIfNeeded(db)
}

@ -1,158 +0,0 @@
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import GRDB
import PromiseKit
import SignalCoreKit
import SessionUtilitiesKit
import SessionSnodeKit
public enum SyncExpiriesJob: JobExecutor {
public static let maxFailureCount: Int = 10
public static let requiresThreadId: Bool = false
public static let requiresInteractionId: Bool = false
public static func run(
_ job: Job,
queue: DispatchQueue,
success: @escaping (Job, Bool) -> (),
failure: @escaping (Job, Error?, Bool) -> (),
deferred: @escaping (Job) -> ()
) {
guard
let detailsData: Data = job.details,
let details: Details = try? JSONDecoder().decode(Details.self, from: detailsData)
else {
failure(job, JobRunnerError.missingRequiredDetails, false)
return
}
guard DisappearingMessagesConfiguration.isNewConfigurationEnabled else {
success(job, false)
return
}
var interactionIdsWithNoServerHashByExpiresInSeconds: [TimeInterval: [Int64]] = [:]
details.interactionIdsByExpiresInSeconds.forEach { expiresInSeconds, interactionIds in
guard let interactions = Storage.shared.read({ db in try? Interaction.fetchAll(db, ids: interactionIds) }) else { return }
let interactionIdsWithNoServerHash: [Int64] = interactions.compactMap { $0.serverHash == nil ? $0.id : nil }
if !interactionIdsWithNoServerHash.isEmpty {
interactionIdsWithNoServerHashByExpiresInSeconds[expiresInSeconds] = interactionIdsWithNoServerHash
}
let serverHashes = interactions.compactMap { $0.serverHash }
guard !serverHashes.isEmpty else { return }
let expirationTimestamp: Int64 = Int64(ceil(details.startedAtMs + expiresInSeconds * 1000))
let userPublicKey: String = getUserHexEncodedPublicKey()
// Send SyncExpiriesMessage
let syncTarget: String = interactions[0].authorId
let syncExpiries: [SyncedExpiriesMessage.SyncedExpiry] = serverHashes.map { serverHash in
return SyncedExpiriesMessage.SyncedExpiry(
serverHash: serverHash,
expirationTimestamp: expirationTimestamp)
}
let syncExpiriesMessage = SyncedExpiriesMessage(
conversationExpiries: [syncTarget: syncExpiries]
)
Storage.shared.writeAsync { db in
MessageSender
.send(
db,
message: syncExpiriesMessage,
threadId: details.threadId,
interactionId: nil,
to: .contact(publicKey: userPublicKey)
)
}
// Update the ttls
SnodeAPI.updateExpiry(
publicKey: userPublicKey,
updatedExpiryMs: expirationTimestamp,
serverHashes: serverHashes
).retainUntilComplete()
}
if !interactionIdsWithNoServerHashByExpiresInSeconds.isEmpty {
Storage.shared.writeAsync { db in
JobRunner.upsert(
db,
job: Job(
variant: .syncExpires,
details: SyncExpiriesJob.Details(
interactionIdsByExpiresInSeconds: interactionIdsWithNoServerHashByExpiresInSeconds,
startedAtMs: details.startedAtMs,
threadId: details.threadId
)
)
)
}
}
success(job, false)
}
}
// MARK: - SyncExpiriesJob.Details
extension SyncExpiriesJob {
public struct Details: Codable {
private enum CodingKeys: String, CodingKey {
case interactionIdsByExpiresInSeconds
case startedAtMs
case threadId
}
public let interactionIdsByExpiresInSeconds: [TimeInterval: [Int64]]
public let startedAtMs: Double
public let threadId: String
// MARK: - Initialization
public init(
interactionIdsByExpiresInSeconds: [TimeInterval: [Int64]],
startedAtMs: Double,
threadId: String
) {
self.interactionIdsByExpiresInSeconds = interactionIdsByExpiresInSeconds
self.startedAtMs = startedAtMs
self.threadId = threadId
}
// MARK: - Codable
public init(from decoder: Decoder) throws {
let container: KeyedDecodingContainer<CodingKeys> = try decoder.container(keyedBy: CodingKeys.self)
self = Details(
interactionIdsByExpiresInSeconds: try container.decode(
[TimeInterval: [Int64]].self,
forKey: .interactionIdsByExpiresInSeconds
),
startedAtMs: try container.decode(
Double.self,
forKey: .startedAtMs
),
threadId: try container.decode(
String.self,
forKey: .threadId
)
)
}
public func encode(to encoder: Encoder) throws {
var container: KeyedEncodingContainer<CodingKeys> = encoder.container(keyedBy: CodingKeys.self)
try container.encode(interactionIdsByExpiresInSeconds, forKey: .interactionIdsByExpiresInSeconds)
try container.encode(startedAtMs, forKey: .startedAtMs)
try container.encode(threadId, forKey: .threadId)
}
}
}

@ -1,113 +0,0 @@
// 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
}
override public var isSelfSendValid: Bool { true }
// MARK: - Codable
required init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container: KeyedDecodingContainer<CodingKeys> = try decoder.container(keyedBy: CodingKeys.self)
conversationExpiries = ((try? container.decode([String: [SyncedExpiry]].self, forKey: .conversationExpiries)) ?? [:])
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container: KeyedEncodingContainer<CodingKeys> = 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)
)
"""
}
}

@ -115,7 +115,6 @@ public extension Message {
case messageRequestResponse
case visibleMessage
case callMessage
case syncedExpiriesMessage
init?(from type: Message) {
switch type {
@ -129,7 +128,6 @@ public extension Message {
case is MessageRequestResponse: self = .messageRequestResponse
case is VisibleMessage: self = .visibleMessage
case is CallMessage: self = .callMessage
case is SyncedExpiriesMessage: self = .syncedExpiriesMessage
default: return nil
}
}
@ -146,7 +144,6 @@ public extension Message {
case .messageRequestResponse: return MessageRequestResponse.self
case .visibleMessage: return VisibleMessage.self
case .callMessage: return CallMessage.self
case .syncedExpiriesMessage: return SyncedExpiriesMessage.self
}
}
@ -167,7 +164,6 @@ public extension Message {
case .messageRequestResponse: return try container.decode(MessageRequestResponse.self, forKey: key)
case .visibleMessage: return try container.decode(VisibleMessage.self, forKey: key)
case .callMessage: return try container.decode(CallMessage.self, forKey: key)
case .syncedExpiriesMessage: return try container.decode(SyncedExpiriesMessage.self, forKey: key)
}
}
}
@ -185,8 +181,7 @@ public extension Message {
.unsendRequest,
.messageRequestResponse,
.visibleMessage,
.callMessage,
.syncedExpiriesMessage
.callMessage
]
return prioritisedVariants

@ -581,330 +581,6 @@ 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 {
@ -972,9 +648,6 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
if hasLastDisappearingMessageChangeTimestamp {
builder.setLastDisappearingMessageChangeTimestamp(lastDisappearingMessageChangeTimestamp)
}
if let _value = syncedExpiries {
builder.setSyncedExpiries(_value)
}
return builder
}
@ -1028,10 +701,6 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
proto.lastDisappearingMessageChangeTimestamp = valueParam
}
@objc public func setSyncedExpiries(_ valueParam: SNProtoSyncedExpiries) {
proto.syncedExpiries = valueParam.proto
}
@objc public func build() throws -> SNProtoContent {
return try SNProtoContent.parseProto(proto)
}
@ -1059,8 +728,6 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
@objc public let messageRequestResponse: SNProtoMessageRequestResponse?
@objc public let syncedExpiries: SNProtoSyncedExpiries?
@objc public var expirationType: SNProtoContentExpirationType {
return SNProtoContent.SNProtoContentExpirationTypeWrap(proto.expirationType)
}
@ -1090,8 +757,7 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
configurationMessage: SNProtoConfigurationMessage?,
dataExtractionNotification: SNProtoDataExtractionNotification?,
unsendRequest: SNProtoUnsendRequest?,
messageRequestResponse: SNProtoMessageRequestResponse?,
syncedExpiries: SNProtoSyncedExpiries?) {
messageRequestResponse: SNProtoMessageRequestResponse?) {
self.proto = proto
self.dataMessage = dataMessage
self.callMessage = callMessage
@ -1101,7 +767,6 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
self.dataExtractionNotification = dataExtractionNotification
self.unsendRequest = unsendRequest
self.messageRequestResponse = messageRequestResponse
self.syncedExpiries = syncedExpiries
}
@objc
@ -1155,11 +820,6 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
messageRequestResponse = try SNProtoMessageRequestResponse.parseProto(proto.messageRequestResponse)
}
var syncedExpiries: SNProtoSyncedExpiries? = nil
if proto.hasSyncedExpiries {
syncedExpiries = try SNProtoSyncedExpiries.parseProto(proto.syncedExpiries)
}
// MARK: - Begin Validation Logic for SNProtoContent -
// MARK: - End Validation Logic for SNProtoContent -
@ -1172,8 +832,7 @@ extension SNProtoSyncedExpiries.SNProtoSyncedExpiriesBuilder {
configurationMessage: configurationMessage,
dataExtractionNotification: dataExtractionNotification,
unsendRequest: unsendRequest,
messageRequestResponse: messageRequestResponse,
syncedExpiries: syncedExpiries)
messageRequestResponse: messageRequestResponse)
return result
}

@ -271,75 +271,6 @@ 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
@ -444,15 +375,6 @@ struct SessionProtos_Content {
/// Clears the value of `lastDisappearingMessageChangeTimestamp`. Subsequent reads from it will return its default value.
mutating func clearLastDisappearingMessageChangeTimestamp() {_uniqueStorage()._lastDisappearingMessageChangeTimestamp = 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 unknownFields = SwiftProtobuf.UnknownStorage()
enum ExpirationType: SwiftProtobuf.Enum {
@ -2045,131 +1967,6 @@ 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<D: SwiftProtobuf.Decoder>(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<V: SwiftProtobuf.Visitor>(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<D: SwiftProtobuf.Decoder>(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<V: SwiftProtobuf.Visitor>(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<D: SwiftProtobuf.Decoder>(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<V: SwiftProtobuf.Visitor>(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 = [
@ -2184,7 +1981,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
11: .same(proto: "expirationType"),
12: .same(proto: "expirationTimer"),
13: .same(proto: "lastDisappearingMessageChangeTimestamp"),
14: .same(proto: "syncedExpiries"),
]
fileprivate class _StorageClass {
@ -2199,7 +1995,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
var _expirationType: SessionProtos_Content.ExpirationType? = nil
var _expirationTimer: UInt32? = nil
var _lastDisappearingMessageChangeTimestamp: UInt64? = nil
var _syncedExpiries: SessionProtos_SyncedExpiries? = nil
static let defaultInstance = _StorageClass()
@ -2217,7 +2012,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
_expirationType = source._expirationType
_expirationTimer = source._expirationTimer
_lastDisappearingMessageChangeTimestamp = source._lastDisappearingMessageChangeTimestamp
_syncedExpiries = source._syncedExpiries
}
}
@ -2238,7 +2032,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
if let v = _storage._dataExtractionNotification, !v.isInitialized {return false}
if let v = _storage._unsendRequest, !v.isInitialized {return false}
if let v = _storage._messageRequestResponse, !v.isInitialized {return false}
if let v = _storage._syncedExpiries, !v.isInitialized {return false}
return true
}
}
@ -2262,7 +2055,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
case 11: try { try decoder.decodeSingularEnumField(value: &_storage._expirationType) }()
case 12: try { try decoder.decodeSingularUInt32Field(value: &_storage._expirationTimer) }()
case 13: try { try decoder.decodeSingularUInt64Field(value: &_storage._lastDisappearingMessageChangeTimestamp) }()
case 14: try { try decoder.decodeSingularMessageField(value: &_storage._syncedExpiries) }()
default: break
}
}
@ -2304,9 +2096,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
if let v = _storage._lastDisappearingMessageChangeTimestamp {
try visitor.visitSingularUInt64Field(value: v, fieldNumber: 13)
}
if let v = _storage._syncedExpiries {
try visitor.visitSingularMessageField(value: v, fieldNumber: 14)
}
}
try unknownFields.traverse(visitor: &visitor)
}
@ -2327,7 +2116,6 @@ extension SessionProtos_Content: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
if _storage._expirationType != rhs_storage._expirationType {return false}
if _storage._expirationTimer != rhs_storage._expirationTimer {return false}
if _storage._lastDisappearingMessageChangeTimestamp != rhs_storage._lastDisappearingMessageChangeTimestamp {return false}
if _storage._syncedExpiries != rhs_storage._syncedExpiries {return false}
return true
}
if !storagesAreEqual {return false}

@ -48,24 +48,6 @@ 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 {
@ -84,7 +66,6 @@ message Content {
optional ExpirationType expirationType = 11;
optional uint32 expirationTimer = 12;
optional uint64 lastDisappearingMessageChangeTimestamp = 13;
optional SyncedExpiries syncedExpiries = 14;
}
message CallMessage {

@ -1,34 +0,0 @@
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import GRDB
import SignalCoreKit
import SessionUtilitiesKit
extension MessageReceiver {
internal static func handleSyncedExpiriesMessage(
_ db: Database,
message: SyncedExpiriesMessage,
dependencies: SMKDependencies
) throws {
let userPublicKey: String = getUserHexEncodedPublicKey(db, dependencies: dependencies)
guard userPublicKey == message.sender else { return }
message.conversationExpiries.forEach { (syncTarget, expiries) in
expiries.forEach { syncExpiry in
guard
let interaction = try? Interaction.filter(
Interaction.Columns.threadId == syncTarget &&
Interaction.Columns.serverHash == syncExpiry.serverHash
).fetchOne(db),
let durationSeconds = interaction.expiresInSeconds
else { return }
try? interaction.with(
wasRead: true,
expiresStartedAtMs: Double(syncExpiry.expirationTimestamp) - durationSeconds * 1000
).update(db)
}
}
}
}

@ -222,9 +222,6 @@ public enum MessageReceiver {
case let message as MessageRequestResponse:
try MessageReceiver.handleMessageRequestResponse(db, message: message, dependencies: dependencies)
case let message as SyncedExpiriesMessage:
try MessageReceiver.handleSyncedExpiriesMessage(db, message: message, dependencies: dependencies)
case let message as VisibleMessage:
try MessageReceiver.handleVisibleMessage(

@ -134,7 +134,7 @@ public final class MessageSender {
let plaintext: Data
do {
plaintext = (message is SyncedExpiriesMessage) ? try proto.serializedData() : try proto.serializedData().paddedMessageBody()
plaintext = try proto.serializedData().paddedMessageBody()
}
catch {
SNLog("Couldn't serialize proto due to error: \(error).")

Loading…
Cancel
Save