hridoy-ultimate 8.0.2 → 9.0.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.
Files changed (281) hide show
  1. package/CHANGELOG.md +68 -40
  2. package/LICENSE +23 -0
  3. package/MERGE_REPORT.md +54 -0
  4. package/README.md +158 -113
  5. package/THIRD_PARTY_NOTICES.md +36 -0
  6. package/docs/TEST_RESULTS.md +68 -0
  7. package/docs/UPSTREAM_API_DOCS.md +2712 -0
  8. package/func/checkUpdate.js +6 -0
  9. package/func/logAdapter.js +33 -0
  10. package/func/logger.js +48 -0
  11. package/index.d.ts +812 -0
  12. package/index.js +30 -824
  13. package/module/config.js +46 -0
  14. package/module/login.js +136 -0
  15. package/module/loginHelper.js +1413 -0
  16. package/module/options.js +55 -0
  17. package/package.json +75 -22
  18. package/scripts/run-tests.js +19 -0
  19. package/scripts/syntax-check.js +22 -0
  20. package/src/{addExternalModule.js → api/action/addExternalModule.js} +8 -8
  21. package/src/{changeAvatar.js → api/action/changeAvatar.js} +32 -33
  22. package/src/{changeBio.js → api/action/changeBio.js} +19 -22
  23. package/src/api/action/dismissScrapingWarning.js +50 -0
  24. package/src/api/action/enableAutoSaveAppState.js +73 -0
  25. package/src/{getCurrentUserID.js → api/action/getCurrentUserID.js} +1 -1
  26. package/src/api/action/handleFriendRequest.js +57 -0
  27. package/src/api/action/logout.js +95 -0
  28. package/src/api/action/refreshFb_dtsg.js +47 -0
  29. package/src/{setPostReaction.js → api/action/setPostReaction.js} +23 -31
  30. package/src/{unfriend.js → api/action/unfriend.js} +14 -14
  31. package/src/api/http/httpGet.js +46 -0
  32. package/src/api/http/httpPost.js +52 -0
  33. package/src/api/http/postFormData.js +47 -0
  34. package/src/api/messaging/addUserToGroup.js +68 -0
  35. package/src/api/messaging/changeAdminStatus.js +126 -0
  36. package/src/{changeArchivedStatus.js → api/messaging/changeArchivedStatus.js} +15 -17
  37. package/src/{changeBlockedStatus.js → api/messaging/changeBlockedStatus.js} +13 -16
  38. package/src/api/messaging/changeGroupImage.js +91 -0
  39. package/src/api/messaging/changeNickname.js +70 -0
  40. package/src/api/messaging/changeThreadColor.js +79 -0
  41. package/src/api/messaging/changeThreadEmoji.js +111 -0
  42. package/src/{createNewGroup.js → api/messaging/createNewGroup.js} +24 -26
  43. package/src/api/messaging/createPoll.js +46 -0
  44. package/src/api/messaging/createThemeAI.js +98 -0
  45. package/src/api/messaging/deleteMessage.js +136 -0
  46. package/src/{deleteThread.js → api/messaging/deleteThread.js} +14 -16
  47. package/src/api/messaging/editMessage.js +105 -0
  48. package/src/api/messaging/forwardAttachment.js +57 -0
  49. package/src/api/messaging/forwardMessage.js +134 -0
  50. package/src/{getEmojiUrl.js → api/messaging/getEmojiUrl.js} +2 -2
  51. package/src/{getFriendsList.js → api/messaging/getFriendsList.js} +16 -19
  52. package/src/{getMessage.js → api/messaging/getMessage.js} +160 -180
  53. package/src/api/messaging/getThemePictures.js +62 -0
  54. package/src/api/messaging/handleMessageRequest.js +65 -0
  55. package/src/api/messaging/markAsDelivered.js +69 -0
  56. package/src/api/messaging/markAsRead.js +110 -0
  57. package/src/api/messaging/markAsReadAll.js +56 -0
  58. package/src/api/messaging/markAsSeen.js +68 -0
  59. package/src/api/messaging/muteThread.js +50 -0
  60. package/src/api/messaging/pinMessage.js +115 -0
  61. package/src/api/messaging/removeUserFromGroup.js +62 -0
  62. package/src/{resolvePhotoUrl.js → api/messaging/resolvePhotoUrl.js} +11 -15
  63. package/src/api/messaging/scheduler.js +264 -0
  64. package/src/{searchForThread.js → api/messaging/searchForThread.js} +12 -12
  65. package/src/api/messaging/sendBroadcast.js +93 -0
  66. package/src/api/messaging/sendMessage.js +269 -0
  67. package/src/api/messaging/sendTypingIndicator.js +90 -0
  68. package/src/api/messaging/sessionGuard.js +130 -0
  69. package/src/api/messaging/setMessageReaction.js +114 -0
  70. package/src/api/messaging/setTitle.js +124 -0
  71. package/src/api/messaging/shareContact.js +98 -0
  72. package/src/{threadColors.js → api/messaging/threadColors.js} +2 -5
  73. package/src/api/messaging/unsendMessage.js +105 -0
  74. package/src/api/messaging/uploadAttachment.js +493 -0
  75. package/src/api/socket/OldMessage.js +199 -0
  76. package/src/api/socket/core/connectMqtt.js +304 -0
  77. package/src/api/socket/core/emitAuth.js +95 -0
  78. package/src/api/socket/core/getSeqID.js +331 -0
  79. package/src/api/socket/core/getTaskResponseData.js +25 -0
  80. package/src/api/socket/core/lifecycle.js +117 -0
  81. package/src/api/socket/core/parseDelta.js +387 -0
  82. package/src/api/socket/detail/buildStream.js +215 -0
  83. package/src/api/socket/detail/constants.js +28 -0
  84. package/src/api/socket/e2ee/crypto.js +173 -0
  85. package/src/api/socket/e2ee/index.js +977 -0
  86. package/src/api/socket/e2ee/localMediaServer.js +59 -0
  87. package/src/api/socket/e2ee/mediaDecode.js +155 -0
  88. package/src/api/socket/e2ee/native/NOTICE.md +29 -0
  89. package/{lib → src/api/socket/e2ee/native/lib}/index.mjs +109 -66
  90. package/src/api/socket/e2ee/native/nativeMediaBridge.js +273 -0
  91. package/src/api/socket/e2ee/proto/ArmadilloApplication.proto +281 -0
  92. package/src/api/socket/e2ee/proto/ArmadilloICDC.proto +14 -0
  93. package/src/api/socket/e2ee/proto/ConsumerApplication.proto +232 -0
  94. package/src/api/socket/e2ee/proto/MessageApplication.proto +82 -0
  95. package/src/api/socket/e2ee/proto/MessageTransport.proto +77 -0
  96. package/src/api/socket/e2ee/proto/WACommon.proto +66 -0
  97. package/src/api/socket/e2ee/proto/WAMediaTransport.proto +176 -0
  98. package/src/api/socket/e2ee/proto/proto-writer.ts +76 -0
  99. package/src/api/socket/e2ee/protocol.js +196 -0
  100. package/src/api/socket/e2ee/ratchet.js +219 -0
  101. package/src/api/socket/e2ee/store.js +182 -0
  102. package/src/api/socket/e2ee/vendor/fme/dist/index.cjs +6477 -0
  103. package/src/api/socket/e2ee/vendor/fme/proto/ArmadilloApplication.proto +281 -0
  104. package/src/api/socket/e2ee/vendor/fme/proto/ArmadilloICDC.proto +14 -0
  105. package/src/api/socket/e2ee/vendor/fme/proto/ConsumerApplication.proto +232 -0
  106. package/src/api/socket/e2ee/vendor/fme/proto/MessageApplication.proto +82 -0
  107. package/src/api/socket/e2ee/vendor/fme/proto/MessageTransport.proto +77 -0
  108. package/src/api/socket/e2ee/vendor/fme/proto/WACommon.proto +66 -0
  109. package/src/api/socket/e2ee/vendor/fme/proto/WAMediaTransport.proto +176 -0
  110. package/src/api/socket/listenE2EE.js +87 -0
  111. package/src/api/socket/listenMqtt.js +499 -0
  112. package/src/api/socket/middleware/index.js +216 -0
  113. package/src/api/socket/sendMessage.js +331 -0
  114. package/src/api/socket/sendMessageMqtt.js +69 -0
  115. package/src/{getThreadHistory.js → api/threads/getThreadHistory.js} +114 -132
  116. package/src/api/threads/getThreadInfo.js +329 -0
  117. package/src/api/threads/getThreadList.js +293 -0
  118. package/src/api/threads/getThreadPictures.js +78 -0
  119. package/src/{getUserID.js → api/users/getUserID.js} +22 -18
  120. package/src/api/users/getUserInfo.js +402 -0
  121. package/src/api/users/getUserInfoV2.js +134 -0
  122. package/src/app/MessengerBot.js +209 -0
  123. package/src/app/MessengerContext.js +32 -0
  124. package/src/app/createFcaClient.js +136 -0
  125. package/src/app/threadInfoRealtimeSync.js +284 -0
  126. package/src/core/sendReqMqtt.js +96 -0
  127. package/src/database/helpers.js +53 -0
  128. package/src/database/models/index.js +88 -0
  129. package/src/database/models/thread.js +50 -0
  130. package/src/database/models/user.js +46 -0
  131. package/src/database/threadData.js +94 -0
  132. package/src/database/userData.js +98 -0
  133. package/src/remote/remoteClient.js +123 -0
  134. package/src/utils/antiSuspension.js +219 -0
  135. package/src/utils/broadcast.js +51 -0
  136. package/src/utils/client.js +10 -0
  137. package/src/utils/constants.js +23 -0
  138. package/src/utils/cookies.js +85 -0
  139. package/src/utils/fingerprint.js +110 -0
  140. package/src/utils/format/attachment.js +357 -0
  141. package/src/utils/format/cookie.js +9 -0
  142. package/src/utils/format/date.js +50 -0
  143. package/src/utils/format/decode.js +44 -0
  144. package/src/utils/format/delta.js +195 -0
  145. package/src/utils/format/ids.js +64 -0
  146. package/src/utils/format/index.js +64 -0
  147. package/src/utils/format/message.js +88 -0
  148. package/src/utils/format/presence.js +132 -0
  149. package/src/utils/format/readTyp.js +44 -0
  150. package/src/utils/format/thread.js +42 -0
  151. package/src/utils/format/utils.js +141 -0
  152. package/src/utils/headers.js +125 -0
  153. package/src/utils/humanizer.js +256 -0
  154. package/src/utils/loginParser/autoLogin.js +125 -0
  155. package/src/utils/loginParser/extractDtsg.js +44 -0
  156. package/src/utils/loginParser/helpers.js +43 -0
  157. package/src/utils/loginParser/index.js +10 -0
  158. package/src/utils/loginParser/parseAndCheckLogin.js +241 -0
  159. package/src/utils/loginParser/textUtils.js +28 -0
  160. package/src/utils/nexca-logger.js +144 -0
  161. package/src/utils/nexca-utils.js +687 -0
  162. package/src/utils/request/client.js +26 -0
  163. package/src/utils/request/config.js +23 -0
  164. package/src/utils/request/defaults.js +46 -0
  165. package/src/utils/request/helpers.js +46 -0
  166. package/src/utils/request/index.js +17 -0
  167. package/src/utils/request/methods.js +163 -0
  168. package/src/utils/request/proxy.js +21 -0
  169. package/src/utils/request/retry.js +77 -0
  170. package/src/utils/request/sanitize.js +49 -0
  171. package/src/utils/typingIndicator.js +202 -0
  172. package/test/helpers/stub-modules.js +122 -0
  173. package/test/integration/logout.test.js +69 -0
  174. package/test/integration/mqtt-lifecycle.test.js +195 -0
  175. package/test/integration/package.test.js +116 -0
  176. package/test/integration/typing-wiring.test.js +71 -0
  177. package/test/unit/fingerprint.test.js +19 -0
  178. package/test/unit/humanizer.test.js +32 -0
  179. package/test/unit/lifecycle.test.js +92 -0
  180. package/test/unit/parsers.test.js +43 -0
  181. package/test/unit/typing.test.js +136 -0
  182. package/ANALYSIS.md +0 -31
  183. package/AUDIT_REPORT.md +0 -57
  184. package/advancedSystem.js +0 -95
  185. package/checkUpdate.js +0 -47
  186. package/config.json +0 -51
  187. package/e2ee.js +0 -738
  188. package/examples/basic-bot.js +0 -122
  189. package/examples/e2ee-bot.js +0 -141
  190. package/fca-config.example.json +0 -73
  191. package/scripts/check.js +0 -38
  192. package/src/OldMessage.js +0 -357
  193. package/src/addUserToGroup.js +0 -117
  194. package/src/changeAdminStatus.js +0 -105
  195. package/src/changeAvatarV2.js +0 -86
  196. package/src/changeAvt.js +0 -85
  197. package/src/changeBlockedStatusMqtt.js +0 -75
  198. package/src/changeCover.js +0 -73
  199. package/src/changeGroupImage.js +0 -137
  200. package/src/changeName.js +0 -79
  201. package/src/changeNickname.js +0 -61
  202. package/src/changeThreadColor.js +0 -67
  203. package/src/changeThreadEmoji.js +0 -57
  204. package/src/changeUsername.js +0 -59
  205. package/src/createCommentPost.js +0 -232
  206. package/src/createPoll.js +0 -73
  207. package/src/createPost.js +0 -276
  208. package/src/deleteMessage.js +0 -58
  209. package/src/editMessage.js +0 -76
  210. package/src/editMessageOld.js +0 -62
  211. package/src/follow.js +0 -74
  212. package/src/forwardAttachment.js +0 -62
  213. package/src/friendList.js +0 -104
  214. package/src/getAccess.js +0 -112
  215. package/src/getAvatarUser.js +0 -78
  216. package/src/getBotInitialData.js +0 -42
  217. package/src/getCtx.js +0 -5
  218. package/src/getOptions.js +0 -5
  219. package/src/getRegion.js +0 -7
  220. package/src/getThreadHistoryDeprecated.js +0 -71
  221. package/src/getThreadInfo.js +0 -232
  222. package/src/getThreadInfoDeprecated.js +0 -56
  223. package/src/getThreadList.js +0 -213
  224. package/src/getThreadListDeprecated.js +0 -46
  225. package/src/getThreadPictures.js +0 -59
  226. package/src/getThreadTheme.js +0 -81
  227. package/src/getUID.js +0 -119
  228. package/src/getUserInfo.js +0 -66
  229. package/src/handleFriendRequest.js +0 -46
  230. package/src/handleMessageRequest.js +0 -47
  231. package/src/httpGet.js +0 -49
  232. package/src/httpPost.js +0 -48
  233. package/src/httpPostFormData.js +0 -70
  234. package/src/listenMqtt.js +0 -1081
  235. package/src/listenNotification.js +0 -85
  236. package/src/logout.js +0 -18
  237. package/src/markAsDelivered.js +0 -47
  238. package/src/markAsRead.js +0 -72
  239. package/src/markAsReadAll.js +0 -40
  240. package/src/markAsSeen.js +0 -48
  241. package/src/metaTheme.js +0 -189
  242. package/src/muteThread.js +0 -45
  243. package/src/note.js +0 -228
  244. package/src/pinMessage.js +0 -54
  245. package/src/refreshFb_dtsg.js +0 -49
  246. package/src/removeSuspiciousAccount.js +0 -78
  247. package/src/removeUserFromGroup.js +0 -81
  248. package/src/reply.js +0 -442
  249. package/src/searchFriends.js +0 -140
  250. package/src/searchStickers.js +0 -53
  251. package/src/send.js +0 -46
  252. package/src/sendButtons.js +0 -163
  253. package/src/sendComment.js +0 -159
  254. package/src/sendFriendRequest.js +0 -112
  255. package/src/sendMessage.js +0 -441
  256. package/src/sendMessageMqtt.js +0 -323
  257. package/src/sendTypingIndicator.js +0 -68
  258. package/src/sendTypingIndicatorV2.js +0 -22
  259. package/src/setActiveStatus.js +0 -92
  260. package/src/setMessageReaction.js +0 -150
  261. package/src/setMessageReactionMqtt.js +0 -104
  262. package/src/setMessageReactionSafe.js +0 -44
  263. package/src/setProfileGuard.js +0 -44
  264. package/src/setProfileLock.js +0 -97
  265. package/src/setStoryReaction.js +0 -133
  266. package/src/setStorySeen.js +0 -108
  267. package/src/setThreadTheme.js +0 -102
  268. package/src/setTitle.js +0 -92
  269. package/src/shareContact.js +0 -110
  270. package/src/shareLink.js +0 -59
  271. package/src/stopListenMqtt.js +0 -60
  272. package/src/storyManager.js +0 -357
  273. package/src/suggestFriend.js +0 -132
  274. package/src/unsendMessage.js +0 -68
  275. package/src/uploadAttachment.js +0 -115
  276. package/test/fixes-1_2_4.test.js +0 -118
  277. package/test/mqtt-stop.test.js +0 -32
  278. package/test/reaction-mqtt.test.js +0 -57
  279. package/utils.js +0 -3056
  280. /package/{build → src/api/socket/e2ee/native/build}/messagix.dll +0 -0
  281. /package/{build → src/api/socket/e2ee/native/build}/messagix.so +0 -0
