





















@@ -205,103 +205,69 @@ async function connectGatewayOnce(params: {
205205pending.clear();
206206});
207207208-const connectId = randomUUID();
209-ws.send(
210-JSON.stringify({
208+const sendGatewayRequest = <T = unknown>(
209+method: string,
210+requestParams: unknown,
211+timeoutMs: number,
212+): Promise<T> => {
213+const id = randomUUID();
214+const frame = JSON.stringify({
211215type: "req",
212-id: connectId,
213-method: "connect",
214-params: {
215-minProtocol: PROTOCOL_VERSION,
216-maxProtocol: PROTOCOL_VERSION,
217-client: {
218-id: "openclaw-tui",
219-displayName: "docker-mcp-channels",
220-version: "1.0.0",
221-platform: process.platform,
222-mode: "ui",
216+ id,
217+ method,
218+params: requestParams ?? {},
219+});
220+return new Promise<T>((resolve, reject) => {
221+const timeout = setTimeout(() => {
222+pending.delete(id);
223+reject(new Error(`gateway request timeout: ${method}`));
224+}, timeoutMs);
225+timeout.unref?.();
226+pending.set(id, {
227+resolve: (value) => {
228+clearTimeout(timeout);
229+resolve(value as T);
223230},
224-role: "operator",
225-scopes: requestedScopes,
226-caps: [],
227-auth: { token: params.token },
228-},
229-}),
230-);
231-232-await new Promise<void>((resolve, reject) => {
233-const timeout = setTimeout(() => {
234-pending.delete(connectId);
235-reject(new Error("gateway connect timeout"));
236-}, GATEWAY_RPC_TIMEOUT_MS);
237-timeout.unref?.();
238-pending.set(connectId, {
239-resolve: () => {
240-clearTimeout(timeout);
241-resolve();
242-},
243-reject: (error) => {
231+reject: (error) => {
232+clearTimeout(timeout);
233+reject(error);
234+},
235+});
236+try {
237+ws.send(frame);
238+} catch (error) {
244239clearTimeout(timeout);
245-reject(error);
246-},
240+pending.delete(id);
241+reject(error instanceof Error ? error : new Error(String(error)));
242+}
247243});
248-});
244+};
249245250-await new Promise<void>((resolve, reject) => {
251-const id = randomUUID();
252-const timeout = setTimeout(() => {
253-pending.delete(id);
254-reject(new Error("gateway sessions.subscribe timeout"));
255-}, GATEWAY_RPC_TIMEOUT_MS);
256-timeout.unref?.();
257-pending.set(id, {
258-resolve: () => {
259-clearTimeout(timeout);
260-resolve();
261-},
262-reject: (error) => {
263-clearTimeout(timeout);
264-reject(error);
246+await sendGatewayRequest(
247+"connect",
248+{
249+minProtocol: PROTOCOL_VERSION,
250+maxProtocol: PROTOCOL_VERSION,
251+client: {
252+id: "openclaw-tui",
253+displayName: "docker-mcp-channels",
254+version: "1.0.0",
255+platform: process.platform,
256+mode: "ui",
265257},
266-});
267-ws.send(
268-JSON.stringify({
269-type: "req",
270- id,
271-method: "sessions.subscribe",
272-params: {},
273-}),
274-);
275-});
258+role: "operator",
259+scopes: requestedScopes,
260+caps: [],
261+auth: { token: params.token },
262+},
263+GATEWAY_RPC_TIMEOUT_MS,
264+);
265+266+await sendGatewayRequest("sessions.subscribe", {}, GATEWAY_RPC_TIMEOUT_MS);
276267277268return {
278269request(method, requestParams) {
279-const id = randomUUID();
280-ws.send(
281-JSON.stringify({
282-type: "req",
283- id,
284- method,
285-params: requestParams ?? {},
286-}),
287-);
288-return new Promise((resolve, reject) => {
289-const timeout = setTimeout(() => {
290-pending.delete(id);
291-reject(new Error(`gateway request timeout: ${method}`));
292-}, GATEWAY_REQUEST_TIMEOUT_MS);
293-timeout.unref?.();
294-pending.set(id, {
295-resolve: (value) => {
296-clearTimeout(timeout);
297-resolve(value as T);
298-},
299-reject: (error) => {
300-clearTimeout(timeout);
301-reject(error);
302-},
303-});
304-});
270+return sendGatewayRequest(method, requestParams, GATEWAY_REQUEST_TIMEOUT_MS);
305271},
306272 events,
307273async close() {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。