@Override
    public void onComplete() {
        /*
        Subscriber.onComplete() and Subscriber.onError(Throwable t) MUST consider
        the Subscription cancelled after having received the signal.
         */
        logger.trace("onComplete");
        graphqlWSSubProtocol.cancel();
        subscription = null;
    }
Calling onSubscribe, onNext, onError or onComplete MUST return normally except when any provided
parameter is null in which case it MUST throw a java.lang.NullPointerException to the caller, for all
other situations the only legal way for a Subscriber to signal failure is by cancelling its
Subscription. In the case that this rule is violated, any associated Subscription to the Subscriber
MUST be considered as cancelled, and the caller MUST raise this error condition in a fashion that is
adequate for the runtime environment.
graphql/src/main/java/com/linecorp/armeria/server/graphql/GraphqlWebSocketSubscriber.java