violetics 7.0.1-alpha → 7.0.2-alpha

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 (114) hide show
  1. package/LICENSE +3 -2
  2. package/README.md +1001 -232
  3. package/WAProto/index.js +75379 -142631
  4. package/engine-requirements.js +11 -8
  5. package/lib/Defaults/index.js +132 -146
  6. package/lib/Signal/Group/ciphertext-message.js +2 -6
  7. package/lib/Signal/Group/group-session-builder.js +7 -42
  8. package/lib/Signal/Group/group_cipher.js +37 -52
  9. package/lib/Signal/Group/index.js +11 -57
  10. package/lib/Signal/Group/keyhelper.js +7 -45
  11. package/lib/Signal/Group/sender-chain-key.js +7 -16
  12. package/lib/Signal/Group/sender-key-distribution-message.js +8 -12
  13. package/lib/Signal/Group/sender-key-message.js +9 -13
  14. package/lib/Signal/Group/sender-key-name.js +2 -6
  15. package/lib/Signal/Group/sender-key-record.js +9 -22
  16. package/lib/Signal/Group/sender-key-state.js +27 -43
  17. package/lib/Signal/Group/sender-message-key.js +4 -8
  18. package/lib/Signal/libsignal.js +319 -94
  19. package/lib/Signal/lid-mapping.js +224 -139
  20. package/lib/Socket/Client/index.js +2 -19
  21. package/lib/Socket/Client/types.js +10 -0
  22. package/lib/Socket/Client/websocket.js +53 -0
  23. package/lib/Socket/business.js +162 -44
  24. package/lib/Socket/chats.js +477 -418
  25. package/lib/Socket/communities.js +430 -0
  26. package/lib/Socket/groups.js +110 -99
  27. package/lib/Socket/index.js +10 -10
  28. package/lib/Socket/messages-recv.js +884 -561
  29. package/lib/Socket/messages-send.js +859 -428
  30. package/lib/Socket/mex.js +41 -0
  31. package/lib/Socket/newsletter.js +195 -390
  32. package/lib/Socket/socket.js +465 -315
  33. package/lib/Store/index.js +3 -10
  34. package/lib/Store/make-in-memory-store.js +73 -79
  35. package/lib/Store/make-ordered-dictionary.js +4 -7
  36. package/lib/Store/object-repository.js +2 -6
  37. package/lib/Types/Auth.js +1 -2
  38. package/lib/Types/Bussines.js +1 -0
  39. package/lib/Types/Call.js +1 -2
  40. package/lib/Types/Chat.js +7 -4
  41. package/lib/Types/Contact.js +1 -2
  42. package/lib/Types/Events.js +1 -2
  43. package/lib/Types/GroupMetadata.js +1 -2
  44. package/lib/Types/Label.js +2 -5
  45. package/lib/Types/LabelAssociation.js +2 -5
  46. package/lib/Types/Message.js +17 -9
  47. package/lib/Types/Newsletter.js +33 -38
  48. package/lib/Types/Product.js +1 -2
  49. package/lib/Types/Signal.js +1 -2
  50. package/lib/Types/Socket.js +2 -2
  51. package/lib/Types/State.js +12 -2
  52. package/lib/Types/USync.js +1 -2
  53. package/lib/Types/index.js +14 -31
  54. package/lib/Utils/auth-utils.js +228 -152
  55. package/lib/Utils/browser-utils.js +28 -0
  56. package/lib/Utils/business.js +66 -70
  57. package/lib/Utils/chat-utils.js +331 -249
  58. package/lib/Utils/crypto.js +57 -91
  59. package/lib/Utils/decode-wa-message.js +168 -84
  60. package/lib/Utils/event-buffer.js +138 -80
  61. package/lib/Utils/generics.js +180 -297
  62. package/lib/Utils/history.js +83 -49
  63. package/lib/Utils/identity-change-handler.js +48 -0
  64. package/lib/Utils/index.js +19 -33
  65. package/lib/Utils/link-preview.js +14 -23
  66. package/lib/Utils/logger.js +2 -7
  67. package/lib/Utils/lt-hash.js +2 -46
  68. package/lib/Utils/make-mutex.js +24 -47
  69. package/lib/Utils/message-retry-manager.js +224 -0
  70. package/lib/Utils/messages-media.js +501 -496
  71. package/lib/Utils/messages.js +1428 -362
  72. package/lib/Utils/noise-handler.js +145 -100
  73. package/lib/Utils/pre-key-manager.js +105 -0
  74. package/lib/Utils/process-message.js +356 -150
  75. package/lib/Utils/reporting-utils.js +257 -0
  76. package/lib/Utils/signal.js +78 -73
  77. package/lib/Utils/sync-action-utils.js +47 -0
  78. package/lib/Utils/tc-token-utils.js +17 -0
  79. package/lib/Utils/use-multi-file-auth-state.js +35 -45
  80. package/lib/Utils/validate-connection.js +91 -107
  81. package/lib/WABinary/constants.js +1300 -1304
  82. package/lib/WABinary/decode.js +26 -48
  83. package/lib/WABinary/encode.js +109 -155
  84. package/lib/WABinary/generic-utils.js +161 -149
  85. package/lib/WABinary/index.js +5 -21
  86. package/lib/WABinary/jid-utils.js +73 -40
  87. package/lib/WABinary/types.js +1 -2
  88. package/lib/WAM/BinaryInfo.js +2 -6
  89. package/lib/WAM/constants.js +19070 -11568
  90. package/lib/WAM/encode.js +17 -23
  91. package/lib/WAM/index.js +3 -19
  92. package/lib/WAUSync/Protocols/USyncContactProtocol.js +8 -12
  93. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +11 -15
  94. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +9 -13
  95. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +9 -14
  96. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +20 -23
  97. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +13 -9
  98. package/lib/WAUSync/Protocols/index.js +4 -20
  99. package/lib/WAUSync/USyncQuery.js +40 -36
  100. package/lib/WAUSync/USyncUser.js +2 -6
  101. package/lib/WAUSync/index.js +3 -19
  102. package/lib/index.js +11 -44
  103. package/package.json +74 -107
  104. package/lib/Defaults/baileys-version.json +0 -3
  105. package/lib/Defaults/phonenumber-mcc.json +0 -223
  106. package/lib/Signal/Group/queue-job.js +0 -57
  107. package/lib/Socket/Client/abstract-socket-client.js +0 -13
  108. package/lib/Socket/Client/mobile-socket-client.js +0 -65
  109. package/lib/Socket/Client/web-socket-client.js +0 -118
  110. package/lib/Socket/groupStatus.js +0 -637
  111. package/lib/Socket/registration.js +0 -166
  112. package/lib/Socket/usync.js +0 -70
  113. package/lib/Store/make-cache-manager-store.js +0 -83
  114. package/lib/Utils/baileys-event-stream.js +0 -63
