unplugin-https-reverse-proxy 4.0.3 → 4.1.0-beta.2

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.
Files changed (53) hide show
  1. package/README.md +30 -6
  2. package/dist/{chunk-MD5CVZP7.js → chunk-7CA3EIIX.js} +682 -224
  3. package/dist/{chunk-RSBXFJ3Z.js → chunk-C5A7XLKL.js} +9 -2
  4. package/dist/{chunk-2P7SUCQ3.js → chunk-EY3HXBJ4.js} +0 -26
  5. package/dist/chunk-RKHJN6KY.js +53 -0
  6. package/dist/esbuild.cjs +790 -303
  7. package/dist/esbuild.js +4 -3
  8. package/dist/hmr-sse-bridge.cjs +12 -4
  9. package/dist/hmr-sse-bridge.d.cts +4 -3
  10. package/dist/hmr-sse-bridge.d.ts +4 -3
  11. package/dist/hmr-sse-bridge.js +5 -3
  12. package/dist/index.cjs +790 -303
  13. package/dist/index.js +4 -3
  14. package/dist/nuxt.cjs +787 -292
  15. package/dist/nuxt.js +5 -9
  16. package/dist/privileged-helper.cjs +668 -0
  17. package/dist/privileged-helper.d.cts +2 -0
  18. package/dist/privileged-helper.d.ts +2 -0
  19. package/dist/privileged-helper.js +641 -0
  20. package/dist/rollup.cjs +790 -303
  21. package/dist/rollup.js +4 -3
  22. package/dist/rspack.cjs +790 -303
  23. package/dist/rspack.js +4 -3
  24. package/dist/utils.cjs +0 -28
  25. package/dist/utils.d.cts +1 -3
  26. package/dist/utils.d.ts +1 -3
  27. package/dist/utils.js +1 -5
  28. package/dist/vite.cjs +790 -303
  29. package/dist/vite.js +4 -3
  30. package/dist/webpack.cjs +790 -303
  31. package/dist/webpack.js +4 -3
  32. package/package.json +1 -4
  33. package/src/caddy/caddyfile.ts +1 -0
  34. package/src/caddy/index.ts +183 -110
  35. package/src/caddy/privileged.ts +118 -0
  36. package/src/caddy/utils.ts +0 -43
  37. package/src/hmr-sse-bridge.ts +14 -3
  38. package/src/index.ts +4 -18
  39. package/src/nuxt.ts +1 -6
  40. package/src/privileged/bootstrap.ts +174 -0
  41. package/src/privileged/client.ts +287 -0
  42. package/src/privileged/entry.ts +45 -0
  43. package/src/privileged/hosts-file.ts +142 -0
  44. package/src/privileged/launch.ts +193 -0
  45. package/src/privileged/ports.ts +45 -0
  46. package/src/privileged/protocol.ts +111 -0
  47. package/src/privileged/server.ts +465 -0
  48. package/src/privileged/session.ts +114 -0
  49. package/src/privileged/validation.ts +38 -0
  50. package/src/privileged/windows-elevation.ts +80 -0
  51. package/src/privileged-helper.ts +109 -0
  52. package/src/utils.ts +0 -28
  53. package/src/host/index.ts +0 -52
package/dist/esbuild.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  unpluginFactory
3
- } from "./chunk-MD5CVZP7.js";
4
- import "./chunk-RSBXFJ3Z.js";
5
- import "./chunk-2P7SUCQ3.js";
3
+ } from "./chunk-7CA3EIIX.js";
4
+ import "./chunk-EY3HXBJ4.js";
5
+ import "./chunk-C5A7XLKL.js";
6
+ import "./chunk-RKHJN6KY.js";
6
7
 
7
8
  // src/esbuild.ts
8
9
  import { createEsbuildPlugin } from "unplugin";
@@ -21,7 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var hmr_sse_bridge_exports = {};
22
22
  __export(hmr_sse_bridge_exports, {
23
23
  hmrSseBridgeClientScript: () => hmrSseBridgeClientScript,
24
- setupHmrSseBridge: () => setupHmrSseBridge
24
+ setupHmrSseBridge: () => setupHmrSseBridge,
25
+ shouldUseHmrSseBridge: () => shouldUseHmrSseBridge
25
26
  });
