add sync expires message and update protobuf

pull/941/head
ryanzhao 2 years ago
parent d4d7f6c72c
commit fd14c50f61

@ -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 = "<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>"; };
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>"; };
@ -2654,6 +2656,7 @@
C300A5BC2554B00D00555489 /* ReadReceipt.swift */,
C300A5D22554B05A00555489 /* TypingIndicator.swift */,
7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */,
7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */,
);
path = "Control Messages";
sourceTree = "<group>";
@ -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 */,

@ -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<CodingKeys> = 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<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)
)
"""
}
}

@ -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,

@ -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<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 = [
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}

@ -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;

Loading…
Cancel
Save