unplugin-https-reverse-proxy 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -56,6 +56,7 @@ module.exports = {
56
56
  port: 443,
57
57
  },
58
58
  },
59
+ setupExitSignals: true,
59
60
  },
60
61
  plugins: [
61
62
  require('unplugin-https-reverse-proxy/webpack')({ /* options */ })
@@ -96,6 +97,7 @@ module.exports = {
96
97
  port: 443,
97
98
  },
98
99
  },
100
+ setupExitSignals: true,
99
101
  },
100
102
  configureWebpack: {
101
103
  plugins: [
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  unpluginFactory
3
- } from "./chunk-WUSTJHAZ.js";
3
+ } from "./chunk-DH6VMKTP.js";
4
4
 
5
5
  // src/vite.ts
6
6
  import { createVitePlugin } from "unplugin";
@@ -0,0 +1,37 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+
18
+ // src/utils.ts
19
+ import { createConsola } from "consola";
20
+ var consola = createConsola({
21
+ level: 3
22
+ }).withTag("reverse-proxy");
23
+ function once(fn) {
24
+ let called = false;
25
+ return (...args) => {
26
+ if (called)
27
+ return;
28
+ called = true;
29
+ return fn(...args);
30
+ };
31
+ }
32
+
33
+ export {
34
+ __spreadValues,
35
+ consola,
36
+ once
37
+ };
@@ -1,6 +1,8 @@
1
1
  import {
2
- consola
3
- } from "./chunk-3HKPYCSE.js";
2
+ __spreadValues,
3
+ consola,
4
+ once
5
+ } from "./chunk-CQC5SSJR.js";
4
6
 
5
7
  // src/index.ts
6
8
  import process3 from "process";
@@ -15,7 +17,7 @@ import { spawn } from "child_process";
15
17
  import { got } from "got-cjs";
16
18
  import { HttpProxyAgent } from "http-proxy-agent";
17
19
  import { HttpsProxyAgent } from "https-proxy-agent";
18
- import * as hostile from "hostile";
20
+ import _Hosts from "hosts-so-easy";
19
21
  import kill from "kill-port";
20
22
 
21
23
  // src/caddy/constants.ts
