generated from bep/golibtemplate
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
119 lines (103 loc) · 2.65 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package main
import (
"fmt"
"hash"
"hash/fnv"
"log"
"os"
"strconv"
"github.com/bep/execrpc"
"github.com/bep/execrpc/examples/model"
)
func main() {
log.SetFlags(0)
log.SetPrefix("typed-example: ")
// Some test flags from the client.
var (
delayDelivery = os.Getenv("EXECRPC_DELAY_DELIVERY") != ""
noHasher = os.Getenv("EXECRPC_NO_HASHER") != ""
printOutsideServerBefore = os.Getenv("EXECRPC_PRINT_OUTSIDE_SERVER_BEFORE") != ""
printOutsideServerAfter = os.Getenv("EXECRPC_PRINT_OUTSIDE_SERVER_AFTER") != ""
printInsideServer = os.Getenv("EXECRPC_PRINT_INSIDE_SERVER") != ""
)
if printOutsideServerBefore {
fmt.Println("Printing outside server before")
}
var getHasher func() hash.Hash
if !noHasher {
getHasher = func() hash.Hash {
return fnv.New64a()
}
}
var clientConfig model.ExampleConfig
server, err := execrpc.NewServer(
execrpc.ServerOptions[model.ExampleConfig, model.ExampleRequest, model.ExampleMessage, model.ExampleReceipt]{
GetHasher: getHasher,
DelayDelivery: delayDelivery,
Init: func(cfg model.ExampleConfig) error {
clientConfig = cfg
return clientConfig.Init()
},
Handle: func(call *execrpc.Call[model.ExampleRequest, model.ExampleMessage, model.ExampleReceipt]) {
if printInsideServer {
fmt.Println("Printing inside server")
}
if clientConfig.CallShouldFail {
call.Close(
false,
model.ExampleReceipt{
Error: &model.Error{Msg: "failed to echo"},
},
)
return
}
if clientConfig.SendLogMessage {
call.SendRaw(
execrpc.Message{
Header: execrpc.Header{
Version: 32,
Status: 150,
},
Body: []byte("first log message"),
},
execrpc.Message{
Header: execrpc.Header{
Version: 32,
Status: 150,
},
Body: []byte("second log message"),
},
)
}
for i := 0; i < clientConfig.NumMessages; i++ {
call.Enqueue(
model.ExampleMessage{
Hello: strconv.Itoa(i) + ": Hello " + call.Request.Text + "!",
},
)
}
if !clientConfig.NoClose {
var receipt model.ExampleReceipt
if !clientConfig.NoReadingReceipt {
receipt = <-call.Receipt()
receipt.Text = "echoed: " + call.Request.Text
receipt.Size = uint32(123)
}
call.Close(clientConfig.DropMessages, receipt)
}
},
},
)
if err != nil {
handleErr(err)
}
if err := server.Start(); err != nil {
handleErr(err)
}
if printOutsideServerAfter {
fmt.Println("Printing outside server after")
}
}
func handleErr(err error) {
log.Fatalf("error: failed to start typed echo server: %s", err)
}