package com.webpieces.http2engine.impl.svr;
import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
import com.webpieces.hpack.api.dto.Http2Headers;
import com.webpieces.http2engine.api.server.ServerEngineListener;
import com.webpieces.http2engine.api.server.StreamReference;
import com.webpieces.http2engine.impl.shared.EngineResultListener;
import com.webpieces.http2engine.impl.shared.Stream;
import com.webpieces.http2parser.api.Http2Exception;
import com.webpieces.http2parser.api.dto.lib.Http2Msg;
import com.webpieces.http2parser.api.dto.lib.PartialStream;
public class Level8NotifySvrListeners implements EngineResultListener {
private ServerEngineListener listener;
private Level1ServerEngine level1ServerEngine;
private AtomicInteger pushIdGenerator = new AtomicInteger(2);
public Level8NotifySvrListeners(ServerEngineListener listener, Level1ServerEngine level1ServerEngine) {
this.listener = listener;
this.level1ServerEngine = level1ServerEngine;
}
@Override
public CompletableFuture<Void> sendControlFrameToClient(Http2Msg msg) {
CompletableFuture<Void> future = new CompletableFuture<Void>();
try {
future.complete(null);
} catch(Throwable e) {
future.completeExceptionally(new RuntimeException(e));
}
return future;
}
@Override
public void closeSocket(Http2Exception reason) {
listener.closeSocket(reason);
}
@Override
public CompletableFuture<Void> sendToSocket(ByteBuffer buffer) {
return listener.sendToSocket(buffer).thenApply(s -> null);
}
@Override
public CompletableFuture<Void> sendPieceToApp(Stream stream, PartialStream payload) {
StreamReference writer = stream.getStreamWriter();
if(payload instanceof Http2Headers && writer == null) {
writer = listener.sendRequestToServer((Http2Headers) payload,
new ResponseHandlerImpl(level1ServerEngine, stream, pushIdGenerator));
stream.setStreamWriter(writer);
return CompletableFuture.completedFuture(null);
}
return writer.sendMore(payload).thenApply((s) -> null);
}
}