Streams
Streams fornecem I/O incremental para HTTP, filesystem e outros módulos. Os módulos proprietários dos dados subjacentes criam os objetos stream. Esta página é uma referência de API; o loop do scanner usa um callback process(token) definido pela aplicação.
Obtendo um 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
Leitura
local chunk, err = stream:read(size)
| Parâmetro | Tipo | Descrição |
|---|---|---|
size |
integer | Bytes para ler (0 = bloco padrão de 32KB) |
Retorna: string, error — nil, nil em EOF
Escrita
local bytes, err = stream:write(data)
| Parâmetro | Tipo | Descrição |
|---|---|---|
data |
string | Dados para escrever |
Retorna: integer, error — bytes escritos
Seeking
local pos, err = stream:seek(whence, offset)
| Parâmetro | Tipo | Descrição |
|---|---|---|
whence |
string | "set", "cur" ou "end" |
offset |
integer | Offset em bytes |
Retorna: integer, error — nova posicao
Flushing
local ok, err = stream:flush()
flush grava os dados em buffer no destino subjacente.
Informações do Stream
local info, err = stream:stat()
| Campo | Tipo | Descrição |
|---|---|---|
size |
integer | Tamanho total (-1 se desconhecido) |
position |
integer | Posicao atual |
readable |
boolean | Pode ler |
writable |
boolean | Pode escrever |
seekable |
boolean | Pode fazer seek |
Fechando
local ok, err = stream:close()
close libera os recursos do stream e pode ser chamado mais de uma vez.
Scanner
Crie um scanner que tokeniza o conteúdo do stream:
local scanner, err = stream:scanner(split)
| Parâmetro | Tipo | Descrição |
|---|---|---|
split |
string | "lines", "words", "bytes", "runes" |
Métodos do Scanner
local has_more, err = scanner:scan() -- avancar para o proximo token
local token = scanner:text() -- token atual
local err_msg = scanner:err() -- erro do scanner, se houver
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
Quando scan() retorna false, verifique scanner:err() antes de tratar o resultado como EOF. Falhas de tokenização e de leitura subjacente ficam armazenadas no scanner e não aparecem no segundo valor retornado por scan().
Erros
| Condição | Tipo |
|---|---|
| Tipo whence/split inválido | levantado como erro Lua (não retornado) |
| Stream fechado | INTERNAL |
| Não legivel/gravavel | INTERNAL |
| Falha de leitura/escrita | INTERNAL |