Skip to content

ホスト API ​

拡張とランチャーは stdio 上の行区切り JSON(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}最初の 1 通
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. hello には速やかに ready を返す(重い処理は後回し)。
  2. メインループは stdin を読み続け、長い処理は別スレッドへ。
  3. shutdown を受けたら自分で終了する。
  4. stdout にデバッグ出力を書かない(プロトコル経路です)。log か stderr を使う。

制限 ​

  • 1 メッセージ 1 MiB。
  • 1 要求 10 秒。
  • 同時要求は 4 件まで。
  • ui.page の HTML はサニタイズされます(<script>、on*、外部 iframe は不可)。