proto-socket/go/example/ws_echo/main.go
toki 14e4cd56d0 feat: add WebSocket/WSS support and Go implementation
- Add WebSocket binary frame support to protocol specification
- Update README and PROTOCOL.md to reflect dual TCP/WebSocket transport
- Add Go implementation with TCP, WebSocket, and heartbeat support
- Include .claude settings configuration
2026-04-11 08:33:46 +09:00

60 lines
1.4 KiB
Go

package main
import (
"context"
"fmt"
"log"
"time"
toki "toki-labs.com/toki_socket/go"
"toki-labs.com/toki_socket/go/packets"
"google.golang.org/protobuf/proto"
"nhooyr.io/websocket"
)
func parserMap() toki.ParserMap {
return toki.ParserMap{
toki.TypeNameOf(&packets.TestData{}): func(b []byte) (proto.Message, error) {
m := &packets.TestData{}
return m, proto.Unmarshal(b, m)
},
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
server := toki.NewWsServer("127.0.0.1", 19092, "/", func(conn *websocket.Conn) *toki.WsClient {
return toki.NewWsClient(conn, 30, 10, parserMap())
})
server.OnClientConnected = func(client *toki.WsClient) {
toki.AddRequestListenerTyped[*packets.TestData, *packets.TestData](&client.Communicator, func(req *packets.TestData) (*packets.TestData, error) {
return &packets.TestData{
Index: req.GetIndex(),
Message: "echo: " + req.GetMessage(),
}, nil
})
}
if err := server.Start(ctx); err != nil {
log.Fatal(err)
}
defer server.Stop()
client, err := toki.DialWs(ctx, "127.0.0.1", 19092, "/", parserMap())
if err != nil {
log.Fatal(err)
}
defer client.Close()
res, err := toki.SendRequestTyped[*packets.TestData, *packets.TestData](
&client.Communicator,
&packets.TestData{Index: 1, Message: "hello ws"},
2*time.Second,
)
if err != nil {
log.Fatal(err)
}
fmt.Println(res.GetMessage())
}