blob: 1d3eb008c226f25bf1115d4e2fc704a13636c6ac [file] [log] [blame]
// Package appcycle is a stripped-down server stub implementation for the
// AppCycle service. We can't use the generated stub under
// veyron2/services/mgmt/appcycle because that would introduce a recursive
// dependency on veyron/runtimes/google (via veyron2/rt).
//
// TODO(caprita): It would be nice to still use the stub if possible. Look
// into the feasibility of a generated stub that does not depend on veyron2/rt.
package appcycle
import (
"veyron2"
"veyron2/ipc"
)
// AppCycleService is the interface the server implements.
type AppCycleService interface {
// Stop initiates shutdown of the server. It streams back periodic updates
// to give the client an idea of how the shutdown is progressing.
Stop(context ipc.ServerContext, stream AppCycleServiceStopStream) (err error)
// ForceStop tells the server to shut down right away. It can be issued while
// a Stop is outstanding if for example the client does not want to wait any
// longer.
ForceStop(context ipc.ServerContext) (err error)
}
// NewServerAppCycle creates a new receiver from the given AppCycleService.
func NewServerAppCycle(server AppCycleService) interface{} {
return &ServerStubAppCycle{
service: server,
}
}
type AppCycleServiceStopStream interface {
// Send places the item onto the output stream, blocking if there is no buffer
// space available.
Send(item veyron2.Task) error
}
// Implementation of the AppCycleServiceStopStream interface that is not exported.
type implAppCycleServiceStopStream struct {
serverCall ipc.ServerCall
}
func (s *implAppCycleServiceStopStream) Send(item veyron2.Task) error {
return s.serverCall.Send(item)
}
// ServerStubAppCycle wraps a server that implements
// AppCycleService and provides an object that satisfies
// the requirements of veyron2/ipc.ReflectInvoker.
type ServerStubAppCycle struct {
service AppCycleService
}
func (s *ServerStubAppCycle) Stop(call ipc.ServerCall) error {
stream := &implAppCycleServiceStopStream{serverCall: call}
return s.service.Stop(call, stream)
}
func (s *ServerStubAppCycle) ForceStop(call ipc.ServerCall) error {
return s.service.ForceStop(call)
}