-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add helius config parser and factory.
- Loading branch information
Showing
2 changed files
with
89 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,18 @@ | ||
module software.sava.solana_services { | ||
requires jdk.httpserver; | ||
requires java.net.http; | ||
requires jdk.httpserver; | ||
requires systems.comodal.json_iterator; | ||
requires software.sava.core_services; | ||
requires software.sava.anchor_programs; | ||
requires software.sava.solana_programs; | ||
requires software.sava.rpc; | ||
|
||
requires software.sava.core; | ||
requires software.sava.rpc; | ||
requires software.sava.solana_programs; | ||
requires software.sava.solana_web2; | ||
requires software.sava.anchor_programs; | ||
requires software.sava.core_services; | ||
|
||
exports software.sava.services.solana.accounts.lookup; | ||
exports software.sava.services.solana.accounts.lookup.http; | ||
exports software.sava.services.solana.config; | ||
exports software.sava.services.solana.load_balance; | ||
exports software.sava.services.solana.remote.call; | ||
} |
81 changes: 81 additions & 0 deletions
81
solana/src/main/java/software/sava/services/solana/config/HeliusConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
package software.sava.services.solana.config; | ||
|
||
import software.sava.services.core.remote.call.ErrorHandler; | ||
import software.sava.services.core.remote.call.ErrorHandlerConfig; | ||
import software.sava.services.core.remote.load_balance.BalancedItem; | ||
import software.sava.services.core.remote.load_balance.LoadBalancer; | ||
import software.sava.services.core.request_capacity.CapacityConfig; | ||
import software.sava.services.core.request_capacity.ErrorTrackedCapacityMonitor; | ||
import software.sava.solana.web2.helius.client.http.HeliusClient; | ||
import systems.comodal.jsoniter.FieldBufferPredicate; | ||
import systems.comodal.jsoniter.JsonIterator; | ||
import systems.comodal.jsoniter.ValueType; | ||
|
||
import java.net.URI; | ||
import java.net.http.HttpClient; | ||
import java.net.http.HttpResponse; | ||
import java.util.Objects; | ||
|
||
import static java.util.Objects.requireNonNullElse; | ||
import static systems.comodal.jsoniter.JsonIterator.fieldEquals; | ||
|
||
public record HeliusConfig(URI endpoint, | ||
CapacityConfig capacityConfig, | ||
ErrorHandler errorHandler) { | ||
|
||
public static HeliusConfig parseConfig(final JsonIterator ji) { | ||
if (ji.whatIsNext() == ValueType.STRING) { | ||
return new HeliusConfig(URI.create(ji.readString()), null, null); | ||
} else { | ||
final var parser = new Parser(); | ||
ji.testObject(parser); | ||
return parser.create(); | ||
} | ||
} | ||
|
||
public ErrorTrackedCapacityMonitor<HttpResponse<byte[]>> createMonitor(final String serviceName, | ||
final CapacityConfig defaultConfig) { | ||
return requireNonNullElse(capacityConfig, defaultConfig).createHttpResponseMonitor(serviceName); | ||
} | ||
|
||
public LoadBalancer<HeliusClient> createHeliusClient(final HttpClient httpClient, | ||
final CapacityConfig defaultCapacityConfig, | ||
final ErrorHandler defaultErrorHandler) { | ||
final var capacityMonitor = createMonitor("helius", defaultCapacityConfig); | ||
final var client = HeliusClient.createHttpClient(endpoint(), httpClient, capacityMonitor.errorTracker()); | ||
final var balancedItem = BalancedItem.createItem( | ||
client, | ||
capacityMonitor, | ||
Objects.requireNonNullElse(errorHandler, defaultErrorHandler) | ||
); | ||
return LoadBalancer.createBalancer(balancedItem); | ||
} | ||
|
||
private static final class Parser implements FieldBufferPredicate { | ||
|
||
private URI endpoint; | ||
private CapacityConfig capacityConfig; | ||
private ErrorHandler errorHandler; | ||
|
||
private Parser() { | ||
} | ||
|
||
private HeliusConfig create() { | ||
return new HeliusConfig(endpoint, capacityConfig, errorHandler); | ||
} | ||
|
||
@Override | ||
public boolean test(final char[] buf, final int offset, final int len, final JsonIterator ji) { | ||
if (fieldEquals("url", buf, offset, len)) { | ||
endpoint = URI.create(ji.readString()); | ||
} else if (fieldEquals("capacity", buf, offset, len)) { | ||
capacityConfig = CapacityConfig.parse(ji); | ||
} else if (fieldEquals("backoff", buf, offset, len)) { | ||
errorHandler = ErrorHandlerConfig.parseConfig(ji).createHandler(); | ||
} else { | ||
ji.skip(); | ||
} | ||
return true; | ||
} | ||
} | ||
} |