Compare commits

..

1 Commits

Author SHA1 Message Date
Claude 0729200286 chore(deps): update music-metadata from 11.12.0 to 11.12.3
Includes security fix for CWE-85 (infinite loop in ASF parsing),
Ogg/Vorbis duration fix, and restored TypeScript declaration files.

https://claude.ai/code/session_01TPCoHnQ8Sosrrh6kQMYxof
2026-03-13 02:48:52 +00:00
6 changed files with 19 additions and 688 deletions
+1 -26
View File
@@ -1,7 +1,7 @@
syntax = "proto3";
package proto;
/// WhatsApp Version: 2.3000.1035216863
/// WhatsApp Version: 2.3000.1034989030
message ADVDeviceIdentity {
optional uint32 rawId = 1;
@@ -415,8 +415,6 @@ message BotCapabilityMetadata {
RICH_RESPONSE_INLINE_LINKS_ENABLED = 56;
RICH_RESPONSE_UR_IMAGINE_VIDEO = 57;
JSON_PATCH_STREAMING = 58;
AI_TAB_FORCE_CLIPPY = 59;
UNIFIED_RESPONSE_EMBEDDED_SCREENS = 60;
}
}
@@ -1084,7 +1082,6 @@ message ClientPairingProps {
optional bool isSyncdPureLidSession = 2;
optional bool isSyncdSnapshotRecoveryEnabled = 3;
optional bool isHsThumbnailSyncEnabled = 4;
optional bytes subscriptionSyncPayload = 5;
}
message ClientPayload {
@@ -1465,7 +1462,6 @@ message ContextInfo {
optional AdType adType = 25;
optional string wtwaWebsiteUrl = 26;
optional string adPreviewUrl = 27;
optional bool containsCtwaFlowsAutoReply = 28;
enum AdType {
CTWA = 0;
CAWC = 1;
@@ -1620,8 +1616,6 @@ message Conversation {
optional bool limitSharingInitiatedByMe = 53;
optional bool maibaAiThreadEnabled = 54;
optional bool isMarketingMessageThread = 55;
optional bool isSenderNewAccount = 56;
optional uint32 afterReadDuration = 57;
enum EndOfHistoryTransferType {
COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY = 0;
COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY = 1;
@@ -1920,8 +1914,6 @@ message HandshakeMessage {
optional bytes static = 1;
optional bytes payload = 2;
optional bytes extendedCiphertext = 3;
optional bytes paddedBytes = 4;
optional bool simulateXxkemFs = 5;
}
message ClientHello {
@@ -1930,9 +1922,6 @@ message HandshakeMessage {
optional bytes payload = 3;
optional bool useExtended = 4;
optional bytes extendedCiphertext = 5;
optional bytes paddedBytes = 6;
optional bool sendServerHelloPaddedBytes = 7;
optional bool simulateXxkemFs = 8;
}
message ServerHello {
@@ -1940,7 +1929,6 @@ message HandshakeMessage {
optional bytes static = 2;
optional bytes payload = 3;
optional bytes extendedStatic = 4;
optional bytes paddingBytes = 5;
}
}
@@ -3178,11 +3166,6 @@ message Message {
optional int64 expiryTimestamp = 2;
optional bool incentiveEligible = 3;
optional string referralId = 4;
optional InviteType inviteType = 5;
enum InviteType {
DEFAULT = 0;
MAPPER = 1;
}
enum ServiceType {
UNKNOWN = 0;
FBPAY = 1;
@@ -3604,7 +3587,6 @@ message Message {
GROUP_MEMBER_LABEL_CHANGE = 30;
AI_MEDIA_COLLECTION_MESSAGE = 31;
MESSAGE_UNSCHEDULE = 32;
BOT_UNLINK_MESSAGE = 33;
}
}
@@ -4166,7 +4148,6 @@ enum MutationProps {
BUSINESS_BROADCAST_INSIGHTS_ACTION = 82;
CUSTOMER_DATA_ACTION = 83;
SUBSCRIPTIONS_SYNC_V2_ACTION = 84;
THREAD_PIN_ACTION = 85;
SHARE_OWN_PN = 10001;
BUSINESS_BROADCAST_ACTION = 10002;
AI_THREAD_DELETE_ACTION = 10003;
@@ -4635,7 +4616,6 @@ message StatusAttribution {
APPLE_MUSIC = 8;
SHARECHAT = 9;
GOOGLE_PHOTOS = 10;
SOUNDCLOUD = 11;
}
}
@@ -4805,7 +4785,6 @@ message SyncActionValue {
optional BusinessBroadcastInsightsAction businessBroadcastInsightsAction = 82;
optional CustomerDataAction customerDataAction = 83;
optional SubscriptionsSyncV2Action subscriptionsSyncV2Action = 84;
optional ThreadPinAction threadPinAction = 85;
message AgentAction {
optional string name = 1;
optional int32 deviceID = 2;
@@ -5355,10 +5334,6 @@ message SyncActionValue {
repeated SyncActionValue.SyncActionMessage messages = 3;
}
message ThreadPinAction {
optional bool pinned = 1;
}
message TimeFormatAction {
optional bool isTwentyFourHourFormatEnabled = 1;
}
+3 -53
View File
@@ -1090,9 +1090,7 @@ export namespace proto {
RICH_RESPONSE_UR_BLOKS_ENABLED = 55,
RICH_RESPONSE_INLINE_LINKS_ENABLED = 56,
RICH_RESPONSE_UR_IMAGINE_VIDEO = 57,
JSON_PATCH_STREAMING = 58,
AI_TAB_FORCE_CLIPPY = 59,
UNIFIED_RESPONSE_EMBEDDED_SCREENS = 60
JSON_PATCH_STREAMING = 58
}
}
@@ -2803,7 +2801,6 @@ export namespace proto {
isSyncdPureLidSession?: (boolean|null);
isSyncdSnapshotRecoveryEnabled?: (boolean|null);
isHsThumbnailSyncEnabled?: (boolean|null);
subscriptionSyncPayload?: (Uint8Array|null);
}
class ClientPairingProps implements IClientPairingProps {
@@ -2812,7 +2809,6 @@ export namespace proto {
public isSyncdPureLidSession?: (boolean|null);
public isSyncdSnapshotRecoveryEnabled?: (boolean|null);
public isHsThumbnailSyncEnabled?: (boolean|null);
public subscriptionSyncPayload?: (Uint8Array|null);
public static create(properties?: proto.IClientPairingProps): proto.ClientPairingProps;
public static encode(m: proto.IClientPairingProps, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.ClientPairingProps;
@@ -3590,7 +3586,6 @@ export namespace proto {
adType?: (proto.ContextInfo.ExternalAdReplyInfo.AdType|null);
wtwaWebsiteUrl?: (string|null);
adPreviewUrl?: (string|null);
containsCtwaFlowsAutoReply?: (boolean|null);
}
class ExternalAdReplyInfo implements IExternalAdReplyInfo {
@@ -3622,7 +3617,6 @@ export namespace proto {
public adType?: (proto.ContextInfo.ExternalAdReplyInfo.AdType|null);
public wtwaWebsiteUrl?: (string|null);
public adPreviewUrl?: (string|null);
public containsCtwaFlowsAutoReply?: (boolean|null);
public static create(properties?: proto.ContextInfo.IExternalAdReplyInfo): proto.ContextInfo.ExternalAdReplyInfo;
public static encode(m: proto.ContextInfo.IExternalAdReplyInfo, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.ContextInfo.ExternalAdReplyInfo;
@@ -3887,8 +3881,6 @@ export namespace proto {
limitSharingInitiatedByMe?: (boolean|null);
maibaAiThreadEnabled?: (boolean|null);
isMarketingMessageThread?: (boolean|null);
isSenderNewAccount?: (boolean|null);
afterReadDuration?: (number|null);
}
class Conversation implements IConversation {
@@ -3948,8 +3940,6 @@ export namespace proto {
public limitSharingInitiatedByMe?: (boolean|null);
public maibaAiThreadEnabled?: (boolean|null);
public isMarketingMessageThread?: (boolean|null);
public isSenderNewAccount?: (boolean|null);
public afterReadDuration?: (number|null);
public static create(properties?: proto.IConversation): proto.Conversation;
public static encode(m: proto.IConversation, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.Conversation;
@@ -4730,8 +4720,6 @@ export namespace proto {
"static"?: (Uint8Array|null);
payload?: (Uint8Array|null);
extendedCiphertext?: (Uint8Array|null);
paddedBytes?: (Uint8Array|null);
simulateXxkemFs?: (boolean|null);
}
class ClientFinish implements IClientFinish {
@@ -4739,8 +4727,6 @@ export namespace proto {
public static?: (Uint8Array|null);
public payload?: (Uint8Array|null);
public extendedCiphertext?: (Uint8Array|null);
public paddedBytes?: (Uint8Array|null);
public simulateXxkemFs?: (boolean|null);
public static create(properties?: proto.HandshakeMessage.IClientFinish): proto.HandshakeMessage.ClientFinish;
public static encode(m: proto.HandshakeMessage.IClientFinish, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.HandshakeMessage.ClientFinish;
@@ -4756,9 +4742,6 @@ export namespace proto {
payload?: (Uint8Array|null);
useExtended?: (boolean|null);
extendedCiphertext?: (Uint8Array|null);
paddedBytes?: (Uint8Array|null);
sendServerHelloPaddedBytes?: (boolean|null);
simulateXxkemFs?: (boolean|null);
}
class ClientHello implements IClientHello {
@@ -4768,9 +4751,6 @@ export namespace proto {
public payload?: (Uint8Array|null);
public useExtended?: (boolean|null);
public extendedCiphertext?: (Uint8Array|null);
public paddedBytes?: (Uint8Array|null);
public sendServerHelloPaddedBytes?: (boolean|null);
public simulateXxkemFs?: (boolean|null);
public static create(properties?: proto.HandshakeMessage.IClientHello): proto.HandshakeMessage.ClientHello;
public static encode(m: proto.HandshakeMessage.IClientHello, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.HandshakeMessage.ClientHello;
@@ -4785,7 +4765,6 @@ export namespace proto {
"static"?: (Uint8Array|null);
payload?: (Uint8Array|null);
extendedStatic?: (Uint8Array|null);
paddingBytes?: (Uint8Array|null);
}
class ServerHello implements IServerHello {
@@ -4794,7 +4773,6 @@ export namespace proto {
public static?: (Uint8Array|null);
public payload?: (Uint8Array|null);
public extendedStatic?: (Uint8Array|null);
public paddingBytes?: (Uint8Array|null);
public static create(properties?: proto.HandshakeMessage.IServerHello): proto.HandshakeMessage.ServerHello;
public static encode(m: proto.HandshakeMessage.IServerHello, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.HandshakeMessage.ServerHello;
@@ -8076,7 +8054,6 @@ export namespace proto {
expiryTimestamp?: (number|Long|null);
incentiveEligible?: (boolean|null);
referralId?: (string|null);
inviteType?: (proto.Message.PaymentInviteMessage.InviteType|null);
}
class PaymentInviteMessage implements IPaymentInviteMessage {
@@ -8085,7 +8062,6 @@ export namespace proto {
public expiryTimestamp?: (number|Long|null);
public incentiveEligible?: (boolean|null);
public referralId?: (string|null);
public inviteType?: (proto.Message.PaymentInviteMessage.InviteType|null);
public static create(properties?: proto.Message.IPaymentInviteMessage): proto.Message.PaymentInviteMessage;
public static encode(m: proto.Message.IPaymentInviteMessage, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.Message.PaymentInviteMessage;
@@ -8097,11 +8073,6 @@ export namespace proto {
namespace PaymentInviteMessage {
enum InviteType {
DEFAULT = 0,
MAPPER = 1
}
enum ServiceType {
UNKNOWN = 0,
FBPAY = 1,
@@ -9267,8 +9238,7 @@ export namespace proto {
AI_QUERY_FANOUT = 29,
GROUP_MEMBER_LABEL_CHANGE = 30,
AI_MEDIA_COLLECTION_MESSAGE = 31,
MESSAGE_UNSCHEDULE = 32,
BOT_UNLINK_MESSAGE = 33
MESSAGE_UNSCHEDULE = 32
}
}
@@ -10563,7 +10533,6 @@ export namespace proto {
BUSINESS_BROADCAST_INSIGHTS_ACTION = 82,
CUSTOMER_DATA_ACTION = 83,
SUBSCRIPTIONS_SYNC_V2_ACTION = 84,
THREAD_PIN_ACTION = 85,
SHARE_OWN_PN = 10001,
BUSINESS_BROADCAST_ACTION = 10002,
AI_THREAD_DELETE_ACTION = 10003
@@ -11847,8 +11816,7 @@ export namespace proto {
THREADS = 7,
APPLE_MUSIC = 8,
SHARECHAT = 9,
GOOGLE_PHOTOS = 10,
SOUNDCLOUD = 11
GOOGLE_PHOTOS = 10
}
}
@@ -12160,7 +12128,6 @@ export namespace proto {
businessBroadcastInsightsAction?: (proto.SyncActionValue.IBusinessBroadcastInsightsAction|null);
customerDataAction?: (proto.SyncActionValue.ICustomerDataAction|null);
subscriptionsSyncV2Action?: (proto.SyncActionValue.ISubscriptionsSyncV2Action|null);
threadPinAction?: (proto.SyncActionValue.IThreadPinAction|null);
}
class SyncActionValue implements ISyncActionValue {
@@ -12240,7 +12207,6 @@ export namespace proto {
public businessBroadcastInsightsAction?: (proto.SyncActionValue.IBusinessBroadcastInsightsAction|null);
public customerDataAction?: (proto.SyncActionValue.ICustomerDataAction|null);
public subscriptionsSyncV2Action?: (proto.SyncActionValue.ISubscriptionsSyncV2Action|null);
public threadPinAction?: (proto.SyncActionValue.IThreadPinAction|null);
public static create(properties?: proto.ISyncActionValue): proto.SyncActionValue;
public static encode(m: proto.ISyncActionValue, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.SyncActionValue;
@@ -13884,22 +13850,6 @@ export namespace proto {
public static getTypeUrl(typeUrlPrefix?: string): string;
}
interface IThreadPinAction {
pinned?: (boolean|null);
}
class ThreadPinAction implements IThreadPinAction {
constructor(p?: proto.SyncActionValue.IThreadPinAction);
public pinned?: (boolean|null);
public static create(properties?: proto.SyncActionValue.IThreadPinAction): proto.SyncActionValue.ThreadPinAction;
public static encode(m: proto.SyncActionValue.IThreadPinAction, w?: $protobuf.Writer): $protobuf.Writer;
public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): proto.SyncActionValue.ThreadPinAction;
public static fromObject(d: { [k: string]: any }): proto.SyncActionValue.ThreadPinAction;
public static toObject(m: proto.SyncActionValue.ThreadPinAction, o?: $protobuf.IConversionOptions): { [k: string]: any };
public toJSON(): { [k: string]: any };
public static getTypeUrl(typeUrlPrefix?: string): string;
}
interface ITimeFormatAction {
isTwentyFourHourFormatEnabled?: (boolean|null);
}
-395
View File
@@ -6889,14 +6889,6 @@ export const proto = $root.proto = (() => {
case 58:
m.capabilities[i] = 58;
break;
case "AI_TAB_FORCE_CLIPPY":
case 59:
m.capabilities[i] = 59;
break;
case "UNIFIED_RESPONSE_EMBEDDED_SCREENS":
case 60:
m.capabilities[i] = 60;
break;
}
}
}
@@ -6991,8 +6983,6 @@ export const proto = $root.proto = (() => {
values[valuesById[56] = "RICH_RESPONSE_INLINE_LINKS_ENABLED"] = 56;
values[valuesById[57] = "RICH_RESPONSE_UR_IMAGINE_VIDEO"] = 57;
values[valuesById[58] = "JSON_PATCH_STREAMING"] = 58;
values[valuesById[59] = "AI_TAB_FORCE_CLIPPY"] = 59;
values[valuesById[60] = "UNIFIED_RESPONSE_EMBEDDED_SCREENS"] = 60;
return values;
})();
@@ -18038,7 +18028,6 @@ export const proto = $root.proto = (() => {
ClientPairingProps.prototype.isSyncdPureLidSession = null;
ClientPairingProps.prototype.isSyncdSnapshotRecoveryEnabled = null;
ClientPairingProps.prototype.isHsThumbnailSyncEnabled = null;
ClientPairingProps.prototype.subscriptionSyncPayload = null;
let $oneOfFields;
@@ -18066,12 +18055,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ClientPairingProps.prototype, "_subscriptionSyncPayload", {
get: $util.oneOfGetter($oneOfFields = ["subscriptionSyncPayload"]),
set: $util.oneOfSetter($oneOfFields)
});
ClientPairingProps.create = function create(properties) {
return new ClientPairingProps(properties);
};
@@ -18087,8 +18070,6 @@ export const proto = $root.proto = (() => {
w.uint32(24).bool(m.isSyncdSnapshotRecoveryEnabled);
if (m.isHsThumbnailSyncEnabled != null && Object.hasOwnProperty.call(m, "isHsThumbnailSyncEnabled"))
w.uint32(32).bool(m.isHsThumbnailSyncEnabled);
if (m.subscriptionSyncPayload != null && Object.hasOwnProperty.call(m, "subscriptionSyncPayload"))
w.uint32(42).bytes(m.subscriptionSyncPayload);
return w;
};
@@ -18117,10 +18098,6 @@ export const proto = $root.proto = (() => {
m.isHsThumbnailSyncEnabled = r.bool();
break;
}
case 5: {
m.subscriptionSyncPayload = r.bytes();
break;
}
default:
r.skipType(t & 7);
break;
@@ -18145,12 +18122,6 @@ export const proto = $root.proto = (() => {
if (d.isHsThumbnailSyncEnabled != null) {
m.isHsThumbnailSyncEnabled = Boolean(d.isHsThumbnailSyncEnabled);
}
if (d.subscriptionSyncPayload != null) {
if (typeof d.subscriptionSyncPayload === "string")
$util.base64.decode(d.subscriptionSyncPayload, m.subscriptionSyncPayload = $util.newBuffer($util.base64.length(d.subscriptionSyncPayload)), 0);
else if (d.subscriptionSyncPayload.length >= 0)
m.subscriptionSyncPayload = d.subscriptionSyncPayload;
}
return m;
};
@@ -18178,11 +18149,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._isHsThumbnailSyncEnabled = "isHsThumbnailSyncEnabled";
}
if (m.subscriptionSyncPayload != null && m.hasOwnProperty("subscriptionSyncPayload")) {
d.subscriptionSyncPayload = o.bytes === String ? $util.base64.encode(m.subscriptionSyncPayload, 0, m.subscriptionSyncPayload.length) : o.bytes === Array ? Array.prototype.slice.call(m.subscriptionSyncPayload) : m.subscriptionSyncPayload;
if (o.oneofs)
d._subscriptionSyncPayload = "subscriptionSyncPayload";
}
return d;
};
@@ -24000,7 +23966,6 @@ export const proto = $root.proto = (() => {
ExternalAdReplyInfo.prototype.adType = null;
ExternalAdReplyInfo.prototype.wtwaWebsiteUrl = null;
ExternalAdReplyInfo.prototype.adPreviewUrl = null;
ExternalAdReplyInfo.prototype.containsCtwaFlowsAutoReply = null;
let $oneOfFields;
@@ -24166,12 +24131,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ExternalAdReplyInfo.prototype, "_containsCtwaFlowsAutoReply", {
get: $util.oneOfGetter($oneOfFields = ["containsCtwaFlowsAutoReply"]),
set: $util.oneOfSetter($oneOfFields)
});
ExternalAdReplyInfo.create = function create(properties) {
return new ExternalAdReplyInfo(properties);
};
@@ -24233,8 +24192,6 @@ export const proto = $root.proto = (() => {
w.uint32(210).string(m.wtwaWebsiteUrl);
if (m.adPreviewUrl != null && Object.hasOwnProperty.call(m, "adPreviewUrl"))
w.uint32(218).string(m.adPreviewUrl);
if (m.containsCtwaFlowsAutoReply != null && Object.hasOwnProperty.call(m, "containsCtwaFlowsAutoReply"))
w.uint32(224).bool(m.containsCtwaFlowsAutoReply);
return w;
};
@@ -24355,10 +24312,6 @@ export const proto = $root.proto = (() => {
m.adPreviewUrl = r.string();
break;
}
case 28: {
m.containsCtwaFlowsAutoReply = r.bool();
break;
}
default:
r.skipType(t & 7);
break;
@@ -24485,9 +24438,6 @@ export const proto = $root.proto = (() => {
if (d.adPreviewUrl != null) {
m.adPreviewUrl = String(d.adPreviewUrl);
}
if (d.containsCtwaFlowsAutoReply != null) {
m.containsCtwaFlowsAutoReply = Boolean(d.containsCtwaFlowsAutoReply);
}
return m;
};
@@ -24630,11 +24580,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._adPreviewUrl = "adPreviewUrl";
}
if (m.containsCtwaFlowsAutoReply != null && m.hasOwnProperty("containsCtwaFlowsAutoReply")) {
d.containsCtwaFlowsAutoReply = m.containsCtwaFlowsAutoReply;
if (o.oneofs)
d._containsCtwaFlowsAutoReply = "containsCtwaFlowsAutoReply";
}
return d;
};
@@ -25660,8 +25605,6 @@ export const proto = $root.proto = (() => {
Conversation.prototype.limitSharingInitiatedByMe = null;
Conversation.prototype.maibaAiThreadEnabled = null;
Conversation.prototype.isMarketingMessageThread = null;
Conversation.prototype.isSenderNewAccount = null;
Conversation.prototype.afterReadDuration = null;
let $oneOfFields;
@@ -25983,18 +25926,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(Conversation.prototype, "_isSenderNewAccount", {
get: $util.oneOfGetter($oneOfFields = ["isSenderNewAccount"]),
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(Conversation.prototype, "_afterReadDuration", {
get: $util.oneOfGetter($oneOfFields = ["afterReadDuration"]),
set: $util.oneOfSetter($oneOfFields)
});
Conversation.create = function create(properties) {
return new Conversation(properties);
};
@@ -26116,10 +26047,6 @@ export const proto = $root.proto = (() => {
w.uint32(432).bool(m.maibaAiThreadEnabled);
if (m.isMarketingMessageThread != null && Object.hasOwnProperty.call(m, "isMarketingMessageThread"))
w.uint32(440).bool(m.isMarketingMessageThread);
if (m.isSenderNewAccount != null && Object.hasOwnProperty.call(m, "isSenderNewAccount"))
w.uint32(448).bool(m.isSenderNewAccount);
if (m.afterReadDuration != null && Object.hasOwnProperty.call(m, "afterReadDuration"))
w.uint32(456).uint32(m.afterReadDuration);
return w;
};
@@ -26356,14 +26283,6 @@ export const proto = $root.proto = (() => {
m.isMarketingMessageThread = r.bool();
break;
}
case 56: {
m.isSenderNewAccount = r.bool();
break;
}
case 57: {
m.afterReadDuration = r.uint32();
break;
}
default:
r.skipType(t & 7);
break;
@@ -26701,12 +26620,6 @@ export const proto = $root.proto = (() => {
if (d.isMarketingMessageThread != null) {
m.isMarketingMessageThread = Boolean(d.isMarketingMessageThread);
}
if (d.isSenderNewAccount != null) {
m.isSenderNewAccount = Boolean(d.isSenderNewAccount);
}
if (d.afterReadDuration != null) {
m.afterReadDuration = d.afterReadDuration >>> 0;
}
return m;
};
@@ -27019,16 +26932,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._isMarketingMessageThread = "isMarketingMessageThread";
}
if (m.isSenderNewAccount != null && m.hasOwnProperty("isSenderNewAccount")) {
d.isSenderNewAccount = m.isSenderNewAccount;
if (o.oneofs)
d._isSenderNewAccount = "isSenderNewAccount";
}
if (m.afterReadDuration != null && m.hasOwnProperty("afterReadDuration")) {
d.afterReadDuration = m.afterReadDuration;
if (o.oneofs)
d._afterReadDuration = "afterReadDuration";
}
return d;
};
@@ -32396,8 +32299,6 @@ export const proto = $root.proto = (() => {
ClientFinish.prototype["static"] = null;
ClientFinish.prototype.payload = null;
ClientFinish.prototype.extendedCiphertext = null;
ClientFinish.prototype.paddedBytes = null;
ClientFinish.prototype.simulateXxkemFs = null;
let $oneOfFields;
@@ -32419,18 +32320,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ClientFinish.prototype, "_paddedBytes", {
get: $util.oneOfGetter($oneOfFields = ["paddedBytes"]),
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ClientFinish.prototype, "_simulateXxkemFs", {
get: $util.oneOfGetter($oneOfFields = ["simulateXxkemFs"]),
set: $util.oneOfSetter($oneOfFields)
});
ClientFinish.create = function create(properties) {
return new ClientFinish(properties);
};
@@ -32444,10 +32333,6 @@ export const proto = $root.proto = (() => {
w.uint32(18).bytes(m.payload);
if (m.extendedCiphertext != null && Object.hasOwnProperty.call(m, "extendedCiphertext"))
w.uint32(26).bytes(m.extendedCiphertext);
if (m.paddedBytes != null && Object.hasOwnProperty.call(m, "paddedBytes"))
w.uint32(34).bytes(m.paddedBytes);
if (m.simulateXxkemFs != null && Object.hasOwnProperty.call(m, "simulateXxkemFs"))
w.uint32(40).bool(m.simulateXxkemFs);
return w;
};
@@ -32472,14 +32357,6 @@ export const proto = $root.proto = (() => {
m.extendedCiphertext = r.bytes();
break;
}
case 4: {
m.paddedBytes = r.bytes();
break;
}
case 5: {
m.simulateXxkemFs = r.bool();
break;
}
default:
r.skipType(t & 7);
break;
@@ -32510,15 +32387,6 @@ export const proto = $root.proto = (() => {
else if (d.extendedCiphertext.length >= 0)
m.extendedCiphertext = d.extendedCiphertext;
}
if (d.paddedBytes != null) {
if (typeof d.paddedBytes === "string")
$util.base64.decode(d.paddedBytes, m.paddedBytes = $util.newBuffer($util.base64.length(d.paddedBytes)), 0);
else if (d.paddedBytes.length >= 0)
m.paddedBytes = d.paddedBytes;
}
if (d.simulateXxkemFs != null) {
m.simulateXxkemFs = Boolean(d.simulateXxkemFs);
}
return m;
};
@@ -32541,16 +32409,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._extendedCiphertext = "extendedCiphertext";
}
if (m.paddedBytes != null && m.hasOwnProperty("paddedBytes")) {
d.paddedBytes = o.bytes === String ? $util.base64.encode(m.paddedBytes, 0, m.paddedBytes.length) : o.bytes === Array ? Array.prototype.slice.call(m.paddedBytes) : m.paddedBytes;
if (o.oneofs)
d._paddedBytes = "paddedBytes";
}
if (m.simulateXxkemFs != null && m.hasOwnProperty("simulateXxkemFs")) {
d.simulateXxkemFs = m.simulateXxkemFs;
if (o.oneofs)
d._simulateXxkemFs = "simulateXxkemFs";
}
return d;
};
@@ -32582,9 +32440,6 @@ export const proto = $root.proto = (() => {
ClientHello.prototype.payload = null;
ClientHello.prototype.useExtended = null;
ClientHello.prototype.extendedCiphertext = null;
ClientHello.prototype.paddedBytes = null;
ClientHello.prototype.sendServerHelloPaddedBytes = null;
ClientHello.prototype.simulateXxkemFs = null;
let $oneOfFields;
@@ -32618,24 +32473,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ClientHello.prototype, "_paddedBytes", {
get: $util.oneOfGetter($oneOfFields = ["paddedBytes"]),
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ClientHello.prototype, "_sendServerHelloPaddedBytes", {
get: $util.oneOfGetter($oneOfFields = ["sendServerHelloPaddedBytes"]),
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ClientHello.prototype, "_simulateXxkemFs", {
get: $util.oneOfGetter($oneOfFields = ["simulateXxkemFs"]),
set: $util.oneOfSetter($oneOfFields)
});
ClientHello.create = function create(properties) {
return new ClientHello(properties);
};
@@ -32653,12 +32490,6 @@ export const proto = $root.proto = (() => {
w.uint32(32).bool(m.useExtended);
if (m.extendedCiphertext != null && Object.hasOwnProperty.call(m, "extendedCiphertext"))
w.uint32(42).bytes(m.extendedCiphertext);
if (m.paddedBytes != null && Object.hasOwnProperty.call(m, "paddedBytes"))
w.uint32(50).bytes(m.paddedBytes);
if (m.sendServerHelloPaddedBytes != null && Object.hasOwnProperty.call(m, "sendServerHelloPaddedBytes"))
w.uint32(56).bool(m.sendServerHelloPaddedBytes);
if (m.simulateXxkemFs != null && Object.hasOwnProperty.call(m, "simulateXxkemFs"))
w.uint32(64).bool(m.simulateXxkemFs);
return w;
};
@@ -32691,18 +32522,6 @@ export const proto = $root.proto = (() => {
m.extendedCiphertext = r.bytes();
break;
}
case 6: {
m.paddedBytes = r.bytes();
break;
}
case 7: {
m.sendServerHelloPaddedBytes = r.bool();
break;
}
case 8: {
m.simulateXxkemFs = r.bool();
break;
}
default:
r.skipType(t & 7);
break;
@@ -32742,18 +32561,6 @@ export const proto = $root.proto = (() => {
else if (d.extendedCiphertext.length >= 0)
m.extendedCiphertext = d.extendedCiphertext;
}
if (d.paddedBytes != null) {
if (typeof d.paddedBytes === "string")
$util.base64.decode(d.paddedBytes, m.paddedBytes = $util.newBuffer($util.base64.length(d.paddedBytes)), 0);
else if (d.paddedBytes.length >= 0)
m.paddedBytes = d.paddedBytes;
}
if (d.sendServerHelloPaddedBytes != null) {
m.sendServerHelloPaddedBytes = Boolean(d.sendServerHelloPaddedBytes);
}
if (d.simulateXxkemFs != null) {
m.simulateXxkemFs = Boolean(d.simulateXxkemFs);
}
return m;
};
@@ -32786,21 +32593,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._extendedCiphertext = "extendedCiphertext";
}
if (m.paddedBytes != null && m.hasOwnProperty("paddedBytes")) {
d.paddedBytes = o.bytes === String ? $util.base64.encode(m.paddedBytes, 0, m.paddedBytes.length) : o.bytes === Array ? Array.prototype.slice.call(m.paddedBytes) : m.paddedBytes;
if (o.oneofs)
d._paddedBytes = "paddedBytes";
}
if (m.sendServerHelloPaddedBytes != null && m.hasOwnProperty("sendServerHelloPaddedBytes")) {
d.sendServerHelloPaddedBytes = m.sendServerHelloPaddedBytes;
if (o.oneofs)
d._sendServerHelloPaddedBytes = "sendServerHelloPaddedBytes";
}
if (m.simulateXxkemFs != null && m.hasOwnProperty("simulateXxkemFs")) {
d.simulateXxkemFs = m.simulateXxkemFs;
if (o.oneofs)
d._simulateXxkemFs = "simulateXxkemFs";
}
return d;
};
@@ -32831,7 +32623,6 @@ export const proto = $root.proto = (() => {
ServerHello.prototype["static"] = null;
ServerHello.prototype.payload = null;
ServerHello.prototype.extendedStatic = null;
ServerHello.prototype.paddingBytes = null;
let $oneOfFields;
@@ -32859,12 +32650,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(ServerHello.prototype, "_paddingBytes", {
get: $util.oneOfGetter($oneOfFields = ["paddingBytes"]),
set: $util.oneOfSetter($oneOfFields)
});
ServerHello.create = function create(properties) {
return new ServerHello(properties);
};
@@ -32880,8 +32665,6 @@ export const proto = $root.proto = (() => {
w.uint32(26).bytes(m.payload);
if (m.extendedStatic != null && Object.hasOwnProperty.call(m, "extendedStatic"))
w.uint32(34).bytes(m.extendedStatic);
if (m.paddingBytes != null && Object.hasOwnProperty.call(m, "paddingBytes"))
w.uint32(42).bytes(m.paddingBytes);
return w;
};
@@ -32910,10 +32693,6 @@ export const proto = $root.proto = (() => {
m.extendedStatic = r.bytes();
break;
}
case 5: {
m.paddingBytes = r.bytes();
break;
}
default:
r.skipType(t & 7);
break;
@@ -32950,12 +32729,6 @@ export const proto = $root.proto = (() => {
else if (d.extendedStatic.length >= 0)
m.extendedStatic = d.extendedStatic;
}
if (d.paddingBytes != null) {
if (typeof d.paddingBytes === "string")
$util.base64.decode(d.paddingBytes, m.paddingBytes = $util.newBuffer($util.base64.length(d.paddingBytes)), 0);
else if (d.paddingBytes.length >= 0)
m.paddingBytes = d.paddingBytes;
}
return m;
};
@@ -32983,11 +32756,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._extendedStatic = "extendedStatic";
}
if (m.paddingBytes != null && m.hasOwnProperty("paddingBytes")) {
d.paddingBytes = o.bytes === String ? $util.base64.encode(m.paddingBytes, 0, m.paddingBytes.length) : o.bytes === Array ? Array.prototype.slice.call(m.paddingBytes) : m.paddingBytes;
if (o.oneofs)
d._paddingBytes = "paddingBytes";
}
return d;
};
@@ -56759,7 +56527,6 @@ export const proto = $root.proto = (() => {
PaymentInviteMessage.prototype.expiryTimestamp = null;
PaymentInviteMessage.prototype.incentiveEligible = null;
PaymentInviteMessage.prototype.referralId = null;
PaymentInviteMessage.prototype.inviteType = null;
let $oneOfFields;
@@ -56787,12 +56554,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(PaymentInviteMessage.prototype, "_inviteType", {
get: $util.oneOfGetter($oneOfFields = ["inviteType"]),
set: $util.oneOfSetter($oneOfFields)
});
PaymentInviteMessage.create = function create(properties) {
return new PaymentInviteMessage(properties);
};
@@ -56808,8 +56569,6 @@ export const proto = $root.proto = (() => {
w.uint32(24).bool(m.incentiveEligible);
if (m.referralId != null && Object.hasOwnProperty.call(m, "referralId"))
w.uint32(34).string(m.referralId);
if (m.inviteType != null && Object.hasOwnProperty.call(m, "inviteType"))
w.uint32(40).int32(m.inviteType);
return w;
};
@@ -56838,10 +56597,6 @@ export const proto = $root.proto = (() => {
m.referralId = r.string();
break;
}
case 5: {
m.inviteType = r.int32();
break;
}
default:
r.skipType(t & 7);
break;
@@ -56894,22 +56649,6 @@ export const proto = $root.proto = (() => {
if (d.referralId != null) {
m.referralId = String(d.referralId);
}
switch (d.inviteType) {
default:
if (typeof d.inviteType === "number") {
m.inviteType = d.inviteType;
break;
}
break;
case "DEFAULT":
case 0:
m.inviteType = 0;
break;
case "MAPPER":
case 1:
m.inviteType = 1;
break;
}
return m;
};
@@ -56940,11 +56679,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._referralId = "referralId";
}
if (m.inviteType != null && m.hasOwnProperty("inviteType")) {
d.inviteType = o.enums === String ? $root.proto.Message.PaymentInviteMessage.InviteType[m.inviteType] === undefined ? m.inviteType : $root.proto.Message.PaymentInviteMessage.InviteType[m.inviteType] : m.inviteType;
if (o.oneofs)
d._inviteType = "inviteType";
}
return d;
};
@@ -56959,13 +56693,6 @@ export const proto = $root.proto = (() => {
return typeUrlPrefix + "/proto.Message.PaymentInviteMessage";
};
PaymentInviteMessage.InviteType = (function() {
const valuesById = {}, values = Object.create(valuesById);
values[valuesById[0] = "DEFAULT"] = 0;
values[valuesById[1] = "MAPPER"] = 1;
return values;
})();
PaymentInviteMessage.ServiceType = (function() {
const valuesById = {}, values = Object.create(valuesById);
values[valuesById[0] = "UNKNOWN"] = 0;
@@ -64738,10 +64465,6 @@ export const proto = $root.proto = (() => {
case 32:
m.type = 32;
break;
case "BOT_UNLINK_MESSAGE":
case 33:
m.type = 33;
break;
}
if (d.ephemeralExpiration != null) {
m.ephemeralExpiration = d.ephemeralExpiration >>> 0;
@@ -65055,7 +64778,6 @@ export const proto = $root.proto = (() => {
values[valuesById[30] = "GROUP_MEMBER_LABEL_CHANGE"] = 30;
values[valuesById[31] = "AI_MEDIA_COLLECTION_MESSAGE"] = 31;
values[valuesById[32] = "MESSAGE_UNSCHEDULE"] = 32;
values[valuesById[33] = "BOT_UNLINK_MESSAGE"] = 33;
return values;
})();
@@ -74165,7 +73887,6 @@ export const proto = $root.proto = (() => {
values[valuesById[82] = "BUSINESS_BROADCAST_INSIGHTS_ACTION"] = 82;
values[valuesById[83] = "CUSTOMER_DATA_ACTION"] = 83;
values[valuesById[84] = "SUBSCRIPTIONS_SYNC_V2_ACTION"] = 84;
values[valuesById[85] = "THREAD_PIN_ACTION"] = 85;
values[valuesById[10001] = "SHARE_OWN_PN"] = 10001;
values[valuesById[10002] = "BUSINESS_BROADCAST_ACTION"] = 10002;
values[valuesById[10003] = "AI_THREAD_DELETE_ACTION"] = 10003;
@@ -82781,10 +82502,6 @@ export const proto = $root.proto = (() => {
case 10:
m.source = 10;
break;
case "SOUNDCLOUD":
case 11:
m.source = 11;
break;
}
if (d.duration != null) {
m.duration = d.duration | 0;
@@ -82846,7 +82563,6 @@ export const proto = $root.proto = (() => {
values[valuesById[8] = "APPLE_MUSIC"] = 8;
values[valuesById[9] = "SHARECHAT"] = 9;
values[valuesById[10] = "GOOGLE_PHOTOS"] = 10;
values[valuesById[11] = "SOUNDCLOUD"] = 11;
return values;
})();
@@ -84420,7 +84136,6 @@ export const proto = $root.proto = (() => {
SyncActionValue.prototype.businessBroadcastInsightsAction = null;
SyncActionValue.prototype.customerDataAction = null;
SyncActionValue.prototype.subscriptionsSyncV2Action = null;
SyncActionValue.prototype.threadPinAction = null;
let $oneOfFields;
@@ -84874,12 +84589,6 @@ export const proto = $root.proto = (() => {
set: $util.oneOfSetter($oneOfFields)
});
// Virtual OneOf for proto3 optional field
Object.defineProperty(SyncActionValue.prototype, "_threadPinAction", {
get: $util.oneOfGetter($oneOfFields = ["threadPinAction"]),
set: $util.oneOfSetter($oneOfFields)
});
SyncActionValue.create = function create(properties) {
return new SyncActionValue(properties);
};
@@ -85037,8 +84746,6 @@ export const proto = $root.proto = (() => {
$root.proto.SyncActionValue.CustomerDataAction.encode(m.customerDataAction, w.uint32(666).fork()).ldelim();
if (m.subscriptionsSyncV2Action != null && Object.hasOwnProperty.call(m, "subscriptionsSyncV2Action"))
$root.proto.SyncActionValue.SubscriptionsSyncV2Action.encode(m.subscriptionsSyncV2Action, w.uint32(674).fork()).ldelim();
if (m.threadPinAction != null && Object.hasOwnProperty.call(m, "threadPinAction"))
$root.proto.SyncActionValue.ThreadPinAction.encode(m.threadPinAction, w.uint32(682).fork()).ldelim();
return w;
};
@@ -85351,10 +85058,6 @@ export const proto = $root.proto = (() => {
m.subscriptionsSyncV2Action = $root.proto.SyncActionValue.SubscriptionsSyncV2Action.decode(r, r.uint32());
break;
}
case 85: {
m.threadPinAction = $root.proto.SyncActionValue.ThreadPinAction.decode(r, r.uint32());
break;
}
default:
r.skipType(t & 7);
break;
@@ -85747,11 +85450,6 @@ export const proto = $root.proto = (() => {
throw TypeError(".proto.SyncActionValue.subscriptionsSyncV2Action: object expected");
m.subscriptionsSyncV2Action = $root.proto.SyncActionValue.SubscriptionsSyncV2Action.fromObject(d.subscriptionsSyncV2Action);
}
if (d.threadPinAction != null) {
if (typeof d.threadPinAction !== "object")
throw TypeError(".proto.SyncActionValue.threadPinAction: object expected");
m.threadPinAction = $root.proto.SyncActionValue.ThreadPinAction.fromObject(d.threadPinAction);
}
return m;
};
@@ -86137,11 +85835,6 @@ export const proto = $root.proto = (() => {
if (o.oneofs)
d._subscriptionsSyncV2Action = "subscriptionsSyncV2Action";
}
if (m.threadPinAction != null && m.hasOwnProperty("threadPinAction")) {
d.threadPinAction = $root.proto.SyncActionValue.ThreadPinAction.toObject(m.threadPinAction, o);
if (o.oneofs)
d._threadPinAction = "threadPinAction";
}
return d;
};
@@ -96387,94 +96080,6 @@ export const proto = $root.proto = (() => {
return SyncActionMessageRange;
})();
SyncActionValue.ThreadPinAction = (function() {
function ThreadPinAction(p) {
if (p)
for (var ks = Object.keys(p), i = 0; i < ks.length; ++i)
if (p[ks[i]] != null)
this[ks[i]] = p[ks[i]];
}
ThreadPinAction.prototype.pinned = null;
let $oneOfFields;
// Virtual OneOf for proto3 optional field
Object.defineProperty(ThreadPinAction.prototype, "_pinned", {
get: $util.oneOfGetter($oneOfFields = ["pinned"]),
set: $util.oneOfSetter($oneOfFields)
});
ThreadPinAction.create = function create(properties) {
return new ThreadPinAction(properties);
};
ThreadPinAction.encode = function encode(m, w) {
if (!w)
w = $Writer.create();
if (m.pinned != null && Object.hasOwnProperty.call(m, "pinned"))
w.uint32(8).bool(m.pinned);
return w;
};
ThreadPinAction.decode = function decode(r, l, e) {
if (!(r instanceof $Reader))
r = $Reader.create(r);
var c = l === undefined ? r.len : r.pos + l, m = new $root.proto.SyncActionValue.ThreadPinAction();
while (r.pos < c) {
var t = r.uint32();
if (t === e)
break;
switch (t >>> 3) {
case 1: {
m.pinned = r.bool();
break;
}
default:
r.skipType(t & 7);
break;
}
}
return m;
};
ThreadPinAction.fromObject = function fromObject(d) {
if (d instanceof $root.proto.SyncActionValue.ThreadPinAction)
return d;
var m = new $root.proto.SyncActionValue.ThreadPinAction();
if (d.pinned != null) {
m.pinned = Boolean(d.pinned);
}
return m;
};
ThreadPinAction.toObject = function toObject(m, o) {
if (!o)
o = {};
var d = {};
if (m.pinned != null && m.hasOwnProperty("pinned")) {
d.pinned = m.pinned;
if (o.oneofs)
d._pinned = "pinned";
}
return d;
};
ThreadPinAction.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
ThreadPinAction.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/proto.SyncActionValue.ThreadPinAction";
};
return ThreadPinAction;
})();
SyncActionValue.TimeFormatAction = (function() {
function TimeFormatAction(p) {
+1 -1
View File
@@ -1 +1 @@
{"version":[2,3000,1035223526]}
{"version":[2,3000,1035018135]}
+2 -195
View File
@@ -1,4 +1,3 @@
import { randomBytes } from 'crypto'
import NodeCache from '@cacheable/node-cache'
import { Boom } from '@hapi/boom'
import { proto } from '../../WAProto/index.js'
@@ -46,7 +45,6 @@ import {
getBinaryNodeChildren,
isHostedLidUser,
isHostedPnUser,
isJidBot,
isJidGroup,
isLidUser,
isPnUser,
@@ -68,8 +66,7 @@ export const makeMessagesSocket = (config: SocketConfig) => {
patchMessageBeforeSending,
cachedGroupMetadata,
enableRecentMessageCache,
maxMsgRetryCount,
enableInteractiveMessages
maxMsgRetryCount
} = config
const sock = makeNewsletterSocket(config)
const {
@@ -603,85 +600,6 @@ export const makeMessagesSocket = (config: SocketConfig) => {
return { nodes, shouldIncludeDeviceIdentity }
}
/** Detect interactive/button message type for biz node injection */
const getButtonType = (message: proto.IMessage): string | undefined => {
if (message.buttonsMessage) return 'buttons'
if (message.templateMessage) return 'template'
if (message.listMessage) return 'list'
if (message.buttonsResponseMessage) return 'buttons_response'
if (message.listResponseMessage) return 'list_response'
if (message.templateButtonReplyMessage) return 'template_reply'
if (message.interactiveMessage) {
if (message.interactiveMessage.nativeFlowMessage) return 'native_flow'
if (message.interactiveMessage.carouselMessage?.cards?.length) {
const hasNativeFlow = message.interactiveMessage.carouselMessage.cards.some(
(card: proto.Message.IInteractiveMessage) => card?.nativeFlowMessage?.buttons?.length
)
if (hasNativeFlow) return 'native_flow'
}
return 'interactive'
}
const innerMessage = message.viewOnceMessage?.message || message.viewOnceMessageV2?.message
if (innerMessage) {
if (innerMessage.buttonsMessage) return 'buttons'
if (innerMessage.templateMessage) return 'template'
if (innerMessage.listMessage) return 'list'
if (innerMessage.buttonsResponseMessage) return 'buttons_response'
if (innerMessage.listResponseMessage) return 'list_response'
if (innerMessage.templateButtonReplyMessage) return 'template_reply'
if (innerMessage.interactiveMessage) {
if (innerMessage.interactiveMessage.nativeFlowMessage) return 'native_flow'
if (innerMessage.interactiveMessage.carouselMessage?.cards?.length) {
const hasNativeFlow = innerMessage.interactiveMessage.carouselMessage.cards.some(
(card: any) => card?.nativeFlowMessage?.buttons?.length
)
if (hasNativeFlow) return 'native_flow'
}
return 'interactive'
}
}
return undefined
}
/** Check if message is a carousel (media or product carousel) */
const isCarouselMessage = (message: proto.IMessage): boolean => {
const interactiveMsg =
message.interactiveMessage ||
message.viewOnceMessage?.message?.interactiveMessage ||
message.viewOnceMessageV2?.message?.interactiveMessage
return !!(interactiveMsg?.carouselMessage?.cards?.length)
}
/** Check if message is a catalog/product message */
const isCatalogMessage = (message: proto.IMessage): boolean => {
const interactiveMsg =
message.interactiveMessage ||
message.viewOnceMessage?.message?.interactiveMessage ||
message.viewOnceMessageV2?.message?.interactiveMessage
const nativeFlow = interactiveMsg?.nativeFlowMessage
if (nativeFlow?.buttons?.length) {
return nativeFlow.buttons.some(
(btn: any) => btn?.name === 'catalog_message' || btn?.name === 'single_product' || btn?.name === 'product_list'
)
}
return false
}
/** Check if nativeFlowMessage is a list (single_select button) */
const isListNativeFlow = (message: proto.IMessage): boolean => {
const interactiveMsg =
message.interactiveMessage ||
message.viewOnceMessage?.message?.interactiveMessage ||
message.viewOnceMessageV2?.message?.interactiveMessage
const nativeFlow = interactiveMsg?.nativeFlowMessage
if (nativeFlow?.buttons?.length) {
return nativeFlow.buttons.some((btn: any) => btn?.name === 'single_select' || btn?.name === 'multi_select')
}
return false
}
const relayMessage = async (
jid: string,
message: proto.IMessage,
@@ -1044,110 +962,6 @@ export const makeMessagesSocket = (config: SocketConfig) => {
content: binaryNodeContent
}
// Detect interactive message type for biz node injection
const buttonType = getButtonType(message)
const isCatalog = isCatalogMessage(message)
const isCarousel = isCarouselMessage(message)
// Collect biz/bot nodes to append AFTER device-identity and tctoken
// Stanza order: participants → device-identity → tctoken → biz
// Carousel messages must NOT have biz node (breaks WhatsApp Web rendering)
const deferredNodes: BinaryNode[] = []
if (buttonType && enableInteractiveMessages && !isCarousel) {
const interactiveMsg =
message.interactiveMessage ||
message.viewOnceMessage?.message?.interactiveMessage ||
message.viewOnceMessageV2?.message?.interactiveMessage
let nativeFlowButtons = interactiveMsg?.nativeFlowMessage?.buttons || []
if (nativeFlowButtons.length === 0 && interactiveMsg?.carouselMessage?.cards?.length) {
nativeFlowButtons = interactiveMsg.carouselMessage.cards.flatMap(
(card: proto.Message.IInteractiveMessage) => card?.nativeFlowMessage?.buttons || []
)
}
const isListDetected = isListNativeFlow(message)
logger.info(
{ msgId, buttonType, to: destinationJid, isListDetected, isCatalog },
'[Interactive] Preparing biz node'
)
try {
const allButtonNames = nativeFlowButtons.map((b: any) => b?.name).filter(Boolean)
const isNativeFlowButtons = buttonType === 'native_flow'
if (buttonType === 'list') {
deferredNodes.push({
tag: 'biz',
attrs: {},
content: [
{ tag: 'list', attrs: { type: 'product_list', v: '2' } }
]
})
} else {
const SPECIAL_FLOW_NAMES: Record<string, string> = {
review_and_pay: 'payment_info',
payment_info: 'payment_info',
mpm: 'mpm',
review_order: 'order_details'
}
const firstButtonName = allButtonNames[0] || ''
const nativeFlowName = SPECIAL_FLOW_NAMES[firstButtonName] || 'mixed'
deferredNodes.push({
tag: 'biz',
attrs: {},
content: [
{
tag: 'interactive',
attrs: { type: 'native_flow', v: '1' },
content: [
{ tag: 'native_flow', attrs: { v: '9', name: nativeFlowName } }
]
}
]
})
}
// Bot node — skip for native_flow, carousel, catalog
const isPrivateUserChat =
(isPnUser(destinationJid) || isLidUser(destinationJid) || destinationJid?.endsWith('@c.us')) &&
!isJidBot(destinationJid)
if (isPrivateUserChat && !isCatalog && buttonType !== 'list' && !isNativeFlowButtons) {
deferredNodes.push({ tag: 'bot', attrs: { biz_bot: '1' } })
}
} catch (error) {
logger.error({ error, msgId, buttonType }, '[BIZ NODE] Failed to inject biz node')
}
} else if (isCarousel && enableInteractiveMessages) {
// Carousel: inject quality_control with decision_id (required by WhatsApp Web)
const decisionId = randomBytes(20).toString('hex')
deferredNodes.push({
tag: 'biz',
attrs: {},
content: [
{
tag: 'interactive',
attrs: { type: 'native_flow', v: '1' },
content: [
{ tag: 'native_flow', attrs: { v: '9', name: 'mixed' } }
]
}
]
})
deferredNodes.push({
tag: 'quality_control',
attrs: { decision_id: decisionId },
content: [
{ tag: 'decision_source', attrs: { value: 'df' } }
]
})
logger.info({ msgId, to: destinationJid, decisionId }, '[CAROUSEL] Injected biz + quality_control')
}
// if the participant to send to is explicitly specified (generally retry recp)
// ensure the message is only sent to that person
// if a retry receipt is sent to everyone -- it'll fail decryption for everyone else who received the msg
@@ -1165,8 +979,7 @@ export const makeMessagesSocket = (config: SocketConfig) => {
stanza.attrs.to = destinationJid
}
// Force device-identity for carousel (ensures Web can decrypt)
if (shouldIncludeDeviceIdentity || isCarousel) {
if (shouldIncludeDeviceIdentity) {
;(stanza.content as BinaryNode[]).push({
tag: 'device-identity',
attrs: {},
@@ -1217,12 +1030,6 @@ export const makeMessagesSocket = (config: SocketConfig) => {
;(stanza.content as BinaryNode[]).push(...additionalNodes)
}
// Append deferred biz/bot/quality_control nodes LAST
// Stanza order: participants → device-identity → tctoken → biz → quality_control
if (deferredNodes.length > 0) {
;(stanza.content as BinaryNode[]).push(...deferredNodes)
}
logger.debug({ msgId }, `sending message to ${participants.length} devices`)
await sendNode(stanza)
+12 -18
View File
@@ -154,24 +154,18 @@ export async function storeTcTokensFromIqResult({
continue
}
const tokenEntry = {
...existingEntry,
token: Buffer.from(tokenNode.content),
timestamp: tokenNode.attrs.t,
// Resets real_issue_timestamp to null when storing a new token
realIssueTimestamp: null
}
// Store under resolved storageJid AND under fallbackJid (PN) for reliable lookup
const normalizedFallback = jidNormalizedUser(fallbackJid)
const keysToStore: Record<string, typeof tokenEntry | null> = {
[storageJid]: tokenEntry
}
if (normalizedFallback !== storageJid) {
keysToStore[normalizedFallback] = tokenEntry
}
await keys.set({ tctoken: keysToStore })
await keys.set({
tctoken: {
[storageJid]: {
...existingEntry,
token: Buffer.from(tokenNode.content),
timestamp: tokenNode.attrs.t,
// WABA Android: resets real_issue_timestamp to null when storing a new token
// (UPDATE wa_trusted_contacts_send SET real_issue_timestamp=null)
realIssueTimestamp: null
}
}
})
onNewJidStored?.(storageJid)
}
}