Skip to content

API хоста ​

Обмен идёт по JSON, разделённому переводами строк, поверх stdio (NDJSON), UTF-8 без BOM.

Рукопожатие ​

json
{"type":"hello","host":"1.1.37","dataDir":"C:\\...\\PCL"}
json
{"type":"ready","name":"Hello Go"}

Далее обе стороны используют {"type": "...", "id": "...", "payload": {...}}. Запрос с id требует ответа с тем же id, таймаут — 10 секунд.

Сообщения ​

Расширение → хост ​

typepayloadПримечание
ready{name}Готовность
notify{title, text, level}info / warn / error
log{text}Запись в лог
fs.read{path}Нужно fs.read
fs.write{path, data}Нужно fs.write, base64
http{method, url, headers, body}Нужно net
instances{}Список инстансов
versions{}Список версий
launch{instance, version}Нужно launch
ui.page{title, html}Нужно ui
settings.get / settings.set{key} / {key, value}Настройки лаунчера

Хост → расширение ​

typepayloadПримечание
hello{host, dataDir, locale}Первое сообщение
resp{ok, data, error}Ответ
event{name, data}launch.before и другие
ping{}Каждые 30 с, ответ pong

Отказ по правам:

json
{"type":"resp","id":"7","payload":{"ok":false,"error":"permission denied: net"}}

Пример на Go ​

go
package main

import tmlext "github.com/TYWStudio/TML/extensions/sdk/go"

// 业务入口:两个方法都可以留空
type ext struct{}

func (ext) Ready() {
	tmlext.Log("info", "拓展已加载")
	tmlext.Toast("Hello")
}

func (ext) OnEvent(e tmlext.Event) {
	tmlext.Log("info", e.Type)
}

func main() { tmlext.Run(ext{}) }

Пример на Rust ​

rust
use tml_ext::{Event, Ext, Handler};

struct Ext0;

impl Handler for Ext0 {
    fn ready(&mut self, ext: &mut Ext) {
        ext.log("info", "拓展已加载");
        ext.toast("Hello");
    }

    fn event(&mut self, ext: &mut Ext, ev: Event) {
        ext.log("info", &ev.kind);
    }
}

fn main() { tml_ext::run(Ext0); }

Правила ​

  1. Отвечайте ready быстро, тяжёлую работу — потом.
  2. Главный цикл должен читать stdin, длинные задачи — в отдельный поток.
  3. Получив shutdown, завершитесь сами.
  4. Не пишите отладку в stdout — это канал протокола. Используйте log или stderr.

Ограничения ​

  • 1 MiB на сообщение.
  • 10 секунд на запрос.
  • 4 одновременных запроса на расширение.
  • HTML в ui.page очищается: без <script>, on* и внешних iframe.