gitextract_k26pvt4s/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ └── bug_report.md │ └── workflows/ │ ├── docker.yml │ ├── maven.yml │ └── reusable_run_tests.yml ├── .gitignore ├── CLAUDE.md ├── LICENSE ├── Makefile ├── README-zh.md ├── README.md ├── checkstyle/ │ ├── checkstyle.xml │ └── suppressions.xml ├── cim-client/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── crossoverjie/ │ │ │ └── cim/ │ │ │ └── client/ │ │ │ ├── CIMClientApplication.java │ │ │ ├── config/ │ │ │ │ ├── AppConfiguration.java │ │ │ │ ├── BeanConfig.java │ │ │ │ └── SwaggerConfig.java │ │ │ ├── scanner/ │ │ │ │ └── Scan.java │ │ │ ├── service/ │ │ │ │ ├── InnerCommand.java │ │ │ │ ├── InnerCommandContext.java │ │ │ │ ├── MsgHandle.java │ │ │ │ ├── MsgLogger.java │ │ │ │ ├── ShutDownSign.java │ │ │ │ └── impl/ │ │ │ │ ├── AsyncMsgLogger.java │ │ │ │ ├── EchoServiceImpl.java │ │ │ │ ├── MsgCallBackListener.java │ │ │ │ ├── MsgHandler.java │ │ │ │ └── command/ │ │ │ │ ├── CloseAIModelCommand.java │ │ │ │ ├── DelayMsgCommand.java │ │ │ │ ├── EchoInfoCommand.java │ │ │ │ ├── EmojiCommand.java │ │ │ │ ├── OpenAIModelCommand.java │ │ │ │ ├── PrefixSearchCommand.java │ │ │ │ ├── PrintAllCommand.java │ │ │ │ ├── PrintOnlineUsersCommand.java │ │ │ │ ├── QueryHistoryCommand.java │ │ │ │ └── ShutDownCommand.java │ │ │ └── util/ │ │ │ └── SpringBeanFactory.java │ │ └── resources/ │ │ ├── application.yaml │ │ └── banner.txt │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── crossoverjie/ │ │ └── cim/ │ │ ├── client/ │ │ │ └── service/ │ │ │ ├── InnerCommandContextTest.java │ │ │ └── impl/ │ │ │ └── AsyncMsgLoggerTest.java │ │ └── server/ │ │ └── test/ │ │ ├── CommonTest.java │ │ └── EchoTest.java │ └── resources/ │ └── application.yaml ├── cim-client-sdk/ │ ├── README.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── crossoverjie/ │ │ └── cim/ │ │ └── client/ │ │ └── sdk/ │ │ ├── Client.java │ │ ├── ClientBuilder.java │ │ ├── ClientState.java │ │ ├── Event.java │ │ ├── FetchOfflineMsgJob.java │ │ ├── ReConnectManager.java │ │ ├── RouteManager.java │ │ ├── impl/ │ │ │ ├── ClientBuilderImpl.java │ │ │ ├── ClientConfigurationData.java │ │ │ └── ClientImpl.java │ │ └── io/ │ │ ├── CIMClientHandle.java │ │ ├── CIMClientHandleInitializer.java │ │ ├── MessageListener.java │ │ ├── ReconnectCheck.java │ │ └── backoff/ │ │ ├── BackoffStrategy.java │ │ └── RandomBackoff.java │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── crossoverjie/ │ │ └── cim/ │ │ └── client/ │ │ └── sdk/ │ │ ├── ClientTest.java │ │ └── OfflineMsgTest.java │ └── resources/ │ ├── application-route.yaml │ └── init.sql ├── cim-common/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── crossoverjie/ │ │ │ └── cim/ │ │ │ └── common/ │ │ │ ├── constant/ │ │ │ │ └── Constants.java │ │ │ ├── core/ │ │ │ │ └── proxy/ │ │ │ │ ├── DynamicUrl.java │ │ │ │ ├── Request.java │ │ │ │ └── RpcProxyManager.java │ │ │ ├── data/ │ │ │ │ └── construct/ │ │ │ │ ├── RingBufferWheel.java │ │ │ │ ├── SortArrayMap.java │ │ │ │ └── TrieTree.java │ │ │ ├── enums/ │ │ │ │ ├── StatusEnum.java │ │ │ │ └── SystemCommandEnum.java │ │ │ ├── exception/ │ │ │ │ ├── CIMException.java │ │ │ │ └── GenericException.java │ │ │ ├── kit/ │ │ │ │ └── HeartBeatHandler.java │ │ │ ├── metastore/ │ │ │ │ ├── AbstractConfiguration.java │ │ │ │ ├── MetaStore.java │ │ │ │ ├── ZkConfiguration.java │ │ │ │ └── ZkMetaStoreImpl.java │ │ │ ├── pojo/ │ │ │ │ ├── CIMUserInfo.java │ │ │ │ └── RouteInfo.java │ │ │ ├── req/ │ │ │ │ └── BaseRequest.java │ │ │ ├── res/ │ │ │ │ ├── BaseResponse.java │ │ │ │ └── NULLBody.java │ │ │ ├── route/ │ │ │ │ └── algorithm/ │ │ │ │ ├── RouteHandle.java │ │ │ │ ├── consistenthash/ │ │ │ │ │ ├── AbstractConsistentHash.java │ │ │ │ │ ├── ConsistentHashHandle.java │ │ │ │ │ ├── SortArrayMapConsistentHash.java │ │ │ │ │ └── TreeMapConsistentHash.java │ │ │ │ ├── loop/ │ │ │ │ │ └── LoopHandle.java │ │ │ │ └── random/ │ │ │ │ └── RandomHandle.java │ │ │ └── util/ │ │ │ ├── HttpClient.java │ │ │ ├── NettyAttrUtil.java │ │ │ ├── RouteInfoParseUtil.java │ │ │ ├── SnowflakeIdWorker.java │ │ │ └── StringUtil.java │ │ ├── proto/ │ │ │ └── cim.proto │ │ └── resources/ │ │ └── log4j.properties │ └── test/ │ └── java/ │ └── com/ │ └── crossoverjie/ │ └── cim/ │ └── common/ │ ├── CommonTest.java │ ├── core/ │ │ └── proxy/ │ │ └── RpcProxyManagerTest.java │ ├── data/ │ │ └── construct/ │ │ ├── RingBufferWheelTest.java │ │ ├── ScheduledTest.java │ │ ├── SortArrayMapTest.java │ │ ├── TimerTest.java │ │ └── TrieTreeTest.java │ ├── enums/ │ │ └── SystemCommandEnumTypeTest.java │ ├── metastore/ │ │ └── MetaStoreTest.java │ ├── route/ │ │ └── algorithm/ │ │ ├── consistenthash/ │ │ │ ├── ConsistentHashHandleTest.java │ │ │ ├── RangeCheckTestUtil.java │ │ │ ├── SortArrayMapConsistentHashTest.java │ │ │ └── TreeMapConsistentHashTest.java │ │ ├── loop/ │ │ │ └── LoopHandleTest.java │ │ └── random/ │ │ └── RandomHandleTest.java │ └── util/ │ ├── HttpClientTest.java │ └── ProtocolTest.java ├── cim-forward-route/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── crossoverjie/ │ │ │ └── cim/ │ │ │ └── route/ │ │ │ ├── RouteApplication.java │ │ │ ├── config/ │ │ │ │ ├── AppConfiguration.java │ │ │ │ ├── BeanConfig.java │ │ │ │ ├── MySqlPersistenceConfig.java │ │ │ │ ├── OfflineMsgStoreConfig.java │ │ │ │ └── SwaggerConfig.java │ │ │ ├── constant/ │ │ │ │ └── Constant.java │ │ │ ├── controller/ │ │ │ │ └── RouteController.java │ │ │ ├── exception/ │ │ │ │ └── ExceptionHandlingController.java │ │ │ ├── factory/ │ │ │ │ └── OfflineMsgFactory.java │ │ │ ├── kit/ │ │ │ │ └── NetAddressIsReachable.java │ │ │ ├── service/ │ │ │ │ ├── AccountService.java │ │ │ │ ├── CommonBizService.java │ │ │ │ ├── OfflineMsgService.java │ │ │ │ ├── UserInfoCacheService.java │ │ │ │ └── impl/ │ │ │ │ ├── AccountServiceRedisImpl.java │ │ │ │ ├── OfflineMsgServiceImpl.java │ │ │ │ └── UserInfoCacheServiceImpl.java │ │ │ └── util/ │ │ │ └── SpringBeanFactory.java │ │ └── resources/ │ │ ├── application.yaml │ │ ├── banner.txt │ │ └── lua/ │ │ └── offLine.lua │ └── test/ │ ├── java/ │ │ ├── CommonTest.java │ │ └── com/ │ │ └── crossoverjie/ │ │ └── cim/ │ │ └── route/ │ │ └── service/ │ │ └── impl/ │ │ ├── AbstractBaseTest.java │ │ ├── AccountServiceRedisImplTest.java │ │ ├── RedisTest.java │ │ └── UserInfoCacheServiceImplTest.java │ └── resources/ │ ├── application.yaml │ └── init.sql ├── cim-integration-test/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── crossoverjie/ │ │ └── cim/ │ │ └── client/ │ │ └── sdk/ │ │ ├── route/ │ │ │ ├── AbstractRouteBaseTest.java │ │ │ └── OfflineMsgStoreRouteBaseTest.java │ │ └── server/ │ │ └── AbstractServerBaseTest.java │ └── test/ │ └── resources/ │ ├── application-client.yaml │ └── application-route.yaml ├── cim-persistence/ │ ├── cim-persistence-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── crossoverjie/ │ │ └── cim/ │ │ └── persistence/ │ │ └── api/ │ │ ├── config/ │ │ │ └── BeanConfig.java │ │ ├── pojo/ │ │ │ ├── OfflineMsg.java │ │ │ └── OfflineMsgLastSendRecord.java │ │ ├── service/ │ │ │ └── OfflineMsgStore.java │ │ └── vo/ │ │ └── req/ │ │ └── SaveOfflineMsgReqVO.java │ ├── cim-persistence-mysql/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── crossoverjie/ │ │ │ └── cim/ │ │ │ └── persistence/ │ │ │ └── mysql/ │ │ │ ├── config/ │ │ │ │ └── MyBatisConfig.java │ │ │ ├── offlinemsg/ │ │ │ │ ├── OfflineMsgDb.java │ │ │ │ └── mapper/ │ │ │ │ ├── OfflineMsgLastSendRecordMapper.java │ │ │ │ └── OfflineMsgMapper.java │ │ │ └── util/ │ │ │ └── MapToJsonTypeHandler.java │ │ └── resources/ │ │ └── mapper/ │ │ ├── OfflineMsgLastSendRecordMapper.xml │ │ └── OfflineMsgMapper.xml │ ├── cim-persistence-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── crossoverjie/ │ │ │ └── cim/ │ │ │ └── persistence/ │ │ │ └── redis/ │ │ │ ├── OfflineMsgBuffer.java │ │ │ ├── constant/ │ │ │ │ └── Constant.java │ │ │ └── kit/ │ │ │ └── OfflineMsgScriptExecutor.java │ │ └── resources/ │ │ └── lua/ │ │ ├── deleteOfflineMsg.lua │ │ ├── fetchOfflineMsg.lua │ │ └── saveOfflineMsg.lua │ └── pom.xml ├── cim-rout-api/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── crossoverjie/ │ └── cim/ │ └── route/ │ └── api/ │ ├── RouteApi.java │ └── vo/ │ ├── req/ │ │ ├── ChatReqVO.java │ │ ├── LoginReqVO.java │ │ ├── OfflineMsgReqVO.java │ │ ├── P2PReqVO.java │ │ ├── RegisterInfoReqVO.java │ │ └── SendMsgReqVO.java │ └── res/ │ ├── CIMServerResVO.java │ ├── RegisterInfoResVO.java │ └── SendMsgResVO.java ├── cim-server/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── crossoverjie/ │ │ │ └── cim/ │ │ │ └── server/ │ │ │ ├── CIMServerApplication.java │ │ │ ├── config/ │ │ │ │ ├── AppConfiguration.java │ │ │ │ ├── BeanConfig.java │ │ │ │ └── SwaggerConfig.java │ │ │ ├── controller/ │ │ │ │ └── IndexController.java │ │ │ ├── handle/ │ │ │ │ └── CIMServerHandle.java │ │ │ ├── init/ │ │ │ │ └── CIMServerInitializer.java │ │ │ ├── kit/ │ │ │ │ ├── RegistryMetaStore.java │ │ │ │ ├── RouteHandler.java │ │ │ │ └── ServerHeartBeatHandlerImpl.java │ │ │ ├── server/ │ │ │ │ └── CIMServer.java │ │ │ └── util/ │ │ │ ├── SessionSocketHolder.java │ │ │ └── SpringBeanFactory.java │ │ └── resources/ │ │ ├── application.yaml │ │ └── banner.txt │ └── test/ │ └── com/ │ └── crossoverjie/ │ └── cim/ │ └── server/ │ └── util/ │ └── NettyAttrUtilTest.java ├── cim-server-api/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── crossoverjie/ │ └── cim/ │ └── server/ │ └── api/ │ ├── ServerApi.java │ └── vo/ │ ├── req/ │ │ └── SendMsgReqVO.java │ └── res/ │ ├── OfflineMsgResVO.java │ ├── SaveOfflineMsgResVO.java │ └── SendMsgResVO.java ├── doc/ │ └── QA.md ├── docker/ │ ├── README.md │ ├── allin1-ubuntu.Dockerfile │ ├── client-ubuntu.Dockerfile │ ├── supervisord.conf │ └── wait-for-it.sh ├── pom.xml ├── script/ │ ├── build.sh │ ├── deploy.sh │ ├── route-startup.sh │ └── server-startup.sh └── sql/ ├── 01schema.sql ├── offline_msg.sql └── offline_msg_last_send_record.sql