package com.webpieces.http2engine.impl.svr; import java.util.concurrent.CompletableFuture; import org.webpieces.data.api.DataWrapper; import org.webpieces.util.threading.SessionExecutor; import com.webpieces.hpack.api.HpackParser; import com.webpieces.hpack.api.dto.Http2Headers; import com.webpieces.hpack.api.dto.Http2Push; import com.webpieces.http2engine.api.StreamWriter; import com.webpieces.http2engine.api.client.Http2Config; import com.webpieces.http2engine.api.client.InjectionConfig; import com.webpieces.http2engine.api.server.Http2ServerEngine; import com.webpieces.http2engine.api.server.ServerEngineListener; import com.webpieces.http2engine.impl.shared.HeaderSettings; import com.webpieces.http2engine.impl.shared.Level3ParsingAndRemoteSettings; import com.webpieces.http2engine.impl.shared.Level6LocalFlowControl; import com.webpieces.http2engine.impl.shared.Level6RemoteFlowControl; import com.webpieces.http2engine.impl.shared.Level7MarshalAndPing; import com.webpieces.http2engine.impl.shared.Stream; import com.webpieces.http2engine.impl.shared.StreamState; public class Level1ServerEngine implements Http2ServerEngine { private Level7MarshalAndPing marshalLayer; private Level3ParsingAndRemoteSettings parsing; private Level2ServerSynchro synchronization; public Level1ServerEngine(ServerEngineListener listener, InjectionConfig injectionConfig) { SessionExecutor executor = injectionConfig.getExecutor(); Http2Config config = injectionConfig.getConfig(); HpackParser parser = injectionConfig.getLowLevelParser(); HeaderSettings remoteSettings = new HeaderSettings(); HeaderSettings localSettings = config.getLocalSettings(); //all state(memory) we need to clean up is in here or is the engine itself. To release RAM, //we have to release items in the map inside this or release the engine StreamState streamState = new StreamState(injectionConfig.getTime()); Level8NotifySvrListeners finalLayer = new Level8NotifySvrListeners(listener, this); marshalLayer = new Level7MarshalAndPing(parser, remoteSettings, finalLayer); Level6RemoteFlowControl remoteFlowCtrl = new Level6RemoteFlowControl(streamState, marshalLayer, remoteSettings); Level6LocalFlowControl localFlowCtrl = new Level6LocalFlowControl(marshalLayer, finalLayer, localSettings); Level5ServerStateMachine clientSm = new Level5ServerStateMachine(config.getId(), remoteFlowCtrl, localFlowCtrl); Level4ServerStreams streamInit = new Level4ServerStreams(streamState, clientSm, localFlowCtrl, remoteFlowCtrl, localSettings, remoteSettings); parsing = new Level3ParsingAndRemoteSettings(streamInit, remoteFlowCtrl, marshalLayer, parser, config, remoteSettings); synchronization = new Level2ServerSynchro(streamInit, parsing, executor); } @Override public void intialize() { parsing.sendSettings(); } @Override public CompletableFuture<Void> sendPing() { return marshalLayer.sendPing(); } @Override public void parse(DataWrapper newData) { synchronization.parse(newData); } @Override public void farEndClosed() { synchronization.farEndClosed(); } @Override public void initiateClose(String reason) { synchronization.initiateClose(reason); } public CompletableFuture<StreamWriter> sendResponseHeaders(Stream stream, Http2Headers data) { return synchronization.sendResponseHeaders(stream, data); } public CompletableFuture<StreamWriter> sendPush(Http2Push push) { return synchronization.sendPush(push); } }