gosmartkeyboard/Client.md
Kevin F f089202286 Add building.md
Switch to scanning runes in client since go fmt scanning ignores spaces because of excellent design
2023-01-05 01:10:57 -06:00

2.3 KiB

GoSmartKeyboard Client

When GoSmartKeyboard is started in client mode, it does the following:

  1. Load the connection URL from the second CLI argument.
  2. Load the auth token from the environment variable KEYBOARD_AUTH or stdin.
  3. Connect to the server. 4 Send the auth token to the server.
  4. If the server responds with "authenticated", we start reading keys from stdin and sending them to the server until EOF.

--- handle client command

if len(os.Args) > 1 && os.Args[1] == "connect" { @{start client} os.Exit(0) }


Connecting

The base64 authentication token is loaded from the environment variable KEYBOARD_AUTH, if it does not exist we read it from stdin (base64 encoded), ended with a newline.


--- start client

@{load connection URL from second CLI argument}
@{get authTokenInput from environment}

if !authTokenInputExists {
    fmt.Print("Enter authentication token: ")
    _, err := fmt.Scanln(&authTokenInput)
    if err != nil {
        log.Fatal(err)
    }
}

client, _, err := websocket.DefaultDialer.Dial(connectionURL, nil)
if err != nil {
    log.Fatal("dial:", err)
}
defer client.Close()

err = client.WriteMessage(websocket.TextMessage, []byte(authTokenInput))

if err != nil {
    log.Fatal("write:", err)
}

_, authResponse, err := client.ReadMessage()
if err != nil {
    log.Fatal("read:", err)
}
if string(authResponse) == "authenticated" {
    fmt.Println("authenticated")
} else {
    log.Fatal("authentication failed")
}


---

--- load connection URL from second CLI argument --- noWeave

if len(os.Args) < 3 {
    log.Fatal("missing connection URL")
}

connectionURL := os.Args[2]

if !strings.HasPrefix(connectionURL, "ws://") && !strings.HasPrefix(connectionURL, "wss://") {
    log.Fatal("connection URL must start with ws:// or wss://")
}

---

Sending keys

We read keys from stdin and send them to the server until we get EOF


--- start client +=


for {
    var key string
    reader := bufio.NewReader(os.Stdin)
    
    rune, _, err := reader.ReadRune() //:= fmt.Scan(&key)
    key = string(rune)

    if err != nil {
        if err == io.EOF {
            break
        }
        log.Fatal(err)
    }
    fmt.Println("send" + strings.Replace(key, " ", "space", 10))
    err = client.WriteMessage(websocket.TextMessage, []byte(key))
    if err != nil {
        log.Fatal("write:", err)
    }
}

---