blob: 2ae23a05f1f9554e61586c276a44c90580545496 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// +build !build_with_native_toolchain
package main
import (
"context"
"log"
"syscall/zx"
"syscall/zx/fidl"
"go.fuchsia.dev/fuchsia/src/lib/component"
"fidl/fuchsia/examples"
)
// echoImpl implements the server functionality of the `Echo` protocol.
//
// It holds an `EchoEventProxy` in order to send events to the client.
type echoImpl struct {
eventSender examples.EchoEventProxy
}
// Assert that `*echoImpl` implements the `EchoWithCtx` interface.
var _ examples.EchoWithCtx = (*echoImpl)(nil)
// EchoString implements the server-side `EchoString` FIDL method. It replies
// with the request value.
func (*echoImpl) EchoString(_ fidl.Context, inValue string) (string, error) {
log.Println("Received EchoString request", inValue)
return inValue, nil
}
// SendString implements the server-side `SendString` FIDL method. It sends an
// `OnString` event with the request value.
func (echo *echoImpl) SendString(_ fidl.Context, inValue string) error {
log.Println("Received SendString request", inValue)
if err := echo.eventSender.OnString(inValue); err != nil {
log.Println("Failed to send event:", err)
}
// We choose to return nil instead of the event sender error, since we don't
// want the server to keep running even if it couldn't send the event.
return nil
}
func main() {
log.SetFlags(log.Lshortfile)
ctx := component.NewContextFromStartupInfo()
ctx.OutgoingService.AddService(
// Register the service under EchoName. This is the same name that
// clients will refer to when they connect using ConnectToEnvService
examples.EchoName,
// The handler for incoming requests for connecting to Echo. It serves
// our implementation of Echo on the provided channel
func(ctx context.Context, c zx.Channel) error {
stub := examples.EchoWithCtxStub{
Impl: &echoImpl{
eventSender: examples.EchoEventProxy(fidl.ChannelProxy{Channel: c}),
},
}
go component.ServeExclusive(ctx, &stub, c, func(err error) {
log.Println(err)
})
return nil
},
)
log.Println("Running echo server")
// Serve the outgoing directory
ctx.BindStartupHandle(context.Background())
}