Skip to content

Commit

Permalink
added async http request and removed old sync impl (#6)
Browse files Browse the repository at this point in the history
# Description

In order to make http requests non-blocking the previous synchronous
calls are replaced with asynchronous ones. Additionally, the new
implementation in the http.js script utilizes async-await syntax, which
is easier to understand than the old XMLHttpRequest approach.

What does this PR do?
Fixes LimeChain#506

How were these changes implemented and what do they affect?
Changes have been made to the HttpRequest class and http.js script,
which are called by the JsonUtil class. These modifications will not be
visible to all users of the JsonUtil class.

---------

Co-authored-by: Georgi Grigorov <[email protected]>
  • Loading branch information
Grigorov-Georgi and Georgi Grigorov authored Aug 15, 2024
1 parent 64b0339 commit 8663462
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 16 deletions.
32 changes: 30 additions & 2 deletions src/main/java/com/limechain/teavm/HttpRequest.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,36 @@
package com.limechain.teavm;

import lombok.extern.java.Log;
import org.teavm.interop.Async;
import org.teavm.interop.AsyncCallback;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSFunctor;
import org.teavm.jso.JSObject;
import org.teavm.jso.core.JSError;

import java.util.logging.Level;

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

@Async
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) -> {
if (error != null) {
log.log(Level.WARNING, error.getMessage());
} else {
callback.complete(response);
}
});
}

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

@JSFunctor
private interface HttpRequestCallback extends JSObject {
void apply(JSError error, String response);
}
}
5 changes: 4 additions & 1 deletion src/main/java/com/limechain/utils/json/JsonUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

public class JsonUtil {

// Prevents instantiation
private JsonUtil() {}

public static Object parseJson(String jsonString) {
return new JsonParser(jsonString).parse();
}
Expand All @@ -13,6 +16,6 @@ public static String stringify(Object object) {
}

public static String readJsonFromFile(String filePath) {
return HttpRequest.httpRequestSync("GET", filePath, null);
return HttpRequest.asyncHttpRequest("GET", filePath, null);
}
}
33 changes: 20 additions & 13 deletions src/main/webapp/js/http.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
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);
async function asyncHttpRequest(method = 'GET', url, body = null, callback) {
try {
const response = await fetch(url, {
method: method,
headers: {
'Content-Type': 'application/json'
},
body: method === 'POST' ? body : undefined
});

if (!response.ok) {
callback(new Error(`Request failed with status: ${response?.status}`), null);
return;
}

const result = await response.text();
callback(null, result);

} catch (error) {
callback(new Error(`Error during sending request: ${error?.message}`), null);
}
}

0 comments on commit 8663462

Please sign in to comment.