@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.
@@ -132,8 +132,10 @@ static NSURL *_bundleURL = nil;
132
132
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
133
133
  }
134
134
 
135
- [self setVersionId:prefix];
136
- NSLog(@"Downloaded all files.");
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 HotUpdaterContext = {
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAI7C;;;;;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,CAMjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,GACD,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,QAAQ,EACJ,kBAAkB,GAClB,CAAC,MAAM,kBAAkB,CAAC,GAC1B,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,IAAI,iBAAwB,cAAc,kBAYtD,CAAC"}
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
- HotUpdater.downloadFilesFromURLs(urlStrings, prefix, function (success) {
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 Error("HotUpdater is only supported on iOS and Android");
90
+ throw new HotUpdaterPlatformError();
78
91
  }
79
- if (!(typeof metadata === "function")) return [3 /*break*/, 2];
80
- return [4 /*yield*/, metadata()];
92
+ _d.label = 1;
81
93
  case 1:
82
- _c = _d.sent();
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 = metadata;
86
- _d.label = 3;
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 4:
106
+ case 5:
91
107
  appVersionId = _d.sent();
92
- if (!(id !== appVersionId && id != null)) return [3 /*break*/, 6];
108
+ if (!(id !== appVersionId)) return [3 /*break*/, 7];
93
109
  return [4 /*yield*/, downloadFilesFromURLs(files, id)];
94
- case 5:
95
- _d.sent();
96
- _d.label = 6;
97
- case 6: return [2 /*return*/];
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,2 @@
1
+ export declare function wrapNetworkError<T>(metadata: (() => Promise<T>) | (() => T)): Promise<T>;
2
+ //# sourceMappingURL=wrapNetworkError.d.ts.map
@@ -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.2",
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",