@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,409 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - Message send/receive operations
4
+ * High-level API untuk kirim dan terima pesan
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MessageReceiver = exports.MessageSender = exports.PendingMessageTracker = void 0;
8
+ exports.buildReadReceiptNode = buildReadReceiptNode;
9
+ exports.buildChatPresenceNode = buildChatPresenceNode;
10
+ const message_encoder_js_1 = require("./message-encoder.js");
11
+ const binary_js_1 = require("../core/binary.js");
12
+ const jid_js_1 = require("../utils/jid.js");
13
+ const logger_js_1 = require("../utils/logger.js");
14
+ /**
15
+ * Track pending message sends untuk kaitin response dengan server ACK
16
+ */
17
+ class PendingMessageTracker {
18
+ pending = new Map();
19
+ add(jid, messageId, resolve, reject, timeoutMs = 30000) {
20
+ const timeout = setTimeout(() => {
21
+ this.pending.delete(messageId);
22
+ reject(new Error(`Message send timeout for ${messageId}`));
23
+ }, timeoutMs);
24
+ this.pending.set(messageId, { jid, messageId, resolve, reject, timeout });
25
+ }
26
+ resolve(messageId, result) {
27
+ const p = this.pending.get(messageId);
28
+ if (p) {
29
+ clearTimeout(p.timeout);
30
+ this.pending.delete(messageId);
31
+ p.resolve(result);
32
+ }
33
+ }
34
+ reject(messageId, err) {
35
+ const p = this.pending.get(messageId);
36
+ if (p) {
37
+ clearTimeout(p.timeout);
38
+ this.pending.delete(messageId);
39
+ p.reject(err);
40
+ }
41
+ }
42
+ /** Clear all pending (untuk disconnect) */
43
+ rejectAll(err) {
44
+ for (const [, p] of this.pending) {
45
+ clearTimeout(p.timeout);
46
+ p.reject(err);
47
+ }
48
+ this.pending.clear();
49
+ }
50
+ size() {
51
+ return this.pending.size;
52
+ }
53
+ }
54
+ exports.PendingMessageTracker = PendingMessageTracker;
55
+ class MessageSender {
56
+ send;
57
+ logger;
58
+ tracker;
59
+ constructor(opts) {
60
+ this.send = opts.send;
61
+ this.logger = opts.logger ?? new logger_js_1.SilentLogger();
62
+ this.tracker = opts.tracker ?? new PendingMessageTracker();
63
+ }
64
+ /**
65
+ * Send message ke recipient
66
+ */
67
+ async sendMessage(jid, content, options = {}) {
68
+ const messageId = options.messageId ?? (0, message_encoder_js_1.generateMessageId)();
69
+ const jidStr = (0, jid_js_1.jidToString)(jid);
70
+ this.logger.debug(`Sending message ${messageId} to ${jidStr}`);
71
+ // Build message node
72
+ const messageNode = (0, message_encoder_js_1.encodeMessageNode)(jid, content, {
73
+ messageId,
74
+ participant: options.participant
75
+ });
76
+ // Wrap dalam <message> envelope
77
+ const envelope = {
78
+ tag: 'message',
79
+ attrs: {
80
+ to: jidStr,
81
+ type: 'text',
82
+ id: messageId
83
+ },
84
+ content: [messageNode]
85
+ };
86
+ const binaryData = (0, binary_js_1.encodeBinaryNode)(envelope);
87
+ // Promise yang resolve ketika server ACK
88
+ return new Promise((resolve, reject) => {
89
+ this.tracker.add(jidStr, messageId, resolve, reject, options.timeoutMs);
90
+ try {
91
+ this.send(binaryData);
92
+ }
93
+ catch (err) {
94
+ this.tracker.reject(messageId, err);
95
+ }
96
+ });
97
+ }
98
+ /**
99
+ * Forward message ke recipient lain
100
+ */
101
+ async forwardMessage(to, message, options = {}) {
102
+ const messageId = (0, message_encoder_js_1.generateMessageId)();
103
+ const jidStr = (0, jid_js_1.jidToString)(to);
104
+ this.logger.debug(`Forwarding message ${message.key.id} -> ${jidStr}`);
105
+ // Build forward node: <message to=... type=... id=...>
106
+ // dengan contextInfo.forwardingScore dan original message
107
+ const forwardNode = {
108
+ tag: 'message',
109
+ attrs: {
110
+ to: jidStr,
111
+ type: 'text',
112
+ id: messageId
113
+ },
114
+ content: [
115
+ message.message?.text ? {
116
+ tag: 'conversation',
117
+ attrs: {},
118
+ content: message.message.text
119
+ } : null,
120
+ {
121
+ tag: 'contextInfo',
122
+ attrs: {},
123
+ content: [
124
+ {
125
+ tag: 'stanzaId',
126
+ attrs: {},
127
+ content: message.key.id
128
+ },
129
+ {
130
+ tag: 'participant',
131
+ attrs: {},
132
+ content: (0, jid_js_1.jidToString)(message.key.participant ?? message.key.remoteJid)
133
+ },
134
+ {
135
+ tag: 'forwardingScore',
136
+ attrs: {},
137
+ content: '1'
138
+ }
139
+ ]
140
+ }
141
+ ].filter(Boolean)
142
+ };
143
+ const binaryData = (0, binary_js_1.encodeBinaryNode)(forwardNode);
144
+ return new Promise((resolve, reject) => {
145
+ this.tracker.add(jidStr, messageId, resolve, reject, options.timeoutMs);
146
+ try {
147
+ this.send(binaryData);
148
+ }
149
+ catch (err) {
150
+ this.tracker.reject(messageId, err);
151
+ }
152
+ });
153
+ }
154
+ /**
155
+ * Delete message (revoke)
156
+ */
157
+ async deleteMessage(jid, key, options = {}) {
158
+ const messageId = (0, message_encoder_js_1.generateMessageId)();
159
+ const jidStr = (0, jid_js_1.jidToString)(jid);
160
+ const revokeNode = {
161
+ tag: 'message',
162
+ attrs: {
163
+ to: jidStr,
164
+ type: 'revoke',
165
+ id: messageId
166
+ },
167
+ content: [
168
+ {
169
+ tag: 'revokeMessage',
170
+ attrs: {
171
+ id: key.id,
172
+ fromMe: key.fromMe ? 'true' : 'false',
173
+ participant: (0, jid_js_1.jidToString)(key.participant ?? key.remoteJid),
174
+ type: options.revokeEveryone ? 'everyone' : 'me'
175
+ }
176
+ }
177
+ ]
178
+ };
179
+ const binaryData = (0, binary_js_1.encodeBinaryNode)(revokeNode);
180
+ return new Promise((resolve, reject) => {
181
+ this.tracker.add(jidStr, messageId, resolve, reject, options.timeoutMs);
182
+ try {
183
+ this.send(binaryData);
184
+ }
185
+ catch (err) {
186
+ this.tracker.reject(messageId, err);
187
+ }
188
+ });
189
+ }
190
+ /**
191
+ * React ke message dengan emoji
192
+ */
193
+ async reactToMessage(jid, key, emoji, options = {}) {
194
+ const messageId = (0, message_encoder_js_1.generateMessageId)();
195
+ const jidStr = (0, jid_js_1.jidToString)(jid);
196
+ const reactionNode = {
197
+ tag: 'message',
198
+ attrs: {
199
+ to: jidStr,
200
+ type: 'reaction',
201
+ id: messageId
202
+ },
203
+ content: [
204
+ {
205
+ tag: 'reactionMessage',
206
+ attrs: {
207
+ key: JSON.stringify({
208
+ id: key.id,
209
+ fromMe: key.fromMe,
210
+ remoteJid: (0, jid_js_1.jidToString)(key.remoteJid),
211
+ participant: key.participant ? (0, jid_js_1.jidToString)(key.participant) : undefined
212
+ }),
213
+ text: emoji,
214
+ timestamp: Math.floor(Date.now() / 1000).toString()
215
+ }
216
+ }
217
+ ]
218
+ };
219
+ const binaryData = (0, binary_js_1.encodeBinaryNode)(reactionNode);
220
+ return new Promise((resolve, reject) => {
221
+ this.tracker.add(jidStr, messageId, resolve, reject, options.timeoutMs);
222
+ try {
223
+ this.send(binaryData);
224
+ }
225
+ catch (err) {
226
+ this.tracker.reject(messageId, err);
227
+ }
228
+ });
229
+ }
230
+ /**
231
+ * Update tracker ketika ACK diterima
232
+ */
233
+ handleAck(messageId, status, timestamp) {
234
+ this.tracker.resolve(messageId, {
235
+ key: {
236
+ remoteJid: '',
237
+ fromMe: true,
238
+ id: messageId
239
+ },
240
+ status,
241
+ messageTimestamp: timestamp
242
+ });
243
+ }
244
+ /**
245
+ * Reject all pending (untuk disconnect)
246
+ */
247
+ destroy() {
248
+ this.tracker.rejectAll(new Error('Connection closed'));
249
+ }
250
+ }
251
+ exports.MessageSender = MessageSender;
252
+ class MessageReceiver {
253
+ logger;
254
+ onMessage;
255
+ onStatusUpdate;
256
+ constructor(opts) {
257
+ this.logger = opts.logger ?? new logger_js_1.SilentLogger();
258
+ this.onMessage = opts.onMessage;
259
+ this.onStatusUpdate = opts.onStatusUpdate;
260
+ }
261
+ /**
262
+ * Handle incoming binary node (dari WebSocket)
263
+ */
264
+ handleNode(node) {
265
+ if (!node)
266
+ return;
267
+ switch (node.tag) {
268
+ case 'message':
269
+ this.handleMessageNode(node);
270
+ break;
271
+ case 'receipt':
272
+ this.handleReceiptNode(node);
273
+ break;
274
+ case 'status':
275
+ this.handleStatusNode(node);
276
+ break;
277
+ case 'ack':
278
+ this.handleAckNode(node);
279
+ break;
280
+ default:
281
+ // Unknown node type
282
+ this.logger.trace(`Unhandled node: ${node.tag}`);
283
+ }
284
+ }
285
+ handleMessageNode(node) {
286
+ if (!this.onMessage)
287
+ return;
288
+ const attrs = node.attrs || {};
289
+ const from = attrs.from ?? '';
290
+ const fromMe = attrs.fromMe === 'true' || attrs.type === 'send';
291
+ const id = attrs.id;
292
+ const type = attrs.type;
293
+ // Convert ke WAMessage
294
+ const message = (0, message_encoder_js_1.decodeMessageNode)(node, fromMe);
295
+ if (!message)
296
+ return;
297
+ this.logger.debug(`Received message ${id} from ${from} (type: ${type})`);
298
+ this.onMessage([message], type === 'append' ? 'append' : 'notify');
299
+ }
300
+ handleReceiptNode(node) {
301
+ const attrs = node.attrs || {};
302
+ const id = attrs.id;
303
+ const type = attrs.type;
304
+ const from = attrs.from;
305
+ if (!this.onStatusUpdate || !id)
306
+ return;
307
+ const statusMap = {
308
+ 'read': 'read',
309
+ 'delivered': 'delivered',
310
+ 'played': 'played'
311
+ };
312
+ const status = statusMap[type];
313
+ if (status) {
314
+ this.onStatusUpdate({
315
+ remoteJid: from,
316
+ fromMe: true,
317
+ id
318
+ }, status);
319
+ }
320
+ }
321
+ handleStatusNode(node) {
322
+ const attrs = node.attrs || {};
323
+ const id = attrs.id;
324
+ const type = attrs.type;
325
+ const from = attrs.from;
326
+ if (!this.onStatusUpdate || !id)
327
+ return;
328
+ const statusMap = {
329
+ 'read': 'read',
330
+ 'delivered': 'delivered',
331
+ 'played': 'played'
332
+ };
333
+ const status = statusMap[type];
334
+ if (status) {
335
+ this.onStatusUpdate({
336
+ remoteJid: from,
337
+ fromMe: true,
338
+ id
339
+ }, status);
340
+ }
341
+ }
342
+ handleAckNode(node) {
343
+ // ACK dari server untuk confirm message received
344
+ const attrs = node.attrs || {};
345
+ const id = attrs.id;
346
+ const type = attrs.type;
347
+ if (!id)
348
+ return;
349
+ const statusMap = {
350
+ 'received': 'sent',
351
+ 'read': 'read',
352
+ 'played': 'played'
353
+ };
354
+ const status = statusMap[type] ?? 'sent';
355
+ if (this.onStatusUpdate) {
356
+ this.onStatusUpdate({
357
+ remoteJid: '',
358
+ fromMe: true,
359
+ id
360
+ }, status);
361
+ }
362
+ }
363
+ /**
364
+ * Set handlers (untuk runtime binding)
365
+ */
366
+ setHandlers(opts) {
367
+ this.onMessage = opts.onMessage;
368
+ this.onStatusUpdate = opts.onStatusUpdate;
369
+ }
370
+ }
371
+ exports.MessageReceiver = MessageReceiver;
372
+ // ============== Read Receipt Sender ==============
373
+ /**
374
+ * Send read receipts untuk incoming messages
375
+ */
376
+ function buildReadReceiptNode(jid, messageIds, participant) {
377
+ const attrs = {
378
+ to: (0, jid_js_1.jidToString)(jid),
379
+ type: 'read',
380
+ id: messageIds[0]
381
+ };
382
+ if (participant)
383
+ attrs.participant = (0, jid_js_1.jidToString)(participant);
384
+ return {
385
+ tag: 'receipt',
386
+ attrs,
387
+ content: messageIds.map(id => ({
388
+ tag: 'receipt',
389
+ attrs: { id, t: Math.floor(Date.now() / 1000).toString() }
390
+ }))
391
+ };
392
+ }
393
+ /**
394
+ * Send typing indicator
395
+ */
396
+ function buildChatPresenceNode(jid, type, media) {
397
+ return {
398
+ tag: 'chat',
399
+ attrs: {
400
+ to: (0, jid_js_1.jidToString)(jid),
401
+ type
402
+ },
403
+ content: media ? [{
404
+ tag: media,
405
+ attrs: {}
406
+ }] : undefined
407
+ };
408
+ }
409
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/messages/send.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Waliwa - Multi-Branch SKDM Recovery System
3
+ *
4
+ * Unlike basic reconnect yang cuma coba 1 path, ini implementasi full multi-branch
5
+ * Session Key & Device Management (SKDM) recovery system.
6
+ *
7
+ * Saat disconnect terjadi, sistem mencoba multiple recovery strategies in order:
8
+ *
9
+ * ┌──────────────────────────┬───────────────────────────────────────────────────────────────┐
10
+ * │ Disconnect Reason │ Recovery Branches (in order) │
11
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
12
+ * │ Connection lost │ Immediate retry → Stream reconnect → Backoff → Key refresh → │
13
+ * │ │ Pre-key fetch → Full re-auth │
14
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
15
+ * │ Rate limited (429) │ Wait cooldown (5min) → Backoff retry │
16
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
17
+ * │ Restart required (428) │ Update app version → Key refresh → Full re-auth QR │
18
+ * ├──────────────────────────┼───────────────────────────────────────────────────────┤
19
+ * │ Logged out (401/403) │ Key refresh → No recovery (fatal) │
20
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
21
+ * │ Forbidden (511) │ Immediate retry → Key refresh → No recovery │
22
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
23
+ * │ Multi-device mismatch │ Key refresh → Full re-auth QR → No recovery │
24
+ * │ (409) │ │
25
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
26
+ * │ Bad session │ Key refresh → Pre-key fetch → Full re-auth QR │
27
+ * ├──────────────────────────┼───────────────────────────────────────────────────────────────┤
28
+ * │ Connection replaced (440)│ Key refresh → Full re-auth QR │
29
+ * └──────────────────────────┴───────────────────────────────────────────────────────────────┘
30
+ *
31
+ * Each branch punya retry limit sendiri (default 3).
32
+ * Total attempts across all branches di-cap (default 20).
33
+ */
34
+ import { EventEmitter } from 'events';
35
+ import type { WALogger } from '../types/index.js';
36
+ export type DisconnectReason = 'connection_lost' | 'rate_limited' | 'restart_required' | 'logged_out' | 'forbidden' | 'multi_device_mismatch' | 'bad_session' | 'connection_replaced' | 'normal' | 'unknown';
37
+ /**
38
+ * Map WhatsApp disconnect code ke DisconnectReason
39
+ */
40
+ export declare function mapCodeToReason(code: number | undefined, reason?: string): DisconnectReason;
41
+ export type RecoveryAction = 'immediate_retry' | 'stream_reconnect' | 'backoff_retry' | 'wait_cooldown' | 'update_app_version' | 'key_refresh' | 'prekey_fetch' | 'full_reauth_qr' | 'no_recovery';
42
+ /**
43
+ * Recovery context - passed ke setiap action handler
44
+ */
45
+ export interface RecoveryContext {
46
+ reason: DisconnectReason;
47
+ code?: number;
48
+ errorMessage?: string;
49
+ attempt: number;
50
+ totalAttempts: number;
51
+ branchIndex: number;
52
+ lastAttemptTime: number;
53
+ startTime: number;
54
+ history: Array<{
55
+ action: RecoveryAction;
56
+ success: boolean;
57
+ duration: number;
58
+ error?: string;
59
+ timestamp: number;
60
+ }>;
61
+ }
62
+ /**
63
+ * Recovery branch - ordered list of actions untuk a reason
64
+ */
65
+ export interface RecoveryBranch {
66
+ reason: DisconnectReason;
67
+ actions: RecoveryAction[];
68
+ maxAttempts?: number;
69
+ fatal?: boolean;
70
+ }
71
+ export declare const DEFAULT_RECOVERY_BRANCHES: RecoveryBranch[];
72
+ export interface RecoveryConfig {
73
+ enabled?: boolean;
74
+ maxAttemptsPerBranch?: number;
75
+ maxTotalAttempts?: number;
76
+ initialDelayMs?: number;
77
+ maxDelayMs?: number;
78
+ rateLimitedDelayMs?: number;
79
+ branches?: RecoveryBranch[];
80
+ logger?: WALogger;
81
+ actionHandlers?: Partial<Record<RecoveryAction, (ctx: RecoveryContext) => Promise<boolean>>>;
82
+ }
83
+ export declare const DEFAULT_RECOVERY_CONFIG: Required<Omit<RecoveryConfig, 'logger' | 'branches' | 'actionHandlers'>>;
84
+ export declare class RecoveryManager extends EventEmitter {
85
+ private config;
86
+ private branches;
87
+ private logger;
88
+ private actionHandlers;
89
+ private defaultHandlers;
90
+ private isRecovering;
91
+ private currentContext;
92
+ private recoveryStats;
93
+ connect: () => Promise<boolean>;
94
+ streamReconnect: () => Promise<boolean>;
95
+ refreshKeys: () => Promise<void>;
96
+ fetchPreKeys: () => Promise<void>;
97
+ startFullReauth: () => Promise<void>;
98
+ updateAppVersion: () => Promise<void>;
99
+ constructor(config?: RecoveryConfig);
100
+ recover(reason: DisconnectReason, code?: number, errorMessage?: string): Promise<boolean>;
101
+ private runAction;
102
+ private calculateDelay;
103
+ private createDefaultHandlers;
104
+ private succeedRecovery;
105
+ private failRecovery;
106
+ private recordReasonResult;
107
+ isCurrentlyRecovering(): boolean;
108
+ getCurrentContext(): RecoveryContext | null;
109
+ getStats(): {
110
+ totalRecoveries: number;
111
+ successfulRecoveries: number;
112
+ failedRecoveries: number;
113
+ successRate: number;
114
+ byReason: Record<string, {
115
+ success: number;
116
+ failure: number;
117
+ }>;
118
+ };
119
+ getBranchForReason(reason: DisconnectReason): RecoveryBranch | undefined;
120
+ cancel(): void;
121
+ resetStats(): void;
122
+ }
123
+ export declare function getActionDescription(action: RecoveryAction): string;
124
+ export declare function getReasonDescription(reason: DisconnectReason): string;
125
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"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"}