Skip to content

Commit b84f1ec

Browse files
committed
feat: ensure restore hosts on vite
1 parent e7ea26c commit b84f1ec

File tree

6 files changed

+158
-131
lines changed

6 files changed

+158
-131
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ module.exports = {
5656
port: 443,
5757
},
5858
},
59+
setupExitSignals: true,
5960
},
6061
plugins: [
6162
require('unplugin-https-reverse-proxy/webpack')({ /* options */ })
@@ -96,6 +97,7 @@ module.exports = {
9697
port: 443,
9798
},
9899
},
100+
setupExitSignals: true,
99101
},
100102
configureWebpack: {
101103
plugins: [

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
"consola": "^3.2.3",
119119
"esno": "^0.17.0",
120120
"got-cjs": "^12.5.4",
121-
"hostile": "^1.3.3",
121+
"hosts-so-easy": "^1.2.9",
122122
"http-proxy-agent": "^7.0.0",
123123
"https-proxy-agent": "^7.0.2",
124124
"kill-port": "^2.0.1",
@@ -130,7 +130,6 @@
130130
"@antfu/eslint-config": "^0.40.2",
131131
"@nuxt/kit": "^3.6.5",
132132
"@nuxt/schema": "^3.6.5",
133-
"@types/hostile": "^1.3.3",
134133
"@types/kill-port": "^2.0.3",
135134
"@types/node": "^20.5.2",
136135
"bumpp": "^9.2.0",

pnpm-lock.yaml

Lines changed: 21 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/caddy/index.ts

Lines changed: 64 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@ import { spawn } from 'node:child_process'
55
import { got } from 'got-cjs'
66
import { HttpProxyAgent } from 'http-proxy-agent'
77
import { 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'
911
import kill from 'kill-port'
1012
import { consola } from '../utils'
1113
import { caddyPath, supportList } from './constants'
1214
import { logProgress, logProgressOver, tryPort } from './utils'
1315

16+
const Hosts = _Hosts.default || _Hosts
17+
1418
export 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

9094
export 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

Comments
 (0)