void HandleMembersLeft(GenericCommand command)
        {
            var clientId    = command.peerId;
            var membersLeft = command.convMessage;
            var cid         = membersLeft.Cid;
            var memberIds   = membersLeft.M;

            if (Connection.idToClient.TryGetValue(clientId, out var client))
            {
                if (client.idToConversation.TryGetValue(cid, out var conversation))
                {
                    client.HandleMemebersLeft(conversation, memberIds);
                }
                else
                {
                    Connection.QueryConversationAsync(clientId, cid).ContinueWith(t => {
                        if (t.IsFaulted)
                        {
                            AVRealtime.PrintLog(t.Exception.InnerException.Message);
                        }
                        else
                        {
                            var conv = t.Result;
                            AVRealtime.Context.Post(() => {
                                client.HandleMemebersLeft(conversation, memberIds);
                            });
                        }
                    });
                }
            }
            else
            {
                // TODO 没有查找到对应 IM Client
            }
        }
        /// <summary>
        /// 打开 WebSocket 链接
        /// </summary>
        /// <param name="wss">websocket server address</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        internal Task OpenAsync(string wss, CancellationToken cancellationToken = default(CancellationToken))
        {
            AVRealtime.PrintLog(wss + " connecting...");
            var             tcs     = new TaskCompletionSource <bool>();
            Action <string> onError = null;

            onError = ((reason) =>
            {
                PCLWebsocketClient.OnError -= onError;
                tcs.SetResult(false);
                tcs.TrySetException(new AVIMException(AVIMException.ErrorCode.FromServer, "try to open websocket at " + wss + "failed.The reason is " + reason, null));
            });

            Action onOpend = null;

            onOpend = (() =>
            {
                PCLWebsocketClient.OnError -= onError;
                PCLWebsocketClient.OnOpened -= onOpend;
                tcs.SetResult(true);
                AVRealtime.PrintLog(wss + " connected.");
            });

            PCLWebsocketClient.OnOpened += onOpend;
            PCLWebsocketClient.OnError  += onError;
            PCLWebsocketClient.Open(wss);
            return(tcs.Task);
        }
Пример #3
0
        /// <summary>
        /// Open websocket connection.
        /// </summary>
        /// <returns>The async.</returns>
        /// <param name="secure">If set to <c>true</c> secure.</param>
        /// <param name="subprotocol">Subprotocol.</param>
        /// <param name="enforce">If set to <c>true</c> enforce.</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        public Task <bool> OpenAsync(bool secure, string subprotocol = null, bool enforce = false, CancellationToken cancellationToken = default(CancellationToken))
        {
            _secure = secure;
            if (state == Status.Online && !enforce)
            {
                AVRealtime.PrintLog("state is Status.Online.");
                return(Task.FromResult(true));
            }

            if (CurrentConfiguration.RealtimeServer != null)
            {
                _wss = CurrentConfiguration.RealtimeServer.ToString();
                AVRealtime.PrintLog("use configuration realtime server with url: " + _wss);
                return(OpenAsync(_wss, subprotocol, enforce));
            }
            var routerUrl = CurrentConfiguration.RTMRouter != null?CurrentConfiguration.RTMRouter.ToString() :
                                (AVClient.CurrentConfiguration.PushServer != null ? AVClient.CurrentConfiguration.PushServer.ToString() : null);

            return(RouterController.GetAsync(routerUrl, secure, cancellationToken).OnSuccess(r =>
            {
                var routerState = r.Result;
                if (routerState == null)
                {
                    return Task.FromResult(false);
                }
                _wss = routerState.server;
                _secondaryWss = routerState.secondary;
                state = Status.Connecting;
                AVRealtime.PrintLog("push router give a url :" + _wss);
                return OpenAsync(routerState.server, subprotocol, enforce);
            }).Unwrap());
        }
        void HandleJoinedConversation(GenericCommand command)
        {
            var clientId      = command.peerId;
            var joinedConvCmd = command.convMessage;
            var initBy        = joinedConvCmd.initBy;
            var cid           = joinedConvCmd.Cid;

            if (Connection.idToClient.TryGetValue(clientId, out var client))
            {
                // ???是不是应该把这个接口实现放到 Connection 中
                Connection.QueryConversationAsync(clientId, cid).ContinueWith(t => {
                    if (t.IsFaulted)
                    {
                        AVRealtime.PrintLog(t.Exception.InnerException.Message);
                    }
                    else
                    {
                        var conv = t.Result;
                        AVRealtime.Context.Post(() => {
                            client.HandleJoinedConversation(conv);
                        });
                    }
                });
            }
            else
            {
                // TODO 没有查找到对应 IM Client
            }
        }
