@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.
- package/LICENSE +21 -0
- package/README.md +600 -0
- package/dist/advanced/features.d.ts +211 -0
- package/dist/advanced/features.d.ts.map +1 -0
- package/dist/advanced/features.js +671 -0
- package/dist/advanced/features.js.map +1 -0
- package/dist/auth/auth-state.d.ts +89 -0
- package/dist/auth/auth-state.d.ts.map +1 -0
- package/dist/auth/auth-state.js +330 -0
- package/dist/auth/auth-state.js.map +1 -0
- package/dist/auth/pairing-code.d.ts +78 -0
- package/dist/auth/pairing-code.d.ts.map +1 -0
- package/dist/auth/pairing-code.js +191 -0
- package/dist/auth/pairing-code.js.map +1 -0
- package/dist/auth/qr-code.d.ts +60 -0
- package/dist/auth/qr-code.d.ts.map +1 -0
- package/dist/auth/qr-code.js +151 -0
- package/dist/auth/qr-code.js.map +1 -0
- package/dist/calls/handler.d.ts +61 -0
- package/dist/calls/handler.d.ts.map +1 -0
- package/dist/calls/handler.js +117 -0
- package/dist/calls/handler.js.map +1 -0
- package/dist/core/binary.d.ts +74 -0
- package/dist/core/binary.d.ts.map +1 -0
- package/dist/core/binary.js +448 -0
- package/dist/core/binary.js.map +1 -0
- package/dist/core/crypto.d.ts +60 -0
- package/dist/core/crypto.d.ts.map +1 -0
- package/dist/core/crypto.js +170 -0
- package/dist/core/crypto.js.map +1 -0
- package/dist/core/noise.d.ts +106 -0
- package/dist/core/noise.d.ts.map +1 -0
- package/dist/core/noise.js +307 -0
- package/dist/core/noise.js.map +1 -0
- package/dist/events/emitter.d.ts +44 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +79 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/features/index.d.ts +342 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +755 -0
- package/dist/features/index.js.map +1 -0
- package/dist/fixes/index.d.ts +333 -0
- package/dist/fixes/index.d.ts.map +1 -0
- package/dist/fixes/index.js +762 -0
- package/dist/fixes/index.js.map +1 -0
- package/dist/groups/management.d.ts +86 -0
- package/dist/groups/management.d.ts.map +1 -0
- package/dist/groups/management.js +443 -0
- package/dist/groups/management.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +236 -0
- package/dist/index.js.map +1 -0
- package/dist/messages/media.d.ts +93 -0
- package/dist/messages/media.d.ts.map +1 -0
- package/dist/messages/media.js +252 -0
- package/dist/messages/media.js.map +1 -0
- package/dist/messages/message-encoder.d.ts +70 -0
- package/dist/messages/message-encoder.d.ts.map +1 -0
- package/dist/messages/message-encoder.js +453 -0
- package/dist/messages/message-encoder.js.map +1 -0
- package/dist/messages/send.d.ts +101 -0
- package/dist/messages/send.d.ts.map +1 -0
- package/dist/messages/send.js +409 -0
- package/dist/messages/send.js.map +1 -0
- package/dist/recovery/index.d.ts +125 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +584 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/skdm/index.d.ts +220 -0
- package/dist/skdm/index.d.ts.map +1 -0
- package/dist/skdm/index.js +600 -0
- package/dist/skdm/index.js.map +1 -0
- package/dist/socket/hybrid.d.ts +118 -0
- package/dist/socket/hybrid.d.ts.map +1 -0
- package/dist/socket/hybrid.js +352 -0
- package/dist/socket/hybrid.js.map +1 -0
- package/dist/socket/wa-socket.d.ts +300 -0
- package/dist/socket/wa-socket.d.ts.map +1 -0
- package/dist/socket/wa-socket.js +1094 -0
- package/dist/socket/wa-socket.js.map +1 -0
- package/dist/socket/ws-socket.d.ts +96 -0
- package/dist/socket/ws-socket.d.ts.map +1 -0
- package/dist/socket/ws-socket.js +302 -0
- package/dist/socket/ws-socket.js.map +1 -0
- package/dist/types/index.d.ts +444 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/jid.d.ts +46 -0
- package/dist/utils/jid.d.ts.map +1 -0
- package/dist/utils/jid.js +152 -0
- package/dist/utils/jid.js.map +1 -0
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +79 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/retry.d.ts +43 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +175 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/API.md +745 -0
- package/docs/ARCHITECTURE.md +307 -0
- package/docs/BAILEYS_FIXES.md +360 -0
- package/docs/FEATURES.md +532 -0
- package/docs/PROTOCOL.md +489 -0
- package/docs/RECOVERY.md +409 -0
- package/docs/SKDM.md +233 -0
- package/examples/ai-bot/index.ts +479 -0
- package/examples/ai-bot/package.json +17 -0
- package/examples/echo-bot/index.ts +171 -0
- package/examples/echo-bot/package.json +18 -0
- package/examples/group-bot/index.ts +557 -0
- package/examples/group-bot/package.json +17 -0
- package/examples/rest-gateway/index.ts +499 -0
- package/examples/rest-gateway/package.json +19 -0
- package/package.json +75 -0
- package/src/advanced/features.ts +817 -0
- package/src/auth/auth-state.ts +342 -0
- package/src/auth/pairing-code.ts +246 -0
- package/src/auth/qr-code.ts +191 -0
- package/src/calls/handler.ts +153 -0
- package/src/core/binary.ts +464 -0
- package/src/core/crypto.ts +189 -0
- package/src/core/noise.ts +406 -0
- package/src/events/emitter.ts +88 -0
- package/src/features/index.ts +921 -0
- package/src/fixes/index.ts +882 -0
- package/src/groups/management.ts +497 -0
- package/src/index.ts +274 -0
- package/src/messages/media.ts +372 -0
- package/src/messages/message-encoder.ts +520 -0
- package/src/messages/send.ts +521 -0
- package/src/recovery/index.ts +704 -0
- package/src/skdm/index.ts +693 -0
- package/src/socket/hybrid.ts +414 -0
- package/src/socket/wa-socket.ts +1347 -0
- package/src/socket/ws-socket.ts +355 -0
- package/src/types/index.ts +457 -0
- package/src/utils/jid.ts +156 -0
- package/src/utils/logger.ts +84 -0
- package/src/utils/retry.ts +205 -0
- 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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"}
|