/// <inheritdoc cref="ConnectAsync"/> public Task ConnectAsync(ISession session, bool appearOnline = false, int connectTimeoutSec = DefaultConnectTimeout) { var tcs = new TaskCompletionSource <bool>(); Action callback = () => tcs.SetResult(true); Action <Exception> errback = e => tcs.SetException(e); _adapter.Connected += callback; _adapter.ReceivedError += errback; var uri = new UriBuilder(_baseUri) { Path = "/ws", Query = $"lang=en&status={appearOnline}&token={session.AuthToken}" }.Uri; tcs.Task.ContinueWith(_ => { // NOTE Not fired in Unity WebGL builds. _adapter.Connected -= callback; _adapter.ReceivedError -= errback; }); _adapter.Connect(uri); // NOTE Task.Delay does not work with Unity WebGL builds. return(tcs.Task); //return Task.WhenAny(tcs.Task, Task.Delay(DefaultConnectTimeout)); }
public void Listen() { try { //вытаскиваем параметры подключения к астериску var asteriskConfiguration = mPbxConfigurationService.GetPbxConfiguration(); var loginCommand = mPbxConfigurationService.GetLoginCommand(asteriskConfiguration); using (ISocketAdapter socket = mSocketAdapterFactory.CreateSocketAdapter()) { //Создаём сокет для подключения к астериску и подключаемся к нему socket.Connect(asteriskConfiguration.IpAddress, asteriskConfiguration.Port); //авторизуемся socket.Send(Encoding.ASCII.GetBytes(loginCommand)); //читаем cSocketReadBufer байт из сокета var bytesRead = 1; while (bytesRead != 0) { var asteriskAnswer = new byte[cSocketReadBufer]; bytesRead = socket.Receive(asteriskAnswer); OnFullMessageRecived(new PbxRawMessageEventArgs { Message = Encoding.ASCII.GetString(asteriskAnswer, 0, asteriskAnswer.Length) }); //Полученный массив байт преобразуем к строке var asteriskMessage = ParseFullAsteriskMessage(asteriskAnswer); var messages = mPbxMessagesParser.ExtractPbxMessages(asteriskMessage); var parsedMessages = messages .Select ( t => mPbxMessagesParser.ParseMessage(t) ) .Where ( r => r.ContainsKey("Event") && mValueableEvents.Contains(r["Event"]) ) .ToList(); //Если нашли события, запускаем событие полученного сообщения if (parsedMessages.Any()) { OnPbxMessageRecived(new PbxMessagesEventArgs { Messages = parsedMessages }); } //Читаем следующее сообщение //asteriskAnswer = socket.Receive(cSocketReadBufer); } } } catch (Exception ex) { var errorMessage = String.Format("Подключение к астериску отвалилось с ошибкой. \r\n {0}", ex); OnPbxConnectionLost(new PbxErrorEventArgs { ErrorMessage = errorMessage }); } OnPbxConnectionLost(new PbxErrorEventArgs { ErrorMessage = "Подключение к астериску отвалилось" }); }