diff --git a/.gitignore b/.gitignore index 7c63903..80ec3be 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,4 @@ Example/**/.pushy Example/testHotUpdate/artifacts yarn-error.log +.cursor/mcp.json diff --git a/lib/main.ts b/lib/main.ts index bc7d0e1..0f3bb6b 100644 --- a/lib/main.ts +++ b/lib/main.ts @@ -16,7 +16,7 @@ import { UpdateAvailableResult, UpdateEventsListener, } from './type'; -import { assertRelease, logger, promiseAny, testUrls } from './utils'; +import { assertRelease, enhancedFetch, logger, promiseAny, testUrls } from './utils'; export { setCustomEndpoints }; const { version: v, @@ -158,7 +158,7 @@ export async function checkUpdate(APPKEY: string) { }; let resp; try { - resp = await fetch(getCheckUrl(APPKEY), fetchPayload); + resp = await enhancedFetch(getCheckUrl(APPKEY), fetchPayload); } catch (e) { report({ type: 'errorChecking', @@ -169,7 +169,7 @@ export async function checkUpdate(APPKEY: string) { try { resp = await promiseAny( backupEndpoints.map(endpoint => - fetch(getCheckUrl(APPKEY, endpoint), fetchPayload), + enhancedFetch(getCheckUrl(APPKEY, endpoint), fetchPayload), ), ); } catch {} diff --git a/lib/utils.ts b/lib/utils.ts index e38e8dc..b998c03 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -33,7 +33,7 @@ const ping = : async (url: string) => { let pingFinished = false; return Promise.race([ - fetch(url, { + enhancedFetch(url, { method: 'HEAD', }) .then(({ status, statusText }) => { @@ -73,3 +73,34 @@ export const testUrls = async (urls?: string[]) => { logger('all ping failed, use first url:', urls[0]); return urls[0]; }; + + + +// export const isAndroid70AndBelow = () => { +// // android 7.0 and below devices do not support letsencrypt cert +// // https://letsencrypt.org/2023/07/10/cross-sign-expiration/ +// return Platform.OS === 'android' && Platform.Version <= 24; +// }; + +export const enhancedFetch = async ( + url: string, + params: Parameters[1], + isRetry = false, +) => { + return fetch(url, params) + .then((r) => { + if (r.ok) { + return r; + } + throw new Error(`${r.status} ${r.statusText}`); + }) + .catch((e) => { + logger('fetch error', url, e); + if (isRetry) { + throw e; + } + logger('trying fallback to http'); + return enhancedFetch(url.replace('https', 'http'), params, true); + }); +}; + diff --git a/package.json b/package.json index 9e77f73..fc6a613 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-update", - "version": "9.2.5", + "version": "9.2.6", "description": "react-native hot update", "main": "lib/index.ts", "scripts": {