@hot-updater/react-native 0.0.2 → 0.0.3
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/ios/HotUpdater/HotUpdater.mm +4 -3
- package/lib/error.d.ts +10 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +45 -0
- package/lib/index.d.ts +4 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +48 -16
- package/lib/wrapNetworkError.d.ts +2 -0
- package/lib/wrapNetworkError.d.ts.map +1 -0
- package/lib/wrapNetworkError.js +54 -0
- package/package.json +4 -1
|
@@ -132,8 +132,10 @@ static NSURL *_bundleURL = nil;
|
|
|
132
132
|
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
if (allSuccess) {
|
|
136
|
+
[self setVersionId:prefix];
|
|
137
|
+
NSLog(@"Downloaded all files.");
|
|
138
|
+
}
|
|
137
139
|
return allSuccess;
|
|
138
140
|
}
|
|
139
141
|
|
|
@@ -147,7 +149,6 @@ RCT_EXPORT_METHOD(getAppVersionId:(RCTResponseSenderBlock)callback) {
|
|
|
147
149
|
RCT_EXPORT_METHOD(downloadFilesFromURLs:(NSArray<NSString *> *)urlStrings prefix:(NSString *)prefix callback:(RCTResponseSenderBlock)callback) {
|
|
148
150
|
NSMutableArray<NSURL *> *urls = [NSMutableArray array];
|
|
149
151
|
for (NSString *urlString in urlStrings) {
|
|
150
|
-
NSLog(@"urlString: %@", urlString);
|
|
151
152
|
NSURL *url = [NSURL URLWithString:urlString];
|
|
152
153
|
|
|
153
154
|
if (url) {
|
package/lib/error.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class HotUpdaterDownloadError extends Error {
|
|
2
|
+
constructor();
|
|
3
|
+
}
|
|
4
|
+
export declare class HotUpdaterPlatformError extends Error {
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
export declare class HotUpdaterMetadataError extends Error {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD"}
|
package/lib/error.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
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 HotUpdaterDownloadError = /** @class */ (function (_super) {
|
|
17
|
+
__extends(HotUpdaterDownloadError, _super);
|
|
18
|
+
function HotUpdaterDownloadError() {
|
|
19
|
+
var _this = _super.call(this, "HotUpdater failed to download") || this;
|
|
20
|
+
_this.name = "HotUpdaterDownloadError";
|
|
21
|
+
return _this;
|
|
22
|
+
}
|
|
23
|
+
return HotUpdaterDownloadError;
|
|
24
|
+
}(Error));
|
|
25
|
+
export { HotUpdaterDownloadError };
|
|
26
|
+
var HotUpdaterPlatformError = /** @class */ (function (_super) {
|
|
27
|
+
__extends(HotUpdaterPlatformError, _super);
|
|
28
|
+
function HotUpdaterPlatformError() {
|
|
29
|
+
var _this = _super.call(this, "HotUpdater is only supported on iOS and Android") || this;
|
|
30
|
+
_this.name = "HotUpdaterPlatformError";
|
|
31
|
+
return _this;
|
|
32
|
+
}
|
|
33
|
+
return HotUpdaterPlatformError;
|
|
34
|
+
}(Error));
|
|
35
|
+
export { HotUpdaterPlatformError };
|
|
36
|
+
var HotUpdaterMetadataError = /** @class */ (function (_super) {
|
|
37
|
+
__extends(HotUpdaterMetadataError, _super);
|
|
38
|
+
function HotUpdaterMetadataError() {
|
|
39
|
+
var _this = _super.call(this, "HotUpdater metadata is not defined") || this;
|
|
40
|
+
_this.name = "HotUpdaterMetadataError";
|
|
41
|
+
return _this;
|
|
42
|
+
}
|
|
43
|
+
return HotUpdaterMetadataError;
|
|
44
|
+
}(Error));
|
|
45
|
+
export { HotUpdaterMetadataError };
|
package/lib/index.d.ts
CHANGED
|
@@ -15,12 +15,11 @@ export declare const getAppVersionId: () => Promise<string | null>;
|
|
|
15
15
|
* @returns {Promise<boolean>} Resolves with true if download was successful, otherwise rejects with an error.
|
|
16
16
|
*/
|
|
17
17
|
export declare const downloadFilesFromURLs: (urlStrings: string[], prefix: string) => Promise<boolean>;
|
|
18
|
-
export type
|
|
19
|
-
ios: string;
|
|
20
|
-
android: string;
|
|
21
|
-
} | string;
|
|
18
|
+
export type HotUpdaterStatus = "INSTALLING_UPDATE" | "UP_TO_DATE";
|
|
22
19
|
export interface HotUpdaterInit {
|
|
23
20
|
metadata: HotUpdaterMetaData | (() => HotUpdaterMetaData) | (() => Promise<HotUpdaterMetaData>);
|
|
21
|
+
onSuccess?: (status: HotUpdaterStatus) => void;
|
|
22
|
+
onFailure?: (e: unknown) => void;
|
|
24
23
|
}
|
|
25
|
-
export declare const init: ({ metadata }: HotUpdaterInit) => Promise<void>;
|
|
24
|
+
export declare const init: ({ metadata, onSuccess, onFailure, }: HotUpdaterInit) => Promise<void>;
|
|
26
25
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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,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,kBA6BhB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -34,7 +34,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
+
import { URL } from "react-native-url-polyfill";
|
|
37
38
|
import { NativeModules, Platform } from "react-native";
|
|
39
|
+
import { HotUpdaterDownloadError, HotUpdaterPlatformError } from "./error";
|
|
40
|
+
import { wrapNetworkError } from "./wrapNetworkError";
|
|
38
41
|
var HotUpdater = NativeModules.HotUpdater;
|
|
39
42
|
/**
|
|
40
43
|
* Fetches the current app version id.
|
|
@@ -61,40 +64,69 @@ export var getAppVersionId = function () { return __awaiter(void 0, void 0, void
|
|
|
61
64
|
*/
|
|
62
65
|
export var downloadFilesFromURLs = function (urlStrings, prefix) {
|
|
63
66
|
return new Promise(function (resolve) {
|
|
64
|
-
|
|
67
|
+
var encodedURLs = urlStrings.map(function (urlString) {
|
|
68
|
+
var url = new URL(urlString);
|
|
69
|
+
return [
|
|
70
|
+
url.host,
|
|
71
|
+
url.pathname
|
|
72
|
+
.split("/")
|
|
73
|
+
.map(function (pathname) { return encodeURIComponent(pathname); })
|
|
74
|
+
.join("/"),
|
|
75
|
+
].join("/");
|
|
76
|
+
});
|
|
77
|
+
HotUpdater.downloadFilesFromURLs(encodedURLs, prefix, function (success) {
|
|
65
78
|
resolve(success);
|
|
66
79
|
});
|
|
67
80
|
});
|
|
68
81
|
};
|
|
69
82
|
export var init = function (_a) {
|
|
70
|
-
var metadata = _a.metadata;
|
|
83
|
+
var metadata = _a.metadata, onSuccess = _a.onSuccess, onFailure = _a.onFailure;
|
|
71
84
|
return __awaiter(void 0, void 0, void 0, function () {
|
|
72
|
-
var _b, files, id, _c, appVersionId;
|
|
85
|
+
var _b, files, id, _c, appVersionId, allDownloadFiles, e_1;
|
|
73
86
|
return __generator(this, function (_d) {
|
|
74
87
|
switch (_d.label) {
|
|
75
88
|
case 0:
|
|
76
89
|
if (!["ios", "android"].includes(Platform.OS)) {
|
|
77
|
-
throw new
|
|
90
|
+
throw new HotUpdaterPlatformError();
|
|
78
91
|
}
|
|
79
|
-
|
|
80
|
-
return [4 /*yield*/, metadata()];
|
|
92
|
+
_d.label = 1;
|
|
81
93
|
case 1:
|
|
82
|
-
|
|
83
|
-
return [3 /*break*/, 3];
|
|
94
|
+
_d.trys.push([1, 8, , 9]);
|
|
95
|
+
if (!(typeof metadata === "function")) return [3 /*break*/, 3];
|
|
96
|
+
return [4 /*yield*/, wrapNetworkError(metadata)];
|
|
84
97
|
case 2:
|
|
85
|
-
_c =
|
|
86
|
-
|
|
98
|
+
_c = _d.sent();
|
|
99
|
+
return [3 /*break*/, 4];
|
|
87
100
|
case 3:
|
|
101
|
+
_c = metadata;
|
|
102
|
+
_d.label = 4;
|
|
103
|
+
case 4:
|
|
88
104
|
_b = _c, files = _b.files, id = _b.id;
|
|
89
105
|
return [4 /*yield*/, getAppVersionId()];
|
|
90
|
-
case
|
|
106
|
+
case 5:
|
|
91
107
|
appVersionId = _d.sent();
|
|
92
|
-
if (!(id !== appVersionId
|
|
108
|
+
if (!(id !== appVersionId)) return [3 /*break*/, 7];
|
|
93
109
|
return [4 /*yield*/, downloadFilesFromURLs(files, id)];
|
|
94
|
-
case
|
|
95
|
-
_d.sent();
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
case 6:
|
|
111
|
+
allDownloadFiles = _d.sent();
|
|
112
|
+
if (allDownloadFiles) {
|
|
113
|
+
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess("INSTALLING_UPDATE");
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
throw new HotUpdaterDownloadError();
|
|
117
|
+
}
|
|
118
|
+
return [2 /*return*/];
|
|
119
|
+
case 7:
|
|
120
|
+
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess("UP_TO_DATE");
|
|
121
|
+
return [3 /*break*/, 9];
|
|
122
|
+
case 8:
|
|
123
|
+
e_1 = _d.sent();
|
|
124
|
+
if (onFailure) {
|
|
125
|
+
onFailure(e_1);
|
|
126
|
+
return [2 /*return*/];
|
|
127
|
+
}
|
|
128
|
+
throw e_1;
|
|
129
|
+
case 9: return [2 /*return*/];
|
|
98
130
|
}
|
|
99
131
|
});
|
|
100
132
|
});
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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 { HotUpdaterMetadataError } 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 HotUpdaterMetadataError();
|
|
50
|
+
case 3: return [2 /*return*/];
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/react-native",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "React Native OTA solution for self-hosted",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -48,6 +48,9 @@
|
|
|
48
48
|
"react": "^18.2.0",
|
|
49
49
|
"react-native": "^0.72.6"
|
|
50
50
|
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"react-native-url-polyfill": "^2.0.0"
|
|
53
|
+
},
|
|
51
54
|
"scripts": {
|
|
52
55
|
"preinstall": "npx only-allow pnpm",
|
|
53
56
|
"typecheck": "tsc --noEmit",
|