IoM TypeScript SDK 使用指南¶
IoM TypeScript SDK 是一个共享的 gRPC 客户端库,用于 VSCode 扩展和 Web 应用开发。
完整文档和示例请参考:TypeScript SDK
快速开始¶
安装¶
npm install iom-typescript
# 或在 monorepo 工作区中
# "iom-typescript": "workspace:*"
最小示例¶
import { GrpcClient, AuthConfig } from 'iom-typescript';
const client = new GrpcClient({
onLog: (message: string) => console.log(message),
timeout: 10,
maxMessageSize: 50 * 1024 * 1024
});
const config: AuthConfig = {
operator: 'admin',
host: 'localhost',
port: 31337,
type: 'mtls',
ca: 'base64_encoded_ca_cert',
cert: 'base64_encoded_client_cert',
key: 'base64_encoded_client_key'
};
await client.connect(config, 'config_file_name');
if (client.isConnected()) {
const rpc = client.getRpc();
rpc.malice.getSessions(Empty, (error, response) => {
console.log('Sessions:', response);
});
}
client.disconnect();
核心概念¶
SDK 的设计完全对应 IoM 的架构概念,详细架构说明请参考 IoM 核心概念。
GrpcClient - 客户端¶
对应 Client 概念,通过 GrpcClient 类与 Server 进行 gRPC 通讯。
初始化方式:
// 创建客户端实例
const client = new GrpcClient({
onLog: (message: string) => console.log(message),
timeout: 10,
maxMessageSize: 50 * 1024 * 1024
});
// 连接配置
const config: AuthConfig = {
operator: 'admin',
host: '127.0.0.1',
port: 5004,
type: 'mtls',
ca: '...',
cert: '...',
key: '...'
};
await client.connect(config, 'config_name');
RPC 调用¶
SDK 提供两个主要的 RPC 客户端:
const rpc = client.getRpc();
// Malice 客户端 - 会话和任务管理
rpc.malice.getSessions(Empty, callback);
rpc.malice.getTasks(request, callback);
// Listener 客户端 - 监听器管理
rpc.listener.getListeners(Empty, callback);
rpc.listener.listPipelines(request, callback);
Session - 会话¶
对应 Session 概念,代表一个已连接的 Implant。
import { Empty } from 'iom-typescript';
rpc.malice.getSessions(Empty, (error, response) => {
if (!error && response) {
response.sessions.forEach(session => {
console.log(`会话 ID: ${session.sessionId}`);
});
}
});
Task - 任务¶
对应 Task 概念,IoM 使用基于任务的异步执行模型。
import { TaskRequest } from 'iom-typescript';
const request: TaskRequest = {
sessionId: 'session_id_here'
};
rpc.malice.getTasks(request, (error, response) => {
if (!error && response) {
response.tasks.forEach(task => {
console.log(`任务 ${task.taskId}: ${task.type}`);
});
}
});
常用操作¶
连接管理¶
// 检查连接状态
if (client.isConnected()) {
// 执行操作
}
// 断开连接
client.disconnect();
会话操作¶
// 获取所有会话
rpc.malice.getSessions(Empty, (error, response) => {
if (error) {
console.error('获取会话失败:', error);
} else {
console.log('会话列表:', response.sessions);
}
});
监听器操作¶
// 获取监听器
rpc.listener.getListeners(Empty, (error, response) => {
if (!error) {
console.log('监听器:', response.listeners);
}
});
// 列出管道
rpc.listener.listPipelines(listenerRequest, (error, response) => {
if (!error) {
console.log('管道:', response.pipelines);
}
});
在不同环境中使用¶
VSCode 扩展¶
import * as vscode from 'vscode';
import { GrpcClient, AuthConfig } from 'iom-typescript';
export class ExtensionGrpcClient {
private client: GrpcClient;
constructor(outputChannel: vscode.OutputChannel) {
this.client = new GrpcClient({
onLog: (message: string) => outputChannel.appendLine(message)
});
}
async connect(config: AuthConfig) {
return this.client.connect(config, 'vscode-extension');
}
getRpc() {
return this.client.getRpc();
}
disconnect() {
this.client.disconnect();
}
}
Next.js / React¶
'use client';
import { useState, useEffect } from 'react';
import { GrpcClient, AuthConfig } from 'iom-typescript';
export default function GrpcConnection() {
const [client, setClient] = useState<GrpcClient | null>(null);
useEffect(() => {
const grpcClient = new GrpcClient({
onLog: (message) => console.log(message)
});
setClient(grpcClient);
return () => grpcClient.disconnect();
}, []);
const handleConnect = async (config: AuthConfig) => {
if (client) {
await client.connect(config, 'web-client');
}
};
return (
// UI 组件
);
}
类型定义¶
SDK 导出所有 protobuf 生成的类型:
import {
Session, Sessions,
Task, Tasks,
Listener, Listeners,
Pipeline, Pipelines,
Empty,
MaliceRPCClient,
ListenerRPCClient
} from 'iom-typescript';
错误处理¶
try {
await client.connect(config, 'client_name');
console.log('连接成功');
} catch (error) {
console.error('连接失败:', error);
}
// RPC 调用错误处理
rpc.malice.getSessions(Empty, (error, response) => {
if (error) {
console.error('RPC 调用失败:', error);
return;
}
// 处理响应
});
最佳实践¶
-
使用日志回调 - 便于调试和监控
const client = new GrpcClient({ onLog: (message) => console.log(`[gRPC] ${message}`) }); -
正确清理资源 - 组件卸载时断开连接
useEffect(() => { return () => client.disconnect(); }, []); -
配置超时和消息大小 - 根据需求调整
const client = new GrpcClient({ timeout: 30, maxMessageSize: 100 * 1024 * 1024 }); -
检查连接状态 - 执行前确认已连接
if (client.isConnected()) { // 执行 RPC 调用 }