diff --git a/middleware/jsrt/cfg.go b/middleware/jsrt/cfg.go index 2ad5aff0b..fc333f94c 100644 --- a/middleware/jsrt/cfg.go +++ b/middleware/jsrt/cfg.go @@ -28,7 +28,7 @@ const ( defaultMaxVMCount = 8 ) -func init() { +func loadCfg() { if enabled := os.Getenv("JS_RUNTIME_ENABLED"); enabled != "" { jsConfig.Enabled = enabled == "true" } diff --git a/middleware/jsrt/jsrt.go b/middleware/jsrt/jsrt.go index 2de1a3811..37f65829d 100644 --- a/middleware/jsrt/jsrt.go +++ b/middleware/jsrt/jsrt.go @@ -18,8 +18,7 @@ import ( "github.com/gin-gonic/gin" ) - -/// 池化 +// / 池化 type JSRuntimePool struct { pool chan *goja.Runtime maxSize int @@ -87,7 +86,7 @@ func (p *JSRuntimePool) Put(vm *goja.Runtime) { if vm == nil { return } - + select { case p.pool <- vm: default: @@ -240,7 +239,7 @@ func (p *JSRuntimePool) executeWithTimeout(vm *goja.Runtime, fn func() (goja.Val resultChan <- result{err: fmt.Errorf("JS panic: %v", r)} } }() - + value, err := fn() resultChan <- result{value: value, err: err} }() @@ -438,15 +437,16 @@ func (p *JSRuntimePool) hasPostProcessFunction() bool { return postProcessFunc != nil && !goja.IsUndefined(postProcessFunc) } -func JSRuntimeMiddleware() gin.HandlerFunc { +func JSRuntimeMiddleware() *gin.HandlerFunc { + loadCfg() if !jsConfig.Enabled { - return func(c *gin.Context) { - c.Next() - } + common.SysLog("JavaScript Runtime is disabled") + return nil } pool := initJSRuntimePool() - return func(c *gin.Context) { + var fn gin.HandlerFunc + fn = func(c *gin.Context) { start := time.Now() // 预处理 @@ -507,6 +507,7 @@ func JSRuntimeMiddleware() gin.HandlerFunc { common.SysLog(fmt.Sprintf("JS Runtime processing took %v", duration)) } } + return &fn } func ReloadJSScripts() { @@ -514,4 +515,4 @@ func ReloadJSScripts() { jsRuntimePool.ReloadScripts() common.SysLog("JavaScript scripts reloaded") } -} \ No newline at end of file +} diff --git a/router/api-router.go b/router/api-router.go index a8965d6bc..585ffec3b 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -19,7 +19,7 @@ func SetApiRouter(router *gin.Engine) { apiRouter.GET("/uptime/status", controller.GetUptimeKumaStatus) apiRouter.GET("/models", middleware.UserAuth(), controller.DashboardListModels) apiRouter.GET("/status/test", middleware.AdminAuth(), controller.TestStatus) - apiRouter.GET("/js_rt/reload", middleware.AdminAuth(), controller.ReloadJSScripts) + apiRouter.GET("/jsrt/reload", middleware.AdminAuth(), controller.ReloadJSScripts) apiRouter.GET("/notice", controller.GetNotice) apiRouter.GET("/about", controller.GetAbout) //apiRouter.GET("/midjourney", controller.GetMidjourney) diff --git a/router/main.go b/router/main.go index ff4b97055..198c94d88 100644 --- a/router/main.go +++ b/router/main.go @@ -13,7 +13,11 @@ import ( ) func SetRouter(router *gin.Engine, buildFS embed.FS, indexPage []byte) { - router.Use(jsrt.JSRuntimeMiddleware()) + jsrtMid := jsrt.JSRuntimeMiddleware() + if jsrtMid != nil { + router.Use(*jsrtMid) + } + SetApiRouter(router) SetDashboardRouter(router) SetRelayRouter(router) diff --git a/scripts/pre_process.js b/scripts/pre_process.js index 5d7408316..7ab6e71ea 100644 --- a/scripts/pre_process.js +++ b/scripts/pre_process.js @@ -4,7 +4,7 @@ // @param {Object} ctx - 请求上下文对象 // @returns {Object|undefined} - 返回修改后的请求对象或 undefined // -// 参考: [JS Rt](./middleware/js_rt.go) 里的 `JSContext` +// 参考: [JS Rt](./middleware/jsrt/ctx.go) 里的 `JSContext` function preProcessRequest(ctx) { // 例子:基于数据库的速率限制 // if (ctx.url.includes("/v1/chat/completions")) {