@@ -0,0 +1,1473 @@
+package org.realityforge.replicant.client.transport;%0A%0Aimport java.util.Objects;%0Aimport java.util.function.Consumer;%0Aimport javax.annotation.Nonnull;%0Aimport org.realityforge.gwt.webpoller.client.CancelableRequestWrapper;%0Aimport org.realityforge.gwt.webpoller.client.Request;%0Aimport org.realityforge.gwt.webpoller.client.RequestContext;%0Aimport org.realityforge.gwt.webpoller.client.RequestFactory;%0A%0A// TODO: CancelableRequestFactory should migrate to WebPoller library%0Apublic class CancelableRequestFactory%0A  implements RequestFactory%0A%7B%0A  @Nonnull%0A  private final RequestFactory _factory;%0A  @Nonnull%0A  private final Consumer%3CRunnable%3E _wrapper;%0A%0A  public CancelableRequestFactory( @Nonnull final RequestFactory factory, @Nonnull final Consumer%3CRunnable%3E wrapper )%0A  %7B%0A    _factory = Objects.requireNonNull( factory );%0A    _wrapper = Objects.requireNonNull( wrapper );%0A  %7D%0A%0A  @Nonnull%0A  @Override%0A  public Request newRequest( @Nonnull final RequestContext context )%0A    throws Exception%0A  %7B%0A    final CancelableRequestWrapper request = new CancelableRequestWrapper();%0A    _wrapper.accept( () -%3E bindRequest( context, request ) );%0A    return request;%0A  %7D%0A%0A  private void bindRequest( @Nonnull final RequestContext context, @Nonnull final CancelableRequestWrapper request )%0A  %7B%0A    try%0A    %7B%0A      request.setRequest( _factory.newRequest( context ) );%0A    %7D%0A    catch ( final Exception ignored )%0A    %7B%0A      // Fine to ignore as we assume it is effectively canceled%0A    %7D%0A  %7D%0A%7D%0A

Add CancelableRequestFactory rather than overiding every factory implementation