Skip to content

Commit

Permalink
add helius config parser and factory.
Browse files Browse the repository at this point in the history
  • Loading branch information
jpe7s committed Oct 14, 2024
1 parent feb5f4b commit 19bf1f9
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 5 deletions.
13 changes: 8 additions & 5 deletions solana/src/main/java/module-info.java
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;
}
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;
}
}
}

0 comments on commit 19bf1f9

Please sign in to comment.