@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,220 @@
1
+ /**
2
+ * Waliwa - SKDM (Store Key Data Manager)
3
+ *
4
+ * Subsystem cerdas untuk manage Signal protocol keys:
5
+ * - Auto-regenerate pre-keys saat hampir habis (prevents Baileys pre-key exhaustion)
6
+ * - LRU cache untuk sessions (RAM efficient)
7
+ * - Atomic writes untuk prevent corruption saat disconnect (Baileys issue)
8
+ * - Pre-key rotation policy dengan background jobs
9
+ * - Session cleanup untuk orphaned sessions
10
+ * - Key prefetching untuk known conversations (fix decryption failures)
11
+ *
12
+ * Fixes yang addressed:
13
+ * - Baileys issue: pre-key exhaustion → pre-keys habis gak auto-regenerate
14
+ * - Baileys issue: session corruption on disconnect → atomic write
15
+ * - Baileys issue: decryption failure for old messages → key prefetch
16
+ * - Baileys issue: memory leak dari sessions lama → LRU eviction
17
+ */
18
+ import type { AuthenticationCreds, SignalKeyStore, KeyPair, WALogger } from '../types/index.js';
19
+ export interface SKDMConfig {
20
+ /** Min pre-keys sebelum regenerate (default: 5) */
21
+ minPreKeys?: number;
22
+ /** Max pre-keys yang di-generate sekaligus (default: 50) */
23
+ maxPreKeysBatch?: number;
24
+ /** Total pre-keys yang di-keep (default: 100) */
25
+ targetPreKeyCount?: number;
26
+ /** Max sessions di RAM cache (default: 500, RAM optimization) */
27
+ maxSessionCacheSize?: number;
28
+ /** Auto-save interval ms (default: 5000) */
29
+ autoSaveIntervalMs?: number;
30
+ /** Enable background key rotation (default: true) */
31
+ enableKeyRotation?: boolean;
32
+ /** Logger */
33
+ logger?: WALogger;
34
+ /** Folder untuk atomic writes */
35
+ storageFolder: string;
36
+ /** File prefix */
37
+ prefix?: string;
38
+ /** Enable session prefetching (default: true, fix decryption failure) */
39
+ enableSessionPrefetch?: boolean;
40
+ /** Session expiry (ms, default: 30 days) */
41
+ sessionExpiryMs?: number;
42
+ }
43
+ /**
44
+ * LRU cache dengan O(1) operations, manual implementation untuk RAM efficiency.
45
+ * Used untuk caching sessions dan senderKeys.
46
+ */
47
+ export declare class LRUCache<K, V> {
48
+ private cache;
49
+ private maxSize;
50
+ private hits;
51
+ private misses;
52
+ constructor(maxSize?: number);
53
+ get(key: K): V | undefined;
54
+ set(key: K, value: V): void;
55
+ has(key: K): boolean;
56
+ delete(key: K): boolean;
57
+ clear(): void;
58
+ size(): number;
59
+ getStats(): {
60
+ size: number;
61
+ hits: number;
62
+ misses: number;
63
+ hitRate: number;
64
+ };
65
+ }
66
+ /**
67
+ * Atomic file writer - prevents corruption saat disconnect/power failure.
68
+ * Baileys issue: session files corrupt jika process kill saat write.
69
+ *
70
+ * Strategy: write to .tmp file, then rename (atomic on POSIX systems).
71
+ */
72
+ export declare class AtomicFileWriter {
73
+ private static writeLocks;
74
+ static writeFile(filePath: string, data: string | Buffer, encoding?: 'utf-8' | 'binary'): Promise<void>;
75
+ private static performWrite;
76
+ }
77
+ /**
78
+ * Pre-key manager - auto-regenerate saat low, prevents exhaustion.
79
+ * Fix Baileys issue: pre-keys habis tanpa warning.
80
+ */
81
+ export declare class PreKeyManager {
82
+ private creds;
83
+ private keys;
84
+ private minPreKeys;
85
+ private maxBatch;
86
+ private targetCount;
87
+ private logger;
88
+ private isRegenerating;
89
+ private lastRegenTime;
90
+ private regenDebounce;
91
+ constructor(creds: AuthenticationCreds, keys: SignalKeyStore, config: Pick<SKDMConfig, 'minPreKeys' | 'maxPreKeysBatch' | 'targetPreKeyCount' | 'logger'>);
92
+ needsRegeneration(): boolean;
93
+ getPreKeyCount(): number;
94
+ getNextPreKeyId(): number;
95
+ getPreKey(id: number): KeyPair | undefined;
96
+ /**
97
+ * Consume a pre-key (mark as used)
98
+ * Returns true jika key consumed, false jika tidak ada
99
+ */
100
+ consumePreKey(id: number): boolean;
101
+ scheduleRegeneration(): void;
102
+ regeneratePreKeys(): Promise<void>;
103
+ startBackgroundRotation(intervalMs?: number): NodeJS.Timeout;
104
+ getStats(): {
105
+ total: number;
106
+ nextId: number;
107
+ lastRegenTime: number;
108
+ needsRegen: boolean;
109
+ };
110
+ }
111
+ /**
112
+ * Session manager dengan LRU cache untuk RAM efficiency.
113
+ * Fix Baileys issue: memory leak dari sessions lama.
114
+ */
115
+ export declare class SessionManager {
116
+ private keys;
117
+ private cache;
118
+ private maxCacheSize;
119
+ private logger;
120
+ private sessionExpiryMs;
121
+ private lastAccess;
122
+ constructor(keys: SignalKeyStore, config: Pick<SKDMConfig, 'maxSessionCacheSize' | 'logger' | 'sessionExpiryMs'>);
123
+ getSession(jid: string): any | undefined;
124
+ setSession(jid: string, session: any): void;
125
+ deleteSession(jid: string): void;
126
+ /**
127
+ * Cleanup expired sessions (untuk free RAM)
128
+ * Returns count of cleaned sessions
129
+ */
130
+ cleanupExpiredSessions(): number;
131
+ /**
132
+ * Prefetch sessions untuk multiple JIDs (fix decryption failure)
133
+ * Bulk load sessions sebelum decrypt group messages
134
+ */
135
+ prefetchSessions(jids: string[]): void;
136
+ getStats(): {
137
+ totalSessions: number;
138
+ expiredSessions: number;
139
+ size: number;
140
+ hits: number;
141
+ misses: number;
142
+ hitRate: number;
143
+ };
144
+ }
145
+ /**
146
+ * AppState key manager - manage app state sync keys dengan deduplication.
147
+ * Fix Baileys issue: app state sync keys bertumpuk tanpa cleanup.
148
+ */
149
+ export declare class AppStateKeyManager {
150
+ private keys;
151
+ private logger;
152
+ private cache;
153
+ constructor(keys: SignalKeyStore, logger?: WALogger);
154
+ get(keyId: string): Uint8Array | undefined;
155
+ set(keyId: string, key: Uint8Array): void;
156
+ cleanup(maxKeep?: number): number;
157
+ }
158
+ /**
159
+ * Identity key manager dengan verification.
160
+ * Fix Baileys issue: identity changes gak tracked properly.
161
+ */
162
+ export declare class IdentityKeyManager {
163
+ private keys;
164
+ private logger;
165
+ private trustedIdentities;
166
+ private changedIdentities;
167
+ constructor(keys: SignalKeyStore, logger?: WALogger);
168
+ get(jid: string): Uint8Array | undefined;
169
+ /**
170
+ * Save identity key, detect changes
171
+ * Returns true jika identity CHANGED (security concern)
172
+ */
173
+ save(jid: string, identity: Uint8Array): boolean;
174
+ getChangedIdentities(): string[];
175
+ acknowledge(jid: string): void;
176
+ trust(jid: string): void;
177
+ private bytesEqual;
178
+ }
179
+ /**
180
+ * SKDM - Store Key Data Manager
181
+ * Single entry point untuk semua key management operations.
182
+ */
183
+ export declare class SKDM {
184
+ private config;
185
+ private logger;
186
+ private creds;
187
+ private keys;
188
+ preKeyManager: PreKeyManager;
189
+ sessionManager: SessionManager;
190
+ identityManager: IdentityKeyManager;
191
+ appStateManager: AppStateKeyManager;
192
+ private dirty;
193
+ private saveCredsDebounced;
194
+ private saveKeysDebounced;
195
+ private backgroundJobs;
196
+ private isInitialized;
197
+ constructor(creds: AuthenticationCreds, keys: SignalKeyStore, config: SKDMConfig);
198
+ /**
199
+ * Initialize SKDM - load state, start background jobs
200
+ */
201
+ initialize(): Promise<void>;
202
+ markCredsDirty(): void;
203
+ markKeysDirty(): void;
204
+ private flushCreds;
205
+ private flushKeys;
206
+ flush(): Promise<void>;
207
+ getStats(): SKDMStats;
208
+ destroy(): Promise<void>;
209
+ }
210
+ export interface SKDMStats {
211
+ preKeys: ReturnType<PreKeyManager['getStats']>;
212
+ sessions: ReturnType<SessionManager['getStats']>;
213
+ identities: {
214
+ total: number;
215
+ changed: number;
216
+ };
217
+ appStateKeys: number;
218
+ pendingSaves: number;
219
+ }
220
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skdm/index.ts"],"names":[],"mappings":"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"}