@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,70 @@
1
+ /**
2
+ * Waliwa - Message encoding/decoding
3
+ * Encode MessageContent ke WhatsApp protobuf Message format
4
+ * Decode incoming WA Message ke MessageContent
5
+ *
6
+ * Hybrid approach: manual binary encoding untuk messages (lebih hemat RAM),
7
+ * pakai protobufjs untuk complex nested message types
8
+ */
9
+ import type { MessageContent, WAMessage, JIDLike } from '../types/index.js';
10
+ /**
11
+ * Generate unique message ID
12
+ * Format: 3EB0 + 8 random hex chars + counter
13
+ * Contoh: "3EB0ABC1234567890A"
14
+ */
15
+ export declare function generateMessageId(): string;
16
+ /**
17
+ * Generate stanza ID untuk IQ requests
18
+ */
19
+ export declare function generateStanzaId(): string;
20
+ /**
21
+ * Encode MessageContent ke WA binary node
22
+ *
23
+ * WhatsApp message structure:
24
+ * <message to="jid" type="text" id="msgId">
25
+ * <conversation>text content</conversation>
26
+ * </message>
27
+ *
28
+ * Atau untuk media:
29
+ * <message to="jid" type="media" id="msgId">
30
+ * <imageMessage>...</imageMessage>
31
+ * </message>
32
+ */
33
+ export declare function encodeMessageNode(jid: JIDLike, content: MessageContent, options?: EncodeMessageOptions): any;
34
+ interface EncodeMessageOptions {
35
+ messageId?: string;
36
+ participant?: string;
37
+ }
38
+ /**
39
+ * Decode incoming WA binary node ke WAMessage
40
+ */
41
+ export declare function decodeMessageNode(node: any, fromMe?: boolean): WAMessage | null;
42
+ export type ReceiptType = 'read' | 'receipt' | 'played' | 'inactive';
43
+ /**
44
+ * Build receipt node untuk send read/delivered confirmation
45
+ */
46
+ export declare function buildReceiptNode(jid: JIDLike, messageIds: string[], type?: ReceiptType, participant?: JIDLike): any;
47
+ export type MessageStatusUpdateType = 'read' | 'delivered' | 'played';
48
+ /**
49
+ * Build status node untuk update message status (read receipts)
50
+ */
51
+ export declare function buildStatusNode(jid: JIDLike, messageId: string, type: MessageStatusUpdateType, participant?: JIDLike): any;
52
+ /**
53
+ * Extract text content dari message
54
+ */
55
+ export declare function extractMessageText(message: any): string;
56
+ /**
57
+ * Check apakah message punya media
58
+ */
59
+ export declare function hasMedia(message: any): boolean;
60
+ /**
61
+ * Get media info dari message
62
+ */
63
+ export declare function getMediaInfo(message: any): {
64
+ type: 'image' | 'video' | 'audio' | 'document' | 'sticker';
65
+ mimetype: string;
66
+ fileName?: string;
67
+ fileLength?: number;
68
+ } | null;
69
+ export {};
70
+ //# sourceMappingURL=message-encoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-encoder.d.ts","sourceRoot":"","sources":["../../src/messages/message-encoder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAET,OAAO,EAER,MAAM,mBAAmB,CAAC;AAQ3B;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,oBAAyB,GACjC,GAAG,CAsJL;AAED,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,GAAE,OAAe,GAAG,SAAS,GAAG,IAAI,CA+JtF;AAID,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErE;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,GAAE,WAAoB,EAC1B,WAAW,CAAC,EAAE,OAAO,GACpB,GAAG,CAcL;AAID,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEtE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,uBAAuB,EAC7B,WAAW,CAAC,EAAE,OAAO,GACpB,GAAG,CAYL;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAMvD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG;IAC1C,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAiBP"}
@@ -0,0 +1,453 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - Message encoding/decoding
4
+ * Encode MessageContent ke WhatsApp protobuf Message format
5
+ * Decode incoming WA Message ke MessageContent
6
+ *
7
+ * Hybrid approach: manual binary encoding untuk messages (lebih hemat RAM),
8
+ * pakai protobufjs untuk complex nested message types
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.generateMessageId = generateMessageId;
12
+ exports.generateStanzaId = generateStanzaId;
13
+ exports.encodeMessageNode = encodeMessageNode;
14
+ exports.decodeMessageNode = decodeMessageNode;
15
+ exports.buildReceiptNode = buildReceiptNode;
16
+ exports.buildStatusNode = buildStatusNode;
17
+ exports.extractMessageText = extractMessageText;
18
+ exports.hasMedia = hasMedia;
19
+ exports.getMediaInfo = getMediaInfo;
20
+ const crypto_js_1 = require("../core/crypto.js");
21
+ const jid_js_1 = require("../utils/jid.js");
22
+ // ============== Message ID Generator ==============
23
+ let messageCounter = 0;
24
+ /**
25
+ * Generate unique message ID
26
+ * Format: 3EB0 + 8 random hex chars + counter
27
+ * Contoh: "3EB0ABC1234567890A"
28
+ */
29
+ function generateMessageId() {
30
+ messageCounter++;
31
+ const rand = (0, crypto_js_1.getRandomBytes)(8);
32
+ const randHex = Array.from(rand).map(b => b.toString(16).padStart(2, '0')).join('');
33
+ const counterHex = messageCounter.toString(16).padStart(2, '0');
34
+ return `3EB0${randHex}${counterHex}`.toUpperCase();
35
+ }
36
+ /**
37
+ * Generate stanza ID untuk IQ requests
38
+ */
39
+ function generateStanzaId() {
40
+ const rand = (0, crypto_js_1.getRandomBytes)(4);
41
+ const randHex = Array.from(rand).map(b => b.toString(16).padStart(2, '0')).join('');
42
+ return `${Date.now().toString(36)}-${randHex}`;
43
+ }
44
+ // ============== Message Encoder ==============
45
+ /**
46
+ * Encode MessageContent ke WA binary node
47
+ *
48
+ * WhatsApp message structure:
49
+ * <message to="jid" type="text" id="msgId">
50
+ * <conversation>text content</conversation>
51
+ * </message>
52
+ *
53
+ * Atau untuk media:
54
+ * <message to="jid" type="media" id="msgId">
55
+ * <imageMessage>...</imageMessage>
56
+ * </message>
57
+ */
58
+ function encodeMessageNode(jid, content, options = {}) {
59
+ const id = options.messageId ?? generateMessageId();
60
+ const to = (0, jid_js_1.jidToString)(jid);
61
+ const type = (0, jid_js_1.isGroupJid)(jid) ? 'text' : 'text';
62
+ const messageNode = {
63
+ tag: 'message',
64
+ attrs: {
65
+ to,
66
+ type,
67
+ id
68
+ },
69
+ content: []
70
+ };
71
+ // Add participant untuk group messages
72
+ if (options.participant) {
73
+ messageNode.attrs.participant = options.participant;
74
+ }
75
+ // Determine content type
76
+ if (content.text) {
77
+ messageNode.content.push({
78
+ tag: 'conversation',
79
+ attrs: {},
80
+ content: content.text
81
+ });
82
+ }
83
+ if (content.image) {
84
+ messageNode.content.push({
85
+ tag: 'imageMessage',
86
+ attrs: {
87
+ url: content.image.stream ? '' : '',
88
+ mimetype: content.image.mimetype,
89
+ fileSha256: '', // computed on upload
90
+ fileLength: (content.image.fileLength ?? 0).toString()
91
+ },
92
+ content: content.caption ? [{ tag: 'caption', attrs: {}, content: content.caption }] : undefined
93
+ });
94
+ }
95
+ if (content.video) {
96
+ messageNode.content.push({
97
+ tag: 'videoMessage',
98
+ attrs: {
99
+ mimetype: content.video.mimetype,
100
+ seconds: (content.video.seconds ?? 0).toString(),
101
+ gifPlayback: content.video.gifPlayback ? 'true' : 'false'
102
+ },
103
+ content: content.caption ? [{ tag: 'caption', attrs: {}, content: content.caption }] : undefined
104
+ });
105
+ }
106
+ if (content.audio) {
107
+ messageNode.content.push({
108
+ tag: 'audioMessage',
109
+ attrs: {
110
+ mimetype: content.audio.mimetype,
111
+ ptt: content.audio.ptt ? 'true' : 'false'
112
+ }
113
+ });
114
+ }
115
+ if (content.document) {
116
+ messageNode.content.push({
117
+ tag: 'documentMessage',
118
+ attrs: {
119
+ mimetype: content.document.mimetype,
120
+ fileName: content.document.fileName ?? 'document',
121
+ pageCount: content.document.pageCount?.toString() ?? '1'
122
+ }
123
+ });
124
+ }
125
+ if (content.sticker) {
126
+ messageNode.content.push({
127
+ tag: 'stickerMessage',
128
+ attrs: {
129
+ mimetype: content.sticker.mimetype,
130
+ isAnimated: content.sticker.isAnimated ? 'true' : 'false'
131
+ }
132
+ });
133
+ }
134
+ if (content.location) {
135
+ messageNode.content.push({
136
+ tag: 'locationMessage',
137
+ attrs: {
138
+ degreesLatitude: content.location.degreesLatitude.toString(),
139
+ degreesLongitude: content.location.degreesLongitude.toString(),
140
+ name: content.location.name ?? '',
141
+ address: content.location.address ?? ''
142
+ }
143
+ });
144
+ }
145
+ if (content.contact) {
146
+ messageNode.content.push({
147
+ tag: 'contactMessage',
148
+ attrs: {
149
+ displayName: content.contact.displayName
150
+ },
151
+ content: content.contact.vcard
152
+ });
153
+ }
154
+ if (content.poll) {
155
+ messageNode.content.push({
156
+ tag: 'pollCreationMessage',
157
+ attrs: {
158
+ name: content.poll.name
159
+ },
160
+ content: content.poll.values.map(v => ({
161
+ tag: 'option',
162
+ attrs: { name: v }
163
+ }))
164
+ });
165
+ }
166
+ // Quoted message (reply)
167
+ if (content.quoted) {
168
+ const contextInfo = buildContextInfo(content.quoted, content.mentions);
169
+ messageNode.content.push({
170
+ tag: 'contextInfo',
171
+ attrs: {},
172
+ content: contextInfo
173
+ });
174
+ }
175
+ // Mentions
176
+ if (content.mentions && content.mentions.length > 0 && !content.quoted) {
177
+ messageNode.content.push({
178
+ tag: 'mentionedJidList',
179
+ attrs: {},
180
+ content: content.mentions.map(m => (0, jid_js_1.jidToString)(m))
181
+ });
182
+ }
183
+ // Ephemeral
184
+ if (content.ephemeralExpiration) {
185
+ messageNode.attrs.ephemeral = content.ephemeralExpiration.toString();
186
+ }
187
+ // View once
188
+ if (content.viewOnce) {
189
+ messageNode.attrs.viewOnce = 'true';
190
+ }
191
+ return messageNode;
192
+ }
193
+ /**
194
+ * Build context info untuk quoted/reply messages
195
+ */
196
+ function buildContextInfo(quoted, mentions) {
197
+ const parts = [];
198
+ parts.push({
199
+ tag: 'stanzaId',
200
+ attrs: {},
201
+ content: quoted.key.id
202
+ });
203
+ parts.push({
204
+ tag: 'participant',
205
+ attrs: {},
206
+ content: (0, jid_js_1.jidToString)(quoted.key.participant ?? quoted.key.remoteJid)
207
+ });
208
+ if (mentions && mentions.length > 0) {
209
+ parts.push({
210
+ tag: 'mentionedJidList',
211
+ attrs: {},
212
+ content: mentions.map(m => (0, jid_js_1.jidToString)(m))
213
+ });
214
+ }
215
+ // Quoted message content (partial)
216
+ if (quoted.message?.text) {
217
+ parts.push({
218
+ tag: 'quotedMessage',
219
+ attrs: {},
220
+ content: quoted.message.text
221
+ });
222
+ }
223
+ return parts;
224
+ }
225
+ // ============== Message Decoder ==============
226
+ /**
227
+ * Decode incoming WA binary node ke WAMessage
228
+ */
229
+ function decodeMessageNode(node, fromMe = false) {
230
+ if (!node || node.tag !== 'message') {
231
+ return null;
232
+ }
233
+ const attrs = node.attrs || {};
234
+ const jid = attrs.from ?? attrs.to ?? '';
235
+ const id = attrs.id;
236
+ const participant = attrs.participant;
237
+ const key = {
238
+ remoteJid: jid,
239
+ fromMe,
240
+ id,
241
+ participant
242
+ };
243
+ const message = {};
244
+ let messageTimestamp = Date.now();
245
+ let pushName;
246
+ // Process children
247
+ if (Array.isArray(node.content)) {
248
+ for (const child of node.content) {
249
+ if (typeof child === 'string')
250
+ continue;
251
+ if (!child.tag)
252
+ continue;
253
+ switch (child.tag) {
254
+ case 'conversation':
255
+ message.text = typeof child.content === 'string' ? child.content : '';
256
+ break;
257
+ case 'imageMessage':
258
+ message.image = {
259
+ stream: undefined, // akan di-populate oleh media download
260
+ mimetype: child.attrs?.mimetype ?? 'image/jpeg',
261
+ fileLength: parseInt(child.attrs?.fileLength ?? '0', 10)
262
+ };
263
+ if (child.content && Array.isArray(child.content)) {
264
+ const captionNode = child.content.find((c) => c.tag === 'caption');
265
+ if (captionNode)
266
+ message.caption = captionNode.content;
267
+ }
268
+ break;
269
+ case 'videoMessage':
270
+ message.video = {
271
+ stream: undefined,
272
+ mimetype: child.attrs?.mimetype ?? 'video/mp4',
273
+ seconds: parseInt(child.attrs?.seconds ?? '0', 10),
274
+ gifPlayback: child.attrs?.gifPlayback === 'true'
275
+ };
276
+ if (child.content && Array.isArray(child.content)) {
277
+ const captionNode = child.content.find((c) => c.tag === 'caption');
278
+ if (captionNode)
279
+ message.caption = captionNode.content;
280
+ }
281
+ break;
282
+ case 'audioMessage':
283
+ message.audio = {
284
+ stream: undefined,
285
+ mimetype: child.attrs?.mimetype ?? 'audio/mpeg',
286
+ seconds: parseInt(child.attrs?.seconds ?? '0', 10),
287
+ ptt: child.attrs?.ptt === 'true'
288
+ };
289
+ break;
290
+ case 'documentMessage':
291
+ message.document = {
292
+ stream: undefined,
293
+ mimetype: child.attrs?.mimetype ?? 'application/octet-stream',
294
+ fileName: child.attrs?.fileName ?? 'document',
295
+ pageCount: parseInt(child.attrs?.pageCount ?? '1', 10)
296
+ };
297
+ break;
298
+ case 'stickerMessage':
299
+ message.sticker = {
300
+ stream: undefined,
301
+ mimetype: child.attrs?.mimetype ?? 'image/webp',
302
+ isAnimated: child.attrs?.isAnimated === 'true'
303
+ };
304
+ break;
305
+ case 'locationMessage':
306
+ message.location = {
307
+ degreesLatitude: parseFloat(child.attrs?.degreesLatitude ?? '0'),
308
+ degreesLongitude: parseFloat(child.attrs?.degreesLongitude ?? '0'),
309
+ name: child.attrs?.name,
310
+ address: child.attrs?.address
311
+ };
312
+ break;
313
+ case 'contactMessage':
314
+ message.contact = {
315
+ displayName: child.attrs?.displayName ?? '',
316
+ vcard: typeof child.content === 'string' ? child.content : ''
317
+ };
318
+ break;
319
+ case 'pollCreationMessage':
320
+ message.poll = {
321
+ name: child.attrs?.name ?? '',
322
+ values: Array.isArray(child.content)
323
+ ? child.content.filter((c) => c.tag === 'option').map((c) => c.attrs?.name)
324
+ : []
325
+ };
326
+ break;
327
+ case 'contextInfo':
328
+ // Process quoted message
329
+ if (Array.isArray(child.content)) {
330
+ const stanzaId = child.content.find((c) => c.tag === 'stanzaId');
331
+ const participantNode = child.content.find((c) => c.tag === 'participant');
332
+ const mentionedJids = child.content.find((c) => c.tag === 'mentionedJidList');
333
+ // Build quoted message stub
334
+ if (stanzaId) {
335
+ message.quoted = {
336
+ key: {
337
+ remoteJid: jid,
338
+ fromMe: false,
339
+ id: stanzaId.content
340
+ },
341
+ message: {},
342
+ messageTimestamp: 0,
343
+ status: 'read'
344
+ };
345
+ if (participantNode) {
346
+ message.quoted.key.participant = participantNode.content;
347
+ }
348
+ }
349
+ if (mentionedJids && Array.isArray(mentionedJids.content)) {
350
+ message.mentions = mentionedJids.content;
351
+ }
352
+ }
353
+ break;
354
+ case 'pushName':
355
+ pushName = typeof child.content === 'string' ? child.content : undefined;
356
+ break;
357
+ case 'deviceSentTime':
358
+ case 'timestamp':
359
+ const ts = child.attrs?.value ?? child.content;
360
+ if (ts)
361
+ messageTimestamp = parseInt(String(ts), 10);
362
+ break;
363
+ }
364
+ }
365
+ }
366
+ // Determine status from attrs
367
+ const status = attrs.type === 'media' ? 'sent' : 'pending';
368
+ return {
369
+ key,
370
+ message,
371
+ messageTimestamp,
372
+ pushName,
373
+ status: status
374
+ };
375
+ }
376
+ /**
377
+ * Build receipt node untuk send read/delivered confirmation
378
+ */
379
+ function buildReceiptNode(jid, messageIds, type = 'read', participant) {
380
+ return {
381
+ tag: 'receipt',
382
+ attrs: {
383
+ id: messageIds[0],
384
+ type,
385
+ to: (0, jid_js_1.jidToString)(jid),
386
+ t: Math.floor(Date.now() / 1000).toString()
387
+ },
388
+ content: messageIds.map(id => ({
389
+ tag: 'receipt',
390
+ attrs: { id }
391
+ }))
392
+ };
393
+ }
394
+ /**
395
+ * Build status node untuk update message status (read receipts)
396
+ */
397
+ function buildStatusNode(jid, messageId, type, participant) {
398
+ const attrs = {
399
+ type,
400
+ to: (0, jid_js_1.jidToString)(jid),
401
+ id: messageId
402
+ };
403
+ if (participant)
404
+ attrs.participant = (0, jid_js_1.jidToString)(participant);
405
+ return {
406
+ tag: 'status',
407
+ attrs,
408
+ content: undefined
409
+ };
410
+ }
411
+ // ============== Helpers ==============
412
+ /**
413
+ * Extract text content dari message
414
+ */
415
+ function extractMessageText(message) {
416
+ if (!message)
417
+ return '';
418
+ if (typeof message.text === 'string')
419
+ return message.text;
420
+ if (typeof message.conversation === 'string')
421
+ return message.conversation;
422
+ if (message.caption)
423
+ return message.caption;
424
+ return '';
425
+ }
426
+ /**
427
+ * Check apakah message punya media
428
+ */
429
+ function hasMedia(message) {
430
+ return !!(message?.image || message?.video || message?.audio || message?.document || message?.sticker);
431
+ }
432
+ /**
433
+ * Get media info dari message
434
+ */
435
+ function getMediaInfo(message) {
436
+ if (message?.image) {
437
+ return { type: 'image', mimetype: message.image.mimetype, fileLength: message.image.fileLength };
438
+ }
439
+ if (message?.video) {
440
+ return { type: 'video', mimetype: message.video.mimetype, fileLength: message.video.fileLength };
441
+ }
442
+ if (message?.audio) {
443
+ return { type: 'audio', mimetype: message.audio.mimetype, fileLength: message.audio.fileLength };
444
+ }
445
+ if (message?.document) {
446
+ return { type: 'document', mimetype: message.document.mimetype, fileName: message.document.fileName };
447
+ }
448
+ if (message?.sticker) {
449
+ return { type: 'sticker', mimetype: message.sticker.mimetype };
450
+ }
451
+ return null;
452
+ }
453
+ //# sourceMappingURL=message-encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-encoder.js","sourceRoot":"","sources":["../../src/messages/message-encoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Waliwa - Message send/receive operations
3
+ * High-level API untuk kirim dan terima pesan
4
+ */
5
+ import type { MessageContent, WAMessage, WAMessageKey, JIDLike, SendMessageResult, WALogger, MessageStatus } from '../types/index.js';
6
+ import { BinaryNode } from '../core/binary.js';
7
+ /**
8
+ * Track pending message sends untuk kaitin response dengan server ACK
9
+ */
10
+ export declare class PendingMessageTracker {
11
+ private pending;
12
+ add(jid: string, messageId: string, resolve: (r: SendMessageResult) => void, reject: (e: Error) => void, timeoutMs?: number): void;
13
+ resolve(messageId: string, result: SendMessageResult): void;
14
+ reject(messageId: string, err: Error): void;
15
+ /** Clear all pending (untuk disconnect) */
16
+ rejectAll(err: Error): void;
17
+ size(): number;
18
+ }
19
+ export interface MessageSenderOptions {
20
+ /** Function untuk kirim raw bytes via WebSocket */
21
+ send: (data: Uint8Array) => void;
22
+ /** Logger */
23
+ logger?: WALogger;
24
+ /** Track pending sends */
25
+ tracker?: PendingMessageTracker;
26
+ }
27
+ export declare class MessageSender {
28
+ private send;
29
+ private logger;
30
+ private tracker;
31
+ constructor(opts: MessageSenderOptions);
32
+ /**
33
+ * Send message ke recipient
34
+ */
35
+ sendMessage(jid: JIDLike, content: MessageContent, options?: {
36
+ messageId?: string;
37
+ participant?: string;
38
+ timeoutMs?: number;
39
+ }): Promise<SendMessageResult>;
40
+ /**
41
+ * Forward message ke recipient lain
42
+ */
43
+ forwardMessage(to: JIDLike, message: WAMessage, options?: {
44
+ timeoutMs?: number;
45
+ }): Promise<SendMessageResult>;
46
+ /**
47
+ * Delete message (revoke)
48
+ */
49
+ deleteMessage(jid: JIDLike, key: WAMessageKey, options?: {
50
+ revokeEveryone?: boolean;
51
+ timeoutMs?: number;
52
+ }): Promise<SendMessageResult>;
53
+ /**
54
+ * React ke message dengan emoji
55
+ */
56
+ reactToMessage(jid: JIDLike, key: WAMessageKey, emoji: string, options?: {
57
+ timeoutMs?: number;
58
+ }): Promise<SendMessageResult>;
59
+ /**
60
+ * Update tracker ketika ACK diterima
61
+ */
62
+ handleAck(messageId: string, status: MessageStatus, timestamp?: number): void;
63
+ /**
64
+ * Reject all pending (untuk disconnect)
65
+ */
66
+ destroy(): void;
67
+ }
68
+ export interface MessageReceiverOptions {
69
+ logger?: WALogger;
70
+ /** Handler untuk incoming messages */
71
+ onMessage?: (messages: WAMessage[], type: 'append' | 'notify') => void;
72
+ /** Handler untuk status updates */
73
+ onStatusUpdate?: (key: WAMessageKey, status: MessageStatus) => void;
74
+ }
75
+ export declare class MessageReceiver {
76
+ private logger;
77
+ private onMessage?;
78
+ private onStatusUpdate?;
79
+ constructor(opts: MessageReceiverOptions);
80
+ /**
81
+ * Handle incoming binary node (dari WebSocket)
82
+ */
83
+ handleNode(node: BinaryNode): void;
84
+ private handleMessageNode;
85
+ private handleReceiptNode;
86
+ private handleStatusNode;
87
+ private handleAckNode;
88
+ /**
89
+ * Set handlers (untuk runtime binding)
90
+ */
91
+ setHandlers(opts: MessageReceiverOptions): void;
92
+ }
93
+ /**
94
+ * Send read receipts untuk incoming messages
95
+ */
96
+ export declare function buildReadReceiptNode(jid: JIDLike, messageIds: string[], participant?: JIDLike): BinaryNode;
97
+ /**
98
+ * Send typing indicator
99
+ */
100
+ export declare function buildChatPresenceNode(jid: JIDLike, type: 'composing' | 'paused' | 'recording', media?: 'audio' | 'video'): BinaryNode;
101
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/messages/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACd,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAoB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAcjE;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA0C;IAEzD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,SAAS,GAAE,MAAc,GAAG,IAAI;IASzI,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAS3D,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAS3C,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI;IAQ3B,IAAI,IAAI,MAAM;CAGf;AAID,MAAM,WAAW,oBAAoB;IACnC,mDAAmD;IACnD,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACjC,aAAa;IACb,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,IAAI,EAAE,oBAAoB;IAMtC;;OAEG;IACG,WAAW,CACf,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,iBAAiB,CAAC;IAqC7B;;OAEG;IACG,cAAc,CAClB,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,SAAS,EAClB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAyD7B;;OAEG;IACG,aAAa,CACjB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,YAAY,EACjB,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7D,OAAO,CAAC,iBAAiB,CAAC;IAoC7B;;OAEG;IACG,cAAc,CAClB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAwC7B;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAY7E;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAID,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,sCAAsC;IACtC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;IACvE,mCAAmC;IACnC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CACrE;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,SAAS,CAAC,CAA6D;IAC/E,OAAO,CAAC,cAAc,CAAC,CAAqD;gBAEhE,IAAI,EAAE,sBAAsB;IAMxC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAsBlC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI;CAIhD;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,CAAC,EAAE,OAAO,GACpB,UAAU,CAgBZ;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,EAC1C,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,GACxB,UAAU,CAYZ"}