@nerxa/socketon 0.0.0-stage → 1.21.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 (289) hide show
  1. package/EXPERIMENTAL.md +350 -0
  2. package/LICENSE +24 -0
  3. package/README.md +6317 -2
  4. package/WAProto/index.d.ts +17301 -0
  5. package/WAProto/index.js +125088 -0
  6. package/engine-requirements.js +14 -0
  7. package/package.json +100 -4
  8. package/src/Defaults/index.d.ts +152 -0
  9. package/src/Defaults/index.js +164 -0
  10. package/src/MessageBuilder/bot-signature.d.ts +22 -0
  11. package/src/MessageBuilder/bot-signature.js +122 -0
  12. package/src/MessageBuilder/extras.d.ts +449 -0
  13. package/src/MessageBuilder/extras.js +1356 -0
  14. package/src/MessageBuilder/index.d.ts +210 -0
  15. package/src/MessageBuilder/index.js +3594 -0
  16. package/src/MessageBuilder/metaai.d.ts +438 -0
  17. package/src/MessageBuilder/metaai.js +890 -0
  18. package/src/Signal/Group/ciphertext-message.d.ts +9 -0
  19. package/src/Signal/Group/ciphertext-message.js +11 -0
  20. package/src/Signal/Group/group-session-builder.d.ts +7 -0
  21. package/src/Signal/Group/group-session-builder.js +27 -0
  22. package/src/Signal/Group/group_cipher.d.ts +11 -0
  23. package/src/Signal/Group/group_cipher.js +78 -0
  24. package/src/Signal/Group/index.d.ts +11 -0
  25. package/src/Signal/Group/index.js +11 -0
  26. package/src/Signal/Group/keyhelper.d.ts +6 -0
  27. package/src/Signal/Group/keyhelper.js +17 -0
  28. package/src/Signal/Group/sender-chain-key.d.ts +13 -0
  29. package/src/Signal/Group/sender-chain-key.js +25 -0
  30. package/src/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  31. package/src/Signal/Group/sender-key-distribution-message.js +62 -0
  32. package/src/Signal/Group/sender-key-message.d.ts +18 -0
  33. package/src/Signal/Group/sender-key-message.js +65 -0
  34. package/src/Signal/Group/sender-key-name.d.ts +11 -0
  35. package/src/Signal/Group/sender-key-name.js +47 -0
  36. package/src/Signal/Group/sender-key-record.d.ts +12 -0
  37. package/src/Signal/Group/sender-key-record.js +40 -0
  38. package/src/Signal/Group/sender-key-state.d.ts +16 -0
  39. package/src/Signal/Group/sender-key-state.js +83 -0
  40. package/src/Signal/Group/sender-message-key.d.ts +11 -0
  41. package/src/Signal/Group/sender-message-key.js +25 -0
  42. package/src/Signal/libsignal.d.ts +54 -0
  43. package/src/Signal/libsignal.js +427 -0
  44. package/src/Signal/lid-mapping.d.ts +20 -0
  45. package/src/Signal/lid-mapping.js +274 -0
  46. package/src/Socket/Client/index.d.ts +2 -0
  47. package/src/Socket/Client/index.js +3 -0
  48. package/src/Socket/Client/tcp.js +177 -0
  49. package/src/Socket/Client/types.d.ts +5 -0
  50. package/src/Socket/Client/types.js +9 -0
  51. package/src/Socket/Client/websocket.d.ts +12 -0
  52. package/src/Socket/Client/websocket.js +53 -0
  53. package/src/Socket/business.d.ts +431 -0
  54. package/src/Socket/business.js +379 -0
  55. package/src/Socket/chats.d.ts +247 -0
  56. package/src/Socket/chats.js +1484 -0
  57. package/src/Socket/communities.d.ts +598 -0
  58. package/src/Socket/communities.js +421 -0
  59. package/src/Socket/email.js +145 -0
  60. package/src/Socket/groups.d.ts +298 -0
  61. package/src/Socket/groups.js +339 -0
  62. package/src/Socket/index.d.ts +581 -0
  63. package/src/Socket/index.js +37 -0
  64. package/src/Socket/messages-recv.d.ts +370 -0
  65. package/src/Socket/messages-recv.js +1864 -0
  66. package/src/Socket/messages-send.d.ts +390 -0
  67. package/src/Socket/messages-send.js +1574 -0
  68. package/src/Socket/mex.d.ts +1 -0
  69. package/src/Socket/mex.js +44 -0
  70. package/src/Socket/mobile-builders.js +72 -0
  71. package/src/Socket/mobile.js +424 -0
  72. package/src/Socket/newsletter.d.ts +468 -0
  73. package/src/Socket/newsletter.js +671 -0
  74. package/src/Socket/socket.d.ts +77 -0
  75. package/src/Socket/socket.js +1106 -0
  76. package/src/Store/index.d.ts +3 -0
  77. package/src/Store/index.js +3 -0
  78. package/src/Store/make-in-memory-store.d.ts +62 -0
  79. package/src/Store/make-in-memory-store.js +396 -0
  80. package/src/Store/make-ordered-dictionary.d.ts +12 -0
  81. package/src/Store/make-ordered-dictionary.js +78 -0
  82. package/src/Store/object-repository.d.ts +10 -0
  83. package/src/Store/object-repository.js +23 -0
  84. package/src/Types/Auth.d.ts +1 -0
  85. package/src/Types/Auth.js +1 -0
  86. package/src/Types/Bussines.d.ts +1 -0
  87. package/src/Types/Bussines.js +1 -0
  88. package/src/Types/Call.d.ts +1 -0
  89. package/src/Types/Call.js +1 -0
  90. package/src/Types/Chat.d.ts +2 -0
  91. package/src/Types/Chat.js +24 -0
  92. package/src/Types/Contact.d.ts +1 -0
  93. package/src/Types/Contact.js +1 -0
  94. package/src/Types/Events.d.ts +1 -0
  95. package/src/Types/Events.js +0 -0
  96. package/src/Types/GroupMetadata.d.ts +5 -0
  97. package/src/Types/GroupMetadata.js +6 -0
  98. package/src/Types/Label.d.ts +2 -0
  99. package/src/Types/Label.js +24 -0
  100. package/src/Types/LabelAssociation.d.ts +2 -0
  101. package/src/Types/LabelAssociation.js +6 -0
  102. package/src/Types/Message.d.ts +13 -0
  103. package/src/Types/Message.js +23 -0
  104. package/src/Types/Mex.d.ts +2 -0
  105. package/src/Types/Mex.js +95 -0
  106. package/src/Types/Product.d.ts +1 -0
  107. package/src/Types/Product.js +1 -0
  108. package/src/Types/Signal.d.ts +1 -0
  109. package/src/Types/Signal.js +0 -0
  110. package/src/Types/Socket.d.ts +1 -0
  111. package/src/Types/Socket.js +0 -0
  112. package/src/Types/State.d.ts +5 -0
  113. package/src/Types/State.js +54 -0
  114. package/src/Types/USync.d.ts +1 -0
  115. package/src/Types/USync.js +0 -0
  116. package/src/Types/index.d.ts +13 -0
  117. package/src/Types/index.js +25 -0
  118. package/src/Utils/auth-store.d.ts +29 -0
  119. package/src/Utils/auth-store.js +76 -0
  120. package/src/Utils/auth-utils.d.ts +58 -0
  121. package/src/Utils/auth-utils.js +273 -0
  122. package/src/Utils/browser-utils.d.ts +9 -0
  123. package/src/Utils/browser-utils.js +28 -0
  124. package/src/Utils/business.d.ts +49 -0
  125. package/src/Utils/business.js +226 -0
  126. package/src/Utils/chat-utils.d.ts +408 -0
  127. package/src/Utils/chat-utils.js +846 -0
  128. package/src/Utils/companion-reg-client-utils.d.ts +4 -0
  129. package/src/Utils/companion-reg-client-utils.js +39 -0
  130. package/src/Utils/crypto.d.ts +39 -0
  131. package/src/Utils/crypto.js +110 -0
  132. package/src/Utils/decode-wa-message.d.ts +99 -0
  133. package/src/Utils/decode-wa-message.js +373 -0
  134. package/src/Utils/event-buffer.d.ts +22 -0
  135. package/src/Utils/event-buffer.js +624 -0
  136. package/src/Utils/generics.d.ts +63 -0
  137. package/src/Utils/generics.js +375 -0
  138. package/src/Utils/group-metadata-cache.d.ts +4 -0
  139. package/src/Utils/group-metadata-cache.js +25 -0
  140. package/src/Utils/history.d.ts +75 -0
  141. package/src/Utils/history.js +131 -0
  142. package/src/Utils/html-app.d.ts +19 -0
  143. package/src/Utils/html-app.js +96 -0
  144. package/src/Utils/html-multiplayer.d.ts +10 -0
  145. package/src/Utils/html-multiplayer.js +94 -0
  146. package/src/Utils/identity-change-handler.d.ts +13 -0
  147. package/src/Utils/identity-change-handler.js +48 -0
  148. package/src/Utils/index.d.ts +44 -0
  149. package/src/Utils/index.js +44 -0
  150. package/src/Utils/link-preview-metadata.d.ts +47 -0
  151. package/src/Utils/link-preview-metadata.js +88 -0
  152. package/src/Utils/link-preview.d.ts +12 -0
  153. package/src/Utils/link-preview.js +79 -0
  154. package/src/Utils/logger.d.ts +2 -0
  155. package/src/Utils/logger.js +2 -0
  156. package/src/Utils/lt-hash.d.ts +6 -0
  157. package/src/Utils/lt-hash.js +3 -0
  158. package/src/Utils/make-mutex.d.ts +6 -0
  159. package/src/Utils/make-mutex.js +32 -0
  160. package/src/Utils/message-retry-manager.d.ts +79 -0
  161. package/src/Utils/message-retry-manager.js +255 -0
  162. package/src/Utils/messages-media.d.ts +136 -0
  163. package/src/Utils/messages-media.js +814 -0
  164. package/src/Utils/messages.d.ts +62 -0
  165. package/src/Utils/messages.js +2223 -0
  166. package/src/Utils/mobile-companion-crypto.js +191 -0
  167. package/src/Utils/modern-messages.d.ts +150 -0
  168. package/src/Utils/modern-messages.js +496 -0
  169. package/src/Utils/native-flow.d.ts +11 -0
  170. package/src/Utils/native-flow.js +115 -0
  171. package/src/Utils/newsletter-status.d.ts +158 -0
  172. package/src/Utils/newsletter-status.js +651 -0
  173. package/src/Utils/noise-handler.d.ts +20 -0
  174. package/src/Utils/noise-handler.js +200 -0
  175. package/src/Utils/offline-node-processor.d.ts +9 -0
  176. package/src/Utils/offline-node-processor.js +33 -0
  177. package/src/Utils/optional-media.d.ts +3 -0
  178. package/src/Utils/optional-media.js +45 -0
  179. package/src/Utils/payment-messages.d.ts +66 -0
  180. package/src/Utils/payment-messages.js +160 -0
  181. package/src/Utils/pre-key-manager.d.ts +25 -0
  182. package/src/Utils/pre-key-manager.js +95 -0
  183. package/src/Utils/process-message.d.ts +60 -0
  184. package/src/Utils/process-message.js +688 -0
  185. package/src/Utils/reporting-utils.d.ts +12 -0
  186. package/src/Utils/reporting-utils.js +256 -0
  187. package/src/Utils/scheduled-message.d.ts +51 -0
  188. package/src/Utils/scheduled-message.js +112 -0
  189. package/src/Utils/sender-key-memory.d.ts +19 -0
  190. package/src/Utils/sender-key-memory.js +51 -0
  191. package/src/Utils/signal.d.ts +82 -0
  192. package/src/Utils/signal.js +193 -0
  193. package/src/Utils/stanza-ack.d.ts +16 -0
  194. package/src/Utils/stanza-ack.js +30 -0
  195. package/src/Utils/status-stickers.d.ts +127 -0
  196. package/src/Utils/status-stickers.js +260 -0
  197. package/src/Utils/sync-action-utils.d.ts +2 -0
  198. package/src/Utils/sync-action-utils.js +44 -0
  199. package/src/Utils/tc-token-utils.d.ts +29 -0
  200. package/src/Utils/tc-token-utils.js +155 -0
  201. package/src/Utils/ttl-cache.d.ts +28 -0
  202. package/src/Utils/ttl-cache.js +120 -0
  203. package/src/Utils/use-mongo-auth-state.d.ts +21 -0
  204. package/src/Utils/use-mongo-auth-state.js +67 -0
  205. package/src/Utils/use-multi-file-auth-state.d.ts +11 -0
  206. package/src/Utils/use-multi-file-auth-state.js +106 -0
  207. package/src/Utils/use-mysql-auth-state.d.ts +19 -0
  208. package/src/Utils/use-mysql-auth-state.js +79 -0
  209. package/src/Utils/use-postgres-auth-state.d.ts +19 -0
  210. package/src/Utils/use-postgres-auth-state.js +79 -0
  211. package/src/Utils/use-redis-auth-state.d.ts +19 -0
  212. package/src/Utils/use-redis-auth-state.js +89 -0
  213. package/src/Utils/use-single-file-auth-state.d.ts +10 -0
  214. package/src/Utils/use-single-file-auth-state.js +108 -0
  215. package/src/Utils/use-sqlite-auth-state.d.ts +12 -0
  216. package/src/Utils/use-sqlite-auth-state.js +120 -0
  217. package/src/Utils/useNekoDBAuth.d.ts +19 -0
  218. package/src/Utils/useNekoDBAuth.js +111 -0
  219. package/src/Utils/username.d.ts +12 -0
  220. package/src/Utils/username.js +58 -0
  221. package/src/Utils/validate-connection.d.ts +43 -0
  222. package/src/Utils/validate-connection.js +277 -0
  223. package/src/Utils/voice-recognition.d.ts +53 -0
  224. package/src/Utils/voice-recognition.js +219 -0
  225. package/src/Voip/audio-feeder.d.ts +24 -0
  226. package/src/Voip/audio-feeder.js +268 -0
  227. package/src/Voip/index.d.ts +88 -0
  228. package/src/Voip/index.js +936 -0
  229. package/src/Voip/relay-transport.d.ts +5 -0
  230. package/src/Voip/relay-transport.js +824 -0
  231. package/src/Voip/signaling.d.ts +11 -0
  232. package/src/Voip/signaling.js +1099 -0
  233. package/src/Voip/types.d.ts +2 -0
  234. package/src/Voip/types.js +12 -0
  235. package/src/Voip/video-feeder.d.ts +24 -0
  236. package/src/Voip/video-feeder.js +268 -0
  237. package/src/Voip/wasm-engine.d.ts +26 -0
  238. package/src/Voip/wasm-engine.js +1307 -0
  239. package/src/Voip/worker-bootstrap.js +1023 -0
  240. package/src/WABinary/constants.d.ts +22 -0
  241. package/src/WABinary/constants.js +1300 -0
  242. package/src/WABinary/decode.d.ts +9 -0
  243. package/src/WABinary/decode.js +261 -0
  244. package/src/WABinary/encode.d.ts +2 -0
  245. package/src/WABinary/encode.js +219 -0
  246. package/src/WABinary/generic-utils.d.ts +76 -0
  247. package/src/WABinary/generic-utils.js +214 -0
  248. package/src/WABinary/index.d.ts +5 -0
  249. package/src/WABinary/index.js +5 -0
  250. package/src/WABinary/jid-utils.d.ts +30 -0
  251. package/src/WABinary/jid-utils.js +97 -0
  252. package/src/WABinary/types.d.ts +1 -0
  253. package/src/WABinary/types.js +0 -0
  254. package/src/WAM/BinaryInfo.d.ts +7 -0
  255. package/src/WAM/BinaryInfo.js +9 -0
  256. package/src/WAM/constants.d.ts +34926 -0
  257. package/src/WAM/constants.js +22852 -0
  258. package/src/WAM/encode.d.ts +1 -0
  259. package/src/WAM/encode.js +148 -0
  260. package/src/WAM/index.d.ts +3 -0
  261. package/src/WAM/index.js +3 -0
  262. package/src/WAUSync/Protocols/USyncContactProtocol.d.ts +36 -0
  263. package/src/WAUSync/Protocols/USyncContactProtocol.js +50 -0
  264. package/src/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  265. package/src/WAUSync/Protocols/USyncDeviceProtocol.js +51 -0
  266. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  267. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.js +26 -0
  268. package/src/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  269. package/src/WAUSync/Protocols/USyncStatusProtocol.js +37 -0
  270. package/src/WAUSync/Protocols/USyncUsernameProtocol.d.ts +9 -0
  271. package/src/WAUSync/Protocols/USyncUsernameProtocol.js +23 -0
  272. package/src/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +38 -0
  273. package/src/WAUSync/Protocols/UsyncBotProfileProtocol.js +49 -0
  274. package/src/WAUSync/Protocols/UsyncLIDProtocol.d.ts +14 -0
  275. package/src/WAUSync/Protocols/UsyncLIDProtocol.js +28 -0
  276. package/src/WAUSync/Protocols/index.d.ts +5 -0
  277. package/src/WAUSync/Protocols/index.js +5 -0
  278. package/src/WAUSync/USyncQuery.d.ts +20 -0
  279. package/src/WAUSync/USyncQuery.js +93 -0
  280. package/src/WAUSync/USyncUser.d.ts +16 -0
  281. package/src/WAUSync/USyncUser.js +30 -0
  282. package/src/WAUSync/index.d.ts +3 -0
  283. package/src/WAUSync/index.js +3 -0
  284. package/src/assets/wasm/README.md +76 -0
  285. package/src/assets/wasm/loader.js +5 -0
  286. package/src/assets/wasm/whatsapp.wasm +0 -0
  287. package/src/assets/wasm/worker-modules.js +273 -0
  288. package/src/index.d.ts +43 -0
  289. package/src/index.js +48 -0