26
27
  module.exports = __toCommonJS(hmr_sse_bridge_exports);
27
28
  var SSE_PATH = "/__hmr_sse";
@@ -124,10 +125,16 @@ function handleClientMessage(req, res, server) {
124
125
  }
125
126
  });
126
127
  }
128
+ function shouldUseHmrSseBridge(protocol, userAgent) {
129
+ if (protocol !== "https:")
130
+ return false;
131
+ const isApplePlatform = /Macintosh|iPhone|iPad|iPod/.test(userAgent);
132
+ const isSafari = /Version\//.test(userAgent) && /Safari\//.test(userAgent) && !/(?:Chrome|Chromium|CriOS|Edg|EdgiOS|OPR|OPiOS|Firefox|FxiOS)\//.test(userAgent);
133
+ return isApplePlatform && isSafari;
134
+ }
127
135
  var hmrSseBridgeClientScript = `
128
136
  (function() {
129
- // Activate when served over HTTPS to bypass WSS self-signed cert issues
130
- if (location.protocol !== 'https:') return;
137
+ if (!(${shouldUseHmrSseBridge.toString()})(location.protocol, navigator.userAgent)) return;
131
138
 
132
139
  var OriginalWebSocket = window.WebSocket;
133
140
 
@@ -253,6 +260,7 @@ var hmrSseBridgeClientScript = `
253
260
  // Annotate the CommonJS export names for ESM import in node:
254
261
  0 && (module.exports = {
255
262
  hmrSseBridgeClientScript,
256
- setupHmrSseBridge
263
+ setupHmrSseBridge,
264
+ shouldUseHmrSseBridge
257
265
  });
258
266
  exports.default = module.exports;
@@ -1,10 +1,11 @@
1
1
  import { ViteDevServer } from 'vite';
2
2
 
3
3
  declare function setupHmrSseBridge(server: ViteDevServer): void;
4
+ declare function shouldUseHmrSseBridge(protocol: string, userAgent: string): boolean;
4
5
  /**
5
- * Client-side script that patches WebSocket to use SSE+fetch on iOS Safari.
6
+ * Client-side script that patches WebSocket to use SSE+fetch on macOS/iOS Safari.
6
7
  * This script is injected via Vite's transformIndexHtml hook.
7
8
  */
