Пример #1
0
        public async Task <JToken> SendApiRequest(Request request)
        {
            if (request.Type == "identityFromPermissions" && !Paired)
            {
                return(false);
            }

            await Pair();

            if (!Paired)
            {
                throw new Exception("The user did not allow this app to connect to their Scatter");
            }

            var tcs = new TaskCompletionSource <JToken>();

            request.Id     = UtilsHelper.RandomNumber(24);
            request.Appkey = StorageProvider.GetAppkey();
            request.Nonce  = StorageProvider.GetNonce() ?? "";

            var nextNonce = UtilsHelper.RandomNumberBytes();

            request.NextNonce = UtilsHelper.ByteArrayToHexString(Sha256Manager.GetHash(nextNonce));
            StorageProvider.SetNonce(UtilsHelper.ByteArrayToHexString(nextNonce));

            OpenTasks.Add(request.Id, tcs);
            OpenTaskTimes.Add(request.Id, DateTime.Now);

            await Send("api", new { data = request, plugin = AppName });

            return(await tcs.Task);
        }
Пример #2
0
        private void HandleApiResponse(JToken data)
        {
            if (data == null && data.Children().Count() != 2)
            {
                return;
            }

            var idToken = data.SelectToken("id");

            if (idToken == null)
            {
                throw new Exception("response id not found.");
            }

            string id = idToken.ToObject <string>();

            TaskCompletionSource <JToken> openTask;

            if (!OpenTasks.TryGetValue(id, out openTask))
            {
                return;
            }

            OpenTasks.Remove(id);
            OpenTaskTimes.Remove(id);

            openTask.SetResult(data.SelectToken("result"));
        }
Пример #3
0
        private void TimeoutOpenTasksCheck()
        {
            while (Socket.State == WebSocketState.Open)
            {
                var now   = DateTime.Now;
                int count = 0;

                foreach (var ttKey in OpenTaskTimes.Keys)
                {
                    if ((now - OpenTaskTimes[ttKey]).TotalMilliseconds >= TimeoutMS)
                    {
                        TaskCompletionSource <JToken> openTask = OpenTasks[ttKey];

                        OpenTasks.Remove(ttKey);
                        OpenTaskTimes.Remove(ttKey);

                        openTask.SetResult(JToken.FromObject(new ApiError()
                        {
                            Code    = "0",
                            IsError = "true",
                            Message = "Request timeout."
                        }));
                    }

                    //sleep checking each 10 requests
                    if ((count % 10) == 0)
                    {
                        Thread.Sleep(1000);
                    }

                    count++;
                }
            }
        }