unplugin-https-reverse-proxy 4.0.0 → 4.0.1
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/dist/{chunk-K7HSLE6X.js → chunk-QURDG7SD.js} +19 -0
- package/dist/chunk-RSBXFJ3Z.js +232 -0
- package/dist/esbuild.cjs +243 -0
- package/dist/esbuild.js +2 -1
- package/dist/hmr-sse-bridge.cjs +258 -0
- package/dist/hmr-sse-bridge.d.cts +10 -0
- package/dist/hmr-sse-bridge.d.ts +10 -0
- package/dist/hmr-sse-bridge.js +8 -0
- package/dist/index.cjs +243 -0
- package/dist/index.js +2 -1
- package/dist/nuxt.cjs +131 -0
- package/dist/nuxt.js +2 -1
- package/dist/rollup.cjs +243 -0
- package/dist/rollup.js +2 -1
- package/dist/rspack.cjs +243 -0
- package/dist/rspack.js +2 -1
- package/dist/vite.cjs +243 -0
- package/dist/vite.js +2 -1
- package/dist/webpack.cjs +243 -0
- package/dist/webpack.js +2 -1
- package/package.json +1 -1
- package/src/hmr-sse-bridge.ts +266 -0
- package/src/index.ts +20 -0
package/dist/vite.cjs
CHANGED
|
@@ -14087,9 +14087,238 @@ ${line}
|
|
|
14087
14087
|
}
|
|
14088
14088
|
};
|
|
14089
14089
|
|
|
14090
|
+
// src/hmr-sse-bridge.ts
|
|
14091
|
+
var SSE_PATH = "/__hmr_sse";
|
|
14092
|
+
var SEND_PATH = "/__hmr_send";
|
|
14093
|
+
var MAX_POST_BODY = 64 * 1024;
|
|
14094
|
+
function setupHmrSseBridge(server) {
|
|
14095
|
+
const sseClients = /* @__PURE__ */ new Set();
|
|
14096
|
+
const originalSend = server.ws.send.bind(server.ws);
|
|
14097
|
+
server.ws.send = (...args2) => {
|
|
14098
|
+
;
|
|
14099
|
+
originalSend(...args2);
|
|
14100
|
+
let payload;
|
|
14101
|
+
if (typeof args2[0] === "string") {
|
|
14102
|
+
payload = JSON.stringify({ type: "custom", event: args2[0], data: args2[1] });
|
|
14103
|
+
} else {
|
|
14104
|
+
payload = JSON.stringify(args2[0]);
|
|
14105
|
+
}
|
|
14106
|
+
for (const res of sseClients) {
|
|
14107
|
+
try {
|
|
14108
|
+
res.write(`data: ${payload}
|
|
14109
|
+
|
|
14110
|
+
`);
|
|
14111
|
+
} catch {
|
|
14112
|
+
sseClients.delete(res);
|
|
14113
|
+
}
|
|
14114
|
+
}
|
|
14115
|
+
};
|
|
14116
|
+
server.middlewares.use((req, res, next2) => {
|
|
14117
|
+
var _a4;
|
|
14118
|
+
const url2 = (_a4 = req.url) == null ? void 0 : _a4.split("?")[0];
|
|
14119
|
+
if (url2 === SSE_PATH && req.method === "GET") {
|
|
14120
|
+
handleSseConnection(req, res, sseClients);
|
|
14121
|
+
return;
|
|
14122
|
+
}
|
|
14123
|
+
if (url2 === SEND_PATH && req.method === "POST") {
|
|
14124
|
+
handleClientMessage(req, res, server);
|
|
14125
|
+
return;
|
|
14126
|
+
}
|
|
14127
|
+
next2();
|
|
14128
|
+
});
|
|
14129
|
+
}
|
|
14130
|
+
function handleSseConnection(_req, res, sseClients) {
|
|
14131
|
+
res.writeHead(200, {
|
|
14132
|
+
"Content-Type": "text/event-stream",
|
|
14133
|
+
"Cache-Control": "no-cache",
|
|
14134
|
+
"Connection": "keep-alive"
|
|
14135
|
+
});
|
|
14136
|
+
res.write(`data: ${JSON.stringify({ type: "connected" })}
|
|
14137
|
+
|
|
14138
|
+
`);
|
|
14139
|
+
sseClients.add(res);
|
|
14140
|
+
const keepAlive = setInterval(() => {
|
|
14141
|
+
try {
|
|
14142
|
+
res.write(": ping\n\n");
|
|
14143
|
+
} catch {
|
|
14144
|
+
cleanup();
|
|
14145
|
+
}
|
|
14146
|
+
}, 3e4);
|
|
14147
|
+
function cleanup() {
|
|
14148
|
+
clearInterval(keepAlive);
|
|
14149
|
+
sseClients.delete(res);
|
|
14150
|
+
}
|
|
14151
|
+
res.on("close", cleanup);
|
|
14152
|
+
res.on("error", cleanup);
|
|
14153
|
+
}
|
|
14154
|
+
function handleClientMessage(req, res, server) {
|
|
14155
|
+
let body = "";
|
|
14156
|
+
let overflow = false;
|
|
14157
|
+
req.on("data", (chunk) => {
|
|
14158
|
+
body += chunk.toString();
|
|
14159
|
+
if (body.length > MAX_POST_BODY) {
|
|
14160
|
+
overflow = true;
|
|
14161
|
+
req.destroy();
|
|
14162
|
+
}
|
|
14163
|
+
});
|
|
14164
|
+
req.on("end", () => {
|
|
14165
|
+
var _a4, _b3, _c2, _d2, _e;
|
|
14166
|
+
if (overflow) {
|
|
14167
|
+
res.writeHead(413);
|
|
14168
|
+
res.end('{"ok":false}');
|
|
14169
|
+
return;
|
|
14170
|
+
}
|
|
14171
|
+
try {
|
|
14172
|
+
const data = JSON.parse(body);
|
|
14173
|
+
if (data.type === "custom" && data.event) {
|
|
14174
|
+
const dummyClient = {
|
|
14175
|
+
send: (...args2) => {
|
|
14176
|
+
server.ws.send(...args2);
|
|
14177
|
+
}
|
|
14178
|
+
};
|
|
14179
|
+
(_e = (_d2 = (_c2 = (_b3 = (_a4 = server.environments) == null ? void 0 : _a4.client) == null ? void 0 : _b3.hot) == null ? void 0 : _c2.api) == null ? void 0 : _d2.emit) == null ? void 0 : _e.call(_d2, data.event, data.data, dummyClient);
|
|
14180
|
+
}
|
|
14181
|
+
res.writeHead(200, {
|
|
14182
|
+
"Content-Type": "application/json"
|
|
14183
|
+
});
|
|
14184
|
+
res.end('{"ok":true}');
|
|
14185
|
+
} catch {
|
|
14186
|
+
res.writeHead(400);
|
|
14187
|
+
res.end('{"ok":false}');
|
|
14188
|
+
}
|
|
14189
|
+
});
|
|
14190
|
+
}
|
|
14191
|
+
var hmrSseBridgeClientScript = `
|
|
14192
|
+
(function() {
|
|
14193
|
+
// Activate when served over HTTPS to bypass WSS self-signed cert issues
|
|
14194
|
+
if (location.protocol !== 'https:') return;
|
|
14195
|
+
|
|
14196
|
+
var OriginalWebSocket = window.WebSocket;
|
|
14197
|
+
|
|
14198
|
+
function SseWebSocket(originalUrl) {
|
|
14199
|
+
var self = this;
|
|
14200
|
+
// WebSocket readyState constants on instance
|
|
14201
|
+
self.CONNECTING = 0;
|
|
14202
|
+
self.OPEN = 1;
|
|
14203
|
+
self.CLOSING = 2;
|
|
14204
|
+
self.CLOSED = 3;
|
|
14205
|
+
self.readyState = 0;
|
|
14206
|
+
self.onopen = null;
|
|
14207
|
+
self.onmessage = null;
|
|
14208
|
+
self.onclose = null;
|
|
14209
|
+
self.onerror = null;
|
|
14210
|
+
self.bufferedAmount = 0;
|
|
14211
|
+
self.extensions = '';
|
|
14212
|
+
self.binaryType = 'blob';
|
|
14213
|
+
self.protocol = 'vite-hmr';
|
|
14214
|
+
self.url = originalUrl;
|
|
14215
|
+
self._listeners = {};
|
|
14216
|
+
self._opened = false;
|
|
14217
|
+
|
|
14218
|
+
var sseUrl = location.origin + '${SSE_PATH}';
|
|
14219
|
+
var sendUrl = location.origin + '${SEND_PATH}';
|
|
14220
|
+
self._sendUrl = sendUrl;
|
|
14221
|
+
|
|
14222
|
+
var es = new EventSource(sseUrl);
|
|
14223
|
+
self._es = es;
|
|
14224
|
+
|
|
14225
|
+
es.onopen = function() {
|
|
14226
|
+
if (self._opened) return;
|
|
14227
|
+
self._opened = true;
|
|
14228
|
+
self.readyState = 1;
|
|
14229
|
+
var evt = new Event('open');
|
|
14230
|
+
if (self.onopen) self.onopen(evt);
|
|
14231
|
+
self._emit('open', evt);
|
|
14232
|
+
};
|
|
14233
|
+
|
|
14234
|
+
es.onmessage = function(e) {
|
|
14235
|
+
var evt = new MessageEvent('message', { data: e.data });
|
|
14236
|
+
if (self.onmessage) self.onmessage(evt);
|
|
14237
|
+
self._emit('message', evt);
|
|
14238
|
+
};
|
|
14239
|
+
|
|
14240
|
+
es.onerror = function() {
|
|
14241
|
+
// EventSource auto-reconnects on error; don't treat as fatal close
|
|
14242
|
+
// Only emit error event, never close event (SSE handles reconnect internally)
|
|
14243
|
+
if (self.readyState >= 2) return;
|
|
14244
|
+
// EventSource auto-reconnects; no action needed
|
|
14245
|
+
};
|
|
14246
|
+
}
|
|
14247
|
+
|
|
14248
|
+
SseWebSocket.prototype.send = function(data) {
|
|
14249
|
+
if (this.readyState !== 1) return;
|
|
14250
|
+
fetch(this._sendUrl, {
|
|
14251
|
+
method: 'POST',
|
|
14252
|
+
headers: { 'Content-Type': 'application/json' },
|
|
14253
|
+
body: data
|
|
14254
|
+
}).catch(function() {});
|
|
14255
|
+
};
|
|
14256
|
+
|
|
14257
|
+
SseWebSocket.prototype.close = function() {
|
|
14258
|
+
if (this.readyState >= 2) return;
|
|
14259
|
+
this.readyState = 3;
|
|
14260
|
+
if (this._es) this._es.close();
|
|
14261
|
+
var evt = new CloseEvent('close', { code: 1000, reason: '', wasClean: true });
|
|
14262
|
+
if (this.onclose) this.onclose(evt);
|
|
14263
|
+
this._emit('close', evt);
|
|
14264
|
+
};
|
|
14265
|
+
|
|
14266
|
+
SseWebSocket.prototype.addEventListener = function(type, fn, options) {
|
|
14267
|
+
if (!this._listeners[type]) this._listeners[type] = [];
|
|
14268
|
+
var entry = { fn: fn, once: !!(options && options.once) };
|
|
14269
|
+
this._listeners[type].push(entry);
|
|
14270
|
+
};
|
|
14271
|
+
|
|
14272
|
+
SseWebSocket.prototype.removeEventListener = function(type, fn) {
|
|
14273
|
+
var list = this._listeners[type];
|
|
14274
|
+
if (!list) return;
|
|
14275
|
+
this._listeners[type] = list.filter(function(e) { return e.fn !== fn; });
|
|
14276
|
+
};
|
|
14277
|
+
|
|
14278
|
+
SseWebSocket.prototype.dispatchEvent = function(evt) {
|
|
14279
|
+
this._emit(evt.type, evt);
|
|
14280
|
+
return true;
|
|
14281
|
+
};
|
|
14282
|
+
|
|
14283
|
+
SseWebSocket.prototype._emit = function(type, evt) {
|
|
14284
|
+
var list = this._listeners[type];
|
|
14285
|
+
if (!list) return;
|
|
14286
|
+
var remaining = [];
|
|
14287
|
+
list.forEach(function(entry) {
|
|
14288
|
+
entry.fn(evt);
|
|
14289
|
+
if (!entry.once) remaining.push(entry);
|
|
14290
|
+
});
|
|
14291
|
+
this._listeners[type] = remaining;
|
|
14292
|
+
};
|
|
14293
|
+
|
|
14294
|
+
function PatchedWebSocket(url, protocols) {
|
|
14295
|
+
// Only intercept Vite HMR connections (protocol 'vite-hmr')
|
|
14296
|
+
var isViteHmr = protocols === 'vite-hmr'
|
|
14297
|
+
|| (Array.isArray(protocols) && protocols.indexOf('vite-hmr') !== -1);
|
|
14298
|
+
if (!isViteHmr) {
|
|
14299
|
+
if (protocols !== undefined) {
|
|
14300
|
+
return new OriginalWebSocket(url, protocols);
|
|
14301
|
+
}
|
|
14302
|
+
return new OriginalWebSocket(url);
|
|
14303
|
+
}
|
|
14304
|
+
return new SseWebSocket(url);
|
|
14305
|
+
}
|
|
14306
|
+
|
|
14307
|
+
PatchedWebSocket.CONNECTING = 0;
|
|
14308
|
+
PatchedWebSocket.OPEN = 1;
|
|
14309
|
+
PatchedWebSocket.CLOSING = 2;
|
|
14310
|
+
PatchedWebSocket.CLOSED = 3;
|
|
14311
|
+
PatchedWebSocket.prototype = Object.create(OriginalWebSocket.prototype);
|
|
14312
|
+
PatchedWebSocket.prototype.constructor = PatchedWebSocket;
|
|
14313
|
+
|
|
14314
|
+
window.WebSocket = PatchedWebSocket;
|
|
14315
|
+
})();
|
|
14316
|
+
`;
|
|
14317
|
+
|
|
14090
14318
|
// src/index.ts
|
|
14091
14319
|
var config;
|
|
14092
14320
|
var caddy;
|
|
14321
|
+
var hmrSseBridgeActive = false;
|
|
14093
14322
|
var cwd = import_node_process5.default.cwd();
|
|
14094
14323
|
function colorUrl(url2) {
|
|
14095
14324
|
return import_picocolors2.default.green(url2.replace(/:(\d+)\//, (_, port) => `:${import_picocolors2.default.bold(port)}/`));
|
|
@@ -14176,6 +14405,20 @@ var unpluginFactory = (options) => ({
|
|
|
14176
14405
|
}
|
|
14177
14406
|
const base = server.config.base || "/";
|
|
14178
14407
|
server.printUrls = () => vitePrintUrls(options, source, target, base, _printUrls);
|
|
14408
|
+
if (options.https) {
|
|
14409
|
+
setupHmrSseBridge(server);
|
|
14410
|
+
hmrSseBridgeActive = true;
|
|
14411
|
+
consola.info("HMR SSE bridge enabled for iOS Safari WSS workaround");
|
|
14412
|
+
}
|
|
14413
|
+
},
|
|
14414
|
+
transformIndexHtml() {
|
|
14415
|
+
if (!hmrSseBridgeActive)
|
|
14416
|
+
return [];
|
|
14417
|
+
return [{
|
|
14418
|
+
tag: "script",
|
|
14419
|
+
children: hmrSseBridgeClientScript,
|
|
14420
|
+
injectTo: "head-prepend"
|
|
14421
|
+
}];
|
|
14179
14422
|
}
|
|
14180
14423
|
},
|
|
14181
14424
|
webpack(compiler) {
|
package/dist/vite.js
CHANGED
package/dist/webpack.cjs
CHANGED
|
@@ -14087,9 +14087,238 @@ ${line}
|
|
|
14087
14087
|
}
|
|
14088
14088
|
};
|
|
14089
14089
|
|
|
14090
|
+
// src/hmr-sse-bridge.ts
|
|
14091
|
+
var SSE_PATH = "/__hmr_sse";
|
|
14092
|
+
var SEND_PATH = "/__hmr_send";
|
|
14093
|
+
var MAX_POST_BODY = 64 * 1024;
|
|
14094
|
+
function setupHmrSseBridge(server) {
|
|
14095
|
+
const sseClients = /* @__PURE__ */ new Set();
|
|
14096
|
+
const originalSend = server.ws.send.bind(server.ws);
|
|
14097
|
+
server.ws.send = (...args2) => {
|
|
14098
|
+
;
|
|
14099
|
+
originalSend(...args2);
|
|
14100
|
+
let payload;
|
|
14101
|
+
if (typeof args2[0] === "string") {
|
|
14102
|
+
payload = JSON.stringify({ type: "custom", event: args2[0], data: args2[1] });
|
|
14103
|
+
} else {
|
|
14104
|
+
payload = JSON.stringify(args2[0]);
|
|
14105
|
+
}
|
|
14106
|
+
for (const res of sseClients) {
|
|
14107
|
+
try {
|
|
14108
|
+
res.write(`data: ${payload}
|
|
14109
|
+
|
|
14110
|
+
`);
|
|
14111
|
+
} catch {
|
|
14112
|
+
sseClients.delete(res);
|
|
14113
|
+
}
|
|
14114
|
+
}
|
|
14115
|
+
};
|
|
14116
|
+
server.middlewares.use((req, res, next2) => {
|
|
14117
|
+
var _a4;
|
|
14118
|
+
const url2 = (_a4 = req.url) == null ? void 0 : _a4.split("?")[0];
|
|
14119
|
+
if (url2 === SSE_PATH && req.method === "GET") {
|
|
14120
|
+
handleSseConnection(req, res, sseClients);
|
|
14121
|
+
return;
|
|
14122
|
+
}
|
|
14123
|
+
if (url2 === SEND_PATH && req.method === "POST") {
|
|
14124
|
+
handleClientMessage(req, res, server);
|
|
14125
|
+
return;
|
|
14126
|
+
}
|
|
14127
|
+
next2();
|
|
14128
|
+
});
|
|
14129
|
+
}
|
|
14130
|
+
function handleSseConnection(_req, res, sseClients) {
|
|
14131
|
+
res.writeHead(200, {
|
|
14132
|
+
"Content-Type": "text/event-stream",
|
|
14133
|
+
"Cache-Control": "no-cache",
|
|
14134
|
+
"Connection": "keep-alive"
|
|
14135
|
+
});
|
|
14136
|
+
res.write(`data: ${JSON.stringify({ type: "connected" })}
|
|
14137
|
+
|
|
14138
|
+
`);
|
|
14139
|
+
sseClients.add(res);
|
|
14140
|
+
const keepAlive = setInterval(() => {
|
|
14141
|
+
try {
|
|
14142
|
+
res.write(": ping\n\n");
|
|
14143
|
+
} catch {
|
|
14144
|
+
cleanup();
|
|
14145
|
+
}
|
|
14146
|
+
}, 3e4);
|
|
14147
|
+
function cleanup() {
|
|
14148
|
+
clearInterval(keepAlive);
|
|
14149
|
+
sseClients.delete(res);
|
|
14150
|
+
}
|
|
14151
|
+
res.on("close", cleanup);
|
|
14152
|
+
res.on("error", cleanup);
|
|
14153
|
+
}
|
|
14154
|
+
function handleClientMessage(req, res, server) {
|
|
14155
|
+
let body = "";
|
|
14156
|
+
let overflow = false;
|
|
14157
|
+
req.on("data", (chunk) => {
|
|
14158
|
+
body += chunk.toString();
|
|
14159
|
+
if (body.length > MAX_POST_BODY) {
|
|
14160
|
+
overflow = true;
|
|
14161
|
+
req.destroy();
|
|
14162
|
+
}
|
|
14163
|
+
});
|
|
14164
|
+
req.on("end", () => {
|
|
14165
|
+
var _a4, _b3, _c2, _d2, _e;
|
|
14166
|
+
if (overflow) {
|
|
14167
|
+
res.writeHead(413);
|
|
14168
|
+
res.end('{"ok":false}');
|
|
14169
|
+
return;
|
|
14170
|
+
}
|
|
14171
|
+
try {
|
|
14172
|
+
const data = JSON.parse(body);
|
|
14173
|
+
if (data.type === "custom" && data.event) {
|
|
14174
|
+
const dummyClient = {
|
|
14175
|
+
send: (...args2) => {
|
|
14176
|
+
server.ws.send(...args2);
|
|
14177
|
+
}
|
|
14178
|
+
};
|
|
14179
|
+
(_e = (_d2 = (_c2 = (_b3 = (_a4 = server.environments) == null ? void 0 : _a4.client) == null ? void 0 : _b3.hot) == null ? void 0 : _c2.api) == null ? void 0 : _d2.emit) == null ? void 0 : _e.call(_d2, data.event, data.data, dummyClient);
|
|
14180
|
+
}
|
|
14181
|
+
res.writeHead(200, {
|
|
14182
|
+
"Content-Type": "application/json"
|
|
14183
|
+
});
|
|
14184
|
+
res.end('{"ok":true}');
|
|
14185
|
+
} catch {
|
|
14186
|
+
res.writeHead(400);
|
|
14187
|
+
res.end('{"ok":false}');
|
|
14188
|
+
}
|
|
14189
|
+
});
|
|
14190
|
+
}
|
|
14191
|
+
var hmrSseBridgeClientScript = `
|
|
14192
|
+
(function() {
|
|
14193
|
+
// Activate when served over HTTPS to bypass WSS self-signed cert issues
|
|
14194
|
+
if (location.protocol !== 'https:') return;
|
|
14195
|
+
|
|
14196
|
+
var OriginalWebSocket = window.WebSocket;
|
|
14197
|
+
|
|
14198
|
+
function SseWebSocket(originalUrl) {
|
|
14199
|
+
var self = this;
|
|
14200
|
+
// WebSocket readyState constants on instance
|
|
14201
|
+
self.CONNECTING = 0;
|
|
14202
|
+
self.OPEN = 1;
|
|
14203
|
+
self.CLOSING = 2;
|
|
14204
|
+
self.CLOSED = 3;
|
|
14205
|
+
self.readyState = 0;
|
|
14206
|
+
self.onopen = null;
|
|
14207
|
+
self.onmessage = null;
|
|
14208
|
+
self.onclose = null;
|
|
14209
|
+
self.onerror = null;
|
|
14210
|
+
self.bufferedAmount = 0;
|
|
14211
|
+
self.extensions = '';
|
|
14212
|
+
self.binaryType = 'blob';
|
|
14213
|
+
self.protocol = 'vite-hmr';
|
|
14214
|
+
self.url = originalUrl;
|
|
14215
|
+
self._listeners = {};
|
|
14216
|
+
self._opened = false;
|
|
14217
|
+
|
|
14218
|
+
var sseUrl = location.origin + '${SSE_PATH}';
|
|
14219
|
+
var sendUrl = location.origin + '${SEND_PATH}';
|
|
14220
|
+
self._sendUrl = sendUrl;
|
|
14221
|
+
|
|
14222
|
+
var es = new EventSource(sseUrl);
|
|
14223
|
+
self._es = es;
|
|
14224
|
+
|
|
14225
|
+
es.onopen = function() {
|
|
14226
|
+
if (self._opened) return;
|
|
14227
|
+
self._opened = true;
|
|
14228
|
+
self.readyState = 1;
|
|
14229
|
+
var evt = new Event('open');
|
|
14230
|
+
if (self.onopen) self.onopen(evt);
|
|
14231
|
+
self._emit('open', evt);
|
|
14232
|
+
};
|
|
14233
|
+
|
|
14234
|
+
es.onmessage = function(e) {
|
|
14235
|
+
var evt = new MessageEvent('message', { data: e.data });
|
|
14236
|
+
if (self.onmessage) self.onmessage(evt);
|
|
14237
|
+
self._emit('message', evt);
|
|
14238
|
+
};
|
|
14239
|
+
|
|
14240
|
+
es.onerror = function() {
|
|
14241
|
+
// EventSource auto-reconnects on error; don't treat as fatal close
|
|
14242
|
+
// Only emit error event, never close event (SSE handles reconnect internally)
|
|
14243
|
+
if (self.readyState >= 2) return;
|
|
14244
|
+
// EventSource auto-reconnects; no action needed
|
|
14245
|
+
};
|
|
14246
|
+
}
|
|
14247
|
+
|
|
14248
|
+
SseWebSocket.prototype.send = function(data) {
|
|
14249
|
+
if (this.readyState !== 1) return;
|
|
14250
|
+
fetch(this._sendUrl, {
|
|
14251
|
+
method: 'POST',
|
|
14252
|
+
headers: { 'Content-Type': 'application/json' },
|
|
14253
|
+
body: data
|
|
14254
|
+
}).catch(function() {});
|
|
14255
|
+
};
|
|
14256
|
+
|
|
14257
|
+
SseWebSocket.prototype.close = function() {
|
|
14258
|
+
if (this.readyState >= 2) return;
|
|
14259
|
+
this.readyState = 3;
|
|
14260
|
+
if (this._es) this._es.close();
|
|
14261
|
+
var evt = new CloseEvent('close', { code: 1000, reason: '', wasClean: true });
|
|
14262
|
+
if (this.onclose) this.onclose(evt);
|
|
14263
|
+
this._emit('close', evt);
|
|
14264
|
+
};
|
|
14265
|
+
|
|
14266
|
+
SseWebSocket.prototype.addEventListener = function(type, fn, options) {
|
|
14267
|
+
if (!this._listeners[type]) this._listeners[type] = [];
|
|
14268
|
+
var entry = { fn: fn, once: !!(options && options.once) };
|
|
14269
|
+
this._listeners[type].push(entry);
|
|
14270
|
+
};
|
|
14271
|
+
|
|
14272
|
+
SseWebSocket.prototype.removeEventListener = function(type, fn) {
|
|
14273
|
+
var list = this._listeners[type];
|
|
14274
|
+
if (!list) return;
|
|
14275
|
+
this._listeners[type] = list.filter(function(e) { return e.fn !== fn; });
|
|
14276
|
+
};
|
|
14277
|
+
|
|
14278
|
+
SseWebSocket.prototype.dispatchEvent = function(evt) {
|
|
14279
|
+
this._emit(evt.type, evt);
|
|
14280
|
+
return true;
|
|
14281
|
+
};
|
|
14282
|
+
|
|
14283
|
+
SseWebSocket.prototype._emit = function(type, evt) {
|
|
14284
|
+
var list = this._listeners[type];
|
|
14285
|
+
if (!list) return;
|
|
14286
|
+
var remaining = [];
|
|
14287
|
+
list.forEach(function(entry) {
|
|
14288
|
+
entry.fn(evt);
|
|
14289
|
+
if (!entry.once) remaining.push(entry);
|
|
14290
|
+
});
|
|
14291
|
+
this._listeners[type] = remaining;
|
|
14292
|
+
};
|
|
14293
|
+
|
|
14294
|
+
function PatchedWebSocket(url, protocols) {
|
|
14295
|
+
// Only intercept Vite HMR connections (protocol 'vite-hmr')
|
|
14296
|
+
var isViteHmr = protocols === 'vite-hmr'
|
|
14297
|
+
|| (Array.isArray(protocols) && protocols.indexOf('vite-hmr') !== -1);
|
|
14298
|
+
if (!isViteHmr) {
|
|
14299
|
+
if (protocols !== undefined) {
|
|
14300
|
+
return new OriginalWebSocket(url, protocols);
|
|
14301
|
+
}
|
|
14302
|
+
return new OriginalWebSocket(url);
|
|
14303
|
+
}
|
|
14304
|
+
return new SseWebSocket(url);
|
|
14305
|
+
}
|
|
14306
|
+
|
|
14307
|
+
PatchedWebSocket.CONNECTING = 0;
|
|
14308
|
+
PatchedWebSocket.OPEN = 1;
|
|
14309
|
+
PatchedWebSocket.CLOSING = 2;
|
|
14310
|
+
PatchedWebSocket.CLOSED = 3;
|
|
14311
|
+
PatchedWebSocket.prototype = Object.create(OriginalWebSocket.prototype);
|
|
14312
|
+
PatchedWebSocket.prototype.constructor = PatchedWebSocket;
|
|
14313
|
+
|
|
14314
|
+
window.WebSocket = PatchedWebSocket;
|
|
14315
|
+
})();
|
|
14316
|
+
`;
|
|
14317
|
+
|
|
14090
14318
|
// src/index.ts
|
|
14091
14319
|
var config;
|
|
14092
14320
|
var caddy;
|
|
14321
|
+
var hmrSseBridgeActive = false;
|
|
14093
14322
|
var cwd = import_node_process5.default.cwd();
|
|
14094
14323
|
function colorUrl(url2) {
|
|
14095
14324
|
return import_picocolors2.default.green(url2.replace(/:(\d+)\//, (_, port) => `:${import_picocolors2.default.bold(port)}/`));
|
|
@@ -14176,6 +14405,20 @@ var unpluginFactory = (options) => ({
|
|
|
14176
14405
|
}
|
|
14177
14406
|
const base = server.config.base || "/";
|
|
14178
14407
|
server.printUrls = () => vitePrintUrls(options, source, target, base, _printUrls);
|
|
14408
|
+
if (options.https) {
|
|
14409
|
+
setupHmrSseBridge(server);
|
|
14410
|
+
hmrSseBridgeActive = true;
|
|
14411
|
+
consola.info("HMR SSE bridge enabled for iOS Safari WSS workaround");
|
|
14412
|
+
}
|
|
14413
|
+
},
|
|
14414
|
+
transformIndexHtml() {
|
|
14415
|
+
if (!hmrSseBridgeActive)
|
|
14416
|
+
return [];
|
|
14417
|
+
return [{
|
|
14418
|
+
tag: "script",
|
|
14419
|
+
children: hmrSseBridgeClientScript,
|
|
14420
|
+
injectTo: "head-prepend"
|
|
14421
|
+
}];
|
|
14179
14422
|
}
|
|
14180
14423
|
},
|
|
14181
14424
|
webpack(compiler) {
|
package/dist/webpack.js
CHANGED