Exemplo n.º 1
0
        private async ValueTask CancelationHelper(Task jsTask, CancellationToken cancellationToken, WebSocketState previousState)
        {
            if (jsTask.IsCompletedSuccessfully)
            {
                return;
            }
            try
            {
                using (var receiveRegistration = cancellationToken.Register(() =>
                {
                    CancelablePromise.CancelPromise(jsTask);
                }))
                {
                    await jsTask.ConfigureAwait(true);

                    return;
                }
            }
            catch (JSException ex)
            {
                if (State == WebSocketState.Aborted)
                {
                    throw new OperationCanceledException(nameof(WebSocketState.Aborted), ex);
                }

                if (cancellationToken.IsCancellationRequested)
                {
                    _state = WebSocketState.Aborted;
                    throw new OperationCanceledException(cancellationToken);
                }
                if (ex.Message == "OperationCanceledException")
                {
                    _state = WebSocketState.Aborted;
                    throw new OperationCanceledException("The operation was cancelled.", ex, cancellationToken);
                }
                if (previousState == WebSocketState.Connecting)
                {
                    throw new WebSocketException(WebSocketError.Faulted, SR.net_webstatus_ConnectFailure, ex);
                }
                throw new WebSocketException(WebSocketError.NativeError, ex);
            }
        }
Exemplo n.º 2
0
 public static async ValueTask <T> CancelationHelper <T>(Task <T> promise, CancellationToken cancellationToken, JSObject?abortController = null, JSObject?fetchResponse = null)
 {
     if (promise.IsCompletedSuccessfully)
     {
         return(promise.Result);
     }
     try
     {
         using (var operationRegistration = cancellationToken.Register(() =>
         {
             CancelablePromise.CancelPromise(promise);
             if (abortController != null)
             {
                 AbortRequest(abortController);
             }
             if (fetchResponse != null)
             {
                 AbortResponse(fetchResponse);
             }
         }))
         {
             return(await promise.ConfigureAwait(true));
         }
     }
     catch (OperationCanceledException oce) when(cancellationToken.IsCancellationRequested)
     {
         throw CancellationHelper.CreateOperationCanceledException(oce, cancellationToken);
     }
     catch (JSException jse)
     {
         if (jse.Message.StartsWith("AbortError", StringComparison.Ordinal))
         {
             throw CancellationHelper.CreateOperationCanceledException(jse, CancellationToken.None);
         }
         if (cancellationToken.IsCancellationRequested)
         {
             throw CancellationHelper.CreateOperationCanceledException(jse, cancellationToken);
         }
         throw new HttpRequestException(jse.Message, jse);
     }
 }