

























1+import { resolveWhatsAppGroupConversationId } from "./group-conversation.js";
12import type {
3+DeprecatedWebInboundAdmissionTopLevelFields,
24DeprecatedWebInboundMessageFlatAliases,
35LegacyFlatWebInboundMessage,
46WebInboundCallbackMessage,
@@ -105,10 +107,10 @@ function setMediaField<K extends keyof NonNullable<WebInboundCallbackMessage["pa
105107ensureMedia(msg)[key] = value;
106108}
107109108-function defineDeprecatedAliasAccessors<T extends WebInboundCallbackMessage>(
110+function defineDeprecatedAccessors<T extends object>(
109111msg: T,
110-descriptors: Record<keyof DeprecatedWebInboundMessageFlatAliases, AliasDescriptor>,
111-): T & WebInboundMessage {
112+descriptors: Record<string, AliasDescriptor>,
113+): T {
112114Object.defineProperties(
113115msg,
114116Object.fromEntries(
@@ -123,14 +125,85 @@ function defineDeprecatedAliasAccessors<T extends WebInboundCallbackMessage>(
123125]),
124126),
125127);
128+return msg;
129+}
130+131+function defineDeprecatedAliasAccessors<T extends WebInboundCallbackMessage>(
132+msg: T,
133+descriptors: Record<keyof DeprecatedWebInboundMessageFlatAliases, AliasDescriptor>,
134+): T & WebInboundMessage {
135+defineDeprecatedAccessors(msg, descriptors);
126136return msg as T & WebInboundMessage;
127137}
128138139+function defineDeprecatedAdmissionTopLevelAccessors<T extends WebInboundCallbackMessage>(
140+msg: T,
141+): T {
142+let fallbackConversationId = msg.conversationId || msg.from;
143+let fallbackAccountId = msg.accountId;
144+let fallbackAccessControlPassed = msg.accessControlPassed;
145+let fallbackChatType = msg.chatType;
146+147+const conversationId = () => msg.admission?.conversation.id ?? fallbackConversationId;
148+const setConversationId = (value: unknown) => {
149+const next = value as string;
150+fallbackConversationId = next;
151+if (msg.admission) {
152+msg.admission.conversation.id = next;
153+msg.admission.conversation.groupSessionId = resolveWhatsAppGroupConversationId(next);
154+}
155+};
156+157+const descriptors: Record<keyof DeprecatedWebInboundAdmissionTopLevelFields, AliasDescriptor> = {
158+from: {
159+get: conversationId,
160+set: setConversationId,
161+},
162+conversationId: {
163+get: conversationId,
164+set: setConversationId,
165+},
166+accountId: {
167+get: () => msg.admission?.accountId ?? fallbackAccountId,
168+set: (value) => {
169+const next = value as string;
170+fallbackAccountId = next;
171+if (msg.admission) {
172+msg.admission.accountId = next;
173+msg.admission.account.accountId = next;
174+}
175+},
176+},
177+accessControlPassed: {
178+get: () =>
179+msg.admission ? msg.admission.ingress.decision === "allow" : fallbackAccessControlPassed,
180+set: (value) => {
181+// The legacy boolean is derived from the ingress graph; writes only preserve
182+// no-admission legacy inputs instead of fabricating a partial graph update.
183+fallbackAccessControlPassed = value as boolean | undefined;
184+},
185+},
186+chatType: {
187+get: () => msg.admission?.conversation.kind ?? fallbackChatType,
188+set: (value) => {
189+const next = value as "direct" | "group";
190+fallbackChatType = next;
191+if (msg.admission) {
192+msg.admission.conversation.kind = next;
193+}
194+},
195+},
196+};
197+198+return defineDeprecatedAccessors(msg, descriptors);
199+}
200+129201export function withDeprecatedWebInboundMessageFlatAliases<T extends WebInboundCallbackMessage>(
130202msg: T,
131203): T & WebInboundMessage {
132-// Keep the shipped callback shape alive while nested contexts remain canonical.
133-return defineDeprecatedAliasAccessors(msg, {
204+// Keep the shipped callback shape alive while nested/admission contexts remain canonical.
205+const withAdmissionAliases = defineDeprecatedAdmissionTopLevelAccessors(msg);
206+return defineDeprecatedAliasAccessors(withAdmissionAliases, {
134207id: { get: () => msg.event.id, set: (value) => (msg.event.id = value as string | undefined) },
135208to: {
136209get: () => msg.platform.recipientJid,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。