8
- declare const hmrSseBridgeClientScript = "\n(function() {\n // Activate when served over HTTPS to bypass WSS self-signed cert issues\n if (location.protocol !== 'https:') return;\n\n var OriginalWebSocket = window.WebSocket;\n\n function SseWebSocket(originalUrl) {\n var self = this;\n // WebSocket readyState constants on instance\n self.CONNECTING = 0;\n self.OPEN = 1;\n self.CLOSING = 2;\n self.CLOSED = 3;\n self.readyState = 0;\n self.onopen = null;\n self.onmessage = null;\n self.onclose = null;\n self.onerror = null;\n self.bufferedAmount = 0;\n self.extensions = '';\n self.binaryType = 'blob';\n self.protocol = 'vite-hmr';\n self.url = originalUrl;\n self._listeners = {};\n self._opened = false;\n\n var sseUrl = location.origin + '/__hmr_sse';\n var sendUrl = location.origin + '/__hmr_send';\n self._sendUrl = sendUrl;\n\n var es = new EventSource(sseUrl);\n self._es = es;\n\n es.onopen = function() {\n if (self._opened) return;\n self._opened = true;\n self.readyState = 1;\n var evt = new Event('open');\n if (self.onopen) self.onopen(evt);\n self._emit('open', evt);\n };\n\n es.onmessage = function(e) {\n var evt = new MessageEvent('message', { data: e.data });\n if (self.onmessage) self.onmessage(evt);\n self._emit('message', evt);\n };\n\n es.onerror = function() {\n // EventSource auto-reconnects on error; don't treat as fatal close\n // Only emit error event, never close event (SSE handles reconnect internally)\n if (self.readyState >= 2) return;\n // EventSource auto-reconnects; no action needed\n };\n }\n\n SseWebSocket.prototype.send = function(data) {\n if (this.readyState !== 1) return;\n fetch(this._sendUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: data\n }).catch(function() {});\n };\n\n SseWebSocket.prototype.close = function() {\n if (this.readyState >= 2) return;\n this.readyState = 3;\n if (this._es) this._es.close();\n var evt = new CloseEvent('close', { code: 1000, reason: '', wasClean: true });\n if (this.onclose) this.onclose(evt);\n this._emit('close', evt);\n };\n\n SseWebSocket.prototype.addEventListener = function(type, fn, options) {\n if (!this._listeners[type]) this._listeners[type] = [];\n var entry = { fn: fn, once: !!(options && options.once) };\n this._listeners[type].push(entry);\n };\n\n SseWebSocket.prototype.removeEventListener = function(type, fn) {\n var list = this._listeners[type];\n if (!list) return;\n this._listeners[type] = list.filter(function(e) { return e.fn !== fn; });\n };\n\n SseWebSocket.prototype.dispatchEvent = function(evt) {\n this._emit(evt.type, evt);\n return true;\n };\n\n SseWebSocket.prototype._emit = function(type, evt) {\n var list = this._listeners[type];\n if (!list) return;\n var remaining = [];\n list.forEach(function(entry) {\n entry.fn(evt);\n if (!entry.once) remaining.push(entry);\n });\n this._listeners[type] = remaining;\n };\n\n function PatchedWebSocket(url, protocols) {\n // Only intercept Vite HMR connections (protocol 'vite-hmr')\n var isViteHmr = protocols === 'vite-hmr'\n || (Array.isArray(protocols) && protocols.indexOf('vite-hmr') !== -1);\n if (!isViteHmr) {\n if (protocols !== undefined) {\n return new OriginalWebSocket(url, protocols);\n }\n return new OriginalWebSocket(url);\n }\n return new SseWebSocket(url);\n }\n\n PatchedWebSocket.CONNECTING = 0;\n PatchedWebSocket.OPEN = 1;\n PatchedWebSocket.CLOSING = 2;\n PatchedWebSocket.CLOSED = 3;\n PatchedWebSocket.prototype = Object.create(OriginalWebSocket.prototype);\n PatchedWebSocket.prototype.constructor = PatchedWebSocket;\n\n window.WebSocket = PatchedWebSocket;\n})();\n";
9
+ declare const hmrSseBridgeClientScript: string;
9
10
 
10
- export { hmrSseBridgeClientScript, setupHmrSseBridge };
11
+ export { hmrSseBridgeClientScript, setupHmrSseBridge, shouldUseHmrSseBridge };
@@ -1,10 +1,11 @@
1
1
  import { ViteDevServer } from 'vite';
2
2
 
3
3
  declare function setupHmrSseBridge(server: ViteDevServer): void;
4
+ declare function shouldUseHmrSseBridge(protocol: string, userAgent: string): boolean;
4
5
  /**
5
- * Client-side script that patches WebSocket to use SSE+fetch on iOS Safari.
6
+ * Client-side script that patches WebSocket to use SSE+fetch on macOS/iOS Safari.
6
7
  * This script is injected via Vite's transformIndexHtml hook.
7
8
  */