Пример #5
0
        /// <summary>
        /// 打开会话
        /// </summary>
        /// <returns>The session.</returns>
        internal Task OpenSession(AVIMClient client)
        {
            var tcs         = new TaskCompletionSource <bool>();
            var sessionOpen = new SessionCommand {
                configBitmap = 1,
                Ua           = "net-universal/1.0.6999.29889",
                N            = null,
                T            = 0,
                S            = null,
            };
            var cmd = commandFactory.NewRequest(client.ClientId, CommandType.Session, OpType.Open);

            cmd.sessionMessage = sessionOpen;
            SendRequest(cmd).ContinueWith(t => {
                AVRealtime.Context.Post(() => {
                    if (t.IsFaulted)
                    {
                        AVRealtime.PrintLog("open session error");
                        tcs.SetException(t.Exception.InnerException);
                    }
                    else
                    {
                        var res           = t.Result;
                        var sessionOpened = res.sessionMessage;
                        // TODO 判断会话打开结果

                        idToClient.Add(client.ClientId, client);
                        tcs.SetResult(true);
                    }
                });
            });
            return(tcs.Task);
        }
Пример #6
0
        internal Task <string> GetAsync()
        {
            var tcs    = new TaskCompletionSource <string>();
            var client = new HttpClient();
            var rtmUrl = "eohx7l4e.rtm.lncld.net";
            var url    = string.Format("https://{0}/v1/route?appId={1}&secure=1", rtmUrl, "Eohx7L4EMfe4xmairXeT7q1w-gzGzoHsz");

            client.GetAsync(url).ContinueWith(t => {
                if (t.IsFaulted)
                {
                    var exception = t.Exception.InnerException;
                    AVRealtime.PrintLog("get router error: {0}", exception.Message);
                    tcs.SetException(exception);
                    return(null);
                }
                var content = t.Result.Content;
                return(content.ReadAsStringAsync());
            }).Unwrap().ContinueWith(t => {
                AVRealtime.PrintLog("get router: {0}", t.Result);
                var res = JsonConvert.DeserializeObject(t.Result) as JObject;
                if (res.TryGetValue("server", out var serverObj))
                {
                    var server = serverObj.ToString();
                    tcs.SetResult(server);
                }
                else
                {
                    tcs.SetException(new Exception("no server"));
                }
            });
            return(tcs.Task);
        }
Пример #7
0
        /// <summary>
        /// 创建 Client
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="tag"></param>
        /// <param name="deviceId">设备唯一的 Id。如果是 iOS 设备,需要将 iOS 推送使用的 DeviceToken 作为 deviceId 传入</param>
        /// <param name="secure">是否强制加密 wss 链接</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task <AVIMClient> CreateClientAsync(string clientId,
                                                   string tag      = null,
                                                   string deviceId = null,
                                                   bool secure     = true,
                                                   CancellationToken cancellationToken = default(CancellationToken))
        {
            lock (mutex)
            {
                var client = PreLogIn(clientId, tag, deviceId);

                AVRealtime.PrintLog("begin OpenAsync.");
                return(OpenAsync(secure, Subprotocol, true, cancellationToken).OnSuccess(t =>
                {
                    if (!t.Result)
                    {
                        return Task.FromResult <AVIMCommand>(null);
                    }
                    AVRealtime.PrintLog("websocket server connected, begin to open sesstion.");
                    SetNetworkState();
                    var cmd = new SessionCommand()
                              .UA(VersionString)
                              .Tag(tag)
                              .DeviceId(deviceId)
                              .Option("open")
                              .PeerId(clientId);

                    ToggleNotification(true);
                    return AttachSignature(cmd, this.SignatureFactory.CreateConnectSignature(clientId));
                }).Unwrap().OnSuccess(x =>
                {
                    var cmd = x.Result;
                    if (cmd == null)
                    {
                        return Task.FromResult <Tuple <int, IDictionary <string, object> > >(null);
                    }
                    return this.RunCommandAsync(cmd);
                }).Unwrap().OnSuccess(s =>
                {
                    if (s.Result == null)
                    {
                        return null;
                    }
                    AVRealtime.PrintLog("sesstion opened.");
                    state = Status.Online;
                    ToggleHeartBeating(true);
                    var response = s.Result.Item2;
                    if (response.ContainsKey("st"))
                    {
                        _sesstionToken = response["st"] as string;
                    }
                    if (response.ContainsKey("stTtl"))
                    {
                        var stTtl = long.Parse(response["stTtl"].ToString());
                        _sesstionTokenExpire = DateTime.Now.ToUnixTimeStamp() + stTtl * 1000;
                    }
                    AfterLogIn(client);
                    return client;
                }));
            }
        }
