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,186 @@
1
+ import { makeLibSignalRepository } from '../Signal/libsignal'
2
+ import { SignalAuthState, SignalDataTypeMap } from '../Types'
3
+ import { Curve, generateRegistrationId, generateSignalPubKey, signedKeyPair } from '../Utils'
4
+
5
+ describe('Signal Tests', () => {
6
+
7
+ it('should correctly encrypt/decrypt 1 message', async() => {
8
+ const user1 = makeUser()
9
+ const user2 = makeUser()
10
+
11
+ const msg = Buffer.from('hello there!')
12
+
13
+ await prepareForSendingMessage(user1, user2)
14
+
15
+ const result = await user1.repository.encryptMessage(
16
+ { jid: user2.jid, data: msg }
17
+ )
18
+
19
+ const dec = await user2.repository.decryptMessage(
20
+ { jid: user1.jid, ...result }
21
+ )
22
+
23
+ expect(dec).toEqual(msg)
24
+ })
25
+
26
+ it('should correctly override a session', async() => {
27
+ const user1 = makeUser()
28
+ const user2 = makeUser()
29
+
30
+ const msg = Buffer.from('hello there!')
31
+
32
+ for(let preKeyId = 2; preKeyId <= 3;preKeyId++) {
33
+ await prepareForSendingMessage(user1, user2, preKeyId)
34
+
35
+ const result = await user1.repository.encryptMessage(
36
+ { jid: user2.jid, data: msg }
37
+ )
38
+
39
+ const dec = await user2.repository.decryptMessage(
40
+ { jid: user1.jid, ...result }
41
+ )
42
+
43
+ expect(dec).toEqual(msg)
44
+ }
45
+ })
46
+
47
+ it('should correctly encrypt/decrypt multiple messages', async() => {
48
+ const user1 = makeUser()
49
+ const user2 = makeUser()
50
+
51
+ const msg = Buffer.from('hello there!')
52
+
53
+ await prepareForSendingMessage(user1, user2)
54
+
55
+ for(let i = 0;i < 10;i++) {
56
+ const result = await user1.repository.encryptMessage(
57
+ { jid: user2.jid, data: msg }
58
+ )
59
+
60
+ const dec = await user2.repository.decryptMessage(
61
+ { jid: user1.jid, ...result }
62
+ )
63
+
64
+ expect(dec).toEqual(msg)
65
+ }
66
+ })
67
+
68
+ it('should encrypt/decrypt messages from group', async() => {
69
+ const groupId = '123456@g.us'
70
+ const participants = [...Array(5)].map(makeUser)
71
+
72
+ const msg = Buffer.from('hello there!')
73
+
74
+ const sender = participants[0]
75
+ const enc = await sender.repository.encryptGroupMessage(
76
+ {
77
+ group: groupId,
78
+ meId: sender.jid,
79
+ data: msg
80
+ }
81
+ )
82
+
83
+ for(const participant of participants) {
84
+ if(participant === sender) {
85
+ continue
86
+ }
87
+
88
+ await participant.repository.processSenderKeyDistributionMessage(
89
+ {
90
+ item: {
91
+ groupId,
92
+ axolotlSenderKeyDistributionMessage: enc.senderKeyDistributionMessage
93
+ },
94
+ authorJid: sender.jid
95
+ }
96
+ )
97
+
98
+ const dec = await participant.repository.decryptGroupMessage(
99
+ {
100
+ group: groupId,
101
+ authorJid: sender.jid,
102
+ msg: enc.ciphertext
103
+ }
104
+ )
105
+ expect(dec).toEqual(msg)
106
+ }
107
+ })
108
+ })
109
+
110
+ type User = ReturnType<typeof makeUser>
111
+
112
+ function makeUser() {
113
+ const store = makeTestAuthState()
114
+ const jid = `${Math.random().toString().replace('.', '')}@s.whatsapp.net`
115
+ const repository = makeLibSignalRepository(store)
116
+ return { store, jid, repository }
117
+ }
118
+
119
+ async function prepareForSendingMessage(
120
+ sender: User,
121
+ receiver: User,
122
+ preKeyId = 2
123
+ ) {
124
+ const preKey = Curve.generateKeyPair()
125
+ await sender.repository.injectE2ESession(
126
+ {
127
+ jid: receiver.jid,
128
+ session: {
129
+ registrationId: receiver.store.creds.registrationId,
130
+ identityKey: generateSignalPubKey(receiver.store.creds.signedIdentityKey.public),
131
+ signedPreKey: {
132
+ keyId: receiver.store.creds.signedPreKey.keyId,
133
+ publicKey: generateSignalPubKey(receiver.store.creds.signedPreKey.keyPair.public),
134
+ signature: receiver.store.creds.signedPreKey.signature,
135
+ },
136
+ preKey: {
137
+ keyId: preKeyId,
138
+ publicKey: generateSignalPubKey(preKey.public),
139
+ }
140
+ }
141
+ }
142
+ )
143
+
144
+ await receiver.store.keys.set({
145
+ 'pre-key': {
146
+ [preKeyId]: preKey
147
+ }
148
+ })
149
+ }
150
+
151
+ function makeTestAuthState(): SignalAuthState {
152
+ const identityKey = Curve.generateKeyPair()
153
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
+ const store: { [_: string]: any } = {}
155
+ return {
156
+ creds: {
157
+ signedIdentityKey: identityKey,
158
+ registrationId: generateRegistrationId(),
159
+ signedPreKey: signedKeyPair(identityKey, 1),
160
+ },
161
+ keys: {
162
+ get(type, ids) {
163
+ const data: { [_: string]: SignalDataTypeMap[typeof type] } = { }
164
+ for(const id of ids) {
165
+ const item = store[getUniqueId(type, id)]
166
+ if(typeof item !== 'undefined') {
167
+ data[id] = item
168
+ }
169
+ }
170
+
171
+ return data
172
+ },
173
+ set(data) {
174
+ for(const type in data) {
175
+ for(const id in data[type]) {
176
+ store[getUniqueId(type, id)] = data[type][id]
177
+ }
178
+ }
179
+ },
180
+ }
181
+ }
182
+
183
+ function getUniqueId(type: string, id: string) {
184
+ return `${type}.${id}`
185
+ }
186
+ }
@@ -0,0 +1,93 @@
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 __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ const fs_1 = require("fs");
20
+ const WAProto_1 = require("../../WAProto");
21
+ const Utils_1 = require("../Utils");
22
+ jest.setTimeout(20000);
23
+ const TEST_VECTORS = [
24
+ {
25
+ type: 'image',
26
+ message: WAProto_1.proto.Message.ImageMessage.decode(Buffer.from('Ck1odHRwczovL21tZy53aGF0c2FwcC5uZXQvZC9mL0FwaHR4WG9fWXZZcDZlUVNSa0tjOHE5d2ozVUpleWdoY3poM3ExX3I0ektnLmVuYxIKaW1hZ2UvanBlZyIgKTuVFyxDc6mTm4GXPlO3Z911Wd8RBeTrPLSWAEdqW8MomcUBQiB7wH5a4nXMKyLOT0A2nFgnnM/DUH8YjQf8QtkCIekaSkogTB+BXKCWDFrmNzozY0DCPn0L4VKd7yG1ZbZwbgRhzVc=', 'base64')),
27
+ plaintext: (0, fs_1.readFileSync)('./Media/cat.jpeg')
28
+ },
29
+ {
30
+ type: 'image',
31
+ message: WAProto_1.proto.Message.ImageMessage.decode(Buffer.from('Ck1odHRwczovL21tZy53aGF0c2FwcC5uZXQvZC9mL0Ftb2tnWkphNWF6QWZxa3dVRzc0eUNUdTlGeWpjMmd5akpqcXNmMUFpZEU5LmVuYxIKaW1hZ2UvanBlZyIg8IS5TQzdzcuvcR7F8HMhWnXmlsV+GOo9JE1/t2k+o9Yoz6o6QiA7kDk8j5KOEQC0kDFE1qW7lBBDYhm5z06N3SirfUj3CUog/CjYF8e670D5wUJwWv2B2mKzDEo8IJLStDv76YmtPfs=', 'base64')),
32
+ plaintext: (0, fs_1.readFileSync)('./Media/icon.png')
33
+ },
34
+ ];
35
+ describe('Media Download Tests', () => {
36
+ it('should download a full encrypted media correctly', () => __awaiter(void 0, void 0, void 0, function* () {
37
+ var _a, e_1, _b, _c;
38
+ for (const { type, message, plaintext } of TEST_VECTORS) {
39
+ const readPipe = yield (0, Utils_1.downloadContentFromMessage)(message, type);
40
+ let buffer = Buffer.alloc(0);
41
+ try {
42
+ for (var _d = true, readPipe_1 = (e_1 = void 0, __asyncValues(readPipe)), readPipe_1_1; readPipe_1_1 = yield readPipe_1.next(), _a = readPipe_1_1.done, !_a; _d = true) {
43
+ _c = readPipe_1_1.value;
44
+ _d = false;
45
+ const read = _c;
46
+ buffer = Buffer.concat([buffer, read]);
47
+ }
48
+ }
49
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
50
+ finally {
51
+ try {
52
+ if (!_d && !_a && (_b = readPipe_1.return)) yield _b.call(readPipe_1);
53
+ }
54
+ finally { if (e_1) throw e_1.error; }
55
+ }
56
+ expect(buffer).toEqual(plaintext);
57
+ }
58
+ }));
59
+ it('should download an encrypted media correctly piece', () => __awaiter(void 0, void 0, void 0, function* () {
60
+ var _a, e_2, _b, _c;
61
+ for (const { type, message, plaintext } of TEST_VECTORS) {
62
+ // check all edge cases
63
+ const ranges = [
64
+ { startByte: 51, endByte: plaintext.length - 100 }, // random numbers
65
+ { startByte: 1024, endByte: 2038 }, // larger random multiples of 16
66
+ { startByte: 1, endByte: plaintext.length - 1 } // borders
67
+ ];
68
+ for (const range of ranges) {
69
+ const readPipe = yield (0, Utils_1.downloadContentFromMessage)(message, type, range);
70
+ let buffer = Buffer.alloc(0);
71
+ try {
72
+ for (var _d = true, readPipe_2 = (e_2 = void 0, __asyncValues(readPipe)), readPipe_2_1; readPipe_2_1 = yield readPipe_2.next(), _a = readPipe_2_1.done, !_a; _d = true) {
73
+ _c = readPipe_2_1.value;
74
+ _d = false;
75
+ const read = _c;
76
+ buffer = Buffer.concat([buffer, read]);
77
+ }
78
+ }
79
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
80
+ finally {
81
+ try {
82
+ if (!_d && !_a && (_b = readPipe_2.return)) yield _b.call(readPipe_2);
83
+ }
84
+ finally { if (e_2) throw e_2.error; }
85
+ }
86
+ const hex = buffer.toString('hex');
87
+ const expectedHex = plaintext.slice(range.startByte || 0, range.endByte || undefined).toString('hex');
88
+ expect(hex).toBe(expectedHex);
89
+ console.log('success on ', range);
90
+ }
91
+ }
92
+ }));
93
+ });
@@ -0,0 +1,76 @@
1
+ import { readFileSync } from 'fs'
2
+ import { proto } from '../../WAProto'
3
+ import { DownloadableMessage, MediaType } from '../Types'
4
+ import { downloadContentFromMessage } from '../Utils'
5
+
6
+ jest.setTimeout(20_000)
7
+
8
+ type TestVector = {
9
+ type: MediaType
10
+ message: DownloadableMessage
11
+ plaintext: Buffer
12
+ }
13
+
14
+ const TEST_VECTORS: TestVector[] = [
15
+ {
16
+ type: 'image',
17
+ message: proto.Message.ImageMessage.decode(
18
+ Buffer.from(
19
+ 'Ck1odHRwczovL21tZy53aGF0c2FwcC5uZXQvZC9mL0FwaHR4WG9fWXZZcDZlUVNSa0tjOHE5d2ozVUpleWdoY3poM3ExX3I0ektnLmVuYxIKaW1hZ2UvanBlZyIgKTuVFyxDc6mTm4GXPlO3Z911Wd8RBeTrPLSWAEdqW8MomcUBQiB7wH5a4nXMKyLOT0A2nFgnnM/DUH8YjQf8QtkCIekaSkogTB+BXKCWDFrmNzozY0DCPn0L4VKd7yG1ZbZwbgRhzVc=',
20
+ 'base64'
21
+ )
22
+ ),
23
+ plaintext: readFileSync('./Media/cat.jpeg')
24
+ },
25
+ {
26
+ type: 'image',
27
+ message: proto.Message.ImageMessage.decode(
28
+ Buffer.from(
29
+ 'Ck1odHRwczovL21tZy53aGF0c2FwcC5uZXQvZC9mL0Ftb2tnWkphNWF6QWZxa3dVRzc0eUNUdTlGeWpjMmd5akpqcXNmMUFpZEU5LmVuYxIKaW1hZ2UvanBlZyIg8IS5TQzdzcuvcR7F8HMhWnXmlsV+GOo9JE1/t2k+o9Yoz6o6QiA7kDk8j5KOEQC0kDFE1qW7lBBDYhm5z06N3SirfUj3CUog/CjYF8e670D5wUJwWv2B2mKzDEo8IJLStDv76YmtPfs=',
30
+ 'base64'
31
+ )
32
+ ),
33
+ plaintext: readFileSync('./Media/icon.png')
34
+ },
35
+ ]
36
+
37
+ describe('Media Download Tests', () => {
38
+
39
+ it('should download a full encrypted media correctly', async() => {
40
+ for(const { type, message, plaintext } of TEST_VECTORS) {
41
+ const readPipe = await downloadContentFromMessage(message, type)
42
+
43
+ let buffer = Buffer.alloc(0)
44
+ for await (const read of readPipe) {
45
+ buffer = Buffer.concat([ buffer, read ])
46
+ }
47
+
48
+ expect(buffer).toEqual(plaintext)
49
+ }
50
+ })
51
+
52
+ it('should download an encrypted media correctly piece', async() => {
53
+ for(const { type, message, plaintext } of TEST_VECTORS) {
54
+ // check all edge cases
55
+ const ranges = [
56
+ { startByte: 51, endByte: plaintext.length - 100 }, // random numbers
57
+ { startByte: 1024, endByte: 2038 }, // larger random multiples of 16
58
+ { startByte: 1, endByte: plaintext.length - 1 } // borders
59
+ ]
60
+ for(const range of ranges) {
61
+ const readPipe = await downloadContentFromMessage(message, type, range)
62
+
63
+ let buffer = Buffer.alloc(0)
64
+ for await (const read of readPipe) {
65
+ buffer = Buffer.concat([ buffer, read ])
66
+ }
67
+
68
+ const hex = buffer.toString('hex')
69
+ const expectedHex = plaintext.slice(range.startByte || 0, range.endByte || undefined).toString('hex')
70
+ expect(hex).toBe(expectedHex)
71
+
72
+ console.log('success on ', range)
73
+ }
74
+ }
75
+ })
76
+ })
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Utils_1 = require("../Utils");
4
+ describe('Messages Tests', () => {
5
+ it('should correctly unwrap messages', () => {
6
+ const CONTENT = { imageMessage: {} };
7
+ expectRightContent(CONTENT);
8
+ expectRightContent({
9
+ ephemeralMessage: { message: CONTENT }
10
+ });
11
+ expectRightContent({
12
+ viewOnceMessage: {
13
+ message: {
14
+ ephemeralMessage: { message: CONTENT }
15
+ }
16
+ }
17
+ });
18
+ expectRightContent({
19
+ viewOnceMessage: {
20
+ message: {
21
+ viewOnceMessageV2: {
22
+ message: {
23
+ ephemeralMessage: { message: CONTENT }
24
+ }
25
+ }
26
+ }
27
+ }
28
+ });
29
+ function expectRightContent(content) {
30
+ expect((0, Utils_1.normalizeMessageContent)(content)).toHaveProperty('imageMessage');
31
+ }
32
+ });
33
+ });
@@ -0,0 +1,37 @@
1
+ import { WAMessageContent } from '../Types'
2
+ import { normalizeMessageContent } from '../Utils'
3
+
4
+ describe('Messages Tests', () => {
5
+
6
+ it('should correctly unwrap messages', () => {
7
+ const CONTENT = { imageMessage: { } }
8
+ expectRightContent(CONTENT)
9
+ expectRightContent({
10
+ ephemeralMessage: { message: CONTENT }
11
+ })
12
+ expectRightContent({
13
+ viewOnceMessage: {
14
+ message: {
15
+ ephemeralMessage: { message: CONTENT }
16
+ }
17
+ }
18
+ })
19
+ expectRightContent({
20
+ viewOnceMessage: {
21
+ message: {
22
+ viewOnceMessageV2: {
23
+ message: {
24
+ ephemeralMessage: { message: CONTENT }
25
+ }
26
+ }
27
+ }
28
+ }
29
+ })
30
+
31
+ function expectRightContent(content: WAMessageContent) {
32
+ expect(
33
+ normalizeMessageContent(content)
34
+ ).toHaveProperty('imageMessage')
35
+ }
36
+ })
37
+ })
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.randomJid = randomJid;
4
+ exports.makeMockSignalKeyStore = makeMockSignalKeyStore;
5
+ const WABinary_1 = require("../WABinary");
6
+ function randomJid() {
7
+ return (0, WABinary_1.jidEncode)(Math.floor(Math.random() * 1000000), Math.random() < 0.5 ? 's.whatsapp.net' : 'g.us');
8
+ }
9
+ function makeMockSignalKeyStore() {
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ const store = {};
12
+ return {
13
+ get(type, ids) {
14
+ const data = {};
15
+ for (const id of ids) {
16
+ const item = store[getUniqueId(type, id)];
17
+ if (typeof item !== 'undefined') {
18
+ data[id] = item;
19
+ }
20
+ }
21
+ return data;
22
+ },
23
+ set(data) {
24
+ for (const type in data) {
25
+ for (const id in data[type]) {
26
+ store[getUniqueId(type, id)] = data[type][id];
27
+ }
28
+ }
29
+ },
30
+ };
31
+ function getUniqueId(type, id) {
32
+ return `${type}.${id}`;
33
+ }
34
+ }
@@ -0,0 +1,36 @@
1
+ import { SignalDataTypeMap, SignalKeyStore } from '../Types'
2
+ import { jidEncode } from '../WABinary'
3
+
4
+ export function randomJid() {
5
+ return jidEncode(Math.floor(Math.random() * 1000000), Math.random() < 0.5 ? 's.whatsapp.net' : 'g.us')
6
+ }
7
+
8
+ export function makeMockSignalKeyStore(): SignalKeyStore {
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ const store: { [_: string]: any } = {}
11
+
12
+ return {
13
+ get(type, ids) {
14
+ const data: { [_: string]: SignalDataTypeMap[typeof type] } = { }
15
+ for(const id of ids) {
16
+ const item = store[getUniqueId(type, id)]
17
+ if(typeof item !== 'undefined') {
18
+ data[id] = item
19
+ }
20
+ }
21
+
22
+ return data
23
+ },
24
+ set(data) {
25
+ for(const type in data) {
26
+ for(const id in data[type]) {
27
+ store[getUniqueId(type, id)] = data[type][id]
28
+ }
29
+ }
30
+ },
31
+ }
32
+
33
+ function getUniqueId(type: string, id: string) {
34
+ return `${type}.${id}`
35
+ }
36
+ }
@@ -0,0 +1,113 @@
1
+ import type { proto } from '../../WAProto'
2
+ import { RegistrationOptions } from '../Socket/registration'
3
+ import type { Contact } from './Contact'
4
+ import type { MinimalMessage } from './Message'
5
+
6
+ export type KeyPair = { public: Uint8Array, private: Uint8Array }
7
+ export type SignedKeyPair = {
8
+ keyPair: KeyPair
9
+ signature: Uint8Array
10
+ keyId: number
11
+ timestampS?: number
12
+ }
13
+
14
+ export type ProtocolAddress = {
15
+ name: string // jid
16
+ deviceId: number
17
+ }
18
+ export type SignalIdentity = {
19
+ identifier: ProtocolAddress
20
+ identifierKey: Uint8Array
21
+ }
22
+
23
+ export type LTHashState = {
24
+ version: number
25
+ hash: Buffer
26
+ indexValueMap: {
27
+ [indexMacBase64: string]: { valueMac: Uint8Array | Buffer }
28
+ }
29
+ }
30
+
31
+ export type SignalCreds = {
32
+ readonly signedIdentityKey: KeyPair
33
+ readonly signedPreKey: SignedKeyPair
34
+ readonly registrationId: number
35
+ }
36
+
37
+ export type AccountSettings = {
38
+ /** unarchive chats when a new message is received */
39
+ unarchiveChats: boolean
40
+ /** the default mode to start new conversations with */
41
+ defaultDisappearingMode?: Pick<proto.IConversation, 'ephemeralExpiration' | 'ephemeralSettingTimestamp'>
42
+ }
43
+
44
+ export type AuthenticationCreds = SignalCreds & {
45
+ readonly noiseKey: KeyPair
46
+ readonly pairingEphemeralKeyPair: KeyPair
47
+ advSecretKey: string
48
+
49
+ me?: Contact
50
+ account?: proto.IADVSignedDeviceIdentity
51
+ signalIdentities?: SignalIdentity[]
52
+ myAppStateKeyId?: string
53
+ firstUnuploadedPreKeyId: number
54
+ nextPreKeyId: number
55
+
56
+ lastAccountSyncTimestamp?: number
57
+ platform?: string
58
+
59
+ processedHistoryMessages: MinimalMessage[]
60
+ /** number of times history & app state has been synced */
61
+ accountSyncCounter: number
62
+ accountSettings: AccountSettings
63
+ // mobile creds
64
+ deviceId: string
65
+ phoneId: string
66
+ identityId: Buffer
67
+ registered: boolean
68
+ backupToken: Buffer
69
+ registration: RegistrationOptions
70
+ pairingCode: string | undefined
71
+ lastPropHash: string | undefined
72
+ routingInfo: Buffer | undefined
73
+ }
74
+
75
+ export type SignalDataTypeMap = {
76
+ 'pre-key': KeyPair
77
+ 'session': Uint8Array
78
+ 'sender-key': Uint8Array
79
+ 'sender-key-memory': { [jid: string]: boolean }
80
+ 'app-state-sync-key': proto.Message.IAppStateSyncKeyData
81
+ 'app-state-sync-version': LTHashState
82
+ }
83
+
84
+ export type SignalDataSet = { [T in keyof SignalDataTypeMap]?: { [id: string]: SignalDataTypeMap[T] | null } }
85
+
86
+ type Awaitable<T> = T | Promise<T>
87
+
88
+ export type SignalKeyStore = {
89
+ get<T extends keyof SignalDataTypeMap>(type: T, ids: string[]): Awaitable<{ [id: string]: SignalDataTypeMap[T] }>
90
+ set(data: SignalDataSet): Awaitable<void>
91
+ /** clear all the data in the store */
92
+ clear?(): Awaitable<void>
93
+ }
94
+
95
+ export type SignalKeyStoreWithTransaction = SignalKeyStore & {
96
+ isInTransaction: () => boolean
97
+ transaction<T>(exec: () => Promise<T>): Promise<T>
98
+ }
99
+
100
+ export type TransactionCapabilityOptions = {
101
+ maxCommitRetries: number
102
+ delayBetweenTriesMs: number
103
+ }
104
+
105
+ export type SignalAuthState = {
106
+ creds: SignalCreds
107
+ keys: SignalKeyStore | SignalKeyStoreWithTransaction
108
+ }
109
+
110
+ export type AuthenticationState = {
111
+ creds: AuthenticationCreds
112
+ keys: SignalKeyStore
113
+ }
@@ -0,0 +1,15 @@
1
+
2
+ export type WACallUpdateType = 'offer' | 'ringing' | 'timeout' | 'reject' | 'accept'
3
+
4
+ export type WACallEvent = {
5
+ chatId: string
6
+ from: string
7
+ isGroup?: boolean
8
+ groupJid?: string
9
+ id: string
10
+ date: Date
11
+ isVideo?: boolean
12
+ status: WACallUpdateType
13
+ offline: boolean
14
+ latencyMs?: number
15
+ }