package main import ( "bufio" "context" "flag" "fmt" "os" "os/signal" "syscall" "time" sdk "ownwire.net/ownwire-sdk" ) func main() { url := flag.String("url", "", "websocket url, e.g. ws://localhost:8080/ownwire") resume_session_id := flag.String("resume", "", "resume session id (optional)") flag.Parse() if *url == "" { fmt.Fprintln(os.Stderr, "missing -url") os.Exit(2) } client := sdk.NewClient(sdk.ClientOptions{ Url: *url, }) ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() if err := client.Connect(ctx, *resume_session_id); err != nil { fmt.Fprintf(os.Stderr, "connect failed: %v\n", err) os.Exit(1) } fmt.Println("connected") sig_ch := make(chan os.Signal, 1) signal.Notify(sig_ch, syscall.SIGINT, syscall.SIGTERM) go func() { for ev := range client.Events() { switch ev.Kind { case sdk.EventOpened: fmt.Println("[opened]") case sdk.EventClosed: fmt.Println("[closed]") return case sdk.EventError: fmt.Fprintf(os.Stderr, "[error] %v\n", ev.Err) case sdk.EventMessage: if ev.Message.Metadata != "" { fmt.Printf("[msg #%d] %s | %s\n", ev.Message.SeqNum, ev.Message.Metadata, ev.Message.Content) } else { fmt.Printf("[msg #%d] %s\n", ev.Message.SeqNum, ev.Message.Content) } } } }() go func() { <-sig_ch client.Close() os.Exit(0) }() scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() send_ctx, send_cancel := context.WithTimeout(context.Background(), 5*time.Second) err := client.Send(send_ctx, line, "") send_cancel() if err != nil { fmt.Fprintf(os.Stderr, "send failed: %v\n", err) } } if err := scanner.Err(); err != nil { fmt.Fprintf(os.Stderr, "stdin error: %v\n", err) } client.Close() }