mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Create MessageSendJob & MessageReceiveJob
Also implement message sending notifications & custom TTL for typing indicators
This commit is contained in:
parent
9e42eeca34
commit
4b63588f1a
2
SessionMessagingKit/Jobs/Job.swift
Normal file
2
SessionMessagingKit/Jobs/Job.swift
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
public protocol Job { }
|
51
SessionMessagingKit/Jobs/MessageReceiveJob.swift
Normal file
51
SessionMessagingKit/Jobs/MessageReceiveJob.swift
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
import SessionUtilities
|
||||||
|
|
||||||
|
public final class MessageReceiveJob : NSObject, Job, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
|
||||||
|
private let data: Data
|
||||||
|
private var failureCount: UInt
|
||||||
|
|
||||||
|
// MARK: Settings
|
||||||
|
private static let maxRetryCount: UInt = 20
|
||||||
|
|
||||||
|
// MARK: Initialization
|
||||||
|
init(data: Data) {
|
||||||
|
self.data = data
|
||||||
|
self.failureCount = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Coding
|
||||||
|
public init?(coder: NSCoder) {
|
||||||
|
guard let data = coder.decodeObject(forKey: "data") as! Data? else { return nil }
|
||||||
|
self.data = data
|
||||||
|
self.failureCount = coder.decodeObject(forKey: "failureCount") as! UInt? ?? 0
|
||||||
|
}
|
||||||
|
|
||||||
|
public func encode(with coder: NSCoder) {
|
||||||
|
coder.encode(data, forKey: "data")
|
||||||
|
coder.encode(failureCount, forKey: "failureCount")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Running
|
||||||
|
public func execute() {
|
||||||
|
Configuration.shared.storage.with { transaction in // Intentionally capture self
|
||||||
|
Threading.workQueue.async {
|
||||||
|
do {
|
||||||
|
let _ = try MessageReceiver.parse(self.data)
|
||||||
|
self.handleSuccess()
|
||||||
|
} catch {
|
||||||
|
SNLog("Couldn't parse message due to error: \(error).")
|
||||||
|
self.handleFailure(error: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handleSuccess() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handleFailure(error: Error) {
|
||||||
|
self.failureCount += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
57
SessionMessagingKit/Jobs/MessageSendJob.swift
Normal file
57
SessionMessagingKit/Jobs/MessageSendJob.swift
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
import SessionUtilities
|
||||||
|
|
||||||
|
// TODO: Destination encoding & decoding
|
||||||
|
|
||||||
|
public final class MessageSendJob : NSObject, Job, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
|
||||||
|
private let message: Message
|
||||||
|
private let destination: Message.Destination
|
||||||
|
private var failureCount: UInt
|
||||||
|
|
||||||
|
// MARK: Settings
|
||||||
|
private static let maxRetryCount: UInt = 20
|
||||||
|
|
||||||
|
// MARK: Initialization
|
||||||
|
init(message: Message, destination: Message.Destination) {
|
||||||
|
self.message = message
|
||||||
|
self.destination = destination
|
||||||
|
self.failureCount = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Coding
|
||||||
|
public init?(coder: NSCoder) {
|
||||||
|
guard let message = coder.decodeObject(forKey: "message") as! Message?,
|
||||||
|
let destination = coder.decodeObject(forKey: "destination") as! Message.Destination? else { return nil }
|
||||||
|
self.message = message
|
||||||
|
self.destination = destination
|
||||||
|
self.failureCount = coder.decodeObject(forKey: "failureCount") as! UInt? ?? 0
|
||||||
|
}
|
||||||
|
|
||||||
|
public func encode(with coder: NSCoder) {
|
||||||
|
coder.encode(message, forKey: "message")
|
||||||
|
coder.encode(destination, forKey: "destination")
|
||||||
|
coder.encode(failureCount, forKey: "failureCount")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Running
|
||||||
|
public func execute() {
|
||||||
|
Configuration.shared.storage.with { transaction in // Intentionally capture self
|
||||||
|
Threading.workQueue.async {
|
||||||
|
MessageSender.send(self.message, to: self.destination, using: transaction).done(on: Threading.workQueue) {
|
||||||
|
self.handleSuccess()
|
||||||
|
}.catch(on: Threading.workQueue) { error in
|
||||||
|
SNLog("Couldn't send message due to error: \(error).")
|
||||||
|
self.handleFailure(error: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handleSuccess() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handleFailure(error: Error) {
|
||||||
|
self.failureCount += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import SessionUtilities
|
||||||
public final class TypingIndicator : ControlMessage {
|
public final class TypingIndicator : ControlMessage {
|
||||||
public var kind: Kind?
|
public var kind: Kind?
|
||||||
|
|
||||||
|
public override class var ttl: UInt64 { 30 * 1000 }
|
||||||
|
|
||||||
// MARK: Kind
|
// MARK: Kind
|
||||||
public enum Kind : String {
|
public enum Kind : String {
|
||||||
case started, stopped
|
case started, stopped
|
||||||
|
|
9
SessionMessagingKit/Messages/Message+Destination.swift
Normal file
9
SessionMessagingKit/Messages/Message+Destination.swift
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
public extension Message {
|
||||||
|
|
||||||
|
enum Destination {
|
||||||
|
case contact(publicKey: String)
|
||||||
|
case closedGroup(groupPublicKey: String)
|
||||||
|
case openGroup(channel: UInt64, server: String)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,15 @@
|
||||||
|
|
||||||
/// Abstract base class for `VisibleMessage` and `ControlMessage`.
|
/// Abstract base class for `VisibleMessage` and `ControlMessage`.
|
||||||
@objc(SNMessage)
|
@objc(SNMessage)
|
||||||
public class Message : NSObject, NSCoding { // Not a protocol for YapDatabase compatibility
|
public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
|
||||||
public var id: String?
|
public var id: String?
|
||||||
public var threadID: String?
|
public var threadID: String?
|
||||||
public var sentTimestamp: UInt64?
|
public var sentTimestamp: UInt64?
|
||||||
public var receivedTimestamp: UInt64?
|
public var receivedTimestamp: UInt64?
|
||||||
public var recipient: String?
|
public var recipient: String?
|
||||||
|
|
||||||
|
public class var ttl: UInt64 { 2 * 24 * 60 * 60 * 1000 }
|
||||||
|
|
||||||
public override init() { }
|
public override init() { }
|
||||||
|
|
||||||
// MARK: Validation
|
// MARK: Validation
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
|
|
||||||
public extension Notification.Name {
|
|
||||||
|
|
||||||
static let calculatingPoW = Notification.Name("calculatingPoW")
|
|
||||||
static let routing = Notification.Name("routing")
|
|
||||||
static let messageSending = Notification.Name("messageSending")
|
|
||||||
static let messageSent = Notification.Name("messageSent")
|
|
||||||
static let messageFailed = Notification.Name("messageFailed")
|
|
||||||
}
|
|
|
@ -2,7 +2,7 @@ import CryptoSwift
|
||||||
import SessionProtocolKit
|
import SessionProtocolKit
|
||||||
import SessionUtilities
|
import SessionUtilities
|
||||||
|
|
||||||
public extension ReceivingPipeline {
|
public extension MessageReceiver {
|
||||||
|
|
||||||
static func decryptWithSharedSenderKeys(envelope: SNProtoEnvelope, using transaction: Any) throws -> (plaintext: Data, senderPublicKey: String) {
|
static func decryptWithSharedSenderKeys(envelope: SNProtoEnvelope, using transaction: Any) throws -> (plaintext: Data, senderPublicKey: String) {
|
||||||
// 1. ) Check preconditions
|
// 1. ) Check preconditions
|
|
@ -1,9 +1,10 @@
|
||||||
import SessionUtilities
|
import SessionUtilities
|
||||||
|
|
||||||
public enum ReceivingPipeline {
|
public enum MessageReceiver {
|
||||||
|
|
||||||
public enum Error : LocalizedError {
|
public enum Error : LocalizedError {
|
||||||
case invalidMessage
|
case invalidMessage
|
||||||
|
case unknownMessage
|
||||||
// Shared sender keys
|
// Shared sender keys
|
||||||
case invalidGroupPublicKey
|
case invalidGroupPublicKey
|
||||||
case noData
|
case noData
|
||||||
|
@ -14,6 +15,7 @@ public enum ReceivingPipeline {
|
||||||
public var errorDescription: String? {
|
public var errorDescription: String? {
|
||||||
switch self {
|
switch self {
|
||||||
case .invalidMessage: return "Invalid message."
|
case .invalidMessage: return "Invalid message."
|
||||||
|
case .unknownMessage: return "Unknown message type."
|
||||||
// Shared sender keys
|
// Shared sender keys
|
||||||
case .invalidGroupPublicKey: return "Invalid group public key."
|
case .invalidGroupPublicKey: return "Invalid group public key."
|
||||||
case .noData: return "Received an empty envelope."
|
case .noData: return "Received an empty envelope."
|
||||||
|
@ -24,14 +26,14 @@ public enum ReceivingPipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func parse(_ ciphertext: Data) -> Message? {
|
public static func parse(_ ciphertext: Data) throws -> Message {
|
||||||
let plaintext = ciphertext // TODO: Decryption
|
let plaintext = ciphertext // TODO: Decryption
|
||||||
let proto: SNProtoContent
|
let proto: SNProtoContent
|
||||||
do {
|
do {
|
||||||
proto = try SNProtoContent.parseData(plaintext)
|
proto = try SNProtoContent.parseData(plaintext)
|
||||||
} catch {
|
} catch {
|
||||||
SNLog("Couldn't parse proto due to error: \(error).")
|
SNLog("Couldn't parse proto due to error: \(error).")
|
||||||
return nil
|
throw error
|
||||||
}
|
}
|
||||||
let message: Message? = {
|
let message: Message? = {
|
||||||
if let readReceipt = ReadReceipt.fromProto(proto) { return readReceipt }
|
if let readReceipt = ReadReceipt.fromProto(proto) { return readReceipt }
|
||||||
|
@ -43,10 +45,10 @@ public enum ReceivingPipeline {
|
||||||
return nil
|
return nil
|
||||||
}()
|
}()
|
||||||
if let message = message {
|
if let message = message {
|
||||||
guard message.isValid else { return nil }
|
guard message.isValid else { throw Error.invalidMessage }
|
||||||
return message
|
return message
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return Error.unknownMessage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
import SessionProtocolKit
|
import SessionProtocolKit
|
||||||
import SessionUtilities
|
import SessionUtilities
|
||||||
|
|
||||||
public extension SendingPipeline {
|
public extension MessageSender {
|
||||||
|
|
||||||
static func encryptWithSignalProtocol(_ plaintext: Data, for publicKey: String, using transaction: Any) throws -> Data {
|
static func encryptWithSignalProtocol(_ plaintext: Data, for publicKey: String, using transaction: Any) throws -> Data {
|
||||||
return Data()
|
return Data()
|
|
@ -2,17 +2,9 @@ import PromiseKit
|
||||||
import SessionSnodeKit
|
import SessionSnodeKit
|
||||||
import SessionUtilities
|
import SessionUtilities
|
||||||
|
|
||||||
// TODO: Notifications
|
|
||||||
// TODO: Notify PN server
|
// TODO: Notify PN server
|
||||||
|
|
||||||
public enum SendingPipeline {
|
public enum MessageSender {
|
||||||
private static let ttl: UInt64 = 2 * 24 * 60 * 60 * 1000
|
|
||||||
|
|
||||||
public enum Destination {
|
|
||||||
case contact(publicKey: String)
|
|
||||||
case closedGroup(groupPublicKey: String)
|
|
||||||
case openGroup(channel: UInt64, server: String)
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Error : LocalizedError {
|
public enum Error : LocalizedError {
|
||||||
case invalidMessage
|
case invalidMessage
|
||||||
|
@ -30,9 +22,12 @@ public enum SendingPipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func send(_ message: Message, to destination: Destination, using transaction: Any) -> Promise<Void> {
|
public static func send(_ message: Message, to destination: Message.Destination, using transaction: Any) -> Promise<Void> {
|
||||||
|
// Validate the message
|
||||||
guard message.isValid else { return Promise(error: Error.invalidMessage) }
|
guard message.isValid else { return Promise(error: Error.invalidMessage) }
|
||||||
|
// Convert it to protobuf
|
||||||
guard let proto = message.toProto() else { return Promise(error: Error.protoConversionFailed) }
|
guard let proto = message.toProto() else { return Promise(error: Error.protoConversionFailed) }
|
||||||
|
// Serialize the protobuf
|
||||||
let plaintext: Data
|
let plaintext: Data
|
||||||
do {
|
do {
|
||||||
plaintext = try proto.serializedData()
|
plaintext = try proto.serializedData()
|
||||||
|
@ -40,6 +35,12 @@ public enum SendingPipeline {
|
||||||
SNLog("Couldn't serialize proto due to error: \(error).")
|
SNLog("Couldn't serialize proto due to error: \(error).")
|
||||||
return Promise(error: error)
|
return Promise(error: error)
|
||||||
}
|
}
|
||||||
|
// Encrypt the serialized protobuf
|
||||||
|
if case .contact(_) = destination {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
NotificationCenter.default.post(name: .encryptingMessage, object: NSNumber(value: message.sentTimestamp!))
|
||||||
|
}
|
||||||
|
}
|
||||||
let ciphertext: Data
|
let ciphertext: Data
|
||||||
do {
|
do {
|
||||||
switch destination {
|
switch destination {
|
||||||
|
@ -51,12 +52,24 @@ public enum SendingPipeline {
|
||||||
SNLog("Couldn't encrypt message for destination: \(destination) due to error: \(error).")
|
SNLog("Couldn't encrypt message for destination: \(destination) due to error: \(error).")
|
||||||
return Promise(error: error)
|
return Promise(error: error)
|
||||||
}
|
}
|
||||||
|
// Calculate proof of work
|
||||||
|
if case .contact(_) = destination {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
NotificationCenter.default.post(name: .calculatingMessagePoW, object: NSNumber(value: message.sentTimestamp!))
|
||||||
|
}
|
||||||
|
}
|
||||||
let recipient = message.recipient!
|
let recipient = message.recipient!
|
||||||
let base64EncodedData = ciphertext.base64EncodedString()
|
let base64EncodedData = ciphertext.base64EncodedString()
|
||||||
guard let (timestamp, nonce) = ProofOfWork.calculate(ttl: ttl, publicKey: recipient, data: base64EncodedData) else {
|
guard let (timestamp, nonce) = ProofOfWork.calculate(ttl: ttl, publicKey: recipient, data: base64EncodedData) else {
|
||||||
SNLog("Proof of work calculation failed.")
|
SNLog("Proof of work calculation failed.")
|
||||||
return Promise(error: Error.proofOfWorkCalculationFailed)
|
return Promise(error: Error.proofOfWorkCalculationFailed)
|
||||||
}
|
}
|
||||||
|
// Send the result
|
||||||
|
if case .contact(_) = destination {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
NotificationCenter.default.post(name: .messageSending, object: NSNumber(value: message.sentTimestamp!))
|
||||||
|
}
|
||||||
|
}
|
||||||
let snodeMessage = SnodeMessage(recipient: recipient, data: base64EncodedData, ttl: ttl, timestamp: timestamp, nonce: nonce)
|
let snodeMessage = SnodeMessage(recipient: recipient, data: base64EncodedData, ttl: ttl, timestamp: timestamp, nonce: nonce)
|
||||||
let (promise, seal) = Promise<Void>.pending()
|
let (promise, seal) = Promise<Void>.pending()
|
||||||
SnodeAPI.sendMessage(snodeMessage).done(on: Threading.workQueue) { promises in
|
SnodeAPI.sendMessage(snodeMessage).done(on: Threading.workQueue) { promises in
|
||||||
|
@ -79,6 +92,16 @@ public enum SendingPipeline {
|
||||||
SNLog("Couldn't send message due to error: \(error).")
|
SNLog("Couldn't send message due to error: \(error).")
|
||||||
seal.reject(error)
|
seal.reject(error)
|
||||||
}
|
}
|
||||||
|
let _ = promise.done(on: DispatchQueue.main) {
|
||||||
|
if case .contact(_) = destination {
|
||||||
|
NotificationCenter.default.post(name: .messageSent, object: NSNumber(value: message.sentTimestamp!))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let _ = promise.catch(on: DispatchQueue.main) { _ in
|
||||||
|
if case .contact(_) = destination {
|
||||||
|
NotificationCenter.default.post(name: .messageSendingFailed, object: NSNumber(value: message.sentTimestamp!))
|
||||||
|
}
|
||||||
|
}
|
||||||
return promise
|
return promise
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
public extension Notification.Name {
|
||||||
|
|
||||||
|
static let encryptingMessage = Notification.Name("encryptingMessage")
|
||||||
|
static let calculatingMessagePoW = Notification.Name("calculatingPoW")
|
||||||
|
static let messageSending = Notification.Name("messageSending")
|
||||||
|
static let messageSent = Notification.Name("messageSent")
|
||||||
|
static let messageSendingFailed = Notification.Name("messageSendingFailed")
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
import SessionUtilities
|
import SessionUtilities
|
||||||
|
|
||||||
public final class ClosedGroupRatchet : NSObject, NSCoding { // Not a struct for YapDatabase compatibility
|
public final class ClosedGroupRatchet : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
|
||||||
public let chainKey: String
|
public let chainKey: String
|
||||||
public let keyIndex: UInt
|
public let keyIndex: UInt
|
||||||
public let messageKeys: [String]
|
public let messageKeys: [String]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
public final class ClosedGroupSenderKey : NSObject, NSCoding { // Not a struct for YapDatabase compatibility
|
public final class ClosedGroupSenderKey : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
|
||||||
public let chainKey: Data
|
public let chainKey: Data
|
||||||
public let keyIndex: UInt
|
public let keyIndex: UInt
|
||||||
public let publicKey: Data
|
public let publicKey: Data
|
||||||
|
|
|
@ -137,7 +137,6 @@ public enum OnionRequestAPI {
|
||||||
}
|
}
|
||||||
}.map2 { paths in
|
}.map2 { paths in
|
||||||
OnionRequestAPI.paths = paths + reusablePaths
|
OnionRequestAPI.paths = paths + reusablePaths
|
||||||
|
|
||||||
Configuration.shared.storage.with { transaction in
|
Configuration.shared.storage.with { transaction in
|
||||||
SNLog("Persisting onion request paths to database.")
|
SNLog("Persisting onion request paths to database.")
|
||||||
Configuration.shared.storage.setOnionRequestPaths(to: paths, using: transaction)
|
Configuration.shared.storage.setOnionRequestPaths(to: paths, using: transaction)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public final class Snode : NSObject, NSCoding { // Not a struct for YapDatabase compatibility
|
public final class Snode : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
|
||||||
public let address: String
|
public let address: String
|
||||||
public let port: UInt16
|
public let port: UInt16
|
||||||
internal let publicKeySet: KeySet
|
internal let publicKeySet: KeySet
|
||||||
|
|
|
@ -573,8 +573,8 @@
|
||||||
C300A5D32554B05A00555489 /* TypingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5D22554B05A00555489 /* TypingIndicator.swift */; };
|
C300A5D32554B05A00555489 /* TypingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5D22554B05A00555489 /* TypingIndicator.swift */; };
|
||||||
C300A5DD2554B06600555489 /* ClosedGroupUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5DC2554B06600555489 /* ClosedGroupUpdate.swift */; };
|
C300A5DD2554B06600555489 /* ClosedGroupUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5DC2554B06600555489 /* ClosedGroupUpdate.swift */; };
|
||||||
C300A5E72554B07300555489 /* ExpirationTimerUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5E62554B07300555489 /* ExpirationTimerUpdate.swift */; };
|
C300A5E72554B07300555489 /* ExpirationTimerUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5E62554B07300555489 /* ExpirationTimerUpdate.swift */; };
|
||||||
C300A5F22554B09800555489 /* SendingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5F12554B09800555489 /* SendingPipeline.swift */; };
|
C300A5F22554B09800555489 /* MessageSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5F12554B09800555489 /* MessageSender.swift */; };
|
||||||
C300A5FC2554B0A000555489 /* ReceivingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5FB2554B0A000555489 /* ReceivingPipeline.swift */; };
|
C300A5FC2554B0A000555489 /* MessageReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C300A5FB2554B0A000555489 /* MessageReceiver.swift */; };
|
||||||
C300A60D2554B31900555489 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5CE2553860700C340D1 /* Logging.swift */; };
|
C300A60D2554B31900555489 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5CE2553860700C340D1 /* Logging.swift */; };
|
||||||
C300A6322554B6D100555489 /* NSDate+Timestamp.mm in Sources */ = {isa = PBXBuildFile; fileRef = C300A6312554B6D100555489 /* NSDate+Timestamp.mm */; };
|
C300A6322554B6D100555489 /* NSDate+Timestamp.mm in Sources */ = {isa = PBXBuildFile; fileRef = C300A6312554B6D100555489 /* NSDate+Timestamp.mm */; };
|
||||||
C300A63B2554B72200555489 /* NSDate+Timestamp.h in Headers */ = {isa = PBXBuildFile; fileRef = C300A6302554B68200555489 /* NSDate+Timestamp.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
C300A63B2554B72200555489 /* NSDate+Timestamp.h in Headers */ = {isa = PBXBuildFile; fileRef = C300A6302554B68200555489 /* NSDate+Timestamp.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
@ -588,14 +588,18 @@
|
||||||
C31FFE57254A5FFE00F19441 /* KeyPairUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31FFE56254A5FFE00F19441 /* KeyPairUtilities.swift */; };
|
C31FFE57254A5FFE00F19441 /* KeyPairUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31FFE56254A5FFE00F19441 /* KeyPairUtilities.swift */; };
|
||||||
C329FEEC24F7277900B1C64C /* LightModeSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C329FEEB24F7277900B1C64C /* LightModeSheet.swift */; };
|
C329FEEC24F7277900B1C64C /* LightModeSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C329FEEB24F7277900B1C64C /* LightModeSheet.swift */; };
|
||||||
C329FEEF24F7743F00B1C64C /* UIViewController+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C329FEED24F7742E00B1C64C /* UIViewController+Utilities.swift */; };
|
C329FEEF24F7743F00B1C64C /* UIViewController+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C329FEED24F7742E00B1C64C /* UIViewController+Utilities.swift */; };
|
||||||
C3471ECB2555356A00297E91 /* SendingPipeline+Encryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471ECA2555356A00297E91 /* SendingPipeline+Encryption.swift */; };
|
C3471ECB2555356A00297E91 /* MessageSender+Encryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471ECA2555356A00297E91 /* MessageSender+Encryption.swift */; };
|
||||||
C3471ED42555386B00297E91 /* AESGCM.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D72553860B00C340D1 /* AESGCM.swift */; };
|
C3471ED42555386B00297E91 /* AESGCM.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D72553860B00C340D1 /* AESGCM.swift */; };
|
||||||
C3471F4225553A4D00297E91 /* Threading.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471F4125553A4D00297E91 /* Threading.swift */; };
|
C3471F4225553A4D00297E91 /* Threading.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471F4125553A4D00297E91 /* Threading.swift */; };
|
||||||
C3471F4C25553AB000297E91 /* ReceivingPipeline+Decryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471F4B25553AB000297E91 /* ReceivingPipeline+Decryption.swift */; };
|
C3471F4C25553AB000297E91 /* MessageReceiver+Decryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */; };
|
||||||
C3471F5625553E1100297E91 /* ECKeyPair+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = C3471F5525553DA000297E91 /* ECKeyPair+Utilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
C3471F5625553E1100297E91 /* ECKeyPair+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = C3471F5525553DA000297E91 /* ECKeyPair+Utilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
C3471F6825553E7600297E91 /* ECKeyPair+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = C3471F6725553E7600297E91 /* ECKeyPair+Utilities.m */; };
|
C3471F6825553E7600297E91 /* ECKeyPair+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = C3471F6725553E7600297E91 /* ECKeyPair+Utilities.m */; };
|
||||||
C3471FA42555439E00297E91 /* Notification+SendingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471FA32555439E00297E91 /* Notification+SendingPipeline.swift */; };
|
C3471FA42555439E00297E91 /* Notification+MessageSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3471FA32555439E00297E91 /* Notification+MessageSender.swift */; };
|
||||||
C34C8F7423A7830B00D82669 /* SpaceMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */; };
|
C34C8F7423A7830B00D82669 /* SpaceMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */; };
|
||||||
|
C352A2F525574B4700338F3E /* Job.swift in Sources */ = {isa = PBXBuildFile; fileRef = C352A2F425574B4700338F3E /* Job.swift */; };
|
||||||
|
C352A2FF25574B6300338F3E /* MessageSendJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = C352A2FE25574B6300338F3E /* MessageSendJob.swift */; };
|
||||||
|
C352A30925574D8500338F3E /* Message+Destination.swift in Sources */ = {isa = PBXBuildFile; fileRef = C352A30825574D8400338F3E /* Message+Destination.swift */; };
|
||||||
|
C352A31325574F5200338F3E /* MessageReceiveJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = C352A31225574F5200338F3E /* MessageReceiveJob.swift */; };
|
||||||
C353F8F9244809150011121A /* PNOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C353F8F8244809150011121A /* PNOptionView.swift */; };
|
C353F8F9244809150011121A /* PNOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C353F8F8244809150011121A /* PNOptionView.swift */; };
|
||||||
C3548F0624456447009433A8 /* PNModeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3548F0524456447009433A8 /* PNModeVC.swift */; };
|
C3548F0624456447009433A8 /* PNModeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3548F0524456447009433A8 /* PNModeVC.swift */; };
|
||||||
C3548F0824456AB6009433A8 /* UIView+Wrapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */; };
|
C3548F0824456AB6009433A8 /* UIView+Wrapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */; };
|
||||||
|
@ -1574,8 +1578,8 @@
|
||||||
C300A5D22554B05A00555489 /* TypingIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypingIndicator.swift; sourceTree = "<group>"; };
|
C300A5D22554B05A00555489 /* TypingIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypingIndicator.swift; sourceTree = "<group>"; };
|
||||||
C300A5DC2554B06600555489 /* ClosedGroupUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClosedGroupUpdate.swift; sourceTree = "<group>"; };
|
C300A5DC2554B06600555489 /* ClosedGroupUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClosedGroupUpdate.swift; sourceTree = "<group>"; };
|
||||||
C300A5E62554B07300555489 /* ExpirationTimerUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpirationTimerUpdate.swift; sourceTree = "<group>"; };
|
C300A5E62554B07300555489 /* ExpirationTimerUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpirationTimerUpdate.swift; sourceTree = "<group>"; };
|
||||||
C300A5F12554B09800555489 /* SendingPipeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendingPipeline.swift; sourceTree = "<group>"; };
|
C300A5F12554B09800555489 /* MessageSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSender.swift; sourceTree = "<group>"; };
|
||||||
C300A5FB2554B0A000555489 /* ReceivingPipeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceivingPipeline.swift; sourceTree = "<group>"; };
|
C300A5FB2554B0A000555489 /* MessageReceiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReceiver.swift; sourceTree = "<group>"; };
|
||||||
C300A6302554B68200555489 /* NSDate+Timestamp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDate+Timestamp.h"; sourceTree = "<group>"; };
|
C300A6302554B68200555489 /* NSDate+Timestamp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDate+Timestamp.h"; sourceTree = "<group>"; };
|
||||||
C300A6312554B6D100555489 /* NSDate+Timestamp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSDate+Timestamp.mm"; sourceTree = "<group>"; };
|
C300A6312554B6D100555489 /* NSDate+Timestamp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSDate+Timestamp.mm"; sourceTree = "<group>"; };
|
||||||
C31A6C59247F214E001123EF /* UIView+Glow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Glow.swift"; sourceTree = "<group>"; };
|
C31A6C59247F214E001123EF /* UIView+Glow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Glow.swift"; sourceTree = "<group>"; };
|
||||||
|
@ -1588,13 +1592,17 @@
|
||||||
C31FFE56254A5FFE00F19441 /* KeyPairUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPairUtilities.swift; sourceTree = "<group>"; };
|
C31FFE56254A5FFE00F19441 /* KeyPairUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPairUtilities.swift; sourceTree = "<group>"; };
|
||||||
C329FEEB24F7277900B1C64C /* LightModeSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightModeSheet.swift; sourceTree = "<group>"; };
|
C329FEEB24F7277900B1C64C /* LightModeSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightModeSheet.swift; sourceTree = "<group>"; };
|
||||||
C329FEED24F7742E00B1C64C /* UIViewController+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Utilities.swift"; sourceTree = "<group>"; };
|
C329FEED24F7742E00B1C64C /* UIViewController+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Utilities.swift"; sourceTree = "<group>"; };
|
||||||
C3471ECA2555356A00297E91 /* SendingPipeline+Encryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SendingPipeline+Encryption.swift"; sourceTree = "<group>"; };
|
C3471ECA2555356A00297E91 /* MessageSender+Encryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+Encryption.swift"; sourceTree = "<group>"; };
|
||||||
C3471F4125553A4D00297E91 /* Threading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Threading.swift; sourceTree = "<group>"; };
|
C3471F4125553A4D00297E91 /* Threading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Threading.swift; sourceTree = "<group>"; };
|
||||||
C3471F4B25553AB000297E91 /* ReceivingPipeline+Decryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReceivingPipeline+Decryption.swift"; sourceTree = "<group>"; };
|
C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+Decryption.swift"; sourceTree = "<group>"; };
|
||||||
C3471F5525553DA000297E91 /* ECKeyPair+Utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ECKeyPair+Utilities.h"; sourceTree = "<group>"; };
|
C3471F5525553DA000297E91 /* ECKeyPair+Utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ECKeyPair+Utilities.h"; sourceTree = "<group>"; };
|
||||||
C3471F6725553E7600297E91 /* ECKeyPair+Utilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "ECKeyPair+Utilities.m"; sourceTree = "<group>"; };
|
C3471F6725553E7600297E91 /* ECKeyPair+Utilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "ECKeyPair+Utilities.m"; sourceTree = "<group>"; };
|
||||||
C3471FA32555439E00297E91 /* Notification+SendingPipeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+SendingPipeline.swift"; sourceTree = "<group>"; };
|
C3471FA32555439E00297E91 /* Notification+MessageSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+MessageSender.swift"; sourceTree = "<group>"; };
|
||||||
C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpaceMono-Bold.ttf"; sourceTree = "<group>"; };
|
C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpaceMono-Bold.ttf"; sourceTree = "<group>"; };
|
||||||
|
C352A2F425574B4700338F3E /* Job.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Job.swift; sourceTree = "<group>"; };
|
||||||
|
C352A2FE25574B6300338F3E /* MessageSendJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSendJob.swift; sourceTree = "<group>"; };
|
||||||
|
C352A30825574D8400338F3E /* Message+Destination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Message+Destination.swift"; sourceTree = "<group>"; };
|
||||||
|
C352A31225574F5200338F3E /* MessageReceiveJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReceiveJob.swift; sourceTree = "<group>"; };
|
||||||
C353F8F8244809150011121A /* PNOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNOptionView.swift; sourceTree = "<group>"; };
|
C353F8F8244809150011121A /* PNOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNOptionView.swift; sourceTree = "<group>"; };
|
||||||
C3548F0524456447009433A8 /* PNModeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNModeVC.swift; sourceTree = "<group>"; };
|
C3548F0524456447009433A8 /* PNModeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNModeVC.swift; sourceTree = "<group>"; };
|
||||||
C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Wrapping.swift"; sourceTree = "<group>"; };
|
C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Wrapping.swift"; sourceTree = "<group>"; };
|
||||||
|
@ -3171,6 +3179,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C3C2A74325539EB700C340D1 /* Message.swift */,
|
C3C2A74325539EB700C340D1 /* Message.swift */,
|
||||||
|
C352A30825574D8400338F3E /* Message+Destination.swift */,
|
||||||
C300A5C62554B02D00555489 /* Visible Message */,
|
C300A5C62554B02D00555489 /* Visible Message */,
|
||||||
C300A5C72554B03900555489 /* Control Message */,
|
C300A5C72554B03900555489 /* Control Message */,
|
||||||
);
|
);
|
||||||
|
@ -3202,16 +3211,16 @@
|
||||||
path = "Control Message";
|
path = "Control Message";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
C300A5F02554B08500555489 /* Pipelines */ = {
|
C300A5F02554B08500555489 /* Sending & Receiving */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C3471FA32555439E00297E91 /* Notification+SendingPipeline.swift */,
|
C3471FA32555439E00297E91 /* Notification+MessageSender.swift */,
|
||||||
C300A5F12554B09800555489 /* SendingPipeline.swift */,
|
C300A5F12554B09800555489 /* MessageSender.swift */,
|
||||||
C3471ECA2555356A00297E91 /* SendingPipeline+Encryption.swift */,
|
C3471ECA2555356A00297E91 /* MessageSender+Encryption.swift */,
|
||||||
C300A5FB2554B0A000555489 /* ReceivingPipeline.swift */,
|
C300A5FB2554B0A000555489 /* MessageReceiver.swift */,
|
||||||
C3471F4B25553AB000297E91 /* ReceivingPipeline+Decryption.swift */,
|
C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */,
|
||||||
);
|
);
|
||||||
path = Pipelines;
|
path = "Sending & Receiving";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
C31F812425258F9C00DD9FD9 /* Database */ = {
|
C31F812425258F9C00DD9FD9 /* Database */ = {
|
||||||
|
@ -3231,6 +3240,16 @@
|
||||||
path = Dependencies;
|
path = Dependencies;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
C352A2F325574B3300338F3E /* Jobs */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C352A2F425574B4700338F3E /* Job.swift */,
|
||||||
|
C352A2FE25574B6300338F3E /* MessageSendJob.swift */,
|
||||||
|
C352A31225574F5200338F3E /* MessageReceiveJob.swift */,
|
||||||
|
);
|
||||||
|
path = Jobs;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
C35E8AA42485C83B00ACB629 /* CSV */ = {
|
C35E8AA42485C83B00ACB629 /* CSV */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -3349,7 +3368,8 @@
|
||||||
C3BBE0752554CDA60050F1E3 /* Configuration.swift */,
|
C3BBE0752554CDA60050F1E3 /* Configuration.swift */,
|
||||||
C3BBE07F2554CDD70050F1E3 /* Storage.swift */,
|
C3BBE07F2554CDD70050F1E3 /* Storage.swift */,
|
||||||
C300A5BB2554AFFB00555489 /* Messages */,
|
C300A5BB2554AFFB00555489 /* Messages */,
|
||||||
C300A5F02554B08500555489 /* Pipelines */,
|
C300A5F02554B08500555489 /* Sending & Receiving */,
|
||||||
|
C352A2F325574B3300338F3E /* Jobs */,
|
||||||
C3BBE0B32554F0D30050F1E3 /* Utilities */,
|
C3BBE0B32554F0D30050F1E3 /* Utilities */,
|
||||||
);
|
);
|
||||||
path = SessionMessagingKit;
|
path = SessionMessagingKit;
|
||||||
|
@ -4907,13 +4927,14 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C3471F4C25553AB000297E91 /* ReceivingPipeline+Decryption.swift in Sources */,
|
C3471F4C25553AB000297E91 /* MessageReceiver+Decryption.swift in Sources */,
|
||||||
C300A5D32554B05A00555489 /* TypingIndicator.swift in Sources */,
|
C300A5D32554B05A00555489 /* TypingIndicator.swift in Sources */,
|
||||||
C3471ECB2555356A00297E91 /* SendingPipeline+Encryption.swift in Sources */,
|
C3471ECB2555356A00297E91 /* MessageSender+Encryption.swift in Sources */,
|
||||||
C300A5F22554B09800555489 /* SendingPipeline.swift in Sources */,
|
C300A5F22554B09800555489 /* MessageSender.swift in Sources */,
|
||||||
C3C2A74D2553A39700C340D1 /* VisibleMessage.swift in Sources */,
|
C3C2A74D2553A39700C340D1 /* VisibleMessage.swift in Sources */,
|
||||||
|
C352A31325574F5200338F3E /* MessageReceiveJob.swift in Sources */,
|
||||||
C3C2A7562553A3AB00C340D1 /* VisibleMessage+Quote.swift in Sources */,
|
C3C2A7562553A3AB00C340D1 /* VisibleMessage+Quote.swift in Sources */,
|
||||||
C300A5FC2554B0A000555489 /* ReceivingPipeline.swift in Sources */,
|
C300A5FC2554B0A000555489 /* MessageReceiver.swift in Sources */,
|
||||||
C3BBE0B52554F0E10050F1E3 /* ProofOfWork.swift in Sources */,
|
C3BBE0B52554F0E10050F1E3 /* ProofOfWork.swift in Sources */,
|
||||||
C3BBE0802554CDD70050F1E3 /* Storage.swift in Sources */,
|
C3BBE0802554CDD70050F1E3 /* Storage.swift in Sources */,
|
||||||
C3C2A7842553AAF300C340D1 /* SNProto.swift in Sources */,
|
C3C2A7842553AAF300C340D1 /* SNProto.swift in Sources */,
|
||||||
|
@ -4924,13 +4945,16 @@
|
||||||
C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */,
|
C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */,
|
||||||
C3471F4225553A4D00297E91 /* Threading.swift in Sources */,
|
C3471F4225553A4D00297E91 /* Threading.swift in Sources */,
|
||||||
C300A5DD2554B06600555489 /* ClosedGroupUpdate.swift in Sources */,
|
C300A5DD2554B06600555489 /* ClosedGroupUpdate.swift in Sources */,
|
||||||
C3471FA42555439E00297E91 /* Notification+SendingPipeline.swift in Sources */,
|
C3471FA42555439E00297E91 /* Notification+MessageSender.swift in Sources */,
|
||||||
|
C352A30925574D8500338F3E /* Message+Destination.swift in Sources */,
|
||||||
C300A5E72554B07300555489 /* ExpirationTimerUpdate.swift in Sources */,
|
C300A5E72554B07300555489 /* ExpirationTimerUpdate.swift in Sources */,
|
||||||
|
C352A2FF25574B6300338F3E /* MessageSendJob.swift in Sources */,
|
||||||
C3C2A75F2553A3C500C340D1 /* VisibleMessage+LinkPreview.swift in Sources */,
|
C3C2A75F2553A3C500C340D1 /* VisibleMessage+LinkPreview.swift in Sources */,
|
||||||
C3C2A74425539EB700C340D1 /* Message.swift in Sources */,
|
C3C2A74425539EB700C340D1 /* Message.swift in Sources */,
|
||||||
C300A5C92554B04E00555489 /* SessionRequest.swift in Sources */,
|
C300A5C92554B04E00555489 /* SessionRequest.swift in Sources */,
|
||||||
C3BBE0C72554F1570050F1E3 /* FixedWidthInteger+BigEndian.swift in Sources */,
|
C3BBE0C72554F1570050F1E3 /* FixedWidthInteger+BigEndian.swift in Sources */,
|
||||||
C300A5B22554AF9800555489 /* VisibleMessage+Profile.swift in Sources */,
|
C300A5B22554AF9800555489 /* VisibleMessage+Profile.swift in Sources */,
|
||||||
|
C352A2F525574B4700338F3E /* Job.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue