lightclawbot 1.0.7 → 1.0.9-beta.0
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/README.md +47 -213
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/src/channel.d.ts +1 -1
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +1 -1
- package/dist/src/channel.js.map +1 -1
- package/dist/src/config.d.ts +16 -6
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +18 -5
- package/dist/src/config.js.map +1 -1
- package/dist/src/download-tool.d.ts +2 -2
- package/dist/src/download-tool.d.ts.map +1 -1
- package/dist/src/download-tool.js +9 -9
- package/dist/src/download-tool.js.map +1 -1
- package/dist/src/file-storage.d.ts +9 -9
- package/dist/src/file-storage.d.ts.map +1 -1
- package/dist/src/file-storage.js +10 -10
- package/dist/src/file-storage.js.map +1 -1
- package/dist/src/format-urls.d.ts +5 -5
- package/dist/src/format-urls.js +8 -8
- package/dist/src/format-urls.js.map +1 -1
- package/dist/src/gateway.d.ts.map +1 -1
- package/dist/src/gateway.js +18 -14
- package/dist/src/gateway.js.map +1 -1
- package/dist/src/inbound.d.ts.map +1 -1
- package/dist/src/inbound.js +20 -21
- package/dist/src/inbound.js.map +1 -1
- package/dist/src/outbound.d.ts +1 -1
- package/dist/src/outbound.d.ts.map +1 -1
- package/dist/src/outbound.js +15 -3
- package/dist/src/outbound.js.map +1 -1
- package/dist/src/runtime.d.ts +1 -1
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/socket/handlers.d.ts +26 -0
- package/dist/src/socket/handlers.d.ts.map +1 -0
- package/dist/src/socket/handlers.js +130 -0
- package/dist/src/socket/handlers.js.map +1 -0
- package/dist/src/socket/index.d.ts +11 -0
- package/dist/src/socket/index.d.ts.map +1 -0
- package/dist/src/socket/index.js +9 -0
- package/dist/src/socket/index.js.map +1 -0
- package/dist/src/socket/registry.d.ts +59 -0
- package/dist/src/socket/registry.d.ts.map +1 -0
- package/dist/src/socket/registry.js +125 -0
- package/dist/src/socket/registry.js.map +1 -0
- package/dist/src/socket/reliable-emitter.d.ts +79 -0
- package/dist/src/socket/reliable-emitter.d.ts.map +1 -0
- package/dist/src/socket/reliable-emitter.js +217 -0
- package/dist/src/socket/reliable-emitter.js.map +1 -0
- package/dist/src/types.d.ts +7 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/upload-tool.d.ts +2 -2
- package/dist/src/upload-tool.d.ts.map +1 -1
- package/dist/src/upload-tool.js +3 -3
- package/dist/src/upload-tool.js.map +1 -1
- package/node_modules/socket.io-parser/build/cjs/index.d.ts +14 -4
- package/node_modules/socket.io-parser/build/cjs/index.js +14 -6
- package/node_modules/socket.io-parser/build/esm/index.d.ts +14 -4
- package/node_modules/socket.io-parser/build/esm/index.js +14 -6
- package/node_modules/socket.io-parser/build/esm-debug/index.d.ts +14 -4
- package/node_modules/socket.io-parser/build/esm-debug/index.js +14 -6
- package/node_modules/socket.io-parser/package.json +1 -1
- package/package.json +6 -11
- package/skills/lightclaw-media/SKILL.md +22 -102
- package/dist/public/data/scripts/manifest.json +0 -11
- package/dist/public/data/scripts/upgrade.211d7e4c.sh +0 -266
- package/dist/public/data/scripts/upgrade.sh +0 -266
- package/dist/src/session-history.d.ts +0 -88
- package/dist/src/session-history.d.ts.map +0 -1
- package/dist/src/session-history.js +0 -598
- package/dist/src/session-history.js.map +0 -1
- package/dist/src/streaming/delta-tracker.d.ts +0 -34
- package/dist/src/streaming/delta-tracker.d.ts.map +0 -1
- package/dist/src/streaming/delta-tracker.js +0 -145
- package/dist/src/streaming/delta-tracker.js.map +0 -1
- package/dist/src/streaming/index.d.ts +0 -12
- package/dist/src/streaming/index.d.ts.map +0 -1
- package/dist/src/streaming/index.js +0 -13
- package/dist/src/streaming/index.js.map +0 -1
- package/dist/src/streaming/stream-reply-sink.d.ts +0 -59
- package/dist/src/streaming/stream-reply-sink.d.ts.map +0 -1
- package/dist/src/streaming/stream-reply-sink.js +0 -293
- package/dist/src/streaming/stream-reply-sink.js.map +0 -1
- package/dist/src/streaming/types.d.ts +0 -45
- package/dist/src/streaming/types.d.ts.map +0 -1
- package/dist/src/streaming/types.js +0 -7
- package/dist/src/streaming/types.js.map +0 -1
package/dist/src/outbound.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { resolveAccount, CHANNEL_KEY, DEFAULT_ACCOUNT_ID, EVENT_MESSAGE_PRIVATE } from "./config.js";
|
|
12
12
|
import { getAssistantRuntime } from "./runtime.js";
|
|
13
|
-
import { getSocket, bufferMessage, hasEntry, getBotClientId } from "./socket
|
|
13
|
+
import { getSocket, bufferMessage, hasEntry, getBotClientId, getReliableEmitter } from "./socket/index.js";
|
|
14
14
|
import { formatCosUrls } from "./format-urls.js";
|
|
15
15
|
/** 获取日志器 */
|
|
16
16
|
function getLogger() {
|
|
@@ -54,10 +54,22 @@ function sendViaSocket(accountId, target, text, replyToId) {
|
|
|
54
54
|
replyToMsgId: replyToId ?? undefined,
|
|
55
55
|
};
|
|
56
56
|
if (entry) {
|
|
57
|
-
// Socket connected
|
|
57
|
+
// Socket connected — 优先走可靠发送
|
|
58
|
+
const emitter = getReliableEmitter(resolvedAccountId);
|
|
59
|
+
if (emitter) {
|
|
60
|
+
emitter.emitWithAck(EVENT_MESSAGE_PRIVATE, message, msgId)
|
|
61
|
+
.then(ok => {
|
|
62
|
+
if (!ok) {
|
|
63
|
+
getLogger().error(`[${CHANNEL_KEY}] outbound delivery failed after retries: msgId=${msgId}`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
getLogger().info(`[${CHANNEL_KEY}] outbound sent via reliable WS: to=${target} msgId=${msgId}`);
|
|
67
|
+
return msgId;
|
|
68
|
+
}
|
|
69
|
+
// fallback: 直接 emit(不应走到这里,但保留兜底)
|
|
58
70
|
try {
|
|
59
71
|
entry.socket.emit(EVENT_MESSAGE_PRIVATE, message);
|
|
60
|
-
getLogger().info(`[${CHANNEL_KEY}] outbound sent via WS: to=${target} msgId=${msgId}`);
|
|
72
|
+
getLogger().info(`[${CHANNEL_KEY}] outbound sent via WS (fallback): to=${target} msgId=${msgId}`);
|
|
61
73
|
return msgId;
|
|
62
74
|
}
|
|
63
75
|
catch (err) {
|
package/dist/src/outbound.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/outbound.ts"],"names":[],"mappings":"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"}
|
package/dist/src/runtime.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PluginRuntime } from "openclaw/plugin-sdk";
|
|
1
|
+
import type { PluginRuntime } from "openclaw/plugin-sdk/core";
|
|
2
2
|
export declare function setAssistantRuntime(rt: PluginRuntime): void;
|
|
3
3
|
export declare function getAssistantRuntime(): PluginRuntime;
|
|
4
4
|
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAK9D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAE3D;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAGnD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — Socket.IO 事件处理器
|
|
3
|
+
*
|
|
4
|
+
* 将 socket 事件监听(message:private、history:request、sessions:request)
|
|
5
|
+
* 从 gateway 主逻辑中解耦。
|
|
6
|
+
*
|
|
7
|
+
* 所有出站 socket.emit 通过 ReliableEmitter 实现 ACK 确认 + 自动重试。
|
|
8
|
+
*/
|
|
9
|
+
import type { Socket } from "socket.io-client";
|
|
10
|
+
import type { GatewayContext, QueuedMessage } from "../types.js";
|
|
11
|
+
import type { ReliableEmitter } from "./reliable-emitter.js";
|
|
12
|
+
export interface SocketHandlerDeps {
|
|
13
|
+
account: GatewayContext["account"];
|
|
14
|
+
botClientId: string;
|
|
15
|
+
log?: GatewayContext["log"];
|
|
16
|
+
enqueueMessage: (msg: QueuedMessage) => void;
|
|
17
|
+
/** 收到入站事件时调用,通知框架更新 lastEventAt */
|
|
18
|
+
onEvent?: () => void;
|
|
19
|
+
/** 可靠发送器 — 所有出站 emit 都通过此发送 */
|
|
20
|
+
reliableEmitter: ReliableEmitter;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 绑定所有 Socket.IO 事件监听器
|
|
24
|
+
*/
|
|
25
|
+
export declare function bindSocketHandlers(socket: Socket, deps: SocketHandlerDeps): void;
|
|
26
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/socket/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAC;AAarF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5B,cAAc,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,+BAA+B;IAC/B,eAAe,EAAE,eAAe,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAmIhF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — Socket.IO 事件处理器
|
|
3
|
+
*
|
|
4
|
+
* 将 socket 事件监听(message:private、history:request、sessions:request)
|
|
5
|
+
* 从 gateway 主逻辑中解耦。
|
|
6
|
+
*
|
|
7
|
+
* 所有出站 socket.emit 通过 ReliableEmitter 实现 ACK 确认 + 自动重试。
|
|
8
|
+
*/
|
|
9
|
+
import { CHANNEL_KEY, EVENT_MESSAGE_PRIVATE, EVENT_HISTORY_REQUEST, EVENT_HISTORY_RESPONSE, EVENT_SESSIONS_REQUEST, EVENT_SESSIONS_RESPONSE, DEFAULT_HISTORY_LIMIT, } from "../config.js";
|
|
10
|
+
import { isDuplicate, debounceHistoryRequest, generateMsgId } from "../dedup.js";
|
|
11
|
+
import { getAssistantRuntime } from "../runtime.js";
|
|
12
|
+
import { readSessionHistoryWithCron, listSessions } from "../history/index.js";
|
|
13
|
+
/**
|
|
14
|
+
* 绑定所有 Socket.IO 事件监听器
|
|
15
|
+
*/
|
|
16
|
+
export function bindSocketHandlers(socket, deps) {
|
|
17
|
+
const { account, botClientId, log, enqueueMessage, onEvent, reliableEmitter } = deps;
|
|
18
|
+
// ---- 接收用户消息 ----
|
|
19
|
+
socket.on(EVENT_MESSAGE_PRIVATE, (data, ack) => {
|
|
20
|
+
ack?.();
|
|
21
|
+
log?.info(`[${CHANNEL_KEY}] Received private message: ${JSON.stringify(data)},botClientId:${botClientId}`);
|
|
22
|
+
// 回环防御:过滤自身发出的消息
|
|
23
|
+
if (data.from === botClientId)
|
|
24
|
+
return;
|
|
25
|
+
// 跳过控制消息(typing / stream 信号),只处理真实用户消息
|
|
26
|
+
if (data.kind && data.kind !== "text")
|
|
27
|
+
return;
|
|
28
|
+
// 无内容跳过
|
|
29
|
+
const hasContent = data.content?.trim();
|
|
30
|
+
const hasFiles = data.files && data.files.length > 0;
|
|
31
|
+
if (!hasContent && !hasFiles)
|
|
32
|
+
return;
|
|
33
|
+
// 去重
|
|
34
|
+
if (isDuplicate(data.msgId))
|
|
35
|
+
return;
|
|
36
|
+
// 通知框架收到入站事件(更新 lastEventAt,防止 stale-socket 误判)
|
|
37
|
+
onEvent?.();
|
|
38
|
+
log?.info(`[${CHANNEL_KEY}] Message from ${data.from}: "${(data.content || "").slice(0, 60)}" files=${data.files?.length ?? 0}`);
|
|
39
|
+
enqueueMessage({
|
|
40
|
+
senderId: data.from,
|
|
41
|
+
text: data.content || "",
|
|
42
|
+
messageId: data.msgId,
|
|
43
|
+
files: data.files ?? [],
|
|
44
|
+
timestamp: data.timestamp,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
// ---- 历史消息请求 ----
|
|
48
|
+
socket.on(EVENT_HISTORY_REQUEST, (data, ack) => {
|
|
49
|
+
ack?.();
|
|
50
|
+
if (!data?.from) {
|
|
51
|
+
log?.warn(`[${CHANNEL_KEY}] History request missing userId, ignoring`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// 回环防御:忽略 bot 自身发出的请求
|
|
55
|
+
if (data.from === botClientId)
|
|
56
|
+
return;
|
|
57
|
+
// 去重:如果有 msgId,走消息级去重
|
|
58
|
+
if (data.msgId && isDuplicate(data.msgId)) {
|
|
59
|
+
log?.warn(`[${CHANNEL_KEY}] Duplicate history request (msgId), ignoring`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// 防抖:同一用户高频请求只处理最后一条
|
|
63
|
+
debounceHistoryRequest(data.from, () => {
|
|
64
|
+
// 通知框架收到入站事件(更新 lastEventAt,防止 stale-socket 误判)
|
|
65
|
+
onEvent?.();
|
|
66
|
+
try {
|
|
67
|
+
const pluginRuntime = getAssistantRuntime();
|
|
68
|
+
const currentCfg = pluginRuntime.config.loadConfig();
|
|
69
|
+
const route = pluginRuntime.channel.routing.resolveAgentRoute({
|
|
70
|
+
cfg: currentCfg,
|
|
71
|
+
channel: CHANNEL_KEY,
|
|
72
|
+
accountId: account.accountId,
|
|
73
|
+
peer: { kind: "direct", id: data.from },
|
|
74
|
+
});
|
|
75
|
+
const sessionKey = route?.sessionKey ?? `${CHANNEL_KEY}:dm:${data.from}`;
|
|
76
|
+
const messages = readSessionHistoryWithCron(sessionKey, {
|
|
77
|
+
limit: data.limit ?? DEFAULT_HISTORY_LIMIT,
|
|
78
|
+
chatOnly: data.chatOnly ?? true,
|
|
79
|
+
includeCron: true,
|
|
80
|
+
});
|
|
81
|
+
log?.info(`[${CHANNEL_KEY}] History request: userId=${data.from} sessionKey=${sessionKey} found=${messages.length}`);
|
|
82
|
+
const historyMsgId = generateMsgId();
|
|
83
|
+
reliableEmitter.emitWithAck(EVENT_HISTORY_RESPONSE, {
|
|
84
|
+
msgId: historyMsgId,
|
|
85
|
+
from: botClientId,
|
|
86
|
+
to: data.from,
|
|
87
|
+
sessionKey,
|
|
88
|
+
messages: messages.filter(msg => !!msg.content.trim() || (msg.files && msg.files.length > 0)),
|
|
89
|
+
}, historyMsgId);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
log?.error(`[${CHANNEL_KEY}] History request error: ${err}`);
|
|
93
|
+
const errorMsgId = generateMsgId();
|
|
94
|
+
reliableEmitter.emitWithAck(EVENT_HISTORY_RESPONSE, {
|
|
95
|
+
msgId: errorMsgId,
|
|
96
|
+
from: botClientId,
|
|
97
|
+
to: data.from,
|
|
98
|
+
sessionKey: "",
|
|
99
|
+
messages: [],
|
|
100
|
+
error: err instanceof Error ? err.message : String(err),
|
|
101
|
+
}, errorMsgId);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
// ---- 会话列表请求 ----
|
|
106
|
+
socket.on(EVENT_SESSIONS_REQUEST, (data) => {
|
|
107
|
+
// 通知框架收到入站事件(更新 lastEventAt,防止 stale-socket 误判)
|
|
108
|
+
onEvent?.();
|
|
109
|
+
try {
|
|
110
|
+
const sessions = listSessions();
|
|
111
|
+
const sessionsMsgId = generateMsgId();
|
|
112
|
+
reliableEmitter.emitWithAck(EVENT_SESSIONS_RESPONSE, {
|
|
113
|
+
requestId: data.requestId,
|
|
114
|
+
sessions,
|
|
115
|
+
msgId: sessionsMsgId,
|
|
116
|
+
}, sessionsMsgId);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
log?.error(`[${CHANNEL_KEY}] Sessions list error: ${err}`);
|
|
120
|
+
const sessionsErrMsgId = generateMsgId();
|
|
121
|
+
reliableEmitter.emitWithAck(EVENT_SESSIONS_RESPONSE, {
|
|
122
|
+
requestId: data.requestId,
|
|
123
|
+
sessions: [],
|
|
124
|
+
error: err instanceof Error ? err.message : String(err),
|
|
125
|
+
msgId: sessionsErrMsgId,
|
|
126
|
+
}, sessionsErrMsgId);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/socket/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — Socket 模块统一入口
|
|
3
|
+
*
|
|
4
|
+
* 收敛所有 socket 相关逻辑:事件处理器、注册表、可靠发送。
|
|
5
|
+
*/
|
|
6
|
+
export { bindSocketHandlers } from "./handlers.js";
|
|
7
|
+
export type { SocketHandlerDeps } from "./handlers.js";
|
|
8
|
+
export { registerSocket, unregisterSocket, getSocket, hasEntry, getBotClientId, getReliableEmitter, bufferMessage, flushPendingMessages, getPendingCount, } from "./registry.js";
|
|
9
|
+
export { ReliableEmitter } from "./reliable-emitter.js";
|
|
10
|
+
export type { EmitterStats } from "./reliable-emitter.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/socket/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — Socket 模块统一入口
|
|
3
|
+
*
|
|
4
|
+
* 收敛所有 socket 相关逻辑:事件处理器、注册表、可靠发送。
|
|
5
|
+
*/
|
|
6
|
+
export { bindSocketHandlers } from "./handlers.js";
|
|
7
|
+
export { registerSocket, unregisterSocket, getSocket, hasEntry, getBotClientId, getReliableEmitter, bufferMessage, flushPendingMessages, getPendingCount, } from "./registry.js";
|
|
8
|
+
export { ReliableEmitter } from "./reliable-emitter.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/socket/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — Socket 注册表
|
|
3
|
+
*
|
|
4
|
+
* 让 gateway 启动时注册 socket 实例,
|
|
5
|
+
* outbound 在需要发送消息时可以通过 WS 连接直接发送,
|
|
6
|
+
* 无需走 REST API。
|
|
7
|
+
*
|
|
8
|
+
* 断线缓冲:
|
|
9
|
+
* 当 socket 暂时断开(Socket.IO 自动重连中)时,outbound 消息
|
|
10
|
+
* 会被缓冲在 pendingMessages 队列中,重连后自动 flush 发送。
|
|
11
|
+
* 仅在 gateway 彻底销毁(cleanup)时才删除 entry。
|
|
12
|
+
*/
|
|
13
|
+
import type { Socket } from "socket.io-client";
|
|
14
|
+
import type { PrivateMessageData } from "../types.js";
|
|
15
|
+
import type { ReliableEmitter } from "./reliable-emitter.js";
|
|
16
|
+
interface SocketEntry {
|
|
17
|
+
socket: Socket;
|
|
18
|
+
botClientId: string;
|
|
19
|
+
/** 断线期间缓冲的待发消息 */
|
|
20
|
+
pendingMessages: PrivateMessageData[];
|
|
21
|
+
/** 可靠发送器(由 gateway 创建后注入) */
|
|
22
|
+
reliableEmitter?: ReliableEmitter;
|
|
23
|
+
}
|
|
24
|
+
/** 注册 socket(gateway 首次连接时调用) */
|
|
25
|
+
export declare function registerSocket(accountId: string, socket: Socket, botClientId: string, reliableEmitter?: ReliableEmitter): void;
|
|
26
|
+
/**
|
|
27
|
+
* 注销 socket(gateway 彻底销毁时调用)。
|
|
28
|
+
* 注意:普通断线重连不应调用此函数,只在 cleanup 时调用。
|
|
29
|
+
*/
|
|
30
|
+
export declare function unregisterSocket(accountId: string): void;
|
|
31
|
+
/** 获取可用的 socket(仅在 connected 时返回) */
|
|
32
|
+
export declare function getSocket(accountId: string): Pick<SocketEntry, "socket" | "botClientId"> | undefined;
|
|
33
|
+
/** 检查 account 是否有注册的 entry(不管是否 connected) */
|
|
34
|
+
export declare function hasEntry(accountId: string): boolean;
|
|
35
|
+
/** 获取 botClientId(不管 socket 是否 connected) */
|
|
36
|
+
export declare function getBotClientId(accountId: string): string | undefined;
|
|
37
|
+
/** 获取可靠发送器 */
|
|
38
|
+
export declare function getReliableEmitter(accountId: string): ReliableEmitter | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* 缓冲一条消息(socket 断开期间由 outbound 调用)。
|
|
41
|
+
* 返回 true 表示成功缓冲,false 表示该 account 没有注册的 entry。
|
|
42
|
+
*/
|
|
43
|
+
export declare function bufferMessage(accountId: string, message: PrivateMessageData): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* flush 所有缓冲消息(重连成功后由 gateway 调用)。
|
|
46
|
+
* 如果有 ReliableEmitter,走可靠发送;否则 fallback 直接 emit。
|
|
47
|
+
* 返回发送成功 / 失败的计数。
|
|
48
|
+
*/
|
|
49
|
+
export declare function flushPendingMessages(accountId: string, log?: {
|
|
50
|
+
info: (msg: string) => void;
|
|
51
|
+
warn: (msg: string) => void;
|
|
52
|
+
}): {
|
|
53
|
+
sent: number;
|
|
54
|
+
failed: number;
|
|
55
|
+
};
|
|
56
|
+
/** 获取缓冲队列长度(调试/监控用) */
|
|
57
|
+
export declare function getPendingCount(accountId: string): number;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/socket/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,6BAA6B;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AASD,iCAAiC;AACjC,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,eAAe,GAChC,IAAI,CAUN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAExD;AAMD,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG,SAAS,CAIpG;AAED,8CAA8C;AAC9C,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,cAAc;AACd,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEjF;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAUrF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAqClC;AAED,uBAAuB;AACvB,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — Socket 注册表
|
|
3
|
+
*
|
|
4
|
+
* 让 gateway 启动时注册 socket 实例,
|
|
5
|
+
* outbound 在需要发送消息时可以通过 WS 连接直接发送,
|
|
6
|
+
* 无需走 REST API。
|
|
7
|
+
*
|
|
8
|
+
* 断线缓冲:
|
|
9
|
+
* 当 socket 暂时断开(Socket.IO 自动重连中)时,outbound 消息
|
|
10
|
+
* 会被缓冲在 pendingMessages 队列中,重连后自动 flush 发送。
|
|
11
|
+
* 仅在 gateway 彻底销毁(cleanup)时才删除 entry。
|
|
12
|
+
*/
|
|
13
|
+
import { MAX_PENDING_MESSAGES, EVENT_MESSAGE_PRIVATE } from "../config.js";
|
|
14
|
+
/** accountId → SocketEntry */
|
|
15
|
+
const registry = new Map();
|
|
16
|
+
// ============================================================
|
|
17
|
+
// 注册 / 注销
|
|
18
|
+
// ============================================================
|
|
19
|
+
/** 注册 socket(gateway 首次连接时调用) */
|
|
20
|
+
export function registerSocket(accountId, socket, botClientId, reliableEmitter) {
|
|
21
|
+
const existing = registry.get(accountId);
|
|
22
|
+
if (existing) {
|
|
23
|
+
// 重连场景:更新 socket 引用,保留 pending 队列
|
|
24
|
+
existing.socket = socket;
|
|
25
|
+
existing.botClientId = botClientId;
|
|
26
|
+
existing.reliableEmitter = reliableEmitter;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
registry.set(accountId, { socket, botClientId, pendingMessages: [], reliableEmitter });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 注销 socket(gateway 彻底销毁时调用)。
|
|
34
|
+
* 注意:普通断线重连不应调用此函数,只在 cleanup 时调用。
|
|
35
|
+
*/
|
|
36
|
+
export function unregisterSocket(accountId) {
|
|
37
|
+
registry.delete(accountId);
|
|
38
|
+
}
|
|
39
|
+
// ============================================================
|
|
40
|
+
// 查询
|
|
41
|
+
// ============================================================
|
|
42
|
+
/** 获取可用的 socket(仅在 connected 时返回) */
|
|
43
|
+
export function getSocket(accountId) {
|
|
44
|
+
const entry = registry.get(accountId);
|
|
45
|
+
if (entry && entry.socket.connected)
|
|
46
|
+
return entry;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
/** 检查 account 是否有注册的 entry(不管是否 connected) */
|
|
50
|
+
export function hasEntry(accountId) {
|
|
51
|
+
return registry.has(accountId);
|
|
52
|
+
}
|
|
53
|
+
/** 获取 botClientId(不管 socket 是否 connected) */
|
|
54
|
+
export function getBotClientId(accountId) {
|
|
55
|
+
return registry.get(accountId)?.botClientId;
|
|
56
|
+
}
|
|
57
|
+
/** 获取可靠发送器 */
|
|
58
|
+
export function getReliableEmitter(accountId) {
|
|
59
|
+
return registry.get(accountId)?.reliableEmitter;
|
|
60
|
+
}
|
|
61
|
+
// ============================================================
|
|
62
|
+
// 断线缓冲
|
|
63
|
+
// ============================================================
|
|
64
|
+
/**
|
|
65
|
+
* 缓冲一条消息(socket 断开期间由 outbound 调用)。
|
|
66
|
+
* 返回 true 表示成功缓冲,false 表示该 account 没有注册的 entry。
|
|
67
|
+
*/
|
|
68
|
+
export function bufferMessage(accountId, message) {
|
|
69
|
+
const entry = registry.get(accountId);
|
|
70
|
+
if (!entry)
|
|
71
|
+
return false;
|
|
72
|
+
if (entry.pendingMessages.length >= MAX_PENDING_MESSAGES) {
|
|
73
|
+
// 队列满了,丢弃最早的消息
|
|
74
|
+
entry.pendingMessages.shift();
|
|
75
|
+
}
|
|
76
|
+
entry.pendingMessages.push(message);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* flush 所有缓冲消息(重连成功后由 gateway 调用)。
|
|
81
|
+
* 如果有 ReliableEmitter,走可靠发送;否则 fallback 直接 emit。
|
|
82
|
+
* 返回发送成功 / 失败的计数。
|
|
83
|
+
*/
|
|
84
|
+
export function flushPendingMessages(accountId, log) {
|
|
85
|
+
const entry = registry.get(accountId);
|
|
86
|
+
if (!entry)
|
|
87
|
+
return { sent: 0, failed: 0 };
|
|
88
|
+
const pending = entry.pendingMessages.splice(0); // 取出全部并清空
|
|
89
|
+
if (pending.length === 0)
|
|
90
|
+
return { sent: 0, failed: 0 };
|
|
91
|
+
let sent = 0;
|
|
92
|
+
let failed = 0;
|
|
93
|
+
for (const msg of pending) {
|
|
94
|
+
if (!entry.socket.connected) {
|
|
95
|
+
// socket 又断了,把剩余消息放回去
|
|
96
|
+
entry.pendingMessages.unshift(...pending.slice(sent + failed));
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
if (entry.reliableEmitter) {
|
|
100
|
+
// 通过可靠发送器发送
|
|
101
|
+
entry.reliableEmitter.emitWithAck(EVENT_MESSAGE_PRIVATE, msg, msg.msgId);
|
|
102
|
+
sent++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// fallback: 直接 emit(不应该走到这里)
|
|
106
|
+
try {
|
|
107
|
+
entry.socket.emit(EVENT_MESSAGE_PRIVATE, msg);
|
|
108
|
+
sent++;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
failed++;
|
|
112
|
+
log?.warn(`[socket-registry] Failed to flush buffered message: msgId=${msg.msgId}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (sent > 0 || failed > 0) {
|
|
117
|
+
log?.info(`[socket-registry] Flushed pending messages: sent=${sent}, failed=${failed}`);
|
|
118
|
+
}
|
|
119
|
+
return { sent, failed };
|
|
120
|
+
}
|
|
121
|
+
/** 获取缓冲队列长度(调试/监控用) */
|
|
122
|
+
export function getPendingCount(accountId) {
|
|
123
|
+
return registry.get(accountId)?.pendingMessages.length ?? 0;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/socket/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LightClaw — 可靠发送器
|
|
3
|
+
*
|
|
4
|
+
* 所有出站 socket.emit 都通过此模块,利用 Socket.IO 原生 ACK + timeout 机制:
|
|
5
|
+
* socket.timeout(ms).emit(event, data, (err, ...args) => { ... })
|
|
6
|
+
* 超时由 Socket.IO 原生处理,回调第一个参数为 Error(超时)或 null(成功)。
|
|
7
|
+
*
|
|
8
|
+
* 未收到 ACK 则指数退避重试,断线期间暂停重试、重连后立即重发。
|
|
9
|
+
*/
|
|
10
|
+
import type { Socket } from "socket.io-client";
|
|
11
|
+
export interface EmitterStats {
|
|
12
|
+
totalEmitted: number;
|
|
13
|
+
totalConfirmed: number;
|
|
14
|
+
totalRetries: number;
|
|
15
|
+
totalFailed: number;
|
|
16
|
+
currentPending: number;
|
|
17
|
+
}
|
|
18
|
+
type LogFn = {
|
|
19
|
+
info: (msg: string) => void;
|
|
20
|
+
warn: (msg: string) => void;
|
|
21
|
+
error: (msg: string) => void;
|
|
22
|
+
};
|
|
23
|
+
export declare class ReliableEmitter {
|
|
24
|
+
private getSocket;
|
|
25
|
+
private log?;
|
|
26
|
+
private pending;
|
|
27
|
+
private paused;
|
|
28
|
+
private idCounter;
|
|
29
|
+
private stats;
|
|
30
|
+
constructor(getSocket: () => Socket | null, log?: LogFn | undefined);
|
|
31
|
+
/**
|
|
32
|
+
* 可靠发送 — 带 ACK 确认 + 自动重试。
|
|
33
|
+
*
|
|
34
|
+
* 每次调用都是独立的发送请求,不会因相同 msgId 被合并。
|
|
35
|
+
* msgId 仅用于日志追踪,内部使用自增 emitId 作为 pending key。
|
|
36
|
+
*
|
|
37
|
+
* @param event Socket.IO 事件名
|
|
38
|
+
* @param data 消息体
|
|
39
|
+
* @param msgId 业务层消息 ID(仅用于日志追踪,可选)
|
|
40
|
+
* @returns true = server 已确认, false = 重试耗尽未确认
|
|
41
|
+
*/
|
|
42
|
+
emitWithAck(event: string, data: object, msgId?: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* 断线时调用 — 暂停所有重试计时器
|
|
45
|
+
*/
|
|
46
|
+
pause(): void;
|
|
47
|
+
/**
|
|
48
|
+
* 重连时调用 — 立即重发所有待确认消息
|
|
49
|
+
*/
|
|
50
|
+
resume(): void;
|
|
51
|
+
/**
|
|
52
|
+
* 销毁 — 清除所有定时器,resolve 所有 pending 为 false
|
|
53
|
+
*/
|
|
54
|
+
destroy(): void;
|
|
55
|
+
/** 当前待确认消息数 */
|
|
56
|
+
get pendingCount(): number;
|
|
57
|
+
/** 获取统计信息 */
|
|
58
|
+
getStats(): EmitterStats;
|
|
59
|
+
/**
|
|
60
|
+
* 通过 socket.timeout(ms).emit(event, data, callback) 发送消息。
|
|
61
|
+
*
|
|
62
|
+
* - 超时由 Socket.IO 原生 .timeout() 处理,无需手动 setTimeout
|
|
63
|
+
* - 回调签名为 (err: Error | null, ...args),err 非空说明超时或出错
|
|
64
|
+
* - socket.emit 是异步的,不会抛同步异常,无需 try-catch
|
|
65
|
+
*/
|
|
66
|
+
private doEmit;
|
|
67
|
+
private confirm;
|
|
68
|
+
private scheduleRetry;
|
|
69
|
+
/**
|
|
70
|
+
* 指数退避 + 随机抖动
|
|
71
|
+
* delay = min(base * 2^(retryCount-1) + jitter, maxDelay)
|
|
72
|
+
*/
|
|
73
|
+
private getRetryDelay;
|
|
74
|
+
/** 队列满时淘汰最早的 pending 消息 */
|
|
75
|
+
private evictIfNeeded;
|
|
76
|
+
private generateEmitId;
|
|
77
|
+
}
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=reliable-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reliable-emitter.d.ts","sourceRoot":"","sources":["../../../src/socket/reliable-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwB/C,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAMF,qBAAa,eAAe;IAcxB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG,CAAC;IAdd,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAK;IAGtB,OAAO,CAAC,KAAK,CAKX;gBAGQ,SAAS,EAAE,MAAM,MAAM,GAAG,IAAI,EAC9B,GAAG,CAAC,EAAE,KAAK,YAAA;IAOrB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC1E;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,MAAM,IAAI,IAAI;IASd;;OAEG;IACH,OAAO,IAAI,IAAI;IASf,eAAe;IACf,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,aAAa;IACb,QAAQ,IAAI,YAAY;IAQxB;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;IAuBd,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,aAAa;IA4BrB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAMrB,2BAA2B;IAC3B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,cAAc;CAGvB"}
|