@@ -0,0 +1,268 @@
1
+ import { spawn } from 'node:child_process';
2
+ const PREBUFFER_CHUNKS = 12;
3
+ const REBUFFER_CHUNKS = 6;
4
+ const MAX_QUEUED_CHUNKS = 1024;
5
+ const RESUME_QUEUE_CHUNKS = 256;
6
+ const RESYNC_AFTER_MS = 250;
7
+ export class AudioFeeder {
8
+ constructor(sampleRate, channels, framesPerChunk, onChunk, source = 'silence', hooks = {}) {
9
+ this.sampleRate = sampleRate;
10
+ this.channels = channels;
11
+ this.framesPerChunk = framesPerChunk;
12
+ this.onChunk = onChunk;
13
+ this.source = source;
14
+ this.onTrackStart = hooks.onTrackStart ?? (() => {});
15
+ this.onTrackEnd = hooks.onTrackEnd ?? (() => {});
16
+ this.onIdle = hooks.onIdle ?? (() => {});
17
+ this.ffmpegPath = hooks.ffmpegPath || process.env.FFMPEG_PATH || 'ffmpeg';
18
+ this.droppedChunks = 0;
19
+ this.underflowChunks = 0;
20
+ this.bytesProduced = 0;
21
+ this.chunksEmitted = 0;
22
+ this.rebuffers = 0;
23
+ this.tracksPlayed = 0;
24
+ this._proc = null;
25
+ this._playlist = [];
26
+ this._current = null;
27
+ this._sourceEnded = false;
28
+ this._idle = false;
29
+ this._pendingParts = [];
30
+ this._pendingBytes = 0;
31
+ this._queue = [];
32
+ this._emitTimer = null;
33
+ this._startedAtMs = 0;
34
+ this._emitIndex = 0;
35
+ this._buffering = true;
36
+ this._running = false;
37
+ this._chunkSamples = this.framesPerChunk * this.channels;
38
+ this._chunkBytes = this._chunkSamples * Float32Array.BYTES_PER_ELEMENT;
39
+ this._chunkIntervalMs = (this.framesPerChunk / this.sampleRate) * 1000;
40
+ }
41
+ get queuedChunks() {
42
+ return this._queue.length;
43
+ }
44
+ get playlistLength() {
45
+ return this._playlist.length;
46
+ }
47
+ get currentTrack() {
48
+ return this._current;
49
+ }
50
+ get idle() {
51
+ return this._idle;
52
+ }
53
+ enqueue(source) {
54
+ const tracks = Array.isArray(source) ? source : [source];
55
+ for (const track of tracks) {
56
+ if (track) {
57
+ this._playlist.push(track);
58
+ }
59
+ }
60
+ if (this._running && !this._proc) {
61
+ this._advance();
62
+ }
63
+ return this._playlist.length;
64
+ }
65
+ clearPlaylist() {
66
+ this._playlist = [];
67
+ }
68
+ skip() {
69
+ if (!this._proc) {
70
+ return false;
71
+ }
72
+ this._stopSource();
73
+ this._advance();
74
+ return true;
75
+ }
76
+ start(playlist) {
77
+ if (this._running) {
78
+ return;
79
+ }
80
+ this._running = true;
81
+ this._idle = false;
82
+ this._buffering = true;
83
+ this._emitIndex = 0;
84
+ this._startedAtMs = 0;
85
+ const initial = playlist ?? (this.source ? [this.source] : []);
86
+ this._playlist = Array.isArray(initial) ? [...initial] : [initial];
87
+ this._advance();
88
+ this._schedule();
89
+ }
90
+ stop() {
91
+ this._running = false;
92
+ if (this._emitTimer) {
93
+ clearTimeout(this._emitTimer);
94
+ this._emitTimer = null;
95
+ }
96
+ this._stopSource();
97
+ this._playlist = [];
98
+ this._current = null;
99
+ this._pendingParts = [];
100
+ this._pendingBytes = 0;
101
+ this._queue = [];
102
+ this._buffering = true;
103
+ }
104
+ _stopSource() {
105
+ const proc = this._proc;
106
+ this._proc = null;
107
+ if (proc) {
108
+ proc.stdout?.removeAllListeners('data');
109
+ proc.removeAllListeners('exit');
110
+ try {
111
+ proc.kill?.('SIGTERM');
112
+ }
113
+ catch {}
114
+ }
115
+ }
116
+ _advance() {
117
+ const next = this._playlist.shift();
118
+ if (!next) {
119
+ this._current = null;
120
+ if (!this._idle) {
121
+ this._idle = true;
122
+ this.onIdle();
123
+ }
124
+ return;
125
+ }
126
+ this._idle = false;
127
+ this._current = next;
128
+ this._sourceEnded = false;
129
+ this._buffering = true;
130
+ this._spawn(next);
131
+ this.tracksPlayed += 1;
132
+ this.onTrackStart(next);
133
+ }
134
+ _spawn(source) {
135
+ const proc = spawn(this.ffmpegPath, [
136
+ '-hide_banner',
137
+ '-loglevel', 'error',
138
+ '-thread_queue_size', '512',
139
+ ...this._resolveInputArgs(source),
140
+ '-f', 'f32le',
141
+ '-ac', String(this.channels),
142
+ '-ar', String(this.sampleRate),
143
+ 'pipe:1'
144
+ ]);
145
+ this._proc = proc;
146
+ proc.stdout.on('data', chunk => this._absorb(chunk));
147
+ proc.stderr.on('data', chunk => {
148
+ process.stderr.write(`[AudioFeeder] ${chunk.toString().trim()}\n`);
149
+ });
150
+ proc.on('exit', code => {
151
+ if (this._proc !== proc) {
152
+ return;
153
+ }
154
+ if (code !== 0 && code !== null) {
155
+ process.stderr.write(`[AudioFeeder] ffmpeg exited with code=${code}\n`);
156
+ }
157
+ this._proc = null;
158
+ this._sourceEnded = true;
159
+ });
160
+ }
161
+ _resolveInputArgs(source = this.source) {
162
+ if (!source || source === 'silence') {
163
+ return ['-re', '-f', 'lavfi', '-i', `aevalsrc=0:d=3600:s=${this.sampleRate}`];
164
+ }
165
+ if (source.startsWith('lavfi:')) {
166
+ return ['-re', '-f', 'lavfi', '-i', source.slice('lavfi:'.length)];
167
+ }
168
+ return ['-re', '-i', source];
169
+ }
170
+ _absorb(chunk) {
171
+ this._pendingParts.push(chunk);
172
+ this._pendingBytes += chunk.length;
173
+ while (this._pendingBytes >= this._chunkBytes) {
174
+ if (this._queue.length >= MAX_QUEUED_CHUNKS) {
175
+ this._proc?.stdout.pause();
176
+ return;
177
+ }
178
+ this._queue.push(this._takeChunk());
179
+ }
180
+ }
181
+ _takeChunk() {
182
+ const frame = this._pendingParts.length === 1 && this._pendingParts[0].length === this._chunkBytes
183
+ ? this._pendingParts.shift()
184
+ : this._takeFromParts();
185
+ this._pendingBytes -= this._chunkBytes;
186
+ this.bytesProduced += this._chunkBytes;
187
+ const out = new Float32Array(this._chunkSamples);
188
+ out.set(new Float32Array(frame.buffer, frame.byteOffset, this._chunkSamples));
189
+ return out;
190
+ }
191
+ _takeFromParts() {
192
+ const frame = Buffer.allocUnsafe(this._chunkBytes);
193
+ let filled = 0;
194
+ while (filled < this._chunkBytes) {
195
+ const part = this._pendingParts[0];
196
+ const take = Math.min(part.length, this._chunkBytes - filled);
197
+ part.copy(frame, filled, 0, take);
198
+ filled += take;
199
+ if (take === part.length) {
200
+ this._pendingParts.shift();
201
+ }
202
+ else {
203
+ this._pendingParts[0] = part.subarray(take);
204
+ }
205
+ }
206
+ return frame;
207
+ }
208
+ _schedule() {
209
+ if (!this._running) {
210
+ return;
211
+ }
212
+ if (this._startedAtMs === 0) {
213
+ this._startedAtMs = Date.now();
214
+ }
215
+ const target = this._startedAtMs + this._emitIndex * this._chunkIntervalMs;
216
+ const now = Date.now();
217
+ if (now - target > RESYNC_AFTER_MS) {
218
+ this._startedAtMs = now - this._emitIndex * this._chunkIntervalMs;
219
+ }
220
+ this._emitTimer = setTimeout(() => {
221
+ this._emitTimer = null;
222
+ this._tick();
223
+ }, Math.max(0, target - now));
224
+ }
225
+ _tick() {
226
+ if (!this._running && !this._proc) {
227
+ return;
228
+ }
229
+ if (this._sourceEnded && !this._queue.length && !this._pendingBytes) {
230
+ this._sourceEnded = false;
231
+ const finished = this._current;
232
+ this._current = null;
233
+ this.onTrackEnd(finished);
234
+ this._advance();
235
+ }
236
+ if (this._buffering) {
237
+ if (this._queue.length < PREBUFFER_CHUNKS && this._proc) {
238
+ this._startedAtMs = 0;
239
+ this._emitIndex = 0;
240
+ this._schedule();
241
+ return;
242
+ }
243
+ this._buffering = false;
244
+ }
245
+ const chunk = this._queue.shift();
246
+ if (chunk) {
247
+ this.onChunk(chunk);
248
+ }
249
+ else {
250
+ this.underflowChunks += 1;
251
+ this.onChunk(new Float32Array(this._chunkSamples));
252
+ if (this._proc) {
253
+ this.rebuffers += 1;
254
+ this._buffering = true;
255
+ }
256
+ }
257
+ this.chunksEmitted += 1;
258
+ this._emitIndex += 1;
259
+ if (this._buffering && this._queue.length >= REBUFFER_CHUNKS) {
260
+ this._buffering = false;
261
+ }
262
+ if (this._proc?.stdout.isPaused() && this._queue.length <= RESUME_QUEUE_CHUNKS) {
263
+ this._proc.stdout.resume();
264
+ }
265
+ this._schedule();
266
+ }
267
+ }
268
+ export default AudioFeeder;
@@ -0,0 +1,88 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export declare const CallState: Readonly<{
3
+ Idle: 0;
4
+ Calling: 1;
5
+ PreacceptReceived: 2;
6
+ ReceivedCall: 3;
7
+ AcceptSent: 4;
8
+ AcceptReceived: 5;
9
+ Active: 6;
10
+ ActiveElsewhere: 7;
11
+ Ending: 13;
12
+ }>;
13
+ export declare class ActiveCall extends EventEmitter {
14
+ readonly callId: string;
15
+ readonly state: number;
16
+ groupJid?: string;
17
+ end(): void;
18
+ mute(muted: boolean): void;
19
+ waitForEnd(): Promise<string>;
20
+ play(source: string): boolean;
21
+ playVideo(source: string): boolean;
22
+ enqueueVideo(source: string | string[]): number;
23
+ skipVideo(): boolean;
24
+ queuedVideo(): number;
25
+ nowPlayingVideo(): string | null;
26
+ isVideo(): boolean;
27
+ startScreenShare(): unknown;
28
+ stopScreenShare(): unknown;
29
+ isScreenShare(): boolean;
30
+ enqueue(source: string | string[]): number;
31
+ skip(): boolean;
32
+ queued(): number;
33
+ nowPlaying(): string | null;
34
+ }
35
+ export interface VoipClientOptions {
36
+ socket?: any;
37
+ sock?: any;
38
+ conn?: any;
39
+ logger?: (...args: any[]) => void;
40
+ debug?: boolean;
41
+ wasmPath?: string;
42
+ wasmBinary?: Uint8Array | Buffer;
43
+ resourcesPath?: string;
44
+ storageDir?: string;
45
+ ffmpegPath?: string;
46
+ }
47
+ export interface VoipCallOptions {
48
+ durationMs?: number;
49
+ audioSource?: string;
50
+ playlist?: string[];
51
+ endWhenQueueEmpty?: boolean;
52
+ idleGraceMs?: number;
53
+ audioStartDelayMs?: number;
54
+ video?: boolean;
55
+ isVideo?: boolean;
56
+ videoSource?: string;
57
+ videoPlaylist?: string[];
58
+ screenShare?: boolean;
59
+ }
60
+ export interface VoipGroupCallOptions extends VoipCallOptions {
61
+ participants?: string[];
62
+ metadata?: any;
63
+ }
64
+ export interface VoipCallInvite {
65
+ callId: string;
66
+ callCreatorJid: string;
67
+ groupJid?: string;
68
+ initialPeerJid?: string;
69
+ pnUserJids?: string[];
70
+ lidUserJids?: string[];
71
+ deviceJidsCsv?: string[];
72
+ chatName?: string;
73
+ }
74
+ export declare class VoipClient {
75
+ constructor(options?: VoipClientOptions);
76
+ connect(): Promise<void>;
77
+ attach(socket: any): Promise<void>;
78
+ call(phoneNumber: string, options?: VoipCallOptions): Promise<ActiveCall>;
79
+ callGroup(groupJid: string, options?: VoipGroupCallOptions): Promise<ActiveCall>;
80
+ joinGroupCall(invite: VoipCallInvite, options?: VoipCallOptions): Promise<ActiveCall>;
81
+ acceptCall(isMicEnabled?: boolean): void;
82
+ disconnect(): void;
83
+ resetCallState(): void;
84
+ }
85
+ export { VideoFeeder, VIDEO_FORMAT_I420 } from './video-feeder.js';
86
+ export { AudioFeeder } from './audio-feeder.js';
87
+ export declare function makeVoipClient(socket: any, options?: VoipClientOptions): Promise<VoipClient>;
88
+ export default VoipClient;