接口能力
JavaScript 运行环境、远程文件与进程、HTTP/TCP、云浏览器接口及权限要求。
JavaScript 运行环境
任务代码按 ES module 执行,支持顶层 await 和动态 import()。提交 JavaScript 源码,使用精确的内置模块名 lexmount:remote、lexmount:browser。不提供 npm 包解析、CommonJS、Node.js 内置模块或业务 TypeScript 转译;编辑器的类型补全不代表能够直接提交 TypeScript。
| 能力 | 常用接口 |
|---|---|
| HTTP 请求与响应 | fetch、Request、Response、Headers、FormData、Blob、File |
| URL 处理 | URL、URLSearchParams、URLPattern |
| 字节、编码与流 | TextEncoder、TextDecoder、ReadableStream、WritableStream、TransformStream、CompressionStream |
| 异步与取消 | setTimeout、setInterval、queueMicrotask、AbortController、AbortSignal |
| 其他 Web API | crypto / WebCrypto、WebSocket 客户端、structuredClone、atob / btoa、事件基础类型 |
| 日志与参数 | console.log/info/warn/error/debug;任务模式下 jsd.args 为空数组 |
全局 fetch 从云端运行环境发起 HTTP(S) 请求,仅允许公网目标;域名解析和重定向也受该限制。访问客户端本机或内网服务应使用下文的 host.fetch,请求从所选客户端发出。
所有活动资源结束后任务完成。HTTP 服务、定时器和网络任务可保持执行活动;孤立且未被等待的 Promise 不会独立保持任务存活。每次重运行使用新的 JavaScript 环境,不保留上一轮的全局变量。
远程客户端
import { getRemoteHosts, remoteHosts } from 'lexmount:remote';
const hosts = await getRemoteHosts();
console.log(hosts);
const info = hosts.find((item) => item.id === '<client-id>');
if (!info) throw new Error('Client is offline or unavailable');
const host = remoteHosts[info.id];
console.log(host.id);getRemoteHosts() 返回在线主机信息,并刷新只读的 remoteHosts 映射。主机信息包括 id、os、osVersion、hostname、uptimeSeconds、cpuModel、totalMemoryBytes、totalDiskBytes,不可采集的字段为 null。首次导入模块也可能查询主机并失败,需将动态导入放入 try/catch 才能捕获导入阶段错误。
以下方法均为异步操作,流与迭代器按需读取。需要先启动原生客户端,并将示例中的 <client-id> 替换为当前用户的客户端 ID。
文件系统
| 方法 | 结果与用途 |
|---|---|
host.fs.readFile(path) | Promise<Uint8Array>,读取完整文件 |
host.fs.readTextFile(path) | Promise<string>,按 UTF-8 解码 |
host.fs.readDir(path) | AsyncIterableIterator<DirEntry>,逐条读取目录 |
host.fs.stat(path) | 文件类型、字节大小与 mtime / atime / birthtime(Date 或 null) |
host.fs.writeFile(path, bytes, options?) | 写入 Uint8Array |
host.fs.writeTextFile(path, text, options?) | 按 UTF-8 写入文本 |
host.fs.mkdir(path, { recursive? }) | 创建目录,默认不递归 |
host.fs.remove(path, { recursive? }) | 删除文件或目录,默认不递归 |
路径使用客户端操作系统的原生语法,相对路径以客户端启动目录为基准。目录项提供 name、isFile、isDirectory、isSymlink;退出 for await 会关闭目录游标。写选项默认为 { create: true, append: false },不会自动创建父目录;分块写入失败不会回滚已写数据。完整文件读取和写入需要相应内存。
HTTP 请求
host.fetch(input, options?) 从客户端发出请求,返回原生 Response,可用 status、headers、text()、json() 或流式 body。
| 选项 | 行为 |
|---|---|
method | 默认 GET;GET / HEAD 不能带正文 |
headers | HeadersInit,可传请求头对象或 Headers |
body | string、Uint8Array、ArrayBuffer 或 null;不支持 FormData 和上传流 |
signal | AbortSignal,可取消请求和响应读取 |
redirect | follow(默认)、manual 或 error |
允许客户端可达的 HTTP(S) 来源,包括本机与内网,没有独立的 fetch 权限开关。HTTP 4xx / 5xx 正常返回 Response,由代码检查 response.ok;网络失败会抛错。响应正文应读完或取消,释放远端资源。跨源重定向移除认证和 Cookie 等敏感头,不自动维护 Cookie Jar。
进程
| 方法 | 结果与用途 |
|---|---|
host.process.list() | 进程快照异步迭代器,按 PID 排序,退出迭代释放快照 |
host.process.get(pid) | ProcessInfo 或 null |
host.process.exec(command) | 执行 shell 命令,自动发送 stdin EOF,返回退出状态及完整 stdout / stderr 字节 |
host.process.spawn(command) | 返回带流式 stdin / stdout / stderr、status Promise 和 kill() 的子进程 |
ProcessInfo 包含 PID、父 PID、名称、可执行路径、命令行、状态、开始时间、CPU 使用率和内存字节数,不可用字段为 null。exec() 的非零退出码通过 exitCode 返回,不自动抛错。
命令继承客户端的工作目录、环境和系统用户权限。Linux / macOS 使用 /bin/sh -c,Windows 使用 cmd.exe /d /s /c,命令语法需适配目标系统。spawn() 应并发消费 stdout 和 stderr,写完 stdin 后关闭 writer 发送 EOF;只等待 status 可能因输出管道未排空而阻塞。
TCP
| 方法或对象 | 用途 |
|---|---|
host.tcp.connect({ hostname?, port }) | 从客户端连接 TCP;默认主机 127.0.0.1,端口 1~65535 |
host.tcp.listen({ hostname?, port? }) | 在客户端监听;默认 127.0.0.1:0,端口 0 自动分配 |
TcpConnection | localAddr、remoteAddr、字节流 readable / writable、closed 和 close() |
TcpListener | addr、accept()、异步迭代、finished 和 close() |
连接的 writable 关闭表示仅发送写 EOF,close() 关闭整个连接;取消 readable 也关闭整个连接。监听器一次只能有一个待完成的 accept();关闭监听器不关闭已接入连接,退出监听迭代会关闭监听器。
客户端 HTTP 服务
host.http.serve({ hostname?, port?, fetch(request) }) 在客户端监听明文 HTTP/1.1,默认 127.0.0.1:8080,port: 0 自动分配端口。处理函数在云端 JavaScript 环境中执行,接收 Request 并返回 Response。
返回对象提供 addr、finished 和 shutdown()。关闭服务会停止接入并等待已有响应结束;不要从正在处理的请求内等待自身的 shutdown()。该接口不会产生公开任务 URL;对外发布使用默认导出 HTTP 入口。
客户端权限
在客户端管理中点击「配置」,调整开关并点击「保存」。首次连接的默认配置为:
{
"fs": { "enabled": true, "allow_write": false },
"process": { "enabled": true, "allow_exec": true },
"tcp": { "enabled": true },
"http_server": { "enabled": true }
}fs.enabled 控制文件接口读取,写入另需 allow_write;process.enabled 控制进程查询,执行另需 allow_exec。fs.allow_write=false 只限制文件 API,已允许的 shell 命令仍可以修改文件。文件读取遵循操作系统用户权限,没有额外路径白名单。tcp.enabled 和 http_server.enabled 分别控制 TCP 与 HTTP 监听。
配置按用户和客户端 ID 保存,不以 project 隔离。离线也能保存,新配置在重连后同步;以客户端确认的版本判断是否已应用。更新影响后续操作,已开始的操作继续,关闭与清理始终允许。
云浏览器
import browser from 'lexmount:browser';
const session = await browser.create({ browserMode: 'normal' });
try {
const page = await session.openUrl('https://example.com');
console.log(page.title);
} finally {
await session.destroy();
}浏览器身份由本次任务提交注入,代码不需要填写 API key。参数使用 camelCase,返回的会话元数据使用 snake_case,不返回凭据或 CDP 地址。
| 管理接口 | 用途 |
|---|---|
browser.create(options?) | 创建并等待会话可用,返回 BrowserSession |
browser.get(sessionId, { regionId?, timeoutMs? }) | 接入已有会话,不取得自动销毁所有权 |
browser.list({ status?, regionId?, timeoutMs? }) | 查询会话,status 为 active 或 closed |
browser.destroy(sessionId, options?) | 关闭指定会话 |
创建选项包括 browserMode(normal / light)、regionId、contextId、contextMode(read_write / read_only)、contextDescription、weakLock、officialProxy、localProxyTunnelId、customImageId、windowSize、downloads、recording、extensionIds 和 timeoutMs。具体能力由项目权益和浏览器类型决定,Moli 不支持持久化回放。
| 会话方法 | 用途与返回值 |
|---|---|
getInfo(options?) | 会话状态和元数据 |
targets(options?) | 页面列表,含 id、type、title、url |
keepalive({ intervalMs?, durationMs?, stopOnInactive?, timeoutMs? }) | 定期检查会话,返回检查次数与快照 |
destroy(options?) | 等待后端确认关闭 |
openUrl(url, options?) | 导航,返回 navigation、url、title |
eval(expression, options?) | 执行页面表达式,返回 JSON 值 |
waitSelector(selector, options?) | 等待选择器匹配 |
waitText(text, options?) | 等待文本条件;未达到返回 timed_out: true |
click(selector, options?) | 点击元素 |
fill(selector, value, options?) | 填写输入框 |
screenshot({ fullPage?, targetId?, timeoutMs? }) | PNG 字节 Uint8Array |
pdf({ printBackground?, targetId?, timeoutMs? }) | PDF 字节 Uint8Array |
snapshot(options?) | 页面快照 JSON |
raw(method, params?, options?) | 调用底层浏览器方法,返回 JSON |
页面操作可传 targetId 稳定选择同一页面;省略时选择第一个页面,没有页面时创建空白页。waitText 另支持 selector、state(present / absent)、exact、caseSensitive、includeHidden、pollMs。
所有时间参数单位为毫秒,timeoutMs 为 1~86400000 的整数。默认创建超时 600000ms,页面操作 30000ms,关闭确认 180000ms。create() 创建的会话在任务结束时会尝试回收,仍建议 try/finally 显式销毁;get() 接入的已有会话需按使用方安排关闭。
错误处理与类型声明
远程和浏览器错误是带 name、code 的 Error 对象,例如 RemoteFsError、RemoteFetchError、BrowserError;这些名字不是导出的构造函数,按 error.code 判断原因。网络断开、权限关闭和客户端离线均可能导致远程调用失败。
编辑器加载的声明也可供本地开发使用:jsd.d.ts、remote.d.ts、browser.d.ts。将三份文件放在同一目录,并引用 jsd.d.ts。声明借用 TypeScript 的 WebWorker 类型提供补全,实际支持范围以本页及运行时为准。