package/package.json CHANGED
@@ -1,109 +1,76 @@
1
1
  {
2
- "name": "violetics",
3
- "version": "7.0.1-alpha",
4
- "description": "WhatsApp API Modification",
5
- "keywords": [
6
- "whatsapp",
7
- "baileys",
8
- "whatsapp-web",
9
- "whatsapp-chat",
10
- "whatsapp-group",
11
- "botwa",
12
- "bails"
13
- ],
14
- "homepage": "https://github.com/cv3inx/violetics",
15
- "repository": {
16
- "url": "https://github.com/cv3inx/violetics"
17
- },
18
- "license": "MIT",
19
- "author": "Adhiraj Singh",
20
- "main": "lib/index.js",
21
- "types": "lib/index.d.ts",
22
- "files": [
23
- "lib/*",
24
- "WAProto/*.js",
25
- "engine-requirements.js"
26
- ],
27
- "scripts": {
28
- "build:all": "tsc && typedoc",
29
- "build:docs": "typedoc",
30
- "build:tsc": "tsc",
31
- "changelog:last": "conventional-changelog -p angular -r 2",
32
- "changelog:preview": "conventional-changelog -p angular -u",
33
- "gen:protobuf": "sh WAProto/GenerateStatics.sh",
34
- "lint": "eslint src --ext .js,.ts,.jsx,.tsx",
35
- "lint:fix": "eslint src --fix --ext .js,.ts,.jsx,.tsx",
36
- "prepack": "",
37
- "prepare": "",
38
- "preinstall": "node ./engine-requirements.js",
39
- "release": "release-it",
40
- "test": "jest"
41
- },
42
- "dependencies": {
43
- "@adiwajshing/keyed-db": "^0.2.4",
44
- "@hapi/boom": "^9.1.3",
45
- "@cacheable/node-cache": "^1.4.0",
46
- "async-mutex": "^0.5.0",
47
- "audio-decode": "^2.1.3",
48
- "axios": "^1.3.3",
49
- "chalk": "^4.1.2",
50
- "futoin-hkdf": "^1.5.1",
51
- "libphonenumber-js": "^1.10.20",
52
- "lodash": "^4.17.21",
53
- "lru-cache": "^11.1.0",
54
- "libsignal": "git+https://github.com/xhclintohn/libsignal-node",
55
- "music-metadata": "^7.12.3",
56
- "node-fetch": "^2.6.1",
57
- "pino": "^9.6.0",
58
- "cache-manager": "latest",
59
- "protobufjs": "^7.2.4",
60
- "uuid": "^9.0.0",
61
- "ws": "^8.13.0"
62
- },
63
- "devDependencies": {
64
- "@adiwajshing/eslint-config": "github:adiwajshing/eslint-config",
65
- "@types/got": "^9.6.11",
66
- "@types/jest": "^27.5.1",
67
- "@types/node": "^16.0.0",
68
- "@types/sharp": "^0.29.4",
69
- "@types/ws": "^8.0.0",
70
- "conventional-changelog-cli": "^2.2.2",
71
- "eslint": "^8.0.0",
72
- "jest": "^27.0.6",
73
- "jimp": "^0.16.1",
74
- "link-preview-js": "^3.0.0",
75
- "open": "^8.4.2",
76
- "qrcode-terminal": "^0.12.0",
77
- "release-it": "^15.10.3",
78
- "sharp": "^0.30.5",
79
- "ts-jest": "^27.0.3",
80
- "ts-node": "^10.8.1",
81
- "typedoc": "^0.24.7",
82
- "typescript": "^4.6.4",
83
- "json": "^11.0.0"
84
- },
85
- "peerDependencies": {
86
- "jimp": "^0.16.1",
87
- "link-preview-js": "^3.0.0",
88
- "qrcode-terminal": "^0.12.0",
89
- "sharp": "^0.32.2"
90
- },
91
- "peerDependenciesMeta": {
92
- "jimp": {
93
- "optional": true
94
- },
95
- "link-preview-js": {
96
- "optional": true
97
- },
98
- "qrcode-terminal": {
99
- "optional": true
100
- },
101
- "sharp": {
102
- "optional": true
103
- }
104
- },
105
- "packageManager": "yarn@1.22.19",
106
- "engines": {
107
- "node": ">=20.0.0"
108
- }
2
+ "name": "violetics",
3
+ "version": "7.0.2-alpha",
4
+ "description": "A simple fork of Baileys for WhatsApp automation",
5
+ "main": "lib/index.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "preinstall": "node ./engine-requirements.js"
9
+ },
10
+ "engines": {
11
+ "node": ">=20.0.0"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/cv3inx/violetics.git"
16
+ },
17
+ "files": [
18
+ "lib/**/*",
19
+ "WAProto/**/*",
20
+ "engine-requirements.js"
21
+ ],
22
+ "keywords": [
23
+ "automation",
24
+ "baileys",
25
+ "baileys-fork",
26
+ "baileys-mod",
27
+ "js-whatsapp",
28
+ "multi-device",
29
+ "whatsapp",
30
+ "whatsapp-api",
31
+ "whatsapp-bot",
32
+ "whatsapp-chat",
33
+ "whatsapp-group",
34
+ "whatsapp-web"
35
+ ],
36
+ "homepage": "https://github.com/cv3inx/violetics#readme",
37
+ "author": "Lia Wynn",
38
+ "license": "MIT",
39
+ "dependencies": {
40
+ "@adiwajshing/keyed-db": "^0.2.4",
41
+ "@cacheable/node-cache": "^1.4.0",
42
+ "@hapi/boom": "^9.1.3",
43
+ "async-mutex": "^0.5.0",
44
+ "fflate": "^0.8.2",
45
+ "libsignal": "github:WhiskeySockets/libsignal-wasm#master",
46
+ "lru-cache": "^11.2.6",
47
+ "music-metadata": "^11.7.0",
48
+ "p-queue": "^9.1.0",
49
+ "pino": "^9.6.0",
50
+ "protobufjs": "^7.5.4",
51
+ "whatsapp-rust-bridge": "^0.5.3",
52
+ "ws": "^8.19.0"
53
+ },
54
+ "peerDependencies": {
55
+ "@napi-rs/image": "~1.12.0",
56
+ "audio-decode": "^2.2.3",
57
+ "jimp": "^1.6.0",
58
+ "link-preview-js": "^3.0.0",
59
+ "sharp": "*"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "@napi-rs/image": {
63
+ "optional": true
64
+ },
65
+ "audio-decode": {
66
+ "optional": true
67
+ },
68
+ "jimp": {
69
+ "optional": true
70
+ },
71
+ "link-preview-js": {
72
+ "optional": true
73
+ }
74
+ },
75
+ "packageManager": "yarn@4.9.2"
109
76
  }
