All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.salesforce.reactivegrpc.common.CancellableStreamObserver Maven / Gradle / Ivy

/*
 *  Copyright (c) 2017, salesforce.com, inc.
 *  All rights reserved.
 *  Licensed under the BSD 3-Clause license.
 *  For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause
 */

package com.salesforce.reactivegrpc.common;

import io.grpc.Status;
import io.grpc.StatusException;
import io.grpc.StatusRuntimeException;
import io.grpc.stub.ClientCallStreamObserver;
import io.grpc.stub.ClientResponseObserver;

/**
 * CancellableStreamObserver wraps a {@link io.grpc.stub.StreamObserver} and invokes an onCanceledHandler if
 * {@link io.grpc.stub.StreamObserver#onError(Throwable)} is invoked with a {@link StatusException} or
 * {@link StatusRuntimeException} of type {@code Status.Code.CANCELLED}. This class is used to hook gRPC server
 * cancellation events.
 *
 * @param 
 * @param 
 */
public class CancellableStreamObserver implements ClientResponseObserver {
    private final ClientResponseObserver delegate;
    private final Runnable onCanceledHandler;

    public CancellableStreamObserver(ClientResponseObserver delegate, Runnable onCanceledHandler) {
        this.delegate = delegate;
        this.onCanceledHandler = onCanceledHandler;
    }

    @Override
    public void onNext(TResponse value) {
        delegate.onNext(value);
    }

    @Override
    public void onError(Throwable t) {
        if (t instanceof StatusException) {
            if (((StatusException) t).getStatus().getCode() == Status.Code.CANCELLED) {
                onCanceledHandler.run();
            }
        }
        if (t instanceof StatusRuntimeException) {
            if (((StatusRuntimeException) t).getStatus().getCode() == Status.Code.CANCELLED) {
                onCanceledHandler.run();
            }
        }
        delegate.onError(t);
    }

    @Override
    public void onCompleted() {
        delegate.onCompleted();
    }

    @Override
    public void beforeStart(ClientCallStreamObserver requestStream) {
        delegate.beforeStart(requestStream);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy