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
@@ -1,4 +1,13 @@
1
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
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -24,11 +33,11 @@ const validRegistrationOptions = (config) => (config === null || config === void
24
33
  config.phoneNumberMobileCountryCode;
25
34
  const makeRegistrationSocket = (config) => {
26
35
  const sock = (0, business_1.makeBusinessSocket)(config);
27
- const register = async (code) => {
36
+ const register = (code) => __awaiter(void 0, void 0, void 0, function* () {
28
37
  if (!validRegistrationOptions(config.auth.creds.registration)) {
29
38
  throw new Error('please specify the registration options');
30
39
  }
31
- const result = await mobileRegister({ ...sock.authState.creds, ...sock.authState.creds.registration, code }, config.options);
40
+ const result = yield mobileRegister(Object.assign(Object.assign(Object.assign({}, sock.authState.creds), sock.authState.creds.registration), { code }), config.options);
32
41
  sock.authState.creds.me = {
33
42
  id: (0, WABinary_1.jidEncode)(result.login, 's.whatsapp.net'),
34
43
  name: '~'
@@ -36,21 +45,18 @@ const makeRegistrationSocket = (config) => {
36
45
  sock.authState.creds.registered = true;
37
46
  sock.ev.emit('creds.update', sock.authState.creds);
38
47
  return result;
39
- };
40
- const requestRegistrationCode = async (registrationOptions) => {
48
+ });
49
+ const requestRegistrationCode = (registrationOptions) => __awaiter(void 0, void 0, void 0, function* () {
41
50
  registrationOptions = registrationOptions || config.auth.creds.registration;
42
51
  if (!validRegistrationOptions(registrationOptions)) {
43
52
  throw new Error('Invalid registration options');
44
53
  }
45
54
  sock.authState.creds.registration = registrationOptions;
46
55
  sock.ev.emit('creds.update', sock.authState.creds);
47
- return mobileRegisterCode({ ...config.auth.creds, ...registrationOptions }, config.options);
48
- };
49
- return {
50
- ...sock,
51
- register,
52
- requestRegistrationCode,
53
- };
56
+ return mobileRegisterCode(Object.assign(Object.assign({}, config.auth.creds), registrationOptions), config.options);
57
+ });
58
+ return Object.assign(Object.assign({}, sock), { register,
59
+ requestRegistrationCode });
54
60
  };
55
61
  exports.makeRegistrationSocket = makeRegistrationSocket;
56
62
  function convertBufferToUrlHex(buffer) {
@@ -99,34 +105,18 @@ function registrationParams(params) {
99
105
  * Requests a registration code for the given phone number.
100
106
  */
101
107
  function mobileRegisterCode(params, fetchOptions) {
102
- return mobileRegisterFetch('/code', {
103
- params: {
104
- ...registrationParams(params),
105
- mcc: `${params.phoneNumberMobileCountryCode}`.padStart(3, '0'),
106
- mnc: `${params.phoneNumberMobileNetworkCode || '001'}`.padStart(3, '0'),
107
- sim_mcc: '000',
108
- sim_mnc: '000',
109
- method: (params === null || params === void 0 ? void 0 : params.method) || 'sms',
110
- reason: '',
111
- hasav: '1'
112
- },
113
- ...fetchOptions,
114
- });
108
+ return mobileRegisterFetch('/code', Object.assign({ params: Object.assign(Object.assign({}, registrationParams(params)), { mcc: `${params.phoneNumberMobileCountryCode}`.padStart(3, '0'), mnc: `${params.phoneNumberMobileNetworkCode || '001'}`.padStart(3, '0'), sim_mcc: '000', sim_mnc: '000', method: (params === null || params === void 0 ? void 0 : params.method) || 'sms', reason: '', hasav: '1' }) }, fetchOptions));
115
109
  }
116
110
  function mobileRegisterExists(params, fetchOptions) {
117
- return mobileRegisterFetch('/exist', {
118
- params: registrationParams(params),
119
- ...fetchOptions
120
- });
111
+ return mobileRegisterFetch('/exist', Object.assign({ params: registrationParams(params) }, fetchOptions));
121
112
  }
122
113
  /**
123
114
  * Registers the phone number on whatsapp with the received OTP code.
124
115
  */
125
- async function mobileRegister(params, fetchOptions) {
126
- //const result = await mobileRegisterFetch(`/reg_onboard_abprop?cc=${params.phoneNumberCountryCode}&in=${params.phoneNumberNationalNumber}&rc=0`)
127
- return mobileRegisterFetch('/register', {
128
- params: { ...registrationParams(params), code: params.code.replace('-', '') },
129
- ...fetchOptions,
116
+ function mobileRegister(params, fetchOptions) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ //const result = await mobileRegisterFetch(`/reg_onboard_abprop?cc=${params.phoneNumberCountryCode}&in=${params.phoneNumberNationalNumber}&rc=0`)
119
+ return mobileRegisterFetch('/register', Object.assign({ params: Object.assign(Object.assign({}, registrationParams(params)), { code: params.code.replace('-', '') }) }, fetchOptions));
130
120
  });
131
121
  }
132
122
  /**
@@ -138,29 +128,31 @@ function mobileRegisterEncrypt(data) {
138
128
  const buffer = (0, crypto_1.aesEncryptGCM)(Buffer.from(data), new Uint8Array(key), Buffer.alloc(12), Buffer.alloc(0));
139
129
  return Buffer.concat([Buffer.from(keypair.public), buffer]).toString('base64url');
140
130
  }
141
- async function mobileRegisterFetch(path, opts = {}) {
142
- let url = `${Defaults_1.MOBILE_REGISTRATION_ENDPOINT}${path}`;
143
- if (opts.params) {
144
- const parameter = [];
145
- for (const param in opts.params) {
146
- if (opts.params[param] !== null && opts.params[param] !== undefined) {
147
- parameter.push(param + '=' + urlencode(opts.params[param]));
131
+ function mobileRegisterFetch(path_1) {
132
+ return __awaiter(this, arguments, void 0, function* (path, opts = {}) {
133
+ let url = `${Defaults_1.MOBILE_REGISTRATION_ENDPOINT}${path}`;
134
+ if (opts.params) {
135
+ const parameter = [];
136
+ for (const param in opts.params) {
137
+ if (opts.params[param] !== null && opts.params[param] !== undefined) {
138
+ parameter.push(param + '=' + urlencode(opts.params[param]));
139
+ }
148
140
  }
141
+ url += `?${parameter.join('&')}`;
142
+ delete opts.params;
143
+ }
144
+ if (!opts.headers) {
145
+ opts.headers = {};
149
146
  }
150
- url += `?${parameter.join('&')}`;
151
- delete opts.params;
152
- }
153
- if (!opts.headers) {
154
- opts.headers = {};
155
- }
156
- opts.headers['User-Agent'] = Defaults_1.MOBILE_USERAGENT;
157
- const response = await (0, axios_1.default)(url, opts);
158
- var json = response.data;
159
- if (response.status > 300 || json.reason) {
160
- throw json;
161
- }
162
- if (json.status && !['ok', 'sent'].includes(json.status)) {
163
- throw json;
164
- }
165
- return json;
147
+ opts.headers['User-Agent'] = Defaults_1.MOBILE_USERAGENT;
148
+ const response = yield (0, axios_1.default)(url, opts);
149
+ var json = response.data;
150
+ if (response.status > 300 || json.reason) {
151
+ throw json;
152
+ }
153
+ if (json.status && !['ok', 'sent'].includes(json.status)) {
154
+ throw json;
155
+ }
156
+ return json;
157
+ });
166
158
  }
@@ -0,0 +1,250 @@
1
+ /* eslint-disable camelcase */
2
+ import axios, { AxiosRequestConfig } from 'axios'
3
+ import { MOBILE_REGISTRATION_ENDPOINT, MOBILE_TOKEN, MOBILE_USERAGENT, REGISTRATION_PUBLIC_KEY } from '../Defaults'
4
+ import { KeyPair, SignedKeyPair, SocketConfig } from '../Types'
5
+ import { aesEncryptGCM, Curve, md5 } from '../Utils/crypto'
6
+ import { jidEncode } from '../WABinary'
7
+ import { makeBusinessSocket } from './business'
8
+
9
+ function urlencode(str: string) {
10
+ return str.replace(/-/g, '%2d').replace(/_/g, '%5f').replace(/~/g, '%7e')
11
+ }
12
+
13
+ const validRegistrationOptions = (config: RegistrationOptions) => config?.phoneNumberCountryCode &&
14
+ config.phoneNumberNationalNumber &&
15
+ config.phoneNumberMobileCountryCode
16
+
17
+ export const makeRegistrationSocket = (config: SocketConfig) => {
18
+ const sock = makeBusinessSocket(config)
19
+
20
+ const register = async(code: string) => {
21
+ if(!validRegistrationOptions(config.auth.creds.registration)) {
22
+ throw new Error('please specify the registration options')
23
+ }
24
+
25
+ const result = await mobileRegister({ ...sock.authState.creds, ...sock.authState.creds.registration as RegistrationOptions, code }, config.options)
26
+
27
+ sock.authState.creds.me = {
28
+ id: jidEncode(result.login!, 's.whatsapp.net'),
29
+ name: '~'
30
+ }
31
+
32
+ sock.authState.creds.registered = true
33
+ sock.ev.emit('creds.update', sock.authState.creds)
34
+
35
+ return result
36
+ }
37
+
38
+ const requestRegistrationCode = async(registrationOptions?: RegistrationOptions) => {
39
+ registrationOptions = registrationOptions || config.auth.creds.registration
40
+ if(!validRegistrationOptions(registrationOptions)) {
41
+ throw new Error('Invalid registration options')
42
+ }
43
+
44
+ sock.authState.creds.registration = registrationOptions
45
+
46
+ sock.ev.emit('creds.update', sock.authState.creds)
47
+
48
+ return mobileRegisterCode({ ...config.auth.creds, ...registrationOptions }, config.options)
49
+ }
50
+
51
+ return {
52
+ ...sock,
53
+ register,
54
+ requestRegistrationCode,
55
+ }
56
+ }
57
+
58
+ // Backup_token: Base64.getEncoder().encodeToString(Arrays.copyOfRange(Base64.getDecoder().decode(UUID.randomUUID().toString().replace('-','')),0,15))
59
+
60
+ export interface RegistrationData {
61
+ registrationId: number
62
+ signedPreKey: SignedKeyPair
63
+ noiseKey: KeyPair
64
+ signedIdentityKey: KeyPair
65
+ identityId: Buffer
66
+ phoneId: string
67
+ deviceId: string
68
+ backupToken: Buffer
69
+ }
70
+
71
+ export interface RegistrationOptions {
72
+ /** your phone number */
73
+ phoneNumber?: string
74
+ /** the country code of your phone number */
75
+ phoneNumberCountryCode: string
76
+ /** your phone number without country code */
77
+ phoneNumberNationalNumber: string
78
+ /** the country code of your mobile network
79
+ * @see {@link https://de.wikipedia.org/wiki/Mobile_Country_Code}
80
+ */
81
+ phoneNumberMobileCountryCode: string
82
+ /** the network code of your mobile network
83
+ * @see {@link https://de.wikipedia.org/wiki/Mobile_Network_Code}
84
+ */
85
+ phoneNumberMobileNetworkCode: string
86
+ /**
87
+ * How to send the one time code
88
+ */
89
+ method?: 'sms' | 'voice' | 'captcha'
90
+ /**
91
+ * The captcha code if it was requested
92
+ */
93
+ captcha?: string
94
+ }
95
+
96
+ export type RegistrationParams = RegistrationData & RegistrationOptions
97
+
98
+ function convertBufferToUrlHex(buffer: Buffer) {
99
+ var id = ''
100
+
101
+ buffer.forEach((x) => {
102
+ // encode random identity_id buffer as percentage url encoding
103
+ id += `%${x.toString(16).padStart(2, '0').toLowerCase()}`
104
+ })
105
+
106
+ return id
107
+ }
108
+
109
+ export function registrationParams(params: RegistrationParams) {
110
+ const e_regid = Buffer.alloc(4)
111
+ e_regid.writeInt32BE(params.registrationId)
112
+
113
+ const e_skey_id = Buffer.alloc(3)
114
+ e_skey_id.writeInt16BE(params.signedPreKey.keyId)
115
+
116
+ params.phoneNumberCountryCode = params.phoneNumberCountryCode.replace('+', '').trim()
117
+ params.phoneNumberNationalNumber = params.phoneNumberNationalNumber.replace(/[/-\s)(]/g, '').trim()
118
+
119
+ return {
120
+ cc: params.phoneNumberCountryCode,
121
+ in: params.phoneNumberNationalNumber,
122
+ Rc: '0',
123
+ lg: 'en',
124
+ lc: 'GB',
125
+ mistyped: '6',
126
+ authkey: Buffer.from(params.noiseKey.public).toString('base64url'),
127
+ e_regid: e_regid.toString('base64url'),
128
+ e_keytype: 'BQ',
129
+ e_ident: Buffer.from(params.signedIdentityKey.public).toString('base64url'),
130
+ // e_skey_id: e_skey_id.toString('base64url'),
131
+ e_skey_id: 'AAAA',
132
+ e_skey_val: Buffer.from(params.signedPreKey.keyPair.public).toString('base64url'),
133
+ e_skey_sig: Buffer.from(params.signedPreKey.signature).toString('base64url'),
134
+ fdid: params.phoneId,
135
+ network_ratio_type: '1',
136
+ expid: params.deviceId,
137
+ simnum: '1',
138
+ hasinrc: '1',
139
+ pid: Math.floor(Math.random() * 1000).toString(),
140
+ id: convertBufferToUrlHex(params.identityId),
141
+ backup_token: convertBufferToUrlHex(params.backupToken),
142
+ token: md5(Buffer.concat([MOBILE_TOKEN, Buffer.from(params.phoneNumberNationalNumber)])).toString('hex'),
143
+ fraud_checkpoint_code: params.captcha,
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Requests a registration code for the given phone number.
149
+ */
150
+ export function mobileRegisterCode(params: RegistrationParams, fetchOptions?: AxiosRequestConfig) {
151
+ return mobileRegisterFetch('/code', {
152
+ params: {
153
+ ...registrationParams(params),
154
+ mcc: `${params.phoneNumberMobileCountryCode}`.padStart(3, '0'),
155
+ mnc: `${params.phoneNumberMobileNetworkCode || '001'}`.padStart(3, '0'),
156
+ sim_mcc: '000',
157
+ sim_mnc: '000',
158
+ method: params?.method || 'sms',
159
+ reason: '',
160
+ hasav: '1'
161
+ },
162
+ ...fetchOptions,
163
+ })
164
+ }
165
+
166
+ export function mobileRegisterExists(params: RegistrationParams, fetchOptions?: AxiosRequestConfig) {
167
+ return mobileRegisterFetch('/exist', {
168
+ params: registrationParams(params),
169
+ ...fetchOptions
170
+ })
171
+ }
172
+
173
+ /**
174
+ * Registers the phone number on whatsapp with the received OTP code.
175
+ */
176
+ export async function mobileRegister(params: RegistrationParams & { code: string }, fetchOptions?: AxiosRequestConfig) {
177
+ //const result = await mobileRegisterFetch(`/reg_onboard_abprop?cc=${params.phoneNumberCountryCode}&in=${params.phoneNumberNationalNumber}&rc=0`)
178
+
179
+ return mobileRegisterFetch('/register', {
180
+ params: { ...registrationParams(params), code: params.code.replace('-', '') },
181
+ ...fetchOptions,
182
+ })
183
+ }
184
+
185
+ /**
186
+ * Encrypts the given string as AEAD aes-256-gcm with the public whatsapp key and a random keypair.
187
+ */
188
+ export function mobileRegisterEncrypt(data: string) {
189
+ const keypair = Curve.generateKeyPair()
190
+ const key = Curve.sharedKey(keypair.private, REGISTRATION_PUBLIC_KEY)
191
+
192
+ const buffer = aesEncryptGCM(Buffer.from(data), new Uint8Array(key), Buffer.alloc(12), Buffer.alloc(0))
193
+
194
+ return Buffer.concat([Buffer.from(keypair.public), buffer]).toString('base64url')
195
+ }
196
+
197
+ export async function mobileRegisterFetch(path: string, opts: AxiosRequestConfig = {}) {
198
+ let url = `${MOBILE_REGISTRATION_ENDPOINT}${path}`
199
+
200
+ if(opts.params) {
201
+ const parameter = [] as string[]
202
+
203
+ for(const param in opts.params) {
204
+ if(opts.params[param] !== null && opts.params[param] !== undefined) {
205
+ parameter.push(param + '=' + urlencode(opts.params[param]))
206
+ }
207
+ }
208
+
209
+ url += `?${parameter.join('&')}`
210
+ delete opts.params
211
+ }
212
+
213
+ if(!opts.headers) {
214
+ opts.headers = {}
215
+ }
216
+
217
+ opts.headers['User-Agent'] = MOBILE_USERAGENT
218
+
219
+ const response = await axios(url, opts)
220
+
221
+ var json = response.data
222
+
223
+ if(response.status > 300 || json.reason) {
224
+ throw json
225
+ }
226
+
227
+ if(json.status && !['ok', 'sent'].includes(json.status)) {
228
+ throw json
229
+ }
230
+
231
+ return json as ExistsResponse
232
+ }
233
+
234
+
235
+ export interface ExistsResponse {
236
+ status: 'fail' | 'sent'
237
+ voice_length?: number
238
+ voice_wait?: number
239
+ sms_length?: number
240
+ sms_wait?: number
241
+ reason?: 'incorrect' | 'missing_param' | 'code_checkpoint'
242
+ login?: string
243
+ flash_type?: number
244
+ ab_hash?: string
245
+ ab_key?: string
246
+ exp_cfg?: string
247
+ lid?: string
248
+ image_blob?: string
249
+ audio_blob?: string
250
+ }