@kangwifi-pro/waliwa 1.0.2 → 1.1.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 (76) hide show
  1. package/dist/community/audio-transcription.d.ts +46 -0
  2. package/dist/community/audio-transcription.d.ts.map +1 -0
  3. package/dist/community/audio-transcription.js +108 -0
  4. package/dist/community/audio-transcription.js.map +1 -0
  5. package/dist/community/bulk-operations.d.ts +87 -0
  6. package/dist/community/bulk-operations.d.ts.map +1 -0
  7. package/dist/community/bulk-operations.js +223 -0
  8. package/dist/community/bulk-operations.js.map +1 -0
  9. package/dist/community/community-fixes.d.ts +306 -0
  10. package/dist/community/community-fixes.d.ts.map +1 -0
  11. package/dist/community/community-fixes.js +630 -0
  12. package/dist/community/community-fixes.js.map +1 -0
  13. package/dist/community/contacts-manager.d.ts +89 -0
  14. package/dist/community/contacts-manager.d.ts.map +1 -0
  15. package/dist/community/contacts-manager.js +241 -0
  16. package/dist/community/contacts-manager.js.map +1 -0
  17. package/dist/community/disappearing.d.ts +63 -0
  18. package/dist/community/disappearing.d.ts.map +1 -0
  19. package/dist/community/disappearing.js +195 -0
  20. package/dist/community/disappearing.js.map +1 -0
  21. package/dist/community/index.d.ts +101 -0
  22. package/dist/community/index.d.ts.map +1 -0
  23. package/dist/community/index.js +113 -0
  24. package/dist/community/index.js.map +1 -0
  25. package/dist/community/live-location.d.ts +85 -0
  26. package/dist/community/live-location.d.ts.map +1 -0
  27. package/dist/community/live-location.js +238 -0
  28. package/dist/community/live-location.js.map +1 -0
  29. package/dist/community/message-extras.d.ts +110 -0
  30. package/dist/community/message-extras.d.ts.map +1 -0
  31. package/dist/community/message-extras.js +472 -0
  32. package/dist/community/message-extras.js.map +1 -0
  33. package/dist/community/newsletter-extended.d.ts +142 -0
  34. package/dist/community/newsletter-extended.d.ts.map +1 -0
  35. package/dist/community/newsletter-extended.js +543 -0
  36. package/dist/community/newsletter-extended.js.map +1 -0
  37. package/dist/community/privacy-manager.d.ts +98 -0
  38. package/dist/community/privacy-manager.d.ts.map +1 -0
  39. package/dist/community/privacy-manager.js +273 -0
  40. package/dist/community/privacy-manager.js.map +1 -0
  41. package/dist/community/profile-manager.d.ts +94 -0
  42. package/dist/community/profile-manager.d.ts.map +1 -0
  43. package/dist/community/profile-manager.js +363 -0
  44. package/dist/community/profile-manager.js.map +1 -0
  45. package/dist/community/status-extended.d.ts +119 -0
  46. package/dist/community/status-extended.d.ts.map +1 -0
  47. package/dist/community/status-extended.js +444 -0
  48. package/dist/community/status-extended.js.map +1 -0
  49. package/dist/community/sticker-manager.d.ts +73 -0
  50. package/dist/community/sticker-manager.d.ts.map +1 -0
  51. package/dist/community/sticker-manager.js +251 -0
  52. package/dist/community/sticker-manager.js.map +1 -0
  53. package/dist/index.d.ts +4 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +33 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/socket/wa-socket.d.ts +77 -0
  58. package/dist/socket/wa-socket.d.ts.map +1 -1
  59. package/dist/socket/wa-socket.js +149 -3
  60. package/dist/socket/wa-socket.js.map +1 -1
  61. package/package.json +2 -2
  62. package/src/community/audio-transcription.ts +121 -0
  63. package/src/community/bulk-operations.ts +329 -0
  64. package/src/community/community-fixes.ts +771 -0
  65. package/src/community/contacts-manager.ts +282 -0
  66. package/src/community/disappearing.ts +218 -0
  67. package/src/community/index.ts +169 -0
  68. package/src/community/live-location.ts +287 -0
  69. package/src/community/message-extras.ts +523 -0
  70. package/src/community/newsletter-extended.ts +614 -0
  71. package/src/community/privacy-manager.ts +310 -0
  72. package/src/community/profile-manager.ts +402 -0
  73. package/src/community/status-extended.ts +518 -0
  74. package/src/community/sticker-manager.ts +305 -0
  75. package/src/index.ts +67 -2
  76. package/src/socket/wa-socket.ts +183 -4
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Waliwa - Audio Transcription (Community Request)
3
+ *
4
+ * Audio transcription menggunakan external service (e.g., Whisper API).
5
+ * Hook-based design agar user bisa pakai provider apapun.
6
+ */
7
+ import type { WALogger } from '../types/index.js';
8
+ export interface TranscriptionResult {
9
+ text: string;
10
+ language?: string;
11
+ confidence?: number;
12
+ duration?: number;
13
+ provider: string;
14
+ }
15
+ export type TranscriptionProvider = (audioBuffer: Buffer, mimetype: string) => Promise<TranscriptionResult>;
16
+ /**
17
+ * Audio transcription manager dengan pluggable provider
18
+ */
19
+ export declare class AudioTranscriptionManager {
20
+ private provider;
21
+ private logger;
22
+ private cache;
23
+ constructor(logger?: WALogger);
24
+ /**
25
+ * Set transcription provider (e.g., Whisper, Google Speech-to-Text)
26
+ */
27
+ setProvider(provider: TranscriptionProvider): void;
28
+ /**
29
+ * Transcribe audio dengan caching
30
+ */
31
+ transcribe(audioBuffer: Buffer, mimetype: string, cacheKey?: string): Promise<TranscriptionResult>;
32
+ /**
33
+ * Whisper API provider (OpenAI)
34
+ */
35
+ static whisperProvider(apiKey: string, logger?: WALogger): TranscriptionProvider;
36
+ /**
37
+ * Clear cache
38
+ */
39
+ clearCache(): void;
40
+ hasProvider(): boolean;
41
+ }
42
+ /**
43
+ * Helper: Detect language dari audio
44
+ */
45
+ export declare function detectLanguageFromText(text: string): string;
46
+ //# sourceMappingURL=audio-transcription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-transcription.d.ts","sourceRoot":"","sources":["../../src/community/audio-transcription.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE5G;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAA+C;gBAEhD,MAAM,CAAC,EAAE,QAAQ;IAI7B;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAKlD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmBxG;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,qBAAqB;IA8BhF;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB,WAAW,IAAI,OAAO;CAGvB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3D"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - Audio Transcription (Community Request)
4
+ *
5
+ * Audio transcription menggunakan external service (e.g., Whisper API).
6
+ * Hook-based design agar user bisa pakai provider apapun.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AudioTranscriptionManager = void 0;
10
+ exports.detectLanguageFromText = detectLanguageFromText;
11
+ const logger_js_1 = require("../utils/logger.js");
12
+ /**
13
+ * Audio transcription manager dengan pluggable provider
14
+ */
15
+ class AudioTranscriptionManager {
16
+ provider = null;
17
+ logger;
18
+ cache = new Map();
19
+ constructor(logger) {
20
+ this.logger = logger ?? new logger_js_1.SilentLogger();
21
+ }
22
+ /**
23
+ * Set transcription provider (e.g., Whisper, Google Speech-to-Text)
24
+ */
25
+ setProvider(provider) {
26
+ this.provider = provider;
27
+ this.logger.info('Audio transcription provider set');
28
+ }
29
+ /**
30
+ * Transcribe audio dengan caching
31
+ */
32
+ async transcribe(audioBuffer, mimetype, cacheKey) {
33
+ if (cacheKey) {
34
+ const cached = this.cache.get(cacheKey);
35
+ if (cached)
36
+ return cached;
37
+ }
38
+ if (!this.provider) {
39
+ throw new Error('No transcription provider set. Call setProvider() first.');
40
+ }
41
+ const result = await this.provider(audioBuffer, mimetype);
42
+ if (cacheKey) {
43
+ this.cache.set(cacheKey, result);
44
+ }
45
+ return result;
46
+ }
47
+ /**
48
+ * Whisper API provider (OpenAI)
49
+ */
50
+ static whisperProvider(apiKey, logger) {
51
+ return async (audioBuffer, mimetype) => {
52
+ const formData = new FormData();
53
+ const blob = new Blob([audioBuffer], { type: mimetype });
54
+ formData.append('file', blob, 'audio.ogg');
55
+ formData.append('model', 'whisper-1');
56
+ formData.append('response_format', 'json');
57
+ const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {
58
+ method: 'POST',
59
+ headers: {
60
+ 'Authorization': `Bearer ${apiKey}`
61
+ },
62
+ body: formData
63
+ });
64
+ if (!response.ok) {
65
+ throw new Error(`Whisper API error: ${response.status} ${response.statusText}`);
66
+ }
67
+ const data = await response.json();
68
+ return {
69
+ text: data.text,
70
+ language: data.language,
71
+ duration: data.duration,
72
+ provider: 'whisper'
73
+ };
74
+ };
75
+ }
76
+ /**
77
+ * Clear cache
78
+ */
79
+ clearCache() {
80
+ this.cache.clear();
81
+ }
82
+ hasProvider() {
83
+ return this.provider !== null;
84
+ }
85
+ }
86
+ exports.AudioTranscriptionManager = AudioTranscriptionManager;
87
+ /**
88
+ * Helper: Detect language dari audio
89
+ */
90
+ function detectLanguageFromText(text) {
91
+ // Simple heuristic untuk detect common languages
92
+ if (/[\u4e00-\u9fff]/.test(text))
93
+ return 'zh';
94
+ if (/[\u3040-\u309f\u30a0-\u30ff]/.test(text))
95
+ return 'ja';
96
+ if (/[\uac00-\ud7af]/.test(text))
97
+ return 'ko';
98
+ if (/[\u0600-\u06ff]/.test(text))
99
+ return 'ar';
100
+ if (/[\u0400-\u04ff]/.test(text))
101
+ return 'ru';
102
+ if (/[\u0900-\u097f]/.test(text))
103
+ return 'hi';
104
+ if (/[\u0e00-\u0e7f]/.test(text))
105
+ return 'th';
106
+ return 'en';
107
+ }
108
+ //# sourceMappingURL=audio-transcription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-transcription.js","sourceRoot":"","sources":["../../src/community/audio-transcription.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Waliwa - Bulk Operations (Community Request)
3
+ *
4
+ * Fitur yang sering diminta komunitas Baileys:
5
+ * - Send multiple messages in one call (bulk send)
6
+ * - Send multiple media files (album send)
7
+ * - Broadcast dengan delay untuk avoid spam
8
+ * - Multi-recipient send (same message ke multiple users)
9
+ * - Forward multiple messages
10
+ *
11
+ * Fix Baileys issues:
12
+ * - Bulk send tidak ada
13
+ * - Broadcast tidak ada delay control
14
+ * - Multi-file send tidak support
15
+ */
16
+ import type { JIDLike, MessageContent, WAMessage, WALogger, SendMessageResult } from '../types/index.js';
17
+ export interface BulkSendItem {
18
+ jid: JIDLike;
19
+ content: MessageContent;
20
+ delayMs?: number;
21
+ }
22
+ export interface BulkSendResult {
23
+ jid: string;
24
+ success: boolean;
25
+ result?: SendMessageResult;
26
+ error?: string;
27
+ durationMs: number;
28
+ }
29
+ export interface BulkSendOptions {
30
+ /** Delay between sends (ms) - default 1000ms */
31
+ delayMs?: number;
32
+ /** Max concurrent sends - default 5 */
33
+ concurrency?: number;
34
+ /** Stop on first error - default false */
35
+ stopOnError?: boolean;
36
+ /** Progress callback */
37
+ onProgress?: (current: number, total: number) => void;
38
+ /** Rate limit per second - default 10 */
39
+ rateLimitPerSecond?: number;
40
+ }
41
+ export interface AlbumItem {
42
+ type: 'image' | 'video' | 'audio' | 'document';
43
+ stream: Buffer | Uint8Array;
44
+ mimetype: string;
45
+ caption?: string;
46
+ fileName?: string;
47
+ }
48
+ export interface BulkOperationsOptions {
49
+ sendMessage: (jid: JIDLike, content: MessageContent) => Promise<SendMessageResult>;
50
+ uploadMedia: (data: Buffer | Uint8Array, type: string, mimetype: string, fileName?: string) => Promise<any>;
51
+ logger?: WALogger;
52
+ }
53
+ export declare class BulkOperations {
54
+ private sendMessage;
55
+ private uploadMedia;
56
+ private logger;
57
+ private defaultRateLimiter;
58
+ constructor(opts: BulkOperationsOptions);
59
+ /**
60
+ * Send multiple messages dengan delay
61
+ * Fix Baileys issue: bulk send tidak ada
62
+ */
63
+ bulkSend(items: BulkSendItem[], options?: BulkSendOptions): Promise<BulkSendResult[]>;
64
+ private processQueue;
65
+ /**
66
+ * Broadcast same message ke multiple recipients
67
+ * dengan delay untuk avoid spam detection
68
+ */
69
+ broadcast(content: MessageContent, recipients: JIDLike[], options?: BulkSendOptions): Promise<BulkSendResult[]>;
70
+ /**
71
+ * Send album (multiple media files in sequence)
72
+ * Fix Baileys issue: multi-file send tidak support
73
+ */
74
+ sendAlbum(jid: JIDLike, items: AlbumItem[], options?: {
75
+ delayMs?: number;
76
+ onProgress?: (current: number, total: number) => void;
77
+ }): Promise<BulkSendResult[]>;
78
+ /**
79
+ * Forward multiple messages ke multiple recipients
80
+ */
81
+ bulkForward(messages: WAMessage[], recipients: JIDLike[], forwardFn: (to: JIDLike, message: WAMessage) => Promise<SendMessageResult>, options?: BulkSendOptions): Promise<BulkSendResult[]>;
82
+ /**
83
+ * Send message dengan retry on failure
84
+ */
85
+ sendWithRetry(jid: JIDLike, content: MessageContent, maxRetries?: number, delayMs?: number): Promise<SendMessageResult>;
86
+ }
87
+ //# sourceMappingURL=bulk-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-operations.d.ts","sourceRoot":"","sources":["../../src/community/bulk-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - Bulk Operations (Community Request)
4
+ *
5
+ * Fitur yang sering diminta komunitas Baileys:
6
+ * - Send multiple messages in one call (bulk send)
7
+ * - Send multiple media files (album send)
8
+ * - Broadcast dengan delay untuk avoid spam
9
+ * - Multi-recipient send (same message ke multiple users)
10
+ * - Forward multiple messages
11
+ *
12
+ * Fix Baileys issues:
13
+ * - Bulk send tidak ada
14
+ * - Broadcast tidak ada delay control
15
+ * - Multi-file send tidak support
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.BulkOperations = void 0;
19
+ const jid_js_1 = require("../utils/jid.js");
20
+ const retry_js_1 = require("../utils/retry.js");
21
+ const logger_js_1 = require("../utils/logger.js");
22
+ const retry_js_2 = require("../utils/retry.js");
23
+ class BulkOperations {
24
+ sendMessage;
25
+ uploadMedia;
26
+ logger;
27
+ defaultRateLimiter;
28
+ constructor(opts) {
29
+ this.sendMessage = opts.sendMessage;
30
+ this.uploadMedia = opts.uploadMedia;
31
+ this.logger = opts.logger ?? new logger_js_1.SilentLogger();
32
+ this.defaultRateLimiter = new retry_js_2.RateLimiter(10); // 10 per second default
33
+ }
34
+ /**
35
+ * Send multiple messages dengan delay
36
+ * Fix Baileys issue: bulk send tidak ada
37
+ */
38
+ async bulkSend(items, options = {}) {
39
+ const { delayMs = 1000, concurrency = 5, stopOnError = false, onProgress, rateLimitPerSecond = 10 } = options;
40
+ const rateLimiter = new retry_js_2.RateLimiter(rateLimitPerSecond);
41
+ const results = [];
42
+ const queue = [...items];
43
+ let processed = 0;
44
+ let hasError = false;
45
+ // Process dengan limited concurrency
46
+ const workers = [];
47
+ for (let i = 0; i < Math.min(concurrency, items.length); i++) {
48
+ workers.push(this.processQueue(queue, results, rateLimiter, delayMs, stopOnError, () => {
49
+ processed++;
50
+ onProgress?.(processed, items.length);
51
+ if (stopOnError && results.some(r => !r.success)) {
52
+ hasError = true;
53
+ }
54
+ }, () => hasError));
55
+ }
56
+ await Promise.all(workers);
57
+ const successCount = results.filter(r => r.success).length;
58
+ const failureCount = results.length - successCount;
59
+ this.logger.info(`Bulk send complete: ${successCount} success, ${failureCount} failed`);
60
+ return results;
61
+ }
62
+ async processQueue(queue, results, rateLimiter, delayMs, stopOnError, onItemDone, shouldStop) {
63
+ while (queue.length > 0 && !shouldStop()) {
64
+ const item = queue.shift();
65
+ if (!item)
66
+ break;
67
+ const startTime = Date.now();
68
+ try {
69
+ await rateLimiter.acquire();
70
+ const result = await this.sendMessage(item.jid, item.content);
71
+ results.push({
72
+ jid: (0, jid_js_1.jidToString)(item.jid),
73
+ success: true,
74
+ result,
75
+ durationMs: Date.now() - startTime
76
+ });
77
+ }
78
+ catch (err) {
79
+ results.push({
80
+ jid: (0, jid_js_1.jidToString)(item.jid),
81
+ success: false,
82
+ error: err.message,
83
+ durationMs: Date.now() - startTime
84
+ });
85
+ if (stopOnError) {
86
+ this.logger.error(`Stopping bulk send due to error: ${err.message}`);
87
+ break;
88
+ }
89
+ }
90
+ onItemDone();
91
+ // Delay between sends
92
+ const delay = item.delayMs ?? delayMs;
93
+ if (delay > 0 && queue.length > 0) {
94
+ await (0, retry_js_1.sleep)(delay);
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Broadcast same message ke multiple recipients
100
+ * dengan delay untuk avoid spam detection
101
+ */
102
+ async broadcast(content, recipients, options = {}) {
103
+ const items = recipients.map(jid => ({ jid, content }));
104
+ return this.bulkSend(items, options);
105
+ }
106
+ /**
107
+ * Send album (multiple media files in sequence)
108
+ * Fix Baileys issue: multi-file send tidak support
109
+ */
110
+ async sendAlbum(jid, items, options = {}) {
111
+ const { delayMs = 500, onProgress } = options;
112
+ const results = [];
113
+ for (let i = 0; i < items.length; i++) {
114
+ const item = items[i];
115
+ const startTime = Date.now();
116
+ try {
117
+ // Upload media first
118
+ const uploadResult = await this.uploadMedia(item.stream, item.type, item.mimetype, item.fileName);
119
+ // Send message with media reference
120
+ const content = {
121
+ [item.type]: {
122
+ stream: item.stream,
123
+ mimetype: item.mimetype,
124
+ url: uploadResult.url
125
+ },
126
+ caption: item.caption
127
+ };
128
+ const result = await this.sendMessage(jid, content);
129
+ results.push({
130
+ jid: (0, jid_js_1.jidToString)(jid),
131
+ success: true,
132
+ result,
133
+ durationMs: Date.now() - startTime
134
+ });
135
+ }
136
+ catch (err) {
137
+ results.push({
138
+ jid: (0, jid_js_1.jidToString)(jid),
139
+ success: false,
140
+ error: err.message,
141
+ durationMs: Date.now() - startTime
142
+ });
143
+ }
144
+ onProgress?.(i + 1, items.length);
145
+ if (i < items.length - 1 && delayMs > 0) {
146
+ await (0, retry_js_1.sleep)(delayMs);
147
+ }
148
+ }
149
+ return results;
150
+ }
151
+ /**
152
+ * Forward multiple messages ke multiple recipients
153
+ */
154
+ async bulkForward(messages, recipients, forwardFn, options = {}) {
155
+ const items = [];
156
+ for (const recipient of recipients) {
157
+ for (const message of messages) {
158
+ // Use forwardFn via content placeholder
159
+ items.push({
160
+ jid: recipient,
161
+ content: { text: '__forward__' }, // marker, akan di-handle oleh forwardFn
162
+ delayMs: options.delayMs
163
+ });
164
+ }
165
+ }
166
+ const results = [];
167
+ const { delayMs = 1000, stopOnError = false, onProgress } = options;
168
+ let processed = 0;
169
+ for (let i = 0; i < items.length; i++) {
170
+ const item = items[i];
171
+ const message = messages[Math.floor(i / recipients.length)];
172
+ const recipient = recipients[i % recipients.length];
173
+ const startTime = Date.now();
174
+ try {
175
+ const result = await forwardFn(recipient, message);
176
+ results.push({
177
+ jid: (0, jid_js_1.jidToString)(recipient),
178
+ success: true,
179
+ result,
180
+ durationMs: Date.now() - startTime
181
+ });
182
+ }
183
+ catch (err) {
184
+ results.push({
185
+ jid: (0, jid_js_1.jidToString)(recipient),
186
+ success: false,
187
+ error: err.message,
188
+ durationMs: Date.now() - startTime
189
+ });
190
+ if (stopOnError)
191
+ break;
192
+ }
193
+ processed++;
194
+ onProgress?.(processed, items.length);
195
+ if (i < items.length - 1 && delayMs > 0) {
196
+ await (0, retry_js_1.sleep)(delayMs);
197
+ }
198
+ }
199
+ return results;
200
+ }
201
+ /**
202
+ * Send message dengan retry on failure
203
+ */
204
+ async sendWithRetry(jid, content, maxRetries = 3, delayMs = 2000) {
205
+ let lastError;
206
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
207
+ try {
208
+ this.logger.debug(`Send attempt ${attempt}/${maxRetries} to ${(0, jid_js_1.jidToString)(jid)}`);
209
+ return await this.sendMessage(jid, content);
210
+ }
211
+ catch (err) {
212
+ lastError = err;
213
+ this.logger.warn(`Attempt ${attempt} failed: ${err.message}`);
214
+ if (attempt < maxRetries) {
215
+ await (0, retry_js_1.sleep)(delayMs * attempt); // exponential-ish
216
+ }
217
+ }
218
+ }
219
+ throw lastError ?? new Error('Send failed after retries');
220
+ }
221
+ }
222
+ exports.BulkOperations = BulkOperations;
223
+ //# sourceMappingURL=bulk-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-operations.js","sourceRoot":"","sources":["../../src/community/bulk-operations.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AASH,4CAA8C;AAC9C,gDAA0C;AAC1C,kDAAkD;AAClD,gDAAgD;AA2ChD,MAAa,cAAc;IACjB,WAAW,CAAwE;IACnF,WAAW,CAAiG;IAC5G,MAAM,CAAW;IACjB,kBAAkB,CAAc;IAExC,YAAY,IAA2B;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,wBAAY,EAAE,CAAC;QAChD,IAAI,CAAC,kBAAkB,GAAG,IAAI,sBAAW,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB;IACzE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAqB,EAAE,UAA2B,EAAE;QACjE,MAAM,EACJ,OAAO,GAAG,IAAI,EACd,WAAW,GAAG,CAAC,EACf,WAAW,GAAG,KAAK,EACnB,UAAU,EACV,kBAAkB,GAAG,EAAE,EACxB,GAAG,OAAO,CAAC;QAEZ,MAAM,WAAW,GAAG,IAAI,sBAAW,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACzB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,qCAAqC;QACrC,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE;gBACrF,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjD,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;YACH,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,YAAY,aAAa,YAAY,SAAS,CAAC,CAAC;QAExF,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,KAAqB,EACrB,OAAyB,EACzB,WAAwB,EACxB,OAAe,EACf,WAAoB,EACpB,UAAsB,EACtB,UAAyB;QAEzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI;gBAAE,MAAM;YAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,IAAA,oBAAW,EAAC,IAAI,CAAC,GAAG,CAAC;oBAC1B,OAAO,EAAE,IAAI;oBACb,MAAM;oBACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,IAAA,oBAAW,EAAC,IAAI,CAAC,GAAG,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,CAAC,OAAO;oBAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;gBACH,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrE,MAAM;gBACR,CAAC;YACH,CAAC;YAED,UAAU,EAAE,CAAC;YAEb,sBAAsB;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;YACtC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAA,gBAAK,EAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,OAAuB,EACvB,UAAqB,EACrB,UAA2B,EAAE;QAE7B,MAAM,KAAK,GAAmB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,GAAY,EACZ,KAAkB,EAClB,UAAuF,EAAE;QAEzF,MAAM,EAAE,OAAO,GAAG,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC9C,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC;gBACH,qBAAqB;gBACrB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CACzC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAC;gBAEF,oCAAoC;gBACpC,MAAM,OAAO,GAAQ;oBACnB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;wBACX,MAAM,EAAE,IAAI,CAAC,MAAa;wBAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,GAAG,EAAE,YAAY,CAAC,GAAG;qBACtB;oBACD,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,IAAA,oBAAW,EAAC,GAAG,CAAC;oBACrB,OAAO,EAAE,IAAI;oBACb,MAAM;oBACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,IAAA,oBAAW,EAAC,GAAG,CAAC;oBACrB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,CAAC,OAAO;oBAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;YACL,CAAC;YAED,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAElC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAA,gBAAK,EAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,QAAqB,EACrB,UAAqB,EACrB,SAA0E,EAC1E,UAA2B,EAAE;QAE7B,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,wCAAwC;gBACxC,KAAK,CAAC,IAAI,CAAC;oBACT,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,wCAAwC;oBAC1E,OAAO,EAAE,OAAO,CAAC,OAAO;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QACpE,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,IAAA,oBAAW,EAAC,SAAS,CAAC;oBAC3B,OAAO,EAAE,IAAI;oBACb,MAAM;oBACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,IAAA,oBAAW,EAAC,SAAS,CAAC;oBAC3B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,CAAC,OAAO;oBAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;gBACH,IAAI,WAAW;oBAAE,MAAM;YACzB,CAAC;YAED,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAEtC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAA,gBAAK,EAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,GAAY,EACZ,OAAuB,EACvB,aAAqB,CAAC,EACtB,UAAkB,IAAI;QAEtB,IAAI,SAA4B,CAAC;QAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,UAAU,OAAO,IAAA,oBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClF,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,SAAS,GAAG,GAAG,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9D,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,IAAA,gBAAK,EAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC5D,CAAC;CACF;AAnQD,wCAmQC"}