Пример #8
0
        internal override void Handle(GenericCommand command)
        {
            var recvMsg = command.directMessage;
            // 获取到 IM Client
            var clientId = command.peerId;

            if (Connection.idToClient.TryGetValue(clientId, out var client))
            {
                // 再获取到 Conversation
                var convId = recvMsg.Cid;
                if (client.idToConversation.TryGetValue(convId, out var conversation))
                {
                    // 再通过 Conversation 和 Message 通知用户
                    client.HandleReceiveMessage(conversation, new AVIMTextMessage {
                        Text = "fake cached message"
                    });
                }
                else
                {
                    Connection.QueryConversationAsync(clientId, convId).ContinueWith(t => {
                        if (t.IsFaulted)
                        {
                            AVRealtime.PrintLog(t.Exception.InnerException.Message);
                            return;
                        }
                        AVRealtime.Context.Post(() => {
                            client.HandleReceiveMessage(conversation, new AVIMTextMessage {
                                Text = "fake queried message"
                            });
                        });
                    });
                }
            }
        }
Пример #9
0
 void WebSocketClient_OnMessage(GenericCommand cmd)
 {
     AVRealtime.Context.Post(() => {
         if (cmd.ShouldSerializeI())
         {
             // 应答消息
             var reqId = cmd.I;
             if (requests.TryGetValue(reqId, out var tcs))
             {
                 tcs.SetResult(cmd);
                 requests.Remove(reqId);
             }
             else
             {
                 // 没有缓存的应答
             }
         }
         else
         {
             // 通知消息
             if (cmdToHandler.TryGetValue(cmd.Cmd, out var handler))
             {
                 try {
                     handler.Handle(cmd);
                 } catch (Exception e) {
                     AVRealtime.PrintLog(e.Message);
                 }
             }
             else
             {
                 AVRealtime.PrintLog("No handler for cmd: {0}", cmd.Cmd);
             }
         }
     });
 }
Пример #10
0
        //public void On(string eventName, Action<IDictionary<string, object>> data)
        //{

        //}

        private void WebSocketClient_OnMessage(string obj)
        {
            AVRealtime.PrintLog("websocket<=" + obj);
            var estimatedData = Json.Parse(obj) as IDictionary <string, object>;
            var notice        = new AVIMNotice(estimatedData);

            m_NoticeReceived?.Invoke(this, notice);
        }
Пример #11
0
        internal GenericCommand NewRequest(string clientId, CommandType cmd, OpType op)
        {
            var request = NewCommand(clientId, cmd, op);

            request.I = RequestId;
            AVRealtime.PrintLog("request I op: {0}", request.I);
            return(request);
        }
 internal void Send(GenericCommand cmd)
 {
     AVRealtime.PrintLog("websocket=>{0}", JsonConvert.SerializeObject(cmd));
     using (var ms = new MemoryStream()) {
         ProtoBuf.Serializer.Serialize(ms, cmd);
         ms.Position = 0;
         var msg = Convert.ToBase64String(ms.ToArray());
         ws.Send(msg);
     }
 }
Пример #13
0
 internal override void Handle(GenericCommand command)
 {
     Connection.ClearCache().ContinueWith(t => {
         if (t.IsFaulted)
         {
             AVRealtime.PrintLog(t.Exception.InnerException.Message);
             return;
         }
         Connection.Disconnect();
     });
 }
        // WebSocket 事件
        void OnWebSocketMessage(string msg)
        {
            //AVRealtime.PrintLog("websocket<={0}", msg);
            // TODO 考虑是否要做反序列化???

            byte[] byteArray = Convert.FromBase64String(msg);
            var    cmd       = ProtoBuf.Serializer.Deserialize <GenericCommand>(new MemoryStream(byteArray));

            AVRealtime.PrintLog("websocket<={0}", JsonConvert.SerializeObject(cmd));
            OnMessage?.Invoke(cmd);
        }
