amiudmodz 6.2.6 → 6.2.7

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 (164) hide show
  1. package/lib/Defaults/index.d.ts.map +1 -1
  2. package/lib/Signal/libsignal.d.ts.map +1 -1
  3. package/lib/Signal/libsignal.js.map +1 -1
  4. package/lib/Signal/lid-mapping.d.ts.map +1 -1
  5. package/lib/Signal/lid-mapping.js.map +1 -1
  6. package/lib/Socket/Client/types.d.ts.map +1 -1
  7. package/lib/Socket/Client/websocket.js.map +1 -1
  8. package/lib/Socket/business.d.ts +5 -28
  9. package/lib/Socket/business.d.ts.map +1 -1
  10. package/lib/Socket/business.js.map +1 -1
  11. package/lib/Socket/chats.d.ts +16 -13
  12. package/lib/Socket/chats.d.ts.map +1 -1
  13. package/lib/Socket/chats.js +1 -10
  14. package/lib/Socket/chats.js.map +1 -1
  15. package/lib/Socket/communities.d.ts +51 -74
  16. package/lib/Socket/communities.d.ts.map +1 -1
  17. package/lib/Socket/communities.js.map +1 -1
  18. package/lib/Socket/groups.d.ts +29 -25
  19. package/lib/Socket/groups.d.ts.map +1 -1
  20. package/lib/Socket/groups.js.map +1 -1
  21. package/lib/Socket/index.d.ts.map +1 -1
  22. package/lib/Socket/index.js +15 -13
  23. package/lib/Socket/index.js.map +1 -1
  24. package/lib/Socket/messages-recv.d.ts +42 -65
  25. package/lib/Socket/messages-recv.d.ts.map +1 -1
  26. package/lib/Socket/messages-recv.js.map +1 -1
  27. package/lib/Socket/messages-send.d.ts +43 -66
  28. package/lib/Socket/messages-send.d.ts.map +1 -1
  29. package/lib/Socket/messages-send.js +0 -259
  30. package/lib/Socket/messages-send.js.map +1 -1
  31. package/lib/Socket/mex.d.ts.map +1 -1
  32. package/lib/Socket/mex.js.map +1 -1
  33. package/lib/Socket/newsletter.d.ts +5 -1
  34. package/lib/Socket/newsletter.d.ts.map +1 -1
  35. package/lib/Socket/newsletter.js.map +1 -1
  36. package/lib/Socket/socket.d.ts +8 -8
  37. package/lib/Socket/socket.d.ts.map +1 -1
  38. package/lib/Socket/socket.js +1 -1
  39. package/lib/Socket/socket.js.map +1 -1
  40. package/lib/Types/Bussines.d.ts +1 -1
  41. package/lib/Types/Bussines.d.ts.map +1 -1
  42. package/lib/Types/Message.d.ts +1 -13
  43. package/lib/Types/Message.d.ts.map +1 -1
  44. package/lib/Types/Message.js.map +1 -1
  45. package/lib/Types/USync.d.ts.map +1 -1
  46. package/lib/Types/USync.js.map +1 -1
  47. package/lib/Types/index.d.ts.map +1 -1
  48. package/lib/Types/index.js.map +1 -1
  49. package/lib/Utils/MessageBuilder.d.ts +0 -1
  50. package/lib/Utils/MessageBuilder.d.ts.map +1 -1
  51. package/lib/Utils/MessageBuilder.js +0 -11
  52. package/lib/Utils/MessageBuilder.js.map +1 -1
  53. package/lib/Utils/auth-utils.d.ts.map +1 -1
  54. package/lib/Utils/auth-utils.js.map +1 -1
  55. package/lib/Utils/browser-utils.d.ts.map +1 -1
  56. package/lib/Utils/business.d.ts.map +1 -1
  57. package/lib/Utils/business.js.map +1 -1
  58. package/lib/Utils/chat-utils.d.ts.map +1 -1
  59. package/lib/Utils/chat-utils.js.map +1 -1
  60. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -1
  61. package/lib/Utils/crypto.d.ts.map +1 -1
  62. package/lib/Utils/crypto.js.map +1 -1
  63. package/lib/Utils/decode-wa-message.d.ts.map +1 -1
  64. package/lib/Utils/decode-wa-message.js.map +1 -1
  65. package/lib/Utils/event-buffer.d.ts.map +1 -1
  66. package/lib/Utils/event-buffer.js.map +1 -1
  67. package/lib/Utils/generics.d.ts.map +1 -1
  68. package/lib/Utils/generics.js.map +1 -1
  69. package/lib/Utils/history.d.ts.map +1 -1
  70. package/lib/Utils/history.js.map +1 -1
  71. package/lib/Utils/identity-change-handler.d.ts.map +1 -1
  72. package/lib/Utils/identity-change-handler.js.map +1 -1
  73. package/lib/Utils/index.d.ts +0 -1
  74. package/lib/Utils/index.d.ts.map +1 -1
  75. package/lib/Utils/index.js +0 -1
  76. package/lib/Utils/index.js.map +1 -1
  77. package/lib/Utils/link-preview.d.ts.map +1 -1
  78. package/lib/Utils/messages-media.d.ts.map +1 -1
  79. package/lib/Utils/messages-media.js.map +1 -1
  80. package/lib/Utils/messages.d.ts +1 -1
  81. package/lib/Utils/messages.d.ts.map +1 -1
  82. package/lib/Utils/messages.js +0 -97
  83. package/lib/Utils/messages.js.map +1 -1
  84. package/lib/Utils/noise-handler.d.ts.map +1 -1
  85. package/lib/Utils/noise-handler.js.map +1 -1
  86. package/lib/Utils/offline-node-processor.d.ts.map +1 -1
  87. package/lib/Utils/pre-key-manager.d.ts.map +1 -1
  88. package/lib/Utils/process-message.d.ts.map +1 -1
  89. package/lib/Utils/process-message.js.map +1 -1
  90. package/lib/Utils/reporting-utils.d.ts.map +1 -1
  91. package/lib/Utils/rich-message-utils.js.map +1 -1
  92. package/lib/Utils/shortcake-crypto.d.ts.map +1 -1
  93. package/lib/Utils/shortcake.d.ts.map +1 -1
  94. package/lib/Utils/shortcake.js.map +1 -1
  95. package/lib/Utils/signal.d.ts.map +1 -1
  96. package/lib/Utils/signal.js.map +1 -1
  97. package/lib/Utils/stanza-ack.d.ts.map +1 -1
  98. package/lib/Utils/sync-action-utils.d.ts.map +1 -1
  99. package/lib/Utils/sync-action-utils.js.map +1 -1
  100. package/lib/Utils/tc-token-utils.d.ts.map +1 -1
  101. package/lib/Utils/tc-token-utils.js.map +1 -1
  102. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -1
  103. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -1
  104. package/lib/Utils/use-single-file-auth-state.js.map +1 -1
  105. package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -1
  106. package/lib/Utils/validate-connection.d.ts.map +1 -1
  107. package/lib/Utils/validate-connection.js.map +1 -1
  108. package/lib/VoIP/audio-feeder.d.ts +16 -0
  109. package/lib/VoIP/audio-feeder.d.ts.map +1 -0
  110. package/lib/VoIP/audio-feeder.js +145 -0
  111. package/lib/VoIP/audio-feeder.js.map +1 -0
  112. package/lib/VoIP/index.d.ts +25 -0
  113. package/lib/VoIP/index.d.ts.map +1 -0
  114. package/lib/VoIP/index.js +291 -0
  115. package/lib/VoIP/index.js.map +1 -0
  116. package/lib/VoIP/relay-transport.d.ts +17 -0
  117. package/lib/VoIP/relay-transport.d.ts.map +1 -0
  118. package/lib/VoIP/relay-transport.js +576 -0
  119. package/lib/VoIP/relay-transport.js.map +1 -0
  120. package/lib/VoIP/signaling.d.ts +17 -0
  121. package/lib/VoIP/signaling.d.ts.map +1 -0
  122. package/lib/VoIP/signaling.js +583 -0
  123. package/lib/VoIP/signaling.js.map +1 -0
  124. package/lib/VoIP/types.d.ts +12 -0
  125. package/lib/VoIP/types.d.ts.map +1 -0
  126. package/lib/VoIP/types.js +18 -0
  127. package/lib/VoIP/types.js.map +1 -0
  128. package/lib/VoIP/wasm-engine.d.ts +28 -0
  129. package/lib/VoIP/wasm-engine.d.ts.map +1 -0
  130. package/lib/VoIP/wasm-engine.js +1256 -0
  131. package/lib/VoIP/wasm-engine.js.map +1 -0
  132. package/lib/VoIP/worker-bootstrap.d.ts +2 -0
  133. package/lib/VoIP/worker-bootstrap.d.ts.map +1 -0
  134. package/lib/VoIP/worker-bootstrap.js +1045 -0
  135. package/lib/VoIP/worker-bootstrap.js.map +1 -0
  136. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -1
  137. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -1
  138. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -1
  139. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -1
  140. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -1
  141. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -1
  142. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -1
  143. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -1
  144. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -1
  145. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -1
  146. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -1
  147. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -1
  148. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -1
  149. package/lib/WAUSync/USyncQuery.d.ts.map +1 -1
  150. package/lib/WAUSync/USyncQuery.js.map +1 -1
  151. package/lib/assets/wasm/loader.d.ts +2 -0
  152. package/lib/assets/wasm/loader.d.ts.map +1 -0
  153. package/lib/assets/wasm/loader.js +1867 -0
  154. package/lib/assets/wasm/loader.js.map +1 -0
  155. package/lib/assets/wasm/whatsapp.wasm +0 -0
  156. package/lib/assets/wasm/worker-modules.d.ts +2 -0
  157. package/lib/assets/wasm/worker-modules.d.ts.map +1 -0
  158. package/lib/assets/wasm/worker-modules.js +11039 -0
  159. package/lib/assets/wasm/worker-modules.js.map +1 -0
  160. package/lib/index.d.ts +0 -1
  161. package/lib/index.d.ts.map +1 -1
  162. package/lib/index.js +0 -1
  163. package/lib/index.js.map +1 -1
  164. package/package.json +1 -1
