func GetEngine(coord peer.MessageHandlerCoordinator) (peer.Engine, error) { var err error engineOnce.Do(func() { engine = new(EngineImpl) helper := NewHelper(coord) engine.consenter = controller.NewConsenter(helper) helper.setConsenter(engine.consenter) engine.peerEndpoint, err = coord.GetPeerEndpoint() engine.consensusFan = util.NewMessageFan() go func() { logger.Debug("Starting up message thread for consenter") // The channel never closes, so this should never break for msg := range engine.consensusFan.GetOutChannel() { engine.consenter.RecvMsg(msg.Msg, msg.Sender) } }() }) return engine, err }