Пример #15
0
 internal void HandleReconnected()
 {
     connection.ReOpenSession(ClientId).ContinueWith(t => {
         if (t.IsFaulted)
         {
             AVRealtime.PrintLog(t.Exception.InnerException.Message);
             return;
         }
         // IM Client 重连完成
         OnReconnected?.Invoke();
     });
 }
Пример #16
0
        /// <summary>
        /// open webcoket connection with cloud.
        /// </summary>
        /// <param name="url">wss address</param>
        /// <param name="subprotocol">subprotocol for websocket</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task <bool> OpenAsync(string url, string subprotocol = null, bool enforce = false, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (AVWebSocketClient.IsOpen && !enforce)
            {
                AVRealtime.PrintLog(url + "is already connectd.");
                return(Task.FromResult(true));
            }

            AVRealtime.PrintLog("websocket try to connect url :" + url + " with subprotocol: " + subprotocol);
            AVRealtime.PrintLog(url + " \tconnecting...");

            return(AVWebSocketClient.Connect(url, subprotocol));
        }
Пример #17
0
 /// <summary>
 /// 打开会话
 /// </summary>
 /// <returns>The open.</returns>
 public Task Open()
 {
     return(AVRealtime.GetConnection("Eohx7L4EMfe4xmairXeT7q1w-gzGzoHsz").ContinueWith(t => {
         if (t.IsFaulted)
         {
             AVRealtime.PrintLog(t.Exception.InnerException.Message);
             var tcs = new TaskCompletionSource <bool>();
             tcs.SetException(t.Exception.InnerException);
             return tcs.Task;
         }
         // TODO 在 SDK 上下文中设置
         connection = t.Result;
         return connection.OpenSession(this);
     }).Unwrap());
 }
Пример #18
0
        /// <summary>
        /// open webcoket connection with cloud.
        /// </summary>
        /// <param name="url">wss address</param>
        /// <param name="subprotocol">subprotocol for websocket</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task <bool> OpenAsync(string url, string subprotocol = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (PCLWebsocketClient.IsOpen)
            {
                AVRealtime.PrintLog(url + "is already connectd.");
                return(Task.FromResult(true));
            }

            AVRealtime.PrintLog("websocket try to connect url :" + url + "with subprotocol: " + subprotocol);
            AVRealtime.PrintLog(url + " connecting...");
            var             tcs     = new TaskCompletionSource <bool>();
            Action <string> onError = null;

            onError = ((reason) =>
            {
                PCLWebsocketClient.OnError -= onError;
                tcs.TrySetResult(false);
                tcs.TrySetException(new AVIMException(AVIMException.ErrorCode.FromServer, "try to open websocket at " + url + "failed.The reason is " + reason, null));
            });

            Action onOpend = null;

            onOpend = (() =>
            {
                PCLWebsocketClient.OnError -= onError;
                PCLWebsocketClient.OnOpened -= onOpend;
                tcs.TrySetResult(true);
                AVRealtime.PrintLog(url + " connected.");
            });

            Action <int, string, string> onClosed = null;

            onClosed = (reason, arg0, arg1) =>
            {
                PCLWebsocketClient.OnError  -= onError;
                PCLWebsocketClient.OnOpened -= onOpend;
                PCLWebsocketClient.OnClosed -= onClosed;
                tcs.TrySetResult(false);
                tcs.TrySetException(new AVIMException(AVIMException.ErrorCode.FromServer, "try to open websocket at " + url + "failed.The reason is " + reason, null));
            };

            PCLWebsocketClient.OnOpened += onOpend;
            PCLWebsocketClient.OnClosed += onClosed;
            PCLWebsocketClient.OnError  += onError;
            PCLWebsocketClient.Open(url, subprotocol);

            return(tcs.Task);
        }
