
---@class copas_debug*
local copas_debug = {}

---@class copas*
---@field _COPYRIGHT string 版权信息。
---@field _DESCRIPTION string 模块描述。
---@field _VERSION string 模块版本。
---@field autoclose boolean handler 结束后是否自动关闭 socket。
---@field running boolean loop 是否正在运行。
---@field receivePartial function deprecated，等同于 receivepartial。
---@field setErrorHandler function deprecated，等同于 seterrorhandler。
---@field debug copas_debug* 调试工具。
---@type copas*
local M = {}

M._COPYRIGHT = nil
M._DESCRIPTION = nil
M._VERSION = nil
M.autoclose = true
M.running = false
M.receivePartial = nil
M.setErrorHandler = nil
M.debug = copas_debug

--- 关闭 socket。
---@param skt any socket。
---@param ... any 参数。
---@return any result 关闭结果。
function M.close(skt, ...) end

--- 设置 socket 超时。
---@param skt any socket。
---@param timeout? number 超时时间。
---@return any result 结果。
function M.settimeout(skt, timeout) end

--- 设置 connect/send/read 三类超时。
---@param skt any socket。
---@param connect? number connect 超时。
---@param send? number send 超时。
---@param read? number read 超时。
function M.settimeouts(skt, connect, send, read) end

--- 接收数据。
---@param client any socket。
---@param pattern? string|integer 接收模式。
---@param part? string 已接收部分。
---@return string|nil data 数据。
---@return string? errMsg 错误信息。
---@return string? partial 部分数据。
function M.receive(client, pattern, part) end

--- UDP 接收。
---@param client any socket。
---@param size? integer 字节数。
---@return string|nil data 数据。
---@return string? ip 来源 IP。
---@return integer|string? portOrErr 来源端口或错误。
function M.receivefrom(client, size) end

--- 接收部分数据。
---@param client any socket。
---@param pattern? string|integer 接收模式。
---@param part? string 已接收部分。
---@return string|nil data 数据。
---@return string? errMsg 错误信息。
---@return string? partial 部分数据。
function M.receivepartial(client, pattern, part) end

--- 发送数据。
---@param client any socket。
---@param data string 数据。
---@param from? integer 起始位置。
---@param to? integer 结束位置。
---@return integer|nil sent 已发送位置。
---@return string? errMsg 错误信息。
function M.send(client, data, from, to) end

--- UDP 发送。
---@param client any socket。
---@param data string 数据。
---@param ip string 目标 IP。
---@param port integer 目标端口。
---@return integer|nil sent 已发送字节数。
---@return string? errMsg 错误信息。
function M.sendto(client, data, ip, port) end

--- 连接 socket。
---@param skt any socket。
---@param host string 主机。
---@param port integer 端口。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function M.connect(skt, host, port) end

--- 执行 TLS handshake。
---@param skt any socket。
---@param wrap_params? table TLS 参数。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function M.dohandshake(skt, wrap_params) end

--- flush 当前 socket。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function M.flush() end

--- 将普通 socket 包装为 Copas socket。
---@param skt any 原始 socket。
---@param sslt? table TLS 参数。
---@return any wrapped Copas socket。
function M.wrap(skt, sslt) end

--- 创建 server handler。
---@param handler function handler 函数。
---@param sslparams? table TLS 参数。
---@return function handler 包装后的 handler。
function M.handler(handler, sslparams) end

--- 获取 traceback。
---@param msg any 错误消息。
---@param co? thread coroutine。
---@param skt? any socket。
---@return string traceback traceback。
function M.gettraceback(msg, co, skt) end

--- 设置错误处理器。
---@param err function 错误处理器。
---@param default? boolean 是否设置默认处理器。
function M.seterrorhandler(err, default) end

--- 获取错误处理器。
---@param co? thread coroutine。
---@return function handler 错误处理器。
function M.geterrorhandler(co) end

--- 切换 socket timeout error 行为。
---@param enabled boolean 是否启用。
function M.useSocketTimeoutErrors(enabled) end

--- 添加 server。
---@param server any server socket。
---@param handler function handler 函数。
---@param timeout? number 超时。
---@param name? string 名称。
---@return any server server。
function M.addserver(server, handler, timeout, name) end

--- 移除 server。
---@param server any server socket。
---@param keep_open? boolean 是否保持打开。
---@return any result 结果。
function M.removeserver(server, keep_open) end

--- 添加命名 coroutine。
---@param name string 名称。
---@param handler function 函数。
---@param ... any 参数。
---@return thread co coroutine。
function M.addnamedthread(name, handler, ...) end

--- 添加 coroutine。
---@param handler function 函数。
---@param ... any 参数。
---@return thread co coroutine。
function M.addthread(handler, ...) end

--- 移除 coroutine。
---@param thread thread coroutine。
function M.removethread(thread) end

--- 睡眠指定秒数。
---@param seconds number 秒数。
function M.sleep(seconds) end

--- 暂停当前 coroutine。
---@param seconds? number 秒数。
function M.pause(seconds) end

--- 永久暂停当前 coroutine，直到被 wakeup。
function M.pauseforever() end

--- 唤醒 coroutine。
---@param co thread coroutine。
function M.wakeup(co) end

--- 获取当前超时配置。
---@return table timeouts 超时配置。
function M.gettimeouts() end

--- 创建一次性定时器。
---@param delay number 延迟秒数。
---@param callback function 回调。
---@return any timer 定时器。
function M.timeout(delay, callback) end

--- 执行一轮 loop。
---@param timeout? number 超时。
---@return boolean running 是否仍在运行。
function M.step(timeout) end

--- 判断 loop 是否结束。
---@return boolean finished 是否结束。
function M.finished() end

--- 获取状态。
---@param enable_stats? boolean 是否启用统计。
---@return table|string status 状态。
function M.status(enable_stats) end

--- 运行 Copas loop。
---@param initializer? function 初始化函数。
---@param timeout? number 超时。
function M.loop(initializer, timeout) end

--- 设置 socket 名称。
---@param name string 名称。
---@param skt any socket。
function M.setsocketname(name, skt) end

--- 获取 socket 名称。
---@param skt any socket。
---@return string name 名称。
function M.getsocketname(skt) end

--- 设置 coroutine 名称。
---@param name string 名称。
---@param coro thread coroutine。
function M.setthreadname(name, coro) end

--- 获取 coroutine 名称。
---@param coro thread coroutine。
---@return string name 名称。
function M.getthreadname(coro) end

--- 启动调试。
---@param logger? function 日志函数。
---@param core? table 调试 core。
function copas_debug.start(logger, core) end

--- 停止调试。
function copas_debug.stop() end

--- 包装调试 socket。
---@param original_skt any 原始 socket。
---@return any socket 调试 socket。
function copas_debug.socket(original_skt) end

return M
