private void Decrement(AsyncToken token)
        {
            lock (_gate)
            {
                _counter--;
                if (_counter == 0)
                {
                    foreach (var task in _pendingTasks)
                    {
                        task.SetResult(true);
                    }

                    _pendingTasks.Clear();
                }

                if (_trackActiveTokens)
                {
                    var diagnosticAsyncToken = token as DiagnosticAsyncToken;

                    if (diagnosticAsyncToken != null)
                    {
                        _activeDiagnosticTokens.Remove(diagnosticAsyncToken);
                    }
                }
            }
        }
Example #2
0
        private void Decrement_NoLock(AsyncToken token)
        {
            Contract.ThrowIfFalse(_gate.LockHeldByMe());

            _counter--;
            if (_counter == 0)
            {
                foreach (var task in _pendingTasks)
                {
                    task.SetResult(true);
                }

                _pendingTasks.Clear();
            }

            if (_trackActiveTokens)
            {
                int  i       = 0;
                bool removed = false;
                while (i < _diagnosticTokenList.Count)
                {
                    if (_diagnosticTokenList[i] == token)
                    {
                        _diagnosticTokenList.RemoveAt(i);
                        removed = true;
                        break;
                    }

                    i++;
                }

                Debug.Assert(removed, "IAsyncToken and Listener mismatch");
            }
        }
        private void Decrement(AsyncToken token)
        {
            lock (_gate)
            {
                _counter--;
                if (_counter == 0)
                {
                    foreach (var task in _pendingTasks)
                    {
                        task.SetResult(true);
                    }

                    _pendingTasks.Clear();
                }

                if (_trackActiveTokens)
                {
                    var diagnosticAsyncToken = token as DiagnosticAsyncToken;

                    if (diagnosticAsyncToken != null)
                    {
                        _activeDiagnosticTokens.Remove(diagnosticAsyncToken);
                    }
                }
            }
        }
Example #4
0
        /// <inheritdoc cref="IStorageWorker"/>
        public IAsyncToken <KvModel> Create(object value)
        {
            var token = new AsyncToken <KvModel>();

            _http
            .Post <CreateKvResponse>(
                _http.UrlBuilder.Url(ENDPOINT_KVS),
                new CreateKvRequest
            {
                value = value
            })
            .OnSuccess(response =>
            {
                if (!response.Payload.success)
                {
                    token.Fail(new Exception(response.Payload.error));
                    return;
                }

                token.Succeed(response.Payload.body);
            })
            .OnFailure(token.Fail);

            return(token);
        }
Example #5
0
        /// <inheritdoc cref="IStorageWorker"/>
        public IAsyncToken <Void> Save(string key, object value, string tags, int version)
        {
            var token = new AsyncToken <Void>();

            _http
            .Put <UpdateKvResponse>(
                _http.UrlBuilder.Url($"{ENDPOINT_KVS}/{key}"),
                new UpdateKvRequest
            {
                value   = value,
                version = version
            })
            .OnSuccess(response =>
            {
                if (response.Payload.success)
                {
                    token.Succeed(Void.Instance);
                }
                else
                {
                    token.Fail(new Exception(response.Payload.error));
                }
            })
            .OnFailure(token.Fail);

            return(token);
        }