Пример #19
0
 /// <summary>
 /// websocket 事件的监听的开关
 /// </summary>
 /// <param name="toggle">是否打开</param>
 public void ToggleNotification(bool toggle)
 {
     AVRealtime.PrintLog("ToggleNotification| toggle:" + toggle + "|listening: " + _listening);
     if (toggle && !_listening)
     {
         AVWebSocketClient.OnClosed  += WebsocketClient_OnClosed;
         AVWebSocketClient.OnMessage += WebSocketClient_OnMessage;
         _listening = true;
     }
     else if (!toggle && _listening)
     {
         AVWebSocketClient.OnClosed  -= WebsocketClient_OnClosed;
         AVWebSocketClient.OnMessage -= WebSocketClient_OnMessage;
         _listening = false;
     }
 }
        internal Task Open(string url, string protocol = null)
        {
            AVRealtime.PrintLog("websocket open");
            var tcs = new TaskCompletionSource <bool>();

            void onOpen()
            {
                AVRealtime.PrintLog("websocket opened");
                ws.OnOpened  -= onOpen;
                ws.OnClosed  -= onClose;
                ws.OnError   -= onError;
                ws.OnMessage += OnWebSocketMessage;
                ws.OnClosed  += OnWebSocketDisconnected;
                ws.OnError   += OnWebSocketError;
                tcs.SetResult(true);
            }

            void onClose()
            {
                ws.OnOpened -= onOpen;
                ws.OnClosed -= onClose;
                ws.OnError  -= onError;
                tcs.SetException(new Exception("websocket closed when open"));
            }

            void onError(string err)
            {
                ws.OnOpened -= onOpen;
                ws.OnClosed -= onClose;
                ws.OnError  -= onError;
                tcs.SetException(new Exception(string.Format("websocket open error: {0}", err)));
            }

            try {
                ws = WebSocketFactory.Create();
            } catch (Exception e) {
                AVRealtime.PrintLog(e.Message);
            }

            ws.OnOpened += onOpen;
            ws.OnClosed += onClose;
            ws.OnError  += onError;
            url          = string.Format("{0}?subprotocol=lc.proto2base64.3", "wss://rtm51.leancloud.cn");
            AVRealtime.PrintLog("connect: {0}", url);
            ws.Open(url);
            return(tcs.Task);
        }
Пример #21
0
        /// <summary>
        /// 创建 Client
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="tag"></param>
        /// <param name="deviceId">设备唯一的 Id。如果是 iOS 设备,需要将 iOS 推送使用的 DeviceToken 作为 deviceId 传入</param>
        /// <param name="secure">是否强制加密 wss 链接</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task <AVIMClient> CreateClientAsync(string clientId,
                                                   string tag      = null,
                                                   string deviceId = null,
                                                   bool secure     = true,
                                                   CancellationToken cancellationToken = default(CancellationToken))
        {
            lock (mutex)
            {
                var client = PreLogIn(clientId, tag, deviceId);

                AVRealtime.PrintLog("begin OpenAsync.");
                return(OpenAsync(secure, Subprotocol, cancellationToken).OnSuccess(t =>
                {
                    AVRealtime.PrintLog("OpenAsync OnSuccess. begin send open sesstion cmd.");

                    var cmd = new SessionCommand()
                              .UA(VersionString)
                              .Tag(tag)
                              .DeviceId(deviceId)
                              .Option("open")
                              .PeerId(clientId);

                    ToggleNotification(true);
                    return AttachSignature(cmd, this.SignatureFactory.CreateConnectSignature(clientId));
                }).Unwrap().OnSuccess(x =>
                {
                    var cmd = x.Result;
                    return AVIMCommandRunner.RunCommandAsync(cmd);
                }).Unwrap().OnSuccess(s =>
                {
                    AVRealtime.PrintLog("sesstion opened.");
                    state = Status.Online;
                    ToggleHeartBeating(_heartBeatingToggle);
                    var response = s.Result.Item2;
                    if (response.ContainsKey("st"))
                    {
                        _sesstionToken = response["st"] as string;
                    }
                    if (response.ContainsKey("stTtl"))
                    {
                        var stTtl = long.Parse(response["stTtl"].ToString());
                        _sesstionTokenExpire = DateTime.Now.UnixTimeStampSeconds() + stTtl;
                    }
                    return client;
                }));
            }
        }