package/index.d.ts ADDED
@@ -0,0 +1,812 @@
1
+ // Type definitions for hridoy-ultimate 9.0.0 (author: HR ID OY). Derived from the upstream
2
+ // (dongdev / EryXenX) typings. Newer / internal methods are declared loosely (any) on purpose.
3
+ import type EventEmitter from "events";
4
+ import type { Duplex, Readable, Transform } from "stream";
5
+
6
+ // ============================================================================
7
+ // Type Definitions -
8
+ // ============================================================================
9
+
10
+ type ReadableStream = Readable | Duplex | Transform;
11
+
12
+ // ============================================================================
13
+ // Login Function
14
+ // ============================================================================
15
+
16
+ declare function login(
17
+ credentials: Partial<{
18
+ email: string;
19
+ password: string;
20
+ appState: AppstateData;
21
+ Cookie?: string | string[] | Record<string, string>;
22
+ }>,
23
+ options: Partial<IFCAU_Options>,
24
+ callback: (err: Error | null, api: IFCAU_API) => void
25
+ ): void;
26
+ declare function login(
27
+ credentials: Partial<{
28
+ email: string;
29
+ password: string;
30
+ appState: AppstateData;
31
+ Cookie?: string | string[] | Record<string, string>;
32
+ }>,
33
+ options: Partial<IFCAU_Options>
34
+ ): Promise<IFCAU_API>;
35
+ declare function login(
36
+ credentials: Partial<{
37
+ email: string;
38
+ password: string;
39
+ appState: AppstateData;
40
+ Cookie?: string | string[] | Record<string, string>;
41
+ }>,
42
+ callback: (err: Error | null, api: IFCAU_API) => void
43
+ ): void;
44
+ declare function login(
45
+ credentials: Partial<{
46
+ email: string;
47
+ password: string;
48
+ appState: AppstateData;
49
+ Cookie?: string | string[] | Record<string, string>;
50
+ }>
51
+ ): Promise<IFCAU_API>;
52
+
53
+ export default login;
54
+ export { login };
55
+
56
+ // ============================================================================
57
+ // Core Types
58
+ // ============================================================================
59
+
60
+ export type Cookie = {
61
+ key: string;
62
+ value: string;
63
+ domain: string;
64
+ path?: string;
65
+ hostOnly?: boolean;
66
+ creation?: string;
67
+ lastAccessed?: string;
68
+ };
69
+
70
+ export type AppstateData = {
71
+ appState: Cookie[];
72
+ };
73
+
74
+ export type MessageObject = {
75
+ body: string;
76
+ sticker?: string;
77
+ attachment?: ReadableStream | ReadableStream[];
78
+ url?: string;
79
+ emoji?: string;
80
+ emojiSize?: string;
81
+ mentions?: {
82
+ tag: string;
83
+ id: string;
84
+ fromIndex?: number;
85
+ }[];
86
+ location?: {
87
+ latitude: number;
88
+ longitude: number;
89
+ current?: boolean;
90
+ };
91
+ };
92
+
93
+ // ============================================================================
94
+ // Send Message Function
95
+ // ============================================================================
96
+
97
+ declare function sendMessage(
98
+ message: string | MessageObject,
99
+ threadID: string | string[],
100
+ callback?: (err?: Error, data?: { threadID: string; messageID: string; timestamp: number }) => void,
101
+ replyMessageID?: string,
102
+ isGroup?: boolean
103
+ ): Promise<{ threadID: string; messageID: string; timestamp: number }>;
104
+ declare function sendMessage(
105
+ message: string | MessageObject,
106
+ threadID: string | string[],
107
+ replyMessageID?: string,
108
+ isGroup?: boolean
109
+ ): Promise<{ threadID: string; messageID: string; timestamp: number }>;
110
+
111
+ // ============================================================================
112
+ // API Interface
113
+ // ============================================================================
114
+
115
+ export type IFCAU_API = {
116
+ // Group Management
117
+ addUserToGroup: (userID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
118
+ removeUserFromGroup: (userID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
119
+ createNewGroup: (participantIDs: string[], groupTitle?: string, callback?: (err: Error, threadID: string) => void) => Promise<string>;
120
+
121
+ // Admin & Permissions
122
+ changeAdminStatus: (threadID: string, adminIDs: string | string[], adminStatus: boolean, callback?: (err?: Error) => void) => Promise<void>;
123
+ changeApprovalMode: (approvalMode: 0 | 1, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
124
+
125
+ // Thread Management
126
+ changeArchivedStatus: (threadOrThreads: string | string[], archive: boolean, callback?: (err?: Error) => void) => Promise<void>;
127
+ changeBlockedStatus: (userID: string, blocked: boolean, callback?: (err?: Error) => void) => Promise<void>;
128
+ changeGroupImage: (image: ReadableStream, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
129
+ changeNickname: (nickname: string, threadID: string, participantID: string, callback?: (err?: Error) => void) => Promise<void>;
130
+ changeThreadColor: (color: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
131
+ changeThreadEmoji: (emoji: string | null, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
132
+ setTitle: (newTitle: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
133
+ deleteThread: (threadOrThreads: string | string[], callback?: (err?: Error) => void) => Promise<void>;
134
+ muteThread: (threadID: string, muteSeconds: number, callback?: (err?: Error) => void) => Promise<void>;
135
+
136
+ // Messages
137
+ sendMessage: typeof sendMessage;
138
+ editMessage: (text: string, messageID: string, callback?: (err?: Error) => void) => Promise<void>;
139
+ deleteMessage: (messageOrMessages: string | string[], callback?: (err?: Error) => void) => Promise<void>;
140
+ unsendMessage: (messageID: string, callback?: (err?: Error) => void) => Promise<void>;
141
+ unsendMessageMqtt: (messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
142
+ forwardMessage: (messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
143
+ forwardAttachment: (attachmentID: string, userOrUsers: string | string[], callback?: (err?: Error) => void) => Promise<void>;
144
+ pinMessage: (pinMode: boolean, messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
145
+
146
+ // Reactions & Interactions
147
+ setMessageReaction: (reaction: string, messageID: string, threadID: string, callback?: (err?: Error) => void, forceCustomReaction?: boolean) => Promise<void>;
148
+ setMessageReactionMqtt: (reaction: string, messageID: string, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
149
+ sendTypingIndicator: (threadID: string | string[], isTyping: boolean, options?: IFCAU_TypingSendOptions | ((err?: Error) => void), callback?: (err?: Error) => void) => Promise<void>;
150
+ sendTypingIndicatorMqtt: (isTyping: boolean, threadID: string, callback?: (err?: Error) => void) => Promise<void>;
151
+
152
+ // Typing indicator controller (hridoy-ultimate 9.0.0)
153
+ getTypingIndicator: () => IFCAU_TypingIndicator;
154
+ setTypingIndicator: (option: boolean | IFCAU_TypingIndicatorOptions) => IFCAU_TypingIndicatorOptions;
155
+ withTyping: <T>(threadID: string, fn: () => T | Promise<T>) => Promise<T>;
156
+
157
+ // Previously undeclared methods (typed loosely on purpose; see README "Known limitations")
158
+ OldMessage: (...args: any[]) => any;
159
+ sendMessageMqtt: (...args: any[]) => any;
160
+ listenE2EE: (callback: (err: Error | null, event: any) => void) => any;
161
+ getMessage: (...args: any[]) => any;
162
+ getUserInfoV2: (...args: any[]) => any;
163
+ searchForThread: (...args: any[]) => any;
164
+ shareContact: (...args: any[]) => any;
165
+ uploadAttachment: (...args: any[]) => any;
166
+ sendBroadcast: (...args: any[]) => any;
167
+ sessionGuard: (...args: any[]) => any;
168
+ refreshFb_dtsg: (...args: any[]) => any;
169
+ httpGet: (...args: any[]) => any;
170
+ httpPost: (...args: any[]) => any;
171
+ postFormData: (...args: any[]) => any;
172
+ addExternalModule: (...args: any[]) => any;
173
+ changeAvatar: (...args: any[]) => any;
174
+ changeBio: (...args: any[]) => any;
175
+ createThemeAI: (...args: any[]) => any;
176
+ getThemePictures: (...args: any[]) => any;
177
+ dismissScrapingWarning: (...args: any[]) => any;
178
+ handleFriendRequest: (...args: any[]) => any;
179
+ setPostReaction: (...args: any[]) => any;
180
+ unfriend: (...args: any[]) => any;
181
+
182
+ // Polls
183
+ createPoll: (title: string, threadID: string, options?: { [item: string]: boolean }, callback?: (err?: Error) => void) => Promise<void>;
184
+
185
+ // Read & Delivery Status
186
+ markAsRead: (threadID: string, read?: boolean, callback?: (err?: Error) => void) => Promise<void>;
187
+ markAsReadAll: (callback?: (err?: Error) => void) => Promise<void>;
188
+ markAsDelivered: (threadID: string, messageID: string, callback?: (err?: Error) => void) => Promise<void>;
189
+ markAsSeen: (seenTimestamp?: number, callback?: (err?: Error) => void) => Promise<void>;
190
+
191
+ // Thread Information
192
+ getThreadInfo: (threadID: string, callback?: (err: Error | null, thread: IFCAU_Thread) => void) => Promise<IFCAU_Thread>;
193
+ getThreadList: (limit: number, timestamp: number | null, tags: string[], callback?: (err: Error | null, threads: IFCAU_ThreadList) => void) => Promise<IFCAU_ThreadList>;
194
+ getThreadHistory: (threadID: string, amount: number, time?: number, callback?: (err: Error | null, messages: any[]) => void) => Promise<any[]>;
195
+ getThreadPictures: (threadID: string, offset: number, limit: number, callback?: (err: Error | null, pictures: string[]) => void) => Promise<string[]>;
196
+
197
+ // User Information
198
+ getUserInfo: (userOrUsers: string | string[], callback?: (err: Error | null, users: { [id: string]: IFCAU_User }) => void) => Promise<{ [id: string]: IFCAU_User }>;
199
+ getUserID: (name: string, callback?: (err: Error | null, obj: IFCAU_UserIDResponse) => void) => Promise<IFCAU_UserIDResponse>;
200
+ getFriendsList: (callback?: (err: Error | null, friends: IFCAU_Friend[]) => void) => Promise<IFCAU_Friend[]>;
201
+ getCurrentUserID: () => string;
202
+
203
+ // Utilities
204
+ getAppState: () => any;
205
+ getEmojiUrl: (c: string, size: number, pixelRatio: number) => string;
206
+ resolvePhotoUrl: (photoID: string, callback?: (err: Error | null, url: string) => void) => Promise<string>;
207
+ threadColors: {
208
+ [color: string]: string;
209
+ };
210
+
211
+ // Message Requests
212
+ handleMessageRequest: (threadOrThreads: string | string[], accept: boolean, callback?: (err?: Error) => void) => Promise<void>;
213
+
214
+ // Event Listeners
215
+ listen: (callback?: (err: Error | null, message: IFCAU_ListenMessage) => void) => EventEmitter;
216
+ listenMqtt: (callback?: (err: Error | null, message: IFCAU_ListenMessage) => void) => EventEmitter & { stopListening: (callback?: () => void) => void };
217
+
218
+ // Lifecycle & Remote Events
219
+ on: (event: string, listener: (...args: any[]) => void) => IFCAU_API;
220
+ once: (event: string, listener: (...args: any[]) => void) => IFCAU_API;
221
+ off: (event: string, listener: (...args: any[]) => void) => IFCAU_API;
222
+ removeAllListeners: (event?: string) => IFCAU_API;
223
+
224
+ // Middleware System
225
+ useMiddleware: (middleware: IFCAU_Middleware | string, fn?: IFCAU_Middleware) => () => void;
226
+ removeMiddleware: (identifier: string | IFCAU_Middleware) => boolean;
227
+ clearMiddleware: () => void;
228
+ listMiddleware: () => string[];
229
+ setMiddlewareEnabled: (name: string, enabled: boolean) => boolean;
230
+ readonly middlewareCount: number;
231
+
232
+ // Configuration & Session
233
+ setOptions: (options: Partial<IFCAU_Options>) => void;
234
+ logout: (callback?: (err?: Error) => void) => Promise<void>;
235
+
236
+ // Message Scheduler
237
+ scheduler: {
238
+ scheduleMessage: (message: string | MessageObject, threadID: string | string[], when: Date | number | string, options?: { replyMessageID?: string; isGroup?: boolean; callback?: (err?: Error) => void }) => string;
239
+ cancelScheduledMessage: (id: string) => boolean;
240
+ getScheduledMessage: (id: string) => IFCAU_ScheduledMessage | null;
241
+ listScheduledMessages: () => IFCAU_ScheduledMessage[];
242
+ cancelAllScheduledMessages: () => number;
243
+ getScheduledCount: () => number;
244
+ cleanup: () => void;
245
+ };
246
+
247
+ // Auto-save AppState
248
+ enableAutoSaveAppState: (options?: { filePath?: string; interval?: number; saveOnLogin?: boolean }) => () => void;
249
+ };
250
+
251
+ // ============================================================================
252
+ // Listen Message Types
253
+ // ============================================================================
254
+
255
+ export type IFCAU_ListenMessage =
256
+ | {
257
+ type: "message";
258
+ attachments: IFCAU_Attachment[];
259
+ args: string[];
260
+ body: string;
261
+ isGroup: boolean;
262
+ mentions: { [id: string]: string };
263
+ messageID: string;
264
+ senderID: string;
265
+ threadID: string;
266
+ isUnread: boolean;
267
+ participantIDs: string[];
268
+ }
269
+ | {
270
+ type: "event";
271
+ author: string;
272
+ logMessageBody: string;
273
+ logMessageData: {
274
+ image: {
275
+ attachmentID: string;
276
+ width: number;
277
+ height: number;
278
+ url: string;
279
+ };
280
+ };
281
+ logMessageType: "log:thread-image";
282
+ threadID: string;
283
+ }
284
+ | {
285
+ type: "event";
286
+ author: string;
287
+ logMessageBody: string;
288
+ logMessageData: {
289
+ addedParticipants: {
290
+ fanoutPolicy: string;
291
+ firstName: string;
292
+ fullName: string;
293
+ groupJoinStatus: string;
294
+ initialFolder: string;
295
+ initialFolderId: {
296
+ systemFolderId: string;
297
+ };
298
+ lastUnsubscribeTimestampMs: string;
299
+ userFbId: string;
300
+ isMessengerUser: boolean;
301
+ }[];
302
+ };
303
+ logMessageType: "log:subscribe";
304
+ threadID: string;
305
+ participantIDs: string[];
306
+ }
307
+ | {
308
+ type: "event";
309
+ author: string;
310
+ logMessageBody: string;
311
+ logMessageData: { leftParticipantFbId: string };
312
+ logMessageType: "log:unsubscribe";
313
+ threadID: string;
314
+ participantIDs: string[];
315
+ }
316
+ | {
317
+ type: "event";
318
+ author: string;
319
+ logMessageBody: string;
320
+ logMessageData: { name: string };
321
+ logMessageType: "log:thread-name";
322
+ threadID: string;
323
+ participantIDs: string[];
324
+ }
325
+ | {
326
+ type: "event";
327
+ author: string;
328
+ logMessageBody: string;
329
+ logMessageData: {
330
+ theme_color: string;
331
+ gradient?: string;
332
+ should_show_icon: string;
333
+ theme_id: string;
334
+ accessibility_label: string;
335
+ theme_name_with_subtitle: string;
336
+ theme_emoji?: string;
337
+ };
338
+ logMessageType: "log:thread-color";
339
+ threadID: string;
340
+ participantIDs: string[];
341
+ }
342
+ | {
343
+ type: "event";
344
+ author: string;
345
+ logMessageBody: string;
346
+ logMessageData: {
347
+ thread_quick_reaction_instruction_key_id: string;
348
+ thread_quick_reaction_emoji: string;
349
+ thread_quick_reaction_emoji_url: string;
350
+ };
351
+ logMessageType: "log:thread-icon";
352
+ threadID: string;
353
+ participantIDs: string[];
354
+ }
355
+ | {
356
+ type: "event";
357
+ author: string;
358
+ logMessageBody: string;
359
+ logMessageData: {
360
+ nickname: string;
361
+ participant_id: string;
362
+ };
363
+ logMessageType: "log:user-nickname";
364
+ threadID: string;
365
+ participantIDs: string[];
366
+ }
367
+ | {
368
+ type: "event";
369
+ author: string;
370
+ logMessageBody: string;
371
+ logMessageData: {
372
+ THREAD_CATEGORY: string;
373
+ TARGET_ID: string;
374
+ ADMIN_TYPE: string;
375
+ ADMIN_EVENT: 'add_admin' | 'remove_admin';
376
+ };
377
+ logMessageType: "log:thread-admins";
378
+ threadID: string;
379
+ participantIDs: string[];
380
+ }
381
+ | {
382
+ type: "event";
383
+ author: string;
384
+ logMessageBody: string;
385
+ logMessageData: {
386
+ removed_option_ids: string;
387
+ question_json: string;
388
+ event_type: 'question_creation' | 'update_vote' | 'add_unvoted_option' | 'multiple_updates';
389
+ added_option_ids: string;
390
+ new_option_texts: string;
391
+ new_option_ids: string;
392
+ question_id: string;
393
+ };
394
+ logMessageType: "log:thread-poll";
395
+ threadID: string;
396
+ participantIDs: string[];
397
+ }
398
+ | {
399
+ type: "event";
400
+ author: string;
401
+ logMessageBody: string;
402
+ logMessageData: { APPROVAL_MODE: '0' | '1'; THREAD_CATEGORY: string };
403
+ logMessageType: "log:thread-approval-mode";
404
+ threadID: string;
405
+ participantIDs: string[];
406
+ }
407
+ | {
408
+ type: "event";
409
+ author: string;
410
+ logMessageBody: string;
411
+ logMessageData: any;
412
+ logMessageType: "log:thread-call";
413
+ threadID: string;
414
+ participantIDs: string[];
415
+ }
416
+ | {
417
+ type: "typ";
418
+ from: string;
419
+ fromMobile: boolean;
420
+ isTyping: boolean;
421
+ threadID: string;
422
+ }
423
+ | {
424
+ type: "read";
425
+ threadID: string;
426
+ time: number;
427
+ }
428
+ | {
429
+ type: "read_receipt";
430
+ reader: string;
431
+ threadID: string;
432
+ time: number;
433
+ }
434
+ | {
435
+ type: "message_reaction";
436
+ threadID: string;
437
+ messageID: string;
438
+ reaction: string;
439
+ senderID: string;
440
+ userID: string;
441
+ reactionTimestamp: number;
442
+ }
443
+ | {
444
+ type: "presence";
445
+ statuses: number;
446
+ timestamp: number;
447
+ userID: string;
448
+ }
449
+ | {
450
+ type: "message_unsend";
451
+ threadID: string;
452
+ senderID: string;
453
+ messageID: string;
454
+ deletionTimestamp: number;
455
+ }
456
+ | {
457
+ type: "message_reply";
458
+ attachments: IFCAU_Attachment[];
459
+ args: string[];
460
+ body: string;
461
+ isGroup: boolean;
462
+ mentions: { [id: string]: string };
463
+ messageID: string;
464
+ senderID: string;
465
+ threadID: string;
466
+ isUnread: boolean;
467
+ participantIDs: string[];
468
+ messageReply: {
469
+ attachments: IFCAU_Attachment[];
470
+ body: string;
471
+ isGroup: boolean;
472
+ mentions: { [id: string]: string };
473
+ messageID: string;
474
+ senderID: string;
475
+ threadID: string;
476
+ isUnread: boolean;
477
+ };
478
+ };
479
+
480
+ // ============================================================================
481
+ // Attachment Types
482
+ // ============================================================================
483
+
484
+ export type IFCAU_Attachment =
485
+ | {
486
+ type: "sticker";
487
+ ID: string;
488
+ url: string;
489
+ packID: string;
490
+ spriteUrl: string;
491
+ spriteUrl2x: string;
492
+ width: number;
493
+ height: number;
494
+ caption: string;
495
+ description: string;
496
+ frameCount: number;
497
+ frameRate: number;
498
+ framesPerRow: number;
499
+ framesPerCol: number;
500
+ }
501
+ | {
502
+ type: "file";
503
+ ID: string;
504
+ filename: string;
505
+ url: string;
506
+ isMalicious: boolean;
507
+ contentType: string;
508
+ }
509
+ | {
510
+ type: "photo";
511
+ ID: string;
512
+ filename: string;
513
+ thumbnailUrl: string;
514
+ previewUrl: string;
515
+ previewWidth: number;
516
+ previewHeight: number;
517
+ largePreviewUrl: string;
518
+ largePreviewWidth: number;
519
+ largePreviewHeight: number;
520
+ url: string;
521
+ width: number;
522
+ height: number;
523
+ }
524
+ | {
525
+ type: "animated_image";
526
+ ID: string;
527
+ filename: string;
528
+ previewUrl: string;
529
+ previewWidth: number;
530
+ previewHeight: number;
531
+ url: string;
532
+ width: number;
533
+ height: number;
534
+ }
535
+ | {
536
+ type: "video";
537
+ ID: string;
538
+ filename: string;
539
+ previewUrl: string;
540
+ previewWidth: number;
541
+ previewHeight: number;
542
+ url: string;
543
+ width: number;
544
+ height: number;
545
+ duration: number;
546
+ videoType: string;
547
+ }
548
+ | {
549
+ type: "audio";
550
+ ID: string;
551
+ filename: string;
552
+ audioType: string;
553
+ duration: number;
554
+ url: string;
555
+ isVoiceMail: boolean;
556
+ }
557
+ | {
558
+ type: "location";
559
+ ID: string;
560
+ latitude: number;
561
+ longitude: number;
562
+ image: string;
563
+ width: number;
564
+ height: number;
565
+ url: string;
566
+ address: string;
567
+ }
568
+ | {
569
+ type: "share";
570
+ ID: string;
571
+ url: string;
572
+ title: string;
573
+ description: string;
574
+ source: string;
575
+ image: string;
576
+ width: number;
577
+ height: number;
578
+ playable: boolean;
579
+ duration: number;
580
+ playableUrl: string;
581
+ subattachments: any;
582
+ properties: any;
583
+ };
584
+
585
+ // ============================================================================
586
+ // User Types
587
+ // ============================================================================
588
+
589
+ export type IFCAU_User = {
590
+ name: string;
591
+ firstName?: string;
592
+ vanity?: string;
593
+ thumbSrc: string;
594
+ profileUrl: string | null;
595
+ gender?: number;
596
+ type: string;
597
+ isFriend?: boolean;
598
+ isBirthday: boolean;
599
+ searchToken: any;
600
+ alternateName?: string;
601
+ };
602
+
603
+ export type IFCAU_UserIDResponse = {
604
+ userID: string;
605
+ photoUrl: string;
606
+ indexRank: number;
607
+ name: string;
608
+ isVerified: boolean;
609
+ profileUrl: string;
610
+ category: string;
611
+ score: number;
612
+ type: string;
613
+ }[];
614
+
615
+ export type IFCAU_Friend = {
616
+ alternativeName: string;
617
+ firstName: string;
618
+ gender: string;
619
+ userID: string;
620
+ isFriend: boolean;
621
+ fullName: string;
622
+ profilePicture: string;
623
+ type: string;
624
+ profileUrl: string;
625
+ vanity: string;
626
+ isBirthday: boolean;
627
+ };
628
+
629
+ // ============================================================================
630
+ // Thread Types
631
+ // ============================================================================
632
+
633
+ export type IFCAU_Thread = {
634
+ threadID: string;
635
+ participantIDs: string[];
636
+ threadName: string;
637
+ userInfo: (IFCAU_User & { id: string })[];
638
+ nicknames: { [id: string]: string } | null;
639
+ unreadCount: number;
640
+ messageCount: number;
641
+ imageSrc: string;
642
+ timestamp: number;
643
+ muteUntil: number | null;
644
+ isGroup: boolean;
645
+ isSubscribed: boolean;
646
+ folder: 'INBOX' | 'ARCHIVE' | string;
647
+ isArchived: boolean;
648
+ cannotReplyReason: string | null;
649
+ lastReadTimestamp: number;
650
+ emoji: string | null;
651
+ color: string | null;
652
+ adminIDs: string[];
653
+ approvalMode: boolean;
654
+ approvalQueue: { inviterID: string; requesterID: string; timestamp: string }[];
655
+ };
656
+
657
+ export type IFCAU_ThreadList = {
658
+ threadID: string;
659
+ name: string;
660
+ unreadCount: number;
661
+ messageCount: number;
662
+ imageSrc: string;
663
+ emoji: string | null;
664
+ color: string | null;
665
+ nicknames: { userid: string; nickname: string }[];
666
+ muteUntil: number | null;
667
+ participants: IFCAU_ThreadList_Participants[];
668
+ adminIDs: string[];
669
+ folder: "INBOX" | "ARCHIVED" | "PENNDING" | "OTHER" | string;
670
+ isGroup: boolean;
671
+ customizationEnabled: boolean;
672
+ participantAddMode: string;
673
+ reactionMuteMode: string;
674
+ isArchived: boolean;
675
+ isSubscribed: boolean;
676
+ timestamp: number;
677
+ snippet: string;
678
+ snippetAttachments: string;
679
+ snippetSender: string;
680
+ lastMessageTimestamp: number;
681
+ listReadTimestamp: number | null;
682
+ cannotReplyReason: string | null;
683
+ approvalMode: string;
684
+ }[];
685
+
686
+ export type IFCAU_ThreadList_Participants =
687
+ | {
688
+ accountType: "User";
689
+ userID: string;
690
+ name: string;
691
+ shortName: string;
692
+ gender: string;
693
+ url: string;
694
+ profilePicture: string;
695
+ username: string | null;
696
+ isViewerFriend: boolean;
697
+ isMessengerUser: boolean;
698
+ isVerified: boolean;
699
+ isMessageBlockedByViewer: boolean;
700
+ isViewerCoworker: boolean;
701
+ }
702
+ | {
703
+ accountType: "Page";
704
+ userID: string;
705
+ name: string;
706
+ url: string;
707
+ profilePicture: string;
708
+ username: string | null;
709
+ acceptMessengerUserFeedback: boolean;
710
+ isMessengerUser: boolean;
711
+ isVerified: boolean;
712
+ isMessengerPlatformBot: boolean;
713
+ isMessageBlockedByViewer: boolean;
714
+ }
715
+ | {
716
+ accountType: "ReducedMessagingActor";
717
+ userID: string;
718
+ name: string;
719
+ url: string;
720
+ profilePicture: string;
721
+ username: string | null;
722
+ acceptMessengerUserFeedback: boolean;
723
+ isMessageBlockedByViewer: boolean;
724
+ }
725
+ | {
726
+ accountType: "UnavailableMessagingActor";
727
+ userID: string;
728
+ name: string;
729
+ url: null;
730
+ profilePicture: string;
731
+ username: null;
732
+ acceptMessengerUserFeedback: boolean;
733
+ isMessageBlockedByViewer: boolean;
734
+ }
735
+ | {
736
+ accountType: string;
737
+ userID: string;
738
+ name: string;
739
+ };
740
+
741
+ // ============================================================================
742
+ // Middleware Types
743
+ // ============================================================================
744
+
745
+ export type IFCAU_Middleware = (event: IFCAU_ListenMessage, next: (err?: Error | false | null) => void) => void | Promise<void> | false | null;
746
+
747
+ // ============================================================================
748
+ // Scheduler Types
749
+ // ============================================================================
750
+
751
+ export type IFCAU_ScheduledMessage = {
752
+ id: string;
753
+ message: string | MessageObject;
754
+ threadID: string | string[];
755
+ timestamp: number;
756
+ createdAt: number;
757
+ options: {
758
+ replyMessageID?: string;
759
+ isGroup?: boolean;
760
+ callback?: (err?: Error) => void;
761
+ };
762
+ timeUntilSend: number;
763
+ };
764
+
765
+ // ============================================================================
766
+ // Options Type
767
+ // ============================================================================
768
+
769
+ export type IFCAU_Options = {
770
+ pauseLog: boolean;
771
+ logLevel: "silly" | "verbose" | "info" | "http" | "warn" | "error" | "silent";
772
+ selfListen: boolean;
773
+ listenEvents: boolean;
774
+ pageID: string;
775
+ updatePresence: boolean;
776
+ forceLogin: boolean;
777
+ userAgent: string;
778
+ autoMarkRead: boolean;
779
+ proxy: string;
780
+ online: boolean;
781
+ /** Opt-in command anti-spam (reply delay + cooldown). Off by default. */
782
+ humanize: boolean | Record<string, any>;
783
+ /** Typing indicator. Default ON; false disables; object fine-tunes it. */
784
+ typingIndicator: boolean | IFCAU_TypingIndicatorOptions;
785
+ };
786
+
787
+ export type IFCAU_TypingIndicatorOptions = {
788
+ enabled?: boolean;
789
+ /** Only type for command-like messages (GoatBot prefix, "/", "!", "."). Default true. */
790
+ onlyCommands?: boolean;
791
+ /** Extra command prefixes. */
792
+ commands?: string[];
793
+ /** Safety stop in ms when no reply is sent. Default 8000. */
794
+ maxMs?: number;
795
+ /** Do not re-send typing for the same thread inside this window. Default 1500. */
796
+ minGapMs?: number;
797
+ groups?: boolean;
798
+ dms?: boolean;
799
+ };
800
+
801
+ export type IFCAU_TypingSendOptions = { duration?: number; autoStop?: boolean; type?: number };
802
+
803
+ export interface IFCAU_TypingIndicator {
804
+ readonly enabled: boolean;
805
+ options: Required<IFCAU_TypingIndicatorOptions>;
806
+ configure(option: boolean | IFCAU_TypingIndicatorOptions): IFCAU_TypingIndicatorOptions;
807
+ isTyping(threadID: string): boolean;
808
+ start(threadID: string): boolean;
809
+ stop(threadID: string): boolean;
810
+ stopAll(): void;
811
+ withTyping<T>(threadID: string, fn: () => T | Promise<T>): Promise<T>;
812
+ }