@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,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Waliwa - Event emitter untuk WebSocket events
|
|
4
|
+
* Typed event emitter untuk WhatsApp events (messages, presence, calls, dll)
|
|
5
|
+
*
|
|
6
|
+
* RAM optimization: gunakan Map untuk handlers, weakly referenced jika possible
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.StrictEventEmitter = exports.WAEventEmitter = void 0;
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
class WAEventEmitter extends events_1.EventEmitter {
|
|
12
|
+
/**
|
|
13
|
+
* Listen untuk specific event
|
|
14
|
+
*/
|
|
15
|
+
on(event, listener) {
|
|
16
|
+
return super.on(event, listener);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Listen once
|
|
20
|
+
*/
|
|
21
|
+
once(event, listener) {
|
|
22
|
+
return super.once(event, listener);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Listen dengan off support
|
|
26
|
+
*/
|
|
27
|
+
addListener(event, listener) {
|
|
28
|
+
return super.addListener(event, listener);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Emit event ke all listeners
|
|
32
|
+
*/
|
|
33
|
+
emit(event, payload) {
|
|
34
|
+
return super.emit(event, payload);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove listener
|
|
38
|
+
*/
|
|
39
|
+
off(event, listener) {
|
|
40
|
+
return super.off(event, listener);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Wait for event dengan timeout
|
|
44
|
+
*/
|
|
45
|
+
async waitFor(event, timeoutMs = 30000) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const timeout = setTimeout(() => {
|
|
48
|
+
this.off(event, handler);
|
|
49
|
+
reject(new Error(`Timeout waiting for ${String(event)}`));
|
|
50
|
+
}, timeoutMs);
|
|
51
|
+
const handler = (payload) => {
|
|
52
|
+
clearTimeout(timeout);
|
|
53
|
+
this.off(event, handler);
|
|
54
|
+
resolve(payload);
|
|
55
|
+
};
|
|
56
|
+
this.on(event, handler);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.WAEventEmitter = WAEventEmitter;
|
|
61
|
+
/**
|
|
62
|
+
* Strict event emitter - hanya registered events yang di-allow
|
|
63
|
+
* Berguna untuk catching typos dalam event names
|
|
64
|
+
*/
|
|
65
|
+
class StrictEventEmitter extends WAEventEmitter {
|
|
66
|
+
knownEvents;
|
|
67
|
+
constructor(events) {
|
|
68
|
+
super();
|
|
69
|
+
this.knownEvents = new Set(events);
|
|
70
|
+
}
|
|
71
|
+
emit(event, payload) {
|
|
72
|
+
if (!this.knownEvents.has(event)) {
|
|
73
|
+
throw new Error(`Unknown event: ${String(event)}`);
|
|
74
|
+
}
|
|
75
|
+
return super.emit(event, payload);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.StrictEventEmitter = StrictEventEmitter;
|
|
79
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAsC;AAGtC,MAAa,cAAe,SAAQ,qBAAY;IAC9C;;OAEG;IACH,EAAE,CAA6B,KAAQ,EAAE,QAA0C;QACjF,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,IAAI,CAA6B,KAAQ,EAAE,QAA0C;QACnF,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,WAAW,CAA6B,KAAQ,EAAE,QAA0C;QAC1F,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,IAAI,CAA6B,KAAQ,EAAE,OAAsB;QAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,GAAG,CAA6B,KAAQ,EAAE,QAA0C;QAClF,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,KAAQ,EACR,YAAoB,KAAK;QAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAE,EAAE;gBACzC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACzB,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAzDD,wCAyDC;AAED;;;GAGG;AACH,MAAa,kBAAmB,SAAQ,cAAc;IAC5C,WAAW,CAAc;IAEjC,YAAY,MAA4B;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,MAAkB,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAA6B,KAAQ,EAAE,OAAsB;QAC/D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAe,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;CACF;AAdD,gDAcC"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waliwa - New Features Module
|
|
3
|
+
*
|
|
4
|
+
* Module yang berisi fitur-fitur baru yang gak ada di Baileys:
|
|
5
|
+
*
|
|
6
|
+
* 1. Health Monitor - real-time health tracking dengan auto-recovery
|
|
7
|
+
* 2. Multi-account Manager - manage multiple WhatsApp accounts
|
|
8
|
+
* 3. Webhook System - reliable webhooks dengan retry + HMAC signature
|
|
9
|
+
* 4. Circuit Breaker - prevent retry storms untuk failed sends
|
|
10
|
+
* 5. Rate Limit Tracker - per-recipient rate limit tracking
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
import type { WALogger, JIDLike } from '../types/index.js';
|
|
14
|
+
export interface HealthStatus {
|
|
15
|
+
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
16
|
+
score: number;
|
|
17
|
+
connection: {
|
|
18
|
+
connected: boolean;
|
|
19
|
+
uptime: number;
|
|
20
|
+
lastPingTime: number;
|
|
21
|
+
reconnectCount: number;
|
|
22
|
+
};
|
|
23
|
+
metrics: {
|
|
24
|
+
messagesSent: number;
|
|
25
|
+
messagesReceived: number;
|
|
26
|
+
sendFailures: number;
|
|
27
|
+
avgLatencyMs: number;
|
|
28
|
+
};
|
|
29
|
+
resources: {
|
|
30
|
+
memoryUsageMb: number;
|
|
31
|
+
pendingSends: number;
|
|
32
|
+
queueSize: number;
|
|
33
|
+
};
|
|
34
|
+
issues: string[];
|
|
35
|
+
timestamp: number;
|
|
36
|
+
}
|
|
37
|
+
export declare class HealthMonitor extends EventEmitter {
|
|
38
|
+
private logger;
|
|
39
|
+
private startTime;
|
|
40
|
+
private lastPingTime;
|
|
41
|
+
private reconnectCount;
|
|
42
|
+
private messagesSent;
|
|
43
|
+
private messagesReceived;
|
|
44
|
+
private sendFailures;
|
|
45
|
+
private latencies;
|
|
46
|
+
private maxLatencySamples;
|
|
47
|
+
private checkInterval;
|
|
48
|
+
private autoRecoveryEnabled;
|
|
49
|
+
constructor(opts?: {
|
|
50
|
+
logger?: WALogger;
|
|
51
|
+
autoRecovery?: boolean;
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Start monitoring - periodic health checks
|
|
55
|
+
*/
|
|
56
|
+
start(intervalMs?: number): void;
|
|
57
|
+
stop(): void;
|
|
58
|
+
recordPing(): void;
|
|
59
|
+
recordReconnect(): void;
|
|
60
|
+
recordSend(latencyMs: number, success?: boolean): void;
|
|
61
|
+
recordReceive(): void;
|
|
62
|
+
getHealth(): HealthStatus;
|
|
63
|
+
reset(): void;
|
|
64
|
+
}
|
|
65
|
+
export interface AccountConfig {
|
|
66
|
+
id: string;
|
|
67
|
+
name: string;
|
|
68
|
+
authFolder: string;
|
|
69
|
+
enabled: boolean;
|
|
70
|
+
config: any;
|
|
71
|
+
}
|
|
72
|
+
export interface AccountStatus {
|
|
73
|
+
id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
connected: boolean;
|
|
76
|
+
user?: {
|
|
77
|
+
id: string;
|
|
78
|
+
name?: string;
|
|
79
|
+
};
|
|
80
|
+
lastActive: number;
|
|
81
|
+
messagesSent: number;
|
|
82
|
+
messagesReceived: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* MultiAccountManager - manage multiple WhatsApp accounts dari satu process.
|
|
86
|
+
* Berguna untuk: customer service bots, multiple business accounts, dll.
|
|
87
|
+
*
|
|
88
|
+
* RAM optimization: lazy-load accounts, only active ones consume resources.
|
|
89
|
+
*/
|
|
90
|
+
export declare class MultiAccountManager extends EventEmitter {
|
|
91
|
+
private accounts;
|
|
92
|
+
private logger;
|
|
93
|
+
private maxAccounts;
|
|
94
|
+
constructor(opts?: {
|
|
95
|
+
maxAccounts?: number;
|
|
96
|
+
logger?: WALogger;
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* Register new account
|
|
100
|
+
*/
|
|
101
|
+
registerAccount(config: AccountConfig): void;
|
|
102
|
+
/**
|
|
103
|
+
* Connect account by ID
|
|
104
|
+
*/
|
|
105
|
+
connectAccount(accountId: string): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Disconnect account
|
|
108
|
+
*/
|
|
109
|
+
disconnectAccount(accountId: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Get account socket (untuk send messages)
|
|
112
|
+
*/
|
|
113
|
+
getSocket(accountId: string): any;
|
|
114
|
+
/**
|
|
115
|
+
* List all accounts dengan status
|
|
116
|
+
*/
|
|
117
|
+
listAccounts(): AccountStatus[];
|
|
118
|
+
/**
|
|
119
|
+
* Send message from specific account
|
|
120
|
+
*/
|
|
121
|
+
sendMessageFrom(accountId: string, jid: JIDLike, content: any): Promise<any>;
|
|
122
|
+
/**
|
|
123
|
+
* Broadcast message dari multiple accounts
|
|
124
|
+
*/
|
|
125
|
+
broadcast(jid: JIDLike, content: any, accountIds?: string[]): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Disconnect all accounts
|
|
128
|
+
*/
|
|
129
|
+
disconnectAll(): Promise<void>;
|
|
130
|
+
}
|
|
131
|
+
export interface WebhookConfig {
|
|
132
|
+
url: string;
|
|
133
|
+
events: string[];
|
|
134
|
+
secret?: string;
|
|
135
|
+
enabled: boolean;
|
|
136
|
+
retryCount: number;
|
|
137
|
+
retryDelayMs: number;
|
|
138
|
+
timeoutMs: number;
|
|
139
|
+
}
|
|
140
|
+
interface PendingWebhook {
|
|
141
|
+
id: string;
|
|
142
|
+
url: string;
|
|
143
|
+
payload: any;
|
|
144
|
+
secret?: string;
|
|
145
|
+
attempts: number;
|
|
146
|
+
nextRetryAt: number;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* WebhookManager - reliable webhook delivery dengan retry + HMAC signature.
|
|
150
|
+
* Fix common Baileys issue: webhooks tidak reliable.
|
|
151
|
+
*
|
|
152
|
+
* Strategy:
|
|
153
|
+
* - HMAC-SHA256 signature untuk verify authenticity
|
|
154
|
+
* - Exponential backoff retry
|
|
155
|
+
* - Queue pending webhooks jika network issue
|
|
156
|
+
* - Dead letter queue untuk permanent failures
|
|
157
|
+
*/
|
|
158
|
+
export declare class WebhookManager {
|
|
159
|
+
private webhooks;
|
|
160
|
+
private pendingQueue;
|
|
161
|
+
private deadLetterQueue;
|
|
162
|
+
private logger;
|
|
163
|
+
private processingTimer;
|
|
164
|
+
private isProcessing;
|
|
165
|
+
private stats;
|
|
166
|
+
constructor(opts?: {
|
|
167
|
+
logger?: WALogger;
|
|
168
|
+
});
|
|
169
|
+
/**
|
|
170
|
+
* Register webhook
|
|
171
|
+
*/
|
|
172
|
+
register(config: WebhookConfig): void;
|
|
173
|
+
/**
|
|
174
|
+
* Unregister webhook
|
|
175
|
+
*/
|
|
176
|
+
unregister(url: string): void;
|
|
177
|
+
/**
|
|
178
|
+
* Trigger webhook delivery
|
|
179
|
+
*/
|
|
180
|
+
trigger(event: string, payload: any): void;
|
|
181
|
+
private processQueue;
|
|
182
|
+
private deliver;
|
|
183
|
+
getStats(): {
|
|
184
|
+
sent: number;
|
|
185
|
+
failed: number;
|
|
186
|
+
retried: number;
|
|
187
|
+
pending: number;
|
|
188
|
+
deadLettered: number;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Get dead letter queue (untuk manual retry)
|
|
192
|
+
*/
|
|
193
|
+
getDeadLetterQueue(): PendingWebhook[];
|
|
194
|
+
/**
|
|
195
|
+
* Retry dari DLQ
|
|
196
|
+
*/
|
|
197
|
+
retryDeadLetter(id?: string): void;
|
|
198
|
+
destroy(): void;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* CircuitBreaker - prevent retry storms untuk failed recipients.
|
|
202
|
+
* Fix Baileys issue: failed sends terus retry, flood server, get banned.
|
|
203
|
+
*
|
|
204
|
+
* Strategy:
|
|
205
|
+
* - Track failure count per recipient
|
|
206
|
+
* - When threshold reached, open circuit (stop sending)
|
|
207
|
+
* - After cooldown, try again (half-open state)
|
|
208
|
+
* - If success, close circuit; if fail, re-open
|
|
209
|
+
*/
|
|
210
|
+
export declare class CircuitBreaker {
|
|
211
|
+
private states;
|
|
212
|
+
private failureThreshold;
|
|
213
|
+
private cooldownMs;
|
|
214
|
+
private logger;
|
|
215
|
+
constructor(opts?: {
|
|
216
|
+
failureThreshold?: number;
|
|
217
|
+
cooldownMs?: number;
|
|
218
|
+
logger?: WALogger;
|
|
219
|
+
});
|
|
220
|
+
/**
|
|
221
|
+
* Check if can send to recipient
|
|
222
|
+
*/
|
|
223
|
+
canSend(recipientJid: string): boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Record successful send
|
|
226
|
+
*/
|
|
227
|
+
recordSuccess(recipientJid: string): void;
|
|
228
|
+
/**
|
|
229
|
+
* Record failed send
|
|
230
|
+
*/
|
|
231
|
+
recordFailure(recipientJid: string): void;
|
|
232
|
+
/**
|
|
233
|
+
* Manually reset circuit untuk recipient
|
|
234
|
+
*/
|
|
235
|
+
reset(recipientJid: string): void;
|
|
236
|
+
/**
|
|
237
|
+
* Get circuit state untuk recipient
|
|
238
|
+
*/
|
|
239
|
+
getState(recipientJid: string): 'closed' | 'open' | 'half-open';
|
|
240
|
+
/**
|
|
241
|
+
* Get all open circuits (untuk monitoring)
|
|
242
|
+
*/
|
|
243
|
+
getOpenCircuits(): Array<{
|
|
244
|
+
jid: string;
|
|
245
|
+
failureCount: number;
|
|
246
|
+
lastFailureTime: number;
|
|
247
|
+
}>;
|
|
248
|
+
/**
|
|
249
|
+
* Cleanup expired circuits (cooldown elapsed and still open)
|
|
250
|
+
*/
|
|
251
|
+
cleanup(): void;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* RateLimitTracker - per-recipient rate limiting.
|
|
255
|
+
* Berguna untuk: prevent spam, comply dengan WA server limits.
|
|
256
|
+
*
|
|
257
|
+
* WhatsApp server limits (approximate):
|
|
258
|
+
* - 5 messages/sec per recipient
|
|
259
|
+
* - 60 messages/min per recipient
|
|
260
|
+
* - 1000 messages/hour per recipient
|
|
261
|
+
*/
|
|
262
|
+
export declare class RateLimitTracker {
|
|
263
|
+
private counts;
|
|
264
|
+
private limits;
|
|
265
|
+
private logger;
|
|
266
|
+
constructor(opts?: {
|
|
267
|
+
perSecond?: number;
|
|
268
|
+
perMinute?: number;
|
|
269
|
+
perHour?: number;
|
|
270
|
+
logger?: WALogger;
|
|
271
|
+
});
|
|
272
|
+
/**
|
|
273
|
+
* Check if can send to recipient (and increment counter)
|
|
274
|
+
*/
|
|
275
|
+
canSend(recipientJid: string): boolean;
|
|
276
|
+
/**
|
|
277
|
+
* Get remaining quota untuk recipient
|
|
278
|
+
*/
|
|
279
|
+
getRemainingQuota(recipientJid: string): {
|
|
280
|
+
second: number;
|
|
281
|
+
minute: number;
|
|
282
|
+
hour: number;
|
|
283
|
+
};
|
|
284
|
+
/**
|
|
285
|
+
* Reset counter untuk recipient (e.g., on successful interaction)
|
|
286
|
+
*/
|
|
287
|
+
reset(recipientJid: string): void;
|
|
288
|
+
/**
|
|
289
|
+
* Cleanup inactive recipients (no sends in last hour)
|
|
290
|
+
*/
|
|
291
|
+
cleanup(): void;
|
|
292
|
+
getStats(): {
|
|
293
|
+
trackedRecipients: number;
|
|
294
|
+
limits: {
|
|
295
|
+
perSecond: number;
|
|
296
|
+
perMinute: number;
|
|
297
|
+
perHour: number;
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* MessagePersistence - persist outgoing messages untuk survive restarts.
|
|
303
|
+
* Fix Baileys issue: pending messages lost on restart.
|
|
304
|
+
*/
|
|
305
|
+
export interface PersistedMessage {
|
|
306
|
+
id: string;
|
|
307
|
+
recipientJid: string;
|
|
308
|
+
content: any;
|
|
309
|
+
status: 'pending' | 'sent' | 'failed';
|
|
310
|
+
attempts: number;
|
|
311
|
+
createdAt: number;
|
|
312
|
+
updatedAt: number;
|
|
313
|
+
lastError?: string;
|
|
314
|
+
}
|
|
315
|
+
export declare class MessagePersistence {
|
|
316
|
+
private messages;
|
|
317
|
+
private maxRetention;
|
|
318
|
+
private logger;
|
|
319
|
+
constructor(opts?: {
|
|
320
|
+
maxRetention?: number;
|
|
321
|
+
logger?: WALogger;
|
|
322
|
+
});
|
|
323
|
+
save(message: PersistedMessage): void;
|
|
324
|
+
get(id: string): PersistedMessage | undefined;
|
|
325
|
+
update(id: string, update: Partial<PersistedMessage>): void;
|
|
326
|
+
/**
|
|
327
|
+
* Get all pending messages (untuk retry on restart)
|
|
328
|
+
*/
|
|
329
|
+
getPending(): PersistedMessage[];
|
|
330
|
+
/**
|
|
331
|
+
* Get all failed messages (untuk manual retry)
|
|
332
|
+
*/
|
|
333
|
+
getFailed(): PersistedMessage[];
|
|
334
|
+
delete(id: string): void;
|
|
335
|
+
/**
|
|
336
|
+
* Cleanup old messages (older than X ms)
|
|
337
|
+
*/
|
|
338
|
+
cleanup(maxAgeMs?: number): number;
|
|
339
|
+
size(): number;
|
|
340
|
+
}
|
|
341
|
+
export {};
|
|
342
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"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"}
|