Пример #22
0
        internal Task LogInAsync(string clientId,
                                 string tag      = null,
                                 string deviceId = null,
                                 bool secure     = true,
                                 CancellationToken cancellationToken = default(CancellationToken))
        {
            lock (mutex)
            {
                var cmd = new SessionCommand()
                          .UA(VersionString)
                          .Tag(tag)
                          .DeviceId(deviceId)
                          .Option("open")
                          .PeerId(clientId);

                var result = AttachSignature(cmd, this.SignatureFactory.CreateConnectSignature(clientId)).OnSuccess(_ =>
                {
                    return(RunCommandAsync(cmd));
                }).Unwrap().OnSuccess(t =>
                {
                    AVRealtime.PrintLog("sesstion opened.");
                    if (t.Exception != null)
                    {
                        var imException = t.Exception.InnerException as AVIMException;
                        throw imException;
                    }
                    state        = Status.Online;
                    var response = t.Result.Item2;
                    if (response.ContainsKey("st"))
                    {
                        _sesstionToken = response["st"] as string;
                    }
                    if (response.ContainsKey("stTtl"))
                    {
                        var stTtl            = long.Parse(response["stTtl"].ToString());
                        _sesstionTokenExpire = DateTime.Now.ToUnixTimeStamp() + stTtl * 1000;
                    }
                    return(t.Result);
                });

                return(result);
            }
        }
Пример #23
0
        private void SessionListener_OnSessionClosed(int arg1, string arg2, string arg3)
        {
            if (m_OnSessionClosed != null)
            {
                var args = new AVIMSessionClosedEventArgs()
                {
                    Code   = arg1,
                    Reason = arg2,
                    Detail = arg3
                };
                if (args.Code == 4115 || args.Code == 4111)
                {
                    this._realtime.sessionConflict = true;
                }

                m_OnSessionClosed(this, args);
            }
            AVRealtime.PrintLog("SessionListener_OnSessionClosed invoked.");
            //this.LinkedRealtime.LogOut();
        }
Пример #24
0
        /// <summary>
        /// Creates the client async.
        /// </summary>
        /// <returns>The client async.</returns>
        /// <param name="user">User.</param>
        /// <param name="tag">Tag.</param>
        /// <param name="deviceId">Device identifier.</param>
        /// <param name="secure">If set to <c>true</c> secure.</param>
        public Task <AVIMClient> CreateClientAsync(AVUser user     = null,
                                                   string tag      = null,
                                                   string deviceId = null,
                                                   bool secure     = true,
                                                   CancellationToken cancellationToken = default(CancellationToken))
        {
            AVIMClient client = null;

            AVRealtime.PrintLog("begin OpenAsync.");
            return(OpenAsync(secure, Subprotocol, true, cancellationToken).OnSuccess(openTask =>
            {
                AVRealtime.PrintLog("OpenAsync OnSuccess. begin send open sesstion cmd.");
                var userTask = Task.FromResult(user);
                if (user == null)
                {
                    userTask = AVUser.GetCurrentUserAsync();
                }

                return userTask;
            }).Unwrap().OnSuccess(u =>
            {
                var theUser = u.Result;
                return AVCloud.RequestRealtimeSignatureAsync(theUser);
            }).Unwrap().OnSuccess(signTask =>
            {
                var signResult = signTask.Result;
                var clientId = signResult.ClientId;
                var nonce = signResult.Nonce;
                var singnature = signResult.Signature;
                var ts = signResult.Timestamp;

                client = PreLogIn(clientId, tag, deviceId);
                ToggleNotification(true);
                return this.OpenSessionAsync(clientId, tag, deviceId, nonce, ts, singnature, secure);
            }).Unwrap().OnSuccess(s =>
            {
                ToggleHeartBeating(true);
                AfterLogIn(client);
                return client;
            }));
        }
Пример #25
0
        void PrepareReconnect()
        {
            AVRealtime.PrintLog("Prepare Reconnect");
            var checkNetAvailableTimer = new AVTimer();

            checkNetAvailableTimer.Interval = 5000;
            var handler = new EventHandler <TimerEventArgs>((object sender, TimerEventArgs e) => {
                bool netAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
                AVRealtime.PrintLog($"current net available: {netAvailable}");
                if (netAvailable)
                {
                    StartManualReconnect();
                    AVTimer timer = (AVTimer)sender;
                    timer.Stop();
                }
            });

            checkNetAvailableTimer.Elapsed += handler;
            checkNetAvailableTimer.Start();
            checkNetAvailableTimer.Enabled = true;
        }
