Pular para o conteúdo

Streams

Operações de leitura/escrita de stream para manipular dados eficientemente. Objetos stream sao obtidos de outros modulos (HTTP, filesystem, etc.).

-- De corpo de requisição HTTP
local stream = req:stream()
-- De filesystem
local fs = require("fs")
local stream = fs.get("app:data"):open("/file.txt", "r")
local chunk, err = stream:read(size)
ParâmetroTipoDescrição
sizeintegerBytes para ler (0 = ler tudo disponível)

Retorna: string, error - nil em EOF

-- Ler todos os dados restantes
local data, err = stream:read_all()
local bytes, err = stream:write(data)
ParâmetroTipoDescrição
datastringDados para escrever

Retorna: integer, error - bytes escritos

local pos, err = stream:seek(whence, offset)
ParâmetroTipoDescrição
whencestring"set", "cur" ou "end"
offsetintegerOffset em bytes

Retorna: integer, error - nova posicao

local ok, err = stream:flush()

Flush de dados em buffer para armazenamento subjacente.

local info, err = stream:stat()
CampoTipoDescrição
sizeintegerTamanho total (-1 se desconhecido)
positionintegerPosicao atual
readablebooleanPode ler
writablebooleanPode escrever
seekablebooleanPode fazer seek
local ok, err = stream:close()

Fechar stream e liberar recursos. Seguro chamar multiplas vezes.

Criar um tokenizador para conteudo do stream:

local scanner, err = stream:scanner(split)
ParâmetroTipoDescrição
splitstring"lines", "words", "bytes", "runes"
local has_more = scanner:scan() -- Avancar para proximo token
local token = scanner:text() -- Obter token atual
local err_msg = scanner:err() -- Obter erro se houver
while scanner:scan() do
local line = scanner:text()
process(line)
end
if scanner:err() then
return nil, errors.new("INTERNAL", scanner:err())
end
CondiçãoTipo
Tipo whence/split inválidoINVALID
Stream fechadoINTERNAL
Não legivel/gravavelINTERNAL
Falha de leitura/escritaINTERNAL