@@ -1,3 +0,0 @@
1
- {
2
- "version": [2,3000,1033846690]
3
- }
@@ -1,223 +0,0 @@
1
- {
2
- "93": 412,
3
- "355": 276,
4
- "213": 603,
5
- "1-684": 544,
6
- "376": 213,
7
- "244": 631,
8
- "1-264": 365,
9
- "1-268": 344,
10
- "54": 722,
11
- "374": 283,
12
- "297": 363,
13
- "61": 505,
14
- "43": 232,
15
- "994": 400,
16
- "1-242": 364,
17
- "973": 426,
18
- "880": 470,
19
- "1-246": 342,
20
- "375": 257,
21
- "32": 206,
22
- "501": 702,
23
- "229": 616,
24
- "1-441": 350,
25
- "975": 402,
26
- "591": 736,
27
- "387": 218,
28
- "267": 652,
29
- "55": 724,
30
- "1-284": 348,
31
- "673": 528,
32
- "359": 284,
33
- "226": 613,
34
- "257": 642,
35
- "855": 456,
36
- "237": 624,
37
- "238": 625,
38
- "1-345": 346,
39
- "236": 623,
40
- "235": 622,
41
- "56": 730,
42
- "86": 454,
43
- "57": 732,
44
- "269": 654,
45
- "682": 548,
46
- "506": 712,
47
- "385": 219,
48
- "53": 368,
49
- "357": 280,
50
- "420": 230,
51
- "243": 630,
52
- "45": 238,
53
- "253": 638,
54
- "1-767": 366,
55
- "1-809": 370,
56
- "1-849": 370,
57
- "1-829": 370,
58
- "593": 740,
59
- "20": 602,
60
- "503": 706,
61
- "240": 627,
62
- "291": 657,
63
- "372": 248,
64
- "251": 636,
65
- "500": 750,
66
- "298": 288,
67
- "679": 542,
68
- "358": 244,
69
- "33": 208,
70
- "689": 547,
71
- "241": 628,
72
- "220": 607,
73
- "995": 282,
74
- "49": 262,
75
- "233": 620,
76
- "350": 266,
77
- "30": 202,
78
- "299": 290,
79
- "1-473": 352,
80
- "1-671": 535,
81
- "502": 704,
82
- "224": 537,
83
- "592": 738,
84
- "509": 372,
85
- "504": 708,
86
- "852": 454,
87
- "36": 216,
88
- "354": 274,
89
- "91": 404,
90
- "62": 510,
91
- "98": 432,
92
- "964": 418,
93
- "353": 234,
94
- "972": 425,
95
- "39": 222,
96
- "225": 612,
97
- "1-876": 338,
98
- "81": 440,
99
- "962": 416,
100
- "254": 639,
101
- "686": 545,
102
- "383": 221,
103
- "965": 419,
104
- "371": 247,
105
- "961": 415,
106
- "266": 651,
107
- "231": 618,
108
- "218": 606,
109
- "423": 295,
110
- "370": 246,
111
- "352": 270,
112
- "389": 294,
113
- "261": 646,
114
- "265": 650,
115
- "60": 502,
116
- "960": 472,
117
- "223": 610,
118
- "356": 278,
119
- "692": 551,
120
- "222": 609,
121
- "230": 617,
122
- "52": 334,
123
- "691": 550,
124
- "373": 259,
125
- "377": 212,
126
- "976": 428,
127
- "382": 297,
128
- "1-664": 354,
129
- "212": 604,
130
- "258": 643,
131
- "95": 414,
132
- "264": 649,
133
- "674": 536,
134
- "977": 429,
135
- "31": 204,
136
- "687": 546,
137
- "64": 530,
138
- "505": 710,
139
- "227": 614,
140
- "234": 621,
141
- "683": 555,
142
- "1-670": 534,
143
- "47": 242,
144
- "968": 226,
145
- "92": 410,
146
- "680": 552,
147
- "970": 423,
148
- "507": 714,
149
- "675": 537,
150
- "595": 744,
151
- "51": 716,
152
- "63": 515,
153
- "48": 260,
154
- "351": 268,
155
- "1-787, 1-939": 330,
156
- "974": 427,
157
- "242": 630,
158
- "40": 226,
159
- "7": 250,
160
- "250": 635,
161
- "290": 658,
162
- "1-869": 356,
163
- "1-758": 358,
164
- "508": 308,
165
- "1-784": 360,
166
- "685": 544,
167
- "378": 292,
168
- "239": 626,
169
- "966": 420,
170
- "221": 608,
171
- "381": 220,
172
- "248": 633,
173
- "232": 619,
174
- "65": 525,
175
- "386": 293,
176
- "677": 540,
177
- "27": 655,
178
- "211": 659,
179
- "34": 214,
180
- "94": 413,
181
- "249": 634,
182
- "597": 746,
183
- "268": 653,
184
- "46": 240,
185
- "41": 228,
186
- "963": 417,
187
- "886": 466,
188
- "992": 436,
189
- "255": 640,
190
- "66": 520,
191
- "228": 615,
192
- "690": 554,
193
- "676": 539,
194
- "1-868": 374,
195
- "216": 605,
196
- "90": 286,
197
- "993": 438,
198
- "1-649": 376,
199
- "688": 553,
200
- "1-340": 332,
201
- "256": 641,
202
- "380": 255,
203
- "971": 424,
204
- "44": 234,
205
- "1": 310,
206
- "598": 748,
207
- "998": 434,
208
- "678": 541,
209
- "379": 225,
210
- "58": 734,
211
- "681": 543,
212
- "967": 421,
213
- "260": 645,
214
- "263": 648,
215
- "670": 514,
216
- "245": 632,
217
- "856": 457,
218
- "599": 362,
219
- "850": 467,
220
- "262": 647,
221
- "82": 450,
222
- "84": 452
223
- }
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = queueJob;
4
- const _queueAsyncBuckets = new Map();
5
- const _gcLimit = 10000;
6
- async function _asyncQueueExecutor(queue, cleanup) {
7
- let offt = 0;
8
- // eslint-disable-next-line no-constant-condition
9
- while (true) {
10
- const limit = Math.min(queue.length, _gcLimit);
11
- for (let i = offt; i < limit; i++) {
12
- const job = queue[i];
13
- try {
14
- job.resolve(await job.awaitable());
15
- }
16
- catch (e) {
17
- job.reject(e);
18
- }
19
- }
20
- if (limit < queue.length) {
21
- if (limit >= _gcLimit) {
22
- queue.splice(0, limit);
23
- offt = 0;
24
- }
25
- else {
26
- offt = limit;
27
- }
28
- }
29
- else {
30
- break;
31
- }
32
- }
33
- cleanup();
34
- }
35
- function queueJob(bucket, awaitable) {
36
- // Skip name assignment since it's readonly in strict mode
37
- if (typeof bucket !== 'string') {
38
- console.warn('Unhandled bucket type (for naming):', typeof bucket, bucket);
39
- }
40
- let inactive = false;
41
- if (!_queueAsyncBuckets.has(bucket)) {
42
- _queueAsyncBuckets.set(bucket, []);
43
- inactive = true;
44
- }
45
- const queue = _queueAsyncBuckets.get(bucket);
46
- const job = new Promise((resolve, reject) => {
47
- queue.push({
48
- awaitable,
49
- resolve: resolve,
50
- reject
51
- });
52
- });
53
- if (inactive) {
54
- _asyncQueueExecutor(queue, () => _queueAsyncBuckets.delete(bucket));
55
- }
56
- return job;
57
- }
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbstractSocketClient = void 0;
4
- const events_1 = require("events");
5
- class AbstractSocketClient extends events_1.EventEmitter {
6
- constructor(url, config) {
7
- super();
8
- this.url = url;
9
- this.config = config;
10
- this.setMaxListeners(0);
11
- }
12
- }
13
- exports.AbstractSocketClient = AbstractSocketClient;
@@ -1,65 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MobileSocketClient = void 0;
4
- const net_1 = require("net");
5
- const abstract_socket_client_1 = require("./abstract-socket-client");
6
- class MobileSocketClient extends abstract_socket_client_1.AbstractSocketClient {
7
- constructor() {
8
- super(...arguments);
9
- this.socket = null;
10
- }
11
- get isOpen() {
12
- var _a;
13
- return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === 'open';
14
- }
15
- get isClosed() {
16
- var _a;
17
- return this.socket === null || ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === 'closed';
18
- }
19
- get isClosing() {
20
- var _a;
21
- return this.socket === null || ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === 'closed';
22
- }
23
- get isConnecting() {
24
- var _a;
25
- return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === 'opening';
26
- }
27
- async connect() {
28
- var _a;
29
- if (this.socket) {
30
- return;
31
- }
32
- if (this.config.agent) {
33
- throw new Error('There are not support for proxy agent for mobile connection');
34
- }
35
- else {
36
- this.socket = (0, net_1.connect)({
37
- host: this.url.hostname,
38
- port: Number(this.url.port) || 443
39
- });
40
- }
41
- this.socket.setMaxListeners(0);
42
- const events = ['close', 'connect', 'data', 'drain', 'end', 'error', 'lookup', 'ready', 'timeout'];
43
- for (const event of events) {
44
- (_a = this.socket) === null || _a === void 0 ? void 0 : _a.on(event, (...args) => this.emit(event, ...args));
45
- }
46
- this.socket.on('data', (...args) => this.emit('message', ...args));
47
- this.socket.on('ready', (...args) => this.emit('open', ...args));
48
- }
49
- async close() {
50
- if (!this.socket) {
51
- return;
52
- }
53
- return new Promise(resolve => {
54
- this.socket.end(resolve);
55
- this.socket = null;
56
- });
57
- }
58
- send(str, cb) {
59
- if (this.socket === null) {
60
- return false;
61
- }
62
- return this.socket.write(str, undefined, cb);
63
- }
64
- }
65
- exports.MobileSocketClient = MobileSocketClient;
@@ -1,118 +0,0 @@
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
- exports.WebSocketClient = void 0;
7
- const ws_1 = __importDefault(require("ws"));
8
- const dns_1 = require("dns");
9
- const Defaults_1 = require("../../Defaults");
10
- const abstract_socket_client_1 = require("./abstract-socket-client");
11
-
12
- // Simple DNS cache to prevent repeated lookups when many bots reconnect at once.
13
- // ENOTFOUND errors are typically transient — caching the last good IP avoids them.
14
- const DNS_CACHE = new Map(); // hostname → { address, expires }
15
- const DNS_TTL_MS = 5 * 60 * 1000; // 5 minutes
16
-
17
- async function resolveWithCache(hostname) {
18
- const now = Date.now();
19
- const cached = DNS_CACHE.get(hostname);
20
- if (cached && cached.expires > now) {
21
- return cached.address;
22
- }
23
- return new Promise((resolve, reject) => {
24
- (0, dns_1.lookup)(hostname, { family: 4 }, (err, address) => {
25
- if (err) {
26
- // If lookup fails but we have a stale cache entry, use it
27
- if (cached) {
28
- return resolve(cached.address);
29
- }
30
- return reject(err);
31
- }
32
- DNS_CACHE.set(hostname, { address, expires: now + DNS_TTL_MS });
33
- resolve(address);
34
- });
35
- });
36
- }
37
-
38
- class WebSocketClient extends abstract_socket_client_1.AbstractSocketClient {
39
- constructor() {
40
- super(...arguments);
41
- this.socket = null;
42
- }
43
- get isOpen() {
44
- var _a;
45
- return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === ws_1.default.OPEN;
46
- }
47
- get isClosed() {
48
- var _a;
49
- return this.socket === null || ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === ws_1.default.CLOSED;
50
- }
51
- get isClosing() {
52
- var _a;
53
- return this.socket === null || ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === ws_1.default.CLOSING;
54
- }
55
- get isConnecting() {
56
- var _a;
57
- return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === ws_1.default.CONNECTING;
58
- }
59
- async connect() {
60
- var _a, _b;
61
- if (this.socket) {
62
- return;
63
- }
64
- // Resolve hostname with cache to avoid ENOTFOUND on transient DNS failures
65
- let connectUrl = this.url;
66
- try {
67
- const parsedUrl = new URL(this.url);
68
- const ip = await resolveWithCache(parsedUrl.hostname);
69
- // Replace hostname with resolved IP, keep original Host header for TLS SNI
70
- const resolvedUrl = new URL(this.url);
71
- resolvedUrl.hostname = ip;
72
- connectUrl = resolvedUrl.toString();
73
- }
74
- catch (_c) {
75
- // fallback: use original URL if DNS resolution fails entirely
76
- }
77
- this.socket = new ws_1.default(connectUrl, {
78
- origin: Defaults_1.DEFAULT_ORIGIN,
79
- headers: {
80
- ...((_a = this.config.options) === null || _a === void 0 ? void 0 : _a.headers),
81
- // Preserve the original hostname for TLS SNI and WA server routing
82
- Host: new URL(this.url).hostname,
83
- },
84
- handshakeTimeout: Math.max(this.config.connectTimeoutMs, 60000),
85
- timeout: Math.max(this.config.connectTimeoutMs, 60000),
86
- agent: this.config.agent,
87
- });
88
- this.socket.setMaxListeners(0);
89
- const events = ['close', 'error', 'upgrade', 'message', 'open', 'ping', 'pong', 'unexpected-response'];
90
- for (const event of events) {
91
- (_b = this.socket) === null || _b === void 0 ? void 0 : _b.on(event, (...args) => this.emit(event, ...args));
92
- }
93
- }
94
- async close() {
95
- if (!this.socket) {
96
- return;
97
- }
98
- // Race against a 5-second timeout: if the underlying WebSocket never
99
- // fires 'close' (e.g. network is already gone), we still proceed so
100
- // that the old socket reference is cleared and a fresh reconnect can
101
- // start without two sockets running in parallel.
102
- const closePromise = new Promise((resolve) => {
103
- this.socket.once('close', resolve);
104
- });
105
- const timeoutPromise = new Promise((resolve) =>
106
- setTimeout(resolve, 5000)
107
- );
108
- this.socket.close();
109
- await Promise.race([closePromise, timeoutPromise]);
110
- this.socket = null;
111
- }
112
- send(str, cb) {
113
- var _a;
114
- (_a = this.socket) === null || _a === void 0 ? void 0 : _a.send(str, cb);
115
- return Boolean(this.socket);
116
- }
117
- }
118
- exports.WebSocketClient = WebSocketClient;