Example #6
0
 public static async UniTask SetHourAsync(float hour, float duration, AsyncToken token = default)
 {
     if (tweener.Running)
     {
         tweener.CompleteInstantly();
     }
     var tween = new FloatTween(CurrentHour, hour, duration, SetHour);
     await tweener.RunAsync(tween, token, target : instance);
 }
        /// <summary>
        /// Sycnhronously process response.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="request">WWW request.</param>
        /// <param name="token">Token to resolve.</param>
        private IEnumerator Wait <T>(
            WWW request,
            AsyncToken <HttpResponse <T> > token)
        {
            while (!request.isDone)
            {
                yield return(null);
            }

            var httpResponse = new HttpResponse <T>
            {
                StatusCode = GetStatusCode(request),
                Headers    = null == request.responseHeaders
                    ? new List <Tuple <string, string> >()
                    : request
                             .responseHeaders
                             .Select(pair => Tuple.Create(pair.Key, pair.Value))
                             .ToList(),
                Raw = request.bytes
            };

            var bytes = request.bytes;

            object value = null;

            if (typeof(T) != typeof(byte[]))
            {
                try
                {
                    _serializer.Deserialize(typeof(T), ref bytes, out value);
                }
                catch (Exception exception)
                {
                    httpResponse.NetworkSuccess = false;
                    httpResponse.NetworkError   = string.Format("Could not deserialize : {0}.", exception.Message);
                }
            }
            else
            {
                value = bytes;
            }

            httpResponse.Payload = (T)value;

            if (Successful((int)httpResponse.StatusCode))
            {
                httpResponse.NetworkSuccess = true;
            }
            else
            {
                httpResponse.NetworkSuccess = false;
                httpResponse.NetworkError   = Encoding.UTF8.GetString(bytes);
            }

            token.Succeed(httpResponse);
        }
        /// <inheritdoc cref="IHttpService"/>
        public IAsyncToken <HttpResponse <byte[]> > Download(string url)
        {
            var token = new AsyncToken <HttpResponse <byte[]> >();

            var request = UnityWebRequest.Get(url);

            _requestsOut.Add(request);

            ApplyHeaders(Headers, request);

            _bootstrapper.BootstrapCoroutine(Wait(
                                                 request,
                                                 token,
                                                 SerializationType.Raw));

            return(token);
        }
        /// <summary>
        /// Waits on the request and resolves the token.
        /// </summary>
        /// <typeparam name="T">The type to deserialize the response to.</typeparam>
        /// <param name="request">The UnityWebRequest to send and wait on.</param>
        /// <param name="token">The token to resolve.</param>
        /// <param name="serialization"></param>
        /// <returns>The coroutines IEnumerator.</returns>
        protected IEnumerator Wait <T>(
            UnityWebRequest request,
            AsyncToken <HttpResponse <T> > token,
            SerializationType serialization = SerializationType.Json)
        {
            var start = DateTime.Now;

            request.Send();

            while (!request.isDone)
            {
                if (TimeoutMs > 0 && DateTime.Now.Subtract(start).TotalMilliseconds > TimeoutMs)
                {
                    // request timed out
                    request.Dispose();

                    token.Fail(new Exception("Request timed out."));

                    yield break;
                }

                yield return(null);
            }

            var response = new HttpResponse <T>
            {
                Headers    = FormatHeaders(request.GetResponseHeaders()),
                StatusCode = request.responseCode
            };

            ProcessResponse(request, response, serialization);

            // must kill the request
            request.Dispose();
            _requestsOut.Remove(request);

            if (response.NetworkSuccess)
            {
                token.Succeed(response);
            }
            else
            {
                token.Fail(new Exception(response.NetworkError));
            }
        }
Example #10
0
        /// <summary>
        /// Initializes download
        /// </summary>
        /// <param name="path">The path to load from</param>
        /// <param name="callback">Fires when resource is loaded</param>
        /// <returns></returns>
        public AsyncToken Load(string path, ResultHandler callback)
        {
            //Debug.Log(string.Format(@"*** Loading texture ""{0}""", textureName));

            AsyncToken httpToken;

            if (_finished.ContainsKey(path)) // texture already loaded
            {
                /**
                 * Return null to signalize there's nothing for async loading
                 * */
                return(null);
            }

            /**
             * The texture not yet loaded, but loading
             * We need to return token (for displaying progress)
             * */
            if (_active.ContainsKey(path))
            {
                /**
                 * The token collection for this texture already exists
                 * We should grab the first token and clone it
                 * */
                httpToken = _active[path];
            }
            else
            {
                //Debug.Log("*** Downloading texture: " + texturePath);
                httpToken      = _connector.Send("~" + path, LoadCompleteHandler);
                httpToken.Data = path;

                _active.Add(path, httpToken);

                _tokenToTokens.Add(httpToken, new List <AsyncToken>());
            }

            AsyncToken token = (AsyncToken)httpToken.Clone();

            _tokenToTokens[httpToken].Add(token);

            _callbacks.Add(token, callback);

            return(token);
        }
Example #11
0
        /// <inheritdoc cref="IStorageService"/>
        public IAsyncToken <StorageService> Refresh()
        {
            if (null != _refreshToken)
            {
                return(_refreshToken.Token());
            }

            // keep local reference
            var token = _refreshToken = new AsyncToken <StorageService>();

            _worker
            .GetAll()
            .OnSuccess(models =>
            {
                for (int i = 0, len = models.Length; i < len; i++)
                {
                    var model = models[i];

                    var bucket = Get(model.key);
                    if (null == bucket)
                    {
                        bucket = new StorageBucket(
                            null,
                            model.key,
                            model.tags,
                            model.version);
                        _buckets.Add(bucket);
                    }

                    bucket.VersionUpdate(model.version);
                }

                token.Succeed(this);
            })
            .OnFailure(exception =>
            {
                // null out class reference first
                _refreshToken = null;

                token.Fail(exception);
            });

            return(token);
        }
