JavaScript 运行时

JavaScript 运行时适合快速实现 capability 方法,不局限于刮削。manifest 的 invoke 指向挂在 globalThis 上的异步函数,宿主能力通过 Ting.host 调用。

入口和导出函数

JS 插件入口是 entry_point 指向的脚本。后端调用 capability 时,会执行 globalThis[invoke](args)args 是 JSON 对象,并包含 _context

runtime: javascript
entry_point: plugin.js
capabilities:
  - id: metadata.search
    kind: metadata_provider
    invoke: searchMetadata
permissions:
  - type: network_access
    value: api.example.com
async function searchMetadata(args) {
  const response = await fetch(
    "https://api.example.com/search?q=" + encodeURIComponent(args.title)
  );
  const data = await response.json();

  return {
    items: data.items.map((item) => ({
      title: item.title,
      author: item.author,
      narrator: item.narrator,
      cover_url: item.cover,
      description: item.description
    })),
    total: data.total,
    page: args.page ?? 1,
    page_size: args.page_size ?? 20
  };
}

globalThis.searchMetadata = searchMetadata;

网络、npm 和配置

fetch 只能访问 manifest 中通过 network_access 声明过的域名。npm 包需要写在 npm_dependencies,运行时 require 只能加载声明过的包或插件目录内的相对模块。

npm_dependencies:
  cheerio: "^1.0.0"
  dayjs: "^1.11.0"

配置读取使用 Ting.config。客户端或后台保存的敏感配置应在 config_schema 中标记 x-encryptedencryptedformat: passwordformat: secret;完整写法见本指南的“插件配置:config_schema”。

调用 capability 与 HostGateway

JS 运行时内置 Ting.host.getContext()Ting.host.invoke(method, params)。HostGateway 会按插件权限和当前用户上下文校验访问。

const cheerio = Ting.npm.require("cheerio");

async function openAssistant(args) {
  const context = Ting.host.getContext();
  const recent = await Ting.host.invoke("progress.recent", { limit: 10 });
  const cached = await Ting.host.invoke("cache.get", { key: "assistant-state" });

  return {
    context,
    recent,
    state: cached ?? { collapsed: false }
  };
}

globalThis.openAssistant = openAssistant;

适合 JS 的典型能力

  • metadata_provider:请求站点或开放 API,清洗标题、作者、演播者、封面和简介字段。
  • plugin_store:读取远程插件索引并返回 { plugins: [...] }
  • tool_provider:给助手、其他插件或客户端提供轻量工具。
  • ui_extension:处理 schema 表单提交或 web_container 的 capability 请求。

打包

JS 插件通常包含 plugin.yml、入口脚本、可选的 ui/ 静态资源和本地模块。打包时用 trpack 校验权限、依赖和资源路径。

trpack validate my-plugin
trpack build my-plugin --output dist/my-plugin.tr
trpack verify dist/my-plugin.tr