feat(service-party-app): 添加获取已注册参与方列表API
新增 grpc.getRegisteredParties() API,用于查询 Message Router 中已注册的参与方: - grpc-client.ts: 添加 getRegisteredParties() 方法 - main.ts: 添加 IPC 处理器 - preload.ts: 暴露 API 到渲染进程 - electron.d.ts: 添加类型定义 此功能用于测试和调试,确认 Service-Party-App 是否成功注册到 Message Router。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
de29fa4800
commit
73034c072c
|
|
@ -217,6 +217,16 @@ function setupIpcHandlers() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// gRPC - 获取已注册的参与方列表
|
||||||
|
ipcMain.handle('grpc:getRegisteredParties', async (_event, { roleFilter, onlyOnline }) => {
|
||||||
|
try {
|
||||||
|
const parties = await grpcClient?.getRegisteredParties(roleFilter, onlyOnline);
|
||||||
|
return { success: true, parties: parties || [] };
|
||||||
|
} catch (error) {
|
||||||
|
return { success: false, error: (error as Error).message, parties: [] };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// gRPC - 验证签名会话 (通过 Account 服务 HTTP API)
|
// gRPC - 验证签名会话 (通过 Account 服务 HTTP API)
|
||||||
ipcMain.handle('grpc:validateSigningSession', async (_event, { code }) => {
|
ipcMain.handle('grpc:validateSigningSession', async (_event, { code }) => {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,18 @@ interface SessionEvent {
|
||||||
messageHash?: Buffer;
|
messageHash?: Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface RegisteredParty {
|
||||||
|
partyId: string;
|
||||||
|
role: string;
|
||||||
|
online: boolean;
|
||||||
|
registeredAt: string;
|
||||||
|
lastSeenAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GetRegisteredPartiesResponse {
|
||||||
|
parties: RegisteredParty[];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gRPC 客户端 - 连接到 Message Router
|
* gRPC 客户端 - 连接到 Message Router
|
||||||
*
|
*
|
||||||
|
|
@ -390,4 +402,40 @@ export class GrpcClient extends EventEmitter {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取已注册的参与方列表
|
||||||
|
* @param roleFilter 可选,按角色过滤 (persistent/delegate/temporary)
|
||||||
|
* @param onlyOnline 可选,只返回在线的参与方
|
||||||
|
*/
|
||||||
|
async getRegisteredParties(roleFilter?: string, onlyOnline?: boolean): Promise<RegisteredParty[]> {
|
||||||
|
if (!this.client) {
|
||||||
|
throw new Error('Not connected');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
(this.client as grpc.Client & { getRegisteredParties: (req: unknown, callback: (err: Error | null, res: GetRegisteredPartiesResponse) => void) => void })
|
||||||
|
.getRegisteredParties(
|
||||||
|
{
|
||||||
|
role_filter: roleFilter || '',
|
||||||
|
only_online: onlyOnline || false,
|
||||||
|
},
|
||||||
|
(err: Error | null, response: GetRegisteredPartiesResponse) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
// 转换字段名从 snake_case 到 camelCase
|
||||||
|
const parties = (response.parties || []).map((p: { party_id?: string; partyId?: string; role?: string; party_role?: string; online?: boolean; registered_at?: string; registeredAt?: string; last_seen_at?: string; lastSeenAt?: string }) => ({
|
||||||
|
partyId: p.party_id || p.partyId || '',
|
||||||
|
role: p.role || p.party_role || '',
|
||||||
|
online: p.online || false,
|
||||||
|
registeredAt: p.registered_at || p.registeredAt || '',
|
||||||
|
lastSeenAt: p.last_seen_at || p.lastSeenAt || '',
|
||||||
|
}));
|
||||||
|
resolve(parties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,10 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||||
testConnection: (url: string) =>
|
testConnection: (url: string) =>
|
||||||
ipcRenderer.invoke('grpc:testConnection', { url }),
|
ipcRenderer.invoke('grpc:testConnection', { url }),
|
||||||
|
|
||||||
|
// 获取已注册的参与方列表
|
||||||
|
getRegisteredParties: (roleFilter?: string, onlyOnline?: boolean) =>
|
||||||
|
ipcRenderer.invoke('grpc:getRegisteredParties', { roleFilter, onlyOnline }),
|
||||||
|
|
||||||
// 签名相关
|
// 签名相关
|
||||||
validateSigningSession: (code: string) =>
|
validateSigningSession: (code: string) =>
|
||||||
ipcRenderer.invoke('grpc:validateSigningSession', { code }),
|
ipcRenderer.invoke('grpc:validateSigningSession', { code }),
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,21 @@ interface TestConnectionResult {
|
||||||
error?: string;
|
error?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 已注册的参与方
|
||||||
|
interface RegisteredParty {
|
||||||
|
partyId: string;
|
||||||
|
role: string;
|
||||||
|
online: boolean;
|
||||||
|
registeredAt: string;
|
||||||
|
lastSeenAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GetRegisteredPartiesResult {
|
||||||
|
success: boolean;
|
||||||
|
parties: RegisteredParty[];
|
||||||
|
error?: string;
|
||||||
|
}
|
||||||
|
|
||||||
interface SessionEvent {
|
interface SessionEvent {
|
||||||
type: 'participant_joined' | 'status_changed' | 'completed' | 'failed';
|
type: 'participant_joined' | 'status_changed' | 'completed' | 'failed';
|
||||||
participant?: Participant;
|
participant?: Participant;
|
||||||
|
|
@ -413,6 +428,8 @@ interface ElectronAPI {
|
||||||
getSessionStatus: (sessionId: string) => Promise<GetSessionStatusResult>;
|
getSessionStatus: (sessionId: string) => Promise<GetSessionStatusResult>;
|
||||||
subscribeSessionEvents: (sessionId: string, callback: (event: SessionEvent) => void) => () => void;
|
subscribeSessionEvents: (sessionId: string, callback: (event: SessionEvent) => void) => () => void;
|
||||||
testConnection: (url: string) => Promise<TestConnectionResult>;
|
testConnection: (url: string) => Promise<TestConnectionResult>;
|
||||||
|
// 获取已注册的参与方列表
|
||||||
|
getRegisteredParties: (roleFilter?: string, onlyOnline?: boolean) => Promise<GetRegisteredPartiesResult>;
|
||||||
// 签名相关
|
// 签名相关
|
||||||
validateSigningSession: (code: string) => Promise<ValidateSigningSessionResult>;
|
validateSigningSession: (code: string) => Promise<ValidateSigningSessionResult>;
|
||||||
joinSigningSession: (params: JoinSigningSessionParams) => Promise<JoinSigningSessionResult>;
|
joinSigningSession: (params: JoinSigningSessionParams) => Promise<JoinSigningSessionResult>;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue