Add network logging and some optimizations

This commit is contained in:
Stephan Vanterpool
2018-08-29 23:53:56 -07:00
parent b7feb3b402
commit dfa4768917
8 changed files with 20 additions and 12 deletions

View File

@@ -92,6 +92,8 @@ extension ClientEvent.EventType {
return L10n.ClientEvents.EventType.locationUpdate
case .serviceCall:
return L10n.ClientEvents.EventType.serviceCall
case .networkRequest:
return L10n.ClientEvents.EventType.networkRequest
case .unknown:
return L10n.ClientEvents.EventType.unknown
}

View File

@@ -97,6 +97,8 @@ internal enum L10n {
internal enum EventType {
/// Location Update
internal static let locationUpdate = L10n.tr("Localizable", "client_events.event_type.location_update")
/// Network Request
internal static let networkRequest = L10n.tr("Localizable", "client_events.event_type.networkRequest")
/// Notification
internal static let notification = L10n.tr("Localizable", "client_events.event_type.notification")
/// Service Call

View File

@@ -149,6 +149,7 @@ send notifications to your device.";
"client_events.event_type.service_call" = "Service Call";
"client_events.event_type.notification" = "Notification";
"client_events.event_type.location_update" = "Location Update";
"client_events.event_type.networkRequest" = "Network Request";
"client_events.event_type.unknown" = "Unknown";
"client_events.view.clear" = "Clear";
"settings.connection_section.network_name.title" = "Current Network Name";

View File

@@ -673,7 +673,7 @@ class SettingsViewController: FormViewController, CLLocationManagerDelegate, SFS
self.authenticationController.authenticateWithBrowser(at: connectionInfo.activeURL)
}.then { (code: String) -> Promise<String> in
print("Browser auth succeeded, getting token")
let tokenManager = TokenManager(baseURL: connectionInfo.activeURL, tokenInfo: nil)
let tokenManager = TokenManager(connectionInfo: connectionInfo, tokenInfo: nil)
return tokenManager.initialTokenWithCode(code)
}.then { _ -> Promise<ConnectionInfo> in
print("Token acquired")

View File

@@ -96,7 +96,7 @@ public class HomeAssistantAPI {
case .legacy(let apiPassword):
self.manager = self.configureSessionManager(withPassword: apiPassword)
case .modern(let tokenInfo):
self.tokenManager = TokenManager(baseURL: connectionInfo.baseURL, tokenInfo: tokenInfo)
self.tokenManager = TokenManager(connectionInfo: connectionInfo, tokenInfo: tokenInfo)
tokenManager?.authenticationRequiredCallback = {
return self.authenticationController.authenticateWithBrowser(at: connectionInfo.baseURL)
}

View File

@@ -15,22 +15,22 @@ import ObjectMapper
typealias URLRequestConvertible = Alamofire.URLRequestConvertible
public class AuthenticationAPI {
let baseURL: URL
let connectionInfo: ConnectionInfo
public enum AuthenticationError: Error {
case unexepectedType
case unexpectedResponse
case invalidCode
}
init(baseURL: URL) {
self.baseURL = baseURL
init(connectionInfo: ConnectionInfo) {
self.connectionInfo = connectionInfo
}
public func refreshTokenWith(tokenInfo: TokenInfo) -> Promise<TokenInfo> {
return Promise { seal in
let token = tokenInfo.refreshToken
let routeInfo = RouteInfo(route: AuthenticationRoute.refreshToken(token: token),
baseURL: self.baseURL)
baseURL: self.connectionInfo.activeURL)
let request = Alamofire.request(routeInfo)
let context = TokenInfo.TokenInfoContext(oldTokenInfo: tokenInfo)
request.validate().responseObject(context: context) { (dataresponse: DataResponse<TokenInfo>) in
@@ -48,7 +48,7 @@ public class AuthenticationAPI {
public func fetchTokenWithCode(_ authorizationCode: String) -> Promise<TokenInfo> {
return Promise { seal in
let routeInfo = RouteInfo(route: AuthenticationRoute.token(authorizationCode: authorizationCode),
baseURL: self.baseURL)
baseURL: self.connectionInfo.activeURL)
let request = Alamofire.request(routeInfo)
request.validate().responseObject { (dataresponse: DataResponse<TokenInfo>) in
switch dataresponse.result {

View File

@@ -20,7 +20,7 @@ public class TokenManager: RequestAdapter, RequestRetrier {
private var tokenInfo: TokenInfo?
private var authenticationAPI: AuthenticationAPI
private var refreshPromiseCache: Promise<String>?
private let baseURL: URL
private let connectionInfo: ConnectionInfo
/// This should be set to enable the token manager to trigger re-authentication when needed.
public var authenticationRequiredCallback: (() -> Promise<String>)?
@@ -29,9 +29,9 @@ public class TokenManager: RequestAdapter, RequestRetrier {
return self.tokenInfo != nil
}
public init(baseURL: URL, tokenInfo: TokenInfo? = nil) {
self.baseURL = baseURL
self.authenticationAPI = AuthenticationAPI(baseURL: baseURL)
public init(connectionInfo: ConnectionInfo, tokenInfo: TokenInfo? = nil) {
self.connectionInfo = connectionInfo
self.authenticationAPI = AuthenticationAPI(connectionInfo: self.connectionInfo)
self.tokenInfo = tokenInfo
}
@@ -42,7 +42,6 @@ public class TokenManager: RequestAdapter, RequestRetrier {
return self.authenticationAPI.fetchTokenWithCode(code).then { tokenInfo -> Promise<String> in
self.tokenInfo = tokenInfo
Current.settingsStore.tokenInfo = tokenInfo
Current.settingsStore.baseURL = self.baseURL
return self.bearerToken
}
}
@@ -103,6 +102,9 @@ public class TokenManager: RequestAdapter, RequestRetrier {
return urlRequest
}
let text = "Request(SSID: \(ConnectionInfo.currentSSID() ?? "Unavailable") - \(urlRequest.url?.absoluteString ?? "URL Unavailable")"
let networkEvent = ClientEvent(text: text, type: .networkRequest)
Current.clientEventStore.addEvent(networkEvent)
var newRequest = urlRequest
newRequest.setValue("Bearer \(tokenInfo.accessToken)", forHTTPHeaderField: "Authorization")
return newRequest

View File

@@ -16,6 +16,7 @@ public class ClientEvent: Object {
case notification
case serviceCall
case locationUpdate
case networkRequest
case unknown
}