@kangwifi-pro/waliwa 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +600 -0
  3. package/dist/advanced/features.d.ts +211 -0
  4. package/dist/advanced/features.d.ts.map +1 -0
  5. package/dist/advanced/features.js +671 -0
  6. package/dist/advanced/features.js.map +1 -0
  7. package/dist/auth/auth-state.d.ts +89 -0
  8. package/dist/auth/auth-state.d.ts.map +1 -0
  9. package/dist/auth/auth-state.js +330 -0
  10. package/dist/auth/auth-state.js.map +1 -0
  11. package/dist/auth/pairing-code.d.ts +78 -0
  12. package/dist/auth/pairing-code.d.ts.map +1 -0
  13. package/dist/auth/pairing-code.js +191 -0
  14. package/dist/auth/pairing-code.js.map +1 -0
  15. package/dist/auth/qr-code.d.ts +60 -0
  16. package/dist/auth/qr-code.d.ts.map +1 -0
  17. package/dist/auth/qr-code.js +151 -0
  18. package/dist/auth/qr-code.js.map +1 -0
  19. package/dist/calls/handler.d.ts +61 -0
  20. package/dist/calls/handler.d.ts.map +1 -0
  21. package/dist/calls/handler.js +117 -0
  22. package/dist/calls/handler.js.map +1 -0
  23. package/dist/core/binary.d.ts +74 -0
  24. package/dist/core/binary.d.ts.map +1 -0
  25. package/dist/core/binary.js +448 -0
  26. package/dist/core/binary.js.map +1 -0
  27. package/dist/core/crypto.d.ts +60 -0
  28. package/dist/core/crypto.d.ts.map +1 -0
  29. package/dist/core/crypto.js +170 -0
  30. package/dist/core/crypto.js.map +1 -0
  31. package/dist/core/noise.d.ts +106 -0
  32. package/dist/core/noise.d.ts.map +1 -0
  33. package/dist/core/noise.js +307 -0
  34. package/dist/core/noise.js.map +1 -0
  35. package/dist/events/emitter.d.ts +44 -0
  36. package/dist/events/emitter.d.ts.map +1 -0
  37. package/dist/events/emitter.js +79 -0
  38. package/dist/events/emitter.js.map +1 -0
  39. package/dist/features/index.d.ts +342 -0
  40. package/dist/features/index.d.ts.map +1 -0
  41. package/dist/features/index.js +755 -0
  42. package/dist/features/index.js.map +1 -0
  43. package/dist/fixes/index.d.ts +333 -0
  44. package/dist/fixes/index.d.ts.map +1 -0
  45. package/dist/fixes/index.js +762 -0
  46. package/dist/fixes/index.js.map +1 -0
  47. package/dist/groups/management.d.ts +86 -0
  48. package/dist/groups/management.d.ts.map +1 -0
  49. package/dist/groups/management.js +443 -0
  50. package/dist/groups/management.js.map +1 -0
  51. package/dist/index.d.ts +65 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +236 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/messages/media.d.ts +93 -0
  56. package/dist/messages/media.d.ts.map +1 -0
  57. package/dist/messages/media.js +252 -0
  58. package/dist/messages/media.js.map +1 -0
  59. package/dist/messages/message-encoder.d.ts +70 -0
  60. package/dist/messages/message-encoder.d.ts.map +1 -0
  61. package/dist/messages/message-encoder.js +453 -0
  62. package/dist/messages/message-encoder.js.map +1 -0
  63. package/dist/messages/send.d.ts +101 -0
  64. package/dist/messages/send.d.ts.map +1 -0
  65. package/dist/messages/send.js +409 -0
  66. package/dist/messages/send.js.map +1 -0
  67. package/dist/recovery/index.d.ts +125 -0
  68. package/dist/recovery/index.d.ts.map +1 -0
  69. package/dist/recovery/index.js +584 -0
  70. package/dist/recovery/index.js.map +1 -0
  71. package/dist/skdm/index.d.ts +220 -0
  72. package/dist/skdm/index.d.ts.map +1 -0
  73. package/dist/skdm/index.js +600 -0
  74. package/dist/skdm/index.js.map +1 -0
  75. package/dist/socket/hybrid.d.ts +118 -0
  76. package/dist/socket/hybrid.d.ts.map +1 -0
  77. package/dist/socket/hybrid.js +352 -0
  78. package/dist/socket/hybrid.js.map +1 -0
  79. package/dist/socket/wa-socket.d.ts +300 -0
  80. package/dist/socket/wa-socket.d.ts.map +1 -0
  81. package/dist/socket/wa-socket.js +1094 -0
  82. package/dist/socket/wa-socket.js.map +1 -0
  83. package/dist/socket/ws-socket.d.ts +96 -0
  84. package/dist/socket/ws-socket.d.ts.map +1 -0
  85. package/dist/socket/ws-socket.js +302 -0
  86. package/dist/socket/ws-socket.js.map +1 -0
  87. package/dist/types/index.d.ts +444 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +7 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/utils/jid.d.ts +46 -0
  92. package/dist/utils/jid.d.ts.map +1 -0
  93. package/dist/utils/jid.js +152 -0
  94. package/dist/utils/jid.js.map +1 -0
  95. package/dist/utils/logger.d.ts +45 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +79 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/dist/utils/retry.d.ts +43 -0
  100. package/dist/utils/retry.d.ts.map +1 -0
  101. package/dist/utils/retry.js +175 -0
  102. package/dist/utils/retry.js.map +1 -0
  103. package/docs/API.md +745 -0
  104. package/docs/ARCHITECTURE.md +307 -0
  105. package/docs/BAILEYS_FIXES.md +360 -0
  106. package/docs/FEATURES.md +532 -0
  107. package/docs/PROTOCOL.md +489 -0
  108. package/docs/RECOVERY.md +409 -0
  109. package/docs/SKDM.md +233 -0
  110. package/examples/ai-bot/index.ts +479 -0
  111. package/examples/ai-bot/package.json +17 -0
  112. package/examples/echo-bot/index.ts +171 -0
  113. package/examples/echo-bot/package.json +18 -0
  114. package/examples/group-bot/index.ts +557 -0
  115. package/examples/group-bot/package.json +17 -0
  116. package/examples/rest-gateway/index.ts +499 -0
  117. package/examples/rest-gateway/package.json +19 -0
  118. package/package.json +75 -0
  119. package/src/advanced/features.ts +817 -0
  120. package/src/auth/auth-state.ts +342 -0
  121. package/src/auth/pairing-code.ts +246 -0
  122. package/src/auth/qr-code.ts +191 -0
  123. package/src/calls/handler.ts +153 -0
  124. package/src/core/binary.ts +464 -0
  125. package/src/core/crypto.ts +189 -0
  126. package/src/core/noise.ts +406 -0
  127. package/src/events/emitter.ts +88 -0
  128. package/src/features/index.ts +921 -0
  129. package/src/fixes/index.ts +882 -0
  130. package/src/groups/management.ts +497 -0
  131. package/src/index.ts +274 -0
  132. package/src/messages/media.ts +372 -0
  133. package/src/messages/message-encoder.ts +520 -0
  134. package/src/messages/send.ts +521 -0
  135. package/src/recovery/index.ts +704 -0
  136. package/src/skdm/index.ts +693 -0
  137. package/src/socket/hybrid.ts +414 -0
  138. package/src/socket/wa-socket.ts +1347 -0
  139. package/src/socket/ws-socket.ts +355 -0
  140. package/src/types/index.ts +457 -0
  141. package/src/utils/jid.ts +156 -0
  142. package/src/utils/logger.ts +84 -0
  143. package/src/utils/retry.ts +205 -0
  144. package/tsconfig.json +30 -0
