Skip to content
Snippets Groups Projects
Commit b4e276e0 authored by Josh Brooks's avatar Josh Brooks
Browse files

Merge branch 'XX-3578/SendWithVerification' into 'release'

Xx 3578/send with verification

See merge request !76
parents 3ac19237 b56efee3
No related branches found
No related tags found
2 merge requests!117Release,!76Xx 3578/send with verification
......@@ -140,17 +140,19 @@ Full usage of client can be found with `client --help`:
```
$ ./client --help
Runs a client for cMix anonymous communication platform
Usage:
client [flags]
client [command]
Available Commands:
fileTransfer Send and receive file for cMix client
generate Generates version and dependency information for the Elixxir binary
getndf Download the network definition file from the network and print it.
group Group commands for cMix client
help Help about any command
init Initialize a user ID but do not connect to the network
proto Load client with a proto client JSON file.
single Send and respond to single-use messages.
ud Register for and search users using the xx network user discovery service.
version Print the version and dependency information for the Elixxir binary
......@@ -173,8 +175,8 @@ Flags:
-n, --ndf string Path to the network definition JSON file (default "ndf.json")
-p, --password string Password to the session file
--profile-cpu string Enable cpu profiling to this file
--protoUserOut string Path to which a normally constructed client will write proto user JSON file (default "protoUser.json")
--protoUserPath string Path to proto user JSON file containing cryptographic primitives the client will load (default "protoUser.json")
--protoUserOut string Path to which a normally constructed client will write proto user JSON file
--protoUserPath string Path to proto user JSON file containing cryptographic primitives the client will load
--receiveCount uint How many messages we should wait for before quitting (default 1)
--regcode string Identity code (optional)
--send-auth-request Send an auth request to the specified destination and waitfor confirmation
......@@ -186,9 +188,9 @@ Flags:
--unsafe Send raw, unsafe messages without e2e encryption.
--unsafe-channel-creation Turns off the user identity authenticated channel check, automatically approving authenticated channels
--verboseRoundTracking Verbose round tracking, keeps track and prints all rounds the client was aware of while running. Defaults to false if not set.
--verify-sends Ensure successful message sending by checking for round completion
--waitTimeout uint The number of seconds to wait for messages to arrive (default 15)
-w, --writeContact string Write contact information, if any, to this file, defaults to stdout (default "-")
file
Use "client [command] --help" for more information about a command.
```
......
......@@ -12,7 +12,6 @@ import (
"encoding/base64"
"encoding/binary"
"encoding/hex"
"errors"
"fmt"
"github.com/spf13/cobra"
jww "github.com/spf13/jwalterweatherman"
......@@ -198,6 +197,8 @@ var rootCmd = &cobra.Command{
go func(i int) {
defer wg.Done()
fmt.Printf("Sending to %s: %s\n", recipientID, msgBody)
for {
// Send messages
var roundIDs []id.Round
var roundTimeout time.Duration
if unsafe {
......@@ -213,20 +214,44 @@ var rootCmd = &cobra.Command{
jww.FATAL.Panicf("%+v", err)
}
// Construct the callback function which prints out the rounds' results
if viper.GetBool("verify-sends") { // Verify message sends were successful
retryChan := make(chan struct{})
done := make(chan struct{}, 1)
// Construct the callback function which
// verifies successful message send or retries
f := func(allRoundsSucceeded, timedOut bool,
rounds map[id.Round]api.RoundResult) {
printRoundResults(allRoundsSucceeded, timedOut, rounds, roundIDs, msg)
if !allRoundsSucceeded {
retryChan <- struct{}{}
} else {
done <- struct{}{}
}
}
// Have the client report back the round results
err = errors.New("derp")
for j := 0; j < 5 && err != nil; j++ {
// Monitor rounds for results
err = client.GetRoundResults(roundIDs, roundTimeout, f)
if err != nil {
jww.DEBUG.Printf("Could not verify messages were sent successfully, resending messages...")
continue
}
select {
case <-retryChan:
// On a retry, go to the top of the loop
jww.DEBUG.Printf("Messages were not sent successfully, resending messages...")
continue
case <-done:
// Close channels on verification success
close(done)
close(retryChan)
break
}
if err != nil {
jww.FATAL.Panicf("Message sending for send %d failed: %+v", i, err)
}
break
}
}(i)
}
......@@ -842,6 +867,10 @@ func init() {
"", 500, "The delay between sending the messages in ms")
viper.BindPFlag("sendDelay", rootCmd.Flags().Lookup("sendDelay"))
rootCmd.Flags().BoolP("verify-sends", "", false,
"Ensure successful message sending by checking for round completion")
viper.BindPFlag("verify-sends", rootCmd.Flags().Lookup("verify-sends"))
rootCmd.Flags().UintP("receiveCount",
"", 1, "How many messages we should wait for before quitting")
viper.BindPFlag("receiveCount", rootCmd.Flags().Lookup("receiveCount"))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment