lark-relay 0.4.9 → 0.4.11
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 +6 -0
- package/bin/lark-relay.js +6 -6
- package/lib/help.js +26 -18
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -80,6 +80,12 @@ lark-relay take --app <app> --chats oc_xxx --render text
|
|
|
80
80
|
多消费者**共享 store、各持游标**,不做「处理完即删」-- 谁都不能替别人删。
|
|
81
81
|
盯同一 app 请用不同 `--name` 隔离游标。
|
|
82
82
|
|
|
83
|
+
**游标要自己收尾**:它是「关了会话、过阵子接着盯」的续接凭据,所以引擎**不会**
|
|
84
|
+
自动清理不活跃的游标 -- 自动清掉就等于下次重挂要么全量重放、要么跳过停机期的消息。
|
|
85
|
+
代价是不再用的游标会一直留在 `status` 里显示「落后 N 条」,而 store 只保留几天,
|
|
86
|
+
那个 N 会随过期删除而变小(**看着像追上了,其实是消息没了**)。
|
|
87
|
+
一次性监听、验完的排查、不再值守的任务,收尾时 `rm -rf ~/.lark-relay/cursors/<name>`。
|
|
88
|
+
|
|
83
89
|
## 设计取舍
|
|
84
90
|
|
|
85
91
|
- **原子落盘**:collect 读 stdout NDJSON 后自己 `写 .tmp -> rename`(同目录原子)。
|
package/bin/lark-relay.js
CHANGED
|
@@ -17,21 +17,21 @@ const COMMANDS = ['take', 'status', 'guide']
|
|
|
17
17
|
|
|
18
18
|
// collect 搬家提示。能力是**搬走了不是删了**,所以不能只说「未知命令」
|
|
19
19
|
const MOVED_HINT =
|
|
20
|
-
`collect 已拆成独立命令
|
|
20
|
+
`collect 已拆成独立命令 -- 它是常驻服务,不该和在场取用挤在一个入口:\n` +
|
|
21
21
|
` lark-relay-collect # 前台跑(调试)\n` +
|
|
22
22
|
` lark-relay-collect --help # 参数与常驻部署\n` +
|
|
23
23
|
`同一个包就带,不用另外装。\n`
|
|
24
24
|
|
|
25
|
-
const USAGE = `lark-relay ${VERSION}
|
|
25
|
+
const USAGE = `lark-relay ${VERSION} -- Lark 事件中继站(在场取用)
|
|
26
26
|
|
|
27
|
-
lark-relay take
|
|
27
|
+
lark-relay take ... 在场取用:阻塞等一批 -> 输出 -> 退出
|
|
28
28
|
lark-relay status 谁在跑 / 各 app 积压 / 各游标位置
|
|
29
|
-
lark-relay guide
|
|
29
|
+
lark-relay guide 一页用法(装完先读这个)
|
|
30
30
|
|
|
31
31
|
采集底座是独立命令(常驻服务):lark-relay-collect
|
|
32
32
|
|
|
33
|
-
第一次用
|
|
34
|
-
各命令详情
|
|
33
|
+
第一次用 -> lark-relay guide
|
|
34
|
+
各命令详情 -> lark-relay <命令> --help`
|
|
35
35
|
|
|
36
36
|
async function main() {
|
|
37
37
|
const argv = process.argv.slice(2)
|
package/lib/help.js
CHANGED
|
@@ -34,6 +34,8 @@ function takeHelp(apps) {
|
|
|
34
34
|
--name <n> 游标身份,省略时按 app+chats 自动派生
|
|
35
35
|
--filter <jq> 业务过滤,如 '.sender_id != "ou_xxx"'
|
|
36
36
|
--debounce N 防抖秒数(默认 5;聊天场景建议 15)
|
|
37
|
+
--max-wait N 从第一条起最多攒多久就吐(默认 25 秒)
|
|
38
|
+
--timeout N 没消息时最多阻塞多久,到点空手退出码 4(默认 12 小时)
|
|
37
39
|
--render text 按群分组紧凑文本(默认 NDJSON)
|
|
38
40
|
--since now|all 起始位置(默认 now,不重放历史)
|
|
39
41
|
|
|
@@ -44,10 +46,12 @@ function takeHelp(apps) {
|
|
|
44
46
|
4 超时没消息 -- 正常,再起一个继续
|
|
45
47
|
|
|
46
48
|
最佳实践
|
|
47
|
-
·
|
|
48
|
-
·
|
|
49
|
-
·
|
|
50
|
-
|
|
49
|
+
· 一直等不到消息 -> 九成是 bot 不在群,回第二步验(最常见故障)
|
|
50
|
+
· 多个消费者盯同一 app 用不同 --name,游标互不干扰
|
|
51
|
+
· 不盯了就删游标:rm -rf ~/.lark-relay/cursors/<name>
|
|
52
|
+
引擎不会自动清(它是跨会话续接的凭据)。留着会在 status 里一直挂
|
|
53
|
+
「落后 N 条」,而 store 只保留几天 -- N 会随过期删除而变小,
|
|
54
|
+
看着像追上了,其实是消息没了`
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
const COLLECT_HELP = `把全部 lark-cli profile 的事件收下来,原子落盘。零参数、零配置。
|
|
@@ -55,7 +59,7 @@ const COLLECT_HELP = `把全部 lark-cli profile 的事件收下来,原子落盘
|
|
|
55
59
|
lark-relay-collect # 前台跑(调试)
|
|
56
60
|
常驻:macOS 用 launchd(plist 模板见仓库 launchd/ 目录)
|
|
57
61
|
|
|
58
|
-
独立可执行文件而非 \`lark-relay\` 的子命令
|
|
62
|
+
独立可执行文件而非 \`lark-relay\` 的子命令 -- 它是常驻服务,服务管理器展示的是
|
|
59
63
|
可执行文件名,与 launchd label(com.adaex.lark-relay-collect)同名才认得出。
|
|
60
64
|
|
|
61
65
|
app 列表实时读 \`lark-cli profile list\`,新增 profile 自动纳入,无需改配置。
|
|
@@ -67,18 +71,18 @@ tokenStatus 为 expired 的 profile 自动跳过并 warn(永久失败,重试是
|
|
|
67
71
|
8s 后才起 consumer,收到 0 条)。collect 独立常驻,才能让 take 侧
|
|
68
72
|
崩了、AI 跑 30 分钟、会话关几小时,都不丢消息。
|
|
69
73
|
|
|
70
|
-
装完先 \`lark-relay status\` 确认 -- collect 行应为 running
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
日志行带 ISO 时间戳;超 16MB 自动轮转,旧的在 .1/.2/.3
|
|
74
|
+
装完先 \`lark-relay status\` 确认 -- collect 行应为 running;不在跑看日志:
|
|
75
|
+
tail -f ~/.lark-relay/logs/collect.err.log
|
|
76
|
+
(launchd 把 stderr 直写该文件,不进统一日志,log show 查不到)
|
|
77
|
+
日志行带 ISO 时间戳;超 16MB 自动轮转,旧的在 .1/.2/.3
|
|
75
78
|
|
|
76
79
|
落盘:~/.lark-relay/store/<app>/<YYYY-MM-DD>/<纳秒>_<pid>_<seq>.json
|
|
77
80
|
回收由 collect 进程内每小时自查一次,删超期的整个日期目录(不另起 gc 单元/timer)。
|
|
78
81
|
|
|
79
82
|
参数
|
|
80
83
|
--exclude <apps> 排除指定 profile(逗号分隔)
|
|
81
|
-
--retain N store 保留天数(默认 3
|
|
84
|
+
--retain N store 保留天数(默认 3,上限 4 = 消费侧扫描窗口;
|
|
85
|
+
再大就会「留着却扫不到」,故硬拒)
|
|
82
86
|
|
|
83
87
|
环境变量
|
|
84
88
|
LARK_RELAY_LOG_MAX_MB 单个日志文件上限(默认 16),超了轮转
|
|
@@ -91,9 +95,10 @@ const STATUS_HELP = `一眼看清全局:谁在跑、积压多少、游标在哪
|
|
|
91
95
|
|
|
92
96
|
排障入口:某消费者「落后」很多 -> 它的 take 没在跑或卡住;
|
|
93
97
|
「无消费者」= 白采,可考虑 --exclude。
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
collect
|
|
98
|
+
不打算再盯的消费者要删游标(引擎不会自动清,积压数还会随 store 过期而虚假变小):
|
|
99
|
+
rm -rf ~/.lark-relay/cursors/<name>
|
|
100
|
+
collect 行不是 running -> tail -f ~/.lark-relay/logs/collect.err.log
|
|
101
|
+
(launchd 不进统一日志),collect 停摆的每一秒都在丢消息。`
|
|
97
102
|
|
|
98
103
|
const GUIDE = `lark-relay -- Lark 事件中继站。两件事:收下来 / 我来取。
|
|
99
104
|
|
|
@@ -107,15 +112,18 @@ const GUIDE = `lark-relay -- Lark 事件中继站。两件事:收下来 / 我来
|
|
|
107
112
|
不在跑 -> 起常驻服务(macOS launchd,plist 模板见仓库;
|
|
108
113
|
或 \`lark-relay-collect\` 前台调试)
|
|
109
114
|
|
|
110
|
-
take
|
|
115
|
+
take 四步(照做)
|
|
111
116
|
1. 查群 ID lark-cli --profile <app> im +chat-search --as user --query "<群名>"
|
|
112
117
|
2. 验 bot 在群 lark-cli --profile <app> im chat.members bots --as user \\
|
|
113
118
|
--params '{"chat_id":"oc_xxx"}'
|
|
114
119
|
3. 监听(用 run_in_background 起,别前台)
|
|
115
120
|
lark-relay take --app <app> --chats oc_xxx --render text
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
121
|
+
起来后 stderr 有一行「监听中」-- 没有就是没起来,看 stderr。
|
|
122
|
+
一批处理完再起一个。不要自己写 while 循环 -- 进程退出会通知你。
|
|
123
|
+
退出码:0=有一批,4=超时没消息(正常,再起一个),2=参数错,3=游标被占用。
|
|
124
|
+
4. 不盯了收尾 rm -rf ~/.lark-relay/cursors/<name>
|
|
125
|
+
游标只为「关了会话、过阵子接着盯」而存在,引擎不会自动清。
|
|
126
|
+
临时监听、验完的排查、不再值守的任务,收尾时自己删掉
|
|
119
127
|
|
|
120
128
|
常见错误
|
|
121
129
|
· 拿不到消息 -> 九成是 bot 不在群。验 bot 必须 --as user,
|