ホスト 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 秒)。
メッセージ
拡張 → ホスト
| type | payload | 備考 |
|---|---|---|
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} | 設定の読み書き |
ホスト → 拡張
| type | payload | 備考 |
|---|---|---|
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); }守るべきこと
helloには速やかにreadyを返す(重い処理は後回し)。- メインループは stdin を読み続け、長い処理は別スレッドへ。
shutdownを受けたら自分で終了する。- stdout にデバッグ出力を書かない(プロトコル経路です)。
logか stderr を使う。
制限
- 1 メッセージ 1 MiB。
- 1 要求 10 秒。
- 同時要求は 4 件まで。
ui.pageの HTML はサニタイズされます(<script>、on*、外部 iframe は不可)。