@@ -0,0 +1,1256 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _NodeWorkerMessagePort_listeners, _NodeWorkerMessagePort_worker, _NodeWorkerMessagePort_handleMessage, _b, _WasmEngine_globalCallbackListeners, _WasmEngine_globalCallbacksRegistered, _WasmEngine_config, _WasmEngine_instance, _WasmEngine_initialized, _WasmEngine_moduleRegistry, _WasmEngine_vmContext, _WasmEngine_unusedWorkers, _WasmEngine_runningWorkers, _WasmEngine_pthreads, _WasmEngine_nextWorkerID, _WasmEngine_wasmModule, _WasmEngine_wasmMemory, _WasmEngine_removeRunDependencyCallback, _WasmEngine_workersLoadedCount, _WasmEngine_audioPlaybackLoopInterval, _WasmEngine_audioPlaybackBuffer, _WasmEngine_isPlaybackActive, _WasmEngine_voipStackInitialized, _WasmEngine_voipStackInitPromise, _WasmEngine_voipReadyResolver, _WasmEngine_voipReadyPromise, _WasmEngine_workerModulesCode, _WasmEngine_loaderCode, _WasmEngine_ensureInitialized, _WasmEngine_makeStringList, _WasmEngine_createUint8List, _WasmEngine_startAudioPlaybackLoop, _WasmEngine_stopAudioPlaybackLoop, _WasmEngine_applyDefaultAbProps, _WasmEngine_allocateUnusedWorker, _WasmEngine_initPThreadPool, _WasmEngine_loadWasmModuleToWorker, _WasmEngine_loadWasmModuleToAllWorkers, _WasmEngine_registerGlobalCallbacks, _WasmEngine_requireModule, _WasmEngine_createVMContext, _WasmEngine_createAtomicsWrapper;
13
+ var _a;
14
+ /**
15
+ * WhatsApp VoIP WASM engine.
16
+ *
17
+ * Loads the WhatsApp Web VoIP WASM stack inside a Node.js `vm.Context`,
18
+ * spawns a 20-thread `worker_threads` pool to mirror the browser's pthread
19
+ * model, and exposes a callback-based JS bridge. Audio-only (no video).
20
+ *
21
+ * @author ShellTear
22
+ */
23
+ import * as vm from "node:vm";
24
+ import * as fs from "node:fs";
25
+ import * as path from "node:path";
26
+ import { randomFillSync } from "node:crypto";
27
+ import { Worker } from "node:worker_threads";
28
+ import { fileURLToPath } from "node:url";
29
+ const WASM_FILE_PATH = fileURLToPath(import.meta.url);
30
+ const WASM_DIR_PATH = path.dirname(WASM_FILE_PATH);
31
+ const CALL_WASM_AB_PROPS_JSON = process.env.CALL_WASM_AB_PROPS_JSON ?? "";
32
+ const PTHREAD_POOL_SIZE = 20;
33
+ const VOIP_READY_TIMEOUT_MS = 15000;
34
+ const parseJsonObjectEnv = (raw) => {
35
+ if (!raw)
36
+ return {};
37
+ try {
38
+ const parsed = JSON.parse(raw);
39
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
40
+ return parsed;
41
+ }
42
+ catch { }
43
+ return {};
44
+ };
45
+ const toByteArray = (input) => {
46
+ if (!input)
47
+ return new Uint8Array(0);
48
+ if (input instanceof Uint8Array)
49
+ return input;
50
+ if (typeof input === "string")
51
+ return new TextEncoder().encode(input);
52
+ if (ArrayBuffer.isView(input))
53
+ return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
54
+ if (input instanceof ArrayBuffer)
55
+ return new Uint8Array(input);
56
+ if (typeof input === "object" && typeof input.length === "number") {
57
+ const arr = new Uint8Array(input.length);
58
+ for (let i = 0; i < input.length; i += 1)
59
+ arr[i] = input[i] ?? 0;
60
+ return arr;
61
+ }
62
+ return new Uint8Array(0);
63
+ };
64
+ const filterWorkerStderr = (chunk) => {
65
+ const line = chunk.toString().trim();
66
+ if (line && !line.startsWith("voip:") && !line.startsWith("still waiting")) {
67
+ process.stderr.write(chunk);
68
+ }
69
+ };
70
+ const resolveWorkerScriptPath = () => {
71
+ const compiled = path.join(WASM_DIR_PATH, "worker-bootstrap.js");
72
+ return fs.existsSync(compiled) ? compiled : path.join(WASM_DIR_PATH, "worker-bootstrap.mts");
73
+ };
74
+ class NodeWorkerMessagePort {
75
+ constructor(worker, name = "WAWebVoipWebWasmWorker") {
76
+ _NodeWorkerMessagePort_listeners.set(this, new Map());
77
+ _NodeWorkerMessagePort_worker.set(this, void 0);
78
+ this.workerID = 0;
79
+ this.pthread_ptr = 0;
80
+ this.postMessage = (msg, transferList) => {
81
+ const out = msg && typeof msg === "object" && msg.cmd && !msg.type ? { ...msg, type: "cmd" } : msg;
82
+ __classPrivateFieldGet(this, _NodeWorkerMessagePort_worker, "f").postMessage(out, transferList);
83
+ };
84
+ this.addMessageListener = (type, handler) => {
85
+ let set = __classPrivateFieldGet(this, _NodeWorkerMessagePort_listeners, "f").get(type);
86
+ if (!set) {
87
+ set = new Set();
88
+ __classPrivateFieldGet(this, _NodeWorkerMessagePort_listeners, "f").set(type, set);
89
+ }
90
+ set.add(handler);
91
+ return handler;
92
+ };
93
+ this.removeMessageListener = (type, handler) => __classPrivateFieldGet(this, _NodeWorkerMessagePort_listeners, "f").get(type)?.delete(handler) ?? false;
94
+ this.removeAllMessageListeners = (type) => {
95
+ if (type)
96
+ __classPrivateFieldGet(this, _NodeWorkerMessagePort_listeners, "f").get(type)?.clear();
97
+ else
98
+ __classPrivateFieldGet(this, _NodeWorkerMessagePort_listeners, "f").clear();
99
+ };
100
+ this.terminate = () => { __classPrivateFieldGet(this, _NodeWorkerMessagePort_worker, "f").terminate(); };
101
+ this.close = () => { };
102
+ this.isWrappingVirtualMessagePort = () => false;
103
+ this.getWorker = () => __classPrivateFieldGet(this, _NodeWorkerMessagePort_worker, "f");
104
+ _NodeWorkerMessagePort_handleMessage.set(this, (data) => {
105
+ if (!data || typeof data !== "object")
106
+ return;
107
+ if (data.type === "callback" || data.type === "waWasmWorkerCompatibleCallback") {
108
+ let callbackName;
109
+ let callbackArgs;
110
+ if (data.__name) {
111
+ callbackName = data.__name;
112
+ callbackArgs = {};
113
+ for (const key in data) {
114
+ if (key !== "type" && key !== "__name" && key !== "prototype" && key !== "args" && !key.startsWith("__")) {
115
+ callbackArgs[key] = data[key];
116
+ }
117
+ }
118
+ }
119
+ else if (data.name) {
120
+ callbackName = data.name;
121
+ callbackArgs = data.args ?? {};
122
+ }
123
+ else if (data.payload?.name) {
124
+ callbackName = data.payload.name;
125
+ callbackArgs = data.payload.args ?? {};
126
+ }
127
+ else {
128
+ return;
129
+ }
130
+ if (callbackName === "onSignalingXmpp" &&
131
+ (!callbackArgs || Object.keys(callbackArgs).length === 0)) {
132
+ callbackArgs = {
133
+ peerJid: data.peerJid, callId: data.callId, xmlPayload: data.xmlPayload,
134
+ };
135
+ }
136
+ let listenerData = callbackArgs;
137
+ if (!callbackArgs || Object.keys(callbackArgs).length === 0 ||
138
+ (Object.keys(callbackArgs).length === 1 && callbackArgs.prototype)) {
139
+ listenerData = {};
140
+ for (const key in data) {
141
+ if (key !== "type" && key !== "__name" && key !== "prototype" && key !== "args" && !key.startsWith("__")) {
142
+ listenerData[key] = data[key];
143
+ }
144
+ }
145
+ }
146
+ else if (callbackName === "sendDataToRelay") {
147
+ listenerData = { ...callbackArgs };
148
+ if (data.data !== undefined)
149
+ listenerData.data = data.data;
150
+ if (data.len !== undefined)
151
+ listenerData.len = data.len;
152
+ if (data.ip !== undefined)
153
+ listenerData.ip = data.ip;
154
+ if (data.port !== undefined)
155
+ listenerData.port = data.port;
156
+ }
157
+ else if (callbackName === "onCallEvent") {
158
+ listenerData = { ...callbackArgs };
159
+ if (data.eventType !== undefined)
160
+ listenerData.eventType = data.eventType;
161
+ if (data.userData !== undefined)
162
+ listenerData.userData = data.userData;
163
+ if (data.eventDataJson !== undefined)
164
+ listenerData.eventDataJson = data.eventDataJson;
165
+ }
166
+ WasmEngine.notifyGlobalCallbackListeners(callbackName, listenerData);
167
+ return;
168
+ }
169
+ const dispatch = (key) => {
170
+ if (!key)
171
+ return;
172
+ for (const handler of __classPrivateFieldGet(this, _NodeWorkerMessagePort_listeners, "f").get(key) ?? []) {
173
+ try {
174
+ handler(data);
175
+ }
176
+ catch { }
177
+ }
178
+ };
179
+ dispatch(data.type);
180
+ if (data.cmd !== data.type)
181
+ dispatch(data.cmd);
182
+ });
183
+ __classPrivateFieldSet(this, _NodeWorkerMessagePort_worker, worker, "f");
184
+ this.name = name;
185
+ this.fullyConnected = new Promise((resolve) => {
186
+ const loadedHandler = (msg) => {
187
+ if (msg && msg.cmd === "loaded") {
188
+ this.workerID = msg.workerID ?? 0;
189
+ resolve(this);
190
+ }
191
+ };
192
+ this.addMessageListener("cmd", loadedHandler);
193
+ });
194
+ if (typeof worker.on === "function") {
195
+ worker.on("message", (data) => __classPrivateFieldGet(this, _NodeWorkerMessagePort_handleMessage, "f").call(this, data));
196
+ worker.on("error", () => { });
197
+ }
198
+ else if (typeof worker.addEventListener === "function") {
199
+ worker.addEventListener("message", (ev) => __classPrivateFieldGet(this, _NodeWorkerMessagePort_handleMessage, "f").call(this, ev?.data ?? ev));
200
+ }
201
+ }
202
+ }
203
+ _NodeWorkerMessagePort_listeners = new WeakMap(), _NodeWorkerMessagePort_worker = new WeakMap(), _NodeWorkerMessagePort_handleMessage = new WeakMap();
204
+ export class WasmEngine {
205
+ constructor(config = {}) {
206
+ _WasmEngine_config.set(this, void 0);
207
+ _WasmEngine_instance.set(this, null);
208
+ _WasmEngine_initialized.set(this, false);
209
+ _WasmEngine_moduleRegistry.set(this, new Map());
210
+ _WasmEngine_vmContext.set(this, null);
211
+ _WasmEngine_unusedWorkers.set(this, []);
212
+ _WasmEngine_runningWorkers.set(this, []);
213
+ _WasmEngine_pthreads.set(this, {});
214
+ _WasmEngine_nextWorkerID.set(this, 1);
215
+ _WasmEngine_wasmModule.set(this, null);
216
+ _WasmEngine_wasmMemory.set(this, null);
217
+ _WasmEngine_removeRunDependencyCallback.set(this, null);
218
+ _WasmEngine_workersLoadedCount.set(this, 0);
219
+ _WasmEngine_audioPlaybackLoopInterval.set(this, null);
220
+ _WasmEngine_audioPlaybackBuffer.set(this, null);
221
+ _WasmEngine_isPlaybackActive.set(this, false);
222
+ _WasmEngine_voipStackInitialized.set(this, false);
223
+ _WasmEngine_voipStackInitPromise.set(this, null);
224
+ _WasmEngine_voipReadyResolver.set(this, null);
225
+ _WasmEngine_voipReadyPromise.set(this, null);
226
+ _WasmEngine_workerModulesCode.set(this, "");
227
+ _WasmEngine_loaderCode.set(this, "");
228
+ this.initialize = async () => {
229
+ if (__classPrivateFieldGet(this, _WasmEngine_initialized, "f"))
230
+ throw new Error("WasmEngine already initialized");
231
+ const voipStorageDir = "/tmp/voip";
232
+ try {
233
+ if (!fs.existsSync(voipStorageDir))
234
+ fs.mkdirSync(voipStorageDir, { recursive: true });
235
+ }
236
+ catch { }
237
+ const wasmDir = path.dirname(__classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath);
238
+ const loaderFile = path.join(__classPrivateFieldGet(this, _WasmEngine_config, "f").resourcesPath, "assets", "wasm", "loader.js");
239
+ const workerFile = path.join(__classPrivateFieldGet(this, _WasmEngine_config, "f").resourcesPath, "assets", "wasm", "worker-modules.js");
240
+ const downloadAsset = async (filename, targetPath) => {
241
+ const cdnUrl = `https://raw.githubusercontent.com/LuxyTeam/baileys-caller-optimized/main/assets/wasm/${filename}`;
242
+ console.log(`[WASM ENGINE] WASM asset missing. Downloading ${filename}...`);
243
+ const res = await fetch(cdnUrl);
244
+ if (!res.ok)
245
+ throw new Error(`Failed to download ${filename} from ${cdnUrl}: HTTP ${res.status}`);
246
+ const buffer = Buffer.from(await res.arrayBuffer());
247
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
248
+ fs.writeFileSync(targetPath, buffer);
249
+ console.log(`[WASM ENGINE] Successfully downloaded ${filename} (${buffer.length} bytes) to ${targetPath}`);
250
+ };
251
+ if (!__classPrivateFieldGet(this, _WasmEngine_config, "f").wasmBinary && !fs.existsSync(__classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath)) {
252
+ await downloadAsset("whatsapp.wasm", __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath);
253
+ }
254
+ if (!fs.existsSync(loaderFile)) {
255
+ await downloadAsset("loader.js", loaderFile).catch(() => { });
256
+ }
257
+ if (!fs.existsSync(workerFile)) {
258
+ await downloadAsset("worker-modules.js", workerFile).catch(() => { });
259
+ }
260
+ const wasmBuffer = __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmBinary
261
+ ? Buffer.from(__classPrivateFieldGet(this, _WasmEngine_config, "f").wasmBinary)
262
+ : fs.readFileSync(__classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath);
263
+ const diskWorkerCode = fs.existsSync(workerFile) ? fs.readFileSync(workerFile, "utf8") : "";
264
+ __classPrivateFieldSet(this, _WasmEngine_workerModulesCode, __classPrivateFieldGet(this, _WasmEngine_config, "f").workerModulesCode ?? diskWorkerCode, "f");
265
+ const workerBundleHasLoader = typeof __classPrivateFieldGet(this, _WasmEngine_workerModulesCode, "f") === "string" && /WAWebVoipWebWasmLoader/.test(__classPrivateFieldGet(this, _WasmEngine_workerModulesCode, "f"));
266
+ // Skip the on-disk loader.js if the worker bundle already has a loader —
267
+ // the standalone loader.js is older and would clobber the freshly fetched
268
+ // bindings inside worker-modules.js.
269
+ __classPrivateFieldSet(this, _WasmEngine_loaderCode, __classPrivateFieldGet(this, _WasmEngine_config, "f").loaderCode ??
270
+ (workerBundleHasLoader ? "" : fs.existsSync(loaderFile) ? fs.readFileSync(loaderFile, "utf8") : ""), "f");
271
+ if (!__classPrivateFieldGet(this, _WasmEngine_loaderCode, "f") && !__classPrivateFieldGet(this, _WasmEngine_workerModulesCode, "f")) {
272
+ throw new Error("No loader/worker code available to initialize VoIP");
273
+ }
274
+ const memory = new WebAssembly.Memory({ initial: 256, maximum: 32768, shared: true });
275
+ __classPrivateFieldSet(this, _WasmEngine_wasmMemory, memory, "f");
276
+ __classPrivateFieldSet(this, _WasmEngine_wasmModule, await WebAssembly.compile(wasmBuffer), "f");
277
+ __classPrivateFieldSet(this, _WasmEngine_vmContext, __classPrivateFieldGet(this, _WasmEngine_createVMContext, "f").call(this, memory), "f");
278
+ const runModuleCode = (code) => {
279
+ if (code)
280
+ vm.runInContext(code, __classPrivateFieldGet(this, _WasmEngine_vmContext, "f"));
281
+ };
282
+ runModuleCode(__classPrivateFieldGet(this, _WasmEngine_workerModulesCode, "f"));
283
+ runModuleCode(__classPrivateFieldGet(this, _WasmEngine_loaderCode, "f"));
284
+ __classPrivateFieldGet(this, _WasmEngine_vmContext, "f").WAWebVoipWebWasmWorkerResource = __classPrivateFieldGet(this, _WasmEngine_requireModule, "f").call(this, "WAWebVoipWebWasmWorkerResource");
285
+ const loaderModuleNames = [
286
+ __classPrivateFieldGet(this, _WasmEngine_config, "f").loaderModuleName,
287
+ "WAWebVoipWebWasmLoader",
288
+ "WAWebVoipWebWasmLoader.worker",
289
+ "WAWebVoipWebWasmLoader_ProdLab_internal.worker",
290
+ "WAWebVoipWebWasmLoader_ProdLabvideo_internal.worker",
291
+ ].filter((v, i, a) => !!v && a.indexOf(v) === i);
292
+ let wasmLoader = null;
293
+ for (const moduleName of loaderModuleNames) {
294
+ const candidate = __classPrivateFieldGet(this, _WasmEngine_requireModule, "f").call(this, moduleName);
295
+ if (typeof candidate === "function") {
296
+ wasmLoader = candidate;
297
+ break;
298
+ }
299
+ if (typeof candidate?.default === "function") {
300
+ wasmLoader = candidate.default;
301
+ break;
302
+ }
303
+ }
304
+ if (typeof wasmLoader !== "function") {
305
+ throw new Error(`No compatible WASM loader found. Tried: ${loaderModuleNames.join(", ")}`);
306
+ }
307
+ if (!__classPrivateFieldGet(_a, _b, "f", _WasmEngine_globalCallbacksRegistered))
308
+ __classPrivateFieldGet(this, _WasmEngine_registerGlobalCallbacks, "f").call(this);
309
+ await __classPrivateFieldGet(this, _WasmEngine_initPThreadPool, "f").call(this);
310
+ const workersLoadingPromise = __classPrivateFieldGet(this, _WasmEngine_loadWasmModuleToAllWorkers, "f").call(this);
311
+ const readyPromise = wasmLoader({
312
+ wasmBinary: wasmBuffer,
313
+ wasmMemory: memory,
314
+ locateFile: () => __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath,
315
+ onRuntimeInitialized: () => { },
316
+ });
317
+ const [instance] = await Promise.all([readyPromise, workersLoadingPromise]);
318
+ __classPrivateFieldSet(this, _WasmEngine_instance, instance, "f");
319
+ __classPrivateFieldSet(this, _WasmEngine_initialized, true, "f");
320
+ };
321
+ this.isInitialized = () => __classPrivateFieldGet(this, _WasmEngine_initialized, "f");
322
+ this.destroy = () => {
323
+ __classPrivateFieldGet(this, _WasmEngine_stopAudioPlaybackLoop, "f").call(this);
324
+ if (__classPrivateFieldGet(this, _WasmEngine_instance, "f") && typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").endCall === "function") {
325
+ try {
326
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").endCall(0, false);
327
+ }
328
+ catch { }
329
+ }
330
+ for (const worker of [...__classPrivateFieldGet(this, _WasmEngine_runningWorkers, "f"), ...__classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f")]) {
331
+ try {
332
+ worker.terminate();
333
+ }
334
+ catch { }
335
+ }
336
+ __classPrivateFieldSet(this, _WasmEngine_runningWorkers, [], "f");
337
+ __classPrivateFieldSet(this, _WasmEngine_unusedWorkers, [], "f");
338
+ __classPrivateFieldSet(this, _WasmEngine_instance, null, "f");
339
+ __classPrivateFieldSet(this, _WasmEngine_vmContext, null, "f");
340
+ __classPrivateFieldGet(this, _WasmEngine_moduleRegistry, "f").clear();
341
+ __classPrivateFieldSet(this, _WasmEngine_wasmModule, null, "f");
342
+ __classPrivateFieldSet(this, _WasmEngine_wasmMemory, null, "f");
343
+ __classPrivateFieldSet(this, _WasmEngine_initialized, false, "f");
344
+ };
345
+ this.initVoipStack = (selfJid, meUserJid, selfLid) => {
346
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
347
+ if (__classPrivateFieldGet(this, _WasmEngine_voipStackInitialized, "f") || __classPrivateFieldGet(this, _WasmEngine_voipStackInitPromise, "f"))
348
+ return;
349
+ __classPrivateFieldSet(this, _WasmEngine_voipStackInitPromise, new Promise((resolveInit) => {
350
+ __classPrivateFieldSet(this, _WasmEngine_voipReadyPromise, new Promise((readyResolve) => {
351
+ __classPrivateFieldSet(this, _WasmEngine_voipReadyResolver, () => {
352
+ __classPrivateFieldSet(this, _WasmEngine_voipStackInitialized, true, "f");
353
+ __classPrivateFieldSet(this, _WasmEngine_voipReadyResolver, null, "f");
354
+ __classPrivateFieldSet(this, _WasmEngine_voipReadyPromise, null, "f");
355
+ readyResolve();
356
+ }, "f");
357
+ }), "f");
358
+ try {
359
+ __classPrivateFieldGet(this, _WasmEngine_applyDefaultAbProps, "f").call(this);
360
+ try {
361
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").initVoipStack(selfJid, meUserJid, selfLid);
362
+ }
363
+ catch (modernErr) {
364
+ if (modernErr?.name === "BindingError" &&
365
+ (String(modernErr?.message ?? "").includes("expected 8 args") ||
366
+ String(modernErr?.message ?? "").includes("takes 8"))) {
367
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").initVoipStack(selfJid, meUserJid, selfLid, true, 5, 0, 8, 16);
368
+ }
369
+ else {
370
+ throw modernErr;
371
+ }
372
+ }
373
+ Promise.race([
374
+ __classPrivateFieldGet(this, _WasmEngine_voipReadyPromise, "f"),
375
+ new Promise((r) => setTimeout(() => {
376
+ __classPrivateFieldSet(this, _WasmEngine_voipStackInitialized, true, "f");
377
+ r();
378
+ }, VOIP_READY_TIMEOUT_MS)),
379
+ ]).finally(() => {
380
+ __classPrivateFieldSet(this, _WasmEngine_voipStackInitPromise, null, "f");
381
+ resolveInit();
382
+ });
383
+ }
384
+ catch {
385
+ __classPrivateFieldSet(this, _WasmEngine_voipReadyResolver, null, "f");
386
+ __classPrivateFieldSet(this, _WasmEngine_voipReadyPromise, null, "f");
387
+ __classPrivateFieldSet(this, _WasmEngine_voipStackInitPromise, null, "f");
388
+ resolveInit();
389
+ }
390
+ }), "f");
391
+ };
392
+ this.waitForVoipStackReady = async () => {
393
+ if (__classPrivateFieldGet(this, _WasmEngine_voipStackInitialized, "f"))
394
+ return;
395
+ if (__classPrivateFieldGet(this, _WasmEngine_voipStackInitPromise, "f")) {
396
+ await __classPrivateFieldGet(this, _WasmEngine_voipStackInitPromise, "f");
397
+ }
398
+ else {
399
+ await new Promise((r) => setTimeout(r, 100));
400
+ }
401
+ };
402
+ this.isVoipStackReady = () => __classPrivateFieldGet(this, _WasmEngine_voipStackInitialized, "f");
403
+ this.startCall = (options) => {
404
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
405
+ const peers = __classPrivateFieldGet(this, _WasmEngine_makeStringList, "f").call(this, options.peerList ?? [options.peerJid]);
406
+ const tcToken = __classPrivateFieldGet(this, _WasmEngine_createUint8List, "f").call(this, options.extraData);
407
+ const isLidCall = options.isLidCall ?? options.peerJid.includes("@lid");
408
+ const isFromDialer = options.isFromDialer ?? false;
409
+ const peerJid = String(options.peerJid);
410
+ try {
411
+ try {
412
+ return __classPrivateFieldGet(this, _WasmEngine_instance, "f").startVoipCall(peerJid, peers, options.callId, options.isVideo, options.peerPn, isLidCall, isFromDialer, tcToken);
413
+ }
414
+ catch (error) {
415
+ if (error?.name !== "BindingError")
416
+ throw error;
417
+ return __classPrivateFieldGet(this, _WasmEngine_instance, "f").startVoipCall(peerJid, peers, options.callId, options.isVideo, options.peerPn, isFromDialer, tcToken);
418
+ }
419
+ }
420
+ finally {
421
+ peers?.delete?.();
422
+ tcToken?.delete?.();
423
+ }
424
+ };
425
+ this.endCall = (reason = 0, sendTerminate = true) => {
426
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
427
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").endCall(reason, sendTerminate);
428
+ };
429
+ this.setMute = (muted) => {
430
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
431
+ return __classPrivateFieldGet(this, _WasmEngine_instance, "f").setCallMute(muted);
432
+ };
433
+ this.updateNetworkMedium = (networkMedium, networkMtu = 0) => {
434
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
435
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").updateNetworkMedium?.(networkMedium, networkMtu);
436
+ };
437
+ this.handleSignalingOffer = (msg) => {
438
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
439
+ const tcTokenList = __classPrivateFieldGet(this, _WasmEngine_createUint8List, "f").call(this, msg.tcToken);
440
+ try {
441
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleIncomingSignalingOffer(msg.payload, String(msg.peerPlatform ?? 0), String(msg.peerAppVersion ?? "0"), String(msg.epochId ?? "0"), String(msg.timestamp ?? "0"), msg.isOffline ?? false, msg.isOfferNotContact ?? false, String(msg.peerJid), tcTokenList);
442
+ }
443
+ finally {
444
+ tcTokenList?.delete?.();
445
+ }
446
+ };
447
+ this.handleSignalingMessage = (msg) => {
448
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
449
+ const tcTokenList = __classPrivateFieldGet(this, _WasmEngine_createUint8List, "f").call(this, msg.tcToken);
450
+ try {
451
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleIncomingSignalingMessage(msg.payload, String(msg.peerPlatform ?? "0"), String(msg.peerAppVersion ?? "0"), String(msg.epochId ?? "0"), String(msg.timestamp ?? "0"), msg.isOffline ?? false, String(msg.peerJid), tcTokenList);
452
+ }
453
+ finally {
454
+ tcTokenList?.delete?.();
455
+ }
456
+ };
457
+ this.handleSignalingAck = (msg) => {
458
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
459
+ const options = __classPrivateFieldGet(this, _WasmEngine_createUint8List, "f").call(this, msg.extraData);
460
+ try {
461
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleIncomingSignalingAck(msg.payload, String(msg.ackError ?? "0"), String(msg.msgType ?? ""), msg.peerJid ?? "", options);
462
+ }
463
+ finally {
464
+ options?.delete?.();
465
+ }
466
+ };
467
+ this.handleSignalingReceipt = (msg) => {
468
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
469
+ const tcTokenList = __classPrivateFieldGet(this, _WasmEngine_createUint8List, "f").call(this, msg.tcToken);
470
+ try {
471
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleIncomingSignalingReceipt?.(msg.payload, msg.peerJid, tcTokenList);
472
+ }
473
+ finally {
474
+ tcTokenList?.delete?.();
475
+ }
476
+ };
477
+ this.handleOnTransportMessage = (data, ip, port) => {
478
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
479
+ if (typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleOnMessageFromHeap === "function") {
480
+ const ptr = this.malloc(data.byteLength);
481
+ if (!ptr)
482
+ return;
483
+ try {
484
+ const heapU8 = __classPrivateFieldGet(this, _WasmEngine_instance, "f").GROWABLE_HEAP_U8?.() ?? __classPrivateFieldGet(this, _WasmEngine_instance, "f").HEAPU8;
485
+ if (!heapU8)
486
+ return;
487
+ heapU8.set(data, ptr);
488
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleOnMessageFromHeap(ptr, data.byteLength, ip, port);
489
+ }
490
+ finally {
491
+ this.free(ptr);
492
+ }
493
+ return;
494
+ }
495
+ if (typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleOnMessage !== "function")
496
+ return;
497
+ const dataList = __classPrivateFieldGet(this, _WasmEngine_createUint8List, "f").call(this, data);
498
+ try {
499
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").handleOnMessage(dataList, ip, port);
500
+ }
501
+ finally {
502
+ dataList?.delete?.();
503
+ }
504
+ };
505
+ this.updateIceRtt = (rttMs, relayIp, relayPort) => {
506
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
507
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").updateIceRtt?.(rttMs, relayIp, relayPort);
508
+ };
509
+ this.sendAudioData = (data, ptr) => {
510
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
511
+ if (!data || data.length === 0 || !ptr)
512
+ return;
513
+ if (typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").onAudioDataFromJs !== "function")
514
+ return;
515
+ try {
516
+ const heapF32 = __classPrivateFieldGet(this, _WasmEngine_instance, "f").GROWABLE_HEAP_F32?.() ?? __classPrivateFieldGet(this, _WasmEngine_instance, "f").HEAPF32;
517
+ if (!heapF32)
518
+ return;
519
+ const index = Math.floor(ptr / 4);
520
+ if (index < 0 || index + data.length > heapF32.length)
521
+ return;
522
+ heapF32.set(data, index);
523
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").onAudioDataFromJs(ptr, data.length);
524
+ }
525
+ catch { }
526
+ };
527
+ this.malloc = (size) => {
528
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
529
+ return __classPrivateFieldGet(this, _WasmEngine_instance, "f")._malloc(size);
530
+ };
531
+ this.free = (ptr) => {
532
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
533
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f")._free(ptr);
534
+ };
535
+ // ─── private ──────────────────────────────────────────────────────────────
536
+ _WasmEngine_ensureInitialized.set(this, () => {
537
+ if (!__classPrivateFieldGet(this, _WasmEngine_initialized, "f") || !__classPrivateFieldGet(this, _WasmEngine_instance, "f")) {
538
+ throw new Error("WasmEngine not initialized. Call initialize() first.");
539
+ }
540
+ });
541
+ _WasmEngine_makeStringList.set(this, (arr) => {
542
+ const list = new (__classPrivateFieldGet(this, _WasmEngine_instance, "f").StringList)();
543
+ for (const v of arr)
544
+ list.push_back(v);
545
+ return list;
546
+ });
547
+ _WasmEngine_createUint8List.set(this, (data) => {
548
+ if (!__classPrivateFieldGet(this, _WasmEngine_instance, "f")?.Uint8List)
549
+ return null;
550
+ const list = new (__classPrivateFieldGet(this, _WasmEngine_instance, "f").Uint8List)();
551
+ if (data)
552
+ data.forEach((byte) => list.push_back(byte));
553
+ return list;
554
+ });
555
+ _WasmEngine_startAudioPlaybackLoop.set(this, () => {
556
+ if (__classPrivateFieldGet(this, _WasmEngine_audioPlaybackLoopInterval, "f"))
557
+ return;
558
+ __classPrivateFieldGet(this, _WasmEngine_ensureInitialized, "f").call(this);
559
+ __classPrivateFieldSet(this, _WasmEngine_isPlaybackActive, true, "f");
560
+ if (typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").requestAudioDataFromWasmVoip !== "function")
561
+ return;
562
+ const framesPerChunk = 320;
563
+ const bufferSize = framesPerChunk * 4;
564
+ try {
565
+ const _malloc = __classPrivateFieldGet(this, _WasmEngine_instance, "f")._malloc ?? __classPrivateFieldGet(this, _WasmEngine_instance, "f").malloc;
566
+ if (!_malloc)
567
+ return;
568
+ __classPrivateFieldSet(this, _WasmEngine_audioPlaybackBuffer, _malloc(bufferSize), "f");
569
+ }
570
+ catch {
571
+ return;
572
+ }
573
+ if (!__classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f") || __classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f") <= 0)
574
+ return;
575
+ __classPrivateFieldSet(this, _WasmEngine_audioPlaybackLoopInterval, setInterval(() => {
576
+ if (!__classPrivateFieldGet(this, _WasmEngine_isPlaybackActive, "f") || !__classPrivateFieldGet(this, _WasmEngine_instance, "f") || !__classPrivateFieldGet(this, _WasmEngine_initialized, "f")) {
577
+ __classPrivateFieldGet(this, _WasmEngine_stopAudioPlaybackLoop, "f").call(this);
578
+ return;
579
+ }
580
+ try {
581
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f").requestAudioDataFromWasmVoip(__classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f"), bufferSize);
582
+ const heapF32 = __classPrivateFieldGet(this, _WasmEngine_instance, "f").GROWABLE_HEAP_F32?.();
583
+ if (!heapF32)
584
+ return;
585
+ const index = Math.floor(__classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f") / 4);
586
+ const numFloats = Math.floor(bufferSize / 4);
587
+ if (index < 0 || index + numFloats > heapF32.length)
588
+ return;
589
+ const audioData = new Float32Array(heapF32.buffer, heapF32.byteOffset + index * 4, numFloats);
590
+ const hasNonZero = audioData.some((s) => Math.abs(s) > 0.0001);
591
+ if (hasNonZero)
592
+ __classPrivateFieldGet(this, _WasmEngine_config, "f").callbacks?.onAudioPlaybackData?.(audioData);
593
+ }
594
+ catch { }
595
+ }, 16), "f");
596
+ });
597
+ _WasmEngine_stopAudioPlaybackLoop.set(this, () => {
598
+ __classPrivateFieldSet(this, _WasmEngine_isPlaybackActive, false, "f");
599
+ if (__classPrivateFieldGet(this, _WasmEngine_audioPlaybackLoopInterval, "f")) {
600
+ clearInterval(__classPrivateFieldGet(this, _WasmEngine_audioPlaybackLoopInterval, "f"));
601
+ __classPrivateFieldSet(this, _WasmEngine_audioPlaybackLoopInterval, null, "f");
602
+ }
603
+ if (__classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f") && __classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f") > 0) {
604
+ try {
605
+ __classPrivateFieldGet(this, _WasmEngine_instance, "f")?._free?.(__classPrivateFieldGet(this, _WasmEngine_audioPlaybackBuffer, "f"));
606
+ }
607
+ catch { }
608
+ __classPrivateFieldSet(this, _WasmEngine_audioPlaybackBuffer, null, "f");
609
+ }
610
+ });
611
+ _WasmEngine_applyDefaultAbProps.set(this, () => {
612
+ if (!__classPrivateFieldGet(this, _WasmEngine_instance, "f"))
613
+ return;
614
+ const setInt = typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").setABPropInt === "function"
615
+ ? (k, v) => { __classPrivateFieldGet(this, _WasmEngine_instance, "f").setABPropInt(k, v); }
616
+ : null;
617
+ const setBool = typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").setABPropBool === "function"
618
+ ? (k, v) => { __classPrivateFieldGet(this, _WasmEngine_instance, "f").setABPropBool(k, v); }
619
+ : null;
620
+ const setString = typeof __classPrivateFieldGet(this, _WasmEngine_instance, "f").setABPropString === "function"
621
+ ? (k, v) => { __classPrivateFieldGet(this, _WasmEngine_instance, "f").setABPropString(k, v); }
622
+ : null;
623
+ if (!setInt && !setBool && !setString)
624
+ return;
625
+ const opts = __classPrivateFieldGet(this, _WasmEngine_config, "f").options ?? {};
626
+ const intProps = {
627
+ heartbeat_interval_s: opts.heartbeatInterval ?? 30,
628
+ lobby_timeout_min: opts.lobbyTimeout ?? 1,
629
+ max_num_participants_for_ss: opts.maxParticipantsScreenShare ?? 32,
630
+ max_group_size_for_long_ringtone: opts.maxGroupSizeLongRingtone ?? 32,
631
+ app_exit_reason_version: 1,
632
+ log_level: opts.logLevel ?? 3,
633
+ calling_rust_migration_bitmap: 0,
634
+ calling_rust_migration_incoming_stanza_bitmap: 0,
635
+ default_endpoint_thread_poll_timeout: 0,
636
+ aigc_version: 0,
637
+ call_admin_version: 0,
638
+ vid_stream_pause_resume_jb_reset_threshold_ms: 0,
639
+ // Opus: max bandwidth WB (16 kHz). FB (48 kHz) needs native audio device
640
+ // hooks not available in this JS-only WASM context.
641
+ opus_max_bandwidth: 1103, // OPUS_BANDWIDTH_WIDEBAND
642
+ };
643
+ const boolProps = {
644
+ enable_av_downgrade: false,
645
+ enable_new_user_action_stanza_for_raise_hand_sender: false,
646
+ enable_webcodec_video_encode: false,
647
+ enable_init_bwe_for_group_call: false,
648
+ enable_ring_for_gc_on_offer_expire: false,
649
+ allow_reporting_call_replayer_id: false,
650
+ enable_offer_v2_upgrade: false,
651
+ enable_silent_offer: false,
652
+ voice_ai_conversation_starter_latency_tracking: false,
653
+ enable_waiting_room_logging: false,
654
+ attach_transport_rtx: false,
655
+ ignore_joinable_terminate_on_expired_offer: false,
656
+ enable_passthrough_video_decoder: false,
657
+ };
658
+ for (const [key, value] of Object.entries(intProps)) {
659
+ if (setInt && Number.isFinite(value))
660
+ try {
661
+ setInt(key, value);
662
+ }
663
+ catch { }
664
+ }
665
+ for (const [key, value] of Object.entries(boolProps)) {
666
+ if (setBool)
667
+ try {
668
+ setBool(key, value);
669
+ }
670
+ catch { }
671
+ }
672
+ const overrideProps = parseJsonObjectEnv(CALL_WASM_AB_PROPS_JSON);
673
+ for (const [key, value] of Object.entries(overrideProps)) {
674
+ try {
675
+ if (typeof value === "boolean" && setBool)
676
+ setBool(key, value);
677
+ else if (typeof value === "number" && setInt)
678
+ setInt(key, value);
679
+ else if (typeof value === "string" && setString)
680
+ setString(key, value);
681
+ }
682
+ catch { }
683
+ }
684
+ });
685
+ _WasmEngine_allocateUnusedWorker.set(this, () => {
686
+ const workerScriptPath = resolveWorkerScriptPath();
687
+ if (!fs.existsSync(workerScriptPath))
688
+ return;
689
+ try {
690
+ const worker = new Worker(workerScriptPath, {
691
+ stdout: true, stderr: true,
692
+ workerData: {
693
+ wasmPath: __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath,
694
+ wasmBinary: __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmBinary,
695
+ workerModulesCode: __classPrivateFieldGet(this, _WasmEngine_workerModulesCode, "f"),
696
+ loaderCode: __classPrivateFieldGet(this, _WasmEngine_loaderCode, "f"),
697
+ loaderModuleName: __classPrivateFieldGet(this, _WasmEngine_config, "f").loaderModuleName,
698
+ resourcesPath: __classPrivateFieldGet(this, _WasmEngine_config, "f").resourcesPath,
699
+ enableLogs: __classPrivateFieldGet(this, _WasmEngine_config, "f").enableLogs,
700
+ },
701
+ });
702
+ const port = new NodeWorkerMessagePort(worker, "WAWebVoipWebWasmWorker");
703
+ worker.stdout?.on("data", () => { }); // suppress noisy worker stdout
704
+ worker.stderr?.on("data", filterWorkerStderr);
705
+ __classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").push(port);
706
+ }
707
+ catch { }
708
+ });
709
+ _WasmEngine_initPThreadPool.set(this, async () => {
710
+ for (let i = 0; i < PTHREAD_POOL_SIZE; i += 1)
711
+ __classPrivateFieldGet(this, _WasmEngine_allocateUnusedWorker, "f").call(this);
712
+ });
713
+ _WasmEngine_loadWasmModuleToWorker.set(this, (worker) => new Promise((resolve) => {
714
+ var _c, _d;
715
+ const loadedHandler = (msg) => {
716
+ if (msg && msg.cmd === "loaded") {
717
+ worker.removeMessageListener("cmd", loadedHandler);
718
+ __classPrivateFieldSet(this, _WasmEngine_workersLoadedCount, __classPrivateFieldGet(this, _WasmEngine_workersLoadedCount, "f") + 1, "f");
719
+ if (__classPrivateFieldGet(this, _WasmEngine_workersLoadedCount, "f") >= PTHREAD_POOL_SIZE && __classPrivateFieldGet(this, _WasmEngine_removeRunDependencyCallback, "f")) {
720
+ __classPrivateFieldGet(this, _WasmEngine_removeRunDependencyCallback, "f").call(this, "loading-workers");
721
+ }
722
+ resolve();
723
+ }
724
+ };
725
+ worker.addMessageListener("cmd", loadedHandler);
726
+ worker.workerID = (__classPrivateFieldSet(this, _WasmEngine_nextWorkerID, (_d = __classPrivateFieldGet(this, _WasmEngine_nextWorkerID, "f"), _c = _d++, _d), "f"), _c);
727
+ worker.postMessage({
728
+ cmd: "load", type: "cmd",
729
+ wasmMemory: __classPrivateFieldGet(this, _WasmEngine_wasmMemory, "f"),
730
+ wasmModule: __classPrivateFieldGet(this, _WasmEngine_wasmModule, "f"),
731
+ workerID: worker.workerID,
732
+ handlers: [],
733
+ });
734
+ }));
735
+ _WasmEngine_loadWasmModuleToAllWorkers.set(this, async () => {
736
+ __classPrivateFieldSet(this, _WasmEngine_workersLoadedCount, 0, "f");
737
+ await Promise.all(__classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").map((w) => __classPrivateFieldGet(this, _WasmEngine_loadWasmModuleToWorker, "f").call(this, w)));
738
+ });
739
+ _WasmEngine_registerGlobalCallbacks.set(this, () => {
740
+ const callbacks = __classPrivateFieldGet(this, _WasmEngine_config, "f").callbacks ?? {};
741
+ _a.registerGlobalCallbackListener("loggingCallback", (data) => {
742
+ if (!__classPrivateFieldGet(this, _WasmEngine_config, "f").enableLogs)
743
+ return;
744
+ const level = data?.level;
745
+ const msg = data?.message ?? "";
746
+ const mapped = level === 1 ? "error" : level === 2 ? "warn" : level === 3 ? "log" : "debug";
747
+ callbacks.onLog?.(mapped, msg);
748
+ });
749
+ if (callbacks.onAudioCaptureInit) {
750
+ _a.registerGlobalCallbackListener("initCaptureDriverJS", (data) => {
751
+ callbacks.onAudioCaptureInit({
752
+ sampleRate: data?.sample_rate ?? data?.sampleRate,
753
+ channels: data?.channels,
754
+ bitsPerSample: data?.bits_per_sample ?? data?.bitsPerSample,
755
+ framesPerChunk: data?.frames_per_chunk ?? data?.framesPerChunk,
756
+ });
757
+ });
758
+ }
759
+ _a.registerGlobalCallbackListener("startCaptureJS", () => callbacks.onAudioCaptureStart?.());
760
+ _a.registerGlobalCallbackListener("stopCaptureJS", () => callbacks.onAudioCaptureStop?.());
761
+ if (callbacks.onAudioPlaybackInit) {
762
+ _a.registerGlobalCallbackListener("initPlaybackDriverJS", (data) => {
763
+ callbacks.onAudioPlaybackInit({
764
+ sampleRate: data?.sample_rate ?? data?.sampleRate,
765
+ channels: data?.channels,
766
+ bitsPerSample: data?.bits_per_sample ?? data?.bitsPerSample,
767
+ framesPerChunk: data?.frames_per_chunk ?? data?.framesPerChunk,
768
+ });
769
+ });
770
+ }
771
+ _a.registerGlobalCallbackListener("startPlaybackJS", () => {
772
+ callbacks.onAudioPlaybackStart?.();
773
+ __classPrivateFieldGet(this, _WasmEngine_startAudioPlaybackLoop, "f").call(this);
774
+ });
775
+ _a.registerGlobalCallbackListener("stopPlaybackJS", () => {
776
+ __classPrivateFieldGet(this, _WasmEngine_stopAudioPlaybackLoop, "f").call(this);
777
+ callbacks.onAudioPlaybackStop?.();
778
+ });
779
+ if (callbacks.onSignalingXmpp) {
780
+ _a.registerGlobalCallbackListener("onSignalingXmpp", (data) => {
781
+ const peerJid = data.peerJid ?? data.args?.peerJid;
782
+ const callId = data.callId ?? data.args?.callId;
783
+ let xmlPayload = data.xmlPayload ?? data.args?.xmlPayload;
784
+ if (Array.isArray(xmlPayload))
785
+ xmlPayload = new Uint8Array(xmlPayload);
786
+ else if (xmlPayload && typeof xmlPayload === "object" &&
787
+ !(xmlPayload instanceof Uint8Array) && !Buffer.isBuffer(xmlPayload)) {
788
+ xmlPayload = new Uint8Array(xmlPayload);
789
+ }
790
+ callbacks.onSignalingXmpp(peerJid, callId, xmlPayload);
791
+ });
792
+ }
793
+ if (callbacks.onCallEvent) {
794
+ _a.registerGlobalCallbackListener("onCallEvent", (data) => {
795
+ callbacks.onCallEvent(data.eventType, data.eventDataJson);
796
+ });
797
+ }
798
+ if (callbacks.sendDataToRelay) {
799
+ _a.registerGlobalCallbackListener("sendDataToRelay", (data) => {
800
+ let relayData = data.data ?? data.args?.data;
801
+ const ip = data.ip ?? data.args?.ip;
802
+ const portNum = data.port ?? data.args?.port;
803
+ if (relayData instanceof Uint8Array) { /* ok */ }
804
+ else if (Array.isArray(relayData))
805
+ relayData = new Uint8Array(relayData);
806
+ else if (Buffer.isBuffer(relayData))
807
+ relayData = new Uint8Array(relayData);
808
+ else if (relayData && typeof relayData === "object" && relayData.buffer) {
809
+ relayData = new Uint8Array(relayData.buffer, relayData.byteOffset ?? 0, relayData.byteLength ?? relayData.length);
810
+ }
811
+ else if (relayData instanceof ArrayBuffer)
812
+ relayData = new Uint8Array(relayData);
813
+ else
814
+ return 0;
815
+ if (!ip || !portNum)
816
+ return 0;
817
+ callbacks.sendDataToRelay(relayData, ip, portNum);
818
+ return relayData.byteLength;
819
+ });
820
+ }
821
+ __classPrivateFieldSet(_a, _b, true, "f", _WasmEngine_globalCallbacksRegistered);
822
+ });
823
+ _WasmEngine_requireModule.set(this, (name) => {
824
+ const preDefinedModules = {
825
+ Promise,
826
+ WAWebVoipWebWasmWorkerResource: {
827
+ resourcePath: resolveWorkerScriptPath(),
828
+ name: "WAWebVoipWebWasmWorker",
829
+ },
830
+ WorkerBundleResource: {
831
+ createDedicatedWebWorker: (resource) => {
832
+ const scriptPath = resource?.resourcePath && fs.existsSync(resource.resourcePath)
833
+ ? resource.resourcePath
834
+ : resolveWorkerScriptPath();
835
+ const worker = new Worker(scriptPath, {
836
+ stdout: true, stderr: true,
837
+ workerData: {
838
+ wasmPath: __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmPath,
839
+ wasmBinary: __classPrivateFieldGet(this, _WasmEngine_config, "f").wasmBinary,
840
+ workerModulesCode: __classPrivateFieldGet(this, _WasmEngine_workerModulesCode, "f"),
841
+ loaderCode: __classPrivateFieldGet(this, _WasmEngine_loaderCode, "f"),
842
+ loaderModuleName: __classPrivateFieldGet(this, _WasmEngine_config, "f").loaderModuleName,
843
+ resourcesPath: __classPrivateFieldGet(this, _WasmEngine_config, "f").resourcesPath,
844
+ enableLogs: __classPrivateFieldGet(this, _WasmEngine_config, "f").enableLogs,
845
+ },
846
+ });
847
+ worker.stdout?.on("data", () => { });
848
+ worker.stderr?.on("data", filterWorkerStderr);
849
+ return worker;
850
+ },
851
+ },
852
+ WorkerClient: { init: () => { } },
853
+ WorkerMessagePort: {
854
+ WorkerMessagePort: NodeWorkerMessagePort,
855
+ CastWorkerMessagePort: (w) => w,
856
+ WorkerSyncedMessagePort: NodeWorkerMessagePort,
857
+ },
858
+ bx: Object.assign((id) => String(id), { getURL: () => "" }),
859
+ HasteSupportData: { handle: () => { } },
860
+ ServiceWorkerDynamicModules: { handle: () => { } },
861
+ WhatsAppWebServiceWorker: { default: true },
862
+ WAWebLogger: { initializeWAWebLogger: () => { } },
863
+ WAWebSw: { initHandlers: () => { } },
864
+ WAWebWamRuntimeProvider: { setWamRuntime: () => { } },
865
+ WAWebWamWorkerInterface: { commit: () => { }, set: () => { } },
866
+ ServerJSDefine: { handleDefine: () => { } },
867
+ ix: { add: () => { } },
868
+ MetaConfigMap: { add: () => { } },
869
+ QPLHasteSupportDataStorage: { default: { add: () => { }, get: () => null } },
870
+ getFalcoLogPolicy_DO_NOT_USE: { add: () => { } },
871
+ gkx: { add: () => { } },
872
+ justknobx: { add: () => { } },
873
+ qex: { add: () => { } },
874
+ };
875
+ if (preDefinedModules[name])
876
+ return preDefinedModules[name];
877
+ const mod = __classPrivateFieldGet(this, _WasmEngine_moduleRegistry, "f").get(name);
878
+ if (!mod)
879
+ return {};
880
+ if (mod.exports !== undefined)
881
+ return mod.exports;
882
+ const requireFn = __classPrivateFieldGet(this, _WasmEngine_requireModule, "f");
883
+ const normalizeModuleResult = (value) => {
884
+ if (value && typeof value === "object" && "exports" in value && Object.keys(value).length === 1) {
885
+ return value.exports;
886
+ }
887
+ return value;
888
+ };
889
+ const importDefaultFn = (dep) => {
890
+ const v = requireFn(dep);
891
+ return v && v.__esModule ? v.default : v;
892
+ };
893
+ const importAllFn = (dep) => {
894
+ const v = requireFn(dep);
895
+ if (v == null)
896
+ return { default: v };
897
+ if (v.__esModule)
898
+ return v;
899
+ if (typeof v !== "object" && typeof v !== "function")
900
+ return { default: v };
901
+ const ns = {};
902
+ for (const key of Object.keys(v))
903
+ ns[key] = v[key];
904
+ ns.default = v;
905
+ return ns;
906
+ };
907
+ const tryMetro = () => {
908
+ const module = { exports: {} };
909
+ mod.factory(__classPrivateFieldGet(this, _WasmEngine_vmContext, "f") ?? globalThis, requireFn, importDefaultFn, importAllFn, null, module, module.exports);
910
+ return normalizeModuleResult(module.exports);
911
+ };
912
+ const tryLegacy = () => {
913
+ const exports = {};
914
+ const module = { exports };
915
+ const resolvedDeps = mod.deps.map((dep) => requireFn(dep));
916
+ mod.factory(__classPrivateFieldGet(this, _WasmEngine_vmContext, "f") ?? globalThis, requireFn, requireFn, requireFn, module, exports, ...resolvedDeps);
917
+ return normalizeModuleResult(module.exports);
918
+ };
919
+ let result = {};
920
+ let metroError = null;
921
+ try {
922
+ result = tryMetro();
923
+ }
924
+ catch (e) {
925
+ metroError = e;
926
+ }
927
+ if (metroError != null || (result && typeof result === "object" && Object.keys(result).length === 0)) {
928
+ try {
929
+ const legacyResult = tryLegacy();
930
+ if (typeof legacyResult === "function" || (legacyResult && Object.keys(legacyResult).length > 0)) {
931
+ result = legacyResult;
932
+ }
933
+ }
934
+ catch { }
935
+ }
936
+ mod.exports = result;
937
+ return result;
938
+ });
939
+ _WasmEngine_createVMContext.set(this, (memory) => {
940
+ const callbacks = __classPrivateFieldGet(this, _WasmEngine_config, "f").callbacks ?? {};
941
+ const wasmCallbacks = {
942
+ onVoipReady: () => {
943
+ __classPrivateFieldGet(this, _WasmEngine_voipReadyResolver, "f")?.call(this);
944
+ callbacks.onVoipReady?.();
945
+ },
946
+ onSignalingXmpp: (data) => callbacks.onSignalingXmpp?.(data?.peerJid, data?.callId, data?.xmlPayload),
947
+ onCallEvent: (data) => callbacks.onCallEvent?.(data?.eventType, data?.eventDataJson),
948
+ sendDataToRelay: (data) => callbacks.sendDataToRelay?.(data?.data, data?.ip, data?.port),
949
+ loggingCallback: (data) => {
950
+ if (!__classPrivateFieldGet(this, _WasmEngine_config, "f").enableLogs)
951
+ return;
952
+ const level = data?.level;
953
+ const msg = data?.message ?? "";
954
+ const mapped = level === 1 ? "error" : level === 2 ? "warn" : level === 3 ? "log" : "debug";
955
+ callbacks.onLog?.(mapped, msg);
956
+ },
957
+ initCaptureDriverJS: (data) => {
958
+ callbacks.onAudioCaptureInit?.({
959
+ sampleRate: data?.sample_rate, channels: data?.channels,
960
+ bitsPerSample: data?.bits_per_sample, framesPerChunk: data?.frames_per_chunk,
961
+ });
962
+ return 0;
963
+ },
964
+ startCaptureJS: () => { callbacks.onAudioCaptureStart?.(); return 0; },
965
+ stopCaptureJS: () => { callbacks.onAudioCaptureStop?.(); return 0; },
966
+ initPlaybackDriverJS: (data) => {
967
+ callbacks.onAudioPlaybackInit?.({
968
+ sampleRate: data?.sample_rate, channels: data?.channels,
969
+ bitsPerSample: data?.bits_per_sample, framesPerChunk: data?.frames_per_chunk,
970
+ });
971
+ return 0;
972
+ },
973
+ startPlaybackJS: () => {
974
+ callbacks.onAudioPlaybackStart?.();
975
+ __classPrivateFieldGet(this, _WasmEngine_startAudioPlaybackLoop, "f").call(this);
976
+ return 0;
977
+ },
978
+ stopPlaybackJS: () => {
979
+ __classPrivateFieldGet(this, _WasmEngine_stopAudioPlaybackLoop, "f").call(this);
980
+ callbacks.onAudioPlaybackStop?.();
981
+ return 0;
982
+ },
983
+ startVideoCaptureJS: () => { callbacks.onVideoCaptureStart?.(); return 0; },
984
+ stopVideoCaptureJS: () => { callbacks.onVideoCaptureStop?.(); return 0; },
985
+ startDesktopCaptureJS: () => 0,
986
+ stopDesktopCaptureJS: () => 0,
987
+ dataChannelStateCallback: () => 0,
988
+ getBrowserAudioProcessingStatus: () => 7,
989
+ getBweModelPath: () => null,
990
+ videoFrameConsumed: (data) => {
991
+ if (data && callbacks.onVideoFrameConsumed) {
992
+ callbacks.onVideoFrameConsumed(data);
993
+ }
994
+ return 0;
995
+ },
996
+ cryptoHkdfExtractWithSaltAndExpand: (data) => {
997
+ const key = toByteArray(data?.key_);
998
+ const salt = data?.salt_ ? toByteArray(data.salt_) : new Uint8Array(0);
999
+ const info = toByteArray(data?.info_);
1000
+ const length = data?.length ?? 32;
1001
+ return callbacks.cryptoHkdf?.(key, salt, info, length) ?? new Uint8Array(length);
1002
+ },
1003
+ hmacSha256KeyGenerator: (data) => {
1004
+ const hmacData = new Uint8Array(data?.data_ ?? []);
1005
+ const hmacKey = new Uint8Array(data?.key_ ?? []);
1006
+ return callbacks.hmacSha256?.(hmacData, hmacKey) ?? new Uint8Array(32);
1007
+ },
1008
+ isParticipantKnownContact: () => true,
1009
+ getPersistentDirectoryPath: () => {
1010
+ const dir = "/tmp/voip";
1011
+ try {
1012
+ if (!fs.existsSync(dir))
1013
+ fs.mkdirSync(dir, { recursive: true });
1014
+ }
1015
+ catch { }
1016
+ return dir;
1017
+ },
1018
+ };
1019
+ const __d = (name, deps, factory) => {
1020
+ __classPrivateFieldGet(this, _WasmEngine_moduleRegistry, "f").set(name, { deps, factory, exports: undefined });
1021
+ };
1022
+ const babelHelpers = {
1023
+ extends: Object.assign,
1024
+ inheritsLoose: (sub, sup) => {
1025
+ sub.prototype = Object.create(sup.prototype);
1026
+ sub.prototype.constructor = sub;
1027
+ sub.__proto__ = sup;
1028
+ },
1029
+ objectWithoutPropertiesLoose: (source, excluded) => {
1030
+ if (source == null)
1031
+ return {};
1032
+ const target = {};
1033
+ for (const key of Object.keys(source)) {
1034
+ if (excluded.indexOf(key) >= 0)
1035
+ continue;
1036
+ target[key] = source[key];
1037
+ }
1038
+ return target;
1039
+ },
1040
+ taggedTemplateLiteralLoose: (strings, raw) => {
1041
+ if (!raw)
1042
+ raw = strings.slice(0);
1043
+ strings.raw = raw;
1044
+ return strings;
1045
+ },
1046
+ wrapNativeSuper: (Class) => Class,
1047
+ };
1048
+ const addRunDependency = (dep) => {
1049
+ if (dep === "loading-workers" && __classPrivateFieldGet(this, _WasmEngine_workersLoadedCount, "f") >= PTHREAD_POOL_SIZE) {
1050
+ setImmediate(() => __classPrivateFieldGet(this, _WasmEngine_removeRunDependencyCallback, "f")?.call(this, dep));
1051
+ }
1052
+ };
1053
+ const removeRunDependency = (_dep) => { };
1054
+ __classPrivateFieldSet(this, _WasmEngine_removeRunDependencyCallback, removeRunDependency, "f");
1055
+ const webCrypto = {
1056
+ getRandomValues: (arr) => {
1057
+ if (!arr || !ArrayBuffer.isView(arr)) {
1058
+ throw new TypeError("crypto.getRandomValues expects a TypedArray");
1059
+ }
1060
+ const bytes = Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);
1061
+ randomFillSync(bytes);
1062
+ return arr;
1063
+ },
1064
+ };
1065
+ const selfObj = {
1066
+ __swData: { dynamic_data: { hsdp: {}, dynamic_modules: [] } },
1067
+ WhatsAppVoipWasmCallbacks: wasmCallbacks,
1068
+ WhatsAppVoipWasmWorkerCompatibleCallbacks: wasmCallbacks,
1069
+ crypto: webCrypto,
1070
+ };
1071
+ selfObj.self = selfObj;
1072
+ selfObj.window = selfObj;
1073
+ selfObj.globalThis = selfObj;
1074
+ if (typeof global !== "undefined") {
1075
+ global.WhatsAppVoipWasmCallbacks = wasmCallbacks;
1076
+ global.WhatsAppVoipWasmWorkerCompatibleCallbacks = wasmCallbacks;
1077
+ }
1078
+ const context = vm.createContext({
1079
+ self: selfObj, globalThis: selfObj, global: selfObj, window: selfObj,
1080
+ console, setTimeout, setInterval, clearTimeout, clearInterval,
1081
+ queueMicrotask, performance, babelHelpers, __d,
1082
+ require: __classPrivateFieldGet(this, _WasmEngine_requireModule, "f"),
1083
+ addRunDependency, removeRunDependency,
1084
+ WebAssembly, SharedArrayBuffer,
1085
+ Atomics: __classPrivateFieldGet(this, _WasmEngine_createAtomicsWrapper, "f").call(this, memory),
1086
+ Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array,
1087
+ Float32Array, Float64Array, BigInt64Array, BigUint64Array,
1088
+ ArrayBuffer, DataView, Error, TypeError, RangeError, Promise,
1089
+ Map, Set, WeakMap, WeakSet, Symbol, Object, Array, String, Number,
1090
+ Boolean, Math, Date, JSON, RegExp, Function, Proxy, Reflect,
1091
+ crypto: webCrypto,
1092
+ WhatsAppVoipWasmCallbacks: wasmCallbacks,
1093
+ WhatsAppVoipWasmWorkerCompatibleCallbacks: wasmCallbacks,
1094
+ navigator: {
1095
+ userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
1096
+ hardwareConcurrency: 4,
1097
+ },
1098
+ process: undefined,
1099
+ document: { currentScript: null },
1100
+ location: { href: "file:///wasm" },
1101
+ Worker: class {
1102
+ constructor() { }
1103
+ postMessage() { }
1104
+ terminate() { }
1105
+ addEventListener() { }
1106
+ },
1107
+ fetch: async () => { throw new Error("fetch not supported"); },
1108
+ XMLHttpRequest: class {
1109
+ open() { }
1110
+ send() { }
1111
+ setRequestHeader() { }
1112
+ },
1113
+ Blob: class {
1114
+ constructor() { }
1115
+ },
1116
+ URL: { createObjectURL: () => "blob:fake", revokeObjectURL: () => { } },
1117
+ Image: class {
1118
+ constructor() {
1119
+ this.src = "";
1120
+ this.onload = null;
1121
+ this.onerror = null;
1122
+ }
1123
+ },
1124
+ Audio: class {
1125
+ constructor() {
1126
+ this.src = "";
1127
+ }
1128
+ addEventListener() { }
1129
+ },
1130
+ __NODE_PTHREAD: {
1131
+ getUnusedWorker: () => {
1132
+ if (__classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").length === 0)
1133
+ return null;
1134
+ const worker = __classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").pop();
1135
+ __classPrivateFieldGet(this, _WasmEngine_runningWorkers, "f").push(worker);
1136
+ return worker;
1137
+ },
1138
+ returnWorkerToPool: (worker) => {
1139
+ const idx = __classPrivateFieldGet(this, _WasmEngine_runningWorkers, "f").indexOf(worker);
1140
+ if (idx >= 0) {
1141
+ __classPrivateFieldGet(this, _WasmEngine_runningWorkers, "f").splice(idx, 1);
1142
+ __classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").push(worker);
1143
+ }
1144
+ },
1145
+ spawnThread: (params) => {
1146
+ const worker = __classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").pop();
1147
+ if (!worker)
1148
+ return 6;
1149
+ __classPrivateFieldGet(this, _WasmEngine_runningWorkers, "f").push(worker);
1150
+ __classPrivateFieldGet(this, _WasmEngine_pthreads, "f")[params.pthread_ptr] = worker;
1151
+ worker.pthread_ptr = params.pthread_ptr;
1152
+ const pthreadTable = __classPrivateFieldGet(this, _WasmEngine_instance, "f")?.PThread?.pthreads;
1153
+ if (pthreadTable)
1154
+ pthreadTable[params.pthread_ptr] = worker;
1155
+ worker.postMessage({
1156
+ cmd: "run",
1157
+ start_routine: params.startRoutine,
1158
+ arg: params.arg,
1159
+ pthread_ptr: params.pthread_ptr,
1160
+ });
1161
+ return 0;
1162
+ },
1163
+ unusedWorkersCount: () => __classPrivateFieldGet(this, _WasmEngine_unusedWorkers, "f").length,
1164
+ runningWorkersCount: () => __classPrivateFieldGet(this, _WasmEngine_runningWorkers, "f").length,
1165
+ },
1166
+ __IS_NODE_PTHREAD_ENV: true,
1167
+ });
1168
+ context.self = context;
1169
+ context.globalThis = context;
1170
+ context.global = context;
1171
+ context.window = context;
1172
+ return context;
1173
+ });
1174
+ _WasmEngine_createAtomicsWrapper.set(this, (_memory) => {
1175
+ const atomicsWrapper = {
1176
+ add: Atomics.add.bind(Atomics),
1177
+ and: Atomics.and.bind(Atomics),
1178
+ compareExchange: Atomics.compareExchange.bind(Atomics),
1179
+ exchange: Atomics.exchange.bind(Atomics),
1180
+ isLockFree: Atomics.isLockFree.bind(Atomics),
1181
+ load: Atomics.load.bind(Atomics),
1182
+ or: Atomics.or.bind(Atomics),
1183
+ store: Atomics.store.bind(Atomics),
1184
+ sub: Atomics.sub.bind(Atomics),
1185
+ xor: Atomics.xor.bind(Atomics),
1186
+ notify: (typedArray, index, count) => {
1187
+ try {
1188
+ return Atomics.notify(typedArray, index, count);
1189
+ }
1190
+ catch (e) {
1191
+ if (e?.message?.includes("futex_wake") || e?.message?.includes("main_browser_thread"))
1192
+ return 0;
1193
+ throw e;
1194
+ }
1195
+ },
1196
+ waitAsync: Atomics.waitAsync
1197
+ ? Atomics.waitAsync.bind(Atomics)
1198
+ : () => ({ async: true, value: Promise.resolve("ok") }),
1199
+ wait: (typedArray, index, value, timeout) => {
1200
+ const currentValue = Atomics.load(typedArray, index);
1201
+ if (currentValue !== value)
1202
+ return "not-equal";
1203
+ if (timeout !== undefined && timeout <= 0)
1204
+ return "timed-out";
1205
+ return "timed-out";
1206
+ },
1207
+ [Symbol.toStringTag]: "Atomics",
1208
+ };
1209
+ return atomicsWrapper;
1210
+ });
1211
+ const basePath = config.resourcesPath
1212
+ ? (path.isAbsolute(config.resourcesPath) ? config.resourcesPath : path.resolve(process.cwd(), config.resourcesPath))
1213
+ : path.resolve(WASM_DIR_PATH, "..");
1214
+ const wasmPath = config.wasmPath
1215
+ ? (path.isAbsolute(config.wasmPath) ? config.wasmPath : path.resolve(process.cwd(), config.wasmPath))
1216
+ : path.join(basePath, "assets", "wasm", "whatsapp.wasm");
1217
+ __classPrivateFieldSet(this, _WasmEngine_config, {
1218
+ ...config,
1219
+ wasmPath,
1220
+ resourcesPath: basePath,
1221
+ enableLogs: config.enableLogs ?? true,
1222
+ options: {
1223
+ heartbeatInterval: 30,
1224
+ lobbyTimeout: 1,
1225
+ maxParticipantsScreenShare: 32,
1226
+ maxGroupSizeLongRingtone: 32,
1227
+ ...config.options,
1228
+ },
1229
+ }, "f");
1230
+ }
1231
+ }
1232
+ _b = WasmEngine, _WasmEngine_config = new WeakMap(), _WasmEngine_instance = new WeakMap(), _WasmEngine_initialized = new WeakMap(), _WasmEngine_moduleRegistry = new WeakMap(), _WasmEngine_vmContext = new WeakMap(), _WasmEngine_unusedWorkers = new WeakMap(), _WasmEngine_runningWorkers = new WeakMap(), _WasmEngine_pthreads = new WeakMap(), _WasmEngine_nextWorkerID = new WeakMap(), _WasmEngine_wasmModule = new WeakMap(), _WasmEngine_wasmMemory = new WeakMap(), _WasmEngine_removeRunDependencyCallback = new WeakMap(), _WasmEngine_workersLoadedCount = new WeakMap(), _WasmEngine_audioPlaybackLoopInterval = new WeakMap(), _WasmEngine_audioPlaybackBuffer = new WeakMap(), _WasmEngine_isPlaybackActive = new WeakMap(), _WasmEngine_voipStackInitialized = new WeakMap(), _WasmEngine_voipStackInitPromise = new WeakMap(), _WasmEngine_voipReadyResolver = new WeakMap(), _WasmEngine_voipReadyPromise = new WeakMap(), _WasmEngine_workerModulesCode = new WeakMap(), _WasmEngine_loaderCode = new WeakMap(), _WasmEngine_ensureInitialized = new WeakMap(), _WasmEngine_makeStringList = new WeakMap(), _WasmEngine_createUint8List = new WeakMap(), _WasmEngine_startAudioPlaybackLoop = new WeakMap(), _WasmEngine_stopAudioPlaybackLoop = new WeakMap(), _WasmEngine_applyDefaultAbProps = new WeakMap(), _WasmEngine_allocateUnusedWorker = new WeakMap(), _WasmEngine_initPThreadPool = new WeakMap(), _WasmEngine_loadWasmModuleToWorker = new WeakMap(), _WasmEngine_loadWasmModuleToAllWorkers = new WeakMap(), _WasmEngine_registerGlobalCallbacks = new WeakMap(), _WasmEngine_requireModule = new WeakMap(), _WasmEngine_createVMContext = new WeakMap(), _WasmEngine_createAtomicsWrapper = new WeakMap();
1233
+ _WasmEngine_globalCallbackListeners = { value: new Map() };
1234
+ _WasmEngine_globalCallbacksRegistered = { value: false };
1235
+ WasmEngine.registerGlobalCallbackListener = (callbackName, handler) => {
1236
+ const key = `callback:${callbackName}`;
1237
+ let set = __classPrivateFieldGet(_a, _b, "f", _WasmEngine_globalCallbackListeners).get(key);
1238
+ if (!set) {
1239
+ set = new Set();
1240
+ __classPrivateFieldGet(_a, _b, "f", _WasmEngine_globalCallbackListeners).set(key, set);
1241
+ }
1242
+ set.add(handler);
1243
+ };
1244
+ WasmEngine.notifyGlobalCallbackListeners = (callbackName, data) => {
1245
+ const set = __classPrivateFieldGet(_a, _b, "f", _WasmEngine_globalCallbackListeners).get(`callback:${callbackName}`);
1246
+ if (!set)
1247
+ return;
1248
+ for (const handler of set) {
1249
+ try {
1250
+ handler(data);
1251
+ }
1252
+ catch { }
1253
+ }
1254
+ };
1255
+ _a = WasmEngine;
1256
+ //# sourceMappingURL=wasm-engine.js.map