react-native-ota-hot-update 2.0.7 → 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/android/generated/java/com/otahotupdate/NativeOtaHotUpdateSpec.java +4 -0
- package/android/generated/jni/RNOtaHotUpdateSpec-generated.cpp +6 -0
- package/android/generated/jni/react/renderer/components/RNOtaHotUpdateSpec/RNOtaHotUpdateSpecJSI-generated.cpp +7 -0
- package/android/generated/jni/react/renderer/components/RNOtaHotUpdateSpec/RNOtaHotUpdateSpecJSI.h +9 -0
- package/android/src/main/java/com/otahotupdate/OtaHotUpdateModule.kt +59 -14
- package/android/src/main/java/com/otahotupdate/SharedPrefs.kt +1 -0
- package/android/src/oldarch/OtaHotUpdateSpec.kt +1 -0
- package/ios/OtaHotUpdate.mm +71 -8
- package/ios/generated/RNOtaHotUpdateSpec/RNOtaHotUpdateSpec-generated.mm +7 -0
- package/ios/generated/RNOtaHotUpdateSpec/RNOtaHotUpdateSpec.h +3 -0
- package/ios/generated/RNOtaHotUpdateSpecJSI-generated.cpp +7 -0
- package/ios/generated/RNOtaHotUpdateSpecJSI.h +9 -0
- package/lib/commonjs/NativeOtaHotUpdate.js.map +1 -1
- package/lib/commonjs/index.js +4 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/NativeOtaHotUpdate.js.map +1 -1
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/src/NativeOtaHotUpdate.d.ts +1 -0
- package/lib/typescript/commonjs/src/NativeOtaHotUpdate.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +2 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/NativeOtaHotUpdate.d.ts +1 -0
- package/lib/typescript/module/src/NativeOtaHotUpdate.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +2 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativeOtaHotUpdate.ts +1 -0
- package/src/index.tsx +4 -0
package/README.md
CHANGED
|
@@ -49,6 +49,31 @@ Open `AppDelegate.m` and add this:
|
|
|
49
49
|
#endif
|
|
50
50
|
}
|
|
51
51
|
```
|
|
52
|
+
### IOS React native 0.77 or above
|
|
53
|
+
|
|
54
|
+
From react native 0.77, AppDelegate changed to swift file, so the configuration will be change a bit.
|
|
55
|
+
|
|
56
|
+
1. Create a Bridging Header
|
|
57
|
+
- Right-click on your project in the Xcode navigator and select New File from template.
|
|
58
|
+
- Select Header File under the iOS section and click Next.
|
|
59
|
+
- Name it something like `YourProjectName-Bridging-Header.h` and save it in your project directory.
|
|
60
|
+
- In your project's Build Settings: Search for `Objective-C Bridging Header`.
|
|
61
|
+
Set its value to the relative path of your bridging header file, e.g., YourProjectName/YourProjectName-Bridging-Header.h.
|
|
62
|
+
2. Open `YourProjectName-Bridging-Header.h` and add this line:
|
|
63
|
+
|
|
64
|
+
`#import "OtaHotUpdate.h"`
|
|
65
|
+
3. Open AppDelegate.swift:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
override func bundleURL() -> URL? {
|
|
69
|
+
#if DEBUG
|
|
70
|
+
RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
|
|
71
|
+
#else
|
|
72
|
+
OtaHotUpdate.getBundle() // -> Add this line
|
|
73
|
+
#endif
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
52
77
|
#### For downloading in background mode on IOS, following this (optional):
|
|
53
78
|
|
|
54
79
|
AppDelegate.h:
|
|
@@ -74,6 +99,32 @@ AppDelegate.mm:
|
|
|
74
99
|
}
|
|
75
100
|
```
|
|
76
101
|
|
|
102
|
+
AppDelegate.swift(RN >= 0.77):
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
class AppDelegate: RCTAppDelegate {
|
|
106
|
+
var taskIdentifier: UIBackgroundTaskIdentifier = .invalid
|
|
107
|
+
...
|
|
108
|
+
```
|
|
109
|
+
```bash
|
|
110
|
+
override func applicationWillResignActive(_ application: UIApplication) {
|
|
111
|
+
// End any existing background task
|
|
112
|
+
if taskIdentifier != .invalid {
|
|
113
|
+
application.endBackgroundTask(taskIdentifier)
|
|
114
|
+
taskIdentifier = .invalid
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Start a new background task
|
|
118
|
+
taskIdentifier = application.beginBackgroundTask(withName: nil) { [weak self] in
|
|
119
|
+
if let strongSelf = self {
|
|
120
|
+
application.endBackgroundTask(strongSelf.taskIdentifier)
|
|
121
|
+
strongSelf.taskIdentifier = .invalid
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
|
|
77
128
|
|
|
78
129
|
### Android
|
|
79
130
|
Open `MainApplication.kt` and add these codes bellow:
|
|
@@ -119,6 +170,11 @@ This method allows you to use a Git repository to host the bundle JS. The app pu
|
|
|
119
170
|
|
|
120
171
|
For detailed instructions on how to implement this, refer to [**DOC_OTA_GIT.md**](DOC_OTA_GIT.md).
|
|
121
172
|
|
|
173
|
+
|
|
174
|
+
### Build a Custom Admin Panel with CMS
|
|
175
|
+
Using Strapi, you can build a tailored admin panel to manage React Native hot updates effectively. This approach allows you to centralize the control of versioning and OTA updates while providing a user-friendly interface for managing content. To get started, refer to the detailed steps and code examples in this guide. For additional details, see [**OTA_CMS.md**](OTA_CMS.md).
|
|
176
|
+
|
|
177
|
+
|
|
122
178
|
## License
|
|
123
179
|
|
|
124
180
|
[MIT](LICENSE)
|
|
@@ -55,4 +55,8 @@ public abstract class NativeOtaHotUpdateSpec extends ReactContextBaseJavaModule
|
|
|
55
55
|
@ReactMethod
|
|
56
56
|
@DoNotStrip
|
|
57
57
|
public abstract void setCurrentVersion(String version, Promise promise);
|
|
58
|
+
|
|
59
|
+
@ReactMethod
|
|
60
|
+
@DoNotStrip
|
|
61
|
+
public abstract void rollbackToPreviousBundle(double a, Promise promise);
|
|
58
62
|
}
|
|
@@ -42,6 +42,11 @@ static facebook::jsi::Value __hostFunction_NativeOtaHotUpdateSpecJSI_setCurrentV
|
|
|
42
42
|
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "setCurrentVersion", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
static facebook::jsi::Value __hostFunction_NativeOtaHotUpdateSpecJSI_rollbackToPreviousBundle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
46
|
+
static jmethodID cachedMethodId = nullptr;
|
|
47
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "rollbackToPreviousBundle", "(DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
48
|
+
}
|
|
49
|
+
|
|
45
50
|
NativeOtaHotUpdateSpecJSI::NativeOtaHotUpdateSpecJSI(const JavaTurboModule::InitParams ¶ms)
|
|
46
51
|
: JavaTurboModule(params) {
|
|
47
52
|
methodMap_["setupBundlePath"] = MethodMetadata {2, __hostFunction_NativeOtaHotUpdateSpecJSI_setupBundlePath};
|
|
@@ -50,6 +55,7 @@ NativeOtaHotUpdateSpecJSI::NativeOtaHotUpdateSpecJSI(const JavaTurboModule::Init
|
|
|
50
55
|
methodMap_["restart"] = MethodMetadata {0, __hostFunction_NativeOtaHotUpdateSpecJSI_restart};
|
|
51
56
|
methodMap_["getCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateSpecJSI_getCurrentVersion};
|
|
52
57
|
methodMap_["setCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateSpecJSI_setCurrentVersion};
|
|
58
|
+
methodMap_["rollbackToPreviousBundle"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateSpecJSI_rollbackToPreviousBundle};
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
std::shared_ptr<TurboModule> RNOtaHotUpdateSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
|
|
@@ -48,6 +48,12 @@ static jsi::Value __hostFunction_NativeOtaHotUpdateCxxSpecJSI_setCurrentVersion(
|
|
|
48
48
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt)
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
|
+
static jsi::Value __hostFunction_NativeOtaHotUpdateCxxSpecJSI_rollbackToPreviousBundle(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
52
|
+
return static_cast<NativeOtaHotUpdateCxxSpecJSI *>(&turboModule)->rollbackToPreviousBundle(
|
|
53
|
+
rt,
|
|
54
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber()
|
|
55
|
+
);
|
|
56
|
+
}
|
|
51
57
|
|
|
52
58
|
NativeOtaHotUpdateCxxSpecJSI::NativeOtaHotUpdateCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
53
59
|
: TurboModule("OtaHotUpdate", jsInvoker) {
|
|
@@ -57,6 +63,7 @@ NativeOtaHotUpdateCxxSpecJSI::NativeOtaHotUpdateCxxSpecJSI(std::shared_ptr<CallI
|
|
|
57
63
|
methodMap_["restart"] = MethodMetadata {0, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_restart};
|
|
58
64
|
methodMap_["getCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_getCurrentVersion};
|
|
59
65
|
methodMap_["setCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_setCurrentVersion};
|
|
66
|
+
methodMap_["rollbackToPreviousBundle"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_rollbackToPreviousBundle};
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
|
package/android/generated/jni/react/renderer/components/RNOtaHotUpdateSpec/RNOtaHotUpdateSpecJSI.h
CHANGED
|
@@ -26,6 +26,7 @@ public:
|
|
|
26
26
|
virtual void restart(jsi::Runtime &rt) = 0;
|
|
27
27
|
virtual jsi::Value getCurrentVersion(jsi::Runtime &rt, double a) = 0;
|
|
28
28
|
virtual jsi::Value setCurrentVersion(jsi::Runtime &rt, jsi::String version) = 0;
|
|
29
|
+
virtual jsi::Value rollbackToPreviousBundle(jsi::Runtime &rt, double a) = 0;
|
|
29
30
|
|
|
30
31
|
};
|
|
31
32
|
|
|
@@ -100,6 +101,14 @@ private:
|
|
|
100
101
|
return bridging::callFromJs<jsi::Value>(
|
|
101
102
|
rt, &T::setCurrentVersion, jsInvoker_, instance_, std::move(version));
|
|
102
103
|
}
|
|
104
|
+
jsi::Value rollbackToPreviousBundle(jsi::Runtime &rt, double a) override {
|
|
105
|
+
static_assert(
|
|
106
|
+
bridging::getParameterCount(&T::rollbackToPreviousBundle) == 2,
|
|
107
|
+
"Expected rollbackToPreviousBundle(...) to have 2 parameters");
|
|
108
|
+
|
|
109
|
+
return bridging::callFromJs<jsi::Value>(
|
|
110
|
+
rt, &T::rollbackToPreviousBundle, jsInvoker_, instance_, std::move(a));
|
|
111
|
+
}
|
|
103
112
|
|
|
104
113
|
private:
|
|
105
114
|
friend class NativeOtaHotUpdateCxxSpec;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.otahotupdate
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
|
+
import android.icu.text.SimpleDateFormat
|
|
4
5
|
import android.util.Log
|
|
5
6
|
import com.facebook.react.bridge.Promise
|
|
6
7
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
@@ -9,9 +10,12 @@ import com.jakewharton.processphoenix.ProcessPhoenix
|
|
|
9
10
|
import com.otahotupdate.OtaHotUpdate.Companion.getPackageInfo
|
|
10
11
|
import com.rnhotupdate.Common.CURRENT_VERSION_NAME
|
|
11
12
|
import com.rnhotupdate.Common.PATH
|
|
13
|
+
import com.rnhotupdate.Common.PREVIOUS_PATH
|
|
12
14
|
import com.rnhotupdate.Common.VERSION
|
|
13
15
|
import com.rnhotupdate.SharedPrefs
|
|
14
16
|
import java.io.File
|
|
17
|
+
import java.util.Date
|
|
18
|
+
import java.util.Locale
|
|
15
19
|
import java.util.zip.ZipFile
|
|
16
20
|
|
|
17
21
|
class OtaHotUpdateModule internal constructor(context: ReactApplicationContext) :
|
|
@@ -37,13 +41,14 @@ class OtaHotUpdateModule internal constructor(context: ReactApplicationContext)
|
|
|
37
41
|
// Finally, delete the empty directory or file
|
|
38
42
|
return directory.delete()
|
|
39
43
|
}
|
|
40
|
-
private fun deleteOldBundleIfneeded(): Boolean {
|
|
44
|
+
private fun deleteOldBundleIfneeded(pathKey: String?): Boolean {
|
|
45
|
+
val pathName = if (pathKey != null) pathKey else PREVIOUS_PATH
|
|
41
46
|
val sharedPrefs = SharedPrefs(reactApplicationContext)
|
|
42
|
-
val path = sharedPrefs.getString(
|
|
47
|
+
val path = sharedPrefs.getString(pathName)
|
|
43
48
|
val file = File(path)
|
|
44
49
|
if (file.exists() && file.isFile) {
|
|
45
50
|
val isDeleted = deleteDirectory(file.parentFile)
|
|
46
|
-
sharedPrefs.
|
|
51
|
+
sharedPrefs.putString(pathName, "")
|
|
47
52
|
return isDeleted
|
|
48
53
|
} else {
|
|
49
54
|
return false
|
|
@@ -54,27 +59,44 @@ class OtaHotUpdateModule internal constructor(context: ReactApplicationContext)
|
|
|
54
59
|
): String? {
|
|
55
60
|
return try {
|
|
56
61
|
val outputDir = zipFile.parentFile
|
|
62
|
+
val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
|
|
63
|
+
var topLevelFolder: String? = null
|
|
57
64
|
var bundlePath: String? = null
|
|
58
65
|
ZipFile(zipFile).use { zip ->
|
|
59
66
|
zip.entries().asSequence().forEach { entry ->
|
|
60
67
|
zip.getInputStream(entry).use { input ->
|
|
68
|
+
if (topLevelFolder == null) {
|
|
69
|
+
val parts = entry.name.split("/")
|
|
70
|
+
if (parts.size > 1) {
|
|
71
|
+
topLevelFolder = parts.first()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
val outputFile = File(outputDir, entry.name)
|
|
61
75
|
if (entry.isDirectory) {
|
|
62
|
-
|
|
63
|
-
if (!d.exists()) d.mkdirs()
|
|
76
|
+
if (!outputFile.exists()) outputFile.mkdirs()
|
|
64
77
|
} else {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
f.outputStream().use { output ->
|
|
78
|
+
if (outputFile.parentFile?.exists() != true) outputFile.parentFile?.mkdirs()
|
|
79
|
+
outputFile.outputStream().use { output ->
|
|
69
80
|
input.copyTo(output)
|
|
70
81
|
}
|
|
71
|
-
if (
|
|
72
|
-
bundlePath =
|
|
82
|
+
if (outputFile.absolutePath.endsWith(extension)) {
|
|
83
|
+
bundlePath = outputFile.absolutePath
|
|
84
|
+
return@use // Exit early if found
|
|
73
85
|
}
|
|
74
86
|
}
|
|
75
87
|
}
|
|
76
88
|
}
|
|
77
89
|
}
|
|
90
|
+
// Rename the detected top-level folder
|
|
91
|
+
if (topLevelFolder != null) {
|
|
92
|
+
val extractedFolder = File(outputDir, topLevelFolder)
|
|
93
|
+
val renamedFolder = File(outputDir, "output_$timestamp")
|
|
94
|
+
if (extractedFolder.exists()) {
|
|
95
|
+
extractedFolder.renameTo(renamedFolder)
|
|
96
|
+
// Update bundlePath if the file was inside the renamed folder
|
|
97
|
+
bundlePath = bundlePath?.replace(extractedFolder.absolutePath, renamedFolder.absolutePath)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
78
100
|
bundlePath
|
|
79
101
|
} catch (e: Exception) {
|
|
80
102
|
e.printStackTrace()
|
|
@@ -88,12 +110,16 @@ class OtaHotUpdateModule internal constructor(context: ReactApplicationContext)
|
|
|
88
110
|
if (path != null) {
|
|
89
111
|
val file = File(path)
|
|
90
112
|
if (file.exists() && file.isFile) {
|
|
91
|
-
deleteOldBundleIfneeded()
|
|
113
|
+
deleteOldBundleIfneeded(null)
|
|
92
114
|
val fileUnzip = extractZipFile(file, extension ?: ".bundle")
|
|
93
115
|
if (fileUnzip != null) {
|
|
94
116
|
Log.d("setupBundlePath----: ", fileUnzip)
|
|
95
117
|
file.delete()
|
|
96
118
|
val sharedPrefs = SharedPrefs(reactApplicationContext)
|
|
119
|
+
val oldPath = sharedPrefs.getString(PATH)
|
|
120
|
+
if (!oldPath.equals("")) {
|
|
121
|
+
sharedPrefs.putString(PREVIOUS_PATH, oldPath)
|
|
122
|
+
}
|
|
97
123
|
sharedPrefs.putString(PATH, fileUnzip)
|
|
98
124
|
sharedPrefs.putString(CURRENT_VERSION_NAME, reactApplicationContext?.getPackageInfo()?.versionName)
|
|
99
125
|
promise.resolve(true)
|
|
@@ -114,10 +140,11 @@ class OtaHotUpdateModule internal constructor(context: ReactApplicationContext)
|
|
|
114
140
|
|
|
115
141
|
@ReactMethod
|
|
116
142
|
override fun deleteBundle(i: Double, promise: Promise) {
|
|
117
|
-
val isDeleted = deleteOldBundleIfneeded()
|
|
143
|
+
val isDeleted = deleteOldBundleIfneeded(PATH)
|
|
144
|
+
val isDeletedOldPath = deleteOldBundleIfneeded(PREVIOUS_PATH)
|
|
118
145
|
val sharedPrefs = SharedPrefs(reactApplicationContext)
|
|
119
146
|
sharedPrefs.putString(VERSION, "0")
|
|
120
|
-
promise.resolve(isDeleted)
|
|
147
|
+
promise.resolve(isDeleted && isDeletedOldPath)
|
|
121
148
|
}
|
|
122
149
|
|
|
123
150
|
@ReactMethod
|
|
@@ -151,6 +178,24 @@ class OtaHotUpdateModule internal constructor(context: ReactApplicationContext)
|
|
|
151
178
|
sharedPrefs.putString(CURRENT_VERSION_NAME, reactApplicationContext?.getPackageInfo()?.versionName)
|
|
152
179
|
promise.resolve(true)
|
|
153
180
|
}
|
|
181
|
+
|
|
182
|
+
@ReactMethod
|
|
183
|
+
override fun rollbackToPreviousBundle(a: Double, promise: Promise) {
|
|
184
|
+
val sharedPrefs = SharedPrefs(reactApplicationContext)
|
|
185
|
+
val oldPath = sharedPrefs.getString(PREVIOUS_PATH)
|
|
186
|
+
if (oldPath != "") {
|
|
187
|
+
val isDeleted = deleteOldBundleIfneeded(PATH)
|
|
188
|
+
if (isDeleted) {
|
|
189
|
+
sharedPrefs.putString(PATH, oldPath)
|
|
190
|
+
sharedPrefs.putString(PREVIOUS_PATH, "")
|
|
191
|
+
promise.resolve(true)
|
|
192
|
+
} else {
|
|
193
|
+
promise.resolve(false)
|
|
194
|
+
}
|
|
195
|
+
} else {
|
|
196
|
+
promise.resolve(false)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
154
199
|
companion object {
|
|
155
200
|
const val NAME = "OtaHotUpdate"
|
|
156
201
|
}
|
|
@@ -25,6 +25,7 @@ class SharedPrefs internal constructor(context: Context) {
|
|
|
25
25
|
}
|
|
26
26
|
object Common {
|
|
27
27
|
val PATH = "PATH"
|
|
28
|
+
val PREVIOUS_PATH = "PREVIOUS_PATH"
|
|
28
29
|
val VERSION = "VERSION"
|
|
29
30
|
val CURRENT_VERSION_NAME = "CURRENT_VERSION_NAME"
|
|
30
31
|
val SHARED_PREFERENCE_NAME = "HOT-UPDATE-REACT_NATIVE"
|
|
@@ -13,4 +13,5 @@ abstract class OtaHotUpdateSpec internal constructor(context: ReactApplicationCo
|
|
|
13
13
|
abstract fun getCurrentVersion(a: Double, promise: Promise)
|
|
14
14
|
abstract fun setCurrentVersion(version: String?, promise: Promise)
|
|
15
15
|
abstract fun setExactBundlePath(path: String?, promise: Promise)
|
|
16
|
+
abstract fun rollbackToPreviousBundle()
|
|
16
17
|
}
|
package/ios/OtaHotUpdate.mm
CHANGED
|
@@ -66,13 +66,14 @@ RCT_EXPORT_MODULE()
|
|
|
66
66
|
return success;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
- (BOOL)removeBundleIfNeeded {
|
|
69
|
+
- (BOOL)removeBundleIfNeeded:(NSString *)pathKey {
|
|
70
|
+
NSString *keyToUse = pathKey ? pathKey : @"OLD_PATH";
|
|
70
71
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
71
|
-
NSString *retrievedString = [defaults stringForKey
|
|
72
|
+
NSString *retrievedString = [defaults stringForKey:keyToUse];
|
|
72
73
|
NSError *error = nil;
|
|
73
74
|
if (retrievedString && [self isFilePathValid:retrievedString]) {
|
|
74
75
|
BOOL isDeleted = [self deleteAllContentsOfParentDirectoryOfFile:retrievedString error:&error];
|
|
75
|
-
[defaults removeObjectForKey
|
|
76
|
+
[defaults removeObjectForKey:keyToUse];
|
|
76
77
|
[defaults synchronize];
|
|
77
78
|
return isDeleted;
|
|
78
79
|
} else {
|
|
@@ -129,6 +130,34 @@ RCT_EXPORT_MODULE()
|
|
|
129
130
|
|
|
130
131
|
return nil;
|
|
131
132
|
}
|
|
133
|
+
- (NSString *)renameExtractedFolderInDirectory:(NSString *)directoryPath {
|
|
134
|
+
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
135
|
+
NSError *error = nil;
|
|
136
|
+
|
|
137
|
+
// Get the contents of the extracted directory
|
|
138
|
+
NSArray *contents = [fileManager contentsOfDirectoryAtPath:directoryPath error:&error];
|
|
139
|
+
if (error || contents.count != 1) {
|
|
140
|
+
NSLog(@"Error retrieving extracted folder or unexpected structure: %@", error.localizedDescription);
|
|
141
|
+
return nil;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Get the original extracted folder name (assuming only one folder exists)
|
|
145
|
+
NSString *originalFolderName = contents.firstObject;
|
|
146
|
+
NSString *originalFolderPath = [directoryPath stringByAppendingPathComponent:originalFolderName];
|
|
147
|
+
|
|
148
|
+
// Generate new folder name with timestamp
|
|
149
|
+
NSString *timestamp = [NSString stringWithFormat:@"output_%ld", (long)[[NSDate date] timeIntervalSince1970]];
|
|
150
|
+
NSString *newFolderPath = [directoryPath stringByAppendingPathComponent:timestamp];
|
|
151
|
+
|
|
152
|
+
// Rename the extracted folder
|
|
153
|
+
if (![fileManager moveItemAtPath:originalFolderPath toPath:newFolderPath error:&error]) {
|
|
154
|
+
NSLog(@"Failed to rename folder: %@", error.localizedDescription);
|
|
155
|
+
return nil;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
NSLog(@"Renamed extracted folder to: %@", newFolderPath);
|
|
159
|
+
return newFolderPath;
|
|
160
|
+
}
|
|
132
161
|
- (NSString *)unzipFileAtPath:(NSString *)zipFilePath extension:(NSString *)extension {
|
|
133
162
|
// Define the directory where the files will be extracted
|
|
134
163
|
NSString *extractedFolderPath = [[zipFilePath stringByDeletingPathExtension] stringByAppendingPathExtension:@"unzip"];
|
|
@@ -152,8 +181,14 @@ RCT_EXPORT_MODULE()
|
|
|
152
181
|
NSLog(@"Failed to unzip file");
|
|
153
182
|
return nil;
|
|
154
183
|
}
|
|
184
|
+
// Try renaming the extracted folder
|
|
185
|
+
NSString *renamedFolderPath = [self renameExtractedFolderInDirectory:extractedFolderPath];
|
|
186
|
+
|
|
187
|
+
// If renaming fails, use the original extracted folder path
|
|
188
|
+
NSString *finalFolderPath = renamedFolderPath ? renamedFolderPath : extractedFolderPath;
|
|
189
|
+
|
|
155
190
|
// Find .jsbundle files in the extracted directory
|
|
156
|
-
NSString *jsbundleFilePath = [self searchForJsBundleInDirectory:
|
|
191
|
+
NSString *jsbundleFilePath = [self searchForJsBundleInDirectory:finalFolderPath extension:extension];
|
|
157
192
|
|
|
158
193
|
// Delete the zip file after extraction
|
|
159
194
|
NSError *removeError = nil;
|
|
@@ -171,12 +206,16 @@ RCT_EXPORT_METHOD(setupBundlePath:(NSString *)path extension:(NSString *)extensi
|
|
|
171
206
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
172
207
|
reject:(RCTPromiseRejectBlock)reject) {
|
|
173
208
|
if ([self isFilePathValid:path]) {
|
|
174
|
-
[self removeBundleIfNeeded];
|
|
209
|
+
[self removeBundleIfNeeded:nil];
|
|
175
210
|
//Unzip file
|
|
176
211
|
NSString *extractedFilePath = [self unzipFileAtPath:path extension:(extension != nil) ? extension : @".jsbundle"];
|
|
177
212
|
if (extractedFilePath) {
|
|
178
213
|
NSLog(@"file extraction----- %@", extractedFilePath);
|
|
179
214
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
215
|
+
NSString *oldPath = [defaults stringForKey:@"PATH"];
|
|
216
|
+
if (oldPath) {
|
|
217
|
+
[defaults setObject:oldPath forKey:@"OLD_PATH"];
|
|
218
|
+
}
|
|
180
219
|
[defaults setObject:extractedFilePath forKey:@"PATH"];
|
|
181
220
|
[defaults setObject:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] forKey:@"VERSION_NAME"];
|
|
182
221
|
[defaults synchronize];
|
|
@@ -188,12 +227,36 @@ RCT_EXPORT_METHOD(setupBundlePath:(NSString *)path extension:(NSString *)extensi
|
|
|
188
227
|
resolve(@(NO));
|
|
189
228
|
}
|
|
190
229
|
}
|
|
191
|
-
// Expose deleteBundle method to JavaScript
|
|
192
230
|
RCT_EXPORT_METHOD(deleteBundle:(double)i
|
|
193
231
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
194
232
|
reject:(RCTPromiseRejectBlock)reject) {
|
|
195
|
-
BOOL isDeleted = [self removeBundleIfNeeded];
|
|
196
|
-
|
|
233
|
+
BOOL isDeleted = [self removeBundleIfNeeded:@"PATH"];
|
|
234
|
+
BOOL isDeletedOld = [self removeBundleIfNeeded:nil];
|
|
235
|
+
if (isDeleted && isDeletedOld) {
|
|
236
|
+
resolve(@(YES));
|
|
237
|
+
} else {
|
|
238
|
+
resolve(@(NO));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Expose deleteBundle method to JavaScript
|
|
242
|
+
RCT_EXPORT_METHOD(rollbackToPreviousBundle:(double)i
|
|
243
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
244
|
+
reject:(RCTPromiseRejectBlock)reject) {
|
|
245
|
+
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
246
|
+
NSString *oldPath = [defaults stringForKey:@"OLD_PATH"];
|
|
247
|
+
if (oldPath && [self isFilePathValid:oldPath]) {
|
|
248
|
+
BOOL isDeleted = [self removeBundleIfNeeded:@"PATH"];
|
|
249
|
+
if (isDeleted) {
|
|
250
|
+
[defaults setObject:oldPath forKey:@"PATH"];
|
|
251
|
+
[defaults removeObjectForKey:@"OLD_PATH"];
|
|
252
|
+
[defaults synchronize];
|
|
253
|
+
resolve(@(YES));
|
|
254
|
+
} else {
|
|
255
|
+
resolve(@(NO));
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
resolve(@(NO));
|
|
259
|
+
}
|
|
197
260
|
}
|
|
198
261
|
|
|
199
262
|
RCT_EXPORT_METHOD(getCurrentVersion:(double)a
|
|
@@ -50,6 +50,10 @@ namespace facebook::react {
|
|
|
50
50
|
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "setCurrentVersion", @selector(setCurrentVersion:resolve:reject:), args, count);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
static facebook::jsi::Value __hostFunction_NativeOtaHotUpdateSpecJSI_rollbackToPreviousBundle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
54
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "rollbackToPreviousBundle", @selector(rollbackToPreviousBundle:resolve:reject:), args, count);
|
|
55
|
+
}
|
|
56
|
+
|
|
53
57
|
NativeOtaHotUpdateSpecJSI::NativeOtaHotUpdateSpecJSI(const ObjCTurboModule::InitParams ¶ms)
|
|
54
58
|
: ObjCTurboModule(params) {
|
|
55
59
|
|
|
@@ -70,5 +74,8 @@ namespace facebook::react {
|
|
|
70
74
|
|
|
71
75
|
methodMap_["setCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateSpecJSI_setCurrentVersion};
|
|
72
76
|
|
|
77
|
+
|
|
78
|
+
methodMap_["rollbackToPreviousBundle"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateSpecJSI_rollbackToPreviousBundle};
|
|
79
|
+
|
|
73
80
|
}
|
|
74
81
|
} // namespace facebook::react
|
|
@@ -50,6 +50,9 @@
|
|
|
50
50
|
- (void)setCurrentVersion:(NSString *)version
|
|
51
51
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
52
52
|
reject:(RCTPromiseRejectBlock)reject;
|
|
53
|
+
- (void)rollbackToPreviousBundle:(double)a
|
|
54
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
55
|
+
reject:(RCTPromiseRejectBlock)reject;
|
|
53
56
|
|
|
54
57
|
@end
|
|
55
58
|
|
|
@@ -48,6 +48,12 @@ static jsi::Value __hostFunction_NativeOtaHotUpdateCxxSpecJSI_setCurrentVersion(
|
|
|
48
48
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt)
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
|
+
static jsi::Value __hostFunction_NativeOtaHotUpdateCxxSpecJSI_rollbackToPreviousBundle(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
52
|
+
return static_cast<NativeOtaHotUpdateCxxSpecJSI *>(&turboModule)->rollbackToPreviousBundle(
|
|
53
|
+
rt,
|
|
54
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber()
|
|
55
|
+
);
|
|
56
|
+
}
|
|
51
57
|
|
|
52
58
|
NativeOtaHotUpdateCxxSpecJSI::NativeOtaHotUpdateCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
53
59
|
: TurboModule("OtaHotUpdate", jsInvoker) {
|
|
@@ -57,6 +63,7 @@ NativeOtaHotUpdateCxxSpecJSI::NativeOtaHotUpdateCxxSpecJSI(std::shared_ptr<CallI
|
|
|
57
63
|
methodMap_["restart"] = MethodMetadata {0, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_restart};
|
|
58
64
|
methodMap_["getCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_getCurrentVersion};
|
|
59
65
|
methodMap_["setCurrentVersion"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_setCurrentVersion};
|
|
66
|
+
methodMap_["rollbackToPreviousBundle"] = MethodMetadata {1, __hostFunction_NativeOtaHotUpdateCxxSpecJSI_rollbackToPreviousBundle};
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
|
|
@@ -26,6 +26,7 @@ public:
|
|
|
26
26
|
virtual void restart(jsi::Runtime &rt) = 0;
|
|
27
27
|
virtual jsi::Value getCurrentVersion(jsi::Runtime &rt, double a) = 0;
|
|
28
28
|
virtual jsi::Value setCurrentVersion(jsi::Runtime &rt, jsi::String version) = 0;
|
|
29
|
+
virtual jsi::Value rollbackToPreviousBundle(jsi::Runtime &rt, double a) = 0;
|
|
29
30
|
|
|
30
31
|
};
|
|
31
32
|
|
|
@@ -100,6 +101,14 @@ private:
|
|
|
100
101
|
return bridging::callFromJs<jsi::Value>(
|
|
101
102
|
rt, &T::setCurrentVersion, jsInvoker_, instance_, std::move(version));
|
|
102
103
|
}
|
|
104
|
+
jsi::Value rollbackToPreviousBundle(jsi::Runtime &rt, double a) override {
|
|
105
|
+
static_assert(
|
|
106
|
+
bridging::getParameterCount(&T::rollbackToPreviousBundle) == 2,
|
|
107
|
+
"Expected rollbackToPreviousBundle(...) to have 2 parameters");
|
|
108
|
+
|
|
109
|
+
return bridging::callFromJs<jsi::Value>(
|
|
110
|
+
rt, &T::rollbackToPreviousBundle, jsInvoker_, instance_, std::move(a));
|
|
111
|
+
}
|
|
103
112
|
|
|
104
113
|
private:
|
|
105
114
|
friend class NativeOtaHotUpdateCxxSpec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeOtaHotUpdate.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeOtaHotUpdate.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAYpCC,gCAAmB,CAACC,YAAY,CAAO,cAAc,CAAC","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -44,6 +44,9 @@ function deleteBundlePath() {
|
|
|
44
44
|
function getCurrentVersion() {
|
|
45
45
|
return RNhotupdate.getCurrentVersion(0);
|
|
46
46
|
}
|
|
47
|
+
function rollbackToPreviousBundle() {
|
|
48
|
+
return RNhotupdate.rollbackToPreviousBundle(0);
|
|
49
|
+
}
|
|
47
50
|
async function getVersionAsNumber() {
|
|
48
51
|
const rawVersion = await getCurrentVersion();
|
|
49
52
|
return +rawVersion;
|
|
@@ -163,6 +166,7 @@ var _default = exports.default = {
|
|
|
163
166
|
resetApp,
|
|
164
167
|
getCurrentVersion: getVersionAsNumber,
|
|
165
168
|
setCurrentVersion,
|
|
169
|
+
rollbackToPreviousBundle,
|
|
166
170
|
git: {
|
|
167
171
|
checkForGitUpdate,
|
|
168
172
|
..._index.default,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_index","_interopRequireDefault","e","__esModule","default","LINKING_ERROR","Platform","select","ios","isTurboModuleEnabled","global","__turboModuleProxy","OtaHotUpdateModule","NativeModules","OtaHotUpdate","RNhotupdate","Proxy","get","Error","downloadBundleFile","downloadManager","uri","headers","callback","res","config","fileCache","OS","fetch","progress","received","total","path","setupBundlePath","extension","setupExactBundlePath","setExactBundlePath","deleteBundlePath","deleteBundle","getCurrentVersion","getVersionAsNumber","rawVersion","setCurrentVersion","version","resetApp","restart","removeBundle","restartAfterRemoved","then","data","setTimeout","installFail","option","updateFail","JSON","stringify","console","error","downloadBundleUri","currentVersion","extensionBundle","success","updateSuccess","restartAfterInstall","checkForGitUpdate","options","url","bundlePath","branch","Promise","all","git","getConfig","getBranchName","pull","pullUpdate","onProgress","folderName","onPullSuccess","onPullFailed","msg","clone","cloneRepo","bundle","onCloneSuccess","onCloneFailed","toString","onFinishProgress","_default","exports","removeUpdate","removeGitUpdate","folder"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAyB,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEzB,MAAMG,aAAa,GACjB,sFAAsF,GACtFC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEJ,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;;AAEjC;AACA,MAAMK,oBAAoB,GAAGC,MAAM,CAACC,kBAAkB,IAAI,IAAI;AAE9D,MAAMC,kBAAkB,GAAGH,oBAAoB,GAC3CV,OAAO,CAAC,sBAAsB,CAAC,CAACK,OAAO,GACvCS,0BAAa,CAACC,YAAY;AAE9B,MAAMC,WAAW,GAAGH,kBAAkB,GAClCA,kBAAkB,GAClB,IAAII,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACb,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,MAAMc,kBAAkB,GAAG,MAAAA,CACzBC,eAAgC,EAChCC,GAAW,EACXC,OAAgB,EAChBC,QAAoD,KACjD;EACH,MAAMC,GAAG,GAAG,MAAMJ,eAAe,CAC9BK,MAAM,CAAC;IACNC,SAAS,EAAEpB,qBAAQ,CAACqB,EAAE,KAAK;EAC7B,CAAC,CAAC,CACDC,KAAK,CAAC,KAAK,EAAEP,GAAG,EAAE;IACjB,GAAGC;EACL,CAAC,CAAC,CACDO,QAAQ,CAAC,CAACC,QAAQ,EAAEC,KAAK,KAAK;IAC7B,IAAIR,QAAQ,EAAE;MACZA,QAAQ,CAACO,QAAQ,EAAEC,KAAK,CAAC;IAC3B;EACF,CAAC,CAAC;EACJ,OAAOP,GAAG,CAACQ,IAAI,CAAC,CAAC;AACnB,CAAC;AACD,SAASC,eAAeA,CAACD,IAAY,EAAEE,SAAkB,EAAoB;EAC3E,OAAOnB,WAAW,CAACkB,eAAe,CAACD,IAAI,EAAEE,SAAS,CAAC;AACrD;AACA,SAASC,oBAAoBA,CAACH,IAAY,EAAoB;EAC5D,OAAOjB,WAAW,CAACqB,kBAAkB,CAACJ,IAAI,CAAC;AAC7C;AACA,SAASK,gBAAgBA,CAAA,EAAqB;EAC5C,OAAOtB,WAAW,CAACuB,YAAY,CAAC,CAAC,CAAC;AACpC;AACA,SAASC,iBAAiBA,CAAA,EAAoB;EAC5C,OAAOxB,WAAW,CAACwB,iBAAiB,CAAC,CAAC,CAAC;AACzC;AACA,eAAeC,kBAAkBA,CAAA,EAAG;EAClC,MAAMC,UAAU,GAAG,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_index","_interopRequireDefault","e","__esModule","default","LINKING_ERROR","Platform","select","ios","isTurboModuleEnabled","global","__turboModuleProxy","OtaHotUpdateModule","NativeModules","OtaHotUpdate","RNhotupdate","Proxy","get","Error","downloadBundleFile","downloadManager","uri","headers","callback","res","config","fileCache","OS","fetch","progress","received","total","path","setupBundlePath","extension","setupExactBundlePath","setExactBundlePath","deleteBundlePath","deleteBundle","getCurrentVersion","rollbackToPreviousBundle","getVersionAsNumber","rawVersion","setCurrentVersion","version","resetApp","restart","removeBundle","restartAfterRemoved","then","data","setTimeout","installFail","option","updateFail","JSON","stringify","console","error","downloadBundleUri","currentVersion","extensionBundle","success","updateSuccess","restartAfterInstall","checkForGitUpdate","options","url","bundlePath","branch","Promise","all","git","getConfig","getBranchName","pull","pullUpdate","onProgress","folderName","onPullSuccess","onPullFailed","msg","clone","cloneRepo","bundle","onCloneSuccess","onCloneFailed","toString","onFinishProgress","_default","exports","removeUpdate","removeGitUpdate","folder"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAyB,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEzB,MAAMG,aAAa,GACjB,sFAAsF,GACtFC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEJ,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;;AAEjC;AACA,MAAMK,oBAAoB,GAAGC,MAAM,CAACC,kBAAkB,IAAI,IAAI;AAE9D,MAAMC,kBAAkB,GAAGH,oBAAoB,GAC3CV,OAAO,CAAC,sBAAsB,CAAC,CAACK,OAAO,GACvCS,0BAAa,CAACC,YAAY;AAE9B,MAAMC,WAAW,GAAGH,kBAAkB,GAClCA,kBAAkB,GAClB,IAAII,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACb,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,MAAMc,kBAAkB,GAAG,MAAAA,CACzBC,eAAgC,EAChCC,GAAW,EACXC,OAAgB,EAChBC,QAAoD,KACjD;EACH,MAAMC,GAAG,GAAG,MAAMJ,eAAe,CAC9BK,MAAM,CAAC;IACNC,SAAS,EAAEpB,qBAAQ,CAACqB,EAAE,KAAK;EAC7B,CAAC,CAAC,CACDC,KAAK,CAAC,KAAK,EAAEP,GAAG,EAAE;IACjB,GAAGC;EACL,CAAC,CAAC,CACDO,QAAQ,CAAC,CAACC,QAAQ,EAAEC,KAAK,KAAK;IAC7B,IAAIR,QAAQ,EAAE;MACZA,QAAQ,CAACO,QAAQ,EAAEC,KAAK,CAAC;IAC3B;EACF,CAAC,CAAC;EACJ,OAAOP,GAAG,CAACQ,IAAI,CAAC,CAAC;AACnB,CAAC;AACD,SAASC,eAAeA,CAACD,IAAY,EAAEE,SAAkB,EAAoB;EAC3E,OAAOnB,WAAW,CAACkB,eAAe,CAACD,IAAI,EAAEE,SAAS,CAAC;AACrD;AACA,SAASC,oBAAoBA,CAACH,IAAY,EAAoB;EAC5D,OAAOjB,WAAW,CAACqB,kBAAkB,CAACJ,IAAI,CAAC;AAC7C;AACA,SAASK,gBAAgBA,CAAA,EAAqB;EAC5C,OAAOtB,WAAW,CAACuB,YAAY,CAAC,CAAC,CAAC;AACpC;AACA,SAASC,iBAAiBA,CAAA,EAAoB;EAC5C,OAAOxB,WAAW,CAACwB,iBAAiB,CAAC,CAAC,CAAC;AACzC;AACA,SAASC,wBAAwBA,CAAA,EAAqB;EACpD,OAAOzB,WAAW,CAACyB,wBAAwB,CAAC,CAAC,CAAC;AAChD;AACA,eAAeC,kBAAkBA,CAAA,EAAG;EAClC,MAAMC,UAAU,GAAG,MAAMH,iBAAiB,CAAC,CAAC;EAC5C,OAAO,CAACG,UAAU;AACpB;AACA,SAASC,iBAAiBA,CAACC,OAAe,EAAoB;EAC5D,OAAO7B,WAAW,CAAC4B,iBAAiB,CAACC,OAAO,GAAG,EAAE,CAAC;AACpD;AACA,eAAeC,QAAQA,CAAA,EAAG;EACxB9B,WAAW,CAAC+B,OAAO,CAAC,CAAC;AACvB;AACA,SAASC,YAAYA,CAACC,mBAA6B,EAAE;EACnDX,gBAAgB,CAAC,CAAC,CAACY,IAAI,CAAEC,IAAI,IAAK;IAChC,IAAIA,IAAI,IAAIF,mBAAmB,EAAE;MAC/BG,UAAU,CAAC,MAAM;QACfN,QAAQ,CAAC,CAAC;MACZ,CAAC,EAAE,GAAG,CAAC;MACP,IAAIK,IAAI,EAAE;QACRP,iBAAiB,CAAC,CAAC,CAAC;MACtB;IACF;EACF,CAAC,CAAC;AACJ;AACA,MAAMS,WAAW,GAAGA,CAACC,MAAqB,EAAEnD,CAAO,KAAK;EACtDmD,MAAM,EAAEC,UAAU,GAAGC,IAAI,CAACC,SAAS,CAACtD,CAAC,CAAC,CAAC;EACvCuD,OAAO,CAACC,KAAK,CAAC,sBAAsB,EAAEH,IAAI,CAACC,SAAS,CAACtD,CAAC,CAAC,CAAC;AAC1D,CAAC;AACD,eAAeyD,iBAAiBA,CAC9BvC,eAAgC,EAChCC,GAAW,EACXuB,OAAe,EACfS,MAAqB,EACrB;EACA,IAAI,CAAChC,GAAG,EAAE;IACR+B,WAAW,CAACC,MAAM,EAAE,0BAA0B,CAAC;IAC/C;EACF;EACA,IAAI,CAACT,OAAO,EAAE;IACZQ,WAAW,CAACC,MAAM,EAAE,8BAA8B,CAAC;IACnD;EACF;EACA,MAAMO,cAAc,GAAG,MAAMnB,kBAAkB,CAAC,CAAC;EACjD,IAAIG,OAAO,IAAIgB,cAAc,EAAE;IAC7BR,WAAW,CACTC,MAAM,EACN,gGAAgG,GAC9FO,cACJ,CAAC;IACD;EACF;EACA,IAAI;IACF,MAAM5B,IAAI,GAAG,MAAMb,kBAAkB,CACnCC,eAAe,EACfC,GAAG,EACHgC,MAAM,EAAE/B,OAAO,EACf+B,MAAM,EAAExB,QACV,CAAC;IACD,IAAIG,IAAI,EAAE;MACRC,eAAe,CAACD,IAAI,EAAEqB,MAAM,EAAEQ,eAAe,CAAC,CAACZ,IAAI,CAAEa,OAAO,IAAK;QAC/D,IAAIA,OAAO,EAAE;UACXnB,iBAAiB,CAACC,OAAO,CAAC;UAC1BS,MAAM,EAAEU,aAAa,GAAG,CAAC;UACzB,IAAIV,MAAM,EAAEW,mBAAmB,EAAE;YAC/Bb,UAAU,CAAC,MAAM;cACfN,QAAQ,CAAC,CAAC;YACZ,CAAC,EAAE,GAAG,CAAC;UACT;QACF,CAAC,MAAM;UACLO,WAAW,CAACC,MAAM,CAAC;QACrB;MACF,CAAC,CAAC;IACJ,CAAC,MAAM;MACLD,WAAW,CAACC,MAAM,CAAC;IACrB;EACF,CAAC,CAAC,OAAOnD,CAAC,EAAE;IACVkD,WAAW,CAACC,MAAM,EAAEnD,CAAC,CAAC;EACxB;AACF;AACA,MAAM+D,iBAAiB,GAAG,MAAOC,OAAwB,IAAK;EAC5D,IAAI;IACF,IAAI,CAACA,OAAO,CAACC,GAAG,IAAI,CAACD,OAAO,CAACE,UAAU,EAAE;MACvC,MAAM,IAAIlD,KAAK,CAAC,sCAAsC,CAAC;IACzD;IACA,MAAM,CAACO,MAAM,EAAE4C,MAAM,CAAC,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACzCC,cAAG,CAACC,SAAS,CAAC,CAAC,EACfD,cAAG,CAACE,aAAa,CAAC,CAAC,CACpB,CAAC;IACF,IAAIL,MAAM,IAAI5C,MAAM,EAAE;MACpB,MAAMkD,IAAI,GAAG,MAAMH,cAAG,CAACI,UAAU,CAAC;QAChCP,MAAM;QACNQ,UAAU,EAAEX,OAAO,EAAEW,UAAU;QAC/BC,UAAU,EAAEZ,OAAO,EAAEY;MACvB,CAAC,CAAC;MACF,IAAIH,IAAI,CAACb,OAAO,EAAE;QAChBI,OAAO,EAAEa,aAAa,GAAG,CAAC;QAC1B,IAAIb,OAAO,EAAEF,mBAAmB,EAAE;UAChCb,UAAU,CAAC,MAAM;YACfN,QAAQ,CAAC,CAAC;UACZ,CAAC,EAAE,GAAG,CAAC;QACT;MACF,CAAC,MAAM;QACLqB,OAAO,EAAEc,YAAY,GAAGL,IAAI,CAACM,GAAG,CAAC;MACnC;IACF,CAAC,MAAM;MACL,MAAMC,KAAK,GAAG,MAAMV,cAAG,CAACW,SAAS,CAAC;QAChCN,UAAU,EAAEX,OAAO,EAAEW,UAAU;QAC/BC,UAAU,EAAEZ,OAAO,EAAEY,UAAU;QAC/BX,GAAG,EAAED,OAAO,CAACC,GAAG;QAChBE,MAAM,EAAEH,OAAO,EAAEG,MAAM;QACvBD,UAAU,EAAEF,OAAO,CAACE;MACtB,CAAC,CAAC;MACF,IAAIc,KAAK,CAACpB,OAAO,IAAIoB,KAAK,CAACE,MAAM,EAAE;QACjC,MAAMjD,oBAAoB,CAAC+C,KAAK,CAACE,MAAM,CAAC;QACxClB,OAAO,EAAEmB,cAAc,GAAG,CAAC;QAC3B,IAAInB,OAAO,EAAEF,mBAAmB,EAAE;UAChCb,UAAU,CAAC,MAAM;YACfN,QAAQ,CAAC,CAAC;UACZ,CAAC,EAAE,GAAG,CAAC;QACT;MACF,CAAC,MAAM;QACLqB,OAAO,EAAEoB,aAAa,GAAGJ,KAAK,CAACD,GAAG,CAAC;MACrC;IACF;EACF,CAAC,CAAC,OAAO/E,CAAM,EAAE;IACfgE,OAAO,EAAEoB,aAAa,GAAGpF,CAAC,CAACqF,QAAQ,CAAC,CAAC,CAAC;EACxC,CAAC,SAAS;IACRrB,OAAO,EAAEsB,gBAAgB,GAAG,CAAC;EAC/B;AACF,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAtF,OAAA,GACa;EACb6B,eAAe;EACfE,oBAAoB;EACpBwD,YAAY,EAAE5C,YAAY;EAC1BY,iBAAiB;EACjBd,QAAQ;EACRN,iBAAiB,EAAEE,kBAAkB;EACrCE,iBAAiB;EACjBH,wBAAwB;EACxBgC,GAAG,EAAE;IACHP,iBAAiB;IACjB,GAAGO,cAAG;IACNoB,eAAe,EAAGC,MAAe,IAAK;MACpC9E,WAAW,CAACqB,kBAAkB,CAAC,EAAE,CAAC;MAClCoC,cAAG,CAACoB,eAAe,CAACC,MAAM,CAAC;IAC7B;EACF;AACF,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeOtaHotUpdate.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeOtaHotUpdate.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAYlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,cAAc,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -39,6 +39,9 @@ function deleteBundlePath() {
|
|
|
39
39
|
function getCurrentVersion() {
|
|
40
40
|
return RNhotupdate.getCurrentVersion(0);
|
|
41
41
|
}
|
|
42
|
+
function rollbackToPreviousBundle() {
|
|
43
|
+
return RNhotupdate.rollbackToPreviousBundle(0);
|
|
44
|
+
}
|
|
42
45
|
async function getVersionAsNumber() {
|
|
43
46
|
const rawVersion = await getCurrentVersion();
|
|
44
47
|
return +rawVersion;
|
|
@@ -158,6 +161,7 @@ export default {
|
|
|
158
161
|
resetApp,
|
|
159
162
|
getCurrentVersion: getVersionAsNumber,
|
|
160
163
|
setCurrentVersion,
|
|
164
|
+
rollbackToPreviousBundle,
|
|
161
165
|
git: {
|
|
162
166
|
checkForGitUpdate,
|
|
163
167
|
...git,
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","git","LINKING_ERROR","select","ios","default","isTurboModuleEnabled","global","__turboModuleProxy","OtaHotUpdateModule","require","OtaHotUpdate","RNhotupdate","Proxy","get","Error","downloadBundleFile","downloadManager","uri","headers","callback","res","config","fileCache","OS","fetch","progress","received","total","path","setupBundlePath","extension","setupExactBundlePath","setExactBundlePath","deleteBundlePath","deleteBundle","getCurrentVersion","getVersionAsNumber","rawVersion","setCurrentVersion","version","resetApp","restart","removeBundle","restartAfterRemoved","then","data","setTimeout","installFail","option","e","updateFail","JSON","stringify","console","error","downloadBundleUri","currentVersion","extensionBundle","success","updateSuccess","restartAfterInstall","checkForGitUpdate","options","url","bundlePath","branch","Promise","all","getConfig","getBranchName","pull","pullUpdate","onProgress","folderName","onPullSuccess","onPullFailed","msg","clone","cloneRepo","bundle","onCloneSuccess","onCloneFailed","toString","onFinishProgress","removeUpdate","removeGitUpdate","folder"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,OAAOC,GAAG,MAAM,iBAAQ;AAExB,MAAMC,aAAa,GACjB,sFAAsF,GACtFF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;;AAEjC;AACA,MAAMC,oBAAoB,GAAGC,MAAM,CAACC,kBAAkB,IAAI,IAAI;AAE9D,MAAMC,kBAAkB,GAAGH,oBAAoB,GAC3CI,OAAO,CAAC,sBAAsB,CAAC,CAACL,OAAO,GACvCN,aAAa,CAACY,YAAY;AAE9B,MAAMC,WAAW,GAAGH,kBAAkB,GAClCA,kBAAkB,GAClB,IAAII,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACb,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,MAAMc,kBAAkB,GAAG,MAAAA,CACzBC,eAAgC,EAChCC,GAAW,EACXC,OAAgB,EAChBC,QAAoD,KACjD;EACH,MAAMC,GAAG,GAAG,MAAMJ,eAAe,CAC9BK,MAAM,CAAC;IACNC,SAAS,EAAEvB,QAAQ,CAACwB,EAAE,KAAK;EAC7B,CAAC,CAAC,CACDC,KAAK,CAAC,KAAK,EAAEP,GAAG,EAAE;IACjB,GAAGC;EACL,CAAC,CAAC,CACDO,QAAQ,CAAC,CAACC,QAAQ,EAAEC,KAAK,KAAK;IAC7B,IAAIR,QAAQ,EAAE;MACZA,QAAQ,CAACO,QAAQ,EAAEC,KAAK,CAAC;IAC3B;EACF,CAAC,CAAC;EACJ,OAAOP,GAAG,CAACQ,IAAI,CAAC,CAAC;AACnB,CAAC;AACD,SAASC,eAAeA,CAACD,IAAY,EAAEE,SAAkB,EAAoB;EAC3E,OAAOnB,WAAW,CAACkB,eAAe,CAACD,IAAI,EAAEE,SAAS,CAAC;AACrD;AACA,SAASC,oBAAoBA,CAACH,IAAY,EAAoB;EAC5D,OAAOjB,WAAW,CAACqB,kBAAkB,CAACJ,IAAI,CAAC;AAC7C;AACA,SAASK,gBAAgBA,CAAA,EAAqB;EAC5C,OAAOtB,WAAW,CAACuB,YAAY,CAAC,CAAC,CAAC;AACpC;AACA,SAASC,iBAAiBA,CAAA,EAAoB;EAC5C,OAAOxB,WAAW,CAACwB,iBAAiB,CAAC,CAAC,CAAC;AACzC;AACA,eAAeC,kBAAkBA,CAAA,EAAG;EAClC,MAAMC,UAAU,GAAG,
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","git","LINKING_ERROR","select","ios","default","isTurboModuleEnabled","global","__turboModuleProxy","OtaHotUpdateModule","require","OtaHotUpdate","RNhotupdate","Proxy","get","Error","downloadBundleFile","downloadManager","uri","headers","callback","res","config","fileCache","OS","fetch","progress","received","total","path","setupBundlePath","extension","setupExactBundlePath","setExactBundlePath","deleteBundlePath","deleteBundle","getCurrentVersion","rollbackToPreviousBundle","getVersionAsNumber","rawVersion","setCurrentVersion","version","resetApp","restart","removeBundle","restartAfterRemoved","then","data","setTimeout","installFail","option","e","updateFail","JSON","stringify","console","error","downloadBundleUri","currentVersion","extensionBundle","success","updateSuccess","restartAfterInstall","checkForGitUpdate","options","url","bundlePath","branch","Promise","all","getConfig","getBranchName","pull","pullUpdate","onProgress","folderName","onPullSuccess","onPullFailed","msg","clone","cloneRepo","bundle","onCloneSuccess","onCloneFailed","toString","onFinishProgress","removeUpdate","removeGitUpdate","folder"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@ export interface Spec extends TurboModule {
|
|
|
6
6
|
restart(): void;
|
|
7
7
|
getCurrentVersion(a: number): Promise<string>;
|
|
8
8
|
setCurrentVersion(version: string): Promise<boolean>;
|
|
9
|
+
rollbackToPreviousBundle(a: number): Promise<boolean>;
|
|
9
10
|
}
|
|
10
11
|
declare const _default: Spec;
|
|
11
12
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeOtaHotUpdate.d.ts","sourceRoot":"","sources":["../../../../src/NativeOtaHotUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,IAAI,CAAC;IAChB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeOtaHotUpdate.d.ts","sourceRoot":"","sources":["../../../../src/NativeOtaHotUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,IAAI,CAAC;IAChB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,wBAAwB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;;AAED,wBAAsE"}
|
|
@@ -2,6 +2,7 @@ import type { DownloadManager } from './download';
|
|
|
2
2
|
import type { UpdateGitOption, UpdateOption } from './type';
|
|
3
3
|
declare function setupBundlePath(path: string, extension?: string): Promise<boolean>;
|
|
4
4
|
declare function setupExactBundlePath(path: string): Promise<boolean>;
|
|
5
|
+
declare function rollbackToPreviousBundle(): Promise<boolean>;
|
|
5
6
|
declare function getVersionAsNumber(): Promise<number>;
|
|
6
7
|
declare function setCurrentVersion(version: number): Promise<boolean>;
|
|
7
8
|
declare function resetApp(): Promise<void>;
|
|
@@ -15,6 +16,7 @@ declare const _default: {
|
|
|
15
16
|
resetApp: typeof resetApp;
|
|
16
17
|
getCurrentVersion: typeof getVersionAsNumber;
|
|
17
18
|
setCurrentVersion: typeof setCurrentVersion;
|
|
19
|
+
rollbackToPreviousBundle: typeof rollbackToPreviousBundle;
|
|
18
20
|
git: {
|
|
19
21
|
removeGitUpdate: (folder?: string) => void;
|
|
20
22
|
cloneRepo: (options: import("./type").CloneOption) => Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA+C5D,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E;AACD,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AAOD,iBAAe,kBAAkB,oBAGhC;AACD,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AACD,iBAAe,QAAQ,kBAEtB;AACD,iBAAS,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,QAWlD;AAKD,iBAAe,iBAAiB,CAC9B,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,iBA8CtB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA+C5D,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E;AACD,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AAOD,iBAAS,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CAEpD;AACD,iBAAe,kBAAkB,oBAGhC;AACD,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AACD,iBAAe,QAAQ,kBAEtB;AACD,iBAAS,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,QAWlD;AAKD,iBAAe,iBAAiB,CAC9B,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,iBA8CtB;;;;;;;;;;;mCAgE8B,MAAM;;;;;;;;;;;;;;;;oBA5LX,CAAC;iBAEd,CAAC;;;qCA2H4B,eAAe;;;AAmDzD,wBAiBE"}
|
|
@@ -6,6 +6,7 @@ export interface Spec extends TurboModule {
|
|
|
6
6
|
restart(): void;
|
|
7
7
|
getCurrentVersion(a: number): Promise<string>;
|
|
8
8
|
setCurrentVersion(version: string): Promise<boolean>;
|
|
9
|
+
rollbackToPreviousBundle(a: number): Promise<boolean>;
|
|
9
10
|
}
|
|
10
11
|
declare const _default: Spec;
|
|
11
12
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeOtaHotUpdate.d.ts","sourceRoot":"","sources":["../../../../src/NativeOtaHotUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,IAAI,CAAC;IAChB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeOtaHotUpdate.d.ts","sourceRoot":"","sources":["../../../../src/NativeOtaHotUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,IAAI,CAAC;IAChB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,wBAAwB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;;AAED,wBAAsE"}
|
|
@@ -2,6 +2,7 @@ import type { DownloadManager } from './download';
|
|
|
2
2
|
import type { UpdateGitOption, UpdateOption } from './type';
|
|
3
3
|
declare function setupBundlePath(path: string, extension?: string): Promise<boolean>;
|
|
4
4
|
declare function setupExactBundlePath(path: string): Promise<boolean>;
|
|
5
|
+
declare function rollbackToPreviousBundle(): Promise<boolean>;
|
|
5
6
|
declare function getVersionAsNumber(): Promise<number>;
|
|
6
7
|
declare function setCurrentVersion(version: number): Promise<boolean>;
|
|
7
8
|
declare function resetApp(): Promise<void>;
|
|
@@ -15,6 +16,7 @@ declare const _default: {
|
|
|
15
16
|
resetApp: typeof resetApp;
|
|
16
17
|
getCurrentVersion: typeof getVersionAsNumber;
|
|
17
18
|
setCurrentVersion: typeof setCurrentVersion;
|
|
19
|
+
rollbackToPreviousBundle: typeof rollbackToPreviousBundle;
|
|
18
20
|
git: {
|
|
19
21
|
removeGitUpdate: (folder?: string) => void;
|
|
20
22
|
cloneRepo: (options: import("./type").CloneOption) => Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA+C5D,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E;AACD,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AAOD,iBAAe,kBAAkB,oBAGhC;AACD,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AACD,iBAAe,QAAQ,kBAEtB;AACD,iBAAS,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,QAWlD;AAKD,iBAAe,iBAAiB,CAC9B,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,iBA8CtB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AA+C5D,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E;AACD,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AAOD,iBAAS,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CAEpD;AACD,iBAAe,kBAAkB,oBAGhC;AACD,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AACD,iBAAe,QAAQ,kBAEtB;AACD,iBAAS,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,QAWlD;AAKD,iBAAe,iBAAiB,CAC9B,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,iBA8CtB;;;;;;;;;;;mCAgE8B,MAAM;;;;;;;;;;;;;;;;oBA5LX,CAAC;iBAEd,CAAC;;;qCA2H4B,eAAe;;;AAmDzD,wBAiBE"}
|
package/package.json
CHANGED
|
@@ -8,6 +8,7 @@ export interface Spec extends TurboModule {
|
|
|
8
8
|
restart(): void;
|
|
9
9
|
getCurrentVersion(a: number): Promise<string>;
|
|
10
10
|
setCurrentVersion(version: string): Promise<boolean>;
|
|
11
|
+
rollbackToPreviousBundle(a: number): Promise<boolean>;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
export default TurboModuleRegistry.getEnforcing<Spec>('OtaHotUpdate');
|
package/src/index.tsx
CHANGED
|
@@ -59,6 +59,9 @@ function deleteBundlePath(): Promise<boolean> {
|
|
|
59
59
|
function getCurrentVersion(): Promise<string> {
|
|
60
60
|
return RNhotupdate.getCurrentVersion(0);
|
|
61
61
|
}
|
|
62
|
+
function rollbackToPreviousBundle(): Promise<boolean> {
|
|
63
|
+
return RNhotupdate.rollbackToPreviousBundle(0);
|
|
64
|
+
}
|
|
62
65
|
async function getVersionAsNumber() {
|
|
63
66
|
const rawVersion = await getCurrentVersion();
|
|
64
67
|
return +rawVersion;
|
|
@@ -195,6 +198,7 @@ export default {
|
|
|
195
198
|
resetApp,
|
|
196
199
|
getCurrentVersion: getVersionAsNumber,
|
|
197
200
|
setCurrentVersion,
|
|
201
|
+
rollbackToPreviousBundle,
|
|
198
202
|
git: {
|
|
199
203
|
checkForGitUpdate,
|
|
200
204
|
...git,
|