2022-12-08 13:05:19 -03:00

92 lines
2.8 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package apiv1
import (
"context"
"fmt"
connect "github.com/bufbuild/connect-go"
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
"github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus"
)
func NewIDEClientService(pool proxy.ServerConnectionPool) *IDEClientService {
return &IDEClientService{
connectionPool: pool,
}
}
var _ v1connect.IDEClientServiceHandler = (*IDEClientService)(nil)
type IDEClientService struct {
connectionPool proxy.ServerConnectionPool
v1connect.UnimplementedIDEClientServiceHandler
}
func (this *IDEClientService) SendHeartbeat(ctx context.Context, req *connect.Request[v1.SendHeartbeatRequest]) (*connect.Response[v1.SendHeartbeatResponse], error) {
logger := ctxlogrus.Extract(ctx)
conn, err := getConnection(ctx, this.connectionPool)
if err != nil {
return nil, err
}
workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())
if err != nil {
logger.WithError(err).Error("Failed to get workspace.")
return nil, proxy.ConvertError(err)
}
if workspace.LatestInstance == nil {
logger.WithError(err).Error("Failed to get latest instance.")
return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("instance not found"))
}
err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
InstanceID: workspace.LatestInstance.ID,
WasClosed: false,
})
if err != nil {
return nil, proxy.ConvertError(err)
}
return connect.NewResponse(&v1.SendHeartbeatResponse{}), nil
}
func (this *IDEClientService) SendDidClose(ctx context.Context, req *connect.Request[v1.SendDidCloseRequest]) (*connect.Response[v1.SendDidCloseResponse], error) {
logger := ctxlogrus.Extract(ctx)
conn, err := getConnection(ctx, this.connectionPool)
if err != nil {
return nil, err
}
workspace, err := conn.GetWorkspace(ctx, req.Msg.GetWorkspaceId())
if err != nil {
logger.WithError(err).Error("Failed to get workspace.")
return nil, proxy.ConvertError(err)
}
if workspace.LatestInstance == nil {
logger.WithError(err).Error("Failed to get latest instance.")
return nil, connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("instance not found"))
}
err = conn.SendHeartBeat(ctx, &protocol.SendHeartBeatOptions{
InstanceID: workspace.LatestInstance.ID,
WasClosed: true,
})
if err != nil {
return nil, proxy.ConvertError(err)
}
return connect.NewResponse(&v1.SendDidCloseResponse{}), nil
}