@@ -5,12 +5,16 @@ import { spawn } from 'node:child_process'
55import { got } from 'got-cjs'
66import { HttpProxyAgent } from 'http-proxy-agent'
77import { HttpsProxyAgent } from 'https-proxy-agent'
8- import * as hostile from 'hostile'
8+
9+ // @ts -expect-error no type
10+ import _Hosts from 'hosts-so-easy'
911import kill from 'kill-port'
1012import { consola } from '../utils'
1113import { caddyPath , supportList } from './constants'
1214import { logProgress , logProgressOver , tryPort } from './utils'
1315
16+ const Hosts = _Hosts . default || _Hosts
17+
1418export async function download ( ) {
1519 if ( await testCaddy ( ) )
1620 return caddyPath
@@ -68,7 +72,7 @@ function testCaddy() {
6872 if ( ! existsSync ( caddyPath ) )
6973 return resolve ( false )
7074 chmodSync ( caddyPath , 0o755 )
71- const child = process . platform === 'win32' ? spawn ( caddyPath , [ ] ) : spawn ( 'sudo' , [ caddyPath ] )
75+ const child = process . platform === 'win32' ? spawn ( caddyPath , [ ] ) : spawn ( 'sudo' , [ '-E' , caddyPath ] )
7276 child . on ( 'close' , ( ) => {
7377 return resolve ( false )
7478 } )
@@ -89,8 +93,11 @@ interface RunOptions {
8993
9094export class CaddyInstant {
9195 private inited = false
96+ private stoped = false
97+ private host : typeof Hosts
9298
9399 constructor ( ) {
100+ this . host = new Hosts ( )
94101 testCaddy ( ) . then ( ( ) => {
95102 this . inited = true
96103 } )
@@ -101,57 +108,49 @@ export class CaddyInstant {
101108 this . inited = true
102109 }
103110
104- private async updateHost ( ip : string , host : string ) {
111+ private updateHost ( ip : string , host : string ) {
105112 [ 'localhost' , '0.0.0.0' ] . includes ( ip ) && ( ip = '127.0.0.1' )
113+ this . host . add ( ip , host )
106114 return new Promise < boolean > ( ( resolve , reject ) => {
107- hostile . set ( ip , host , ( err ) => {
108- if ( err ) {
109- return reject ( err )
110- }
111- else {
112- if ( process . platform === 'win32' ) {
113- spawn ( 'ipconfig' , [ '/flushdns' ] ) . on ( 'error' , ( err ) => {
114- return reject ( err )
115- } ) . on ( 'close' , ( ) => {
116- resolve ( true )
117- } )
118- }
119- else {
120- spawn ( 'sudo' , [ 'killall' , '-HUP' , 'mDNSResponder' ] ) . on ( 'error' , ( err ) => {
121- return reject ( err )
122- } ) . on ( 'close' , ( ) => {
123- resolve ( true )
124- } )
125- }
126- }
127- } )
115+ if ( process . platform === 'win32' ) {
116+ spawn ( 'ipconfig' , [ '/flushdns' ] ) . on ( 'error' , ( err ) => {
117+ consola . error ( err )
118+ return resolve ( false )
119+ } ) . on ( 'close' , ( ) => {
120+ resolve ( true )
121+ } )
122+ }
123+ else {
124+ spawn ( 'sudo' , [ '-E' , 'killall' , '-HUP' , 'mDNSResponder' ] ) . on ( 'error' , ( err ) => {
125+ consola . error ( err )
126+ return resolve ( false )
127+ } ) . on ( 'close' , ( ) => {
128+ resolve ( true )
129+ } )
130+ }
128131 } )
129132 }
130133
131- private async restoreHost ( ip : string , host : string ) {
134+ private restoreHost ( ip : string , host : string ) {
132135 [ 'localhost' , '0.0.0.0' ] . includes ( ip ) && ( ip = '127.0.0.1' )
136+ this . host . remove ( ip , host )
133137 return new Promise < boolean > ( ( resolve , reject ) => {
134- hostile . remove ( ip , host , ( err ) => {
135- if ( err ) {
136- return reject ( err )
137- }
138- else {
139- if ( process . platform === 'win32' ) {
140- spawn ( 'ipconfig' , [ '/flushdns' ] ) . on ( 'error' , ( err ) => {
141- return reject ( err )
142- } ) . on ( 'close' , ( ) => {
143- resolve ( true )
144- } )
145- }
146- else {
147- spawn ( 'sudo' , [ 'killall' , '-HUP' , 'mDNSResponder' ] ) . on ( 'error' , ( err ) => {
148- return reject ( err )
149- } ) . on ( 'close' , ( ) => {
150- resolve ( true )
151- } )
152- }
153- }
154- } )
138+ if ( process . platform === 'win32' ) {
139+ spawn ( 'ipconfig' , [ '/flushdns' ] ) . on ( 'error' , ( err ) => {
140+ consola . error ( err )
141+ return resolve ( false )
142+ } ) . on ( 'close' , ( ) => {
143+ resolve ( true )
144+ } )
145+ }
146+ else {
147+ spawn ( 'sudo' , [ '-E' , 'killall' , '-HUP' , 'mDNSResponder' ] ) . on ( 'error' , ( err ) => {
148+ consola . error ( err )
149+ return resolve ( false )
150+ } ) . on ( 'close' , ( ) => {
151+ resolve ( true )
152+ } )
153+ }
155154 } )
156155 }
157156
@@ -171,18 +170,19 @@ export class CaddyInstant {
171170 if ( ! this . inited )
172171 await this . init ( )
173172
174- if ( ! await this . updateHost ( source . split ( ':' ) [ 0 ] , target . split ( ':' ) [ 0 ] ) )
175- throw new Error ( 'update host failed' )
176-
177173 if ( await tryPort ( 443 ) )
178174 await kill ( 443 , 'tcp' )
179175 if ( process . platform === 'win32' && await tryPort ( 80 ) )
180176 await kill ( 80 , 'tcp' )
181177
182- return new Promise < ( ) => Promise < void > > ( ( resolve , reject ) => {
178+ if ( ! await this . updateHost ( source . split ( ':' ) [ 0 ] , target . split ( ':' ) [ 0 ] ) )
179+ throw new Error ( 'update host failed' )
180+ consola . success ( 'update host success\n' )
181+
182+ return new Promise < ( callback ?: ( ) => any ) => Promise < void > > ( ( resolve , reject ) => {
183183 // caddy reverse-proxy --from target --to source --internal-certs
184184 const child = process . platform !== 'win32'
185- ? spawn ( 'sudo' , [ caddyPath , 'reverse-proxy' , '--from' , `${ target . split ( ':' ) [ 0 ] } ` , '--to' , `${ source } ` , '--internal-certs' ] )
185+ ? spawn ( 'sudo' , [ '-E' , caddyPath , 'reverse-proxy' , '--from' , `${ target . split ( ':' ) [ 0 ] } ` , '--to' , `${ source } ` , '--internal-certs' ] )
186186 : spawn ( caddyPath , [ 'reverse-proxy' , '--from' , `${ target . split ( ':' ) [ 0 ] } ` , '--to' , `${ source } ` , '--internal-certs' ] )
187187
188188 child . on ( 'error' , ( err ) => {
@@ -205,17 +205,25 @@ export class CaddyInstant {
205205
206206 child . stdout . on ( 'data' , ( _data ) => {
207207 consola . info ( _data . toString ( ) )
208- resolve ( async ( ) => {
209- if ( ! restore )
208+ resolve ( async ( callback ?: ( ) => any ) => {
209+ if ( ! restore || this . stoped )
210210 return
211211
212- if ( await this . restoreHost ( source . split ( ':' ) [ 0 ] , target . split ( ':' ) [ 0 ] ) )
213- consola . success ( 'restore host success\n' )
212+ try {
213+ if ( await this . restoreHost ( source . split ( ':' ) [ 0 ] , target . split ( ':' ) [ 0 ] ) )
214+ consola . success ( 'restore host success\n' )
214215
215- else
216+ else
217+ consola . fail ( 'restore host failed\n' )
218+ }
219+ catch ( e ) {
220+ consola . error ( e )
216221 consola . fail ( 'restore host failed\n' )
222+ }
217223
224+ this . stoped = true
218225 child . kill ( )
226+ callback && callback ( )
219227 } )
220228 } )
221229 } )
0 commit comments