@vibe-lark/larkpal 0.1.91-issue68.0 → 0.1.91-issue69.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/dist/main.mjs +173 -15
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -7009,6 +7009,175 @@ function clearChatInfoCache(accountId) {
|
|
|
7009
7009
|
}
|
|
7010
7010
|
}
|
|
7011
7011
|
//#endregion
|
|
7012
|
+
//#region src/core/lark-ws-event-normalizer.ts
|
|
7013
|
+
const REDACTED_HEADER_PATTERN = /authorization|token|secret|signature|encrypt|cookie|credential/i;
|
|
7014
|
+
function normalizeLarkWsEventFrame(frame) {
|
|
7015
|
+
const rewrittenTypeFrame = readHeader(frame.headers, ["type"]) === "card" ? {
|
|
7016
|
+
...frame,
|
|
7017
|
+
headers: (frame.headers ?? []).map((header) => header.key === "type" ? {
|
|
7018
|
+
...header,
|
|
7019
|
+
value: "event"
|
|
7020
|
+
} : header)
|
|
7021
|
+
} : frame;
|
|
7022
|
+
if (rewrittenTypeFrame.payload && rewrittenTypeFrame.payload.byteLength > 0) return rewrittenTypeFrame;
|
|
7023
|
+
const eventType = readHeader(rewrittenTypeFrame.headers, [
|
|
7024
|
+
"event_type",
|
|
7025
|
+
"event-type",
|
|
7026
|
+
"eventType",
|
|
7027
|
+
"x-lark-event-type",
|
|
7028
|
+
"x-lark-event_type"
|
|
7029
|
+
]);
|
|
7030
|
+
if (eventType !== "application.bot.menu_v6") return rewrittenTypeFrame;
|
|
7031
|
+
const eventKey = readHeader(rewrittenTypeFrame.headers, [
|
|
7032
|
+
"event_key",
|
|
7033
|
+
"event-key",
|
|
7034
|
+
"eventKey",
|
|
7035
|
+
"menu_event_key",
|
|
7036
|
+
"menu-event-key",
|
|
7037
|
+
"menuEventKey"
|
|
7038
|
+
]);
|
|
7039
|
+
if (!eventKey) return rewrittenTypeFrame;
|
|
7040
|
+
const payload = buildBotMenuPayload(rewrittenTypeFrame.headers, eventType, eventKey);
|
|
7041
|
+
return {
|
|
7042
|
+
...rewrittenTypeFrame,
|
|
7043
|
+
headers: ensureDispatchHeaders(rewrittenTypeFrame.headers),
|
|
7044
|
+
payload: new TextEncoder().encode(JSON.stringify(payload))
|
|
7045
|
+
};
|
|
7046
|
+
}
|
|
7047
|
+
function getLarkWsFrameDiagnostics(frame) {
|
|
7048
|
+
const diagnostics = {
|
|
7049
|
+
msgType: readHeader(frame.headers, ["type"]),
|
|
7050
|
+
eventType: readHeader(frame.headers, [
|
|
7051
|
+
"event_type",
|
|
7052
|
+
"event-type",
|
|
7053
|
+
"eventType",
|
|
7054
|
+
"x-lark-event-type",
|
|
7055
|
+
"x-lark-event_type"
|
|
7056
|
+
]),
|
|
7057
|
+
eventKey: readHeader(frame.headers, [
|
|
7058
|
+
"event_key",
|
|
7059
|
+
"event-key",
|
|
7060
|
+
"eventKey",
|
|
7061
|
+
"menu_event_key",
|
|
7062
|
+
"menu-event-key"
|
|
7063
|
+
]),
|
|
7064
|
+
headersCount: frame.headers?.length ?? 0,
|
|
7065
|
+
hasData: frame.data != null,
|
|
7066
|
+
hasPayload: !!frame.payload && frame.payload.byteLength > 0,
|
|
7067
|
+
dataPreview: previewUnknown(frame.data),
|
|
7068
|
+
payloadPreview: previewPayload(frame.payload)
|
|
7069
|
+
};
|
|
7070
|
+
if (!diagnostics.eventType || !diagnostics.hasPayload) diagnostics.headers = sanitizeHeaders(frame.headers);
|
|
7071
|
+
return diagnostics;
|
|
7072
|
+
}
|
|
7073
|
+
function buildBotMenuPayload(headers, eventType, eventKey) {
|
|
7074
|
+
const tenantKey = readHeader(headers, [
|
|
7075
|
+
"tenant_key",
|
|
7076
|
+
"tenant-key",
|
|
7077
|
+
"tenantKey",
|
|
7078
|
+
"x-tenant-key"
|
|
7079
|
+
]);
|
|
7080
|
+
const operatorOpenId = readHeader(headers, [
|
|
7081
|
+
"operator_open_id",
|
|
7082
|
+
"operator-open-id",
|
|
7083
|
+
"operatorOpenId",
|
|
7084
|
+
"open_id",
|
|
7085
|
+
"open-id"
|
|
7086
|
+
]);
|
|
7087
|
+
const operatorUserId = readHeader(headers, [
|
|
7088
|
+
"operator_user_id",
|
|
7089
|
+
"operator-user-id",
|
|
7090
|
+
"operatorUserId",
|
|
7091
|
+
"user_id",
|
|
7092
|
+
"user-id"
|
|
7093
|
+
]);
|
|
7094
|
+
const operatorUnionId = readHeader(headers, [
|
|
7095
|
+
"operator_union_id",
|
|
7096
|
+
"operator-union-id",
|
|
7097
|
+
"operatorUnionId",
|
|
7098
|
+
"union_id"
|
|
7099
|
+
]);
|
|
7100
|
+
const openChatId = readHeader(headers, [
|
|
7101
|
+
"open_chat_id",
|
|
7102
|
+
"open-chat-id",
|
|
7103
|
+
"openChatId",
|
|
7104
|
+
"chat_id",
|
|
7105
|
+
"chat-id"
|
|
7106
|
+
]);
|
|
7107
|
+
return omitUndefined({
|
|
7108
|
+
schema: "2.0",
|
|
7109
|
+
header: omitUndefined({
|
|
7110
|
+
event_type: eventType,
|
|
7111
|
+
tenant_key: tenantKey
|
|
7112
|
+
}),
|
|
7113
|
+
event: omitUndefined({
|
|
7114
|
+
event_key: eventKey,
|
|
7115
|
+
operator: operatorOpenId || operatorUserId || operatorUnionId ? { operator_id: omitUndefined({
|
|
7116
|
+
open_id: operatorOpenId,
|
|
7117
|
+
user_id: operatorUserId,
|
|
7118
|
+
union_id: operatorUnionId
|
|
7119
|
+
}) } : void 0,
|
|
7120
|
+
open_chat_id: openChatId
|
|
7121
|
+
})
|
|
7122
|
+
});
|
|
7123
|
+
}
|
|
7124
|
+
function readHeader(headers, names) {
|
|
7125
|
+
const wanted = new Set(names.map(normalizeHeaderName));
|
|
7126
|
+
for (const header of headers ?? []) {
|
|
7127
|
+
const key = header.key;
|
|
7128
|
+
const value = header.value;
|
|
7129
|
+
if (!key || typeof value !== "string" || !value.trim()) continue;
|
|
7130
|
+
if (wanted.has(normalizeHeaderName(key))) return value;
|
|
7131
|
+
}
|
|
7132
|
+
}
|
|
7133
|
+
function normalizeHeaderName(name) {
|
|
7134
|
+
return name.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
7135
|
+
}
|
|
7136
|
+
function sanitizeHeaders(headers) {
|
|
7137
|
+
return (headers ?? []).filter((header) => typeof header.key === "string").map((header) => ({
|
|
7138
|
+
key: header.key,
|
|
7139
|
+
value: REDACTED_HEADER_PATTERN.test(header.key) ? "[redacted]" : previewString(header.value)
|
|
7140
|
+
}));
|
|
7141
|
+
}
|
|
7142
|
+
function ensureDispatchHeaders(headers) {
|
|
7143
|
+
const nextHeaders = [...headers ?? []];
|
|
7144
|
+
const ensureHeader = (key, value) => {
|
|
7145
|
+
if (!readHeader(nextHeaders, [key])) nextHeaders.push({
|
|
7146
|
+
key,
|
|
7147
|
+
value
|
|
7148
|
+
});
|
|
7149
|
+
};
|
|
7150
|
+
ensureHeader("message_id", `synthetic-${Date.now()}`);
|
|
7151
|
+
ensureHeader("sum", "1");
|
|
7152
|
+
ensureHeader("seq", "0");
|
|
7153
|
+
ensureHeader("trace_id", "synthetic-bot-menu");
|
|
7154
|
+
return nextHeaders;
|
|
7155
|
+
}
|
|
7156
|
+
function previewPayload(payload) {
|
|
7157
|
+
if (!payload || payload.byteLength === 0) return void 0;
|
|
7158
|
+
try {
|
|
7159
|
+
return previewString(new TextDecoder().decode(payload));
|
|
7160
|
+
} catch {
|
|
7161
|
+
return `[binary:${payload.byteLength}]`;
|
|
7162
|
+
}
|
|
7163
|
+
}
|
|
7164
|
+
function previewUnknown(value) {
|
|
7165
|
+
if (value == null) return void 0;
|
|
7166
|
+
if (typeof value === "string") return previewString(value);
|
|
7167
|
+
try {
|
|
7168
|
+
return previewString(JSON.stringify(value));
|
|
7169
|
+
} catch {
|
|
7170
|
+
return String(value).slice(0, 200);
|
|
7171
|
+
}
|
|
7172
|
+
}
|
|
7173
|
+
function previewString(value) {
|
|
7174
|
+
if (typeof value !== "string") return void 0;
|
|
7175
|
+
return value.slice(0, 200);
|
|
7176
|
+
}
|
|
7177
|
+
function omitUndefined(value) {
|
|
7178
|
+
return Object.fromEntries(Object.entries(value).filter(([, entryValue]) => entryValue !== void 0));
|
|
7179
|
+
}
|
|
7180
|
+
//#endregion
|
|
7012
7181
|
//#region src/core/lark-client.ts
|
|
7013
7182
|
/**
|
|
7014
7183
|
* Copyright (c) 2026 ByteDance Ltd. and/or its affiliates
|
|
@@ -7331,24 +7500,13 @@ var LarkClient = class LarkClient {
|
|
|
7331
7500
|
const wsClientAny = this._wsClient;
|
|
7332
7501
|
const origHandleEventData = wsClientAny.handleEventData.bind(wsClientAny);
|
|
7333
7502
|
wsClientAny.handleEventData = (data) => {
|
|
7334
|
-
const
|
|
7335
|
-
const
|
|
7503
|
+
const normalizedData = normalizeLarkWsEventFrame(data);
|
|
7504
|
+
const diagnostics = getLarkWsFrameDiagnostics(normalizedData);
|
|
7336
7505
|
log$24.info("WS 收到原始事件", {
|
|
7337
7506
|
accountId: this.accountId,
|
|
7338
|
-
|
|
7339
|
-
eventType,
|
|
7340
|
-
headersCount: data.headers?.length,
|
|
7341
|
-
hasData: !!data.data,
|
|
7342
|
-
dataPreview: typeof data.data === "string" ? data.data.slice(0, 200) : JSON.stringify(data.data)?.slice(0, 200)
|
|
7343
|
-
});
|
|
7344
|
-
if (msgType === "card") return origHandleEventData({
|
|
7345
|
-
...data,
|
|
7346
|
-
headers: data.headers.map((h) => h.key === "type" ? {
|
|
7347
|
-
...h,
|
|
7348
|
-
value: "event"
|
|
7349
|
-
} : h)
|
|
7507
|
+
...diagnostics
|
|
7350
7508
|
});
|
|
7351
|
-
return origHandleEventData(
|
|
7509
|
+
return origHandleEventData(normalizedData);
|
|
7352
7510
|
};
|
|
7353
7511
|
await this.waitForAbort(dispatcher, abortSignal);
|
|
7354
7512
|
}
|