lolly/internal/lua/middleware_config.go

93 lines
2.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package lua 提供 Lua 中间件配置解析与验证。
//
// 该文件定义从配置文件YAML加载的中间件配置结构包括
// - MiddlewareConfig完整的中间件配置含脚本列表、全局设置、启用标记
// - ScriptConfig单个脚本的配置路径、阶段、超时、启用标记
// - GlobalLuaSettings全局 Lua 引擎设置(并发、缓存、栈大小等)
// - ParsePhase字符串到 Phase 常量的转换
// - ToEngineConfig将配置文件的设置转换为引擎配置
//
// 注意事项:
// - Phase 值必须为rewrite、access、content、log、header_filter、body_filter
// - 超时时间至少为 1 秒
// - 最大并发协程数至少为 1
//
// 作者xfy
package lua
import (
"fmt"
"time"
)
// MiddlewareConfig Lua 中间件配置(配置文件格式)
type MiddlewareConfig struct {
Scripts []ScriptConfig `yaml:"scripts"`
GlobalSettings GlobalLuaSettings `yaml:"global_settings"`
Enabled bool `yaml:"enabled"`
}
// ScriptConfig 单个脚本配置
type ScriptConfig struct {
// Path 脚本路径
Path string `yaml:"path"`
// Phase 执行阶段
// 可选值rewrite、access、content、log、header_filter、body_filter
Phase string `yaml:"phase"`
// Timeout 执行超时
Timeout time.Duration `yaml:"timeout"`
// Enabled 是否启用此脚本(默认 true
Enabled bool `yaml:"enabled"`
}
// GlobalLuaSettings 全局 Lua 设置
type GlobalLuaSettings struct {
// MaxConcurrentCoroutines 最大并发协程数
MaxConcurrentCoroutines int `yaml:"max_concurrent_coroutines"`
// CoroutineTimeout 协程执行超时
CoroutineTimeout time.Duration `yaml:"coroutine_timeout"`
// CodeCacheSize 字节码缓存条目数
CodeCacheSize int `yaml:"code_cache_size"`
// MaxExecutionTime 单脚本最大执行时间
MaxExecutionTime time.Duration `yaml:"max_execution_time"`
// CoroutineStackSize 协程栈大小默认64最大256
// 较小的栈减少内存分配,适用于简单脚本
CoroutineStackSize int `yaml:"coroutine_stack_size"`
// CoroutinePoolWarmup 协程池预热数量,启动时预创建
CoroutinePoolWarmup int `yaml:"coroutine_pool_warmup"`
// EnableFileWatch 启用文件变更检测
EnableFileWatch bool `yaml:"enable_file_watch"`
// MinimizeStackMemory 启用栈内存自动收缩以减少内存占用
MinimizeStackMemory bool `yaml:"minimize_stack_memory"`
}
// ParsePhase 将字符串转换为 Phase 常量
func ParsePhase(s string) (Phase, error) {
switch s {
case "rewrite":
return PhaseRewrite, nil
case "access":
return PhaseAccess, nil
case "content":
return PhaseContent, nil
case "log":
return PhaseLog, nil
case "header_filter":
return PhaseHeaderFilter, nil
case "body_filter":
return PhaseBodyFilter, nil
default:
return PhaseInit, fmt.Errorf("unknown phase: %s", s)
}
}