Example #12
0
        public IAsyncToken BeginAsyncOperation(string name, object tag = null, [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0)
        {
            lock (_gate)
            {
                IAsyncToken asyncToken;
                if (_trackActiveTokens)
                {
                    var token = new DiagnosticAsyncToken(this, name, tag, filePath, lineNumber);
                    _diagnosticTokenList.Add(token);
                    asyncToken = token;
                }
                else
                {
                    asyncToken = new AsyncToken(this);
                }

                return(asyncToken);
            }
        }
Example #13
0
        /// <inheritdoc cref="IStorageWorker"/>
        public IAsyncToken <KvModel[]> GetAll()
        {
            var token = new AsyncToken <KvModel[]>();

            _http
            .Get <GetAllKvsResponse>(_http.UrlBuilder.Url(ENDPOINT_KVS))
            .OnSuccess(response =>
            {
                if (!response.Payload.success)
                {
                    token.Fail(new Exception(response.Payload.error));
                    return;
                }

                token.Succeed(response.Payload.body);
            })
            .OnFailure(token.Fail);

            return(token);
        }
        /// <inheritdoc />
        public IAsyncToken <HttpResponse <byte[]> > Download(string url)
        {
            var token = new AsyncToken <HttpResponse <byte[]> >();

            var request = UnityWebRequest.Get(url);

            _requestsOut.Add(request);

            var service = Services.Process(request);

            // Log after Processing
            Log("GET", url, service);

            _bootstrapper.BootstrapCoroutine(Wait(
                                                 request,
                                                 token,
                                                 SerializationType.Raw));

            return(token);
        }
Example #15
0
        /// <inheritdoc cref="IStorageService"/>
        public IAsyncToken <StorageBucket> Create <T>(T value)
        {
            var token = new AsyncToken <StorageBucket>();

            _worker
            .Create(value)
            .OnSuccess(model =>
            {
                var bucket = new StorageBucket(
                    _worker,
                    model.key,
                    model.tags,
                    model.version);
                _buckets.Add(bucket);

                token.Succeed(bucket);
            })
            .OnFailure(token.Fail);

            return(token);
        }
Example #16
0
        /// <inheritdoc cref="IStorageWorker"/>
        public IAsyncToken <Void> Delete(string key)
        {
            var token = new AsyncToken <Void>();

            _http
            .Delete <CreateKvResponse>(_http.UrlBuilder.Url($"{ENDPOINT_KVS}/{key}"))
            .OnSuccess(response =>
            {
                if (!response.Payload.success)
                {
                    token.Fail(new Exception(response.Payload.error));
                    return;
                }

                OnDelete?.Invoke(key);

                token.Succeed(Void.Instance);
            })
            .OnFailure(token.Fail);

            return(token);
        }
Example #17
0
        private void Decrement_NoLock(AsyncToken token)
        {
            Contract.ThrowIfFalse(_gate.LockHeldByMe());

            _counter--;
            if (_counter == 0)
            {
                foreach (var task in _pendingTasks)
                {
                    task.SetResult(true);
                }

                _pendingTasks.Clear();

                // Replace the cancellation source used for expediting waits.
                var oldSource = Interlocked.Exchange(ref _expeditedDelayCancellationTokenSource, new CancellationTokenSource());
                oldSource.Dispose();
            }

            if (_trackActiveTokens)
            {
                int  i       = 0;
                bool removed = false;
                while (i < _diagnosticTokenList.Count)
                {
                    if (_diagnosticTokenList[i] == token)
                    {
                        _diagnosticTokenList.RemoveAt(i);
                        removed = true;
                        break;
                    }

                    i++;
                }

                Debug.Assert(removed, "IAsyncToken and Listener mismatch");
            }
        }
        /// <summary>
        /// Loads the bucket's value. Subsequent Value() calls will be cached.
        ///
        /// If StorageService::Refresh returns a version higher than the cached
        /// version, the next call to Value() will fetch the updated value.
        /// </summary>
        /// <typeparam name="T">The type to deserialize the object to.</typeparam>
        /// <returns></returns>
        public IAsyncToken <T> Value <T>()
        {
            var token = new AsyncToken <T>();

            if (_version == _manifestVersion && null != _value)
            {
                token.Succeed((T)_value);
            }
            else
            {
                _worker
                .Load(Key, typeof(T))
                .OnSuccess(response =>
                {
                    _value = (T)response;

                    token.Succeed((T)_value);
                })
                .OnFailure(exception => token.Fail(exception));
            }

            return(token);
        }
        /// <summary>
        /// Sends a json request.
        /// </summary>
        /// <typeparam name="T">The type of response we expect.</typeparam>
        /// <param name="verb">The http verb to use.</param>
        /// <param name="url">The url to send the request to.</param>
        /// <param name="payload">The object that will be serialized into json.</param>
        /// <returns>An IAsyncToken to listen to.</returns>
        /// <exception cref="NullReferenceException"></exception>
        protected IAsyncToken <HttpResponse <T> > SendJsonRequest <T>(
            HttpVerb verb,
            string url,
            object payload)
        {
            var token = new AsyncToken <HttpResponse <T> >();

            var request = new UnityWebRequest(
                url,
                verb.ToString().ToUpperInvariant())
            {
                downloadHandler = new DownloadHandlerBuffer(),
                disposeDownloadHandlerOnDispose = true,
                disposeUploadHandlerOnDispose   = true
            };

            ApplyHeaders(Headers, request);
            ApplyJsonPayload(payload, request);

            _bootstrapper.BootstrapCoroutine(Wait(request, token));

            return(token);
        }
    public override async UniTask ExecuteAsync(AsyncToken asyncToken = default)
    {
        // 1. Disable Naninovel input.
        var inputManager = Engine.GetService <IInputManager>();

        inputManager.ProcessInput = false;

        // 2. Stop script player.
        var scriptPlayer = Engine.GetService <IScriptPlayer>();

        scriptPlayer.Stop();

        // 3. Hide text printer.
        var hidePrinter = new HidePrinter();

        hidePrinter.ExecuteAsync(asyncToken).Forget();

        // 4. Reset state (if required).
        if (ResetState)
        {
            var stateManager = Engine.GetService <IStateManager>();
            await stateManager.ResetStateAsync();
        }

        // 5. Switch cameras.
        var advCamera = GameObject.Find("AdventureModeCamera").GetComponent <Camera>();

        advCamera.enabled = true;
        var naniCamera = Engine.GetService <ICameraManager>().Camera;

        naniCamera.enabled = false;

        // 6. Enable character control.
        var controller = Object.FindObjectOfType <CharacterController3D>();

        controller.IsInputBlocked = false;
    }
        /// <summary>
        /// Sends a file!
        /// </summary>
        /// <typeparam name="T">The type of response we expect.</typeparam>
        /// <param name="verb">The http verb to use.</param>
        /// <param name="url">The url to send the request to.</param>
        /// <param name="fields">Optional fields that will _precede_ the file.</param>
        /// <param name="file">The file, which will be named "file".</param>
        /// <param name="service">Optional parameter which uses headers for a specific service instead of defaults.</param>
        /// <returns></returns>
        private IAsyncToken <HttpResponse <T> > SendFile <T>(
            HttpVerb verb,
            string url,
            IEnumerable <Tuple <string, string> > fields,
            ref byte[] file)
        {
            var token = new AsyncToken <HttpResponse <T> >();

            var form = new WWWForm();

            foreach (var tuple in fields)
            {
                form.AddField(tuple.Item1, tuple.Item2);
            }

            form.AddBinaryData("file", file);

            var request = UnityWebRequest.Post(
                url,
                form);

            request.method          = verb.ToString().ToUpperInvariant();
            request.useHttpContinue = false;
            request.downloadHandler = new DownloadHandlerBuffer();
            request.disposeDownloadHandlerOnDispose = true;
            request.disposeUploadHandlerOnDispose   = true;

            var service = Services.Process(request);

            // Log after Processing
            Log(verb.ToString(), url, service);

            _bootstrapper.BootstrapCoroutine(Wait(request, token));

            return(token);
        }
        /// <summary>
        /// Deletes the KV. Disallows delete if latest version has not been
        /// loaded.
        /// </summary>
        /// <returns></returns>
        public IAsyncToken <Void> Delete()
        {
            var token = new AsyncToken <Void>();

            if (_manifestVersion > _version)
            {
                token.Fail(new Exception("Cannot delete without version update."));
            }
            else
            {
                _worker
                .Delete(Key)
                .OnSuccess(_ =>
                {
                    // TODO: To think about: we have to trust the worker to
                    // TODO: tell the service.

                    token.Succeed(Void.Instance);
                })
                .OnFailure(token.Fail);
            }

            return(token);
        }
Example #23
0
        /// <summary>
        /// Executed after the download is finished
        /// </summary>
        /// <param name="data"></param>
        private void LoadCompleteHandler(object data)
        {
            //Debug.Log("LoadCompleteHandler");

            AsyncToken httpToken = (AsyncToken)data;

            string path = (string)httpToken.Data;

            T output = ResponseExtractor(httpToken.Response);

            _finished.Add(path, output);

            _tokenToTokens[httpToken].ForEach(delegate(AsyncToken token)
            {
                token.Response = httpToken.Response;

                if (null != _tokenUpdater)
                {
                    TokenUpdater(token, output);
                }

                /**
                 * Execute callback function
                 * */
                if (_callbacks.ContainsKey(token))
                {
                    ResultHandler resultHandler = _callbacks[token];
                    _callbacks.Remove(token);
                    resultHandler(token);
                }
            });

            _tokenToTokens.Remove(httpToken);

            _active.Remove(path);
        }
Example #24
0
        /// <inheritdoc cref="IStorageWorker"/>
        public IAsyncToken <object> Load(string key, Type type)
        {
            var token = new AsyncToken <object>();

            _http
            .Get <GetKvResponse>(_http.UrlBuilder.Url($"{ENDPOINT_KVS}/{key}"))
            .OnSuccess(response =>
            {
                if (!response.Payload.success)
                {
                    token.Fail(new Exception(response.Payload.error));
                    return;
                }

                var bytes = Encoding.UTF8.GetBytes(response.Payload.body.value);
                object value;
                _json.Deserialize(type, ref bytes, out value);

                token.Succeed(value);
            })
            .OnFailure(token.Fail);

            return(token);
        }
Example #25
0
 public override async UniTask ExecuteAsync(AsyncToken token = default)
 {
     await TimeOfDay.SetHourAsync(Hour, Duration, token);
 }
Example #26
0
 /// <summary>
 /// Cancels the current download
 /// </summary>
 /// <param name="token"></param>
 public void Cancel(AsyncToken token)
 {
     _connector.Cancel(token);
 }
        /// <summary>
        /// Sycnhronously process response.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="request">WWW request.</param>
        /// <param name="token">Token to resolve.</param>
        private IEnumerator Wait <T>(
            WWW request,
            AsyncToken <HttpResponse <T> > token)
        {
            var start = DateTime.Now;

            while (!request.isDone)
            {
                if (TimeoutMs > 0 && DateTime.Now.Subtract(start).TotalMilliseconds > TimeoutMs)
                {
                    // request timed out
                    request.Dispose();

                    token.Fail(new Exception("Request timed out."));

                    yield break;
                }

                yield return(null);
            }

            var httpResponse = new HttpResponse <T>
            {
                StatusCode = GetStatusCode(request),
                Headers    = null == request.responseHeaders
                    ? new List <Tuple <string, string> >()
                    : request
                             .responseHeaders
                             .Select(pair => Tuple.Create(pair.Key, pair.Value))
                             .ToList(),
                Raw = request.bytes
            };

            var bytes = request.bytes;

            object value = null;

            if (typeof(T) != typeof(byte[]))
            {
                try
                {
                    _serializer.Deserialize(typeof(T), ref bytes, out value);
                }
                catch (Exception exception)
                {
                    httpResponse.NetworkSuccess = false;
                    httpResponse.NetworkError   = string.Format("Could not deserialize : {0}.", exception.Message);
                }
            }
            else
            {
                value = bytes;
            }

            httpResponse.Payload = (T)value;

            if (Successful((int)httpResponse.StatusCode))
            {
                httpResponse.NetworkSuccess = true;
            }
            else
            {
                httpResponse.NetworkSuccess = false;
                httpResponse.NetworkError   = Encoding.UTF8.GetString(bytes);
            }

            token.Succeed(httpResponse);
        }