Ejemplo n.º 1
0
    private static async Task HandleAuthorizationSequence(string token,
                                                          IWebSocketClientTransportPipeline transportPipeline, CancellationToken cancelToken)
    {
        var connectTimeoutTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancelToken);

        connectTimeoutTokenSource.CancelAfter(5000);
        // Begin the authorization sequence
        // Expect 'auth_required'
        var msg = await transportPipeline.GetNextMessageAsync <HassMessage>(connectTimeoutTokenSource.Token)
                  .ConfigureAwait(false);

        if (msg.Type != "auth_required")
        {
            throw new ApplicationException($"Unexpected type: '{msg.Type}' expected 'auth_required'");
        }

        // Now send the auth message to Home Assistant
        await transportPipeline.SendMessageAsync(
            new HassAuthMessage { AccessToken = token },
            connectTimeoutTokenSource.Token
            ).ConfigureAwait(false);

        // Now get the result
        var authResultMessage = await transportPipeline
                                .GetNextMessageAsync <HassMessage>(connectTimeoutTokenSource.Token).ConfigureAwait(false);

        switch (authResultMessage.Type)
        {
        case "auth_ok":
            return;

        case "auth_invalid":
            await transportPipeline.CloseAsync().ConfigureAwait(false);

            throw new HomeAssistantConnectionException(DisconnectReason.Unauthorized);

        default:
            throw new ApplicationException($"Unexpected response ({authResultMessage.Type})");
        }
    }
Ejemplo n.º 2
0
 public IHomeAssistantConnection New(IWebSocketClientTransportPipeline transportPipeline)
 {
     return(new HomeAssistantConnection(_logger, transportPipeline, _apiManager));
 }