From c1f6e0bdcf84d5684eca2bce20d6868c7bf9038e Mon Sep 17 00:00:00 2001 From: Flik Date: Mon, 5 Jan 2026 20:13:06 +0800 Subject: [PATCH] feat: refactor logger to avoid standard output in log method and update JSPlugin HTTP handler to use goja.Callable --- internal/client/tunnel/logger.go | 8 ++------ pkg/plugin/script/js.go | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/internal/client/tunnel/logger.go b/internal/client/tunnel/logger.go index 1784122..3782529 100644 --- a/internal/client/tunnel/logger.go +++ b/internal/client/tunnel/logger.go @@ -104,12 +104,8 @@ func (l *Logger) log(level LogLevel, source, format string, args ...interface{}) Source: source, } - // 输出到标准输出 - fmt.Printf("%s [%s] [%s] %s\n", - time.Now().Format("2006-01-02 15:04:05"), - entry.Level, - entry.Source, - entry.Message) + // 注意:不在这里输出到标准输出,因为调用方(logf/logErrorf/logWarnf)已经调用了 log.Print + // 这里只负责:缓冲区存储、文件写入、订阅者通知 // 添加到环形缓冲区 l.bufferMu.Lock() diff --git a/pkg/plugin/script/js.go b/pkg/plugin/script/js.go index 03cdbf4..93c27dd 100644 --- a/pkg/plugin/script/js.go +++ b/pkg/plugin/script/js.go @@ -390,7 +390,7 @@ func (p *JSPlugin) createHttpAPI() map[string]interface{} { } // httpServe 启动 HTTP 服务处理连接 -func (p *JSPlugin) httpServe(conn net.Conn, handler func(map[string]interface{}) map[string]interface{}) { +func (p *JSPlugin) httpServe(conn net.Conn, handler goja.Callable) { defer conn.Close() buf := make([]byte, 4096) @@ -400,7 +400,28 @@ func (p *JSPlugin) httpServe(conn net.Conn, handler func(map[string]interface{}) } req := parseHTTPRequest(buf[:n]) - resp := handler(req) + + // 调用 JS handler 函数 + result, err := handler(goja.Undefined(), p.vm.ToValue(req)) + if err != nil { + fmt.Printf("[JS:%s] HTTP handler error: %v\n", p.name, err) + conn.Write([]byte("HTTP/1.1 500 Internal Server Error\r\n\r\n")) + return + } + + // 将结果转换为 map + if result == nil || goja.IsUndefined(result) || goja.IsNull(result) { + conn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n")) + return + } + + resp := make(map[string]interface{}) + respObj := result.ToObject(p.vm) + for _, key := range respObj.Keys() { + val := respObj.Get(key) + resp[key] = val.Export() + } + writeHTTPResponse(conn, resp) }