Node.js SDK
核心能力
Node.js SDK 提供的 sessions、contexts、extensions、downloads、日志与错误处理能力。
核心能力
会话管理
创建会话
// 基础创建
const session = await client.sessions.create();
// 指定浏览器模式
const session = await client.sessions.create({
browserMode: 'normal',
});
// 挂载已上传扩展
const session = await client.sessions.create({
browserMode: 'normal',
extensionIds: ['ext_11ff6ce20fb0'],
});
// 配置带认证的上游代理
const session = await client.sessions.create({
proxy: {
type: 'external',
server: 'http://192.168.1.1:8080',
username: 'user',
password: 'pass',
},
});
// 可选浏览器模式:
// - 'normal': 标准浏览器容器
// - 'light': 轻量浏览器模式结合 Context 创建会话
const context = await client.contexts.create({
metadata: { userId: '1001' },
});
const session = await client.sessions.create({
context: { id: context.id, mode: 'readWrite' },
});
// SDK 也接受 'read_write'、'readOnly'、'read_only'
// 并会自动转换成 API 需要的格式。查询会话
const result = await client.sessions.list();
console.log(`Total: ${result.pagination.totalCount}`);
console.log(`Active: ${result.pagination.activeCount}`);
for (const session of result) {
console.log(`${session.id}: ${session.status}`);
}
const activeSessions = await client.sessions.list({ status: 'active' });
console.log(`Found ${activeSessions.length} active sessions`);删除会话
await client.sessions.delete({ sessionId: 'session-id' });
// 或者直接使用会话对象上的辅助方法
await session.close();会话超时行为
- 会话超时由服务端根据该会话配置的时长统一判定。
- 如果已经到达超时时间,但平台在最近 2 分钟内仍然观察到客户端 CDP 活跃消息,则不会立刻删除该会话,而是短暂保活。
- 实际上,
connectOverCDP、Playwright、Puppeteer 以及直接发送的 DevTools 协议消息,都会被视为 CDP 活跃。 - 当 CDP 活跃停止超过 2 分钟后,这个已经超时的会话会在下一轮超时清理时被回收。
会话下载
在使用会话下载接口前,建议先显式配置远程浏览器的下载目录:
const browser = await chromium.connectOverCDP(session.connectUrl);
const cdp = await browser.newBrowserCDPSession();
await cdp.send('Browser.setDownloadBehavior', {
behavior: 'allow',
downloadPath: '/config/Downloads',
eventsEnabled: true,
});如果没有这一步,下载的文件可能只保留在 Playwright 的临时产物中,无法被会话下载 API 查询到。
const downloads = await client.sessions.downloads.list(session.id);
console.log(downloads.summary.count);
const fileBuffer = await client.sessions.downloads.get(session.id, 'download-id');
const archiveBuffer = await client.sessions.downloads.archive(session.id);
await client.sessions.downloads.delete(session.id);Context 操作
const context = await client.contexts.create({
metadata: { owner: 'demo' },
});
const contexts = await client.contexts.list({
status: 'available',
limit: 20,
});
const details = await client.contexts.get(context.id);
console.log(details.status);
await client.contexts.forceRelease(context.id);
await client.contexts.delete(context.id);client.contexts.create(metadata=...)创建服务端持久化浏览器配置。client.contexts.list(status=..., limit=...)列出可用或被锁定的 contexts。client.contexts.get(contextId)获取单个 context。client.contexts.delete(contextId)删除单个 context。client.contexts.forceRelease(contextId)在异常场景下强制释放锁。
扩展管理
const extension = await client.extensions.upload('/absolute/path/to/extension.zip', {
name: 'demo-extension',
});
const extensions = await client.extensions.list({ limit: 10 });
for (const item of extensions) {
console.log(item.id, item.name);
}
const details = await client.extensions.get(extension.id);
await client.extensions.delete(extension.id);错误处理
import {
APIError,
AuthenticationError,
ContextLockedError,
ContextNotFoundError,
NetworkError,
TimeoutError,
} from 'lexmount';
try {
await client.sessions.create({
context: { id: 'ctx_123', mode: 'readWrite' },
});
} catch (error) {
if (error instanceof AuthenticationError) {
console.error('鉴权失败');
} else if (error instanceof ContextNotFoundError) {
console.error('Context 不存在');
} else if (error instanceof ContextLockedError) {
console.error(error.activeSessionId, error.retryAfter);
} else if (error instanceof TimeoutError || error instanceof NetworkError) {
console.error('网络或超时异常');
} else if (error instanceof APIError) {
console.error(error.statusCode);
} else {
throw error;
}
}日志
import { disableLogging, enableLogging, setLogLevel } from 'lexmount';
setLogLevel('DEBUG');
enableLogging('INFO');
disableLogging();可用日志级别:
DEBUGINFOWARNINGERRORCRITICALSILENT
API 入口
本页列出包对外暴露的主要公共 API 入口。
Client
Lexmount
Sessions
SessionsResourceSessionInfoSessionListResponsePaginationInfoSessionDownloadsResourceSessionDownloadInfoSessionDownloadsListResponseSessionDownloadsDeleteResponse
Contexts
ContextsResourceContextInfoContextListResponse
Extensions
ExtensionsResourceExtensionInfo
Exceptions
LexmountErrorAuthenticationErrorSessionNotFoundErrorContextNotFoundErrorContextLockedErrorAPIErrorNetworkErrorValidationErrorTimeoutError
Logging
LexmountLoggersetLogLevelenableLoggingdisableLogginggetLogger
Lexmount 文档