mirror of
				https://gitcode.com/gh_mirrors/re/react-native-pushy.git
				synced 2025-10-31 21:33:12 +08:00 
			
		
		
		
	Backup domains
This commit is contained in:
		| @@ -1,5 +1,4 @@ | ||||
| module.exports = { | ||||
|   printWidth: 120, | ||||
|   trailingComma: 'all', | ||||
|   singleQuote: true, | ||||
| }; | ||||
|   | ||||
							
								
								
									
										57
									
								
								lib/getHost.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								lib/getHost.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| let availableDomain = 'update.reactnative.cn'; | ||||
|  | ||||
| function ping(domain) { | ||||
|   return new Promise((resolve, reject) => { | ||||
|     const xhr = new XMLHttpRequest(); | ||||
|     xhr.onreadystatechange = e => { | ||||
|       if (xhr.readyState !== 4) { | ||||
|         return; | ||||
|       } | ||||
|       if (xhr.status === 200) { | ||||
|         resolve(domain); | ||||
|       } else { | ||||
|         setTimeout(reject, 5000); | ||||
|       } | ||||
|     }; | ||||
|     xhr.open('HEAD', `https://${domain}`); | ||||
|     xhr.send(); | ||||
|     xhr.timeout = 5000; | ||||
|     xhr.ontimeout = reject; | ||||
|   }); | ||||
| } | ||||
|  | ||||
| function logger(...args) { | ||||
|   // console.warn('pushy', ...args); | ||||
| } | ||||
|  | ||||
| export async function tryBackupDomains() { | ||||
|   try { | ||||
|     await ping(availableDomain); | ||||
|     logger('main domain ok'); | ||||
|     return; | ||||
|   } catch (e) { | ||||
|     logger('main domain failed'); | ||||
|   } | ||||
|   let backupDomains = []; | ||||
|   try { | ||||
|     const resp = await fetch( | ||||
|       'https://cdn.jsdelivr.net/gh/reactnativecn/react-native-pushy@master/domains.json', | ||||
|     ); | ||||
|     backupDomains = await resp.json(); | ||||
|     logger('get remote domains:', backupDomains); | ||||
|   } catch (e) { | ||||
|     logger('get remote domains failed'); | ||||
|     return; | ||||
|   } | ||||
|   const fastestDomain = await Promise.race(backupDomains.map(ping)); | ||||
|   if (typeof fastestDomain === 'string') { | ||||
|     logger(`pick domain: ${fastestDomain}`); | ||||
|     availableDomain = fastestDomain; | ||||
|   } else { | ||||
|     logger('all remote domains failed'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| export default function getHost() { | ||||
|   return `https://${availableDomain}/api`; | ||||
| } | ||||
							
								
								
									
										1
									
								
								lib/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								lib/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @@ -19,7 +19,6 @@ export interface UpdateAvailableResult { | ||||
|   hash: string; | ||||
|   description: string; | ||||
|   metaInfo: string; | ||||
|   updateUrl: string; | ||||
|   pdiffUrl: string; | ||||
|   diffUrl: string; | ||||
| } | ||||
|   | ||||
							
								
								
									
										18
									
								
								lib/index.js
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								lib/index.js
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| import getHost, { tryBackupDomains } from './getHost'; | ||||
| import { NativeAppEventEmitter, NativeModules } from 'react-native'; | ||||
| const Pushy = NativeModules.Pushy || {}; | ||||
|  | ||||
| const host = 'https://update.reactnative.cn/api'; | ||||
| const Pushy = NativeModules.Pushy || {}; | ||||
|  | ||||
| export const downloadRootDir = Pushy.downloadRootDir; | ||||
| export const packageVersion = Pushy.packageVersion; | ||||
| @@ -28,7 +28,6 @@ There is available update: | ||||
|   hash: 'hash', | ||||
|   description: '添加聊天功能\n修复商城页面BUG', | ||||
|   metaInfo: '{"silent":true}', | ||||
|   updateUrl: 'http://update-packages.reactnative.cn/hash', | ||||
|   pdiffUrl: 'http://update-packages.reactnative.cn/hash', | ||||
|   diffUrl: 'http://update-packages.reactnative.cn/hash', | ||||
| } | ||||
| @@ -40,9 +39,11 @@ function assertRelease() { | ||||
|   } | ||||
| } | ||||
|  | ||||
| export async function checkUpdate(APPKEY) { | ||||
| export async function checkUpdate(APPKEY, isRetry) { | ||||
|   assertRelease(); | ||||
|   const resp = await fetch(`${host}/checkUpdate/${APPKEY}`, { | ||||
|   let resp; | ||||
|   try { | ||||
|     resp = await fetch(`${getHost()}/checkUpdate/${APPKEY}`, { | ||||
|       method: 'POST', | ||||
|       headers: { | ||||
|         Accept: 'application/json', | ||||
| @@ -54,6 +55,13 @@ export async function checkUpdate(APPKEY) { | ||||
|         buildTime, | ||||
|       }), | ||||
|     }); | ||||
|   } catch (e) { | ||||
|     if (isRetry) { | ||||
|       throw new Error('Could not connect to pushy server'); | ||||
|     } | ||||
|     await tryBackupDomains(); | ||||
|     return checkUpdate(APPKEY, true); | ||||
|   } | ||||
|  | ||||
|   if (resp.status !== 200) { | ||||
|     throw new Error((await resp.json()).message); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 sunnylqm
					sunnylqm