@rowger_go/chatu 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +30 -0
- package/.github/workflows/publish.yml +55 -0
- package/INSTALL.md +285 -0
- package/INSTALL.zh.md +285 -0
- package/LICENSE +21 -0
- package/README.md +293 -0
- package/README.zh.md +293 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1381 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +5 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +334 -0
- package/dist/index.test.js.map +1 -0
- package/dist/sdk/adapters/cache.d.ts +94 -0
- package/dist/sdk/adapters/cache.d.ts.map +1 -0
- package/dist/sdk/adapters/cache.js +158 -0
- package/dist/sdk/adapters/cache.js.map +1 -0
- package/dist/sdk/adapters/cache.test.d.ts +14 -0
- package/dist/sdk/adapters/cache.test.d.ts.map +1 -0
- package/dist/sdk/adapters/cache.test.js +178 -0
- package/dist/sdk/adapters/cache.test.js.map +1 -0
- package/dist/sdk/adapters/default.d.ts +24 -0
- package/dist/sdk/adapters/default.d.ts.map +1 -0
- package/dist/sdk/adapters/default.js +151 -0
- package/dist/sdk/adapters/default.js.map +1 -0
- package/dist/sdk/adapters/webhub.d.ts +336 -0
- package/dist/sdk/adapters/webhub.d.ts.map +1 -0
- package/dist/sdk/adapters/webhub.js +663 -0
- package/dist/sdk/adapters/webhub.js.map +1 -0
- package/dist/sdk/adapters/websocket.d.ts +133 -0
- package/dist/sdk/adapters/websocket.d.ts.map +1 -0
- package/dist/sdk/adapters/websocket.js +314 -0
- package/dist/sdk/adapters/websocket.js.map +1 -0
- package/dist/sdk/core/channel.d.ts +104 -0
- package/dist/sdk/core/channel.d.ts.map +1 -0
- package/dist/sdk/core/channel.js +158 -0
- package/dist/sdk/core/channel.js.map +1 -0
- package/dist/sdk/index.d.ts +27 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +33 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/types/adapters.d.ts +128 -0
- package/dist/sdk/types/adapters.d.ts.map +1 -0
- package/dist/sdk/types/adapters.js +10 -0
- package/dist/sdk/types/adapters.js.map +1 -0
- package/dist/sdk/types/channel.d.ts +270 -0
- package/dist/sdk/types/channel.d.ts.map +1 -0
- package/dist/sdk/types/channel.js +36 -0
- package/dist/sdk/types/channel.js.map +1 -0
- package/docs/channel/01-overview.md +117 -0
- package/docs/channel/02-configuration.md +138 -0
- package/docs/channel/03-capabilities.md +86 -0
- package/docs/channel/04-api-reference.md +394 -0
- package/docs/channel/05-message-protocol.md +194 -0
- package/docs/channel/06-security.md +83 -0
- package/docs/channel/README.md +30 -0
- package/docs/sdk/README.md +13 -0
- package/docs/sdk/v2026.1.29-v2026.2.19.md +630 -0
- package/jest.config.js +19 -0
- package/openclaw.plugin.json +113 -0
- package/package.json +74 -0
- package/run-poll.mjs +209 -0
- package/scripts/reload-plugin.sh +78 -0
- package/src/index.test.ts +432 -0
- package/src/index.ts +1638 -0
- package/src/sdk/adapters/cache.test.ts +205 -0
- package/src/sdk/adapters/cache.ts +193 -0
- package/src/sdk/adapters/default.ts +196 -0
- package/src/sdk/adapters/webhub.ts +857 -0
- package/src/sdk/adapters/websocket.ts +378 -0
- package/src/sdk/core/channel.ts +230 -0
- package/src/sdk/index.ts +36 -0
- package/src/sdk/types/adapters.ts +169 -0
- package/src/sdk/types/channel.ts +346 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/******************************************************************
|
|
2
|
+
* Channel SDK - WebSocket Adapter
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw Channel SDK 的 WebSocket 连接适配器
|
|
5
|
+
*
|
|
6
|
+
* @see https://github.com/chatu-ai/openclaw-web-hub-channel
|
|
7
|
+
******************************************************************/
|
|
8
|
+
import type { OutboundMessage, SendResult, ConnectionConfig, ConnectionStatus, ChannelStats } from '../types/channel';
|
|
9
|
+
import type { ConnectionAdapter, MessageCallback, StatusCallback } from '../types/adapters';
|
|
10
|
+
/**
|
|
11
|
+
* WebSocket 连接适配器 [Channel SDK 标准]
|
|
12
|
+
*
|
|
13
|
+
* 使用 WebSocket 进行实时通信
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const adapter = new WebSocketAdapter({
|
|
18
|
+
* channelId: 'wh_ch_xxx',
|
|
19
|
+
* accessToken: 'token_xxx',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* adapter.connect();
|
|
23
|
+
* adapter.onMessage((msg) => console.log(msg));
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class WebSocketAdapter implements ConnectionAdapter {
|
|
27
|
+
/** 配置 [Channel SDK 标准] */
|
|
28
|
+
config: ConnectionConfig;
|
|
29
|
+
/** WebSocket 实例 [Channel SDK 标准] */
|
|
30
|
+
private ws;
|
|
31
|
+
/** 当前状态 [Channel SDK 标准] */
|
|
32
|
+
private _status;
|
|
33
|
+
/** 消息回调 [Channel SDK 标准] */
|
|
34
|
+
private messageCallbacks;
|
|
35
|
+
/** 状态回调 [Channel SDK 标准] */
|
|
36
|
+
private statusCallbacks;
|
|
37
|
+
/** 待确认消息 [Channel SDK 标准] */
|
|
38
|
+
private pendingMessages;
|
|
39
|
+
/** 最后心跳时间 [Channel SDK 标准] */
|
|
40
|
+
private lastHeartbeat;
|
|
41
|
+
/** 心跳定时器 [Channel SDK 标准] */
|
|
42
|
+
private heartbeatTimer;
|
|
43
|
+
/** 重连定时器 [Channel SDK 标准] */
|
|
44
|
+
private reconnectTimer;
|
|
45
|
+
/** 重连次数 [Channel SDK 标准] */
|
|
46
|
+
private reconnectAttempts;
|
|
47
|
+
/** Plugin-Channel Realtime: whether first connect has succeeded */
|
|
48
|
+
private _wasConnected;
|
|
49
|
+
/** Plugin-Channel Realtime: callbacks fired on every successful reconnect (not initial connect) */
|
|
50
|
+
private reconnectedCallbacks;
|
|
51
|
+
/** 统计 [Channel SDK 标准] */
|
|
52
|
+
private stats;
|
|
53
|
+
/**
|
|
54
|
+
* 创建 WebSocket 适配器 [Channel SDK 标准]
|
|
55
|
+
*/
|
|
56
|
+
constructor(config: ConnectionConfig);
|
|
57
|
+
/** 当前状态 [Channel SDK 标准] */
|
|
58
|
+
get status(): ConnectionStatus;
|
|
59
|
+
/**
|
|
60
|
+
* 建立连接 [Channel SDK 标准]
|
|
61
|
+
*/
|
|
62
|
+
connect(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* 断开连接 [Channel SDK 标准]
|
|
65
|
+
*/
|
|
66
|
+
disconnect(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* 发送消息 [Channel SDK 标准]
|
|
69
|
+
*/
|
|
70
|
+
send(message: OutboundMessage): Promise<SendResult>;
|
|
71
|
+
/**
|
|
72
|
+
* 订阅消息 [Channel SDK 标准]
|
|
73
|
+
*/
|
|
74
|
+
onMessage(callback: MessageCallback): void;
|
|
75
|
+
/**
|
|
76
|
+
* Plugin-Channel Realtime: Register a callback fired on every successful reconnect.
|
|
77
|
+
* Alias for onopen after the first connection. Use this for cache flush.
|
|
78
|
+
*/
|
|
79
|
+
onReconnected(callback: () => void): void;
|
|
80
|
+
/**
|
|
81
|
+
* 订阅状态变化 [Channel SDK 标准]
|
|
82
|
+
*/
|
|
83
|
+
onStatusChange(callback: StatusCallback): void;
|
|
84
|
+
/**
|
|
85
|
+
* 获取统计 [Channel SDK 标准]
|
|
86
|
+
*/
|
|
87
|
+
getStats(): Promise<ChannelStats>;
|
|
88
|
+
/**
|
|
89
|
+
* 处理消息帧 [Channel SDK 标准]
|
|
90
|
+
*/
|
|
91
|
+
private handleFrame;
|
|
92
|
+
/**
|
|
93
|
+
* 处理消息 [Channel SDK 标准]
|
|
94
|
+
*/
|
|
95
|
+
private handleMessage;
|
|
96
|
+
/**
|
|
97
|
+
* 处理心跳 [Channel SDK 标准]
|
|
98
|
+
*/
|
|
99
|
+
private handleHeartbeat;
|
|
100
|
+
/**
|
|
101
|
+
* 处理确认 [Channel SDK 标准]
|
|
102
|
+
*/
|
|
103
|
+
private handleAck;
|
|
104
|
+
/**
|
|
105
|
+
* 处理错误 [Channel SDK 标准]
|
|
106
|
+
*/
|
|
107
|
+
private handleError;
|
|
108
|
+
/**
|
|
109
|
+
* 启动心跳 [Channel SDK 标准]
|
|
110
|
+
*/
|
|
111
|
+
private startHeartbeat;
|
|
112
|
+
/**
|
|
113
|
+
* 停止心跳 [Channel SDK 标准]
|
|
114
|
+
*/
|
|
115
|
+
private stopHeartbeat;
|
|
116
|
+
/**
|
|
117
|
+
* 发送心跳 [Channel SDK 标准]
|
|
118
|
+
*/
|
|
119
|
+
private sendHeartbeat;
|
|
120
|
+
/**
|
|
121
|
+
* 尝试重连 [Channel SDK 标准]
|
|
122
|
+
*/
|
|
123
|
+
private attemptReconnect;
|
|
124
|
+
/**
|
|
125
|
+
* 停止重连 [Channel SDK 标准]
|
|
126
|
+
*/
|
|
127
|
+
private stopReconnect;
|
|
128
|
+
/**
|
|
129
|
+
* 通知状态变化 [Channel SDK 标准]
|
|
130
|
+
*/
|
|
131
|
+
private notifyStatus;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../src/sdk/adapters/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;oEAMoE;AAEpE,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAa5F;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,0BAA0B;IACnB,MAAM,EAAE,gBAAgB,CAAC;IAEhC,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAA0B;IAEpC,4BAA4B;IAC5B,OAAO,CAAC,OAAO,CAAoC;IAEnD,4BAA4B;IAC5B,OAAO,CAAC,gBAAgB,CAAmC;IAE3D,4BAA4B;IAC5B,OAAO,CAAC,eAAe,CAAkC;IAEzD,6BAA6B;IAC7B,OAAO,CAAC,eAAe,CAAqE;IAE5F,8BAA8B;IAC9B,OAAO,CAAC,aAAa,CAAa;IAElC,6BAA6B;IAC7B,OAAO,CAAC,cAAc,CAA+C;IAErE,6BAA6B;IAC7B,OAAO,CAAC,cAAc,CAA8C;IAEpE,4BAA4B;IAC5B,OAAO,CAAC,iBAAiB,CAAa;IAEtC,mEAAmE;IACnE,OAAO,CAAC,aAAa,CAAkB;IAEvC,mGAAmG;IACnG,OAAO,CAAC,oBAAoB,CAA8B;IAE1D,0BAA0B;IAC1B,OAAO,CAAC,KAAK,CAKX;IAEF;;OAEG;gBACS,MAAM,EAAE,gBAAgB;IAUpC,4BAA4B;IAC5B,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgD9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAuCzD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI1C;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIzC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI9C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAIvC;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;YACW,aAAa;IAc3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/******************************************************************
|
|
3
|
+
* Channel SDK - WebSocket Adapter
|
|
4
|
+
*
|
|
5
|
+
* OpenClaw Channel SDK 的 WebSocket 连接适配器
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/chatu-ai/openclaw-web-hub-channel
|
|
8
|
+
******************************************************************/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.WebSocketAdapter = void 0;
|
|
11
|
+
const uuid_1 = require("uuid");
|
|
12
|
+
/**
|
|
13
|
+
* WebSocket 连接适配器 [Channel SDK 标准]
|
|
14
|
+
*
|
|
15
|
+
* 使用 WebSocket 进行实时通信
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const adapter = new WebSocketAdapter({
|
|
20
|
+
* channelId: 'wh_ch_xxx',
|
|
21
|
+
* accessToken: 'token_xxx',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* adapter.connect();
|
|
25
|
+
* adapter.onMessage((msg) => console.log(msg));
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
class WebSocketAdapter {
|
|
29
|
+
/**
|
|
30
|
+
* 创建 WebSocket 适配器 [Channel SDK 标准]
|
|
31
|
+
*/
|
|
32
|
+
constructor(config) {
|
|
33
|
+
/** WebSocket 实例 [Channel SDK 标准] */
|
|
34
|
+
this.ws = null;
|
|
35
|
+
/** 当前状态 [Channel SDK 标准] */
|
|
36
|
+
this._status = 'disconnected';
|
|
37
|
+
/** 消息回调 [Channel SDK 标准] */
|
|
38
|
+
this.messageCallbacks = new Set();
|
|
39
|
+
/** 状态回调 [Channel SDK 标准] */
|
|
40
|
+
this.statusCallbacks = new Set();
|
|
41
|
+
/** 待确认消息 [Channel SDK 标准] */
|
|
42
|
+
this.pendingMessages = new Map();
|
|
43
|
+
/** 最后心跳时间 [Channel SDK 标准] */
|
|
44
|
+
this.lastHeartbeat = 0;
|
|
45
|
+
/** 心跳定时器 [Channel SDK 标准] */
|
|
46
|
+
this.heartbeatTimer = null;
|
|
47
|
+
/** 重连定时器 [Channel SDK 标准] */
|
|
48
|
+
this.reconnectTimer = null;
|
|
49
|
+
/** 重连次数 [Channel SDK 标准] */
|
|
50
|
+
this.reconnectAttempts = 0;
|
|
51
|
+
/** Plugin-Channel Realtime: whether first connect has succeeded */
|
|
52
|
+
this._wasConnected = false;
|
|
53
|
+
/** Plugin-Channel Realtime: callbacks fired on every successful reconnect (not initial connect) */
|
|
54
|
+
this.reconnectedCallbacks = new Set();
|
|
55
|
+
/** 统计 [Channel SDK 标准] */
|
|
56
|
+
this.stats = {
|
|
57
|
+
messagesSent: 0,
|
|
58
|
+
messagesReceived: 0,
|
|
59
|
+
connectedDuration: 0,
|
|
60
|
+
lastActiveAt: Date.now(),
|
|
61
|
+
};
|
|
62
|
+
this.config = {
|
|
63
|
+
heartbeatInterval: 30000,
|
|
64
|
+
heartbeatTimeout: 10000,
|
|
65
|
+
// Plugin-Channel Realtime: Infinity = unlimited retries (prod default)
|
|
66
|
+
maxReconnectAttempts: Infinity,
|
|
67
|
+
...config,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** 当前状态 [Channel SDK 标准] */
|
|
71
|
+
get status() {
|
|
72
|
+
return this._status;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 建立连接 [Channel SDK 标准]
|
|
76
|
+
*/
|
|
77
|
+
async connect() {
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
// 使用 webhubUrl 构建 WebSocket URL
|
|
80
|
+
const webhubUrl = this.config.webhubUrl || 'wss://example.com/ws';
|
|
81
|
+
const url = new URL(webhubUrl);
|
|
82
|
+
url.searchParams.set('channelId', this.config.channelId);
|
|
83
|
+
url.searchParams.set('token', this.config.accessToken);
|
|
84
|
+
this.ws = new WebSocket(url.toString());
|
|
85
|
+
this.ws.onopen = () => {
|
|
86
|
+
this._status = 'connected';
|
|
87
|
+
this.reconnectAttempts = 0;
|
|
88
|
+
this.stats.connectedDuration = Date.now();
|
|
89
|
+
this.startHeartbeat();
|
|
90
|
+
this.notifyStatus('connected');
|
|
91
|
+
// Plugin-Channel Realtime: fire onReconnected on reconnect (not initial connect)
|
|
92
|
+
if (this._wasConnected) {
|
|
93
|
+
this.reconnectedCallbacks.forEach(cb => cb());
|
|
94
|
+
}
|
|
95
|
+
this._wasConnected = true;
|
|
96
|
+
resolve();
|
|
97
|
+
};
|
|
98
|
+
this.ws.onmessage = (event) => {
|
|
99
|
+
try {
|
|
100
|
+
const frame = JSON.parse(event.data);
|
|
101
|
+
this.handleFrame(frame);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('解析消息失败:', error);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
this.ws.onclose = () => {
|
|
108
|
+
this._status = 'disconnected';
|
|
109
|
+
this.stopHeartbeat();
|
|
110
|
+
this.notifyStatus('disconnected');
|
|
111
|
+
this.attemptReconnect();
|
|
112
|
+
};
|
|
113
|
+
this.ws.onerror = (error) => {
|
|
114
|
+
this._status = 'error';
|
|
115
|
+
this.notifyStatus('error', new Error('WebSocket error'));
|
|
116
|
+
reject(error);
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 断开连接 [Channel SDK 标准]
|
|
122
|
+
*/
|
|
123
|
+
async disconnect() {
|
|
124
|
+
this.stopHeartbeat();
|
|
125
|
+
this.stopReconnect();
|
|
126
|
+
if (this.ws) {
|
|
127
|
+
this.ws.close();
|
|
128
|
+
this.ws = null;
|
|
129
|
+
}
|
|
130
|
+
this._status = 'disconnected';
|
|
131
|
+
this.notifyStatus('disconnected');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 发送消息 [Channel SDK 标准]
|
|
135
|
+
*/
|
|
136
|
+
async send(message) {
|
|
137
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
138
|
+
return {
|
|
139
|
+
messageId: message.messageId || (0, uuid_1.v4)(),
|
|
140
|
+
success: false,
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
error: {
|
|
143
|
+
code: 'NOT_CONNECTED',
|
|
144
|
+
message: 'WebSocket 未连接',
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const messageId = message.messageId || (0, uuid_1.v4)();
|
|
149
|
+
const frame = {
|
|
150
|
+
type: 'message',
|
|
151
|
+
channelId: this.config.channelId,
|
|
152
|
+
timestamp: Date.now(),
|
|
153
|
+
payload: {
|
|
154
|
+
messageId,
|
|
155
|
+
...message,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
// 加入待确认队列
|
|
159
|
+
this.pendingMessages.set(messageId, {
|
|
160
|
+
timestamp: Date.now(),
|
|
161
|
+
retryCount: 0,
|
|
162
|
+
});
|
|
163
|
+
this.ws.send(JSON.stringify(frame));
|
|
164
|
+
return {
|
|
165
|
+
messageId,
|
|
166
|
+
success: true,
|
|
167
|
+
timestamp: Date.now(),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 订阅消息 [Channel SDK 标准]
|
|
172
|
+
*/
|
|
173
|
+
onMessage(callback) {
|
|
174
|
+
this.messageCallbacks.add(callback);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Plugin-Channel Realtime: Register a callback fired on every successful reconnect.
|
|
178
|
+
* Alias for onopen after the first connection. Use this for cache flush.
|
|
179
|
+
*/
|
|
180
|
+
onReconnected(callback) {
|
|
181
|
+
this.reconnectedCallbacks.add(callback);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 订阅状态变化 [Channel SDK 标准]
|
|
185
|
+
*/
|
|
186
|
+
onStatusChange(callback) {
|
|
187
|
+
this.statusCallbacks.add(callback);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 获取统计 [Channel SDK 标准]
|
|
191
|
+
*/
|
|
192
|
+
async getStats() {
|
|
193
|
+
return { ...this.stats };
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 处理消息帧 [Channel SDK 标准]
|
|
197
|
+
*/
|
|
198
|
+
handleFrame(frame) {
|
|
199
|
+
switch (frame.type) {
|
|
200
|
+
case 'message':
|
|
201
|
+
this.handleMessage(frame);
|
|
202
|
+
break;
|
|
203
|
+
case 'heartbeat':
|
|
204
|
+
this.handleHeartbeat(frame);
|
|
205
|
+
break;
|
|
206
|
+
case 'ack':
|
|
207
|
+
this.handleAck(frame);
|
|
208
|
+
break;
|
|
209
|
+
case 'error':
|
|
210
|
+
this.handleError(frame);
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* 处理消息 [Channel SDK 标准]
|
|
216
|
+
*/
|
|
217
|
+
handleMessage(frame) {
|
|
218
|
+
const message = frame.payload;
|
|
219
|
+
this.stats.messagesReceived++;
|
|
220
|
+
this.messageCallbacks.forEach((cb) => cb(message));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 处理心跳 [Channel SDK 标准]
|
|
224
|
+
*/
|
|
225
|
+
handleHeartbeat(frame) {
|
|
226
|
+
this.lastHeartbeat = Date.now();
|
|
227
|
+
this.notifyStatus('connected');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* 处理确认 [Channel SDK 标准]
|
|
231
|
+
*/
|
|
232
|
+
handleAck(frame) {
|
|
233
|
+
const payload = frame.payload;
|
|
234
|
+
if (payload.messageId) {
|
|
235
|
+
this.pendingMessages.delete(payload.messageId);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 处理错误 [Channel SDK 标准]
|
|
240
|
+
*/
|
|
241
|
+
handleError(frame) {
|
|
242
|
+
const error = frame.payload;
|
|
243
|
+
const err = new Error(error.message || '未知错误');
|
|
244
|
+
this.notifyStatus('error', err);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 启动心跳 [Channel SDK 标准]
|
|
248
|
+
*/
|
|
249
|
+
startHeartbeat() {
|
|
250
|
+
this.heartbeatTimer = setInterval(() => {
|
|
251
|
+
this.sendHeartbeat();
|
|
252
|
+
}, this.config.heartbeatInterval);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 停止心跳 [Channel SDK 标准]
|
|
256
|
+
*/
|
|
257
|
+
stopHeartbeat() {
|
|
258
|
+
if (this.heartbeatTimer) {
|
|
259
|
+
clearInterval(this.heartbeatTimer);
|
|
260
|
+
this.heartbeatTimer = null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 发送心跳 [Channel SDK 标准]
|
|
265
|
+
*/
|
|
266
|
+
async sendHeartbeat() {
|
|
267
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const frame = {
|
|
271
|
+
type: 'heartbeat',
|
|
272
|
+
channelId: this.config.channelId,
|
|
273
|
+
timestamp: Date.now(),
|
|
274
|
+
};
|
|
275
|
+
this.ws.send(JSON.stringify(frame));
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* 尝试重连 [Channel SDK 标准]
|
|
279
|
+
*/
|
|
280
|
+
attemptReconnect() {
|
|
281
|
+
const maxAttempts = this.config.maxReconnectAttempts ?? Infinity;
|
|
282
|
+
// Plugin-Channel Realtime: support Infinity (unlimited retries)
|
|
283
|
+
if (maxAttempts !== Infinity && this.reconnectAttempts >= maxAttempts) {
|
|
284
|
+
this._status = 'error';
|
|
285
|
+
this.notifyStatus('error', new Error('重连次数过多'));
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
this.reconnectAttempts++;
|
|
289
|
+
// T008 Plugin-Channel SSE: exponential backoff with ±20% jitter
|
|
290
|
+
// delay = min(1000 × 2^n, 30000) × (0.8 + random × 0.4)
|
|
291
|
+
const baseDelay = Math.min(1000 * Math.pow(2, this.reconnectAttempts - 1), 30000);
|
|
292
|
+
const delay = Math.round(baseDelay * (0.8 + Math.random() * 0.4));
|
|
293
|
+
this.reconnectTimer = setTimeout(() => {
|
|
294
|
+
this.connect().catch(() => { });
|
|
295
|
+
}, delay);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* 停止重连 [Channel SDK 标准]
|
|
299
|
+
*/
|
|
300
|
+
stopReconnect() {
|
|
301
|
+
if (this.reconnectTimer) {
|
|
302
|
+
clearTimeout(this.reconnectTimer);
|
|
303
|
+
this.reconnectTimer = null;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* 通知状态变化 [Channel SDK 标准]
|
|
308
|
+
*/
|
|
309
|
+
notifyStatus(status, error) {
|
|
310
|
+
this.statusCallbacks.forEach((cb) => cb(status, error));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
exports.WebSocketAdapter = WebSocketAdapter;
|
|
314
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/sdk/adapters/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/******************************************************************
|
|
2
|
+
* Channel SDK - Channel Class
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw Channel SDK 的核心 Channel 类
|
|
5
|
+
*
|
|
6
|
+
* @see https://github.com/chatu-ai/openclaw-web-hub-channel
|
|
7
|
+
******************************************************************/
|
|
8
|
+
import { OutboundMessage, SendResult, ConnectionConfig, ConnectionStatus, ChannelStats, ChannelCapabilities, TargetType } from '../types/channel';
|
|
9
|
+
import type { MessageCallback, StatusCallback, AdapterFactory } from '../types/adapters';
|
|
10
|
+
/**
|
|
11
|
+
* Channel 配置 [Channel SDK 标准]
|
|
12
|
+
*/
|
|
13
|
+
export interface ChannelOptions {
|
|
14
|
+
/** 连接配置 [Channel SDK 标准] */
|
|
15
|
+
config: ConnectionConfig;
|
|
16
|
+
/** 适配器工厂 [Channel SDK 标准] */
|
|
17
|
+
adapterFactory?: AdapterFactory;
|
|
18
|
+
/** 自动重连 [Channel SDK 标准] */
|
|
19
|
+
autoReconnect?: boolean;
|
|
20
|
+
/** 自动发送心跳 [Channel SDK 标准] */
|
|
21
|
+
autoHeartbeat?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Channel 类 [Channel SDK 标准]
|
|
25
|
+
*
|
|
26
|
+
* Channel 的核心管理类,处理连接、消息收发等
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const channel = new Channel({
|
|
31
|
+
* config: {
|
|
32
|
+
* channelId: 'wh_ch_xxx',
|
|
33
|
+
* accessToken: 'token_xxx',
|
|
34
|
+
* }
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* channel.connect();
|
|
38
|
+
* channel.onMessage((msg) => {
|
|
39
|
+
* console.log('收到消息:', msg);
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare class Channel {
|
|
44
|
+
/** 连接配置 [Channel SDK 标准] */
|
|
45
|
+
readonly config: ConnectionConfig;
|
|
46
|
+
/** 适配器工厂 [Channel SDK 标准] */
|
|
47
|
+
readonly adapterFactory: AdapterFactory;
|
|
48
|
+
/** 连接适配器 [Channel SDK 标准] */
|
|
49
|
+
private connectionAdapter;
|
|
50
|
+
/** 消息回调列表 [Channel SDK 标准] */
|
|
51
|
+
private messageCallbacks;
|
|
52
|
+
/** 状态回调列表 [Channel SDK 标准] */
|
|
53
|
+
private statusCallbacks;
|
|
54
|
+
/** 是否已连接 [Channel SDK 标准] */
|
|
55
|
+
get isConnected(): boolean;
|
|
56
|
+
/** 当前状态 [Channel SDK 标准] */
|
|
57
|
+
get status(): ConnectionStatus;
|
|
58
|
+
/** 统计信息 [Channel SDK 标准] */
|
|
59
|
+
private _stats;
|
|
60
|
+
/**
|
|
61
|
+
* 创建 Channel 实例 [Channel SDK 标准]
|
|
62
|
+
*/
|
|
63
|
+
constructor(options: ChannelOptions);
|
|
64
|
+
/**
|
|
65
|
+
* 连接到 Channel 服务 [Channel SDK 标准]
|
|
66
|
+
*/
|
|
67
|
+
connect(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* 断开连接 [Channel SDK 标准]
|
|
70
|
+
*/
|
|
71
|
+
disconnect(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* 发送消息 [Channel SDK 标准]
|
|
74
|
+
*/
|
|
75
|
+
send(message: OutboundMessage): Promise<SendResult>;
|
|
76
|
+
/**
|
|
77
|
+
* 发送文本消息 [Channel SDK 标准]
|
|
78
|
+
*/
|
|
79
|
+
sendText(targetId: string, text: string, options?: {
|
|
80
|
+
type?: TargetType;
|
|
81
|
+
replyTo?: string;
|
|
82
|
+
}): Promise<SendResult>;
|
|
83
|
+
/**
|
|
84
|
+
* 订阅消息 [Channel SDK 标准]
|
|
85
|
+
*/
|
|
86
|
+
onMessage(callback: MessageCallback): () => void;
|
|
87
|
+
/**
|
|
88
|
+
* 订阅状态变化 [Channel SDK 标准]
|
|
89
|
+
*/
|
|
90
|
+
onStatusChange(callback: StatusCallback): () => void;
|
|
91
|
+
/**
|
|
92
|
+
* 获取统计信息 [Channel SDK 标准]
|
|
93
|
+
*/
|
|
94
|
+
getStats(): Promise<ChannelStats>;
|
|
95
|
+
/**
|
|
96
|
+
* 获取能力 [Channel SDK 标准]
|
|
97
|
+
*/
|
|
98
|
+
getCapabilities(): Promise<ChannelCapabilities>;
|
|
99
|
+
/**
|
|
100
|
+
* 销毁 Channel [Channel SDK 标准]
|
|
101
|
+
*/
|
|
102
|
+
destroy(): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/sdk/core/channel.ts"],"names":[],"mappings":"AAAA;;;;;;oEAMoE;AAEpE,OAAO,EAEL,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAEV,eAAe,EACf,cAAc,EACd,cAAc,EACf,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,MAAM,EAAE,gBAAgB,CAAC;IAEzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,4BAA4B;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,OAAO;IAClB,4BAA4B;IAC5B,SAAgB,MAAM,EAAE,gBAAgB,CAAC;IAEzC,6BAA6B;IAC7B,SAAgB,cAAc,EAAE,cAAc,CAAC;IAE/C,6BAA6B;IAC7B,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,8BAA8B;IAC9B,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,8BAA8B;IAC9B,OAAO,CAAC,eAAe,CAAsB;IAE7C,6BAA6B;IAC7B,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,4BAA4B;IAC5B,IAAW,MAAM,IAAI,gBAAgB,CAEpC;IAED,4BAA4B;IAC5B,OAAO,CAAC,MAAM,CAKZ;IAEF;;OAEG;gBACS,OAAO,EAAE,cAAc;IA0BnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAWzD;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,OAAO,CAAC,UAAU,CAAC;IActB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;IAShD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAQpD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IASvC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKrD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
|