Skip to content

Commit

Permalink
Refactor DevServerHelper to separate checking if packager running
Browse files Browse the repository at this point in the history
Summary:
Changelog: [Internal]
Separate the functionality of the  isPackagerRunning() function into a new class PackagerStatusCheck with the intention of being able to use this without needing a DevServerHelper

Reviewed By: makovkastar, ShikaSD

Differential Revision: D29933318

fbshipit-source-id: d708bb987b08634015d6ee6b6c8989faba416c5a
  • Loading branch information
amy588 authored and facebook-github-bot committed Jul 28, 2021
1 parent 6d4fff2 commit 3081db2
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Okio;
import okio.Sink;
import org.json.JSONArray;
Expand All @@ -63,8 +62,6 @@
public class DevServerHelper {
public static final String RELOAD_APP_EXTRA_JS_PROXY = "jsproxy";

private static final String PACKAGER_OK_STATUS = "packager-status:running";

private static final int HTTP_CONNECT_TIMEOUT_MS = 5000;

private static final String DEBUGGER_MSG_DISABLE = "{ \"id\":1,\"method\":\"Debugger.disable\" }";
Expand Down Expand Up @@ -113,6 +110,7 @@ public String typeID() {
private final DevInternalSettings mSettings;
private final OkHttpClient mClient;
private final BundleDownloader mBundleDownloader;
private final PackagerStatusCheck mPackagerStatusCheck;
private final String mPackageName;

private @Nullable JSPackagerClient mPackagerClient;
Expand All @@ -132,7 +130,7 @@ public DevServerHelper(
.writeTimeout(0, TimeUnit.MILLISECONDS)
.build();
mBundleDownloader = new BundleDownloader(mClient);

mPackagerStatusCheck = new PackagerStatusCheck(mClient);
mPackageName = packageName;
}

Expand Down Expand Up @@ -477,60 +475,13 @@ public String getDevServerSplitBundleURL(String jsModulePath) {
}

public void isPackagerRunning(final PackagerStatusCallback callback) {
String statusURL =
createPackagerStatusURL(mSettings.getPackagerConnectionSettings().getDebugServerHost());
Request request = new Request.Builder().url(statusURL).build();

mClient
.newCall(request)
.enqueue(
new Callback() {
@Override
public void onFailure(Call call, IOException e) {
FLog.w(
ReactConstants.TAG,
"The packager does not seem to be running as we got an IOException requesting "
+ "its status: "
+ e.getMessage());
callback.onPackagerStatusFetched(false);
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
FLog.e(
ReactConstants.TAG,
"Got non-success http code from packager when requesting status: "
+ response.code());
callback.onPackagerStatusFetched(false);
return;
}
ResponseBody body = response.body();
if (body == null) {
FLog.e(
ReactConstants.TAG,
"Got null body response from packager when requesting status");
callback.onPackagerStatusFetched(false);
return;
}
String bodyString =
body.string(); // cannot call body.string() twice, stored it into variable.
// https://github.com/square/okhttp/issues/1240#issuecomment-68142603
if (!PACKAGER_OK_STATUS.equals(bodyString)) {
FLog.e(
ReactConstants.TAG,
"Got unexpected response from packager when requesting status: "
+ bodyString);
callback.onPackagerStatusFetched(false);
return;
}
callback.onPackagerStatusFetched(true);
}
});
}

private static String createPackagerStatusURL(String host) {
return String.format(Locale.US, "http://%s/status", host);
String host = mSettings.getPackagerConnectionSettings().getDebugServerHost();
if (host == null) {
FLog.w(ReactConstants.TAG, "No packager host configured.");
callback.onPackagerStatusFetched(false);
} else {
mPackagerStatusCheck.run(host, callback);
}
}

private String createLaunchJSDevtoolsCommandUrl() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.devsupport;

import com.facebook.common.logging.FLog;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.devsupport.interfaces.PackagerStatusCallback;
import java.io.IOException;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;

/** Use this class to check if the JavaScript packager is running on the provided host. */
public class PackagerStatusCheck {

private static final String PACKAGER_OK_STATUS = "packager-status:running";
private static final int HTTP_CONNECT_TIMEOUT_MS = 5000;
private static final String PACKAGER_STATUS_URL_TEMPLATE = "http://%s/status";

private final OkHttpClient mClient;

public PackagerStatusCheck() {
mClient =
new OkHttpClient.Builder()
.connectTimeout(HTTP_CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
.readTimeout(0, TimeUnit.MILLISECONDS)
.writeTimeout(0, TimeUnit.MILLISECONDS)
.build();
}

public PackagerStatusCheck(OkHttpClient client) {
mClient = client;
}

public void run(String host, final PackagerStatusCallback callback) {
String statusURL = createPackagerStatusURL(host);
Request request = new Request.Builder().url(statusURL).build();

mClient
.newCall(request)
.enqueue(
new Callback() {
@Override
public void onFailure(Call call, IOException e) {
FLog.w(
ReactConstants.TAG,
"The packager does not seem to be running as we got an IOException requesting "
+ "its status: "
+ e.getMessage());
callback.onPackagerStatusFetched(false);
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
FLog.e(
ReactConstants.TAG,
"Got non-success http code from packager when requesting status: "
+ response.code());
callback.onPackagerStatusFetched(false);
return;
}
ResponseBody body = response.body();
if (body == null) {
FLog.e(
ReactConstants.TAG,
"Got null body response from packager when requesting status");
callback.onPackagerStatusFetched(false);
return;
}
String bodyString =
body.string(); // cannot call body.string() twice, stored it into variable.
// https://github.com/square/okhttp/issues/1240#issuecomment-68142603
if (!PACKAGER_OK_STATUS.equals(bodyString)) {
FLog.e(
ReactConstants.TAG,
"Got unexpected response from packager when requesting status: "
+ bodyString);
callback.onPackagerStatusFetched(false);
return;
}
callback.onPackagerStatusFetched(true);
}
});
}

private static String createPackagerStatusURL(String host) {
return String.format(Locale.US, PACKAGER_STATUS_URL_TEMPLATE, host);
}
}

0 comments on commit 3081db2

Please sign in to comment.