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); }
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")); }
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++; } } }