@@ -0,0 +1,584 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - Multi-Branch SKDM Recovery System
4
+ *
5
+ * Unlike basic reconnect yang cuma coba 1 path, ini implementasi full multi-branch
6
+ * Session Key & Device Management (SKDM) recovery system.
7
+ *
8
+ * Saat disconnect terjadi, sistem mencoba multiple recovery strategies in order:
9
+ *
10
+ * ┌──────────────────────────┬───────────────────────────────────────────────────────────────┐
11
+ * │ Disconnect Reason │ Recovery Branches (in order) │
12
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
13
+ * │ Connection lost │ Immediate retry → Stream reconnect → Backoff → Key refresh → │
14
+ * │ │ Pre-key fetch → Full re-auth │
15
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
16
+ * │ Rate limited (429) │ Wait cooldown (5min) → Backoff retry │
17
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
18
+ * │ Restart required (428) │ Update app version → Key refresh → Full re-auth QR │
19
+ * ├──────────────────────────┼───────────────────────────────────────────────────────┤
20
+ * │ Logged out (401/403) │ Key refresh → No recovery (fatal) │
21
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
22
+ * │ Forbidden (511) │ Immediate retry → Key refresh → No recovery │
23
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
24
+ * │ Multi-device mismatch │ Key refresh → Full re-auth QR → No recovery │
25
+ * │ (409) │ │
26
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
27
+ * │ Bad session │ Key refresh → Pre-key fetch → Full re-auth QR │
28
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
29
+ * │ Connection replaced (440)│ Key refresh → Full re-auth QR │
30
+ * └──────────────────────────┴───────────────────────────────────────────────────────────────┘
31
+ *
32
+ * Each branch punya retry limit sendiri (default 3).
33
+ * Total attempts across all branches di-cap (default 20).
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RecoveryManager = exports.DEFAULT_RECOVERY_CONFIG = exports.DEFAULT_RECOVERY_BRANCHES = void 0;
37
+ exports.mapCodeToReason = mapCodeToReason;
38
+ exports.getActionDescription = getActionDescription;
39
+ exports.getReasonDescription = getReasonDescription;
40
+ const events_1 = require("events");
41
+ const logger_js_1 = require("../utils/logger.js");
42
+ const retry_js_1 = require("../utils/retry.js");
43
+ /**
44
+ * Map WhatsApp disconnect code ke DisconnectReason
45
+ */
46
+ function mapCodeToReason(code, reason) {
47
+ if (reason === 'normal' || code === 1000)
48
+ return 'normal';
49
+ if (code === 429)
50
+ return 'rate_limited';
51
+ if (code === 428)
52
+ return 'restart_required';
53
+ if (code === 401 || code === 403)
54
+ return 'logged_out';
55
+ if (code === 511)
56
+ return 'forbidden';
57
+ if (code === 409)
58
+ return 'multi_device_mismatch';
59
+ if (code === 440)
60
+ return 'connection_replaced';
61
+ if (code === 1006 || code === 1001 || code === undefined || code === 0)
62
+ return 'connection_lost';
63
+ // Check reason string untuk more context
64
+ if (reason) {
65
+ const r = reason.toLowerCase();
66
+ if (r.includes('logged out') || r.includes('unauthorized'))
67
+ return 'logged_out';
68
+ if (r.includes('rate limit') || r.includes('too many'))
69
+ return 'rate_limited';
70
+ if (r.includes('restart') || r.includes('update'))
71
+ return 'restart_required';
72
+ if (r.includes('forbidden'))
73
+ return 'forbidden';
74
+ if (r.includes('multi-device') || r.includes('mismatch'))
75
+ return 'multi_device_mismatch';
76
+ if (r.includes('replaced') || r.includes('another device'))
77
+ return 'connection_replaced';
78
+ if (r.includes('bad session') || r.includes('invalid session'))
79
+ return 'bad_session';
80
+ }
81
+ return 'unknown';
82
+ }
83
+ // ============== Recovery Branch Definitions ==============
84
+ exports.DEFAULT_RECOVERY_BRANCHES = [
85
+ {
86
+ reason: 'connection_lost',
87
+ actions: [
88
+ 'immediate_retry',
89
+ 'stream_reconnect',
90
+ 'backoff_retry',
91
+ 'key_refresh',
92
+ 'prekey_fetch',
93
+ 'full_reauth_qr'
94
+ ],
95
+ maxAttempts: 3
96
+ },
97
+ {
98
+ reason: 'rate_limited',
99
+ actions: [
100
+ 'wait_cooldown',
101
+ 'backoff_retry'
102
+ ],
103
+ maxAttempts: 3
104
+ },
105
+ {
106
+ reason: 'restart_required',
107
+ actions: [
108
+ 'update_app_version',
109
+ 'key_refresh',
110
+ 'full_reauth_qr'
111
+ ],
112
+ maxAttempts: 3
113
+ },
114
+ {
115
+ reason: 'logged_out',
116
+ actions: [
117
+ 'key_refresh'
118
+ ],
119
+ maxAttempts: 1,
120
+ fatal: true
121
+ },
122
+ {
123
+ reason: 'forbidden',
124
+ actions: [
125
+ 'immediate_retry',
126
+ 'key_refresh'
127
+ ],
128
+ maxAttempts: 3
129
+ },
130
+ {
131
+ reason: 'multi_device_mismatch',
132
+ actions: [
133
+ 'key_refresh',
134
+ 'full_reauth_qr'
135
+ ],
136
+ maxAttempts: 3
137
+ },
138
+ {
139
+ reason: 'bad_session',
140
+ actions: [
141
+ 'key_refresh',
142
+ 'prekey_fetch',
143
+ 'full_reauth_qr'
144
+ ],
145
+ maxAttempts: 3
146
+ },
147
+ {
148
+ reason: 'connection_replaced',
149
+ actions: [
150
+ 'key_refresh',
151
+ 'full_reauth_qr'
152
+ ],
153
+ maxAttempts: 3
154
+ },
155
+ {
156
+ reason: 'unknown',
157
+ actions: [
158
+ 'backoff_retry',
159
+ 'key_refresh',
160
+ 'full_reauth_qr'
161
+ ],
162
+ maxAttempts: 3
163
+ }
164
+ ];
165
+ exports.DEFAULT_RECOVERY_CONFIG = {
166
+ enabled: true,
167
+ maxAttemptsPerBranch: 3,
168
+ maxTotalAttempts: 20,
169
+ initialDelayMs: 1000,
170
+ maxDelayMs: 60000,
171
+ rateLimitedDelayMs: 300000
172
+ };
173
+ // ============== Recovery Manager ==============
174
+ class RecoveryManager extends events_1.EventEmitter {
175
+ config;
176
+ branches;
177
+ logger;
178
+ actionHandlers;
179
+ defaultHandlers;
180
+ isRecovering = false;
181
+ currentContext = null;
182
+ recoveryStats;
183
+ // Action callbacks - di-set oleh WASocket saat integrate
184
+ connect = async () => false;
185
+ streamReconnect = async () => false;
186
+ refreshKeys = async () => { };
187
+ fetchPreKeys = async () => { };
188
+ startFullReauth = async () => { };
189
+ updateAppVersion = async () => { };
190
+ constructor(config = {}) {
191
+ super();
192
+ this.config = { ...exports.DEFAULT_RECOVERY_CONFIG, ...config };
193
+ this.branches = config.branches ?? exports.DEFAULT_RECOVERY_BRANCHES;
194
+ this.logger = config.logger ?? new logger_js_1.SilentLogger();
195
+ this.actionHandlers = config.actionHandlers ?? {};
196
+ this.defaultHandlers = this.createDefaultHandlers();
197
+ this.recoveryStats = {
198
+ totalRecoveries: 0,
199
+ successfulRecoveries: 0,
200
+ failedRecoveries: 0,
201
+ byReason: new Map()
202
+ };
203
+ }
204
+ // ============== Public API ==============
205
+ async recover(reason, code, errorMessage) {
206
+ if (!this.config.enabled || reason === 'normal') {
207
+ this.logger.debug(`Recovery skipped (enabled=${this.config.enabled}, reason=${reason})`);
208
+ return false;
209
+ }
210
+ if (this.isRecovering) {
211
+ this.logger.warn('Recovery already in progress, ignoring new recovery request');
212
+ return false;
213
+ }
214
+ this.isRecovering = true;
215
+ this.recoveryStats.totalRecoveries++;
216
+ const ctx = {
217
+ reason,
218
+ code,
219
+ errorMessage,
220
+ attempt: 0,
221
+ totalAttempts: 0,
222
+ branchIndex: 0,
223
+ lastAttemptTime: Date.now(),
224
+ startTime: Date.now(),
225
+ history: []
226
+ };
227
+ this.currentContext = ctx;
228
+ this.emit('recovery:start', { reason, code, message: errorMessage });
229
+ this.logger.info(`Starting multi-branch recovery for reason: ${reason}${code ? ` (code ${code})` : ''}`);
230
+ const branch = this.branches.find(b => b.reason === reason);
231
+ if (!branch) {
232
+ this.logger.error(`No recovery branch found for reason: ${reason}`);
233
+ await this.failRecovery(ctx, false);
234
+ return false;
235
+ }
236
+ if (branch.fatal) {
237
+ this.logger.error(`Fatal disconnect reason: ${reason} - no recovery possible`);
238
+ for (const action of branch.actions) {
239
+ await this.runAction(action, ctx);
240
+ }
241
+ await this.failRecovery(ctx, true);
242
+ return false;
243
+ }
244
+ const maxPerBranch = branch.maxAttempts ?? this.config.maxAttemptsPerBranch;
245
+ const branchActions = branch.actions;
246
+ this.emit('recovery:branch:start', {
247
+ reason,
248
+ branchIndex: 0,
249
+ actions: branchActions
250
+ });
251
+ this.logger.info(`Recovery branch for ${reason}: ${branchActions.join(' → ')}`);
252
+ for (let actionIdx = 0; actionIdx < branchActions.length; actionIdx++) {
253
+ const action = branchActions[actionIdx];
254
+ let branchSuccess = false;
255
+ for (let attempt = 1; attempt <= maxPerBranch; attempt++) {
256
+ if (ctx.totalAttempts >= this.config.maxTotalAttempts) {
257
+ this.logger.error(`Total max attempts (${this.config.maxTotalAttempts}) reached`);
258
+ await this.failRecovery(ctx, false);
259
+ return false;
260
+ }
261
+ ctx.attempt = attempt;
262
+ ctx.totalAttempts++;
263
+ const progress = (ctx.totalAttempts / this.config.maxTotalAttempts) * 100;
264
+ this.emit('recovery:progress', {
265
+ currentAction: action,
266
+ totalAttempts: ctx.totalAttempts,
267
+ maxTotalAttempts: this.config.maxTotalAttempts,
268
+ progress
269
+ });
270
+ const success = await this.runAction(action, ctx);
271
+ if (success) {
272
+ branchSuccess = true;
273
+ break;
274
+ }
275
+ if (attempt < maxPerBranch) {
276
+ const delay = this.calculateDelay(action, attempt);
277
+ this.logger.debug(`Waiting ${delay}ms before next attempt`);
278
+ await (0, retry_js_1.sleep)(delay);
279
+ }
280
+ }
281
+ if (branchSuccess) {
282
+ await this.succeedRecovery(ctx);
283
+ return true;
284
+ }
285
+ if (actionIdx < branchActions.length - 1) {
286
+ this.logger.info(`Action ${action} exhausted, moving to next action: ${branchActions[actionIdx + 1]}`);
287
+ }
288
+ }
289
+ this.emit('recovery:branch:exhausted', {
290
+ reason,
291
+ branchIndex: 0,
292
+ attempts: ctx.totalAttempts
293
+ });
294
+ await this.failRecovery(ctx, false);
295
+ return false;
296
+ }
297
+ async runAction(action, ctx) {
298
+ const startTime = Date.now();
299
+ this.emit('recovery:action:start', {
300
+ action,
301
+ attempt: ctx.attempt,
302
+ branchIndex: ctx.branchIndex
303
+ });
304
+ this.logger.info(`Recovery action: ${action} (attempt ${ctx.attempt})`);
305
+ try {
306
+ const handler = this.actionHandlers[action] ?? this.defaultHandlers[action];
307
+ if (!handler) {
308
+ throw new Error(`No handler for action: ${action}`);
309
+ }
310
+ const success = await handler(ctx);
311
+ const duration = Date.now() - startTime;
312
+ ctx.history.push({
313
+ action,
314
+ success,
315
+ duration,
316
+ timestamp: Date.now()
317
+ });
318
+ if (success) {
319
+ this.emit('recovery:action:success', { action, attempt: ctx.attempt, duration });
320
+ this.logger.info(`Recovery action ${action} succeeded in ${duration}ms`);
321
+ }
322
+ else {
323
+ this.emit('recovery:action:failed', {
324
+ action,
325
+ attempt: ctx.attempt,
326
+ error: 'Action returned false',
327
+ duration
328
+ });
329
+ this.logger.warn(`Recovery action ${action} failed (attempt ${ctx.attempt})`);
330
+ }
331
+ return success;
332
+ }
333
+ catch (err) {
334
+ const duration = Date.now() - startTime;
335
+ ctx.history.push({
336
+ action,
337
+ success: false,
338
+ duration,
339
+ error: err.message,
340
+ timestamp: Date.now()
341
+ });
342
+ this.emit('recovery:action:failed', {
343
+ action,
344
+ attempt: ctx.attempt,
345
+ error: err.message,
346
+ duration
347
+ });
348
+ this.logger.error(`Recovery action ${action} threw error: ${err.message}`);
349
+ return false;
350
+ }
351
+ }
352
+ calculateDelay(action, attempt) {
353
+ switch (action) {
354
+ case 'wait_cooldown':
355
+ return this.config.rateLimitedDelayMs;
356
+ case 'immediate_retry':
357
+ return 0;
358
+ case 'stream_reconnect':
359
+ return Math.min(this.config.initialDelayMs, 500);
360
+ case 'backoff_retry':
361
+ case 'key_refresh':
362
+ case 'prekey_fetch':
363
+ case 'full_reauth_qr':
364
+ case 'update_app_version':
365
+ return Math.min(this.config.initialDelayMs * Math.pow(2, attempt - 1), this.config.maxDelayMs);
366
+ default:
367
+ return this.config.initialDelayMs;
368
+ }
369
+ }
370
+ // ============== Default Action Handlers ==============
371
+ createDefaultHandlers() {
372
+ return {
373
+ immediate_retry: async (ctx) => {
374
+ this.logger.info('Immediate retry: attempting reconnect...');
375
+ try {
376
+ return await this.connect();
377
+ }
378
+ catch (err) {
379
+ this.logger.error(`Immediate retry failed: ${err.message}`);
380
+ return false;
381
+ }
382
+ },
383
+ stream_reconnect: async (ctx) => {
384
+ this.logger.info('Stream reconnect: attempting to resume stream state...');
385
+ try {
386
+ return await this.streamReconnect();
387
+ }
388
+ catch (err) {
389
+ this.logger.error(`Stream reconnect failed: ${err.message}`);
390
+ return false;
391
+ }
392
+ },
393
+ backoff_retry: async (ctx) => {
394
+ const delay = Math.min(this.config.initialDelayMs * Math.pow(2, ctx.attempt - 1), this.config.maxDelayMs);
395
+ this.logger.info(`Backoff retry: waiting ${delay}ms before retry...`);
396
+ await (0, retry_js_1.sleep)(delay);
397
+ try {
398
+ return await this.connect();
399
+ }
400
+ catch (err) {
401
+ this.logger.error(`Backoff retry failed: ${err.message}`);
402
+ return false;
403
+ }
404
+ },
405
+ wait_cooldown: async (ctx) => {
406
+ this.logger.info(`Rate limited: waiting ${this.config.rateLimitedDelayMs}ms cooldown...`);
407
+ await (0, retry_js_1.sleep)(this.config.rateLimitedDelayMs);
408
+ try {
409
+ return await this.connect();
410
+ }
411
+ catch (err) {
412
+ this.logger.error(`Cooldown retry failed: ${err.message}`);
413
+ return false;
414
+ }
415
+ },
416
+ update_app_version: async (ctx) => {
417
+ this.logger.info('Updating app version (browser identification)...');
418
+ try {
419
+ await this.updateAppVersion();
420
+ return await this.connect();
421
+ }
422
+ catch (err) {
423
+ this.logger.error(`Update app version failed: ${err.message}`);
424
+ return false;
425
+ }
426
+ },
427
+ key_refresh: async (ctx) => {
428
+ this.logger.info('Refreshing keys (SKDM)...');
429
+ try {
430
+ await this.refreshKeys();
431
+ return await this.connect();
432
+ }
433
+ catch (err) {
434
+ this.logger.error(`Key refresh failed: ${err.message}`);
435
+ return false;
436
+ }
437
+ },
438
+ prekey_fetch: async (ctx) => {
439
+ this.logger.info('Fetching pre-keys...');
440
+ try {
441
+ await this.fetchPreKeys();
442
+ return await this.connect();
443
+ }
444
+ catch (err) {
445
+ this.logger.error(`Pre-key fetch failed: ${err.message}`);
446
+ return false;
447
+ }
448
+ },
449
+ full_reauth_qr: async (ctx) => {
450
+ this.logger.info('Starting full re-authentication (new QR)...');
451
+ try {
452
+ await this.startFullReauth();
453
+ await (0, retry_js_1.sleep)(5000);
454
+ return await this.connect();
455
+ }
456
+ catch (err) {
457
+ this.logger.error(`Full re-auth failed: ${err.message}`);
458
+ return false;
459
+ }
460
+ },
461
+ no_recovery: async (ctx) => {
462
+ this.logger.error('No recovery possible for this disconnect reason');
463
+ return false;
464
+ }
465
+ };
466
+ }
467
+ // ============== Success/Failure Handling ==============
468
+ async succeedRecovery(ctx) {
469
+ const duration = Date.now() - ctx.startTime;
470
+ this.isRecovering = false;
471
+ this.currentContext = null;
472
+ this.recoveryStats.successfulRecoveries++;
473
+ this.recordReasonResult(ctx.reason, true);
474
+ this.emit('recovery:success', {
475
+ reason: ctx.reason,
476
+ totalAttempts: ctx.totalAttempts,
477
+ duration
478
+ });
479
+ this.logger.info(`Recovery succeeded after ${ctx.totalAttempts} attempts in ${duration}ms`);
480
+ }
481
+ async failRecovery(ctx, fatal) {
482
+ const duration = Date.now() - ctx.startTime;
483
+ this.isRecovering = false;
484
+ this.currentContext = null;
485
+ this.recoveryStats.failedRecoveries++;
486
+ this.recordReasonResult(ctx.reason, false);
487
+ this.emit('recovery:failed', {
488
+ reason: ctx.reason,
489
+ totalAttempts: ctx.totalAttempts,
490
+ duration,
491
+ fatal
492
+ });
493
+ this.logger.error(`Recovery failed after ${ctx.totalAttempts} attempts in ${duration}ms (fatal: ${fatal})`);
494
+ }
495
+ recordReasonResult(reason, success) {
496
+ let stats = this.recoveryStats.byReason.get(reason);
497
+ if (!stats) {
498
+ stats = { success: 0, failure: 0 };
499
+ this.recoveryStats.byReason.set(reason, stats);
500
+ }
501
+ if (success)
502
+ stats.success++;
503
+ else
504
+ stats.failure++;
505
+ }
506
+ // ============== Public Helpers ==============
507
+ isCurrentlyRecovering() {
508
+ return this.isRecovering;
509
+ }
510
+ getCurrentContext() {
511
+ return this.currentContext;
512
+ }
513
+ getStats() {
514
+ const byReasonObj = {};
515
+ for (const [reason, stats] of this.recoveryStats.byReason.entries()) {
516
+ byReasonObj[reason] = stats;
517
+ }
518
+ return {
519
+ totalRecoveries: this.recoveryStats.totalRecoveries,
520
+ successfulRecoveries: this.recoveryStats.successfulRecoveries,
521
+ failedRecoveries: this.recoveryStats.failedRecoveries,
522
+ successRate: this.recoveryStats.totalRecoveries === 0
523
+ ? 0
524
+ : this.recoveryStats.successfulRecoveries / this.recoveryStats.totalRecoveries,
525
+ byReason: byReasonObj
526
+ };
527
+ }
528
+ getBranchForReason(reason) {
529
+ return this.branches.find(b => b.reason === reason);
530
+ }
531
+ cancel() {
532
+ if (!this.isRecovering)
533
+ return;
534
+ this.logger.warn('Recovery cancelled by user');
535
+ this.isRecovering = false;
536
+ this.currentContext = null;
537
+ this.emit('recovery:failed', {
538
+ reason: 'unknown',
539
+ totalAttempts: 0,
540
+ duration: 0,
541
+ fatal: false
542
+ });
543
+ }
544
+ resetStats() {
545
+ this.recoveryStats = {
546
+ totalRecoveries: 0,
547
+ successfulRecoveries: 0,
548
+ failedRecoveries: 0,
549
+ byReason: new Map()
550
+ };
551
+ }
552
+ }
553
+ exports.RecoveryManager = RecoveryManager;
554
+ // ============== Helpers ==============
555
+ function getActionDescription(action) {
556
+ const descriptions = {
557
+ immediate_retry: 'Coba reconnect langsung tanpa delay',
558
+ stream_reconnect: 'Resume koneksi dari stream state yang tersimpan',
559
+ backoff_retry: 'Reconnect dengan exponential backoff',
560
+ wait_cooldown: 'Tunggu cooldown 5 menit (untuk rate limit)',
561
+ update_app_version: 'Update identifikasi browser/app version',
562
+ key_refresh: 'Refresh Signal keys via SKDM',
563
+ prekey_fetch: 'Fetch pre-keys baru dari server',
564
+ full_reauth_qr: 'Full re-authentication dengan QR code baru',
565
+ no_recovery: 'Tidak ada recovery yang possible (fatal)'
566
+ };
567
+ return descriptions[action] || action;
568
+ }
569
+ function getReasonDescription(reason) {
570
+ const descriptions = {
571
+ connection_lost: 'Koneksi terputus tanpa alasan spesifik',
572
+ rate_limited: 'Rate limited oleh server (HTTP 429)',
573
+ restart_required: 'Server memerlukan restart/update (HTTP 428)',
574
+ logged_out: 'Logged out dari WhatsApp (HTTP 401/403) - fatal',
575
+ forbidden: 'Akses forbidden (HTTP 511)',
576
+ multi_device_mismatch: 'Multi-device state mismatch (HTTP 409)',
577
+ bad_session: 'Session tidak valid',
578
+ connection_replaced: 'Koneksi diganti dengan device lain (HTTP 440)',
579
+ normal: 'Normal close (intentional)',
580
+ unknown: 'Unknown disconnect reason'
581
+ };
582
+ return descriptions[reason] || reason;
583
+ }
584
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"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"}