@lark-apaas/devtool-kits 1.0.5-alpha.2 → 1.0.5-alpha.4
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/error.html +44 -16
- package/dist/index.cjs +172 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +34 -1
- package/dist/index.d.ts +34 -1
- package/dist/index.js +171 -59
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -30,6 +30,8 @@ interface ProxyErrorOptions {
|
|
|
30
30
|
retryInterval?: number;
|
|
31
31
|
/** 目标服务器地址,用于检查服务是否恢复,格式:http://localhost:3000 */
|
|
32
32
|
target?: string;
|
|
33
|
+
/** 客户端基础路径,默认 '/' */
|
|
34
|
+
clientBasePath?: string;
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
35
37
|
* HTTP Proxy 错误处理器
|
|
@@ -197,6 +199,37 @@ interface DevLogsMiddlewareOptions {
|
|
|
197
199
|
*/
|
|
198
200
|
declare function createCollectLogsMiddleware(options?: DevLogsMiddlewareOptions): RouteMiddleware;
|
|
199
201
|
|
|
202
|
+
interface HealthCheckMiddlewareOptions {
|
|
203
|
+
/** 目标服务端口,默认 3000 */
|
|
204
|
+
targetPort?: number;
|
|
205
|
+
/** 目标服务主机,默认 localhost */
|
|
206
|
+
targetHost?: string;
|
|
207
|
+
/** 健康检查超时时间(毫秒),默认 2000ms */
|
|
208
|
+
timeout?: number;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Creates health check middleware for checking service availability
|
|
212
|
+
* Supports both rspack/webpack and Vite dev servers
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* // In rspack/webpack setupMiddlewares
|
|
217
|
+
* registerMiddlewares(devServer.app, [
|
|
218
|
+
* createHealthCheckMiddleware({ targetPort: 3000 })
|
|
219
|
+
* ]);
|
|
220
|
+
*
|
|
221
|
+
* // Check health at: GET /dev/health
|
|
222
|
+
* // Response:
|
|
223
|
+
* // {
|
|
224
|
+
* // "status": "healthy",
|
|
225
|
+
* // "service": "localhost:3000",
|
|
226
|
+
* // "responseTime": 15,
|
|
227
|
+
* // "timestamp": "2025-01-10T12:00:00.000Z"
|
|
228
|
+
* // }
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
declare function createHealthCheckMiddleware(options?: HealthCheckMiddlewareOptions): RouteMiddleware;
|
|
232
|
+
|
|
200
233
|
/**
|
|
201
234
|
* Register middlewares for Express-compatible servers or Vite
|
|
202
235
|
* @param server - Express app or Vite middleware instance
|
|
@@ -236,4 +269,4 @@ declare function createCollectLogsMiddleware(options?: DevLogsMiddlewareOptions)
|
|
|
236
269
|
*/
|
|
237
270
|
declare function registerMiddlewares(server: ExpressApp | ViteMiddleware, middlewares: Middleware[], options?: Partial<MiddlewareContext>): Promise<void>;
|
|
238
271
|
|
|
239
|
-
export { type GlobalMiddleware, type Middleware, type MiddlewareContext, type RouteInfo, type RouteMiddleware, createCollectLogsMiddleware, createDevLogsMiddleware, createOpenapiMiddleware, handleDevProxyError, normalizeBasePath, postprocessDrizzleSchema, registerMiddlewares };
|
|
272
|
+
export { type GlobalMiddleware, type Middleware, type MiddlewareContext, type RouteInfo, type RouteMiddleware, createCollectLogsMiddleware, createDevLogsMiddleware, createHealthCheckMiddleware, createOpenapiMiddleware, handleDevProxyError, normalizeBasePath, postprocessDrizzleSchema, registerMiddlewares };
|
package/dist/index.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ interface ProxyErrorOptions {
|
|
|
30
30
|
retryInterval?: number;
|
|
31
31
|
/** 目标服务器地址,用于检查服务是否恢复,格式:http://localhost:3000 */
|
|
32
32
|
target?: string;
|
|
33
|
+
/** 客户端基础路径,默认 '/' */
|
|
34
|
+
clientBasePath?: string;
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
35
37
|
* HTTP Proxy 错误处理器
|
|
@@ -197,6 +199,37 @@ interface DevLogsMiddlewareOptions {
|
|
|
197
199
|
*/
|
|
198
200
|
declare function createCollectLogsMiddleware(options?: DevLogsMiddlewareOptions): RouteMiddleware;
|
|
199
201
|
|
|
202
|
+
interface HealthCheckMiddlewareOptions {
|
|
203
|
+
/** 目标服务端口,默认 3000 */
|
|
204
|
+
targetPort?: number;
|
|
205
|
+
/** 目标服务主机,默认 localhost */
|
|
206
|
+
targetHost?: string;
|
|
207
|
+
/** 健康检查超时时间(毫秒),默认 2000ms */
|
|
208
|
+
timeout?: number;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Creates health check middleware for checking service availability
|
|
212
|
+
* Supports both rspack/webpack and Vite dev servers
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* // In rspack/webpack setupMiddlewares
|
|
217
|
+
* registerMiddlewares(devServer.app, [
|
|
218
|
+
* createHealthCheckMiddleware({ targetPort: 3000 })
|
|
219
|
+
* ]);
|
|
220
|
+
*
|
|
221
|
+
* // Check health at: GET /dev/health
|
|
222
|
+
* // Response:
|
|
223
|
+
* // {
|
|
224
|
+
* // "status": "healthy",
|
|
225
|
+
* // "service": "localhost:3000",
|
|
226
|
+
* // "responseTime": 15,
|
|
227
|
+
* // "timestamp": "2025-01-10T12:00:00.000Z"
|
|
228
|
+
* // }
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
declare function createHealthCheckMiddleware(options?: HealthCheckMiddlewareOptions): RouteMiddleware;
|
|
232
|
+
|
|
200
233
|
/**
|
|
201
234
|
* Register middlewares for Express-compatible servers or Vite
|
|
202
235
|
* @param server - Express app or Vite middleware instance
|
|
@@ -236,4 +269,4 @@ declare function createCollectLogsMiddleware(options?: DevLogsMiddlewareOptions)
|
|
|
236
269
|
*/
|
|
237
270
|
declare function registerMiddlewares(server: ExpressApp | ViteMiddleware, middlewares: Middleware[], options?: Partial<MiddlewareContext>): Promise<void>;
|
|
238
271
|
|
|
239
|
-
export { type GlobalMiddleware, type Middleware, type MiddlewareContext, type RouteInfo, type RouteMiddleware, createCollectLogsMiddleware, createDevLogsMiddleware, createOpenapiMiddleware, handleDevProxyError, normalizeBasePath, postprocessDrizzleSchema, registerMiddlewares };
|
|
272
|
+
export { type GlobalMiddleware, type Middleware, type MiddlewareContext, type RouteInfo, type RouteMiddleware, createCollectLogsMiddleware, createDevLogsMiddleware, createHealthCheckMiddleware, createOpenapiMiddleware, handleDevProxyError, normalizeBasePath, postprocessDrizzleSchema, registerMiddlewares };
|
package/dist/index.js
CHANGED
|
@@ -22320,10 +22320,10 @@ var require_layer = __commonJS({
|
|
|
22320
22320
|
var require_methods = __commonJS({
|
|
22321
22321
|
"../../../node_modules/methods/index.js"(exports, module) {
|
|
22322
22322
|
"use strict";
|
|
22323
|
-
var
|
|
22323
|
+
var http3 = __require("http");
|
|
22324
22324
|
module.exports = getCurrentNodeMethods() || getBasicNodeMethods();
|
|
22325
22325
|
function getCurrentNodeMethods() {
|
|
22326
|
-
return
|
|
22326
|
+
return http3.METHODS && http3.METHODS.map(/* @__PURE__ */ __name(function lowerCaseMethod(method) {
|
|
22327
22327
|
return method.toLowerCase();
|
|
22328
22328
|
}, "lowerCaseMethod"));
|
|
22329
22329
|
}
|
|
@@ -25995,13 +25995,13 @@ var require_application = __commonJS({
|
|
|
25995
25995
|
"../../../node_modules/express/lib/application.js"(exports, module) {
|
|
25996
25996
|
"use strict";
|
|
25997
25997
|
var finalhandler = require_finalhandler();
|
|
25998
|
-
var
|
|
25998
|
+
var Router2 = require_router();
|
|
25999
25999
|
var methods = require_methods();
|
|
26000
26000
|
var middleware = require_init();
|
|
26001
26001
|
var query = require_query();
|
|
26002
26002
|
var debug = require_src3()("express:application");
|
|
26003
26003
|
var View = require_view();
|
|
26004
|
-
var
|
|
26004
|
+
var http3 = __require("http");
|
|
26005
26005
|
var compileETag = require_utils2().compileETag;
|
|
26006
26006
|
var compileQueryParser = require_utils2().compileQueryParser;
|
|
26007
26007
|
var compileTrust = require_utils2().compileTrust;
|
|
@@ -26060,7 +26060,7 @@ var require_application = __commonJS({
|
|
|
26060
26060
|
}, "defaultConfiguration");
|
|
26061
26061
|
app.lazyrouter = /* @__PURE__ */ __name(function lazyrouter() {
|
|
26062
26062
|
if (!this._router) {
|
|
26063
|
-
this._router = new
|
|
26063
|
+
this._router = new Router2({
|
|
26064
26064
|
caseSensitive: this.enabled("case sensitive routing"),
|
|
26065
26065
|
strict: this.enabled("strict routing")
|
|
26066
26066
|
});
|
|
@@ -26250,7 +26250,7 @@ var require_application = __commonJS({
|
|
|
26250
26250
|
tryRender(view, renderOptions, done);
|
|
26251
26251
|
}, "render");
|
|
26252
26252
|
app.listen = /* @__PURE__ */ __name(function listen() {
|
|
26253
|
-
var server =
|
|
26253
|
+
var server = http3.createServer(this);
|
|
26254
26254
|
return server.listen.apply(server, arguments);
|
|
26255
26255
|
}, "listen");
|
|
26256
26256
|
function logerror(err) {
|
|
@@ -26913,12 +26913,12 @@ var require_request = __commonJS({
|
|
|
26913
26913
|
var deprecate = require_depd()("express");
|
|
26914
26914
|
var isIP = __require("net").isIP;
|
|
26915
26915
|
var typeis = require_type_is();
|
|
26916
|
-
var
|
|
26916
|
+
var http3 = __require("http");
|
|
26917
26917
|
var fresh = require_fresh();
|
|
26918
26918
|
var parseRange = require_range_parser();
|
|
26919
26919
|
var parse = require_parseurl();
|
|
26920
26920
|
var proxyaddr = require_proxy_addr();
|
|
26921
|
-
var req = Object.create(
|
|
26921
|
+
var req = Object.create(http3.IncomingMessage.prototype);
|
|
26922
26922
|
module.exports = req;
|
|
26923
26923
|
req.get = req.header = /* @__PURE__ */ __name(function header(name) {
|
|
26924
26924
|
if (!name) {
|
|
@@ -27344,7 +27344,7 @@ var require_response = __commonJS({
|
|
|
27344
27344
|
var deprecate = require_depd()("express");
|
|
27345
27345
|
var encodeUrl = require_encodeurl();
|
|
27346
27346
|
var escapeHtml = require_escape_html();
|
|
27347
|
-
var
|
|
27347
|
+
var http3 = __require("http");
|
|
27348
27348
|
var isAbsolute3 = require_utils2().isAbsolute;
|
|
27349
27349
|
var onFinished = require_on_finished();
|
|
27350
27350
|
var path6 = __require("path");
|
|
@@ -27360,7 +27360,7 @@ var require_response = __commonJS({
|
|
|
27360
27360
|
var mime = send.mime;
|
|
27361
27361
|
var resolve = path6.resolve;
|
|
27362
27362
|
var vary = require_vary();
|
|
27363
|
-
var res = Object.create(
|
|
27363
|
+
var res = Object.create(http3.ServerResponse.prototype);
|
|
27364
27364
|
module.exports = res;
|
|
27365
27365
|
var charsetRegExp = /;\s*charset\s*=/;
|
|
27366
27366
|
res.status = /* @__PURE__ */ __name(function status(code) {
|
|
@@ -28009,7 +28009,7 @@ var require_express = __commonJS({
|
|
|
28009
28009
|
var mixin = require_merge_descriptors();
|
|
28010
28010
|
var proto = require_application();
|
|
28011
28011
|
var Route = require_route();
|
|
28012
|
-
var
|
|
28012
|
+
var Router2 = require_router();
|
|
28013
28013
|
var req = require_request();
|
|
28014
28014
|
var res = require_response();
|
|
28015
28015
|
exports = module.exports = createApplication;
|
|
@@ -28043,7 +28043,7 @@ var require_express = __commonJS({
|
|
|
28043
28043
|
exports.request = req;
|
|
28044
28044
|
exports.response = res;
|
|
28045
28045
|
exports.Route = Route;
|
|
28046
|
-
exports.Router =
|
|
28046
|
+
exports.Router = Router2;
|
|
28047
28047
|
exports.json = bodyParser.json;
|
|
28048
28048
|
exports.query = require_query();
|
|
28049
28049
|
exports.raw = bodyParser.raw;
|
|
@@ -28394,7 +28394,8 @@ import fs2 from "fs";
|
|
|
28394
28394
|
import path2 from "path";
|
|
28395
28395
|
import { createReadStream } from "fs";
|
|
28396
28396
|
import { createInterface } from "readline";
|
|
28397
|
-
import
|
|
28397
|
+
import http from "http";
|
|
28398
|
+
import https from "https";
|
|
28398
28399
|
var errorHtmlTemplate = null;
|
|
28399
28400
|
function isConnectionError(err) {
|
|
28400
28401
|
const code = err.code;
|
|
@@ -28408,30 +28409,40 @@ function isConnectionError(err) {
|
|
|
28408
28409
|
return connectionErrorCodes.includes(code || "");
|
|
28409
28410
|
}
|
|
28410
28411
|
__name(isConnectionError, "isConnectionError");
|
|
28411
|
-
function checkServiceAvailable(
|
|
28412
|
+
function checkServiceAvailable(targetUrl, timeout = 1e3) {
|
|
28412
28413
|
return new Promise((resolve) => {
|
|
28413
|
-
|
|
28414
|
-
|
|
28415
|
-
|
|
28416
|
-
|
|
28417
|
-
|
|
28418
|
-
|
|
28419
|
-
|
|
28420
|
-
|
|
28421
|
-
|
|
28422
|
-
|
|
28423
|
-
|
|
28424
|
-
|
|
28425
|
-
|
|
28414
|
+
try {
|
|
28415
|
+
const url = new URL(targetUrl);
|
|
28416
|
+
const isHttps = url.protocol === "https:";
|
|
28417
|
+
const httpModule = isHttps ? https : http;
|
|
28418
|
+
const req = httpModule.request({
|
|
28419
|
+
hostname: url.hostname,
|
|
28420
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
28421
|
+
path: "/",
|
|
28422
|
+
method: "HEAD",
|
|
28423
|
+
timeout
|
|
28424
|
+
}, (res) => {
|
|
28425
|
+
const available = res.statusCode !== 502 && !res.headers["x-proxy-error-page"];
|
|
28426
|
+
resolve(available);
|
|
28427
|
+
});
|
|
28428
|
+
req.on("timeout", () => {
|
|
28429
|
+
req.destroy();
|
|
28430
|
+
resolve(false);
|
|
28431
|
+
});
|
|
28432
|
+
req.on("error", () => {
|
|
28433
|
+
resolve(false);
|
|
28434
|
+
});
|
|
28435
|
+
req.end();
|
|
28436
|
+
} catch (e) {
|
|
28426
28437
|
resolve(false);
|
|
28427
|
-
}
|
|
28438
|
+
}
|
|
28428
28439
|
});
|
|
28429
28440
|
}
|
|
28430
28441
|
__name(checkServiceAvailable, "checkServiceAvailable");
|
|
28431
|
-
async function waitForServiceRecovery(
|
|
28442
|
+
async function waitForServiceRecovery(targetUrl, timeout, interval) {
|
|
28432
28443
|
const startTime = Date.now();
|
|
28433
28444
|
while (Date.now() - startTime < timeout) {
|
|
28434
|
-
const isAvailable = await checkServiceAvailable(
|
|
28445
|
+
const isAvailable = await checkServiceAvailable(targetUrl, 2e3);
|
|
28435
28446
|
if (isAvailable) {
|
|
28436
28447
|
return true;
|
|
28437
28448
|
}
|
|
@@ -28522,7 +28533,7 @@ async function readRecentErrorLogs(logDir, maxLogs, fileName) {
|
|
|
28522
28533
|
};
|
|
28523
28534
|
}
|
|
28524
28535
|
__name(readRecentErrorLogs, "readRecentErrorLogs");
|
|
28525
|
-
function injectErrorData(template, errorLogs) {
|
|
28536
|
+
function injectErrorData(template, errorLogs, clientBasePath) {
|
|
28526
28537
|
let logsText = "";
|
|
28527
28538
|
if (errorLogs.length > 0) {
|
|
28528
28539
|
logsText = errorLogs.join("\n");
|
|
@@ -28530,11 +28541,12 @@ function injectErrorData(template, errorLogs) {
|
|
|
28530
28541
|
logsText = "\u672A\u627E\u5230\u76F8\u5173\u9519\u8BEF\u65E5\u5FD7";
|
|
28531
28542
|
}
|
|
28532
28543
|
return template.replace("{{.errorData.message}}", `\u670D\u52A1\u542F\u52A8\u5F02\u5E38\uFF0C\u8BF7\u6839\u636E\u65E5\u5FD7\u4FEE\u590D\u76F8\u5173\u95EE\u9898
|
|
28533
|
-
${JSON.stringify(logsText)}`);
|
|
28544
|
+
${JSON.stringify(logsText)}`).replace("{{.clientBasePath}}", clientBasePath);
|
|
28534
28545
|
}
|
|
28535
28546
|
__name(injectErrorData, "injectErrorData");
|
|
28536
28547
|
function handleDevProxyError(err, req, res, options) {
|
|
28537
|
-
const { logDir = path2.join(process.cwd(), "logs"), maxErrorLogs = 100, logFileName = "server.log", retryTimeout = 5e3, retryInterval = 500, target } = options || {};
|
|
28548
|
+
const { logDir = path2.join(process.cwd(), "logs"), maxErrorLogs = 100, logFileName = "server.log", retryTimeout = 5e3, retryInterval = 500, target, clientBasePath = process.env.CLIENT_BASE_PATH || "/" } = options || {};
|
|
28549
|
+
const clientBasePathWithoutSlash = normalizeBasePath(clientBasePath);
|
|
28538
28550
|
console.error("[Proxy Error]:", err.message);
|
|
28539
28551
|
if (res.headersSent) {
|
|
28540
28552
|
console.error("[Proxy Error]: Headers already sent, cannot send error page");
|
|
@@ -28546,32 +28558,32 @@ function handleDevProxyError(err, req, res, options) {
|
|
|
28546
28558
|
const { logs: errorLogs, hasCompileError } = await readRecentErrorLogs(logDir, maxErrorLogs, logFileName);
|
|
28547
28559
|
if (isConnError && !hasCompileError && target) {
|
|
28548
28560
|
console.log("[Proxy Error]: Connection error without compile errors, possibly server restarting...");
|
|
28549
|
-
let targetUrl = null;
|
|
28550
28561
|
try {
|
|
28551
|
-
|
|
28562
|
+
new URL(target);
|
|
28552
28563
|
} catch (e) {
|
|
28553
28564
|
console.error("[Proxy Error]: Invalid target URL:", target);
|
|
28565
|
+
console.log("[Proxy Error]: Showing error page due to invalid target");
|
|
28554
28566
|
}
|
|
28555
|
-
|
|
28556
|
-
|
|
28557
|
-
|
|
28558
|
-
console.log(
|
|
28559
|
-
|
|
28560
|
-
|
|
28561
|
-
console.log("[Proxy Error]: Service recovered, sending redirect");
|
|
28562
|
-
sendSimpleRedirect(req, res);
|
|
28563
|
-
return;
|
|
28564
|
-
}
|
|
28565
|
-
console.log("[Proxy Error]: Service did not recover within timeout, showing error page");
|
|
28567
|
+
console.log(`[Proxy Error]: Waiting for service recovery at ${target} (timeout: ${retryTimeout}ms)...`);
|
|
28568
|
+
const recovered = await waitForServiceRecovery(target, retryTimeout, retryInterval);
|
|
28569
|
+
if (recovered) {
|
|
28570
|
+
console.log("[Proxy Error]: Service recovered within timeout, sending 302 redirect");
|
|
28571
|
+
sendSimpleRedirect(req, res);
|
|
28572
|
+
return;
|
|
28566
28573
|
}
|
|
28567
|
-
console.log("[Proxy Error]:
|
|
28574
|
+
console.log("[Proxy Error]: Service did not recover within timeout, showing error page with probe");
|
|
28575
|
+
}
|
|
28576
|
+
if (isConnError && !hasCompileError) {
|
|
28577
|
+
console.log("[Proxy Error]: Showing error page with auto-refresh probe");
|
|
28578
|
+
} else {
|
|
28579
|
+
console.log("[Proxy Error]: Compile error or non-connection error, showing error page");
|
|
28568
28580
|
}
|
|
28569
|
-
console.log("[Proxy Error]: Compile error or non-connection error, showing error page");
|
|
28570
28581
|
const template = getErrorHtmlTemplate();
|
|
28571
|
-
const html = injectErrorData(template, errorLogs);
|
|
28582
|
+
const html = injectErrorData(template, errorLogs, clientBasePathWithoutSlash);
|
|
28572
28583
|
res.writeHead(502, {
|
|
28573
28584
|
"Content-Type": "text/html; charset=utf-8",
|
|
28574
|
-
"Cache-Control": "no-cache, no-store, must-revalidate"
|
|
28585
|
+
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
28586
|
+
"X-Proxy-Error-Page": "true"
|
|
28575
28587
|
});
|
|
28576
28588
|
res.end(html);
|
|
28577
28589
|
} catch (error) {
|
|
@@ -28601,8 +28613,99 @@ __name(sendSimpleRedirect, "sendSimpleRedirect");
|
|
|
28601
28613
|
// src/middlewares/index.ts
|
|
28602
28614
|
import path5 from "path";
|
|
28603
28615
|
|
|
28604
|
-
// src/middlewares/
|
|
28616
|
+
// src/middlewares/health-check/router.ts
|
|
28605
28617
|
var import_express = __toESM(require_express2(), 1);
|
|
28618
|
+
import http2 from "http";
|
|
28619
|
+
function checkServiceHealth(host, port, timeout) {
|
|
28620
|
+
return new Promise((resolve) => {
|
|
28621
|
+
const startTime = Date.now();
|
|
28622
|
+
const req = http2.request({
|
|
28623
|
+
hostname: host,
|
|
28624
|
+
port,
|
|
28625
|
+
path: "/",
|
|
28626
|
+
method: "HEAD",
|
|
28627
|
+
timeout
|
|
28628
|
+
}, (_res) => {
|
|
28629
|
+
const responseTime = Date.now() - startTime;
|
|
28630
|
+
resolve({
|
|
28631
|
+
available: true,
|
|
28632
|
+
responseTime
|
|
28633
|
+
});
|
|
28634
|
+
});
|
|
28635
|
+
req.on("timeout", () => {
|
|
28636
|
+
req.destroy();
|
|
28637
|
+
resolve({
|
|
28638
|
+
available: false,
|
|
28639
|
+
error: "Request timeout"
|
|
28640
|
+
});
|
|
28641
|
+
});
|
|
28642
|
+
req.on("error", (err) => {
|
|
28643
|
+
resolve({
|
|
28644
|
+
available: false,
|
|
28645
|
+
error: err.message
|
|
28646
|
+
});
|
|
28647
|
+
});
|
|
28648
|
+
req.end();
|
|
28649
|
+
});
|
|
28650
|
+
}
|
|
28651
|
+
__name(checkServiceHealth, "checkServiceHealth");
|
|
28652
|
+
function createHealthCheckRouter(options = {}) {
|
|
28653
|
+
const { targetPort = Number(process.env.SERVER_PORT) || 3e3, targetHost = "localhost", timeout = 2e3 } = options;
|
|
28654
|
+
const router = (0, import_express.Router)();
|
|
28655
|
+
router.get("/", async (_req, res) => {
|
|
28656
|
+
try {
|
|
28657
|
+
const result = await checkServiceHealth(targetHost, targetPort, timeout);
|
|
28658
|
+
if (result.available) {
|
|
28659
|
+
res.status(200).json({
|
|
28660
|
+
status: "healthy",
|
|
28661
|
+
service: `${targetHost}:${targetPort}`,
|
|
28662
|
+
responseTime: result.responseTime,
|
|
28663
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
28664
|
+
});
|
|
28665
|
+
} else {
|
|
28666
|
+
res.status(503).json({
|
|
28667
|
+
status: "unhealthy",
|
|
28668
|
+
service: `${targetHost}:${targetPort}`,
|
|
28669
|
+
error: result.error,
|
|
28670
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
28671
|
+
});
|
|
28672
|
+
}
|
|
28673
|
+
} catch (error) {
|
|
28674
|
+
res.status(500).json({
|
|
28675
|
+
status: "error",
|
|
28676
|
+
service: `${targetHost}:${targetPort}`,
|
|
28677
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
28678
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
28679
|
+
});
|
|
28680
|
+
}
|
|
28681
|
+
});
|
|
28682
|
+
return router;
|
|
28683
|
+
}
|
|
28684
|
+
__name(createHealthCheckRouter, "createHealthCheckRouter");
|
|
28685
|
+
|
|
28686
|
+
// src/middlewares/health-check/index.ts
|
|
28687
|
+
var HEALTH_CHECK_ROUTES = [
|
|
28688
|
+
{
|
|
28689
|
+
method: "GET",
|
|
28690
|
+
path: "/",
|
|
28691
|
+
description: "Check if target service is healthy and available"
|
|
28692
|
+
}
|
|
28693
|
+
];
|
|
28694
|
+
function createHealthCheckMiddleware(options = {}) {
|
|
28695
|
+
return {
|
|
28696
|
+
name: "health-check",
|
|
28697
|
+
mountPath: "/dev/health",
|
|
28698
|
+
routes: HEALTH_CHECK_ROUTES,
|
|
28699
|
+
enabled: /* @__PURE__ */ __name((context) => context.isDev, "enabled"),
|
|
28700
|
+
createRouter: /* @__PURE__ */ __name((_context) => {
|
|
28701
|
+
return createHealthCheckRouter(options);
|
|
28702
|
+
}, "createRouter")
|
|
28703
|
+
};
|
|
28704
|
+
}
|
|
28705
|
+
__name(createHealthCheckMiddleware, "createHealthCheckMiddleware");
|
|
28706
|
+
|
|
28707
|
+
// src/middlewares/openapi/router.ts
|
|
28708
|
+
var import_express2 = __toESM(require_express2(), 1);
|
|
28606
28709
|
|
|
28607
28710
|
// src/middlewares/openapi/controller.ts
|
|
28608
28711
|
import fs5 from "fs/promises";
|
|
@@ -28849,7 +28952,7 @@ __name(createOpenapiHandler, "createOpenapiHandler");
|
|
|
28849
28952
|
// src/middlewares/openapi/router.ts
|
|
28850
28953
|
function createOpenapiRouter(options, context) {
|
|
28851
28954
|
const { openapiFilePath, enableEnhancement, serverDir } = options;
|
|
28852
|
-
const router =
|
|
28955
|
+
const router = import_express2.default.Router();
|
|
28853
28956
|
const handler = createOpenapiHandler(openapiFilePath, enableEnhancement, serverDir);
|
|
28854
28957
|
router.get("/openapi.json", (req, res) => handler(req, res, context));
|
|
28855
28958
|
return router;
|
|
@@ -28883,7 +28986,7 @@ function createOpenapiMiddleware(options) {
|
|
|
28883
28986
|
__name(createOpenapiMiddleware, "createOpenapiMiddleware");
|
|
28884
28987
|
|
|
28885
28988
|
// src/middlewares/dev-logs/router.ts
|
|
28886
|
-
var
|
|
28989
|
+
var import_express3 = __toESM(require_express2(), 1);
|
|
28887
28990
|
|
|
28888
28991
|
// src/middlewares/dev-logs/utils.ts
|
|
28889
28992
|
import { promises as fs6 } from "fs";
|
|
@@ -29328,7 +29431,7 @@ __name(createGetLogFileHandler, "createGetLogFileHandler");
|
|
|
29328
29431
|
// src/middlewares/dev-logs/router.ts
|
|
29329
29432
|
function createDevLogRouter(options = {}) {
|
|
29330
29433
|
const logDir = resolveLogDir(options.logDir);
|
|
29331
|
-
const router =
|
|
29434
|
+
const router = import_express3.default.Router();
|
|
29332
29435
|
router.get("/app/trace/:traceId", createGetTraceEntriesHandler(logDir));
|
|
29333
29436
|
router.get("/trace/recent", createGetRecentTracesHandler(logDir));
|
|
29334
29437
|
router.get("/files/:fileName", createGetLogFileHandler(logDir));
|
|
@@ -29371,7 +29474,7 @@ function createDevLogsMiddleware(options = {}) {
|
|
|
29371
29474
|
__name(createDevLogsMiddleware, "createDevLogsMiddleware");
|
|
29372
29475
|
|
|
29373
29476
|
// src/middlewares/collect-logs/router.ts
|
|
29374
|
-
var
|
|
29477
|
+
var import_express4 = __toESM(require_express2(), 1);
|
|
29375
29478
|
|
|
29376
29479
|
// src/middlewares/collect-logs/controller.ts
|
|
29377
29480
|
import { join as join4 } from "path";
|
|
@@ -29470,9 +29573,9 @@ __name(handleError2, "handleError");
|
|
|
29470
29573
|
// src/middlewares/collect-logs/router.ts
|
|
29471
29574
|
function createDevLogRouter2(options = {}) {
|
|
29472
29575
|
const logDir = resolveLogDir2(options.logDir);
|
|
29473
|
-
const router =
|
|
29474
|
-
router.post("/collect",
|
|
29475
|
-
router.post("/collect-batch",
|
|
29576
|
+
const router = import_express4.default.Router();
|
|
29577
|
+
router.post("/collect", import_express4.default.json(), collectLogsHandler(logDir, options.fileName || "client.log"));
|
|
29578
|
+
router.post("/collect-batch", import_express4.default.json(), collectLogsBatchHandler(logDir, options.fileName || "client.log"));
|
|
29476
29579
|
return router;
|
|
29477
29580
|
}
|
|
29478
29581
|
__name(createDevLogRouter2, "createDevLogRouter");
|
|
@@ -29555,7 +29658,15 @@ async function registerMiddlewares(server, middlewares, options) {
|
|
|
29555
29658
|
rootDir: process.cwd(),
|
|
29556
29659
|
...options
|
|
29557
29660
|
};
|
|
29558
|
-
|
|
29661
|
+
const defaultMiddlewares = [];
|
|
29662
|
+
if (context.isDev) {
|
|
29663
|
+
defaultMiddlewares.push(createHealthCheckMiddleware());
|
|
29664
|
+
}
|
|
29665
|
+
const allMiddlewares = [
|
|
29666
|
+
...defaultMiddlewares,
|
|
29667
|
+
...middlewares
|
|
29668
|
+
];
|
|
29669
|
+
for (const middleware of allMiddlewares) {
|
|
29559
29670
|
if (middleware.enabled && !middleware.enabled(context)) {
|
|
29560
29671
|
continue;
|
|
29561
29672
|
}
|
|
@@ -29581,6 +29692,7 @@ __name(registerMiddlewares, "registerMiddlewares");
|
|
|
29581
29692
|
export {
|
|
29582
29693
|
createCollectLogsMiddleware,
|
|
29583
29694
|
createDevLogsMiddleware,
|
|
29695
|
+
createHealthCheckMiddleware,
|
|
29584
29696
|
createOpenapiMiddleware,
|
|
29585
29697
|
handleDevProxyError,
|
|
29586
29698
|
normalizeBasePath,
|