|
|
|
@ -361,7 +361,6 @@ public enum SessionUtil {
|
|
|
|
|
let needsPush: Bool = try groupedMessages
|
|
|
|
|
.sorted { lhs, rhs in lhs.key.processingOrder < rhs.key.processingOrder }
|
|
|
|
|
.reduce(false) { prevNeedsPush, next -> Bool in
|
|
|
|
|
let latestConfigSentTimestampMs: Int64 = Int64(next.value.compactMap { $0.sentTimestamp }.max() ?? 0)
|
|
|
|
|
let needsPush: Bool = try SessionUtil
|
|
|
|
|
.config(for: next.key, publicKey: publicKey)
|
|
|
|
|
.mutate { conf in
|
|
|
|
@ -373,10 +372,41 @@ public enum SessionUtil {
|
|
|
|
|
.map { message -> [UInt8] in message.data.bytes }
|
|
|
|
|
.unsafeCopy()
|
|
|
|
|
var mergeSize: [Int] = next.value.map { $0.data.count }
|
|
|
|
|
config_merge(conf, &mergeHashes, &mergeData, &mergeSize, next.value.count)
|
|
|
|
|
var mergedHashesPtr: UnsafeMutablePointer<config_string_list>?
|
|
|
|
|
try CExceptionHelper.performSafely {
|
|
|
|
|
mergedHashesPtr = config_merge(
|
|
|
|
|
conf,
|
|
|
|
|
&mergeHashes,
|
|
|
|
|
&mergeData,
|
|
|
|
|
&mergeSize,
|
|
|
|
|
next.value.count
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
mergeHashes.forEach { $0?.deallocate() }
|
|
|
|
|
mergeData.forEach { $0?.deallocate() }
|
|
|
|
|
|
|
|
|
|
// Get the list of hashes from the config (to determine which were successful)
|
|
|
|
|
let mergedHashes: [String] = mergedHashesPtr
|
|
|
|
|
.map { ptr in
|
|
|
|
|
[String](
|
|
|
|
|
pointer: ptr.pointee.value,
|
|
|
|
|
count: ptr.pointee.len,
|
|
|
|
|
defaultValue: []
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
.defaulting(to: [])
|
|
|
|
|
let maybeLatestConfigSentTimestampMs: Int64? = next.value
|
|
|
|
|
.filter { mergedHashes.contains($0.serverHash ?? "") }
|
|
|
|
|
.compactMap { $0.sentTimestamp.map { Int64($0) } }
|
|
|
|
|
.sorted()
|
|
|
|
|
.last
|
|
|
|
|
mergedHashesPtr?.deallocate()
|
|
|
|
|
|
|
|
|
|
// If no messages were merged then no need to do anything
|
|
|
|
|
guard let latestConfigSentTimestampMs: Int64 = maybeLatestConfigSentTimestampMs else {
|
|
|
|
|
return config_needs_push(conf)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Apply the updated states to the database
|
|
|
|
|
do {
|
|
|
|
|
switch next.key {
|
|
|
|
|