Пример #26
0
 void PrepareReconnect()
 {
     AVRealtime.PrintLog("Prepare Reconnect");
     Task.Delay(RECONNECT_DELAY).ContinueWith(_ => {
         // 开启重连
         AutoReconnect().ContinueWith(t => {
             if (t.IsFaulted)
             {
                 // 重连失败,延迟再次重连
                 reconnectTimes++;
                 AVRealtime.PrintLog(String.Format("reconnect {0} times", reconnectTimes));
                 if (reconnectTimes >= RECONNECT_FROM_APP_ROUTER)
                 {
                     // 如果大于当前服务地址的最大重连次数,则清空 Router 后重新重连
                     RouterController.ClearCache().ContinueWith(__ => {
                         reborn = true;
                         PrepareReconnect();
                     });
                 }
                 else if (reconnectTimes >= RECONNECT_USE_SECONDARY_TIMES)
                 {
                     // 如果大于单台 IM 服务器的重连次数,则启用备用服务器
                     useSecondary = true;
                     PrepareReconnect();
                 }
                 else
                 {
                     PrepareReconnect();
                 }
             }
             else
             {
                 // 重连成功
                 reconnectTimes = 0;
                 reborn         = false;
                 useSecondary   = false;
             }
         });
     });
 }
Пример #27
0
        internal Task OpenSessionAsync(string clientId,
                                       string tag       = null,
                                       string deviceId  = null,
                                       string nonce     = null,
                                       long timestamp   = 0,
                                       string signature = null,
                                       bool secure      = true)
        {
            var cmd = new SessionCommand()
                      .UA(VersionString)
                      .Tag(tag)
                      .DeviceId(deviceId)
                      .Option("open")
                      .PeerId(clientId)
                      .Argument("n", nonce)
                      .Argument("t", timestamp)
                      .Argument("s", signature);

            return(RunCommandAsync(cmd).OnSuccess(t =>
            {
                AVRealtime.PrintLog("sesstion opened.");
                if (t.Exception != null)
                {
                    var imException = t.Exception.InnerException as AVIMException;
                    throw imException;
                }
                state = Status.Online;
                var response = t.Result.Item2;
                if (response.ContainsKey("st"))
                {
                    _sesstionToken = response["st"] as string;
                }
                if (response.ContainsKey("stTtl"))
                {
                    var stTtl = long.Parse(response["stTtl"].ToString());
                    _sesstionTokenExpire = DateTime.Now.ToUnixTimeStamp() + stTtl * 1000;
                }
                return t.Result;
            }));
        }
Пример #28
0
        /// <summary>
        /// fetch wss address from push router and open the websocket connection.
        /// </summary>
        /// <param name="secure">if use ssl encrept</param>
        /// <param name="subprotocol">subprotocol</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task OpenAsync(bool secure = true, string subprotocol = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (state == Status.Online)
            {
                AVRealtime.PrintLog("state is Status.Online.");
                return(Task.FromResult(true));
            }

            if (CurrentConfiguration.RealtimeServer != null)
            {
                AVRealtime.PrintLog("use configuration websocket url:" + _wss);
                return(OpenAsync(CurrentConfiguration.RealtimeServer.ToString(), subprotocol, cancellationToken));
            }

            return(RouterController.GetAsync(CurrentConfiguration.PushRouterServer.ToString(), secure, cancellationToken).OnSuccess(_ =>
            {
                _wss = _.Result.server;
                state = Status.Connecting;
                AVRealtime.PrintLog("push router give a url :" + _wss);
                return OpenAsync(_.Result.server, subprotocol, cancellationToken);
            }).Unwrap());
        }
Пример #29
0
        internal Task <AVIMCommand> AttachSignature(AVIMCommand command, Task <AVIMSignature> SignatureTask)
        {
            AVRealtime.PrintLog("begin to attach singature.");
            var tcs = new TaskCompletionSource <AVIMCommand>();

            if (SignatureTask == null)
            {
                tcs.SetResult(command);
                return(tcs.Task);
            }
            return(SignatureTask.OnSuccess(_ =>
            {
                if (_.Result != null)
                {
                    var signature = _.Result;
                    command.Argument("t", signature.Timestamp);
                    command.Argument("n", signature.Nonce);
                    command.Argument("s", signature.SignatureContent);
                    AVRealtime.PrintLog("AttachSignature ended.t:" + signature.Timestamp + ";n:" + signature.Nonce + ";s:" + signature.SignatureContent);
                }
                return command;
            }));
        }
 void OnWebSocketError(string err)
 {
     AVRealtime.PrintLog("websocket error: {0}", err);
     ws.Close();
 }