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)