Pārlūkot izejas kodu

(jsrt) opt. & fix: cfg loading

lollipopkit🏳️‍⚧️ 7 mēneši atpakaļ
vecāks
revīzija
4c72f2abed
5 mainītis faili ar 19 papildinājumiem un 14 dzēšanām
  1. 1 1
      middleware/jsrt/cfg.go
  2. 11 10
      middleware/jsrt/jsrt.go
  3. 1 1
      router/api-router.go
  4. 5 1
      router/main.go
  5. 1 1
      scripts/pre_process.js

+ 1 - 1
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"
 	}

+ 11 - 10
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")
 	}
-}
+}

+ 1 - 1
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)

+ 5 - 1
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)

+ 1 - 1
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")) {