Потоки

Операции чтения/записи потоков для эффективной обработки данных. Объекты Stream получаются из других модулей (HTTP, файловая система и т.д.).

Загрузка

-- Из тела HTTP-запроса
local stream = req:stream()

-- Из файловой системы
local fs = require("fs")
local stream = fs.get("app:data"):open("/file.txt", "r")

Чтение

local chunk, err = stream:read(size)
Параметр Тип Описание
size integer Байт для чтения (0 = читать всё доступное)

Возвращает: string, error — nil при EOF

-- Прочитать все оставшиеся данные
local data, err = stream:read_all()

Запись

local bytes, err = stream:write(data)
Параметр Тип Описание
data string Данные для записи

Возвращает: integer, error — записанные байты

Позиционирование

local pos, err = stream:seek(whence, offset)
Параметр Тип Описание
whence string "set", "cur" или "end"
offset integer Смещение в байтах

Возвращает: integer, error — новая позиция

Сброс буфера

local ok, err = stream:flush()

Сбросить буферизованные данные в базовое хранилище.

Информация о потоке

local info, err = stream:stat()
Поле Тип Описание
size integer Общий размер (-1 если неизвестен)
position integer Текущая позиция
readable boolean Можно читать
writable boolean Можно писать
seekable boolean Можно позиционировать

Закрытие

local ok, err = stream:close()

Закрыть поток и освободить ресурсы. Безопасно вызывать несколько раз.

Scanner

Создать токенизатор для содержимого потока:

local scanner, err = stream:scanner(split)
Параметр Тип Описание
split string "lines", "words", "bytes", "runes"

Методы Scanner

local has_more = scanner:scan()  -- Перейти к следующему токену
local token = scanner:text()      -- Получить текущий токен
local err_msg = scanner:err()     -- Получить ошибку если есть
while scanner:scan() do
    local line = scanner:text()
    process(line)
end
if scanner:err() then
    return nil, errors.new("INTERNAL", scanner:err())
end

Ошибки

Условие Kind
Неверный тип whence/split INVALID
Поток закрыт INTERNAL
Не читаемый/записываемый INTERNAL
Ошибка чтения/записи INTERNAL