react-native-update 8.5.1 → 8.5.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/lib/endpoint.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { logger } from './utils';
1
+ import { logger, promiseAny } from './utils';
2
2
 
3
3
  let currentEndpoint = 'https://update.react-native.cn/api';
4
4
  let backupEndpoints: string[] = [
@@ -13,7 +13,7 @@ let backupEndpointsQueryUrls = [
13
13
  export async function updateBackupEndpoints() {
14
14
  if (backupEndpointsQueryUrls) {
15
15
  try {
16
- const resp = await Promise.race(
16
+ const resp = await promiseAny(
17
17
  backupEndpointsQueryUrls.map((queryUrl) => fetch(queryUrl)),
18
18
  );
19
19
  const remoteEndpoints = await resp.json();
package/lib/main.ts CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  UpdateAvailableResult,
17
17
  UpdateEventsListener,
18
18
  } from './type';
19
- import { assertRelease, logger, testUrls } from './utils';
19
+ import { assertRelease, logger, promiseAny, testUrls } from './utils';
20
20
  export { setCustomEndpoints };
21
21
  const {
22
22
  version: v,
@@ -162,7 +162,7 @@ export async function checkUpdate(APPKEY: string) {
162
162
  const backupEndpoints = await updateBackupEndpoints();
163
163
  if (backupEndpoints) {
164
164
  try {
165
- resp = await Promise.race(
165
+ resp = await promiseAny(
166
166
  backupEndpoints.map((endpoint) =>
167
167
  fetch(getCheckUrl(APPKEY, endpoint), fetchPayload),
168
168
  ),
package/lib/utils.ts CHANGED
@@ -1,4 +1,21 @@
1
- import { Platform } from "react-native";
1
+ import { Platform } from 'react-native';
2
+
3
+ export function promiseAny<T>(promises: Promise<T>[]) {
4
+ return new Promise<T>((resolve, reject) => {
5
+ let count = 0;
6
+
7
+ promises.forEach((promise) => {
8
+ Promise.resolve(promise)
9
+ .then(resolve)
10
+ .catch(() => {
11
+ count++;
12
+ if (count === promises.length) {
13
+ reject(new Error('All promises were rejected'));
14
+ }
15
+ });
16
+ });
17
+ });
18
+ }
2
19
 
3
20
  export function logger(...args: any[]) {
4
21
  console.log('Pushy: ', ...args);
@@ -13,20 +30,44 @@ export function assertRelease() {
13
30
  const ping =
14
31
  Platform.OS === 'web'
15
32
  ? Promise.resolve
16
- : async (url: string) =>
17
- Promise.race([
33
+ : async (url: string) => {
34
+ let pingFinished = false;
35
+ return Promise.race([
18
36
  fetch(url, {
19
37
  method: 'HEAD',
20
38
  })
21
- .then(({ status }) => (status === 200 ? url : null))
22
- .catch(() => null),
23
- new Promise(r => setTimeout(() => r(null), 2000)),
39
+ .then(({ status, statusText }) => {
40
+ pingFinished = true;
41
+ if (status === 200) {
42
+ return url;
43
+ }
44
+ logger('ping failed', url, status, statusText);
45
+ return null;
46
+ })
47
+ .catch((e) => {
48
+ pingFinished = true;
49
+ logger('ping error', url, e);
50
+ return null;
51
+ }),
52
+ new Promise((r) =>
53
+ setTimeout(() => {
54
+ r(null);
55
+ if (!pingFinished) {
56
+ logger('ping timeout', url);
57
+ }
58
+ }, 2000),
59
+ ),
24
60
  ]);
25
-
61
+ };
26
62
 
27
63
  export const testUrls = async (urls?: string[]) => {
28
64
  if (!urls?.length) {
29
65
  return null;
30
66
  }
31
- return Promise.race(urls.map(ping)).catch(() => null);
67
+ const ret = await promiseAny(urls.map(ping));
68
+ if (ret) {
69
+ return ret;
70
+ }
71
+ logger('all ping failed, use first url:', urls[0]);
72
+ return urls[0];
32
73
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-update",
3
- "version": "8.5.1",
3
+ "version": "8.5.3",
4
4
  "description": "react-native hot update",
5
5
  "main": "lib/index.ts",
6
6
  "scripts": {
@@ -36,5 +36,6 @@
36
36
  "@types/react": "^18.2.33",
37
37
  "react-native": "^0.72.6",
38
38
  "typescript": "^5.2.2"
39
- }
39
+ },
40
+ "packageManager": "yarn@1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72"
40
41
  }