@lark-apaas/coding-preset-vite-react 1.0.10-alpha.0 → 1.0.10-alpha.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.
- package/lib/plugins/dev-proxy.d.ts.map +1 -1
- package/lib/plugins/dev-proxy.js +19 -18
- package/lib/plugins/dev-proxy.js.map +1 -1
- package/lib/plugins/html-output.d.ts.map +1 -1
- package/lib/plugins/html-output.js +20 -4
- package/lib/plugins/html-output.js.map +1 -1
- package/lib/utils/proxy-error.d.ts +29 -0
- package/lib/utils/proxy-error.d.ts.map +1 -0
- package/lib/utils/proxy-error.js +158 -0
- package/lib/utils/proxy-error.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-proxy.d.ts","sourceRoot":"","sources":["../../src/plugins/dev-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-proxy.d.ts","sourceRoot":"","sources":["../../src/plugins/dev-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,MAAM,CAAC;AAUjD,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,CAgL1E;AAED,eAAe,cAAc,CAAC"}
|
package/lib/plugins/dev-proxy.js
CHANGED
|
@@ -61,18 +61,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
61
61
|
exports.devProxyPlugin = devProxyPlugin;
|
|
62
62
|
const http = __importStar(require("node:http"));
|
|
63
63
|
const local_dev_1 = require("../utils/local-dev");
|
|
64
|
-
|
|
65
|
-
if (res.headersSent)
|
|
66
|
-
return;
|
|
67
|
-
res.writeHead(502, {
|
|
68
|
-
'Content-Type': 'application/json; charset=utf-8',
|
|
69
|
-
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
70
|
-
});
|
|
71
|
-
res.end(JSON.stringify({
|
|
72
|
-
error: 'Bad Gateway',
|
|
73
|
-
message: 'Backend service is not running',
|
|
74
|
-
}));
|
|
75
|
-
}
|
|
64
|
+
const proxy_error_1 = require("../utils/proxy-error");
|
|
76
65
|
/**
|
|
77
66
|
* Vite plugin: 注入 dev server proxy 配置(仅 dev,build 时不挂)。
|
|
78
67
|
* 通过 `config()` hook 返回 `server.proxy` 让 vite mergeConfig 自动合并。
|
|
@@ -123,7 +112,9 @@ function devProxyPlugin(options = {}) {
|
|
|
123
112
|
: {}),
|
|
124
113
|
configure: (proxyServer) => {
|
|
125
114
|
proxyServer.on('error', (err, req, res) => {
|
|
126
|
-
|
|
115
|
+
(0, proxy_error_1.handleDevProxyError)(err, req, res, {
|
|
116
|
+
target: `http://localhost:${serverPort}`,
|
|
117
|
+
});
|
|
127
118
|
});
|
|
128
119
|
if (localDev) {
|
|
129
120
|
proxyServer.on('proxyReq', (proxyReq, req) => {
|
|
@@ -145,7 +136,9 @@ function devProxyPlugin(options = {}) {
|
|
|
145
136
|
changeOrigin: true,
|
|
146
137
|
configure: (proxyServer) => {
|
|
147
138
|
proxyServer.on('error', (err, req, res) => {
|
|
148
|
-
|
|
139
|
+
(0, proxy_error_1.handleDevProxyError)(err, req, res, {
|
|
140
|
+
target: `http://localhost:${serverPort}`,
|
|
141
|
+
});
|
|
149
142
|
});
|
|
150
143
|
},
|
|
151
144
|
};
|
|
@@ -155,7 +148,9 @@ function devProxyPlugin(options = {}) {
|
|
|
155
148
|
changeOrigin: true,
|
|
156
149
|
configure: (proxyServer) => {
|
|
157
150
|
proxyServer.on('error', (err, req, res) => {
|
|
158
|
-
|
|
151
|
+
(0, proxy_error_1.handleDevProxyError)(err, req, res, {
|
|
152
|
+
target: `http://localhost:${serverPort}`,
|
|
153
|
+
});
|
|
159
154
|
});
|
|
160
155
|
},
|
|
161
156
|
};
|
|
@@ -166,7 +161,9 @@ function devProxyPlugin(options = {}) {
|
|
|
166
161
|
changeOrigin: true,
|
|
167
162
|
configure: (proxyServer) => {
|
|
168
163
|
proxyServer.on('error', (err, req, res) => {
|
|
169
|
-
|
|
164
|
+
(0, proxy_error_1.handleDevProxyError)(err, req, res, {
|
|
165
|
+
target: `http://localhost:${serverPort}`,
|
|
166
|
+
});
|
|
170
167
|
});
|
|
171
168
|
},
|
|
172
169
|
};
|
|
@@ -175,7 +172,9 @@ function devProxyPlugin(options = {}) {
|
|
|
175
172
|
changeOrigin: true,
|
|
176
173
|
configure: (proxyServer) => {
|
|
177
174
|
proxyServer.on('error', (err, req, res) => {
|
|
178
|
-
|
|
175
|
+
(0, proxy_error_1.handleDevProxyError)(err, req, res, {
|
|
176
|
+
target: `http://localhost:${serverPort}`,
|
|
177
|
+
});
|
|
179
178
|
});
|
|
180
179
|
},
|
|
181
180
|
};
|
|
@@ -217,7 +216,9 @@ function devProxyPlugin(options = {}) {
|
|
|
217
216
|
proxyRes.pipe(res);
|
|
218
217
|
});
|
|
219
218
|
proxyReq.on('error', (err) => {
|
|
220
|
-
|
|
219
|
+
(0, proxy_error_1.handleDevProxyError)(err, req, res, {
|
|
220
|
+
target: `http://localhost:${serverPort}`,
|
|
221
|
+
});
|
|
221
222
|
});
|
|
222
223
|
req.pipe(proxyReq);
|
|
223
224
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-proxy.js","sourceRoot":"","sources":["../../src/plugins/dev-proxy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"dev-proxy.js","sourceRoot":"","sources":["../../src/plugins/dev-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-output.d.ts","sourceRoot":"","sources":["../../src/plugins/html-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,MAAM,CAAC;AAGlE;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B/E;AAED,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"html-output.d.ts","sourceRoot":"","sources":["../../src/plugins/html-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,MAAM,CAAC;AAGlE;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B/E;AAED,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAyLzE"}
|
|
@@ -79,6 +79,16 @@ function htmlOutputPlugin(options) {
|
|
|
79
79
|
// Apply Vite's HTML transformations (this calls all plugin's transformIndexHtml hooks)
|
|
80
80
|
const url = '/' + path_1.default.relative(config.root, htmlPath);
|
|
81
81
|
html = await server.transformIndexHtml(url, html);
|
|
82
|
+
// 删 vite 注入的 modulepreload 链接 —— fullstack 形态下 nest serve 磁盘 HTML 是
|
|
83
|
+
// 静态快照,modulepreload 里硬编码的 `?v=<browserHash>` 一旦 vite 重启 / re-bundle
|
|
84
|
+
// 就 stale,浏览器无脑 prefetch 触发 504。dev 期 modulepreload 加速首屏的收益
|
|
85
|
+
// (几十 ms) 远不抵 stale hash 504 的体验损失。jsPage 形态 vite 直接 serve HTML,
|
|
86
|
+
// 每次请求都过 transformIndexHtml hash 自动对齐,modulepreload 没问题;但 fullstack
|
|
87
|
+
// 这条链路上磁盘 HTML 没法 per-request 重新生成,删 modulepreload 是釜底抽薪。
|
|
88
|
+
//
|
|
89
|
+
// 注意:这只删 dev 写出的磁盘 HTML 里的 modulepreload。production build 走 rollup
|
|
90
|
+
// 自己的 chunk 入口,modulepreload 由 build manifest 控制,跟 dev 这条无关。
|
|
91
|
+
html = html.replace(/\s*<link\b[^>]*\brel=["']modulepreload["'][^>]*>/gi, '');
|
|
82
92
|
// Write to output directory
|
|
83
93
|
const outputPath = path_1.default.resolve(outDir, 'index.html');
|
|
84
94
|
// Ensure output directory exists
|
|
@@ -133,15 +143,21 @@ function htmlOutputPlugin(options) {
|
|
|
133
143
|
// <link rel="modulepreload" href="/node_modules/.vite/deps/react.js?v=<hash>">
|
|
134
144
|
// 之后 vite optimizer 因 crawl 发现新 dep 重新 prebundle,metadata browserHash 变了
|
|
135
145
|
// 但磁盘 HTML 没动 —— 浏览器永远拿旧 hash 请求 deps,vite middleware 命中 hash
|
|
136
|
-
// mismatch 返回 504(配 holdUntilCrawlEnd:false 时同时
|
|
146
|
+
// mismatch 返回 504(配 holdUntilCrawlEnd:false 时同时 push full-reload)。浏览器
|
|
137
147
|
// 整页刷新但 nest 又 render 同一份旧 HTML,陷入 504 循环 / preload 报错。
|
|
138
148
|
//
|
|
139
149
|
// 截获 full-reload 信号:vite 主动 push full-reload 几乎都是 deps re-bundle 完成
|
|
140
150
|
// (metadata 已切到新 browserHash)。这时重写一次 HTML,让 modulepreload 跟新
|
|
141
151
|
// metadata 对齐,后续浏览器拿到的 HTML 跟 vite 状态一致,持续 504 消失。
|
|
152
|
+
//
|
|
153
|
+
// Vite 8 的 hot channel API:full-reload 走 environment.hot.send 不是 server.ws.send
|
|
154
|
+
// (vite source chunks/config.js fullReload(): `environment.hot.send({type:"full-reload"})`)。
|
|
155
|
+
// server.ws 是 vite 6/7 老 API 的兼容入口,vite 8 内部完全绕过它,所以必须 patch
|
|
156
|
+
// environments.client.hot.send 才能拦到 deps optimizer 的 reload 信号。
|
|
142
157
|
// 详见 ~/docs/miaoda-fullstack-vite-deps-504-20260624.md。
|
|
143
|
-
const
|
|
144
|
-
|
|
158
|
+
const clientHot = devServer.environments.client.hot;
|
|
159
|
+
const origHotSend = clientHot.send.bind(clientHot);
|
|
160
|
+
clientHot.send = ((...args) => {
|
|
145
161
|
const first = args[0];
|
|
146
162
|
if (first &&
|
|
147
163
|
typeof first === 'object' &&
|
|
@@ -149,7 +165,7 @@ function htmlOutputPlugin(options) {
|
|
|
149
165
|
first.type === 'full-reload') {
|
|
150
166
|
writeHtmlToDisk().catch((e) => console.warn('[html-output] regen on full-reload failed:', e));
|
|
151
167
|
}
|
|
152
|
-
return
|
|
168
|
+
return origHotSend(...args);
|
|
153
169
|
});
|
|
154
170
|
};
|
|
155
171
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-output.js","sourceRoot":"","sources":["../../src/plugins/html-output.ts"],"names":[],"mappings":";;;;;AAWA,kEA0BC;AAcD,
|
|
1
|
+
{"version":3,"file":"html-output.js","sourceRoot":"","sources":["../../src/plugins/html-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev server proxy 错误处理 —— nest hot reload 友好的等待 + 重试 + 重定向。
|
|
3
|
+
*
|
|
4
|
+
* 场景:fullstack 形态下 vite (8080) proxy 转发到 nest (3000)。user 改 server 代码
|
|
5
|
+
* 时 nest --watch 重新编译 + 重启,1~3 秒窗口期内 nest 没在 listen,vite proxy 收到
|
|
6
|
+
* ECONNREFUSED → 之前直接给浏览器抛 502 JSON("Backend service is not running"),
|
|
7
|
+
* user 看到黑屏。
|
|
8
|
+
*
|
|
9
|
+
* 实现搬自 `@lark-apaas/fullstack-toolkits` 的 handleDevProxyError (内联避免新跨包
|
|
10
|
+
* 依赖)。逻辑跟 fullstack-vite-preset 老版本保持一致。
|
|
11
|
+
*
|
|
12
|
+
* 处理策略:
|
|
13
|
+
* 1. **连接错误**(ECONNREFUSED / ECONNRESET / ETIMEDOUT / ENOTFOUND / ENETUNREACH)
|
|
14
|
+
* → 服务可能在热重启,轮询 nest / 最多等 retryTimeout 毫秒
|
|
15
|
+
* → 恢复了 sendRedirect 302 让浏览器重发原请求(无感)
|
|
16
|
+
* → 超时仍未恢复才回 502
|
|
17
|
+
* 2. **其他错误**(socket hang up / 协议错等)→ 立即 502,没必要等
|
|
18
|
+
*/
|
|
19
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
20
|
+
export interface ProxyErrorOptions {
|
|
21
|
+
/** 等待服务重启的超时时间(毫秒),默认 5000ms */
|
|
22
|
+
retryTimeout?: number;
|
|
23
|
+
/** 轮询检查服务的间隔时间(毫秒),默认 500ms */
|
|
24
|
+
retryInterval?: number;
|
|
25
|
+
/** 目标服务器地址,用于检查服务是否恢复,格式:http://localhost:3000 */
|
|
26
|
+
target?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function handleDevProxyError(err: Error, req: IncomingMessage, res: ServerResponse, options?: ProxyErrorOptions): void;
|
|
29
|
+
//# sourceMappingURL=proxy-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-error.d.ts","sourceRoot":"","sources":["../../src/utils/proxy-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqFD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,IAAI,CAmCN"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dev server proxy 错误处理 —— nest hot reload 友好的等待 + 重试 + 重定向。
|
|
4
|
+
*
|
|
5
|
+
* 场景:fullstack 形态下 vite (8080) proxy 转发到 nest (3000)。user 改 server 代码
|
|
6
|
+
* 时 nest --watch 重新编译 + 重启,1~3 秒窗口期内 nest 没在 listen,vite proxy 收到
|
|
7
|
+
* ECONNREFUSED → 之前直接给浏览器抛 502 JSON("Backend service is not running"),
|
|
8
|
+
* user 看到黑屏。
|
|
9
|
+
*
|
|
10
|
+
* 实现搬自 `@lark-apaas/fullstack-toolkits` 的 handleDevProxyError (内联避免新跨包
|
|
11
|
+
* 依赖)。逻辑跟 fullstack-vite-preset 老版本保持一致。
|
|
12
|
+
*
|
|
13
|
+
* 处理策略:
|
|
14
|
+
* 1. **连接错误**(ECONNREFUSED / ECONNRESET / ETIMEDOUT / ENOTFOUND / ENETUNREACH)
|
|
15
|
+
* → 服务可能在热重启,轮询 nest / 最多等 retryTimeout 毫秒
|
|
16
|
+
* → 恢复了 sendRedirect 302 让浏览器重发原请求(无感)
|
|
17
|
+
* → 超时仍未恢复才回 502
|
|
18
|
+
* 2. **其他错误**(socket hang up / 协议错等)→ 立即 502,没必要等
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.handleDevProxyError = handleDevProxyError;
|
|
55
|
+
const http = __importStar(require("node:http"));
|
|
56
|
+
const https = __importStar(require("node:https"));
|
|
57
|
+
function isConnectionError(err) {
|
|
58
|
+
const code = err.code;
|
|
59
|
+
const connectionErrorCodes = [
|
|
60
|
+
'ECONNREFUSED',
|
|
61
|
+
'ECONNRESET',
|
|
62
|
+
'ETIMEDOUT',
|
|
63
|
+
'ENOTFOUND',
|
|
64
|
+
'ENETUNREACH',
|
|
65
|
+
];
|
|
66
|
+
return connectionErrorCodes.includes(code || '');
|
|
67
|
+
}
|
|
68
|
+
function checkServiceAvailable(targetUrl, timeout = 2000) {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
try {
|
|
71
|
+
const url = new URL(targetUrl);
|
|
72
|
+
const isHttps = url.protocol === 'https:';
|
|
73
|
+
const httpModule = isHttps ? https : http;
|
|
74
|
+
const req = httpModule.request({
|
|
75
|
+
hostname: url.hostname,
|
|
76
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
77
|
+
path: '/',
|
|
78
|
+
method: 'HEAD',
|
|
79
|
+
timeout,
|
|
80
|
+
}, (res) => {
|
|
81
|
+
// 任何非 502 响应都表示服务可用
|
|
82
|
+
resolve(res.statusCode !== 502);
|
|
83
|
+
});
|
|
84
|
+
req.on('timeout', () => {
|
|
85
|
+
req.destroy();
|
|
86
|
+
resolve(false);
|
|
87
|
+
});
|
|
88
|
+
req.on('error', () => resolve(false));
|
|
89
|
+
req.end();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
resolve(false);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function waitForServiceRecovery(targetUrl, timeout, interval) {
|
|
97
|
+
const startTime = Date.now();
|
|
98
|
+
while (Date.now() - startTime < timeout) {
|
|
99
|
+
if (await checkServiceAvailable(targetUrl, 2000))
|
|
100
|
+
return true;
|
|
101
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
function send502Json(res) {
|
|
106
|
+
if (res.headersSent)
|
|
107
|
+
return;
|
|
108
|
+
res.writeHead(502, {
|
|
109
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
110
|
+
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
111
|
+
});
|
|
112
|
+
res.end(JSON.stringify({
|
|
113
|
+
error: 'Bad Gateway',
|
|
114
|
+
message: 'Backend service is temporarily unavailable',
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
function sendRedirect(req, res) {
|
|
118
|
+
if (res.headersSent)
|
|
119
|
+
return;
|
|
120
|
+
const originalUrl = req.url || '/';
|
|
121
|
+
console.log('[Proxy] Service recovered, redirecting to', originalUrl);
|
|
122
|
+
res.writeHead(302, {
|
|
123
|
+
Location: originalUrl,
|
|
124
|
+
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
125
|
+
});
|
|
126
|
+
res.end();
|
|
127
|
+
}
|
|
128
|
+
function handleDevProxyError(err, req, res, options) {
|
|
129
|
+
const { retryTimeout = 5000, retryInterval = 500, target = `http://localhost:${process.env.SERVER_PORT || 3000}`, } = options || {};
|
|
130
|
+
console.error('[Proxy] Error:', err.message);
|
|
131
|
+
if (res.headersSent) {
|
|
132
|
+
console.error('[Proxy] Headers already sent, cannot handle error');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!isConnectionError(err)) {
|
|
136
|
+
console.log('[Proxy] Non-connection error, returning 502');
|
|
137
|
+
send502Json(res);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
console.log('[Proxy] Connection error, waiting for service recovery...');
|
|
141
|
+
void (async () => {
|
|
142
|
+
try {
|
|
143
|
+
const recovered = await waitForServiceRecovery(target, retryTimeout, retryInterval);
|
|
144
|
+
if (recovered) {
|
|
145
|
+
sendRedirect(req, res);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.log('[Proxy] Service did not recover within timeout, returning 502');
|
|
149
|
+
send502Json(res);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error('[Proxy] Error during recovery wait:', error);
|
|
154
|
+
send502Json(res);
|
|
155
|
+
}
|
|
156
|
+
})();
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=proxy-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-error.js","sourceRoot":"","sources":["../../src/utils/proxy-error.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/coding-preset-vite-react",
|
|
3
|
-
"version": "1.0.10-alpha.
|
|
3
|
+
"version": "1.0.10-alpha.2",
|
|
4
4
|
"description": "Vite 8 preset for miaoda-coding vite-react (jsPage) templates — pure frontend, no fullstack baggage",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|