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