gifted-baileys 1.5.4 → 1.5.6

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 (252) hide show
  1. package/LICENSE +1 -1
  2. package/WAProto/WAProto.proto +88 -969
  3. package/WAProto/index.d.ts +1256 -13195
  4. package/WAProto/index.js +74730 -125106
  5. package/package.json +9 -27
  6. package/src/Defaults/baileys-version.json +3 -0
  7. package/{lib → src}/Defaults/index.js +14 -7
  8. package/src/Defaults/index.ts +131 -0
  9. package/src/README.md +1 -0
  10. package/src/Signal/libsignal.js +180 -0
  11. package/src/Signal/libsignal.ts +141 -0
  12. package/src/Socket/Client/abstract-socket-client.ts +19 -0
  13. package/{lib → src}/Socket/Client/index.js +3 -2
  14. package/src/Socket/Client/index.ts +3 -0
  15. package/src/Socket/Client/mobile-socket-client.js +78 -0
  16. package/src/Socket/Client/mobile-socket-client.ts +66 -0
  17. package/src/Socket/Client/web-socket-client.js +75 -0
  18. package/src/Socket/Client/web-socket-client.ts +57 -0
  19. package/{lib → src}/Socket/business.js +33 -28
  20. package/src/Socket/business.ts +281 -0
  21. package/{lib → src}/Socket/chats.js +176 -174
  22. package/src/Socket/chats.ts +1030 -0
  23. package/{lib → src}/Socket/groups.js +68 -80
  24. package/src/Socket/groups.ts +356 -0
  25. package/{lib → src}/Socket/index.js +1 -4
  26. package/src/Socket/index.ts +13 -0
  27. package/{lib → src}/Socket/messages-recv.js +211 -378
  28. package/src/Socket/messages-recv.ts +985 -0
  29. package/{lib → src}/Socket/messages-send.js +177 -452
  30. package/src/Socket/messages-send.ts +871 -0
  31. package/{lib → src}/Socket/newsletter.js +98 -107
  32. package/src/Socket/newsletter.ts +282 -0
  33. package/{lib → src}/Socket/registration.js +48 -56
  34. package/src/Socket/registration.ts +250 -0
  35. package/{lib → src}/Socket/socket.js +77 -77
  36. package/src/Socket/socket.ts +777 -0
  37. package/src/Store/index.ts +3 -0
  38. package/{lib → src}/Store/make-cache-manager-store.js +34 -25
  39. package/src/Store/make-cache-manager-store.ts +100 -0
  40. package/{lib → src}/Store/make-in-memory-store.js +32 -36
  41. package/src/Store/make-in-memory-store.ts +475 -0
  42. package/src/Store/make-ordered-dictionary.ts +86 -0
  43. package/{lib → src}/Store/object-repository.js +1 -1
  44. package/src/Store/object-repository.ts +32 -0
  45. package/src/Tests/test.app-state-sync.js +204 -0
  46. package/src/Tests/test.app-state-sync.ts +207 -0
  47. package/src/Tests/test.event-buffer.js +270 -0
  48. package/src/Tests/test.event-buffer.ts +319 -0
  49. package/src/Tests/test.key-store.js +76 -0
  50. package/src/Tests/test.key-store.ts +92 -0
  51. package/src/Tests/test.libsignal.js +141 -0
  52. package/src/Tests/test.libsignal.ts +186 -0
  53. package/src/Tests/test.media-download.js +93 -0
  54. package/src/Tests/test.media-download.ts +76 -0
  55. package/src/Tests/test.messages.js +33 -0
  56. package/src/Tests/test.messages.ts +37 -0
  57. package/src/Tests/utils.js +34 -0
  58. package/src/Tests/utils.ts +36 -0
  59. package/src/Types/Auth.ts +113 -0
  60. package/src/Types/Call.ts +15 -0
  61. package/src/Types/Chat.ts +106 -0
  62. package/{lib/Types/Contact.d.ts → src/Types/Contact.ts} +9 -8
  63. package/src/Types/Events.ts +93 -0
  64. package/src/Types/GroupMetadata.ts +53 -0
  65. package/src/Types/Label.ts +36 -0
  66. package/{lib/Types/LabelAssociation.d.ts → src/Types/LabelAssociation.ts} +22 -16
  67. package/src/Types/Message.ts +288 -0
  68. package/src/Types/Newsletter.ts +98 -0
  69. package/src/Types/Product.ts +85 -0
  70. package/src/Types/Signal.ts +68 -0
  71. package/{lib/Types/Socket.d.ts → src/Types/Socket.ts} +68 -61
  72. package/src/Types/State.ts +29 -0
  73. package/src/Types/index.ts +59 -0
  74. package/{lib → src}/Utils/auth-utils.js +90 -73
  75. package/src/Utils/auth-utils.ts +222 -0
  76. package/src/Utils/baileys-event-stream.js +92 -0
  77. package/src/Utils/baileys-event-stream.ts +66 -0
  78. package/{lib → src}/Utils/business.js +43 -15
  79. package/src/Utils/business.ts +275 -0
  80. package/{lib → src}/Utils/chat-utils.js +94 -87
  81. package/src/Utils/chat-utils.ts +860 -0
  82. package/{lib → src}/Utils/crypto.js +2 -4
  83. package/src/Utils/crypto.ts +131 -0
  84. package/src/Utils/decode-wa-message.js +211 -0
  85. package/src/Utils/decode-wa-message.ts +228 -0
  86. package/{lib → src}/Utils/event-buffer.js +13 -4
  87. package/src/Utils/event-buffer.ts +613 -0
  88. package/{lib → src}/Utils/generics.js +86 -67
  89. package/src/Utils/generics.ts +434 -0
  90. package/{lib → src}/Utils/history.js +39 -13
  91. package/src/Utils/history.ts +112 -0
  92. package/src/Utils/index.ts +17 -0
  93. package/{lib → src}/Utils/link-preview.js +54 -17
  94. package/src/Utils/link-preview.ts +122 -0
  95. package/src/Utils/logger.ts +3 -0
  96. package/src/Utils/lt-hash.ts +61 -0
  97. package/{lib → src}/Utils/make-mutex.js +13 -4
  98. package/src/Utils/make-mutex.ts +44 -0
  99. package/{lib → src}/Utils/messages-media.js +255 -193
  100. package/src/Utils/messages-media.ts +847 -0
  101. package/{lib → src}/Utils/messages.js +118 -588
  102. package/src/Utils/messages.ts +956 -0
  103. package/src/Utils/noise-handler.ts +197 -0
  104. package/{lib → src}/Utils/process-message.js +30 -27
  105. package/src/Utils/process-message.ts +414 -0
  106. package/{lib → src}/Utils/signal.js +42 -25
  107. package/src/Utils/signal.ts +177 -0
  108. package/{lib → src}/Utils/use-multi-file-auth-state.js +28 -27
  109. package/src/Utils/use-multi-file-auth-state.ts +90 -0
  110. package/{lib → src}/Utils/validate-connection.js +9 -40
  111. package/src/Utils/validate-connection.ts +238 -0
  112. package/src/WABinary/constants.ts +42 -0
  113. package/src/WABinary/decode.ts +265 -0
  114. package/{lib → src}/WABinary/encode.js +10 -16
  115. package/src/WABinary/encode.ts +236 -0
  116. package/src/WABinary/generic-utils.ts +121 -0
  117. package/src/WABinary/index.ts +5 -0
  118. package/src/WABinary/jid-utils.ts +68 -0
  119. package/src/WABinary/types.ts +17 -0
  120. package/src/WAM/BinaryInfo.ts +12 -0
  121. package/src/WAM/constants.ts +15382 -0
  122. package/src/WAM/encode.ts +174 -0
  123. package/src/WAM/index.ts +3 -0
  124. package/{lib → src}/index.js +0 -1
  125. package/src/index.ts +13 -0
  126. package/README.md +0 -1645
  127. package/lib/Defaults/baileys-version.json +0 -3
  128. package/lib/Defaults/index.d.ts +0 -284
  129. package/lib/Signal/libsignal.d.ts +0 -3
  130. package/lib/Signal/libsignal.js +0 -161
  131. package/lib/Socket/Client/abstract-socket-client.d.ts +0 -15
  132. package/lib/Socket/Client/index.d.ts +0 -2
  133. package/lib/Socket/Client/mobile-socket-client.d.ts +0 -12
  134. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  135. package/lib/Socket/Client/types.d.ts +0 -17
  136. package/lib/Socket/Client/types.js +0 -13
  137. package/lib/Socket/Client/websocket.d.ts +0 -12
  138. package/lib/Socket/Client/websocket.js +0 -62
  139. package/lib/Socket/business.d.ts +0 -170
  140. package/lib/Socket/chats.d.ts +0 -81
  141. package/lib/Socket/groups.d.ts +0 -115
  142. package/lib/Socket/index.d.ts +0 -172
  143. package/lib/Socket/messages-recv.d.ts +0 -158
  144. package/lib/Socket/messages-send.d.ts +0 -155
  145. package/lib/Socket/newsletter.d.ts +0 -132
  146. package/lib/Socket/registration.d.ts +0 -264
  147. package/lib/Socket/socket.d.ts +0 -44
  148. package/lib/Socket/usync.d.ts +0 -37
  149. package/lib/Socket/usync.js +0 -70
  150. package/lib/Store/index.d.ts +0 -3
  151. package/lib/Store/make-cache-manager-store.d.ts +0 -14
  152. package/lib/Store/make-in-memory-store.d.ts +0 -118
  153. package/lib/Store/make-ordered-dictionary.d.ts +0 -13
  154. package/lib/Store/object-repository.d.ts +0 -10
  155. package/lib/Types/Auth.d.ts +0 -109
  156. package/lib/Types/Call.d.ts +0 -13
  157. package/lib/Types/Chat.d.ts +0 -107
  158. package/lib/Types/Events.d.ts +0 -172
  159. package/lib/Types/GroupMetadata.d.ts +0 -56
  160. package/lib/Types/Label.d.ts +0 -46
  161. package/lib/Types/Message.d.ts +0 -433
  162. package/lib/Types/Newsletter.d.ts +0 -92
  163. package/lib/Types/Product.d.ts +0 -78
  164. package/lib/Types/Signal.d.ts +0 -57
  165. package/lib/Types/State.d.ts +0 -27
  166. package/lib/Types/USync.d.ts +0 -25
  167. package/lib/Types/USync.js +0 -2
  168. package/lib/Types/index.d.ts +0 -66
  169. package/lib/Utils/auth-utils.d.ts +0 -18
  170. package/lib/Utils/baileys-event-stream.d.ts +0 -16
  171. package/lib/Utils/baileys-event-stream.js +0 -63
  172. package/lib/Utils/business.d.ts +0 -22
  173. package/lib/Utils/chat-utils.d.ts +0 -70
  174. package/lib/Utils/crypto.d.ts +0 -40
  175. package/lib/Utils/decode-wa-message.d.ts +0 -36
  176. package/lib/Utils/decode-wa-message.js +0 -226
  177. package/lib/Utils/event-buffer.d.ts +0 -35
  178. package/lib/Utils/generics.d.ts +0 -88
  179. package/lib/Utils/history.d.ts +0 -19
  180. package/lib/Utils/index.d.ts +0 -17
  181. package/lib/Utils/link-preview.d.ts +0 -21
  182. package/lib/Utils/logger.d.ts +0 -2
  183. package/lib/Utils/lt-hash.d.ts +0 -12
  184. package/lib/Utils/make-mutex.d.ts +0 -7
  185. package/lib/Utils/messages-media.d.ts +0 -113
  186. package/lib/Utils/messages.d.ts +0 -77
  187. package/lib/Utils/noise-handler.d.ts +0 -20
  188. package/lib/Utils/process-message.d.ts +0 -41
  189. package/lib/Utils/signal.d.ts +0 -33
  190. package/lib/Utils/use-multi-file-auth-state.d.ts +0 -12
  191. package/lib/Utils/validate-connection.d.ts +0 -11
  192. package/lib/WABinary/constants.d.ts +0 -27
  193. package/lib/WABinary/decode.d.ts +0 -6
  194. package/lib/WABinary/encode.d.ts +0 -2
  195. package/lib/WABinary/generic-utils.d.ts +0 -14
  196. package/lib/WABinary/index.d.ts +0 -5
  197. package/lib/WABinary/jid-utils.d.ts +0 -31
  198. package/lib/WABinary/types.d.ts +0 -18
  199. package/lib/WAM/BinaryInfo.d.ts +0 -8
  200. package/lib/WAM/constants.d.ts +0 -38
  201. package/lib/WAM/encode.d.ts +0 -2
  202. package/lib/WAM/index.d.ts +0 -3
  203. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +0 -9
  204. package/lib/WAUSync/Protocols/USyncContactProtocol.js +0 -32
  205. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +0 -22
  206. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +0 -57
  207. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +0 -12
  208. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +0 -30
  209. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +0 -12
  210. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +0 -42
  211. package/lib/WAUSync/Protocols/index.d.ts +0 -4
  212. package/lib/WAUSync/Protocols/index.js +0 -20
  213. package/lib/WAUSync/USyncQuery.d.ts +0 -26
  214. package/lib/WAUSync/USyncQuery.js +0 -79
  215. package/lib/WAUSync/USyncUser.d.ts +0 -10
  216. package/lib/WAUSync/USyncUser.js +0 -22
  217. package/lib/WAUSync/index.d.ts +0 -3
  218. package/lib/WAUSync/index.js +0 -19
  219. /package/{lib → src}/Defaults/phonenumber-mcc.json +0 -0
  220. /package/{lib → src}/Socket/Client/abstract-socket-client.js +0 -0
  221. /package/{lib → src}/Store/index.js +0 -0
  222. /package/{lib → src}/Store/make-ordered-dictionary.js +0 -0
  223. /package/{lib → src}/Types/Auth.js +0 -0
  224. /package/{lib → src}/Types/Call.js +0 -0
  225. /package/{lib → src}/Types/Chat.js +0 -0
  226. /package/{lib → src}/Types/Contact.js +0 -0
  227. /package/{lib → src}/Types/Events.js +0 -0
  228. /package/{lib → src}/Types/GroupMetadata.js +0 -0
  229. /package/{lib → src}/Types/Label.js +0 -0
  230. /package/{lib → src}/Types/LabelAssociation.js +0 -0
  231. /package/{lib → src}/Types/Message.js +0 -0
  232. /package/{lib → src}/Types/Newsletter.js +0 -0
  233. /package/{lib → src}/Types/Product.js +0 -0
  234. /package/{lib → src}/Types/Signal.js +0 -0
  235. /package/{lib → src}/Types/Socket.js +0 -0
  236. /package/{lib → src}/Types/State.js +0 -0
  237. /package/{lib → src}/Types/index.js +0 -0
  238. /package/{lib → src}/Utils/index.js +0 -0
  239. /package/{lib → src}/Utils/logger.js +0 -0
  240. /package/{lib → src}/Utils/lt-hash.js +0 -0
  241. /package/{lib → src}/Utils/noise-handler.js +0 -0
  242. /package/{lib → src}/WABinary/constants.js +0 -0
  243. /package/{lib → src}/WABinary/decode.js +0 -0
  244. /package/{lib → src}/WABinary/generic-utils.js +0 -0
  245. /package/{lib → src}/WABinary/index.js +0 -0
  246. /package/{lib → src}/WABinary/jid-utils.js +0 -0
  247. /package/{lib → src}/WABinary/types.js +0 -0
  248. /package/{lib → src}/WAM/BinaryInfo.js +0 -0
  249. /package/{lib → src}/WAM/constants.js +0 -0
  250. /package/{lib → src}/WAM/encode.js +0 -0
  251. /package/{lib → src}/WAM/index.js +0 -0
  252. /package/{lib → src}/gifted +0 -0
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Utils_1 = require("../Utils");
7
+ const chat_utils_1 = require("../Utils/chat-utils");
8
+ const logger_1 = __importDefault(require("../Utils/logger"));
9
+ describe('App State Sync Tests', () => {
10
+ const me = { id: randomJid() };
11
+ // case when initial sync is off
12
+ it('should return archive=false event', () => {
13
+ var _a;
14
+ const jid = randomJid();
15
+ const index = ['archive', jid];
16
+ const CASES = [
17
+ [
18
+ {
19
+ index,
20
+ syncAction: {
21
+ value: {
22
+ archiveChatAction: {
23
+ archived: false,
24
+ messageRange: {
25
+ lastMessageTimestamp: (0, Utils_1.unixTimestampSeconds)()
26
+ }
27
+ }
28
+ }
29
+ }
30
+ }
31
+ ],
32
+ [
33
+ {
34
+ index,
35
+ syncAction: {
36
+ value: {
37
+ archiveChatAction: {
38
+ archived: true,
39
+ messageRange: {
40
+ lastMessageTimestamp: (0, Utils_1.unixTimestampSeconds)()
41
+ }
42
+ }
43
+ }
44
+ }
45
+ },
46
+ {
47
+ index,
48
+ syncAction: {
49
+ value: {
50
+ archiveChatAction: {
51
+ archived: false,
52
+ messageRange: {
53
+ lastMessageTimestamp: (0, Utils_1.unixTimestampSeconds)()
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ ]
60
+ ];
61
+ for (const mutations of CASES) {
62
+ const events = (0, chat_utils_1.processSyncAction)(mutations, me, undefined, logger_1.default);
63
+ expect(events['chats.update']).toHaveLength(1);
64
+ const event = (_a = events['chats.update']) === null || _a === void 0 ? void 0 : _a[0];
65
+ expect(event.archive).toEqual(false);
66
+ }
67
+ });
68
+ // case when initial sync is on
69
+ // and unarchiveChats = true
70
+ it('should not fire any archive event', () => {
71
+ var _a;
72
+ const jid = randomJid();
73
+ const index = ['archive', jid];
74
+ const now = (0, Utils_1.unixTimestampSeconds)();
75
+ const CASES = [
76
+ [
77
+ {
78
+ index,
79
+ syncAction: {
80
+ value: {
81
+ archiveChatAction: {
82
+ archived: true,
83
+ messageRange: {
84
+ lastMessageTimestamp: now - 1
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ ],
91
+ [
92
+ {
93
+ index,
94
+ syncAction: {
95
+ value: {
96
+ archiveChatAction: {
97
+ archived: false,
98
+ messageRange: {
99
+ lastMessageTimestamp: now + 10
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ ],
106
+ [
107
+ {
108
+ index,
109
+ syncAction: {
110
+ value: {
111
+ archiveChatAction: {
112
+ archived: true,
113
+ messageRange: {
114
+ lastMessageTimestamp: now + 10
115
+ }
116
+ }
117
+ }
118
+ }
119
+ },
120
+ {
121
+ index,
122
+ syncAction: {
123
+ value: {
124
+ archiveChatAction: {
125
+ archived: false,
126
+ messageRange: {
127
+ lastMessageTimestamp: now + 11
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ ],
134
+ ];
135
+ const ctx = {
136
+ recvChats: {
137
+ [jid]: { lastMsgRecvTimestamp: now }
138
+ },
139
+ accountSettings: { unarchiveChats: true }
140
+ };
141
+ for (const mutations of CASES) {
142
+ const events = processSyncActions(mutations, me, ctx, logger_1.default);
143
+ expect((_a = events['chats.update']) === null || _a === void 0 ? void 0 : _a.length).toBeFalsy();
144
+ }
145
+ });
146
+ // case when initial sync is on
147
+ // with unarchiveChats = true & unarchiveChats = false
148
+ it('should fire archive=true events', () => {
149
+ var _a;
150
+ const jid = randomJid();
151
+ const index = ['archive', jid];
152
+ const now = (0, Utils_1.unixTimestampSeconds)();
153
+ const CASES = [
154
+ {
155
+ settings: { unarchiveChats: true },
156
+ mutations: [
157
+ {
158
+ index,
159
+ syncAction: {
160
+ value: {
161
+ archiveChatAction: {
162
+ archived: true,
163
+ messageRange: {
164
+ lastMessageTimestamp: now
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ ],
171
+ },
172
+ {
173
+ settings: { unarchiveChats: false },
174
+ mutations: [
175
+ {
176
+ index,
177
+ syncAction: {
178
+ value: {
179
+ archiveChatAction: {
180
+ archived: true,
181
+ messageRange: {
182
+ lastMessageTimestamp: now - 10
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ ],
189
+ }
190
+ ];
191
+ for (const { mutations, settings } of CASES) {
192
+ const ctx = {
193
+ recvChats: {
194
+ [jid]: { lastMsgRecvTimestamp: now }
195
+ },
196
+ accountSettings: settings
197
+ };
198
+ const events = processSyncActions(mutations, me, ctx, logger_1.default);
199
+ expect(events['chats.update']).toHaveLength(1);
200
+ const event = (_a = events['chats.update']) === null || _a === void 0 ? void 0 : _a[0];
201
+ expect(event.archive).toEqual(true);
202
+ }
203
+ });
204
+ });
@@ -0,0 +1,207 @@
1
+ import { AccountSettings, ChatMutation, Contact, InitialAppStateSyncOptions } from '../Types'
2
+ import { unixTimestampSeconds } from '../Utils'
3
+ import { processSyncAction } from '../Utils/chat-utils'
4
+ import logger from '../Utils/logger'
5
+
6
+ describe('App State Sync Tests', () => {
7
+
8
+ const me: Contact = { id: randomJid() }
9
+ // case when initial sync is off
10
+ it('should return archive=false event', () => {
11
+ const jid = randomJid()
12
+ const index = ['archive', jid]
13
+
14
+ const CASES: ChatMutation[][] = [
15
+ [
16
+ {
17
+ index,
18
+ syncAction: {
19
+ value: {
20
+ archiveChatAction: {
21
+ archived: false,
22
+ messageRange: {
23
+ lastMessageTimestamp: unixTimestampSeconds()
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
29
+ ],
30
+ [
31
+ {
32
+ index,
33
+ syncAction: {
34
+ value: {
35
+ archiveChatAction: {
36
+ archived: true,
37
+ messageRange: {
38
+ lastMessageTimestamp: unixTimestampSeconds()
39
+ }
40
+ }
41
+ }
42
+ }
43
+ },
44
+ {
45
+ index,
46
+ syncAction: {
47
+ value: {
48
+ archiveChatAction: {
49
+ archived: false,
50
+ messageRange: {
51
+ lastMessageTimestamp: unixTimestampSeconds()
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ ]
58
+ ]
59
+
60
+ for(const mutations of CASES) {
61
+ const events = processSyncAction(mutations, me, undefined, logger)
62
+ expect(events['chats.update']).toHaveLength(1)
63
+ const event = events['chats.update']?.[0]
64
+ expect(event.archive).toEqual(false)
65
+ }
66
+ })
67
+ // case when initial sync is on
68
+ // and unarchiveChats = true
69
+ it('should not fire any archive event', () => {
70
+ const jid = randomJid()
71
+ const index = ['archive', jid]
72
+ const now = unixTimestampSeconds()
73
+
74
+ const CASES: ChatMutation[][] = [
75
+ [
76
+ {
77
+ index,
78
+ syncAction: {
79
+ value: {
80
+ archiveChatAction: {
81
+ archived: true,
82
+ messageRange: {
83
+ lastMessageTimestamp: now - 1
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ],
90
+ [
91
+ {
92
+ index,
93
+ syncAction: {
94
+ value: {
95
+ archiveChatAction: {
96
+ archived: false,
97
+ messageRange: {
98
+ lastMessageTimestamp: now + 10
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ ],
105
+ [
106
+ {
107
+ index,
108
+ syncAction: {
109
+ value: {
110
+ archiveChatAction: {
111
+ archived: true,
112
+ messageRange: {
113
+ lastMessageTimestamp: now + 10
114
+ }
115
+ }
116
+ }
117
+ }
118
+ },
119
+ {
120
+ index,
121
+ syncAction: {
122
+ value: {
123
+ archiveChatAction: {
124
+ archived: false,
125
+ messageRange: {
126
+ lastMessageTimestamp: now + 11
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ ],
133
+ ]
134
+
135
+ const ctx: InitialAppStateSyncOptions = {
136
+ recvChats: {
137
+ [jid]: { lastMsgRecvTimestamp: now }
138
+ },
139
+ accountSettings: { unarchiveChats: true }
140
+ }
141
+
142
+ for(const mutations of CASES) {
143
+ const events = processSyncActions(mutations, me, ctx, logger)
144
+ expect(events['chats.update']?.length).toBeFalsy()
145
+ }
146
+ })
147
+
148
+ // case when initial sync is on
149
+ // with unarchiveChats = true & unarchiveChats = false
150
+ it('should fire archive=true events', () => {
151
+ const jid = randomJid()
152
+ const index = ['archive', jid]
153
+ const now = unixTimestampSeconds()
154
+
155
+ const CASES: { settings: AccountSettings, mutations: ChatMutation[] }[] = [
156
+ {
157
+ settings: { unarchiveChats: true },
158
+ mutations: [
159
+ {
160
+ index,
161
+ syncAction: {
162
+ value: {
163
+ archiveChatAction: {
164
+ archived: true,
165
+ messageRange: {
166
+ lastMessageTimestamp: now
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ ],
173
+ },
174
+ {
175
+ settings: { unarchiveChats: false },
176
+ mutations: [
177
+ {
178
+ index,
179
+ syncAction: {
180
+ value: {
181
+ archiveChatAction: {
182
+ archived: true,
183
+ messageRange: {
184
+ lastMessageTimestamp: now - 10
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ ],
191
+ }
192
+ ]
193
+
194
+ for(const { mutations, settings } of CASES) {
195
+ const ctx: InitialAppStateSyncOptions = {
196
+ recvChats: {
197
+ [jid]: { lastMsgRecvTimestamp: now }
198
+ },
199
+ accountSettings: settings
200
+ }
201
+ const events = processSyncActions(mutations, me, ctx, logger)
202
+ expect(events['chats.update']).toHaveLength(1)
203
+ const event = events['chats.update']?.[0]
204
+ expect(event.archive).toEqual(true)
205
+ }
206
+ })
207
+ })
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const WAProto_1 = require("../../WAProto");
16
+ const Types_1 = require("../Types");
17
+ const Utils_1 = require("../Utils");
18
+ const logger_1 = __importDefault(require("../Utils/logger"));
19
+ const utils_1 = require("./utils");
20
+ describe('Event Buffer Tests', () => {
21
+ let ev;
22
+ beforeEach(() => {
23
+ const _logger = logger_1.default.child({});
24
+ _logger.level = 'trace';
25
+ ev = (0, Utils_1.makeEventBuffer)(_logger);
26
+ });
27
+ it('should buffer a chat upsert & update event', () => __awaiter(void 0, void 0, void 0, function* () {
28
+ const chatId = (0, utils_1.randomJid)();
29
+ const chats = [];
30
+ ev.on('chats.upsert', c => chats.push(...c));
31
+ ev.on('chats.update', () => fail('should not emit update event'));
32
+ ev.buffer();
33
+ yield Promise.all([
34
+ (() => __awaiter(void 0, void 0, void 0, function* () {
35
+ ev.buffer();
36
+ yield (0, Utils_1.delay)(100);
37
+ ev.emit('chats.upsert', [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }]);
38
+ const flushed = ev.flush();
39
+ expect(flushed).toBeFalsy();
40
+ }))(),
41
+ (() => __awaiter(void 0, void 0, void 0, function* () {
42
+ ev.buffer();
43
+ yield (0, Utils_1.delay)(200);
44
+ ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 124, unreadCount: 1 }]);
45
+ const flushed = ev.flush();
46
+ expect(flushed).toBeFalsy();
47
+ }))()
48
+ ]);
49
+ const flushed = ev.flush();
50
+ expect(flushed).toBeTruthy();
51
+ expect(chats).toHaveLength(1);
52
+ expect(chats[0].conversationTimestamp).toEqual(124);
53
+ expect(chats[0].unreadCount).toEqual(2);
54
+ }));
55
+ it('should overwrite a chats.delete event', () => __awaiter(void 0, void 0, void 0, function* () {
56
+ const chatId = (0, utils_1.randomJid)();
57
+ const chats = [];
58
+ ev.on('chats.update', c => chats.push(...c));
59
+ ev.on('chats.delete', () => fail('not should have emitted'));
60
+ ev.buffer();
61
+ ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }]);
62
+ ev.emit('chats.delete', [chatId]);
63
+ ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 124, unreadCount: 1 }]);
64
+ ev.flush();
65
+ expect(chats).toHaveLength(1);
66
+ }));
67
+ it('should overwrite a chats.update event', () => __awaiter(void 0, void 0, void 0, function* () {
68
+ const chatId = (0, utils_1.randomJid)();
69
+ const chatsDeleted = [];
70
+ ev.on('chats.delete', c => chatsDeleted.push(...c));
71
+ ev.on('chats.update', () => fail('not should have emitted'));
72
+ ev.buffer();
73
+ ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }]);
74
+ ev.emit('chats.delete', [chatId]);
75
+ ev.flush();
76
+ expect(chatsDeleted).toHaveLength(1);
77
+ }));
78
+ it('should release a conditional update at the right time', () => __awaiter(void 0, void 0, void 0, function* () {
79
+ const chatId = (0, utils_1.randomJid)();
80
+ const chatId2 = (0, utils_1.randomJid)();
81
+ const chatsUpserted = [];
82
+ const chatsSynced = [];
83
+ ev.on('chats.upsert', c => chatsUpserted.push(...c));
84
+ ev.on('messaging-history.set', c => chatsSynced.push(...c.chats));
85
+ ev.on('chats.update', () => fail('not should have emitted'));
86
+ ev.buffer();
87
+ ev.emit('chats.update', [{
88
+ id: chatId,
89
+ archived: true,
90
+ conditional(buff) {
91
+ if (buff.chatUpserts[chatId]) {
92
+ return true;
93
+ }
94
+ }
95
+ }]);
96
+ ev.emit('chats.update', [{
97
+ id: chatId2,
98
+ archived: true,
99
+ conditional(buff) {
100
+ if (buff.historySets.chats[chatId2]) {
101
+ return true;
102
+ }
103
+ }
104
+ }]);
105
+ ev.flush();
106
+ ev.buffer();
107
+ ev.emit('chats.upsert', [{
108
+ id: chatId,
109
+ conversationTimestamp: 123,
110
+ unreadCount: 1,
111
+ muteEndTime: 123
112
+ }]);
113
+ ev.emit('messaging-history.set', {
114
+ chats: [{
115
+ id: chatId2,
116
+ conversationTimestamp: 123,
117
+ unreadCount: 1,
118
+ muteEndTime: 123
119
+ }],
120
+ contacts: [],
121
+ messages: [],
122
+ isLatest: false
123
+ });
124
+ ev.flush();
125
+ expect(chatsUpserted).toHaveLength(1);
126
+ expect(chatsUpserted[0].id).toEqual(chatId);
127
+ expect(chatsUpserted[0].archived).toEqual(true);
128
+ expect(chatsUpserted[0].muteEndTime).toEqual(123);
129
+ expect(chatsSynced).toHaveLength(1);
130
+ expect(chatsSynced[0].id).toEqual(chatId2);
131
+ expect(chatsSynced[0].archived).toEqual(true);
132
+ }));
133
+ it('should discard a conditional update', () => __awaiter(void 0, void 0, void 0, function* () {
134
+ const chatId = (0, utils_1.randomJid)();
135
+ const chatsUpserted = [];
136
+ ev.on('chats.upsert', c => chatsUpserted.push(...c));
137
+ ev.on('chats.update', () => fail('not should have emitted'));
138
+ ev.buffer();
139
+ ev.emit('chats.update', [{
140
+ id: chatId,
141
+ archived: true,
142
+ conditional(buff) {
143
+ if (buff.chatUpserts[chatId]) {
144
+ return false;
145
+ }
146
+ }
147
+ }]);
148
+ ev.emit('chats.upsert', [{
149
+ id: chatId,
150
+ conversationTimestamp: 123,
151
+ unreadCount: 1,
152
+ muteEndTime: 123
153
+ }]);
154
+ ev.flush();
155
+ expect(chatsUpserted).toHaveLength(1);
156
+ expect(chatsUpserted[0].archived).toBeUndefined();
157
+ }));
158
+ it('should overwrite a chats.update event with a history event', () => __awaiter(void 0, void 0, void 0, function* () {
159
+ const chatId = (0, utils_1.randomJid)();
160
+ let chatRecv;
161
+ ev.on('messaging-history.set', ({ chats }) => {
162
+ chatRecv = chats[0];
163
+ });
164
+ ev.on('chats.update', () => fail('not should have emitted'));
165
+ ev.buffer();
166
+ ev.emit('messaging-history.set', {
167
+ chats: [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }],
168
+ messages: [],
169
+ contacts: [],
170
+ isLatest: true
171
+ });
172
+ ev.emit('chats.update', [{ id: chatId, archived: true }]);
173
+ ev.flush();
174
+ expect(chatRecv).toBeDefined();
175
+ expect(chatRecv === null || chatRecv === void 0 ? void 0 : chatRecv.archived).toBeTruthy();
176
+ }));
177
+ it('should buffer message upsert events', () => __awaiter(void 0, void 0, void 0, function* () {
178
+ const messageTimestamp = (0, Utils_1.unixTimestampSeconds)();
179
+ const msg = {
180
+ key: {
181
+ remoteJid: (0, utils_1.randomJid)(),
182
+ id: (0, Utils_1.generateMessageID)(),
183
+ fromMe: false
184
+ },
185
+ messageStubType: Types_1.WAMessageStubType.CIPHERTEXT,
186
+ messageTimestamp
187
+ };
188
+ const msgs = [];
189
+ ev.on('messages.upsert', c => {
190
+ msgs.push(...c.messages);
191
+ expect(c.type).toEqual('notify');
192
+ });
193
+ ev.buffer();
194
+ ev.emit('messages.upsert', { messages: [WAProto_1.proto.WebMessageInfo.fromObject(msg)], type: 'notify' });
195
+ msg.messageTimestamp = (0, Utils_1.unixTimestampSeconds)() + 1;
196
+ msg.messageStubType = undefined;
197
+ msg.message = { conversation: 'Test' };
198
+ ev.emit('messages.upsert', { messages: [WAProto_1.proto.WebMessageInfo.fromObject(msg)], type: 'notify' });
199
+ ev.emit('messages.update', [{ key: msg.key, update: { status: Types_1.WAMessageStatus.READ } }]);
200
+ ev.flush();
201
+ expect(msgs).toHaveLength(1);
202
+ expect(msgs[0].message).toBeTruthy();
203
+ expect((0, Utils_1.toNumber)(msgs[0].messageTimestamp)).toEqual(messageTimestamp);
204
+ expect(msgs[0].status).toEqual(Types_1.WAMessageStatus.READ);
205
+ }));
206
+ it('should buffer a message receipt update', () => __awaiter(void 0, void 0, void 0, function* () {
207
+ const msg = {
208
+ key: {
209
+ remoteJid: (0, utils_1.randomJid)(),
210
+ id: (0, Utils_1.generateMessageID)(),
211
+ fromMe: false
212
+ },
213
+ messageStubType: Types_1.WAMessageStubType.CIPHERTEXT,
214
+ messageTimestamp: (0, Utils_1.unixTimestampSeconds)()
215
+ };
216
+ const msgs = [];
217
+ ev.on('messages.upsert', c => msgs.push(...c.messages));
218
+ ev.on('message-receipt.update', () => fail('should not emit'));
219
+ ev.buffer();
220
+ ev.emit('messages.upsert', { messages: [WAProto_1.proto.WebMessageInfo.fromObject(msg)], type: 'notify' });
221
+ ev.emit('message-receipt.update', [
222
+ {
223
+ key: msg.key,
224
+ receipt: {
225
+ userJid: (0, utils_1.randomJid)(),
226
+ readTimestamp: (0, Utils_1.unixTimestampSeconds)()
227
+ }
228
+ }
229
+ ]);
230
+ ev.flush();
231
+ expect(msgs).toHaveLength(1);
232
+ expect(msgs[0].userReceipt).toHaveLength(1);
233
+ }));
234
+ it('should buffer multiple status updates', () => __awaiter(void 0, void 0, void 0, function* () {
235
+ const key = {
236
+ remoteJid: (0, utils_1.randomJid)(),
237
+ id: (0, Utils_1.generateMessageID)(),
238
+ fromMe: false
239
+ };
240
+ const msgs = [];
241
+ ev.on('messages.update', c => msgs.push(...c));
242
+ ev.buffer();
243
+ ev.emit('messages.update', [{ key, update: { status: Types_1.WAMessageStatus.DELIVERY_ACK } }]);
244
+ ev.emit('messages.update', [{ key, update: { status: Types_1.WAMessageStatus.READ } }]);
245
+ ev.flush();
246
+ expect(msgs).toHaveLength(1);
247
+ expect(msgs[0].update.status).toEqual(Types_1.WAMessageStatus.READ);
248
+ }));
249
+ it('should remove chat unread counter', () => __awaiter(void 0, void 0, void 0, function* () {
250
+ const msg = {
251
+ key: {
252
+ remoteJid: '12345@s.whatsapp.net',
253
+ id: (0, Utils_1.generateMessageID)(),
254
+ fromMe: false
255
+ },
256
+ message: {
257
+ conversation: 'abcd'
258
+ },
259
+ messageTimestamp: (0, Utils_1.unixTimestampSeconds)()
260
+ };
261
+ const chats = [];
262
+ ev.on('chats.update', c => chats.push(...c));
263
+ ev.buffer();
264
+ ev.emit('messages.upsert', { messages: [WAProto_1.proto.WebMessageInfo.fromObject(msg)], type: 'notify' });
265
+ ev.emit('chats.update', [{ id: msg.key.remoteJid, unreadCount: 1, conversationTimestamp: msg.messageTimestamp }]);
266
+ ev.emit('messages.update', [{ key: msg.key, update: { status: Types_1.WAMessageStatus.READ } }]);
267
+ ev.flush();
268
+ expect(chats[0].unreadCount).toBeUndefined();
269
+ }));
270
+ });