8
- declare const hmrSseBridgeClientScript = "\n(function() {\n // Activate when served over HTTPS to bypass WSS self-signed cert issues\n if (location.protocol !== 'https:') return;\n\n var OriginalWebSocket = window.WebSocket;\n\n function SseWebSocket(originalUrl) {\n var self = this;\n // WebSocket readyState constants on instance\n self.CONNECTING = 0;\n self.OPEN = 1;\n self.CLOSING = 2;\n self.CLOSED = 3;\n self.readyState = 0;\n self.onopen = null;\n self.onmessage = null;\n self.onclose = null;\n self.onerror = null;\n self.bufferedAmount = 0;\n self.extensions = '';\n self.binaryType = 'blob';\n self.protocol = 'vite-hmr';\n self.url = originalUrl;\n self._listeners = {};\n self._opened = false;\n\n var sseUrl = location.origin + '/__hmr_sse';\n var sendUrl = location.origin + '/__hmr_send';\n self._sendUrl = sendUrl;\n\n var es = new EventSource(sseUrl);\n self._es = es;\n\n es.onopen = function() {\n if (self._opened) return;\n self._opened = true;\n self.readyState = 1;\n var evt = new Event('open');\n if (self.onopen) self.onopen(evt);\n self._emit('open', evt);\n };\n\n es.onmessage = function(e) {\n var evt = new MessageEvent('message', { data: e.data });\n if (self.onmessage) self.onmessage(evt);\n self._emit('message', evt);\n };\n\n es.onerror = function() {\n // EventSource auto-reconnects on error; don't treat as fatal close\n // Only emit error event, never close event (SSE handles reconnect internally)\n if (self.readyState >= 2) return;\n // EventSource auto-reconnects; no action needed\n };\n }\n\n SseWebSocket.prototype.send = function(data) {\n if (this.readyState !== 1) return;\n fetch(this._sendUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: data\n }).catch(function() {});\n };\n\n SseWebSocket.prototype.close = function() {\n if (this.readyState >= 2) return;\n this.readyState = 3;\n if (this._es) this._es.close();\n var evt = new CloseEvent('close', { code: 1000, reason: '', wasClean: true });\n if (this.onclose) this.onclose(evt);\n this._emit('close', evt);\n };\n\n SseWebSocket.prototype.addEventListener = function(type, fn, options) {\n if (!this._listeners[type]) this._listeners[type] = [];\n var entry = { fn: fn, once: !!(options && options.once) };\n this._listeners[type].push(entry);\n };\n\n SseWebSocket.prototype.removeEventListener = function(type, fn) {\n var list = this._listeners[type];\n if (!list) return;\n this._listeners[type] = list.filter(function(e) { return e.fn !== fn; });\n };\n\n SseWebSocket.prototype.dispatchEvent = function(evt) {\n this._emit(evt.type, evt);\n return true;\n };\n\n SseWebSocket.prototype._emit = function(type, evt) {\n var list = this._listeners[type];\n if (!list) return;\n var remaining = [];\n list.forEach(function(entry) {\n entry.fn(evt);\n if (!entry.once) remaining.push(entry);\n });\n this._listeners[type] = remaining;\n };\n\n function PatchedWebSocket(url, protocols) {\n // Only intercept Vite HMR connections (protocol 'vite-hmr')\n var isViteHmr = protocols === 'vite-hmr'\n || (Array.isArray(protocols) && protocols.indexOf('vite-hmr') !== -1);\n if (!isViteHmr) {\n if (protocols !== undefined) {\n return new OriginalWebSocket(url, protocols);\n }\n return new OriginalWebSocket(url);\n }\n return new SseWebSocket(url);\n }\n\n PatchedWebSocket.CONNECTING = 0;\n PatchedWebSocket.OPEN = 1;\n PatchedWebSocket.CLOSING = 2;\n PatchedWebSocket.CLOSED = 3;\n PatchedWebSocket.prototype = Object.create(OriginalWebSocket.prototype);\n PatchedWebSocket.prototype.constructor = PatchedWebSocket;\n\n window.WebSocket = PatchedWebSocket;\n})();\n";
9
+ declare const hmrSseBridgeClientScript: string;
9
10
 
10
- export { hmrSseBridgeClientScript, setupHmrSseBridge };
11
+ export { hmrSseBridgeClientScript, setupHmrSseBridge, shouldUseHmrSseBridge };
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  hmrSseBridgeClientScript,
3
- setupHmrSseBridge
4
- } from "./chunk-RSBXFJ3Z.js";
3
+ setupHmrSseBridge,
4
+ shouldUseHmrSseBridge
5
+ } from "./chunk-C5A7XLKL.js";
5
6
  export {
6
7
  hmrSseBridgeClientScript,
7
- setupHmrSseBridge
8
+ setupHmrSseBridge,
9
+ shouldUseHmrSseBridge
8
10
  };