Exemplo n.º 1
0
        /// <summary>
        /// Tries to send the <see cref="RequestEnvelope"/> message to the network.
        /// Returns an <typeparamref name="IEnumerable{TResponseType}"/> when completed.
        /// </summary>
        /// <param name="envelope">Envolope to send.</param>
        /// <param name="onResponse">Optional delegate to invoke on response recieved.</param>
        /// <typeparam name="TResponseType">The response type expected back.</typeparam>
        /// <returns>An awaitable future result.</returns>
        public AsyncRequestFutures <TResponseType> SendRequest <TResponseType>(RequestEnvelope envelope, Action <IEnumerable <TResponseType> > onResponse)
            where TResponseType : class, IResponseMessage, IMessage, IMessage <TResponseType>, new()
        {
            //the delegate can be null. that is fine.
            Throw <ArgumentNullException> .If.IsNull(envelope)?.Now(nameof(envelope), $"Cannot send a null {nameof(RequestEnvelope)} with {nameof(NetworkCoroutineService)}");

            PreProcessRequestEnvelope(envelope);

            ResponseEnvelopeAsyncRequestFutures <TResponseType> responseFutures = new ResponseEnvelopeAsyncRequestFutures <TResponseType>();

            throw new NotImplementedException("Multiple response handling isn't implemented yet. API supports but no implementation.");
        }
Exemplo n.º 2
0
        //TODO: Consolidate all async request/response in a single coroutine.
        /// <summary>
        /// Handles a request using a Unity3D coroutine. Yields waits until the responses has been recieved.
        /// </summary>
        /// <typeparam name="TResponseType">The expected response type.</typeparam>
        /// <param name="envelope">Request envelope to send.</param>
        /// <param name="userFuture">User provided future (the future the user is holding)</param>
        /// <param name="onResponseCallback">The callback requested.</param>
        /// <returns>An enumerable-style collection. (Coroutine)</returns>
        private IEnumerator RequestHandlingCoroutine <TResponseType>(RequestEnvelope envelope, ResponseEnvelopeAsyncRequestFutures <TResponseType> userFutures, Action <IEnumerable <TResponseType> > onResponseCallback)
            where TResponseType : class, IResponseMessage, IMessage, IMessage <TResponseType>, new()
        {
            //Pass the request to the internal network service and poll the future when it's done
            IFuture <IEnumerable <TResponseType> > internalProvidedFuture = innerAsyncNetworkService.SendRequestAsFutures <TResponseType, ResponseEnvelopeAsyncRequestFutures <TResponseType> >(envelope, userFutures, GetRequestUrl());

            //generic polling for futures and callbacks
            yield return(WaitForCompletedRequest(internalProvidedFuture, onResponseCallback));
        }