Fragment api
API фрагментов¶
API, досутпное только для LuaJ-фрагментов, отмечено (LuaJ)
Общее¶
- Все функции API находятся в модуле
ap
.
local ap = require 'ap' ap.call(fragmentId, args)
- (LuaJ) Каждый фрагмент может возвращать результат в виде строки. Просто
return
из главного скоупа фрагмента. - Для каждого фрагмента при старте в ap-модуль будут проброшены:
ap.args
- словарь строковых аргументов запускаap.transaction.id
- идентификатор транзакцииap.transaction.user.id
- идентификатор пользователя, который запустил фрагмент
Запуск подфрагментов¶
- (LuaJ) Функции асинхронного запуска фрагментов могут возвращать
call_id
- идентификатор исполнения подфрагмента (int64) уникальный в пределах исполнения родительского фрагмента. - Каждая функция запуска фрагмента принимает в качестве 1 аргумента
fragmentId
, который может принимать 3 формы:path/to/fragment.lua
- относительная ссылка на фрагмент в текущем снапшоте. Относительные пути фрагментов не поддерживаются.Username/SnapshotName:path/to/fragment.lua
- полная ссылка на фрагмент, без указания тега (будет браться тегdefault
). Можно запускать расшаренные фрагменты из чужого снапшота.Username/SnapshotName/SnapshotTag:path/to/fragment.lua
- полная ссылка на фрагмент
- Каждая функция запуска фрагмента принимает в качестве второго аргумента
args
- словарь строковых аргументов запуска (необязателен).
Обычный запуск фрагмента¶
Исполнение фрагмента без уточнения об асинхронности (CPVM сам решает).
local callId = ap.call(fragmentId, args)
Синхронный запуск фрагмента (LuaJ)¶
Исполнение текущего фрагмента блокируется до завершения исполнения вызываемого подфрагмента. Возвращает результат фрагмента (строка).
local result = ap.call_and_await(fragmentId, args)
Асинхронный запуск фрагмента¶
Принудительный неблокирующий запуск. Транзакция может завершится с конфликтом.
local callId = ap.call_async(fragmentId, args)
Ожидание завершения фрагментов (LuaJ)¶
Возвращает результаты вызовов фрагментов с соответствующими callId
local callId1 = ap.call(fragmentId, args) local callId2 = ap.call_async(fragmentId, args) local results = ap.await({callId1, callId2}) print(results[1], results[2])
Ожидание завершения всех подфрагментов¶
Ожидание завершения всех подфрагментов, запущенных в текущем фрагменте через call
/call_async
ap.await_all()
Работа с TVM¶
TVM чтение/запись ячейки¶
Чтение всегда возвращает строку или nil
. Запись принимает на вход str, int, bool, float и конвертирует в строку.
ap.tvm_get(valueId) ap.tvm_set(valueId, value)
Чтение/запись для TVM-таблиц¶
Для tvm_table_set
ключи также могут быть str, int, bool, float.
ap.tvm_table_get(valueId, key) ap.tvm_table_set(valueId, key, value)
Чтение с конвертацией в число¶
ap.tvm_get_number(valueId) ap.tvm_table_get_number(valueId, key)
Получение длины таблицы¶
ap.tvm_length(valueId)
Создание ячейки со значением nil без указания valueId¶
Будет сгенерирован уникальный valueId
.
local valueId = ap.tvm_new()
Создание IO-ячейки:¶
ap.new_io("json с параметрами IO-ресурса", url)
IO commit:¶
ap.commit()
Работа с HTTP (LuaJ)¶
Возврат кастомного HTTP-ответа из транзакции¶
local headers = { ["Any-String"] = "ABC", ["My-Header"] = "XYZ" } local body = "hello world!" ap.http.respond(201, body, headers)