orchard/pkg/client/rpc.go

75 lines
1.4 KiB
Go

package client
import (
"context"
"encoding/json"
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
"net"
"net/http"
)
type RPCService struct {
client *Client
}
func (service *RPCService) Watch(
ctx context.Context,
workerName string,
) (<-chan *v1.WatchInstruction, <-chan error, error) {
wsConn, err := service.client.wsRequest(ctx, "rpc/watch", map[string]string{
"workerName": workerName,
})
if err != nil {
return nil, nil, err
}
watchEventCh := make(chan *v1.WatchInstruction)
errCh := make(chan error, 1)
go func() {
defer func() {
_ = wsConn.Close()
}()
decoder := json.NewDecoder(wsConn)
for {
var watchInstruction v1.WatchInstruction
if err := decoder.Decode(&watchInstruction); err != nil {
errCh <- err
return
}
watchEventCh <- &watchInstruction
}
}()
return watchEventCh, errCh, nil
}
func (service *RPCService) RespondPortForward(
ctx context.Context,
session string,
errorMessage string,
) (net.Conn, error) {
return service.client.wsRequest(ctx, "rpc/port-forward", map[string]string{
"session": session,
"errorMessage": errorMessage,
})
}
func (service *RPCService) RespondIP(
ctx context.Context,
session string,
ip string,
errorMessage string,
) error {
return service.client.request(ctx, http.MethodPost, "rpc/resolve-ip", nil, nil, map[string]string{
"session": session,
"ip": ip,
"errorMessage": errorMessage,
})
}