package com.webpieces.http2engine.impl.client; 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.http2engine.api.StreamWriter; import com.webpieces.http2engine.api.client.ClientEngineListener; import com.webpieces.http2engine.api.client.Http2ClientEngine; import com.webpieces.http2engine.api.client.Http2Config; import com.webpieces.http2engine.api.client.Http2ResponseListener; import com.webpieces.http2engine.api.client.InjectionConfig; 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.StreamState; public class Level1ClientEngine implements Http2ClientEngine { private Level7MarshalAndPing marshalLayer; private Level2ClientSynchro synchronization; public Level1ClientEngine(ClientEngineListener clientEngineListener, 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()); Level8NotifyListeners finalLayer = new Level8NotifyListeners(clientEngineListener); marshalLayer = new Level7MarshalAndPing(parser, remoteSettings, finalLayer); Level6RemoteFlowControl remoteFlowCtrl = new Level6RemoteFlowControl(streamState, marshalLayer, remoteSettings); Level6LocalFlowControl localFlowCtrl = new Level6LocalFlowControl(marshalLayer, finalLayer, localSettings); Level5ClientStateMachine clientSm = new Level5ClientStateMachine(config.getId(), remoteFlowCtrl, localFlowCtrl); Level4ClientStreams streamInit = new Level4ClientStreams(streamState, clientSm, localFlowCtrl, remoteFlowCtrl, config, remoteSettings); Level3ParsingAndRemoteSettings parsing = new Level3ParsingAndRemoteSettings(streamInit, remoteFlowCtrl, marshalLayer, parser, config, remoteSettings); synchronization = new Level2ClientSynchro(streamInit, parsing, finalLayer, executor); } @Override public CompletableFuture<Void> sendPing() { return marshalLayer.sendPing(); } @Override public CompletableFuture<Void> sendInitializationToSocket() { return synchronization.sendInitializationToSocket(); } @Override public CompletableFuture<StreamWriter> sendFrameToSocket(Http2Headers headers, Http2ResponseListener responseListener) { return synchronization.sendRequestToSocket(headers, responseListener); } @Override public void parse(DataWrapper newData) { synchronization.parse(newData); } @Override public void farEndClosed() { synchronization.farEndClosed(); } @Override public void initiateClose(String reason) { synchronization.initiateClose(reason); } }