diff --git a/internal/client/tunnel/client.go b/internal/client/tunnel/client.go index 2b1e37d..9ca1459 100644 --- a/internal/client/tunnel/client.go +++ b/internal/client/tunnel/client.go @@ -601,7 +601,6 @@ func (c *Client) handleJSPluginInstall(stream net.Conn, msg *protocol.Message) { } c.logf("[Client] JS plugin %s installed", req.PluginName) - c.sendJSPluginResult(stream, req.PluginName, true, "") // 保存版本信息(防止降级攻击) if c.versionStore != nil { @@ -611,10 +610,13 @@ func (c *Client) handleJSPluginInstall(stream net.Conn, msg *protocol.Message) { } } - // 自动启动 + // 先启动插件,再发送安装结果 + // 这样服务端收到结果后启动监听器时,客户端插件已经准备好了 if req.AutoStart { c.startJSPlugin(jsPlugin, req) } + + c.sendJSPluginResult(stream, req.PluginName, true, "") } // sendJSPluginResult 发送 JS 插件安装结果 diff --git a/internal/server/tunnel/server.go b/internal/server/tunnel/server.go index b7fb154..65c130d 100644 --- a/internal/server/tunnel/server.go +++ b/internal/server/tunnel/server.go @@ -1607,13 +1607,15 @@ func (s *Server) reinstallJSPlugin(clientID, pluginName, ruleName string) error return fmt.Errorf("client not found: %w", err) } - // 合并配置 + // 合并配置并获取 PluginID config := jsPlugin.Config if config == nil { config = make(map[string]string) } + var pluginID string for _, cp := range client.Plugins { if cp.Name == pluginName { + pluginID = cp.ID for k, v := range cp.Config { config[k] = v } @@ -1621,9 +1623,10 @@ func (s *Server) reinstallJSPlugin(clientID, pluginName, ruleName string) error } } - log.Printf("[Server] Reinstalling JS plugin %s to client %s", pluginName, clientID) + log.Printf("[Server] Reinstalling JS plugin %s (ID: %s) to client %s", pluginName, pluginID, clientID) req := router.JSPluginInstallRequest{ + PluginID: pluginID, PluginName: pluginName, Source: jsPlugin.Source, Signature: jsPlugin.Signature,