session-ios/SessionMessagingKit/Pipelines/SendingPipeline.swift

52 lines
2.1 KiB
Swift
Raw Normal View History

2020-11-06 03:46:06 +01:00
import PromiseKit
import SessionSnodeKit
import SessionUtilities
2020-11-05 23:17:05 +01:00
public enum SendingPipeline {
2020-11-06 06:28:06 +01:00
private static let ttl: UInt64 = 2 * 24 * 60 * 60 * 1000
2020-11-05 23:17:05 +01:00
2020-11-06 03:46:06 +01:00
public enum Destination {
case contact(publicKey: String)
case closedGroup(publicKey: String)
case openGroup(channel: UInt64, server: String)
}
public enum Error : LocalizedError {
2020-11-06 06:28:06 +01:00
case invalidMessage
2020-11-06 03:46:06 +01:00
case protoConversionFailed
case protoSerializationFailed
2020-11-06 03:56:26 +01:00
case proofOfWorkCalculationFailed
2020-11-06 03:46:06 +01:00
public var errorDescription: String? {
switch self {
2020-11-06 06:28:06 +01:00
case .invalidMessage: return "Invalid message."
2020-11-06 03:46:06 +01:00
case .protoConversionFailed: return "Couldn't convert message to proto."
case .protoSerializationFailed: return "Couldn't serialize proto."
2020-11-06 03:56:26 +01:00
case .proofOfWorkCalculationFailed: return "Proof of work calculation failed."
2020-11-06 03:46:06 +01:00
}
}
}
public static func send(_ message: Message, to destination: Destination) -> Promise<Void> {
2020-11-06 06:28:06 +01:00
guard message.isValidForSending else { return Promise(error: Error.invalidMessage) }
2020-11-06 03:46:06 +01:00
guard let proto = message.toProto() else { return Promise(error: Error.protoConversionFailed) }
2020-11-06 06:28:06 +01:00
let plaintext: Data
2020-11-06 03:46:06 +01:00
do {
2020-11-06 06:28:06 +01:00
plaintext = try proto.serializedData()
2020-11-06 03:46:06 +01:00
} catch {
SNLog("Couldn't serialize proto due to error: \(error).")
return Promise(error: Error.protoSerializationFailed)
}
2020-11-06 06:28:06 +01:00
let ciphertext = plaintext // TODO: Encryption
let recipient = message.recipient!
let base64EncodedData = ciphertext.base64EncodedString()
2020-11-06 03:56:26 +01:00
guard let (timestamp, nonce) = ProofOfWork.calculate(ttl: ttl, publicKey: recipient, data: base64EncodedData) else {
SNLog("Proof of work calculation failed.")
return Promise(error: Error.proofOfWorkCalculationFailed)
}
2020-11-06 03:46:06 +01:00
let snodeMessage = SnodeMessage(recipient: recipient, data: base64EncodedData, ttl: ttl, timestamp: timestamp, nonce: nonce)
let _ = SnodeAPI.sendMessage(snodeMessage)
return Promise.value(())
}
2020-11-05 23:17:05 +01:00
}