github.com/glide-im/glide@v1.6.0/cmd/im_service/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"github.com/glide-im/glide/config"
     6  	"github.com/glide-im/glide/internal/action_handler"
     7  	"github.com/glide-im/glide/internal/im_server"
     8  	"github.com/glide-im/glide/internal/message_handler"
     9  	"github.com/glide-im/glide/internal/message_store_db"
    10  	"github.com/glide-im/glide/internal/pkg/db"
    11  	"github.com/glide-im/glide/internal/server_state"
    12  	"github.com/glide-im/glide/internal/world_channel"
    13  	"github.com/glide-im/glide/pkg/auth/jwt_auth"
    14  	"github.com/glide-im/glide/pkg/bootstrap"
    15  	"github.com/glide-im/glide/pkg/logger"
    16  	"github.com/glide-im/glide/pkg/rpc"
    17  	"github.com/glide-im/glide/pkg/store"
    18  	"github.com/glide-im/glide/pkg/subscription/subscription_impl"
    19  )
    20  
    21  var state *string
    22  
    23  func init() {
    24  	state = flag.String("state", "", "show im server run state")
    25  	flag.Parse()
    26  }
    27  
    28  func main() {
    29  
    30  	if *state != "" {
    31  		server_state.ShowServerState("localhost:9091")
    32  		return
    33  	}
    34  
    35  	config.MustLoad()
    36  
    37  	err := db.Init(nil, &db.RedisConfig{
    38  		Host:     config.Redis.Host,
    39  		Port:     config.Redis.Port,
    40  		Password: config.Redis.Password,
    41  		Db:       config.Redis.Db,
    42  	})
    43  	if err != nil {
    44  		panic(err)
    45  	}
    46  
    47  	gateway, err := im_server.NewServer(
    48  		config.WsServer.ID,
    49  		config.WsServer.Addr,
    50  		config.WsServer.Port,
    51  		config.Common.SecretKey,
    52  	)
    53  	if err != nil {
    54  		panic(err)
    55  	}
    56  
    57  	var cStore store.MessageStore = &message_store_db.IdleChatMessageStore{}
    58  	var sStore store.SubscriptionStore = &message_store_db.IdleSubscriptionStore{}
    59  
    60  	if config.Common.StoreMessageHistory {
    61  		if config.Kafka != nil && len(config.Kafka.Address) != 0 {
    62  			producer, err := store.NewKafkaProducer(config.Kafka.Address)
    63  			if err != nil {
    64  				panic(err)
    65  			}
    66  			cStore = producer
    67  			sStore = producer
    68  			logger.D("Kafka is configured, all message will push to kafka: %v", config.Kafka.Address)
    69  		} else {
    70  			dbStore, err := message_store_db.New(config.MySql)
    71  			if err != nil {
    72  				panic(err)
    73  			}
    74  			cStore = dbStore
    75  			sStore = &message_store_db.SubscriptionMessageStore{}
    76  		}
    77  
    78  	} else {
    79  		logger.D("Common.StoreMessageHistory is false, message history will not be stored")
    80  	}
    81  
    82  	handler, err := message_handler.NewHandlerWithOptions(&message_handler.Options{
    83  		MessageStore:           cStore,
    84  		Auth:                   jwt_auth.NewAuthorizeImpl(config.WsServer.JwtSecret),
    85  		DontInitDefaultHandler: true,
    86  		NotifyOnErr:            true,
    87  	})
    88  	if err != nil {
    89  		panic(err)
    90  	}
    91  	if config.Common.StoreOfflineMessage {
    92  		message_handler.Enable = true
    93  		handler.SetOfflineMessageHandler(message_handler.GetHandleFn())
    94  	}
    95  	action_handler.Setup(handler)
    96  	handler.InitDefaultHandler(nil)
    97  
    98  	subscription := subscription_impl.NewSubscription(sStore, sStore)
    99  	subscription.SetGateInterface(gateway)
   100  	options := bootstrap.Options{
   101  		Messaging:    handler,
   102  		Gate:         gateway,
   103  		Subscription: subscription,
   104  	}
   105  
   106  	go func() {
   107  		logger.D("websocket listening on %s:%d", config.WsServer.Addr, config.WsServer.Port)
   108  		err = bootstrap.Bootstrap(&options)
   109  
   110  		if err != nil {
   111  			panic(err)
   112  		}
   113  	}()
   114  
   115  	go func() {
   116  		logger.D("state server is listening on 0.0.0.0:%d", 9091)
   117  		server_state.StartSrv(9091, gateway)
   118  	}()
   119  
   120  	err = world_channel.EnableWorldChannel(subscription_impl.NewSubscribeWrap(subscription))
   121  	if err != nil {
   122  		panic(err)
   123  	}
   124  
   125  	rpcOpts := rpc.ServerOptions{
   126  		Name:    config.IMService.Name,
   127  		Network: config.IMService.Network,
   128  		Addr:    config.IMService.Addr,
   129  		Port:    config.IMService.Port,
   130  	}
   131  	logger.D("rpc %s listening on %s %s:%d", rpcOpts.Name, rpcOpts.Network, rpcOpts.Addr, rpcOpts.Port)
   132  	err = im_server.RunRpcServer(&rpcOpts, gateway, subscription)
   133  	if err != nil {
   134  		panic(err)
   135  	}
   136  }