mirror of
				https://gitcode.com/gh_mirrors/re/react-native-pushy.git
				synced 2025-10-31 21:33:12 +08:00 
			
		
		
		
	Add custom endpoints
This commit is contained in:
		
							
								
								
									
										1
									
								
								endpoints.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								endpoints.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | ["https://update.react-native.cn/api", "https://update.reactnative.cn/api"] | ||||||
							
								
								
									
										82
									
								
								lib/endpoint.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								lib/endpoint.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | let currentEndpoint = 'https://update.reactnative.cn/api'; | ||||||
|  |  | ||||||
|  | function ping(url, rejectImmediate) { | ||||||
|  |   return new Promise((resolve, reject) => { | ||||||
|  |     const xhr = new XMLHttpRequest(); | ||||||
|  |     xhr.onreadystatechange = (e) => { | ||||||
|  |       if (xhr.readyState !== 4) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       if (xhr.status === 200) { | ||||||
|  |         resolve(url); | ||||||
|  |       } else { | ||||||
|  |         rejectImmediate ? reject() : setTimeout(reject, 5000); | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |     xhr.open('HEAD', url); | ||||||
|  |     xhr.send(); | ||||||
|  |     xhr.timeout = 5000; | ||||||
|  |     xhr.ontimeout = reject; | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function logger(...args) { | ||||||
|  |   // console.warn('pushy', ...args); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | let backupEndpoints = []; | ||||||
|  | let backupEndpointsQueryUrl = | ||||||
|  |   'https://cdn.jsdelivr.net/gh/reactnativecn/react-native-pushy@master/endpoints.json'; | ||||||
|  |  | ||||||
|  | export async function tryBackupEndpoints() { | ||||||
|  |   try { | ||||||
|  |     await ping(getStatusUrl(), true); | ||||||
|  |     logger('current endpoint ok'); | ||||||
|  |     return; | ||||||
|  |   } catch (e) { | ||||||
|  |     logger('current endpoint failed'); | ||||||
|  |   } | ||||||
|  |   if (!backupEndpoints.length && backupEndpointsQueryUrl) { | ||||||
|  |     try { | ||||||
|  |       const resp = await fetch(backupEndpointsQueryUrl); | ||||||
|  |       backupEndpoints = await resp.json(); | ||||||
|  |       logger('get remote endpoints:', backupEndpoints); | ||||||
|  |     } catch (e) { | ||||||
|  |       logger('get remote endpoints failed'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   await pickFatestAvailableEndpoint(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | async function pickFatestAvailableEndpoint(endpoints = backupEndpoints) { | ||||||
|  |   const fastestEndpoint = await Promise.race( | ||||||
|  |     endpoints.map(pingAndReturnEndpoint), | ||||||
|  |   ); | ||||||
|  |   if (typeof fastestEndpoint === 'string') { | ||||||
|  |     logger(`pick endpoint: ${fastestEndpoint}`); | ||||||
|  |     currentEndpoint = fastestEndpoint; | ||||||
|  |   } else { | ||||||
|  |     logger('all remote endpoints failed'); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | async function pingAndReturnEndpoint(endpoint = currentEndpoint) { | ||||||
|  |   return ping(getStatusUrl(endpoint)).then(() => endpoint); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function getStatusUrl(endpoint = currentEndpoint) { | ||||||
|  |   return `${endpoint}/status`; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function getCheckUrl(APPKEY, endpoint = currentEndpoint) { | ||||||
|  |   return `${endpoint}/checkUpdate/${APPKEY}`; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export function setCustomEndpoints(mainEndpoint, backups) { | ||||||
|  |   currentEndpoint = mainEndpoint; | ||||||
|  |   if (Array.isArray(backups) && backups.length > 0) { | ||||||
|  |     backupEndpoints = backups; | ||||||
|  |     pickFatestAvailableEndpoint(); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,57 +0,0 @@ | |||||||
| let availableDomain = 'update.react-native.cn'; |  | ||||||
|  |  | ||||||
| function ping(domain, rejectImmediate) { |  | ||||||
|   return new Promise((resolve, reject) => { |  | ||||||
|     const xhr = new XMLHttpRequest(); |  | ||||||
|     xhr.onreadystatechange = e => { |  | ||||||
|       if (xhr.readyState !== 4) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
|       if (xhr.status === 200) { |  | ||||||
|         resolve(domain); |  | ||||||
|       } else { |  | ||||||
|         rejectImmediate ? reject() : 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, true); |  | ||||||
|     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`; |  | ||||||
| } |  | ||||||
							
								
								
									
										18
									
								
								lib/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								lib/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @@ -20,17 +20,27 @@ export interface UpdateAvailableResult { | |||||||
|   description: string; |   description: string; | ||||||
|   metaInfo: string; |   metaInfo: string; | ||||||
|   pdiffUrl: string; |   pdiffUrl: string; | ||||||
|   diffUrl: string; |   diffUrl?: string; | ||||||
| } | }; | ||||||
|  |  | ||||||
| export type CheckResult = Partial<ExpiredResult & UpTodateResult & UpdateAvailableResult>; | export type CheckResult = | ||||||
|  |   | ExpiredResult | ||||||
|  |   | UpTodateResult | ||||||
|  |   | UpdateAvailableResult; | ||||||
|  |  | ||||||
| export function checkUpdate(appkey: string): Promise<CheckResult>; | export function checkUpdate(appkey: string): Promise<CheckResult>; | ||||||
|  |  | ||||||
| export function downloadUpdate(options: UpdateAvailableResult): Promise<undefined | string>; | export function downloadUpdate( | ||||||
|  |   options: UpdateAvailableResult, | ||||||
|  | ): Promise<undefined | string>; | ||||||
|  |  | ||||||
| export function switchVersion(hash: string): void; | export function switchVersion(hash: string): void; | ||||||
|  |  | ||||||
| export function switchVersionLater(hash: string): void; | export function switchVersionLater(hash: string): void; | ||||||
|  |  | ||||||
| export function markSuccess(): void; | export function markSuccess(): void; | ||||||
|  |  | ||||||
|  | export function setCustomEndpoints( | ||||||
|  |   mainEndpoint: string, | ||||||
|  |   backupEndpoints?: string[], | ||||||
|  | ): void; | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								lib/index.js
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								lib/index.js
									
									
									
									
									
								
							| @@ -1,5 +1,6 @@ | |||||||
| import getHost, { tryBackupDomains } from './getHost'; | import { tryBackupEndpoints, getCheckUrl, setCustomEndpoints } from './endpoint'; | ||||||
| import { NativeAppEventEmitter, NativeModules } from 'react-native'; | import { NativeAppEventEmitter, NativeModules } from 'react-native'; | ||||||
|  | export { setCustomEndpoints }; | ||||||
|  |  | ||||||
| let Pushy = NativeModules.Pushy; | let Pushy = NativeModules.Pushy; | ||||||
|  |  | ||||||
| @@ -47,7 +48,7 @@ export async function checkUpdate(APPKEY, isRetry) { | |||||||
|   assertRelease(); |   assertRelease(); | ||||||
|   let resp; |   let resp; | ||||||
|   try { |   try { | ||||||
|     resp = await fetch(`${getHost()}/checkUpdate/${APPKEY}`, { |     resp = await fetch(getCheckUrl(APPKEY), { | ||||||
|       method: 'POST', |       method: 'POST', | ||||||
|       headers: { |       headers: { | ||||||
|         Accept: 'application/json', |         Accept: 'application/json', | ||||||
| @@ -63,7 +64,7 @@ export async function checkUpdate(APPKEY, isRetry) { | |||||||
|     if (isRetry) { |     if (isRetry) { | ||||||
|       throw new Error('Could not connect to pushy server'); |       throw new Error('Could not connect to pushy server'); | ||||||
|     } |     } | ||||||
|     await tryBackupDomains(); |     await tryBackupEndpoints(APPKEY); | ||||||
|     return checkUpdate(APPKEY, true); |     return checkUpdate(APPKEY, true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -91,11 +92,6 @@ export async function downloadUpdate(options) { | |||||||
|       updateUrl: options.pdiffUrl, |       updateUrl: options.pdiffUrl, | ||||||
|       hashName: options.hash, |       hashName: options.hash, | ||||||
|     }); |     }); | ||||||
|   } else { |  | ||||||
|     await Pushy.downloadUpdate({ |  | ||||||
|       updateUrl: options.updateUrl, |  | ||||||
|       hashName: options.hash, |  | ||||||
|     }); |  | ||||||
|   } |   } | ||||||
|   return options.hash; |   return options.hash; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 sunnylqm
					sunnylqm