diff --git a/.changeset/serious-walls-kiss.md b/.changeset/serious-walls-kiss.md new file mode 100644 index 0000000..2550cc7 --- /dev/null +++ b/.changeset/serious-walls-kiss.md @@ -0,0 +1,5 @@ +--- +'@capawesome/capacitor-live-update': patch +--- + +fix: reset to the default bundle if the sync has not found a bundle diff --git a/packages/live-update/README.md b/packages/live-update/README.md index cb573fb..e056931 100644 --- a/packages/live-update/README.md +++ b/packages/live-update/README.md @@ -71,6 +71,7 @@ We recommend to declare [`CA92.1`](https://developer.apple.com/documentation/bun | **`autoDeleteBundles`** | boolean | Whether or not to automatically delete unused bundles. When enabled, the plugin will automatically delete unused bundles after calling `ready()`. | false | 5.0.0 | | **`defaultChannel`** | string | The default channel of the app. | | 6.3.0 | | **`enabled`** | boolean | Whether or not the plugin is enabled. | true | 5.0.0 | +| **`httpTimeout`** | number | The timeout in milliseconds for HTTP requests. | 60000 | 6.4.0 | | **`location`** | 'us' \| 'eu' | The location of the server to use when using [Capawesome Cloud](https://capawesome.io/cloud). | 'us' | 6.2.0 | | **`publicKey`** | string | The public key to verify the integrity of the bundle. The public key must be a PEM-encoded RSA public key. | | 6.1.0 | | **`readyTimeout`** | number | The timeout in milliseconds to wait for the app to be ready before resetting to the default bundle. | 10000 | 5.0.0 | @@ -88,6 +89,7 @@ In `capacitor.config.json`: "autoDeleteBundles": undefined, "defaultChannel": 'production', "enabled": undefined, + "httpTimeout": undefined, "location": 'eu', "publicKey": '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDodf1SD0OOn6hIlDuKBza0Ed0OqtwyVJwiyjmE9BJaZ7y8ZUfcF+SKmd0l2cDPM45XIg2tAFux5n29uoKyHwSt+6tCi5CJA5Z1/1eZruRRqABLonV77KS3HUtvOgqRLDnKSV89dYZkM++NwmzOPgIF422mvc+VukcVOBfc8/AHQIDAQAB-----END PUBLIC KEY-----', "readyTimeout": undefined, @@ -111,6 +113,7 @@ const config: CapacitorConfig = { autoDeleteBundles: undefined, defaultChannel: 'production', enabled: undefined, + httpTimeout: undefined, location: 'eu', publicKey: '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDodf1SD0OOn6hIlDuKBza0Ed0OqtwyVJwiyjmE9BJaZ7y8ZUfcF+SKmd0l2cDPM45XIg2tAFux5n29uoKyHwSt+6tCi5CJA5Z1/1eZruRRqABLonV77KS3HUtvOgqRLDnKSV89dYZkM++NwmzOPgIF422mvc+VukcVOBfc8/AHQIDAQAB-----END PUBLIC KEY-----', readyTimeout: undefined, @@ -620,9 +623,10 @@ Only available on Android and iOS. #### SyncResult -| Prop | Type | Description | Since | -| ------------------ | --------------------------- | ---------------------------------------------------------------------------------------------------------- | ----- | -| **`nextBundleId`** | string \| null | The identifier of the next bundle to use. If `null`, the app is up-to-date and no new bundle is available. | 5.0.0 | +| Prop | Type | Description | Since | +| --------------------- | --------------------------- | ----------------------------------------------------------------------------------------- | ----- | +| **`currentBundleId`** | string \| null | The unique identifier of the current bundle. If `null`, the default bundle is being used. | 7.0.0 | +| **`nextBundleId`** | string \| null | The identifier of the next bundle to use. If `null`, the default bundle is being used. | 5.0.0 | diff --git a/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdate.java b/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdate.java index d3255ec..5e3dfd3 100644 --- a/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdate.java +++ b/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/LiveUpdate.java @@ -221,33 +221,38 @@ public void error(Exception exception) { } // No update available Logger.debug(LiveUpdatePlugin.TAG, "No update available."); - SyncResult syncResult = new SyncResult(null); + String currentBundleId = getCurrentBundleId(); + SyncResult syncResult = new SyncResult(currentBundleId, currentBundleId); callback.success(syncResult); } @Override public void success(@NonNull GetLatestBundleResponse result) { - String latestBundleId = result.getBundleId(); + String currentBundleId = getCurrentBundleId(); + String nextBundleId = result.getBundleId(); String checksum = result.getChecksum(); String signature = result.getSignature(); String url = result.getUrl(); + // Check if a latest bundle is available + if (nextBundleId == null) { + Logger.debug(LiveUpdatePlugin.TAG, "No update available."); + setNextCapacitorServerPathToDefaultWebAssetDir(); + SyncResult syncResult = new SyncResult(currentBundleId, null); + callback.success(syncResult); + return; + } // Check if the bundle already exists - if (hasBundle(latestBundleId)) { - String nextBundleId = null; - String currentBundleId = getCurrentBundleId(); - if (!latestBundleId.equals(currentBundleId)) { - // Set the next bundle - setNextBundle(latestBundleId); - nextBundleId = latestBundleId; - } - SyncResult syncResult = new SyncResult(nextBundleId); + if (hasBundle(nextBundleId)) { + // Set the next bundle + setNextBundle(nextBundleId); + SyncResult syncResult = new SyncResult(currentBundleId, nextBundleId); callback.success(syncResult); return; } // Download and unzip the bundle downloadBundle( - latestBundleId, + nextBundleId, checksum, signature, url, @@ -255,8 +260,8 @@ public void success(@NonNull GetLatestBundleResponse result) { @Override public void success() { // Set the next bundle - setNextBundle(latestBundleId); - SyncResult syncResult = new SyncResult(latestBundleId); + setNextBundle(nextBundleId); + SyncResult syncResult = new SyncResult(currentBundleId, nextBundleId); callback.success(syncResult); } @@ -542,6 +547,9 @@ public void onResponse(@NonNull okhttp3.Call call, @NonNull okhttp3.Response res } GetLatestBundleResponse getLatestBundleResponse = new GetLatestBundleResponse(responseJson); callback.success(getLatestBundleResponse); + } else if (response.code() == 404) { + GetLatestBundleResponse getLatestBundleResponse = new GetLatestBundleResponse(); + callback.success(getLatestBundleResponse); } else { Exception exception = new Exception(responseBody.string()); Logger.error(LiveUpdatePlugin.TAG, exception.getMessage(), exception); diff --git a/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/api/GetLatestBundleResponse.java b/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/api/GetLatestBundleResponse.java index 8d13215..32c38bb 100644 --- a/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/api/GetLatestBundleResponse.java +++ b/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/api/GetLatestBundleResponse.java @@ -5,6 +5,7 @@ public class GetLatestBundleResponse { + @Nullable private String bundleId; @Nullable @@ -13,8 +14,16 @@ public class GetLatestBundleResponse { @Nullable private String signature; + @Nullable private String url; + public GetLatestBundleResponse() { + this.bundleId = null; + this.checksum = null; + this.signature = null; + this.url = null; + } + public GetLatestBundleResponse(JSONObject responseJson) { this.bundleId = responseJson.optString("bundleId"); String checksum = responseJson.optString("checksum", "null"); @@ -32,6 +41,7 @@ public GetLatestBundleResponse(JSONObject responseJson) { this.url = responseJson.optString("url"); } + @Nullable public String getBundleId() { return bundleId; } @@ -46,6 +56,7 @@ public String getSignature() { return signature; } + @Nullable public String getUrl() { return url; } diff --git a/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/SyncResult.java b/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/SyncResult.java index 354e5d4..75188ae 100644 --- a/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/SyncResult.java +++ b/packages/live-update/android/src/main/java/io/capawesome/capacitorjs/plugins/liveupdate/classes/results/SyncResult.java @@ -7,15 +7,19 @@ public class SyncResult implements Result { + @Nullable + private final String currentBundleId; @Nullable private final String nextBundleId; - public SyncResult(@Nullable String nextBundleId) { - this.nextBundleId = nextBundleId; + public SyncResult(@Nullable String currentBundleId, @Nullable String nextBundleId) { + this.currentBundleId = currentBundleId; + this.nextBundleId = nextBundleId; } public JSObject toJSObject() { JSObject result = new JSObject(); + result.put("currentBundleId", currentBundleId == null ? JSONObject.NULL : currentBundleId); result.put("nextBundleId", nextBundleId == null ? JSONObject.NULL : nextBundleId); return result; } diff --git a/packages/live-update/ios/Plugin/Protocols/Api/GetLatestBundleResponse.swift b/packages/live-update/ios/Plugin/Protocols/Api/GetLatestBundleResponse.swift index b4303f1..6476054 100644 --- a/packages/live-update/ios/Plugin/Protocols/Api/GetLatestBundleResponse.swift +++ b/packages/live-update/ios/Plugin/Protocols/Api/GetLatestBundleResponse.swift @@ -1,6 +1,6 @@ struct GetLatestBundleResponse: Codable { - var bundleId: String + var bundleId: String? var checksum: String? var signature: String? - var url: String + var url: String? } diff --git a/packages/live-update/src/definitions.ts b/packages/live-update/src/definitions.ts index 1507596..fadc80c 100644 --- a/packages/live-update/src/definitions.ts +++ b/packages/live-update/src/definitions.ts @@ -411,10 +411,18 @@ export interface SetCustomIdOptions { * @since 5.0.0 */ export interface SyncResult { + /** + * The unique identifier of the current bundle. + * + * If `null`, the default bundle is being used. + * + * @since 7.0.0 + */ + currentBundleId: string | null; /** * The identifier of the next bundle to use. * - * If `null`, the app is up-to-date and no new bundle is available. + * If `null`, the default bundle is being used. * * @since 5.0.0 */