Process/Stop router
This commit is contained in:
		| @@ -22,46 +22,9 @@ type network struct { | |||||||
| 	exit      chan bool | 	exit      chan bool | ||||||
| } | } | ||||||
|  |  | ||||||
| func (n *network) Name() string { | // process processes router advertisements and randomly sends the advert | ||||||
| 	return n.options.Name | // to a node in the network. Over a period of time the routers should converge. | ||||||
| } | func (n *network) process(advertChan <-chan *router.Advert) { | ||||||
|  |  | ||||||
| // Implements the server.ServeRequest method. |  | ||||||
| func (n *network) ServeRequest(ctx context.Context, req server.Request, rsp server.Response) error { |  | ||||||
| 	// If we're being called then execute our handlers |  | ||||||
| 	if req.Service() == n.options.Name { |  | ||||||
| 		return n.handler.ServeRequest(ctx, req, rsp) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// execute the proxy |  | ||||||
| 	return n.options.Proxy.ServeRequest(ctx, req, rsp) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (n *network) Connect() error { |  | ||||||
| 	return n.options.Server.Start() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (n *network) Close() error { |  | ||||||
| 	n.Lock() |  | ||||||
| 	defer n.Unlock() |  | ||||||
|  |  | ||||||
| 	// check if we're connected |  | ||||||
| 	if !n.connected { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	advertChan, err := n.options.Router.Advertise() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	go n.run(advertChan) |  | ||||||
|  |  | ||||||
| 	// stop the server |  | ||||||
| 	return n.options.Server.Stop() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (n *network) run(advertChan <-chan *router.Advert) { |  | ||||||
| 	for { | 	for { | ||||||
| 		select { | 		select { | ||||||
| 		// process local adverts and randomly fire them at other nodes | 		// process local adverts and randomly fire them at other nodes | ||||||
| @@ -95,6 +58,70 @@ func (n *network) run(advertChan <-chan *router.Advert) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | func (n *network) Name() string { | ||||||
|  | 	return n.options.Name | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Implements the server.ServeRequest method. | ||||||
|  | func (n *network) ServeRequest(ctx context.Context, req server.Request, rsp server.Response) error { | ||||||
|  | 	// If we're being called then execute our handlers | ||||||
|  | 	if req.Service() == n.options.Name { | ||||||
|  | 		return n.handler.ServeRequest(ctx, req, rsp) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// execute the proxy | ||||||
|  | 	return n.options.Proxy.ServeRequest(ctx, req, rsp) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (n *network) Connect() error { | ||||||
|  | 	n.Lock() | ||||||
|  | 	defer n.Unlock() | ||||||
|  |  | ||||||
|  | 	// check if we're connected | ||||||
|  | 	if !n.connected { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// start advertising | ||||||
|  | 	advertChan, err := n.options.Router.Advertise() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// process the adverts | ||||||
|  | 	go n.process(advertChan) | ||||||
|  |  | ||||||
|  | 	// start the server | ||||||
|  | 	if err := n.options.Server.Start(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// set connected to true | ||||||
|  | 	n.connected = true | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (n *network) Close() error { | ||||||
|  | 	n.Lock() | ||||||
|  | 	defer n.Unlock() | ||||||
|  |  | ||||||
|  | 	// check if we're connected | ||||||
|  | 	if !n.connected { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// set connected to false | ||||||
|  | 	n.connected = false | ||||||
|  |  | ||||||
|  | 	// stop the router | ||||||
|  | 	if err := n.options.Router.Stop(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// stop the server | ||||||
|  | 	return n.options.Server.Stop() | ||||||
|  | } | ||||||
|  |  | ||||||
| // newNetwork returns a new network node | // newNetwork returns a new network node | ||||||
| func newNetwork(opts ...Option) Network { | func newNetwork(opts ...Option) Network { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user