diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 6fc61e5da88..0476b31828f 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -770,15 +770,24 @@ public final class com/facebook/react/bridge/JSApplicationIllegalArgumentExcepti } public abstract class com/facebook/react/bridge/JSBundleLoader { + public static final field Companion Lcom/facebook/react/bridge/JSBundleLoader$Companion; public fun ()V - public static fun createAssetLoader (Landroid/content/Context;Ljava/lang/String;Z)Lcom/facebook/react/bridge/JSBundleLoader; - public static fun createCachedBundleFromNetworkLoader (Ljava/lang/String;Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; - public static fun createCachedSplitBundleFromNetworkLoader (Ljava/lang/String;Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; - public static fun createFileLoader (Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; - public static fun createFileLoader (Ljava/lang/String;Ljava/lang/String;Z)Lcom/facebook/react/bridge/JSBundleLoader; + public static final fun createAssetLoader (Landroid/content/Context;Ljava/lang/String;Z)Lcom/facebook/react/bridge/JSBundleLoader; + public static final fun createCachedBundleFromNetworkLoader (Ljava/lang/String;Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; + public static final fun createCachedSplitBundleFromNetworkLoader (Ljava/lang/String;Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; + public static final fun createFileLoader (Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; + public static final fun createFileLoader (Ljava/lang/String;Ljava/lang/String;Z)Lcom/facebook/react/bridge/JSBundleLoader; public abstract fun loadScript (Lcom/facebook/react/bridge/JSBundleLoaderDelegate;)Ljava/lang/String; } +public final class com/facebook/react/bridge/JSBundleLoader$Companion { + public final fun createAssetLoader (Landroid/content/Context;Ljava/lang/String;Z)Lcom/facebook/react/bridge/JSBundleLoader; + public final fun createCachedBundleFromNetworkLoader (Ljava/lang/String;Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; + public final fun createCachedSplitBundleFromNetworkLoader (Ljava/lang/String;Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; + public final fun createFileLoader (Ljava/lang/String;)Lcom/facebook/react/bridge/JSBundleLoader; + public final fun createFileLoader (Ljava/lang/String;Ljava/lang/String;Z)Lcom/facebook/react/bridge/JSBundleLoader; +} + public abstract interface class com/facebook/react/bridge/JSBundleLoaderDelegate { public abstract fun loadScriptFromAssets (Landroid/content/res/AssetManager;Ljava/lang/String;Z)V public abstract fun loadScriptFromFile (Ljava/lang/String;Ljava/lang/String;Z)V diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java deleted file mode 100644 index a066069f30d..00000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and 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.bridge; - -import android.content.Context; -import com.facebook.infer.annotation.Nullsafe; -import com.facebook.react.common.DebugServerException; -import java.util.Objects; - -/** A class that stores JS bundle information and allows a {@link JSBundleLoaderDelegate}. */ -@Nullsafe(Nullsafe.Mode.LOCAL) -public abstract class JSBundleLoader { - - /** - * This loader is recommended one for release version of your app. In that case local JS executor - * should be used. JS bundle will be read from assets in native code to save on passing large - * strings from java to native memory. - */ - public static JSBundleLoader createAssetLoader( - final Context context, final String assetUrl, final boolean loadSynchronously) { - return new JSBundleLoader() { - @Override - public String loadScript(JSBundleLoaderDelegate delegate) { - delegate.loadScriptFromAssets(context.getAssets(), assetUrl, loadSynchronously); - return assetUrl; - } - }; - } - - /** - * This loader loads bundle from file system. The bundle will be read in native code to save on - * passing large strings from java to native memory. - */ - public static JSBundleLoader createFileLoader(final String fileName) { - return createFileLoader(fileName, fileName, false); - } - - public static JSBundleLoader createFileLoader( - final String fileName, final String assetUrl, final boolean loadSynchronously) { - return new JSBundleLoader() { - @Override - public String loadScript(JSBundleLoaderDelegate delegate) { - delegate.loadScriptFromFile(fileName, assetUrl, loadSynchronously); - return fileName; - } - }; - } - - /** - * This loader is used when bundle gets reloaded from dev server. In that case loader expect JS - * bundle to be prefetched and stored in local file. We do that to avoid passing large strings - * between java and native code and avoid allocating memory in java to fit whole JS bundle in it. - * Providing correct {@param sourceURL} of downloaded bundle is required for JS stacktraces to - * work correctly and allows for source maps to correctly symbolize those. - */ - public static JSBundleLoader createCachedBundleFromNetworkLoader( - final String sourceURL, final String cachedFileLocation) { - return new JSBundleLoader() { - @Override - public String loadScript(JSBundleLoaderDelegate delegate) { - try { - delegate.loadScriptFromFile(cachedFileLocation, sourceURL, false); - return sourceURL; - } catch (Exception e) { - throw DebugServerException.makeGeneric( - sourceURL, Objects.toString(e.getMessage(), ""), e); - } - } - }; - } - - /** - * Same as {{@link JSBundleLoader#createCachedBundleFromNetworkLoader(String, String)}}, but for - * split bundles in development. - */ - public static JSBundleLoader createCachedSplitBundleFromNetworkLoader( - final String sourceURL, final String cachedFileLocation) { - return new JSBundleLoader() { - @Override - public String loadScript(JSBundleLoaderDelegate delegate) { - try { - delegate.loadSplitBundleFromFile(cachedFileLocation, sourceURL); - return sourceURL; - } catch (Exception e) { - throw DebugServerException.makeGeneric( - sourceURL, Objects.toString(e.getMessage(), ""), e); - } - } - }; - } - - /** Loads the script, returning the URL of the source it loaded. */ - public abstract String loadScript(JSBundleLoaderDelegate delegate); -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.kt new file mode 100644 index 00000000000..52c69a3d39a --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.kt @@ -0,0 +1,99 @@ +/* + * Copyright (c) Meta Platforms, Inc. and 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.bridge + +import android.content.Context +import com.facebook.react.common.DebugServerException + +/** A class that stores JS bundle information and allows a [JSBundleLoaderDelegate]. */ +public abstract class JSBundleLoader { + + /** Loads the script, returning the URL of the source it loaded. */ + public abstract fun loadScript(delegate: JSBundleLoaderDelegate): String + + public companion object { + /** + * This loader is recommended one for release version of your app. In that case local JS + * executor should be used. JS bundle will be read from assets in native code to save on passing + * large strings from java to native memory. + */ + @JvmStatic + public fun createAssetLoader( + context: Context, + assetUrl: String, + loadSynchronously: Boolean + ): JSBundleLoader = + object : JSBundleLoader() { + override fun loadScript(delegate: JSBundleLoaderDelegate): String { + delegate.loadScriptFromAssets(context.assets, assetUrl, loadSynchronously) + return assetUrl + } + } + + /** + * This loader loads bundle from file system. The bundle will be read in native code to save on + * passing large strings from java to native memory. + */ + @JvmStatic + public fun createFileLoader(fileName: String): JSBundleLoader = + createFileLoader(fileName, fileName, false) + + @JvmStatic + public fun createFileLoader( + fileName: String, + assetUrl: String, + loadSynchronously: Boolean + ): JSBundleLoader = + object : JSBundleLoader() { + override fun loadScript(delegate: JSBundleLoaderDelegate): String { + delegate.loadScriptFromFile(fileName, assetUrl, loadSynchronously) + return fileName + } + } + + /** + * This loader is used when bundle gets reloaded from dev server. In that case loader expect JS + * bundle to be prefetched and stored in local file. We do that to avoid passing large strings + * between java and native code and avoid allocating memory in java to fit whole JS bundle in + * it. Providing correct [sourceURL] of downloaded bundle is required for JS stacktraces to work + * correctly and allows for source maps to correctly symbolize those. + */ + @JvmStatic + public fun createCachedBundleFromNetworkLoader( + sourceURL: String, + cachedFileLocation: String + ): JSBundleLoader = + object : JSBundleLoader() { + override fun loadScript(delegate: JSBundleLoaderDelegate): String { + return try { + delegate.loadScriptFromFile(cachedFileLocation, sourceURL, false) + sourceURL + } catch (e: Exception) { + throw DebugServerException.makeGeneric(sourceURL, e.message.orEmpty(), e) + } + } + } + + /** Same as [createCachedBundleFromNetworkLoader], but for split bundles in development. */ + @JvmStatic + public fun createCachedSplitBundleFromNetworkLoader( + sourceURL: String, + cachedFileLocation: String + ): JSBundleLoader = + object : JSBundleLoader() { + override fun loadScript(delegate: JSBundleLoaderDelegate): String { + return try { + delegate.loadSplitBundleFromFile(cachedFileLocation, sourceURL) + sourceURL + } catch (e: Exception) { + throw DebugServerException.makeGeneric(sourceURL, e.message.orEmpty(), e) + } + } + } + } +}