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 }