Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ public class StallionApiConstants {
// Buffer Size
public static final int DOWNLOAD_BUFFER_SIZE = 1024 * 256;

// Network timeouts (aligned with iOS URLSession defaults)
public static final int CONNECT_TIMEOUT_MS = 30_000;
public static final int READ_TIMEOUT_MS = 60_000;

// File and Folder Names
public static final String ZIP_FILE_NAME = "build.zip";
public static final String UNZIP_FOLDER_NAME = "/build";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public static JSONObject post(String urlString, String requestBodyString) {
URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setConnectTimeout(StallionApiConstants.CONNECT_TIMEOUT_MS);
urlConnection.setReadTimeout(StallionApiConstants.READ_TIMEOUT_MS);
urlConnection.setRequestProperty("Content-Type", "application/json");

String appToken = stallionConfig.getAppToken();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ public static void downloadBundle(

} catch (Exception e) {
Log.e(TAG, "Error in downloadBundle: " + e.getMessage(), e);
stallionDownloadCallback.onReject(
StallionApiConstants.DOWNLOAD_ERROR_PREFIX,
e.getMessage() != null ? e.getMessage() : "Unknown download error"
);
}
});
}
Expand Down Expand Up @@ -159,8 +163,8 @@ private static void downloadFile(
return;
}
} catch (IOException e) {
callback.onReject(StallionApiConstants.DOWNLOAD_ERROR_PREFIX, "IOException occurred: ");
throw e;
String message = e.getMessage() != null ? e.getMessage() : "Unknown IO error";
throw new IOException("IOException occurred: " + message, e);
} finally {
connection.disconnect();
}
Expand All @@ -176,6 +180,8 @@ private static HttpURLConnection setupConnection(
URL url = new URL(downloadUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(StallionApiConstants.CONNECT_TIMEOUT_MS);
connection.setReadTimeout(StallionApiConstants.READ_TIMEOUT_MS);

if (offset > 0) {
connection.setRequestProperty("Range", "bytes=" + offset + "-");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public static void downloadStageBundle(ReadableMap bundleInfo, Promise promise)
long alreadyDownloaded = StallionDownloadCacheManager.getDownloadCache(config, receivedDownloadUrl, downloadPath);

emitDownloadStartedStage(receivedHash, alreadyDownloaded > 0);
final long downloadStartMs = System.currentTimeMillis();

StallionFileDownloader.downloadBundle(
receivedDownloadUrl,
Expand All @@ -43,10 +44,11 @@ public void onReject(String prefix, String error) {

@Override
public void onSuccess(String successPayload) {
long downloadTimeMs = System.currentTimeMillis() - downloadStartMs;
stallionStateManager.stallionMeta.setCurrentStageSlot(StallionMetaConstants.SlotStates.NEW_SLOT);
stallionStateManager.stallionMeta.setStageTempHash(receivedHash);
stallionStateManager.syncStallionMeta();
emitDownloadSuccessStage(receivedHash);
emitDownloadSuccessStage(receivedHash, downloadTimeMs);
StallionDownloadCacheManager.deleteDownloadCache(downloadPath);
promise.resolve(successPayload);
}
Expand All @@ -60,10 +62,13 @@ public void onProgress(double downloadFraction) {
}
}

private static void emitDownloadSuccessStage(String releaseHash) {
private static void emitDownloadSuccessStage(String releaseHash, long downloadTimeMs) {
JSONObject successPayload = new JSONObject();
try {
successPayload.put("releaseHash", releaseHash);
JSONObject meta = new JSONObject();
meta.put("downloadTime", downloadTimeMs);
successPayload.put("meta", meta.toString());
} catch (Exception ignored) { }
StallionEventManager.getInstance().sendEvent(
StallionEventConstants.NativeStageEventTypes.DOWNLOAD_COMPLETE_STAGE.toString(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ public static void downloadNewRelease(String newReleaseHash, String newReleaseUr
long alreadyDownloaded = StallionDownloadCacheManager.getDownloadCache(config, downloadUrl, downloadPath);

emitDownloadStarted(newReleaseHash, alreadyDownloaded > 0, bundleDiffIdForEvents);
final long downloadStartMs = System.currentTimeMillis();

StallionFileDownloader.downloadBundle(
downloadUrl,
Expand All @@ -185,6 +186,7 @@ public void onReject(String prefix, String error) {

@Override
public void onSuccess(String successPayload) {
long downloadTimeMs = System.currentTimeMillis() - downloadStartMs;
isDownloadInProgress.set(false);
StallionDownloadCacheManager.deleteDownloadCache(downloadPath);

Expand Down Expand Up @@ -224,14 +226,14 @@ public void onSuccess(String successPayload) {
}
}

stateManager.stallionMeta.setCurrentProdSlot(StallionMetaConstants.SlotStates.NEW_SLOT);
stateManager.stallionMeta.setProdTempHash(newReleaseHash);
String currentProdNewHash = stateManager.stallionMeta.getProdNewHash();
if(currentProdNewHash != null && !currentProdNewHash.isEmpty()) {
StallionSlotManager.stabilizeProd();
}
stateManager.syncStallionMeta();
emitDownloadSuccess(newReleaseHash, bundleDiffIdForEvents);
stateManager.stallionMeta.setCurrentProdSlot(StallionMetaConstants.SlotStates.NEW_SLOT);
stateManager.stallionMeta.setProdTempHash(newReleaseHash);
String currentProdNewHash = stateManager.stallionMeta.getProdNewHash();
if(currentProdNewHash != null && !currentProdNewHash.isEmpty()) {
StallionSlotManager.stabilizeProd();
}
stateManager.syncStallionMeta();
emitDownloadSuccess(newReleaseHash, bundleDiffIdForEvents, downloadTimeMs);
}

@Override
Expand Down Expand Up @@ -282,13 +284,16 @@ private static void emitDownloadError(String releaseHash, String error) {
);
}

private static void emitDownloadSuccess(String releaseHash, String bundleDiffId) {
private static void emitDownloadSuccess(String releaseHash, String bundleDiffId, long downloadTimeMs) {
JSONObject successPayload = new JSONObject();
try {
successPayload.put("releaseHash", releaseHash);
if (bundleDiffId != null && !bundleDiffId.isEmpty()) {
successPayload.put("diffId", bundleDiffId);
}
JSONObject meta = new JSONObject();
meta.put("downloadTime", downloadTimeMs);
successPayload.put("meta", meta.toString());
} catch (Exception ignored) { }
StallionEventManager.getInstance().sendEvent(
NativeProdEventTypes.DOWNLOAD_COMPLETE_PROD.toString(),
Expand Down
Loading