mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
92 lines
2.8 KiB
Go
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
|
|
}
|