@@ -137,6 +139,8 @@ var supportList = [
137
139
 
138
140
  // src/caddy/utils.ts
139
141
  import { createServer } from "net";
142
+ import ora from "ora";
143
+ var spinner;
140
144
  function tryPort(port) {
141
145
  return new Promise((resolve, reject) => {
142
146
  try {
@@ -155,8 +159,41 @@ function tryPort(port) {
155
159
  }
156
160
  });
157
161
  }
162
+ function getNumber(number) {
163
+ if (number <= 0)
164
+ return "0%";
165
+ else if (number < 100)
166
+ return `${number.toFixed(2)}%`;
167
+ else
168
+ return "100%";
169
+ }
170
+ function logProgress(percent) {
171
+ if (!spinner) {
172
+ consola.log("");
173
+ spinner = ora({
174
+ text: "Start Download Caddy: 0%",
175
+ indent: 2
176
+ });
177
+ spinner.start();
178
+ } else {
179
+ spinner.text = `Download Caddy: ${getNumber(Number(percent) * 100)}`;
180
+ }
181
+ }
182
+ function logProgressOver() {
183
+ if (!spinner) {
184
+ spinner = ora({
185
+ text: "Start Download Caddy: 100%",
186
+ indent: 2
187
+ });
188
+ spinner.start();
189
+ } else {
190
+ spinner.succeed();
191
+ consola.log("");
192
+ }
193
+ }
158
194
 
159
195
  // src/caddy/index.ts
196
+ var Hosts = _Hosts.default || _Hosts;
160
197
  async function download() {
161
198
  if (await testCaddy())
162
199
  return caddyPath;
@@ -180,7 +217,10 @@ async function download() {
180
217
  http: httpAgent,
181
218
  https: httpsAgent
182
219
  }
220
+ }).on("downloadProgress", (progress) => {
221
+ logProgress(progress.percent);
183
222
  }).pipe(file).on("finish", () => {
223
+ logProgressOver();
184
224
  if (process2.platform === "win32")
185
225
  return resolve(caddyPath);
186
226
  chmodSync(caddyPath, 493);
@@ -195,7 +235,7 @@ function testCaddy() {
195
235
  if (!existsSync(caddyPath))
196
236
  return resolve(false);
197
237
  chmodSync(caddyPath, 493);
198
- const child = process2.platform === "win32" ? spawn(caddyPath, []) : spawn("sudo", [caddyPath]);
238
+ const child = process2.platform === "win32" ? spawn(caddyPath, []) : spawn("sudo", ["-E", caddyPath]);
199
239
  child.on("close", () => {
200
240
  return resolve(false);
201
241
  });
@@ -210,6 +250,8 @@ function testCaddy() {
210
250
  var CaddyInstant = class {
211
251
  constructor() {
212
252
  this.inited = false;
253
+ this.stoped = false;
254
+ this.host = new Hosts();
213
255
  testCaddy().then(() => {
214
256
  this.inited = true;
215
257
  });
@@ -218,52 +260,46 @@ var CaddyInstant = class {
218
260
  await download();
219
261
  this.inited = true;
220
262
  }
221
- async updateHost(ip, host) {
263
+ updateHost(ip, host) {
222
264
  ["localhost", "0.0.0.0"].includes(ip) && (ip = "127.0.0.1");
265
+ this.host.add(ip, host);
223
266
  return new Promise((resolve, reject) => {
224
- hostile.set(ip, host, (err) => {
225
- if (err) {
226
- return reject(err);
227
- } else {
228
- if (process2.platform === "win32") {
229
- spawn("ipconfig", ["/flushdns"]).on("error", (err2) => {
230
- return reject(err2);
231
- }).on("close", () => {
232
- resolve(true);
233
- });
234
- } else {
235
- spawn("sudo", ["killall", "-HUP", "mDNSResponder"]).on("error", (err2) => {
236
- return reject(err2);
237
- }).on("close", () => {
238
- resolve(true);
239
- });
240
- }
241
- }
242
- });
267
+ if (process2.platform === "win32") {
268
+ spawn("ipconfig", ["/flushdns"]).on("error", (err) => {
269
+ consola.error(err);
270
+ return resolve(false);
271
+ }).on("close", () => {
272
+ resolve(true);
273
+ });
274
+ } else {
275
+ spawn("sudo", ["-E", "killall", "-HUP", "mDNSResponder"]).on("error", (err) => {
276
+ consola.error(err);
277
+ return resolve(false);
278
+ }).on("close", () => {
279
+ resolve(true);
280
+ });
281
+ }
243
282
  });
244
283
  }
245
- async restoreHost(ip, host) {
284
+ restoreHost(ip, host) {
246
285
  ["localhost", "0.0.0.0"].includes(ip) && (ip = "127.0.0.1");
286
+ this.host.remove(ip, host);
247
287
  return new Promise((resolve, reject) => {
248
- hostile.remove(ip, host, (err) => {
249
- if (err) {
250
- return reject(err);
251
- } else {
252
- if (process2.platform === "win32") {
253
- spawn("ipconfig", ["/flushdns"]).on("error", (err2) => {
254
- return reject(err2);
255
- }).on("close", () => {
256
- resolve(true);
257
- });
258
- } else {
259
- spawn("sudo", ["killall", "-HUP", "mDNSResponder"]).on("error", (err2) => {
260
- return reject(err2);
261
- }).on("close", () => {
262
- resolve(true);
263
- });
264
- }
265
- }
266
- });
288
+ if (process2.platform === "win32") {
289
+ spawn("ipconfig", ["/flushdns"]).on("error", (err) => {
290
+ consola.error(err);
291
+ return resolve(false);
292
+ }).on("close", () => {
293
+ resolve(true);
294
+ });
295
+ } else {
296
+ spawn("sudo", ["-E", "killall", "-HUP", "mDNSResponder"]).on("error", (err) => {
297
+ consola.error(err);
298
+ return resolve(false);
299
+ }).on("close", () => {
300
+ resolve(true);
301
+ });
302
+ }
267
303
  });
268
304
  }
269
305
  /**
@@ -280,14 +316,15 @@ var CaddyInstant = class {
280
316
  } = options || {};
281
317
  if (!this.inited)
282
318
  await this.init();
283
- if (!await this.updateHost(source.split(":")[0], target.split(":")[0]))
284
- throw new Error("update host failed");
285
319
  if (await tryPort(443))
286
320
  await kill(443, "tcp");
287
321
  if (process2.platform === "win32" && await tryPort(80))
288
322
  await kill(80, "tcp");
323
+ if (!await this.updateHost(source.split(":")[0], target.split(":")[0]))
324
+ throw new Error("update host failed");
325
+ consola.success("update host success\n");
289
326
  return new Promise((resolve, reject) => {
290
- const child = process2.platform !== "win32" ? spawn("sudo", [caddyPath, "reverse-proxy", "--from", `${target.split(":")[0]}`, "--to", `${source}`, "--internal-certs"]) : spawn(caddyPath, ["reverse-proxy", "--from", `${target.split(":")[0]}`, "--to", `${source}`, "--internal-certs"]);
327
+ const child = process2.platform !== "win32" ? spawn("sudo", ["-E", caddyPath, "reverse-proxy", "--from", `${target.split(":")[0]}`, "--to", `${source}`, "--internal-certs"]) : spawn(caddyPath, ["reverse-proxy", "--from", `${target.split(":")[0]}`, "--to", `${source}`, "--internal-certs"]);
291
328
  child.on("error", (err) => {
292
329
  return reject(err);
293
330
  });
@@ -303,14 +340,21 @@ var CaddyInstant = class {
303
340
  });
304
341
  child.stdout.on("data", (_data) => {
305
342
  consola.info(_data.toString());
306
- resolve(async () => {
307
- if (!restore)
343
+ resolve(async (callback) => {
344
+ if (!restore || this.stoped)
308
345
  return;
309
- if (await this.restoreHost(source.split(":")[0], target.split(":")[0]))
310
- consola.success("restore host success\n");
311
- else
346
+ try {
347
+ if (await this.restoreHost(source.split(":")[0], target.split(":")[0]))
348
+ consola.success("restore host success\n");
349
+ else
350
+ consola.fail("restore host failed\n");
351
+ } catch (e) {
352
+ consola.error(e);
312
353
  consola.fail("restore host failed\n");
354
+ }
355
+ this.stoped = true;
313
356
  child.kill();
357
+ callback && callback();
314
358
  });
315
359
  });
316
360
  });
@@ -320,12 +364,53 @@ var CaddyInstant = class {
320
364
  // src/index.ts
321
365
  var config;
322
366
  var caddy;
367
+ var _stop;
368
+ var _servce;
369
+ function registerExit(clear) {
370
+ process3.on("beforeExit", async (_code) => {
371
+ await clear();
372
+ });
373
+ process3.on("uncaughtException", async (err) => {
374
+ console.error("An uncaught error occurred!", err.stack);
375
+ await clear();
376
+ process3.nextTick(() => {
377
+ process3.exit(1);
378
+ });
379
+ });
380
+ process3.on("unhandledRejection", async (reason, promise) => {
381
+ console.error("Unhandled Rejection at:", promise, "reason:", reason);
382
+ await clear();
383
+ process3.nextTick(() => {
384
+ process3.exit(1);
385
+ });
386
+ });
387
+ process3.once("SIGINT", async () => {
388
+ await clear();
389
+ process3.emit("SIGINT");
390
+ });
391
+ process3.once("SIGTERM", async () => {
392
+ await clear();
393
+ process3.emit("SIGTERM");
394
+ });
395
+ }
323
396
  var unpluginFactory = (options) => ({
324
397
  name: "unplugin-https-reverse-proxy",
325
- enforce: "post",
398
+ enforce: "pre",
326
399
  vite: {
327
400
  configResolved(_config) {
328
401
  config = _config;
402
+ registerExit(async () => {
403
+ var _a;
404
+ try {
405
+ _servce && _servce.close();
406
+ (_a = _servce.httpServer) == null ? void 0 : _a.close(async () => {
407
+ _stop && await _stop();
408
+ });
409
+ _stop && await _stop();
410
+ } catch (e) {
411
+ consola.error(e);
412
+ }
413
+ });
329
414
  },
330
415
  configureServer(server) {
331
416
  const {
@@ -338,6 +423,7 @@ var unpluginFactory = (options) => ({
338
423
  consola.fail("please provide target");
339
424
  return;
340
425
  }
426
+ _servce = server;
341
427
  const _printUrls = server.printUrls;
342
428
  server.printUrls = () => {
343
429
  var _a;
@@ -350,18 +436,16 @@ var unpluginFactory = (options) => ({
350
436
  }
351
437
  const base = server.config.base || "/";
352
438
  try {
353
- const caddy2 = new CaddyInstant();
354
- caddy2.run(source, target, {
439
+ if (caddy)
440
+ return;
441
+ caddy = new CaddyInstant();
442
+ caddy.run(source, target, {
355
443
  base,
356
444
  showCaddyLog: options.showCaddyLog
357
445
  }).then((stop) => {
358
446
  const colorUrl = (url2) => c.green(url2.replace(/:(\d+)\//, (_, port) => `:${c.bold(port)}/`));
359
447
  consola.success(` ${c.green("\u279C")} ${c.bold("run caddy reverse proxy success")}: ${colorUrl(`https://${target}${base}`)}`);
360
- process3.on("SIGINT", async () => {
361
- await stop();
362
- server.close();
363
- process3.exit();
364
- });
448
+ !_stop && (_stop = once(stop));
365
449
  }).catch((e) => {
366
450
  throw e;
367
451
  });
@@ -369,6 +453,9 @@ var unpluginFactory = (options) => ({
369
453
  consola.error(e);
370
454
  }
371
455
  };
456
+ },
457
+ async buildEnd() {
458
+ _stop && await _stop();
372
459
  }
373
460
  },
374
461
  webpack(compiler) {
@@ -383,23 +470,39 @@ var unpluginFactory = (options) => ({
383
470
  return;
384
471
  }
385
472
  try {
386
- const devServer = compiler.options.devServer || process3.VUE_CLI_SERVICE.projectOptions.devServer;
387
- const source = `${(devServer == null ? void 0 : devServer.host) || "127.0.0.1"}:${(devServer == null ? void 0 : devServer.port) || "8080"}`;
473
+ registerExit(async () => {
474
+ try {
475
+ _stop && await _stop();
476
+ } catch (e) {
477
+ consola.error(e);
478
+ }
479
+ });
480
+ const devServer = __spreadValues(__spreadValues({
481
+ host: "127.0.0.1",
482
+ port: 8080
483
+ }, compiler.options.devServer), process3.VUE_CLI_SERVICE.projectOptions.devServer);
484
+ const source = `${devServer.host}:${devServer.port}`;
388
485
  if (caddy)
389
486
  return;
487
+ const _close = compiler.close.bind(compiler);
488
+ compiler.close = async (callback) => {
489
+ try {
490
+ _stop && await _stop(() => {
491
+ _close && _close(callback);
492
+ });
493
+ } catch (e) {
494
+ consola.error(e);
495
+ process3.exit(1);
496
+ }
497
+ };
390
498
  caddy = new CaddyInstant();
391
499
  caddy.run(source, target, {
392
500
  showCaddyLog: options.showCaddyLog
393
501
  }).then((stop) => {
394
502
  const colorUrl = (url) => c.green(url.replace(/:(\d+)\//, (_, port) => `:${c.bold(port)}/`));
395
- compiler.hooks.done.tap("unplugin-https-reverse-proxy", (stats) => {
396
- if (stats.hasErrors())
397
- return;
503
+ compiler.hooks.done.tap("unplugin-https-reverse-proxy", () => {
398
504
  consola.success(` ${c.green("\u279C")} ${c.bold("run caddy reverse proxy success")}: ${colorUrl(`https://${target}`)}`);
399
- });
400
- process3.on("SIGINT", async () => {
401
- await stop();
402
- process3.exit();
505
+ !_stop && (_stop = once(stop));
403
506
  });
404
507
  }).catch((e) => {
405
508
  throw e;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  unpluginFactory
3
- } from "./chunk-WUSTJHAZ.js";
3
+ } from "./chunk-DH6VMKTP.js";
4
4
 
5
5
  // src/webpack.ts
6
6
  import { createWebpackPlugin } from "unplugin";