1+ import got , { Response } from 'got' ;
2+
3+ interface ConnCheckRawResult {
4+ url : string ;
5+ ok : boolean ;
6+ }
7+
8+ export async function connCheck ( task ?: any ) : Promise < void > {
9+ // set proxy?
10+ if ( task ) {
11+ task . title = "正在检查网络状况..." ;
12+ }
13+
14+ const urlBase : Record < string , string > = {
15+ "https://cdn.iflyos.cn/public/cskTools/conntest.txt" : "聆思资源服务" ,
16+ "https://pypi.tuna.tsinghua.edu.cn/simple/numpy" : "PyPI 软件仓库(TUNA 镜像站)" ,
17+ "https://registry.npmmirror.com" : "NPMMirror 镜像站"
18+ } ;
19+
20+ const urls = Object . keys ( urlBase ) ;
21+ const checkResult = await parallelHttpsCheck ( urls ) ;
22+ const failedUrls = checkResult . filter ( result => ! result . ok ) ;
23+ if ( failedUrls . length > 0 ) {
24+ const failedItems = failedUrls . map ( result => urlBase [ result . url ] ) . join ( ', ' ) ;
25+ throw new Error ( `资源访问失败,请检查网络连接是否正常。item = ${ failedItems } ` ) ;
26+ }
27+ }
28+
29+ async function parallelHttpsCheck ( urls : string [ ] ) : Promise < ConnCheckRawResult [ ] > {
30+ const results = await Promise . allSettled (
31+ urls . map ( url =>
32+ got ( url , {
33+ timeout : 3000 ,
34+ headers : {
35+ 'User-Agent' : 'Mozilla/5.0 (LISA zephyr plugin/2.1.0)'
36+ } ,
37+ throwHttpErrors : true
38+ } ) . then ( ( response : Response ) => {
39+ const status = response . statusCode ;
40+ return {
41+ url,
42+ ok : ( status >= 200 && status < 310 ) || status === 401 ,
43+ } ;
44+ } ) . catch ( ( ) => ( {
45+ url,
46+ ok : false
47+ } ) )
48+ )
49+ ) ;
50+
51+ return results . map ( result => {
52+ if ( result . status === 'fulfilled' ) {
53+ return result . value ;
54+ }
55+ return {
56+ url : urls [ results . indexOf ( result ) ] ,
57+ ok : false ,
58+ } ;
59+ } ) ;
60+ }
0 commit comments