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