@hot-updater/react-native 0.0.5 → 0.1.1
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/HotUpdater.podspec +2 -0
- package/README.md +62 -2
- package/android/build.gradle +120 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/hotupdater/HotUpdater.kt +290 -0
- package/android/src/main/java/com/hotupdater/HotUpdaterModule.kt +45 -0
- package/android/src/main/java/com/hotupdater/HotUpdaterPackage.kt +36 -0
- package/android/src/newarch/HotUpdaterSpec.kt +6 -0
- package/android/src/oldarch/HotUpdaterSpec.kt +15 -0
- package/dist/index.cjs +220 -0
- package/dist/index.d.cts +80 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.js +193 -0
- package/ios/HotUpdater/HotUpdater.h +0 -1
- package/ios/HotUpdater/HotUpdater.mm +125 -100
- package/package.json +21 -11
- package/lib/error.d.ts +0 -4
- package/lib/error.d.ts.map +0 -1
- package/lib/error.js +0 -25
- package/lib/index.d.ts +0 -29
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -142
- package/lib/types.d.ts +0 -23
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -1
- package/lib/wrapNetworkError.d.ts +0 -2
- package/lib/wrapNetworkError.d.ts.map +0 -1
- package/lib/wrapNetworkError.js +0 -54
|
@@ -1,61 +1,58 @@
|
|
|
1
1
|
#import "HotUpdater.h"
|
|
2
|
+
#import <SSZipArchive/SSZipArchive.h>
|
|
2
3
|
|
|
3
4
|
@implementation HotUpdater
|
|
4
5
|
|
|
5
6
|
RCT_EXPORT_MODULE();
|
|
6
7
|
|
|
7
|
-
static NSURL *_bundleURL = nil;
|
|
8
|
-
|
|
9
8
|
#pragma mark - Bundle URL Management
|
|
10
9
|
|
|
11
10
|
+ (void)reload {
|
|
11
|
+
NSLog(@"HotUpdater requested a reload");
|
|
12
12
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
13
13
|
RCTTriggerReloadCommandListeners(@"HotUpdater requested a reload");
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
+ (void)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
+ (void)setBundleVersion:(NSString*)bundleVersion {
|
|
18
|
+
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
19
|
+
[defaults setObject:bundleVersion forKey:@"HotUpdaterBundleVersion"];
|
|
20
|
+
[defaults synchronize];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
+ (NSString *)getAppVersion {
|
|
24
|
+
NSString *appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
|
|
25
|
+
return appVersion;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
|
-
+ (
|
|
28
|
+
+ (NSNumber *)getBundleVersion {
|
|
27
29
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
28
|
-
NSString *
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return nil;
|
|
30
|
+
NSString *bundleVersion = [defaults objectForKey:@"HotUpdaterBundleVersion"];
|
|
31
|
+
|
|
32
|
+
if (bundleVersion) {
|
|
33
|
+
return @([bundleVersion integerValue]);
|
|
33
34
|
}
|
|
34
|
-
}
|
|
35
35
|
|
|
36
|
+
return @(-1);
|
|
37
|
+
}
|
|
36
38
|
|
|
37
39
|
+ (void)setBundleURL:(NSString *)localPath {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
[[NSUserDefaults standardUserDefaults] synchronize];
|
|
43
|
-
});
|
|
40
|
+
NSLog(@"Setting bundle URL: %@", localPath);
|
|
41
|
+
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
42
|
+
[defaults setObject:localPath forKey:@"HotUpdaterBundleURL"];
|
|
43
|
+
[defaults synchronize];
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
+ (NSURL *)cachedURLFromBundle {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
48
|
+
NSString *savedURLString = [defaults objectForKey:@"HotUpdaterBundleURL"];
|
|
49
|
+
|
|
50
|
+
if (savedURLString) {
|
|
51
|
+
NSURL *bundleURL = [NSURL URLWithString:savedURLString];
|
|
52
|
+
if (bundleURL && [[NSFileManager defaultManager] fileExistsAtPath:[bundleURL path]]) {
|
|
53
|
+
return bundleURL;
|
|
52
54
|
}
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
if (_bundleURL && [[NSFileManager defaultManager] fileExistsAtPath:[_bundleURL path]]) {
|
|
56
|
-
return _bundleURL;
|
|
57
55
|
}
|
|
58
|
-
|
|
59
56
|
return nil;
|
|
60
57
|
}
|
|
61
58
|
|
|
@@ -72,8 +69,18 @@ static NSURL *_bundleURL = nil;
|
|
|
72
69
|
return [self cachedURLFromBundle] ?: [self fallbackURL];
|
|
73
70
|
}
|
|
74
71
|
|
|
75
|
-
+ (
|
|
76
|
-
|
|
72
|
+
+ (void)initializeOnAppUpdate {
|
|
73
|
+
NSString *currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
|
|
74
|
+
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
|
75
|
+
NSString *savedVersion = [defaults stringForKey:@"HotUpdaterAppVersion"];
|
|
76
|
+
|
|
77
|
+
if (![currentVersion isEqualToString:savedVersion]) {
|
|
78
|
+
[defaults removeObjectForKey:@"HotUpdaterBundleURL"];
|
|
79
|
+
[defaults removeObjectForKey:@"HotUpdaterBundleVersion"];
|
|
80
|
+
|
|
81
|
+
[defaults setObject:currentVersion forKey:@"HotUpdaterAppVersion"];
|
|
82
|
+
[defaults synchronize];
|
|
83
|
+
}
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
#pragma mark - Utility Methods
|
|
@@ -82,95 +89,113 @@ static NSURL *_bundleURL = nil;
|
|
|
82
89
|
return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:basePath];
|
|
83
90
|
}
|
|
84
91
|
|
|
85
|
-
+ (NSString *)
|
|
92
|
+
+ (NSString *)stripPrefixFromPath:(NSString *)prefix path:(NSString *)path {
|
|
86
93
|
if ([path hasPrefix:[NSString stringWithFormat:@"/%@/", prefix]]) {
|
|
87
94
|
return [path stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"/%@/", prefix] withString:@""];
|
|
88
95
|
}
|
|
89
96
|
return path;
|
|
90
97
|
}
|
|
91
98
|
|
|
92
|
-
+ (BOOL)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
[
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (!data) {
|
|
108
|
-
NSLog(@"Failed to download data from URL: %@", url);
|
|
109
|
-
allSuccess = NO;
|
|
110
|
-
dispatch_semaphore_signal(semaphore);
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
115
|
-
NSError *folderError;
|
|
116
|
-
if (![fileManager createDirectoryAtPath:[path stringByDeletingLastPathComponent]
|
|
117
|
-
withIntermediateDirectories:YES
|
|
118
|
-
attributes:nil
|
|
119
|
-
error:&folderError]) {
|
|
120
|
-
NSLog(@"Failed to create folder: %@", folderError);
|
|
121
|
-
allSuccess = NO;
|
|
122
|
-
dispatch_semaphore_signal(semaphore);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
NSError *error;
|
|
127
|
-
[data writeToFile:path options:NSDataWritingAtomic error:&error];
|
|
128
|
-
|
|
129
|
-
if (error) {
|
|
130
|
-
NSLog(@"Failed to save data: %@", error);
|
|
131
|
-
allSuccess = NO;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if ([filename hasPrefix:@"index"] && [filename hasSuffix:@".bundle"]) {
|
|
135
|
-
[self setBundleURL:path];
|
|
136
|
-
}
|
|
137
|
-
dispatch_semaphore_signal(semaphore);
|
|
138
|
-
}];
|
|
99
|
+
+ (BOOL)extractZipFileAtPath:(NSString *)filePath toDestination:(NSString *)destinationPath {
|
|
100
|
+
NSError *error = nil;
|
|
101
|
+
BOOL success = [SSZipArchive unzipFileAtPath:filePath toDestination:destinationPath overwrite:YES password:nil error:&error];
|
|
102
|
+
if (!success) {
|
|
103
|
+
NSLog(@"Failed to unzip file: %@", error);
|
|
104
|
+
}
|
|
105
|
+
return success;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
+ (BOOL)updateBundle:(NSString *)prefix url:(NSURL *)url {
|
|
109
|
+
if (url == nil) {
|
|
110
|
+
[self setBundleVersion:nil];
|
|
111
|
+
[self setBundleURL:nil];
|
|
112
|
+
return YES;
|
|
139
113
|
}
|
|
114
|
+
NSString *basePath = [self stripPrefixFromPath:prefix path:[url path]];
|
|
115
|
+
NSString *path = [self convertFileSystemPathFromBasePath:basePath];
|
|
140
116
|
|
|
141
|
-
|
|
142
|
-
|
|
117
|
+
NSData *data = [NSData dataWithContentsOfURL:url];
|
|
118
|
+
if (!data) {
|
|
119
|
+
NSLog(@"Failed to download data from URL: %@", url);
|
|
120
|
+
return NO;
|
|
143
121
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
122
|
+
|
|
123
|
+
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
124
|
+
NSError *folderError;
|
|
125
|
+
if (![fileManager createDirectoryAtPath:[path stringByDeletingLastPathComponent]
|
|
126
|
+
withIntermediateDirectories:YES
|
|
127
|
+
attributes:nil
|
|
128
|
+
error:&folderError]) {
|
|
129
|
+
NSLog(@"Failed to create folder: %@", folderError);
|
|
130
|
+
return NO;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
NSError *error;
|
|
134
|
+
[data writeToFile:path options:NSDataWritingAtomic error:&error];
|
|
135
|
+
if (error) {
|
|
136
|
+
NSLog(@"Failed to save data: %@", error);
|
|
137
|
+
return NO;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
NSString *extractedPath = [path stringByDeletingLastPathComponent];
|
|
141
|
+
if (![self extractZipFileAtPath:path toDestination:extractedPath]) {
|
|
142
|
+
NSLog(@"Failed to extract zip file.");
|
|
143
|
+
return NO;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:extractedPath];
|
|
147
|
+
NSString *filename = nil;
|
|
148
|
+
for (NSString *file in enumerator) {
|
|
149
|
+
if ([file isEqualToString:@"index.ios.bundle.js"]) {
|
|
150
|
+
filename = file;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
148
153
|
}
|
|
149
|
-
|
|
154
|
+
|
|
155
|
+
if (filename) {
|
|
156
|
+
NSString *bundlePath = [extractedPath stringByAppendingPathComponent:filename];
|
|
157
|
+
NSLog(@"Setting bundle URL: %@", bundlePath);
|
|
158
|
+
[self setBundleURL:bundlePath];
|
|
159
|
+
} else {
|
|
160
|
+
NSLog(@"index.ios.bundle.js not found.");
|
|
161
|
+
return NO;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
[self setBundleVersion:prefix];
|
|
165
|
+
NSLog(@"Downloaded and extracted file successfully.");
|
|
166
|
+
|
|
167
|
+
return YES;
|
|
150
168
|
}
|
|
151
169
|
|
|
152
170
|
#pragma mark - React Native Exports
|
|
153
171
|
|
|
172
|
+
RCT_EXPORT_METHOD(initializeOnAppUpdate) {
|
|
173
|
+
[HotUpdater initializeOnAppUpdate];
|
|
174
|
+
}
|
|
175
|
+
|
|
154
176
|
RCT_EXPORT_METHOD(reload) {
|
|
155
177
|
[HotUpdater reload];
|
|
156
178
|
}
|
|
157
179
|
|
|
158
|
-
RCT_EXPORT_METHOD(
|
|
159
|
-
|
|
160
|
-
callback(@[
|
|
180
|
+
RCT_EXPORT_METHOD(getBundleVersion:(RCTResponseSenderBlock)callback) {
|
|
181
|
+
NSNumber *bundleVersion = [HotUpdater getBundleVersion];
|
|
182
|
+
callback(@[bundleVersion]);
|
|
161
183
|
}
|
|
162
184
|
|
|
163
|
-
RCT_EXPORT_METHOD(downloadFilesFromURLs:(NSArray<NSString *> *)urlStrings prefix:(NSString *)prefix callback:(RCTResponseSenderBlock)callback) {
|
|
164
|
-
NSMutableArray<NSURL *> *urls = [NSMutableArray array];
|
|
165
|
-
for (NSString *urlString in urlStrings) {
|
|
166
|
-
NSURL *url = [NSURL URLWithString:urlString];
|
|
167
185
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
186
|
+
RCT_EXPORT_METHOD(getAppVersion:(RCTResponseSenderBlock)callback) {
|
|
187
|
+
NSString *version = [HotUpdater getAppVersion];
|
|
188
|
+
callback(@[version ?: [NSNull null]]);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
RCT_EXPORT_METHOD(updateBundle:(NSString *)prefix downloadUrl:(NSString *)urlString callback:(RCTResponseSenderBlock)callback) {
|
|
192
|
+
NSURL *url = nil;
|
|
193
|
+
if (urlString != nil) {
|
|
194
|
+
url = [NSURL URLWithString:urlString];
|
|
171
195
|
}
|
|
172
196
|
|
|
173
|
-
BOOL result = [HotUpdater
|
|
197
|
+
BOOL result = [HotUpdater updateBundle:prefix url:url];
|
|
174
198
|
callback(@[@(result)]);
|
|
175
199
|
}
|
|
200
|
+
|
|
176
201
|
@end
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "React Native OTA solution for self-hosted",
|
|
5
|
-
"main": "
|
|
6
|
-
"
|
|
6
|
+
"main": "dist/index.cjs",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"react-native": "src/index.ts",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
7
10
|
"files": [
|
|
8
|
-
"
|
|
11
|
+
"dist",
|
|
9
12
|
"android",
|
|
10
13
|
"ios",
|
|
11
14
|
"cpp",
|
|
@@ -39,21 +42,28 @@
|
|
|
39
42
|
"access": "public"
|
|
40
43
|
},
|
|
41
44
|
"codegenConfig": {
|
|
42
|
-
"name": "
|
|
45
|
+
"name": "HotUpdaterSpec",
|
|
43
46
|
"type": "modules",
|
|
44
|
-
"jsSrcsDir": "src"
|
|
47
|
+
"jsSrcsDir": "./src/specs",
|
|
48
|
+
"android": {
|
|
49
|
+
"javaPackageName": "com.hotupdater"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"react-native": "*"
|
|
45
54
|
},
|
|
46
|
-
"packageManager": "pnpm@8.9.2",
|
|
47
55
|
"devDependencies": {
|
|
56
|
+
"@types/react": "^18.2.6",
|
|
48
57
|
"react": "^18.2.0",
|
|
49
58
|
"react-native": "^0.72.6"
|
|
50
59
|
},
|
|
51
60
|
"dependencies": {
|
|
52
|
-
"
|
|
61
|
+
"@hot-updater/utils": "0.1.1"
|
|
53
62
|
},
|
|
54
63
|
"scripts": {
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
64
|
+
"build": "tsup src/index.ts --format esm,cjs --dts",
|
|
65
|
+
"test:type": "tsc --noEmit",
|
|
66
|
+
"test": "vitest",
|
|
67
|
+
"codegen:test": "node ./node_modules/react-native/scripts/generate-codegen-artifacts.js --path ./ --outputPath dist/HotUpdater/generated/ -t ios"
|
|
58
68
|
}
|
|
59
69
|
}
|
package/lib/error.d.ts
DELETED
package/lib/error.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B"}
|
package/lib/error.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
|
-
var HotUpdaterError = /** @class */ (function (_super) {
|
|
17
|
-
__extends(HotUpdaterError, _super);
|
|
18
|
-
function HotUpdaterError(message) {
|
|
19
|
-
var _this = _super.call(this, message) || this;
|
|
20
|
-
_this.name = "HotUpdaterError";
|
|
21
|
-
return _this;
|
|
22
|
-
}
|
|
23
|
-
return HotUpdaterError;
|
|
24
|
-
}(Error));
|
|
25
|
-
export { HotUpdaterError };
|
package/lib/index.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { HotUpdaterMetaData } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Fetches the current app version id.
|
|
4
|
-
*
|
|
5
|
-
* @async
|
|
6
|
-
* @returns {Promise<string|null>} Resolves with the current version id or null if not available.
|
|
7
|
-
*/
|
|
8
|
-
export declare const getAppVersionId: () => Promise<string | null>;
|
|
9
|
-
/**
|
|
10
|
-
* Downloads files from given URLs.
|
|
11
|
-
*
|
|
12
|
-
* @async
|
|
13
|
-
* @param {string[]} urlStrings - An array of URL strings to download files from.
|
|
14
|
-
* @param {string} prefix - The prefix to be added to each file name.
|
|
15
|
-
* @returns {Promise<boolean>} Resolves with true if download was successful, otherwise rejects with an error.
|
|
16
|
-
*/
|
|
17
|
-
export declare const downloadFilesFromURLs: (urlStrings: string[], prefix: string) => Promise<boolean>;
|
|
18
|
-
/**
|
|
19
|
-
* Reloads the app.
|
|
20
|
-
*/
|
|
21
|
-
export declare const reload: () => void;
|
|
22
|
-
export type HotUpdaterStatus = "INSTALLING_UPDATE" | "UP_TO_DATE";
|
|
23
|
-
export interface HotUpdaterInit {
|
|
24
|
-
metadata: HotUpdaterMetaData | (() => HotUpdaterMetaData) | (() => Promise<HotUpdaterMetaData>);
|
|
25
|
-
onSuccess?: (status: HotUpdaterStatus) => void;
|
|
26
|
-
onFailure?: (e: unknown) => void;
|
|
27
|
-
}
|
|
28
|
-
export declare const init: ({ metadata, onSuccess, onFailure, }: HotUpdaterInit) => Promise<void>;
|
|
29
|
-
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAM7C;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,MAAM,GAAG,IAAI,CAM7D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,eACpB,MAAM,EAAE,UACZ,MAAM,KACb,QAAQ,OAAO,CAqBjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,YAElB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EACJ,kBAAkB,GAClB,CAAC,MAAM,kBAAkB,CAAC,GAC1B,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAExC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,IAAI,wCAId,cAAc,kBAqChB,CAAC"}
|
package/lib/index.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
import { URL } from "react-native-url-polyfill";
|
|
38
|
-
import { NativeModules, Platform } from "react-native";
|
|
39
|
-
import { HotUpdaterError } from "./error";
|
|
40
|
-
import { wrapNetworkError } from "./wrapNetworkError";
|
|
41
|
-
var HotUpdater = NativeModules.HotUpdater;
|
|
42
|
-
/**
|
|
43
|
-
* Fetches the current app version id.
|
|
44
|
-
*
|
|
45
|
-
* @async
|
|
46
|
-
* @returns {Promise<string|null>} Resolves with the current version id or null if not available.
|
|
47
|
-
*/
|
|
48
|
-
export var getAppVersionId = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
49
|
-
return __generator(this, function (_a) {
|
|
50
|
-
return [2 /*return*/, new Promise(function (resolve) {
|
|
51
|
-
HotUpdater.getAppVersionId(function (versionId) {
|
|
52
|
-
resolve(versionId);
|
|
53
|
-
});
|
|
54
|
-
})];
|
|
55
|
-
});
|
|
56
|
-
}); };
|
|
57
|
-
/**
|
|
58
|
-
* Downloads files from given URLs.
|
|
59
|
-
*
|
|
60
|
-
* @async
|
|
61
|
-
* @param {string[]} urlStrings - An array of URL strings to download files from.
|
|
62
|
-
* @param {string} prefix - The prefix to be added to each file name.
|
|
63
|
-
* @returns {Promise<boolean>} Resolves with true if download was successful, otherwise rejects with an error.
|
|
64
|
-
*/
|
|
65
|
-
export var downloadFilesFromURLs = function (urlStrings, prefix) {
|
|
66
|
-
return new Promise(function (resolve) {
|
|
67
|
-
var encodedURLs = urlStrings.map(function (urlString) {
|
|
68
|
-
var url = new URL(urlString);
|
|
69
|
-
return [
|
|
70
|
-
url.origin,
|
|
71
|
-
url.pathname
|
|
72
|
-
.split("/")
|
|
73
|
-
.map(function (pathname) { return encodeURIComponent(pathname); })
|
|
74
|
-
.join("/"),
|
|
75
|
-
].join("");
|
|
76
|
-
});
|
|
77
|
-
HotUpdater.downloadFilesFromURLs(encodedURLs, prefix, function (success) {
|
|
78
|
-
resolve(success);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* Reloads the app.
|
|
84
|
-
*/
|
|
85
|
-
export var reload = function () {
|
|
86
|
-
HotUpdater.reload();
|
|
87
|
-
};
|
|
88
|
-
export var init = function (_a) {
|
|
89
|
-
var metadata = _a.metadata, onSuccess = _a.onSuccess, onFailure = _a.onFailure;
|
|
90
|
-
return __awaiter(void 0, void 0, void 0, function () {
|
|
91
|
-
var _b, files, id, _c, reloadAfterUpdate, _d, appVersionId, allDownloadFiles, e_1;
|
|
92
|
-
return __generator(this, function (_e) {
|
|
93
|
-
switch (_e.label) {
|
|
94
|
-
case 0:
|
|
95
|
-
if (!["ios", "android"].includes(Platform.OS)) {
|
|
96
|
-
throw new HotUpdaterError("HotUpdater is only supported on iOS and Android");
|
|
97
|
-
}
|
|
98
|
-
_e.label = 1;
|
|
99
|
-
case 1:
|
|
100
|
-
_e.trys.push([1, 8, , 9]);
|
|
101
|
-
if (!(typeof metadata === "function")) return [3 /*break*/, 3];
|
|
102
|
-
return [4 /*yield*/, wrapNetworkError(metadata)];
|
|
103
|
-
case 2:
|
|
104
|
-
_d = _e.sent();
|
|
105
|
-
return [3 /*break*/, 4];
|
|
106
|
-
case 3:
|
|
107
|
-
_d = metadata;
|
|
108
|
-
_e.label = 4;
|
|
109
|
-
case 4:
|
|
110
|
-
_b = _d, files = _b.files, id = _b.id, _c = _b.reloadAfterUpdate, reloadAfterUpdate = _c === void 0 ? false : _c;
|
|
111
|
-
return [4 /*yield*/, getAppVersionId()];
|
|
112
|
-
case 5:
|
|
113
|
-
appVersionId = _e.sent();
|
|
114
|
-
if (!(id !== appVersionId)) return [3 /*break*/, 7];
|
|
115
|
-
return [4 /*yield*/, downloadFilesFromURLs(files, id)];
|
|
116
|
-
case 6:
|
|
117
|
-
allDownloadFiles = _e.sent();
|
|
118
|
-
if (allDownloadFiles) {
|
|
119
|
-
if (reloadAfterUpdate) {
|
|
120
|
-
reload();
|
|
121
|
-
}
|
|
122
|
-
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess("INSTALLING_UPDATE");
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
throw new HotUpdaterError("HotUpdater failed to download");
|
|
126
|
-
}
|
|
127
|
-
return [2 /*return*/];
|
|
128
|
-
case 7:
|
|
129
|
-
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess("UP_TO_DATE");
|
|
130
|
-
return [3 /*break*/, 9];
|
|
131
|
-
case 8:
|
|
132
|
-
e_1 = _e.sent();
|
|
133
|
-
if (onFailure) {
|
|
134
|
-
onFailure(e_1);
|
|
135
|
-
return [2 /*return*/];
|
|
136
|
-
}
|
|
137
|
-
throw e_1;
|
|
138
|
-
case 9: return [2 /*return*/];
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
};
|
package/lib/types.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export type Version = `${number}.${number}.${number}` | `${number}.${number}` | `${number}`;
|
|
2
|
-
/**
|
|
3
|
-
* Metadata associated with a hot update.
|
|
4
|
-
*/
|
|
5
|
-
export type HotUpdaterMetaData = {
|
|
6
|
-
/**
|
|
7
|
-
* List of files associated with the update.
|
|
8
|
-
*/
|
|
9
|
-
files: string[];
|
|
10
|
-
/**
|
|
11
|
-
* Version information for the update.
|
|
12
|
-
*/
|
|
13
|
-
version: Version;
|
|
14
|
-
/**
|
|
15
|
-
* Unique identifier for the update. This is used as a prefix when downloading files.
|
|
16
|
-
*/
|
|
17
|
-
id: string;
|
|
18
|
-
/**
|
|
19
|
-
* Indicates whether the application should reload after the update is applied.
|
|
20
|
-
*/
|
|
21
|
-
reloadAfterUpdate?: boolean;
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=types.d.ts.map
|
package/lib/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GACf,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,GAC/B,GAAG,MAAM,IAAI,MAAM,EAAE,GACrB,GAAG,MAAM,EAAE,CAAC;AAEhB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC"}
|
package/lib/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapNetworkError.d.ts","sourceRoot":"","sources":["../src/wrapNetworkError.ts"],"names":[],"mappings":"AAEA,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,QAAQ,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,CAMZ"}
|
package/lib/wrapNetworkError.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
import { HotUpdaterError } from "./error";
|
|
38
|
-
export function wrapNetworkError(metadata) {
|
|
39
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
40
|
-
var error_1;
|
|
41
|
-
return __generator(this, function (_a) {
|
|
42
|
-
switch (_a.label) {
|
|
43
|
-
case 0:
|
|
44
|
-
_a.trys.push([0, 2, , 3]);
|
|
45
|
-
return [4 /*yield*/, metadata()];
|
|
46
|
-
case 1: return [2 /*return*/, _a.sent()];
|
|
47
|
-
case 2:
|
|
48
|
-
error_1 = _a.sent();
|
|
49
|
-
throw new HotUpdaterError("HotUpdater metadata is not defined");
|
|
50
|
-
case 3: return [2 /*return*/];
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
}
|