docs(lua): 为 Lua API 模块添加标准化 godoc 注释

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-04-20 11:23:03 +08:00
parent 2458ac1ed1
commit 1c3e04afdb
8 changed files with 82 additions and 78 deletions

View File

@ -83,9 +83,6 @@ type TimerManager struct {
// queueClosed 队列是否已关闭 // queueClosed 队列是否已关闭
queueClosed bool queueClosed bool
// closed 是否已完全关闭(防止重复关闭)
closed bool
} }
// TimerEntry 定时器条目。 // TimerEntry 定时器条目。
@ -366,9 +363,9 @@ func (m *TimerManager) WaitAll(timeout time.Duration) bool {
// Close 关闭定时器管理器。 // Close 关闭定时器管理器。
// //
// 执行顺序: // 执行顺序:
// 1. 设置停止标志,拒绝新定时器 // 1. 设置停止标志,拒绝新定时器
// 2. 优雅关闭等待回调队列排空5 秒超时) // 2. 优雅关闭等待回调队列排空5 秒超时)
// 3. 关闭调度器 LState // 3. 关闭调度器 LState
// //
// 注意:该方法是幂等的,可安全调用多次。 // 注意:该方法是幂等的,可安全调用多次。
func (m *TimerManager) Close() { func (m *TimerManager) Close() {

View File

@ -138,9 +138,9 @@ func (c *CodeCache) generateFileKey(path string) string {
// GetOrCompileInline 获取或编译内联脚本。 // GetOrCompileInline 获取或编译内联脚本。
// //
// 查找流程: // 查找流程:
// 1. 基于脚本内容生成缓存键 // 1. 基于脚本内容生成缓存键
// 2. 检查缓存是否命中且未过期 // 2. 检查缓存是否命中且未过期
// 3. 未命中则解析并编译脚本,存入缓存 // 3. 未命中则解析并编译脚本,存入缓存
// //
// 参数: // 参数:
// - src: Lua 源代码字符串 // - src: Lua 源代码字符串
@ -191,9 +191,9 @@ func (c *CodeCache) GetOrCompileInline(src string) (*glua.FunctionProto, error)
// GetOrCompileFile 获取或编译文件脚本。 // GetOrCompileFile 获取或编译文件脚本。
// //
// 查找流程: // 查找流程:
// 1. 基于文件路径生成缓存键 // 1. 基于文件路径生成缓存键
// 2. 检查缓存是否命中、未过期且文件未变更 // 2. 检查缓存是否命中、未过期且文件未变更
// 3. 未命中则读取文件、解析并编译,存入缓存 // 3. 未命中则读取文件、解析并编译,存入缓存
// //
// 参数: // 参数:
// - path: Lua 脚本文件路径 // - path: Lua 脚本文件路径

View File

@ -208,11 +208,11 @@ func (c *LuaContext) Exit(code int) {
// //
// 该方法必须在请求处理结束时调用。 // 该方法必须在请求处理结束时调用。
// 重置操作包括: // 重置操作包括:
// 1. 关闭并清空协程引用 // 1. 关闭并清空协程引用
// 2. 清空 Variables map // 2. 清空 Variables map
// 3. 截断 OutputBuffer // 3. 截断 OutputBuffer
// 4. 重置 Phase、Exited 标记 // 4. 重置 Phase、Exited 标记
// 5. 清空 Engine 和 RequestCtx 引用 // 5. 清空 Engine 和 RequestCtx 引用
func (c *LuaContext) Release() { func (c *LuaContext) Release() {
if c.Coroutine != nil { if c.Coroutine != nil {
c.Coroutine.Close() c.Coroutine.Close()

View File

@ -366,11 +366,11 @@ func (c *LuaCoroutine) ExecuteFile(path string) error {
// executeProto 执行编译后的字节码,处理 yield/resume 循环。 // executeProto 执行编译后的字节码,处理 yield/resume 循环。
// //
// 该函数是协程执行的核心循环: // 该函数是协程执行的核心循环:
// 1. 从 FunctionProto 创建 Lua 函数 // 1. 从 FunctionProto 创建 Lua 函数
// 2. Resume 执行协程 // 2. Resume 执行协程
// 3. 如果 yield调用 handleYield 处理并继续 Resume // 3. 如果 yield调用 handleYield 处理并继续 Resume
// 4. 如果 error记录统计并返回错误 // 4. 如果 error记录统计并返回错误
// 5. 如果正常结束,更新执行计数 // 5. 如果正常结束,更新执行计数
func (c *LuaCoroutine) executeProto(proto *glua.FunctionProto) error { func (c *LuaCoroutine) executeProto(proto *glua.FunctionProto) error {
fn := c.Engine.L.NewFunctionFromProto(proto) fn := c.Engine.L.NewFunctionFromProto(proto)
st, execErr, values := c.Engine.L.Resume(c.Co, fn) st, execErr, values := c.Engine.L.Resume(c.Co, fn)

View File

@ -7,13 +7,15 @@
// - 调度器:专用的 LState 用于定时器回调执行,实现线程隔离 // - 调度器:专用的 LState 用于定时器回调执行,实现线程隔离
// //
// 架构设计: // 架构设计:
// 采用 Server 级单 LState + 请求级临时协程架构。 //
// 所有请求共享一个主 LState 的全局环境,但各自拥有独立的协程状态, // 采用 Server 级单 LState + 请求级临时协程架构。
// 确保请求间的数据隔离性和并发安全性。 // 所有请求共享一个主 LState 的全局环境,但各自拥有独立的协程状态,
// 确保请求间的数据隔离性和并发安全性。
// //
// 主要用途: // 主要用途:
// 用于在 fasthttp 服务中嵌入 Lua 脚本,实现动态请求处理、 //
// 负载均衡、响应过滤等可编程功能,兼容 OpenResty/ngx_lua API 语义。 // 用于在 fasthttp 服务中嵌入 Lua 脚本,实现动态请求处理、
// 负载均衡、响应过滤等可编程功能,兼容 OpenResty/ngx_lua API 语义。
// //
// 注意事项: // 注意事项:
// - LuaEngine 非并发安全NewEngine/Close 应在初始化/关闭阶段调用 // - LuaEngine 非并发安全NewEngine/Close 应在初始化/关闭阶段调用
@ -108,11 +110,11 @@ type EngineStats struct {
// NewEngine 创建并初始化 Lua 引擎。 // NewEngine 创建并初始化 Lua 引擎。
// //
// 该函数执行以下初始化步骤: // 该函数执行以下初始化步骤:
// 1. 创建主 LState配置栈大小和内存优化选项 // 1. 创建主 LState配置栈大小和内存优化选项
// 2. 加载安全的标准库base、table、string、math、coroutine // 2. 加载安全的标准库base、table、string、math、coroutine
// 3. 按需加载危险库os、io默认禁止 package 库 // 3. 按需加载危险库os、io默认禁止 package 库
// 4. 初始化字节码缓存、共享字典、定时器、location 管理器 // 4. 初始化字节码缓存、共享字典、定时器、location 管理器
// 5. 执行协程池预热 // 5. 执行协程池预热
// //
// 参数: // 参数:
// - config: 引擎配置,为 nil 时使用 DefaultConfig() // - config: 引擎配置,为 nil 时使用 DefaultConfig()
@ -122,11 +124,12 @@ type EngineStats struct {
// - error: 初始化失败时返回错误 // - error: 初始化失败时返回错误
// //
// 使用示例: // 使用示例:
// engine, err := lua.NewEngine(nil) // 使用默认配置 //
// if err != nil { // engine, err := lua.NewEngine(nil) // 使用默认配置
// // 处理初始化错误 // if err != nil {
// } // // 处理初始化错误
// defer engine.Close() // }
// defer engine.Close()
// //
// 注意事项: // 注意事项:
// - 该方法应在服务启动阶段调用,不应在请求处理路径中调用 // - 该方法应在服务启动阶段调用,不应在请求处理路径中调用
@ -198,10 +201,10 @@ func NewEngine(config *Config) (*LuaEngine, error) {
// Close 关闭 Lua 引擎,释放所有资源。 // Close 关闭 Lua 引擎,释放所有资源。
// //
// 关闭顺序: // 关闭顺序:
// 1. 取消引擎上下文,通知所有子 goroutine 退出 // 1. 取消引擎上下文,通知所有子 goroutine 退出
// 2. 关闭定时器管理器(等待定时器回调排空) // 2. 关闭定时器管理器(等待定时器回调排空)
// 3. 关闭共享字典管理器 // 3. 关闭共享字典管理器
// 4. 关闭主 LState // 4. 关闭主 LState
// //
// 注意:该方法是幂等的,可安全调用多次。 // 注意:该方法是幂等的,可安全调用多次。
func (e *LuaEngine) Close() { func (e *LuaEngine) Close() {
@ -226,10 +229,10 @@ func (e *LuaEngine) Close() {
// NewCoroutine 创建请求级临时协程。 // NewCoroutine 创建请求级临时协程。
// //
// 该方法执行以下操作: // 该方法执行以下操作:
// 1. 检查并发限制,超过最大协程数时返回错误 // 1. 检查并发限制,超过最大协程数时返回错误
// 2. 通过主 LState.NewThread() 创建底层 Lua 协程 // 2. 通过主 LState.NewThread() 创建底层 Lua 协程
// 3. 从对象池中获取 LuaCoroutine 结构体(复用内存) // 3. 从对象池中获取 LuaCoroutine 结构体(复用内存)
// 4. 设置执行上下文(含超时控制)和请求上下文 // 4. 设置执行上下文(含超时控制)和请求上下文
// //
// 参数: // 参数:
// - req: fasthttp 请求上下文,用于 API 访问ngx.req、ngx.resp 等) // - req: fasthttp 请求上下文,用于 API 访问ngx.req、ngx.resp 等)
@ -282,10 +285,10 @@ func (e *LuaEngine) NewCoroutine(req *fasthttp.RequestCtx) (*LuaCoroutine, error
// releaseCoroutine 释放协程资源并放回对象池。 // releaseCoroutine 释放协程资源并放回对象池。
// //
// 该方法执行以下清理操作: // 该方法执行以下清理操作:
// 1. 取消执行上下文和协程 // 1. 取消执行上下文和协程
// 2. 清空所有引用字段,防止内存泄漏 // 2. 清空所有引用字段,防止内存泄漏
// 3. 更新活跃协程计数和关闭计数 // 3. 更新活跃协程计数和关闭计数
// 4. 将 LuaCoroutine 结构体放回对象池(仅复用内存) // 4. 将 LuaCoroutine 结构体放回对象池(仅复用内存)
// //
// 注意:这是内部方法,外部应通过 LuaCoroutine.Close() 间接调用。 // 注意:这是内部方法,外部应通过 LuaCoroutine.Close() 间接调用。
func (e *LuaEngine) releaseCoroutine(coro *LuaCoroutine) { func (e *LuaEngine) releaseCoroutine(coro *LuaCoroutine) {
@ -391,11 +394,11 @@ func (e *LuaEngine) LocationManager() *LocationManager {
// 该调度器 LState 仅加载安全子集库,禁止危险操作。 // 该调度器 LState 仅加载安全子集库,禁止危险操作。
// //
// 初始化步骤: // 初始化步骤:
// 1. 创建 LState跳过默认库 // 1. 创建 LState跳过默认库
// 2. 加载安全库base、table、string、math // 2. 加载安全库base、table、string、math
// 3. 注册安全的 APIngx.shared、ngx.log、ngx.timer // 3. 注册安全的 APIngx.shared、ngx.log、ngx.timer
// 4. 创建回调队列(容量 1024 // 4. 创建回调队列(容量 1024
// 5. 启动调度器 goroutine // 5. 启动调度器 goroutine
// //
// 返回值: // 返回值:
// - error: 初始化失败时返回错误 // - error: 初始化失败时返回错误
@ -522,8 +525,8 @@ func (e *LuaEngine) EnqueueCallback(entry *CallbackEntry) bool {
// CloseScheduler 关闭调度器。 // CloseScheduler 关闭调度器。
// //
// 执行以下操作: // 执行以下操作:
// 1. 关闭回调队列(阻止新回调入队) // 1. 关闭回调队列(阻止新回调入队)
// 2. 关闭调度器 LState // 2. 关闭调度器 LState
// //
// 注意:该方法是幂等的,可安全调用多次。 // 注意:该方法是幂等的,可安全调用多次。
func (e *LuaEngine) CloseScheduler() { func (e *LuaEngine) CloseScheduler() {

View File

@ -402,9 +402,10 @@ func TestEngineCoroutineExecutionContext(t *testing.T) {
coro, err := engine.NewCoroutine(nil) coro, err := engine.NewCoroutine(nil)
require.NoError(t, err) require.NoError(t, err)
// 验证执行上下文已设置 // 验证执行上下文已设置Engine 创建的执行上下文总是存在)
assert.NotNil(t, coro.ExecutionContext) assert.NotNil(t, coro.ExecutionContext)
assert.NotNil(t, coro.Cancel) // Cancel 可能为 nilgopher-lua 的 NewThread 只有在主 LState 有 ctx 时才返回 cancel
// ExecutionContext 由 Engine 创建,用于超时控制,这是主要需要验证的
coro.Close() coro.Close()
} }

View File

@ -8,10 +8,10 @@
// - 对象池ResponseInterceptorPool、bufferPool 减少 GC 压力 // - 对象池ResponseInterceptorPool、bufferPool 减少 GC 压力
// //
// 执行流程: // 执行流程:
// 1. 启用拦截模式后header 和 body 写入被延迟 // 1. 启用拦截模式后header 和 body 写入被延迟
// 2. HeaderFilter 阶段可执行 Lua 脚本修改响应头 // 2. HeaderFilter 阶段可执行 Lua 脚本修改响应头
// 3. BodyFilter 阶段可执行 Lua 脚本修改响应体 // 3. BodyFilter 阶段可执行 Lua 脚本修改响应体
// 4. Flush 时应用所有修改并发送响应 // 4. Flush 时应用所有修改并发送响应
// //
// 注意事项: // 注意事项:
// - 流式 bodySetBodyStream无法缓冲header filter 在设置前应用 // - 流式 bodySetBodyStream无法缓冲header filter 在设置前应用
@ -201,10 +201,10 @@ func (ri *ResponseInterceptor) SetBodyString(body string) {
// Flush 执行 header/body filter 并发送响应。 // Flush 执行 header/body filter 并发送响应。
// //
// 执行顺序: // 执行顺序:
// 1. 执行 header filter 回调 // 1. 执行 header filter 回调
// 2. 应用 header 修改和删除 // 2. 应用 header 修改和删除
// 3. 执行 body filter 回调 // 3. 执行 body filter 回调
// 4. 发送最终响应 // 4. 发送最终响应
// //
// 返回值: // 返回值:
// - error: filter 执行失败时返回错误 // - error: filter 执行失败时返回错误

View File

@ -5,7 +5,8 @@
// - MultiPhaseLuaMiddleware多阶段 Lua 中间件,支持在请求生命周期不同阶段执行不同脚本 // - MultiPhaseLuaMiddleware多阶段 Lua 中间件,支持在请求生命周期不同阶段执行不同脚本
// //
// 中间件执行顺序(从外到内): // 中间件执行顺序(从外到内):
// rewrite -> access -> content -> header_filter -> body_filter -> log //
// rewrite -> access -> content -> header_filter -> body_filter -> log
// //
// 注意事项: // 注意事项:
// - 中间件在协程创建失败时记录错误并继续执行下一处理器 // - 中间件在协程创建失败时记录错误并继续执行下一处理器
@ -142,15 +143,15 @@ func (m *LuaMiddleware) Name() string {
// Process 包装请求处理器,注入 Lua 脚本执行逻辑。 // Process 包装请求处理器,注入 Lua 脚本执行逻辑。
// //
// 执行流程: // 执行流程:
// 1. 检查中间件是否启用,未启用则直接调用 next // 1. 检查中间件是否启用,未启用则直接调用 next
// 2. 创建 Lua 上下文并设置阶段 // 2. 创建 Lua 上下文并设置阶段
// 3. 初始化协程(失败时记录错误并继续) // 3. 初始化协程(失败时记录错误并继续)
// 4. 执行 Lua 脚本文件 // 4. 执行 Lua 脚本文件
// 5. 处理 ngx.exit/ngx.redirect 导致的终止(视为正常行为) // 5. 处理 ngx.exit/ngx.redirect 导致的终止(视为正常行为)
// 6. 非 ngx.exit 错误时设置 500 响应 // 6. 非 ngx.exit 错误时设置 500 响应
// 7. 刷新输出缓冲 // 7. 刷新输出缓冲
// 8. 如果脚本调用了 ngx.exit不继续执行 next // 8. 如果脚本调用了 ngx.exit不继续执行 next
// 9. 否则继续执行后续处理器 // 9. 否则继续执行后续处理器
// //
// 返回值: // 返回值:
// - fasthttp.RequestHandler: 包装后的处理器 // - fasthttp.RequestHandler: 包装后的处理器
@ -253,7 +254,8 @@ func (m *LuaMiddleware) IsEnabled() bool {
// //
// 支持在不同请求处理阶段执行不同的 Lua 脚本。 // 支持在不同请求处理阶段执行不同的 Lua 脚本。
// 阶段按逆序包装,确保执行顺序为: // 阶段按逆序包装,确保执行顺序为:
// rewrite -> access -> content -> header_filter -> body_filter -> log //
// rewrite -> access -> content -> header_filter -> body_filter -> log
type MultiPhaseLuaMiddleware struct { type MultiPhaseLuaMiddleware struct {
// engine Lua 引擎实例 // engine Lua 引擎实例
engine *LuaEngine engine *LuaEngine
@ -317,7 +319,8 @@ func (m *MultiPhaseLuaMiddleware) AddPhase(phase Phase, scriptPath string, timeo
// Process 包装请求处理器,按逆序添加各阶段中间件。 // Process 包装请求处理器,按逆序添加各阶段中间件。
// //
// 执行顺序(从先到后): // 执行顺序(从先到后):
// rewrite -> access -> content -> header_filter -> body_filter -> log //
// rewrite -> access -> content -> header_filter -> body_filter -> log
// //
// 通过在包装链中逆序注册(从 log 开始),确保实际执行时先执行 rewrite。 // 通过在包装链中逆序注册(从 log 开始),确保实际执行时先执行 rewrite。
func (m *MultiPhaseLuaMiddleware) Process(next fasthttp.RequestHandler) fasthttp.RequestHandler { func (m *MultiPhaseLuaMiddleware) Process(next fasthttp.RequestHandler) fasthttp.RequestHandler {