47 lines
1.2 KiB
Swift
47 lines
1.2 KiB
Swift
import Foundation
|
|
import NIOCore
|
|
|
|
#if canImport(CryptoKit)
|
|
import CryptoKit
|
|
#else
|
|
import Crypto
|
|
#endif
|
|
|
|
struct ServerMessage {
|
|
|
|
static let authTokenSize = SHA256.byteCount
|
|
|
|
static let length = authTokenSize + Message.length
|
|
|
|
let authToken: Data
|
|
|
|
let message: Message
|
|
|
|
/**
|
|
Decode a message from a byte buffer.
|
|
The buffer must contain at least `ServerMessage.length` bytes, or it will return `nil`.
|
|
- Parameter buffer: The buffer containing the bytes.
|
|
*/
|
|
init?(decodeFrom buffer: ByteBuffer) {
|
|
guard let data = buffer.getBytes(at: 0, length: ServerMessage.length) else {
|
|
return nil
|
|
}
|
|
self.authToken = Data(data.prefix(ServerMessage.authTokenSize))
|
|
self.message = Message(decodeFrom: Data(data.dropFirst(ServerMessage.authTokenSize)))
|
|
}
|
|
|
|
var encoded: Data {
|
|
authToken + message.encoded
|
|
}
|
|
|
|
static func token(from buffer: ByteBuffer) -> Data? {
|
|
guard buffer.readableBytes == authTokenSize else {
|
|
return nil
|
|
}
|
|
guard let bytes = buffer.getBytes(at: 0, length: authTokenSize) else {
|
|
return nil
|
|
}
|
|
return Data(bytes)
|
|
}
|
|
}
|