
--------------------------------------------------------------------------------
-- LuaSocket 模块
--------------------------------------------------------------------------------

---@alias socket_timeout number|nil

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

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

---@class socket_server*: socket_tcp_client*
local socket_server = {}

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

---@type socket_core*
local core = require("socket.core")

---@class socket*: socket_core*
---@field _VERSION string 版本
---@field BLOCKSIZE integer LTN12 块大小
---@field dns socket_core_dns* DNS 工具
---@field sourcet table source 工厂表
---@field sinkt table sink 工厂表
---@type socket*
local M = core

M.dns = socket_dns
M.BLOCKSIZE = 2048

--- 创建 TCP socket
---@return socket_tcp_client* client TCP socket
function M.tcp() end

--- 创建 IPv4 TCP socket
---@return socket_tcp_client* client TCP socket
function M.tcp4() end

--- 创建 IPv6 TCP socket
---@return socket_tcp_client* client TCP socket
function M.tcp6() end

--- 创建 UDP socket
---@return socket_udp_client* client UDP socket
function M.udp() end

--- 创建 IPv4 UDP socket
---@return socket_udp_client* client UDP socket
function M.udp4() end

--- 创建 IPv6 UDP socket
---@return socket_udp_client* client UDP socket
function M.udp6() end

--- 连接 TCP 服务
---@param address string 远端地址
---@param port integer 远端端口
---@param laddress? string 本地地址
---@param lport? integer 本地端口
---@param family? 'inet'|'inet6' 地址族
---@return socket_tcp_client*? client TCP socket
---@return string? errMsg 错误信息
function M.connect(address, port, laddress, lport, family) end

--- 连接 IPv4 TCP 服务
---@param address string 远端地址
---@param port integer 远端端口
---@param laddress? string 本地地址
---@param lport? integer 本地端口
---@return socket_tcp_client*? client TCP socket
---@return string? errMsg 错误信息
function M.connect4(address, port, laddress, lport) end

--- 连接 IPv6 TCP 服务
---@param address string 远端地址
---@param port integer 远端端口
---@param laddress? string 本地地址
---@param lport? integer 本地端口
---@return socket_tcp_client*? client TCP socket
---@return string? errMsg 错误信息
function M.connect6(address, port, laddress, lport) end

--- 绑定并监听 TCP 服务
---@param host string 监听地址，'*' 表示所有 IPv4 地址
---@param port integer 监听端口
---@param backlog? integer backlog
---@return socket_server*? server 服务 socket
---@return string? errMsg 错误信息
function M.bind(host, port, backlog) end

--- 等待 socket 可读或可写
---@param recvt? table 可读 socket 列表
---@param sendt? table 可写 socket 列表
---@param timeout? number 超时秒数
---@return table readable 可读列表
---@return table writable 可写列表
---@return string? errMsg 错误信息
function M.select(recvt, sendt, timeout) end

--- 当前时间
---@return number time 秒级时间
function M.gettime() end

--- 延迟指定秒数
---@param seconds number 秒数
function M.sleep(seconds) end

--- 创建错误保护函数
---@param finalizer? function 收尾函数
---@return function try try 函数
function M.newtry(finalizer) end

--- 保护函数调用
---@param func function 函数
---@return function protected 保护后的函数
function M.protect(func) end

--- 跳过前 n 个返回值
---@param count integer 跳过数量
---@param ... any 值
---@return any ... 剩余值
function M.skip(count, ...) end

--- 创建 LTN12 sink
---@param mode? 'close-when-done'|'keep-open' 模式
---@param sock socket_tcp_client* socket
---@return function sink sink 函数
function M.sink(mode, sock) end

--- 创建 LTN12 source
---@param mode? 'by-length'|'until-closed' 模式
---@param sock socket_tcp_client* socket
---@param length? integer 读取长度
---@return function source source 函数
function M.source(mode, sock, length) end

--- 选择命名工厂
---@param factory table 工厂表
---@return function chooser 选择函数
function M.choose(factory) end

--- 查询主机名
---@return string hostname 主机名
function socket_dns.gethostname() end

--- 主机名转 IP
---@param name string 主机名
---@return string? ip IP 地址
---@return string? errMsg 错误信息
function socket_dns.toip(name) end

--- IP 转主机名
---@param address string IP 地址
---@return string? name 主机名
---@return string? errMsg 错误信息
function socket_dns.tohostname(address) end

--- 查询地址信息
---@param host string 主机名
---@return table? info 地址信息列表
---@return string? errMsg 错误信息
function socket_dns.getaddrinfo(host) end

--- 连接远端地址
---@param host string 远端地址
---@param port integer 远端端口
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_tcp_client:connect(host, port) end

--- 绑定本地地址
---@param host string 本地地址
---@param port integer 本地端口
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_tcp_client:bind(host, port) end

--- 开始监听
---@param backlog? integer backlog
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_tcp_client:listen(backlog) end

--- 接受连接
---@return socket_tcp_client*? client 客户端 socket
---@return string? errMsg 错误信息
function socket_tcp_client:accept() end

--- 发送数据
---@param data string 数据
---@param from? integer 起始位置
---@param to? integer 结束位置
---@return integer? sent 已发送字节数
---@return string? errMsg 错误信息
---@return integer? lastIndex 最后发送位置
function socket_tcp_client:send(data, from, to) end

--- 接收数据
---@param pattern? '*l'|'*a'|integer 接收模式
---@param prefix? string 前缀
---@return string? data 数据
---@return string? errMsg 错误信息
---@return string? partial 部分数据
function socket_tcp_client:receive(pattern, prefix) end

--- 设置超时
---@param timeout socket_timeout 超时秒数
---@param mode? 'b'|'r'|'s' 模式
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_tcp_client:settimeout(timeout, mode) end

--- 关闭 socket
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_tcp_client:close() end

--- 获取本地地址
---@return string ip IP 地址
---@return integer port 端口
---@return string? family 地址族
function socket_tcp_client:getsockname() end

--- 获取远端地址
---@return string ip IP 地址
---@return integer port 端口
---@return string? family 地址族
function socket_tcp_client:getpeername() end

--- 设置 socket 选项
---@param option string 选项名
---@param value any 选项值
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_tcp_client:setoption(option, value) end

--- 获取 socket 选项
---@param option string 选项名
---@return any value 选项值
---@return string? errMsg 错误信息
function socket_tcp_client:getoption(option) end

--- 发送 UDP 数据
---@param data string 数据
---@return integer? sent 已发送字节数
---@return string? errMsg 错误信息
function socket_udp_client:send(data) end

--- 发送 UDP 数据到指定地址
---@param data string 数据
---@param ip string IP 地址
---@param port integer 端口
---@return integer? sent 已发送字节数
---@return string? errMsg 错误信息
function socket_udp_client:sendto(data, ip, port) end

--- 接收 UDP 数据
---@param size? integer 最大长度
---@return string? data 数据
---@return string? errMsg 错误信息
function socket_udp_client:receive(size) end

--- 接收 UDP 数据和来源
---@param size? integer 最大长度
---@return string? data 数据
---@return string? ip 来源 IP
---@return integer? port 来源端口
function socket_udp_client:receivefrom(size) end

--- 设置 UDP peer
---@param ip string IP 地址
---@param port integer 端口
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_udp_client:setpeername(ip, port) end

--- 设置 UDP 本地地址
---@param ip string IP 地址
---@param port integer 端口
---@return integer? ok 成功时返回 1
---@return string? errMsg 错误信息
function socket_udp_client:setsockname(ip, port) end

return M
