Streams

Los streams proporcionan E/S incremental para HTTP, el sistema de archivos y otros módulos. Los módulos propietarios de los datos subyacentes crean los objetos stream. Esta página es una referencia de API; el bucle del scanner usa un callback process(token) definido por la aplicación.

Obtener un stream

-- From HTTP request body
local stream, err = req:stream()
if err then return nil, err end

-- From filesystem
local fs = require("fs")
local volume, err = fs.get("app:data")
if err then return nil, err end

local stream, err = volume:open("/file.txt", "r")
if err then return nil, err end

Lectura

local chunk, err = stream:read(size)
Parámetro Tipo Descripción
size integer Bytes a leer (0 = fragmento por defecto de 32KB)

Devuelve: string, error — nil, nil en EOF

Escritura

local bytes, err = stream:write(data)
Parámetro Tipo Descripción
data string Datos a escribir

Devuelve: integer, error — bytes escritos

Posicionamiento

local pos, err = stream:seek(whence, offset)
Parámetro Tipo Descripción
whence string "set", "cur", o "end"
offset integer Desplazamiento en bytes

Devuelve: integer, error — nueva posicion

Vaciar buffers

local ok, err = stream:flush()

flush escribe los datos almacenados en buffer en el destino subyacente.

Información de Stream

local info, err = stream:stat()
Campo Tipo Descripción
size integer Tamano total (-1 si desconocido)
position integer Posicion actual
readable boolean Puede leer
writable boolean Puede escribir
seekable boolean Puede posicionarse

Cierre

local ok, err = stream:close()

close libera los recursos del stream y puede llamarse más de una vez.

Scanner

Crear un tokenizador para contenido de stream:

local scanner, err = stream:scanner(split)
Parámetro Tipo Descripción
split string "lines", "words", "bytes", "runes"

Metodos de Scanner

local has_more, err = scanner:scan()  -- avanzar al siguiente token
local token = scanner:text()           -- token actual
local err_msg = scanner:err()          -- error del scanner si lo hay
while true do
    local has_token, err = scanner:scan()
    if err then return nil, err end
    if not has_token then break end  -- EOF
    process(scanner:text())
end

Cuando scan() devuelve false, comprueba scanner:err() antes de tratar el resultado como EOF. Los fallos de tokenización y de lectura subyacente se almacenan en el scanner y no aparecen en el segundo valor devuelto por scan().

Errores

Condición Tipo
Tipo de whence/split invalido lanzado como error de Lua (no devuelto)
Stream cerrado INTERNAL
No es legible/escribible INTERNAL
Fallo de lectura/escritura INTERNAL