55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
|
// Copyright 2016 The Chihaya Authors. All rights reserved.
|
||
|
// Use of this source code is governed by the BSD 2-Clause license,
|
||
|
// which can be found in the LICENSE file.
|
||
|
|
||
|
// Package server implements an abstraction over servers meant to be run .
|
||
|
// alongside a tracker.
|
||
|
//
|
||
|
// Servers may be implementations of different transport protocols or have their
|
||
|
// own custom behavior.
|
||
|
package server
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/chihaya/chihaya/config"
|
||
|
"github.com/chihaya/chihaya/tracker"
|
||
|
)
|
||
|
|
||
|
var constructors = make(map[string]Constructor)
|
||
|
|
||
|
// Constructor is a function that creates a new Server.
|
||
|
type Constructor func(*config.ServerConfig, *tracker.Tracker) (Server, error)
|
||
|
|
||
|
// Register makes a Constructor available by the provided name.
|
||
|
//
|
||
|
// If this function is called twice with the same name or if the Constructor is
|
||
|
// nil, it panics.
|
||
|
func Register(name string, con Constructor) {
|
||
|
if con == nil {
|
||
|
panic("server: could not register nil Constructor")
|
||
|
}
|
||
|
if _, dup := constructors[name]; dup {
|
||
|
panic("server: could not register duplicate Constructor: " + name)
|
||
|
}
|
||
|
constructors[name] = con
|
||
|
}
|
||
|
|
||
|
// New creates a Server specified by a configuration.
|
||
|
func New(cfg *config.ServerConfig, tkr *tracker.Tracker) (Server, error) {
|
||
|
con, ok := constructors[cfg.Name]
|
||
|
if !ok {
|
||
|
return nil, fmt.Errorf(
|
||
|
"server: unknown Constructor %q (forgotten import?)",
|
||
|
cfg.Name,
|
||
|
)
|
||
|
}
|
||
|
return con(cfg, tkr)
|
||
|
}
|
||
|
|
||
|
// Server represents one instance of a server accessing the tracker.
|
||
|
type Server interface {
|
||
|
Start()
|
||
|
Stop()
|
||
|
}
|