Skip to content

Commit

Permalink
feat: expose RPC calls
Browse files Browse the repository at this point in the history
  • Loading branch information
Zurcusa committed Aug 28, 2024
1 parent ce6d952 commit d566d92
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 5 deletions.
10 changes: 8 additions & 2 deletions src/main/java/com/limechain/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import com.limechain.client.HostNode;
import com.limechain.client.LightClient;
import com.limechain.config.HostConfig;
import com.limechain.rpc.server.AppBean;
import com.limechain.rpc.Function;
import com.limechain.rpc.RpcClient;
import com.limechain.rpc.server.RpcApp;
import com.limechain.utils.DivLogger;
import org.teavm.jso.JSBody;
import org.teavm.jso.core.JSString;

import java.util.logging.Level;

Expand All @@ -20,9 +22,13 @@ public static void main(String[] args) {

HostNode client = new LightClient();

exportAPI(RpcClient::sendRpcRequest, JSString.valueOf("rpc"));
// Start the client
// NOTE: This starts the beans the client would need - mutates the global context
client.start();
log.log(Level.INFO, "\uD83D\uDE80Started light client!");
}

@JSBody(params = {"f", "apiName"}, script = "window[apiName] = f")
private static native void exportAPI(Function f, JSString apiName);
}
8 changes: 8 additions & 0 deletions src/main/java/com/limechain/rpc/Function.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.limechain.rpc;

import org.teavm.jso.JSObject;

public interface Function extends JSObject {

String sendRequest(String method, String[] params);
}
5 changes: 5 additions & 0 deletions src/main/java/com/limechain/rpc/RpcClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ private static String createRpcRequestJson(String method, List<Object> params) {
return JsonUtil.stringify(request);
}

public static String sendRpcRequest(String method, String[] params) {
return HttpRequest.createHttpRequest(POST, LOAD_BALANCER.getNextEndpoint(),
createRpcRequestJson(method, List.of(params)));
}

protected static RpcResponse sendRpcRequest(RpcMethod method, List<Object> params) {
String jsonResult = HttpRequest.asyncHttpRequest(POST, LOAD_BALANCER.getNextEndpoint(),
createRpcRequestJson(method.getMethod(), params));
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/com/limechain/teavm/HttpRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class HttpRequest {
public static native String asyncHttpRequest(String method, String url, String body);

private static void asyncHttpRequest(String method, String url, String body, AsyncCallback<String> callback) {
createAsyncHttpRequest(method, url, body, (error, response) -> {
createHttpRequest(method, url, body, (error, response) -> {
if (error != null) {
log.log(Level.WARNING, error.getMessage());
} else {
Expand All @@ -27,7 +27,10 @@ private static void asyncHttpRequest(String method, String url, String body, Asy
}

@JSBody(params = {"method", "url", "body", "callback"}, script = "return asyncHttpRequest(method, url, body, callback);")
private static native void createAsyncHttpRequest(String method, String url, String body, HttpRequestCallback callback);
private static native void createHttpRequest(String method, String url, String body, HttpRequestCallback callback);

@JSBody(params = {"method", "url", "body"}, script = "return httpRequestSync(method, url, body);")
public static native String createHttpRequest(String method, String url, String body);

@JSFunctor
private interface HttpRequestCallback extends JSObject {
Expand Down
18 changes: 17 additions & 1 deletion src/main/webapp/js/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,20 @@ async function asyncHttpRequest(method = 'GET', url, body = null, callback) {
} catch (error) {
callback(new Error(`Error during sending request: ${error?.message}`), null);
}
}
}

function httpRequestSync(method, url, body) {
var xhr = new XMLHttpRequest();
xhr.open(method, url, false); // false for synchronous request
xhr.setRequestHeader('Content-Type', 'application/json');
if (method === 'POST' && body) {
xhr.send(body);
} else {
xhr.send();
}
if (xhr.status === 200) {
return xhr.responseText;
} else {
throw new Error('Request failed with status ' + xhr.status);
}
}

0 comments on commit d566d92

Please sign in to comment.