@queenanya/baileys 9.2.1 → 9.5.1

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 (149) hide show
  1. package/README.md +531 -445
  2. package/WAProto/fix-imports.js +70 -18
  3. package/WAProto/index.js +197 -160
  4. package/engine-requirements.js +7 -7
  5. package/lib/Defaults/index.d.ts +12 -0
  6. package/lib/Defaults/index.d.ts.map +1 -1
  7. package/lib/Defaults/index.js +17 -5
  8. package/lib/Defaults/index.js.map +1 -1
  9. package/lib/Signal/libsignal.d.ts.map +1 -1
  10. package/lib/Signal/libsignal.js +63 -2
  11. package/lib/Signal/libsignal.js.map +1 -1
  12. package/lib/Signal/lid-mapping.d.ts +5 -9
  13. package/lib/Signal/lid-mapping.d.ts.map +1 -1
  14. package/lib/Signal/lid-mapping.js +170 -70
  15. package/lib/Signal/lid-mapping.js.map +1 -1
  16. package/lib/Socket/Client/websocket.d.ts +1 -1
  17. package/lib/Socket/Client/websocket.d.ts.map +1 -1
  18. package/lib/Socket/Client/websocket.js +5 -1
  19. package/lib/Socket/Client/websocket.js.map +1 -1
  20. package/lib/Socket/business.d.ts +16 -4
  21. package/lib/Socket/business.d.ts.map +1 -1
  22. package/lib/Socket/business.js +11 -8
  23. package/lib/Socket/business.js.map +1 -1
  24. package/lib/Socket/chats.d.ts +14 -3
  25. package/lib/Socket/chats.d.ts.map +1 -1
  26. package/lib/Socket/chats.js +55 -28
  27. package/lib/Socket/chats.js.map +1 -1
  28. package/lib/Socket/communities.d.ts +16 -4
  29. package/lib/Socket/communities.d.ts.map +1 -1
  30. package/lib/Socket/groups.d.ts +14 -3
  31. package/lib/Socket/groups.d.ts.map +1 -1
  32. package/lib/Socket/groups.js +1 -1
  33. package/lib/Socket/groups.js.map +1 -1
  34. package/lib/Socket/index.d.ts +16 -4
  35. package/lib/Socket/index.d.ts.map +1 -1
  36. package/lib/Socket/index.js +0 -6
  37. package/lib/Socket/index.js.map +1 -1
  38. package/lib/Socket/messages-recv.d.ts +16 -4
  39. package/lib/Socket/messages-recv.d.ts.map +1 -1
  40. package/lib/Socket/messages-recv.js +152 -87
  41. package/lib/Socket/messages-recv.js.map +1 -1
  42. package/lib/Socket/messages-send.d.ts +15 -3
  43. package/lib/Socket/messages-send.d.ts.map +1 -1
  44. package/lib/Socket/messages-send.js +117 -48
  45. package/lib/Socket/messages-send.js.map +1 -1
  46. package/lib/Socket/newsletter.d.ts +15 -5
  47. package/lib/Socket/newsletter.d.ts.map +1 -1
  48. package/lib/Socket/newsletter.js +2 -47
  49. package/lib/Socket/newsletter.js.map +1 -1
  50. package/lib/Socket/socket.d.ts +3 -1
  51. package/lib/Socket/socket.d.ts.map +1 -1
  52. package/lib/Socket/socket.js +71 -16
  53. package/lib/Socket/socket.js.map +1 -1
  54. package/lib/Types/Auth.d.ts +1 -0
  55. package/lib/Types/Auth.d.ts.map +1 -1
  56. package/lib/Types/Call.d.ts +1 -0
  57. package/lib/Types/Call.d.ts.map +1 -1
  58. package/lib/Types/Events.d.ts +40 -5
  59. package/lib/Types/Events.d.ts.map +1 -1
  60. package/lib/Types/Message.d.ts +3 -3
  61. package/lib/Types/Message.d.ts.map +1 -1
  62. package/lib/Types/Newsletter.d.ts +0 -17
  63. package/lib/Types/Newsletter.d.ts.map +1 -1
  64. package/lib/Utils/auth-utils.d.ts.map +1 -1
  65. package/lib/Utils/auth-utils.js +53 -20
  66. package/lib/Utils/auth-utils.js.map +1 -1
  67. package/lib/Utils/chat-utils.d.ts.map +1 -1
  68. package/lib/Utils/chat-utils.js +100 -51
  69. package/lib/Utils/chat-utils.js.map +1 -1
  70. package/lib/Utils/crypto.d.ts +4 -8
  71. package/lib/Utils/crypto.d.ts.map +1 -1
  72. package/lib/Utils/crypto.js +2 -26
  73. package/lib/Utils/crypto.js.map +1 -1
  74. package/lib/Utils/event-buffer.d.ts.map +1 -1
  75. package/lib/Utils/event-buffer.js +33 -7
  76. package/lib/Utils/event-buffer.js.map +1 -1
  77. package/lib/Utils/generics.d.ts +1 -0
  78. package/lib/Utils/generics.d.ts.map +1 -1
  79. package/lib/Utils/generics.js +5 -2
  80. package/lib/Utils/generics.js.map +1 -1
  81. package/lib/Utils/history.d.ts +6 -3
  82. package/lib/Utils/history.d.ts.map +1 -1
  83. package/lib/Utils/history.js +46 -5
  84. package/lib/Utils/history.js.map +1 -1
  85. package/lib/Utils/identity-change-handler.d.ts +37 -0
  86. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  87. package/lib/Utils/identity-change-handler.js +49 -0
  88. package/lib/Utils/identity-change-handler.js.map +1 -0
  89. package/lib/Utils/index.d.ts +1 -0
  90. package/lib/Utils/index.d.ts.map +1 -1
  91. package/lib/Utils/index.js +1 -0
  92. package/lib/Utils/index.js.map +1 -1
  93. package/lib/Utils/lt-hash.d.ts +7 -12
  94. package/lib/Utils/lt-hash.d.ts.map +1 -1
  95. package/lib/Utils/lt-hash.js +2 -42
  96. package/lib/Utils/lt-hash.js.map +1 -1
  97. package/lib/Utils/make-mutex.d.ts +1 -0
  98. package/lib/Utils/make-mutex.d.ts.map +1 -1
  99. package/lib/Utils/make-mutex.js +20 -27
  100. package/lib/Utils/make-mutex.js.map +1 -1
  101. package/lib/Utils/message-retry-manager.d.ts +30 -2
  102. package/lib/Utils/message-retry-manager.d.ts.map +1 -1
  103. package/lib/Utils/message-retry-manager.js +58 -5
  104. package/lib/Utils/message-retry-manager.js.map +1 -1
  105. package/lib/Utils/messages-media.d.ts +18 -2
  106. package/lib/Utils/messages-media.d.ts.map +1 -1
  107. package/lib/Utils/messages-media.js +150 -39
  108. package/lib/Utils/messages-media.js.map +1 -1
  109. package/lib/Utils/messages.d.ts +2 -0
  110. package/lib/Utils/messages.d.ts.map +1 -1
  111. package/lib/Utils/messages.js +41 -23
  112. package/lib/Utils/messages.js.map +1 -1
  113. package/lib/Utils/noise-handler.d.ts +4 -4
  114. package/lib/Utils/noise-handler.d.ts.map +1 -1
  115. package/lib/Utils/noise-handler.js +139 -85
  116. package/lib/Utils/noise-handler.js.map +1 -1
  117. package/lib/Utils/process-message.d.ts.map +1 -1
  118. package/lib/Utils/process-message.js +57 -14
  119. package/lib/Utils/process-message.js.map +1 -1
  120. package/lib/Utils/reporting-utils.d.ts +11 -0
  121. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  122. package/lib/Utils/reporting-utils.js +258 -0
  123. package/lib/Utils/reporting-utils.js.map +1 -0
  124. package/lib/Utils/sync-action-utils.d.ts +19 -0
  125. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  126. package/lib/Utils/sync-action-utils.js +48 -0
  127. package/lib/Utils/sync-action-utils.js.map +1 -0
  128. package/lib/Utils/tc-token-utils.d.ts +12 -0
  129. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  130. package/lib/Utils/tc-token-utils.js +18 -0
  131. package/lib/Utils/tc-token-utils.js.map +1 -0
  132. package/lib/Utils/use-multi-file-auth-state.js +1 -1
  133. package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
  134. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -1
  135. package/lib/Utils/use-single-file-auth-state.js.map +1 -1
  136. package/lib/WABinary/decode.d.ts.map +1 -1
  137. package/lib/WABinary/decode.js +24 -0
  138. package/lib/WABinary/decode.js.map +1 -1
  139. package/lib/WABinary/encode.js +5 -1
  140. package/lib/WABinary/encode.js.map +1 -1
  141. package/lib/WABinary/generic-utils.d.ts +1 -1
  142. package/lib/WABinary/generic-utils.d.ts.map +1 -1
  143. package/lib/WABinary/generic-utils.js +19 -8
  144. package/lib/WABinary/generic-utils.js.map +1 -1
  145. package/lib/WABinary/jid-utils.d.ts +0 -3
  146. package/lib/WABinary/jid-utils.d.ts.map +1 -1
  147. package/lib/WABinary/jid-utils.js +0 -4
  148. package/lib/WABinary/jid-utils.js.map +1 -1
  149. package/package.json +4 -2
@@ -1,39 +1,32 @@
1
+ import { Mutex as AsyncMutex } from 'async-mutex';
1
2
  export const makeMutex = () => {
2
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
- let task = Promise.resolve();
4
- let taskTimeout;
3
+ const mutex = new AsyncMutex();
5
4
  return {
6
5
  mutex(code) {
7
- task = (async () => {
8
- // wait for the previous task to complete
9
- // if there is an error, we swallow so as to not block the queue
10
- try {
11
- await task;
12
- }
13
- catch { }
14
- try {
15
- // execute the current task
16
- const result = await code();
17
- return result;
18
- }
19
- finally {
20
- clearTimeout(taskTimeout);
21
- }
22
- })();
23
- // we replace the existing task, appending the new piece of execution to it
24
- // so the next task will have to wait for this one to finish
25
- return task;
6
+ return mutex.runExclusive(code);
26
7
  }
27
8
  };
28
9
  };
29
10
  export const makeKeyedMutex = () => {
30
- const map = {};
11
+ const map = new Map();
31
12
  return {
32
- mutex(key, task) {
33
- if (!map[key]) {
34
- map[key] = makeMutex();
13
+ async mutex(key, task) {
14
+ let entry = map.get(key);
15
+ if (!entry) {
16
+ entry = { mutex: new AsyncMutex(), refCount: 0 };
17
+ map.set(key, entry);
18
+ }
19
+ entry.refCount++;
20
+ try {
21
+ return await entry.mutex.runExclusive(task);
22
+ }
23
+ finally {
24
+ entry.refCount--;
25
+ // only delete it if this is still the current entry
26
+ if (entry.refCount === 0 && map.get(key) === entry) {
27
+ map.delete(key);
28
+ }
35
29
  }
36
- return map[key].mutex(task);
37
30
  }
38
31
  };
39
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"make-mutex.js","sourceRoot":"","sources":["../../src/Utils/make-mutex.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC7B,8DAA8D;IAC9D,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,EAAkB,CAAA;IAE5C,IAAI,WAAuC,CAAA;IAE3C,OAAO;QACN,KAAK,CAAI,IAA0B;YAClC,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBAClB,yCAAyC;gBACzC,gEAAgE;gBAChE,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAA;gBACX,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBAEV,IAAI,CAAC;oBACJ,2BAA2B;oBAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAA;oBAC3B,OAAO,MAAM,CAAA;gBACd,CAAC;wBAAS,CAAC;oBACV,YAAY,CAAC,WAAW,CAAC,CAAA;gBAC1B,CAAC;YACF,CAAC,CAAC,EAAE,CAAA;YACJ,2EAA2E;YAC3E,4DAA4D;YAC5D,OAAO,IAAI,CAAA;QACZ,CAAC;KACD,CAAA;AACF,CAAC,CAAA;AAID,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAClC,MAAM,GAAG,GAA4B,EAAE,CAAA;IAEvC,OAAO;QACN,KAAK,CAAI,GAAW,EAAE,IAA0B;YAC/C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;YACvB,CAAC;YAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;KACD,CAAA;AACF,CAAC,CAAA"}
1
+ {"version":3,"file":"make-mutex.js","sourceRoot":"","sources":["../../src/Utils/make-mutex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAA;IAE9B,OAAO;QACN,KAAK,CAAI,IAA0B;YAClC,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;KACD,CAAA;AACF,CAAC,CAAA;AAID,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAClC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmD,CAAA;IAEtE,OAAO;QACN,KAAK,CAAC,KAAK,CAAI,GAAW,EAAE,IAA0B;YACrD,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAExB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;gBAChD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACpB,CAAC;YAED,KAAK,CAAC,QAAQ,EAAE,CAAA;YAEhB,IAAI,CAAC;gBACJ,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC5C,CAAC;oBAAS,CAAC;gBACV,KAAK,CAAC,QAAQ,EAAE,CAAA;gBAChB,oDAAoD;gBACpD,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;oBACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC,CAAA"}
@@ -23,6 +23,24 @@ export interface RetryStatistics {
23
23
  sessionRecreations: number;
24
24
  phoneRequests: number;
25
25
  }
26
+ export declare enum RetryReason {
27
+ UnknownError = 0,
28
+ SignalErrorNoSession = 1,
29
+ SignalErrorInvalidKey = 2,
30
+ SignalErrorInvalidKeyId = 3,
31
+ /** MAC verification failed - most common cause of decryption failures */
32
+ SignalErrorInvalidMessage = 4,
33
+ SignalErrorInvalidSignature = 5,
34
+ SignalErrorFutureMessage = 6,
35
+ /** Explicit MAC failure - session is definitely out of sync */
36
+ SignalErrorBadMac = 7,
37
+ SignalErrorInvalidSession = 8,
38
+ SignalErrorInvalidMsgKey = 9,
39
+ BadBroadcastEphemeralSetting = 10,
40
+ UnknownCompanionNoPrekey = 11,
41
+ AdvFailure = 12,
42
+ StatusRevokeDelay = 13
43
+ }
26
44
  export declare class MessageRetryManager {
27
45
  private logger;
28
46
  private recentMessagesMap;
@@ -42,12 +60,22 @@ export declare class MessageRetryManager {
42
60
  */
43
61
  getRecentMessage(to: string, id: string): RecentMessage | undefined;
44
62
  /**
45
- * Check if a session should be recreated based on retry count and history
63
+ * Check if a session should be recreated based on retry count, history, and error code.
64
+ * MAC errors (codes 4 and 7) trigger immediate session recreation regardless of timeout.
46
65
  */
47
- shouldRecreateSession(jid: string, retryCount: number, hasSession: boolean): {
66
+ shouldRecreateSession(jid: string, hasSession: boolean, errorCode?: RetryReason): {
48
67
  reason: string;
49
68
  recreate: boolean;
50
69
  };
70
+ /**
71
+ * Parse error code from retry receipt's retry node.
72
+ * Returns undefined if no error code is present.
73
+ */
74
+ parseRetryErrorCode(errorAttr: string | undefined): RetryReason | undefined;
75
+ /**
76
+ * Check if an error code indicates a MAC failure
77
+ */
78
+ isMacError(errorCode: RetryReason | undefined): boolean;
51
79
  /**
52
80
  * Increment retry counter for a message
53
81
  */
@@ -1 +1 @@
1
- {"version":3,"file":"message-retry-manager.d.ts","sourceRoot":"","sources":["../../src/Utils/message-retry-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAUvC,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,sBAAsB;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAA;AAE/E,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,mBAAmB;IAmC9B,OAAO,CAAC,MAAM;IAlCf,OAAO,CAAC,iBAAiB,CAWvB;IACF,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,sBAAsB,CAG5B;IACF,OAAO,CAAC,aAAa,CAInB;IACF,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAY;IAC7C,OAAO,CAAC,UAAU,CAOjB;gBAGQ,MAAM,EAAE,OAAO,EACvB,gBAAgB,EAAE,MAAM;IAKzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI;IAcvE;;OAEG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAMnE;;OAEG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE;IAgClH;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAM9C;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIxC;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIjD;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQzC;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOxC;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,GAAE,MAA4B,GAAG,IAAI;IAaxG;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASlD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,mBAAmB;CAS3B"}
1
+ {"version":3,"file":"message-retry-manager.d.ts","sourceRoot":"","sources":["../../src/Utils/message-retry-manager.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,28 @@ const MESSAGE_KEY_SEPARATOR = '\u0000';
5
5
  /** Timeout for session recreation - 1 hour */
6
6
  const RECREATE_SESSION_TIMEOUT = 60 * 60 * 1000; // 1 hour in milliseconds
7
7
  const PHONE_REQUEST_DELAY = 3000;
8
+ // Retry reason codes matching WhatsApp Web's Signal error codes.
9
+ export var RetryReason;
10
+ (function (RetryReason) {
11
+ RetryReason[RetryReason["UnknownError"] = 0] = "UnknownError";
12
+ RetryReason[RetryReason["SignalErrorNoSession"] = 1] = "SignalErrorNoSession";
13
+ RetryReason[RetryReason["SignalErrorInvalidKey"] = 2] = "SignalErrorInvalidKey";
14
+ RetryReason[RetryReason["SignalErrorInvalidKeyId"] = 3] = "SignalErrorInvalidKeyId";
15
+ /** MAC verification failed - most common cause of decryption failures */
16
+ RetryReason[RetryReason["SignalErrorInvalidMessage"] = 4] = "SignalErrorInvalidMessage";
17
+ RetryReason[RetryReason["SignalErrorInvalidSignature"] = 5] = "SignalErrorInvalidSignature";
18
+ RetryReason[RetryReason["SignalErrorFutureMessage"] = 6] = "SignalErrorFutureMessage";
19
+ /** Explicit MAC failure - session is definitely out of sync */
20
+ RetryReason[RetryReason["SignalErrorBadMac"] = 7] = "SignalErrorBadMac";
21
+ RetryReason[RetryReason["SignalErrorInvalidSession"] = 8] = "SignalErrorInvalidSession";
22
+ RetryReason[RetryReason["SignalErrorInvalidMsgKey"] = 9] = "SignalErrorInvalidMsgKey";
23
+ RetryReason[RetryReason["BadBroadcastEphemeralSetting"] = 10] = "BadBroadcastEphemeralSetting";
24
+ RetryReason[RetryReason["UnknownCompanionNoPrekey"] = 11] = "UnknownCompanionNoPrekey";
25
+ RetryReason[RetryReason["AdvFailure"] = 12] = "AdvFailure";
26
+ RetryReason[RetryReason["StatusRevokeDelay"] = 13] = "StatusRevokeDelay";
27
+ })(RetryReason || (RetryReason = {}));
28
+ /** Error codes that indicate a MAC failure and require immediate session recreation */
29
+ const MAC_ERROR_CODES = new Set([RetryReason.SignalErrorInvalidMessage, RetryReason.SignalErrorBadMac]);
8
30
  export class MessageRetryManager {
9
31
  constructor(logger, maxMsgRetryCount) {
10
32
  this.logger = logger;
@@ -65,9 +87,10 @@ export class MessageRetryManager {
65
87
  return this.recentMessagesMap.get(keyStr);
66
88
  }
67
89
  /**
68
- * Check if a session should be recreated based on retry count and history
90
+ * Check if a session should be recreated based on retry count, history, and error code.
91
+ * MAC errors (codes 4 and 7) trigger immediate session recreation regardless of timeout.
69
92
  */
70
- shouldRecreateSession(jid, retryCount, hasSession) {
93
+ shouldRecreateSession(jid, hasSession, errorCode) {
71
94
  // If we don't have a session, always recreate
72
95
  if (!hasSession) {
73
96
  this.sessionRecreateHistory.set(jid, Date.now());
@@ -77,9 +100,15 @@ export class MessageRetryManager {
77
100
  recreate: true
78
101
  };
79
102
  }
80
- // Only consider recreation if retry count > 1
81
- if (retryCount < 2) {
82
- return { reason: '', recreate: false };
103
+ // IMMEDIATE recreation for MAC errors - session is definitely out of sync
104
+ if (errorCode !== undefined && MAC_ERROR_CODES.has(errorCode)) {
105
+ this.sessionRecreateHistory.set(jid, Date.now());
106
+ this.statistics.sessionRecreations++;
107
+ this.logger.warn({ jid, errorCode: RetryReason[errorCode] }, 'MAC error detected, forcing immediate session recreation');
108
+ return {
109
+ reason: `MAC error (code ${errorCode}: ${RetryReason[errorCode]}), immediate session recreation`,
110
+ recreate: true
111
+ };
83
112
  }
84
113
  const now = Date.now();
85
114
  const prevTime = this.sessionRecreateHistory.get(jid);
@@ -94,6 +123,30 @@ export class MessageRetryManager {
94
123
  }
95
124
  return { reason: '', recreate: false };
96
125
  }
126
+ /**
127
+ * Parse error code from retry receipt's retry node.
128
+ * Returns undefined if no error code is present.
129
+ */
130
+ parseRetryErrorCode(errorAttr) {
131
+ if (errorAttr === undefined || errorAttr === '') {
132
+ return undefined;
133
+ }
134
+ const code = parseInt(errorAttr, 10);
135
+ if (Number.isNaN(code)) {
136
+ return undefined;
137
+ }
138
+ // Validate it's a known RetryReason
139
+ if (code >= RetryReason.UnknownError && code <= RetryReason.StatusRevokeDelay) {
140
+ return code;
141
+ }
142
+ return RetryReason.UnknownError;
143
+ }
144
+ /**
145
+ * Check if an error code indicates a MAC failure
146
+ */
147
+ isMacError(errorCode) {
148
+ return errorCode !== undefined && MAC_ERROR_CODES.has(errorCode);
149
+ }
97
150
  /**
98
151
  * Increment retry counter for a message
99
152
  */
@@ -1 +1 @@
1
- {"version":3,"file":"message-retry-manager.js","sourceRoot":"","sources":["../../src/Utils/message-retry-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-retry-manager.js","sourceRoot":"","sources":["../../src/Utils/message-retry-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,6EAA6E;AAC7E,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAEhC,MAAM,qBAAqB,GAAG,QAAQ,CAAA;AAEtC,8CAA8C;AAC9C,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,yBAAyB;AACzE,MAAM,mBAAmB,GAAG,IAAI,CAAA;AA8BhC,iEAAiE;AACjE,MAAM,CAAN,IAAY,WAiBX;AAjBD,WAAY,WAAW;IACtB,6DAAgB,CAAA;IAChB,6EAAwB,CAAA;IACxB,+EAAyB,CAAA;IACzB,mFAA2B,CAAA;IAC3B,yEAAyE;IACzE,uFAA6B,CAAA;IAC7B,2FAA+B,CAAA;IAC/B,qFAA4B,CAAA;IAC5B,+DAA+D;IAC/D,uEAAqB,CAAA;IACrB,uFAA6B,CAAA;IAC7B,qFAA4B,CAAA;IAC5B,8FAAiC,CAAA;IACjC,sFAA6B,CAAA;IAC7B,0DAAe,CAAA;IACf,wEAAsB,CAAA;AACvB,CAAC,EAjBW,WAAW,KAAX,WAAW,QAiBtB;AAED,uFAAuF;AACvF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,yBAAyB,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAEvG,MAAM,OAAO,mBAAmB;IAkC/B,YACS,MAAe,EACvB,gBAAwB;QADhB,WAAM,GAAN,MAAM,CAAS;QAlChB,sBAAiB,GAAG,IAAI,QAAQ,CAAwB;YAC/D,GAAG,EAAE,oBAAoB;YACzB,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;YAClB,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,CAAC,MAAqB,EAAE,GAAW,EAAE,EAAE;gBAC/C,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAA;gBAC7D,IAAI,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC;oBACzB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;oBAC1E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gBACvC,CAAC;YACF,CAAC;SACD,CAAC,CAAA;QACM,oBAAe,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC3C,2BAAsB,GAAG,IAAI,QAAQ,CAAiB;YAC7D,GAAG,EAAE,wBAAwB,GAAG,CAAC;YACjC,YAAY,EAAE,IAAI;SAClB,CAAC,CAAA;QACM,kBAAa,GAAG,IAAI,QAAQ,CAAiB;YACpD,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YACnB,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;SACpB,CAAC,CAAA,CAAC,iBAAiB;QACZ,yBAAoB,GAAwB,EAAE,CAAA;QACrC,qBAAgB,GAAW,CAAC,CAAA;QACrC,eAAU,GAAoB;YACrC,YAAY,EAAE,CAAC;YACf,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,kBAAkB,EAAE,CAAC;YACrB,aAAa,EAAE,CAAC;SAChB,CAAA;QAMA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;IACzC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,EAAU,EAAE,EAAU,EAAE,OAAuB;QAC/D,MAAM,GAAG,GAAqB,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAEpC,kBAAkB;QAClB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE;YAClC,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC,CAAA;QACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAEpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,EAAU,EAAE,EAAU;QACtC,MAAM,GAAG,GAAqB,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED;;;OAGG;IACH,qBAAqB,CACpB,GAAW,EACX,UAAmB,EACnB,SAAuB;QAEvB,8CAA8C;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YAChD,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAA;YACpC,OAAO;gBACN,MAAM,EAAE,0CAA0C;gBAClD,QAAQ,EAAE,IAAI;aACd,CAAA;QACF,CAAC;QAED,0EAA0E;QAC1E,IAAI,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YAChD,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAA;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CACf,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,EAC1C,0DAA0D,CAC1D,CAAA;YACD,OAAO;gBACN,MAAM,EAAE,mBAAmB,SAAS,KAAK,WAAW,CAAC,SAAS,CAAC,iCAAiC;gBAChG,QAAQ,EAAE,IAAI;aACd,CAAA;QACF,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAErD,2DAA2D;QAC3D,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,QAAQ,GAAG,wBAAwB,EAAE,CAAC;YAC5D,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YACzC,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAA;YACpC,OAAO;gBACN,MAAM,EAAE,wDAAwD;gBAChE,QAAQ,EAAE,IAAI;aACd,CAAA;QACF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IACvC,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,SAA6B;QAChD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACjD,OAAO,SAAS,CAAA;QACjB,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QACpC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAA;QACjB,CAAC;QAED,oCAAoC;QACpC,IAAI,IAAI,IAAI,WAAW,CAAC,YAAY,IAAI,IAAI,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;YAC/E,OAAO,IAAmB,CAAA;QAC3B,CAAC;QAED,OAAO,WAAW,CAAC,YAAY,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAkC;QAC5C,OAAO,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACjE,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,SAAiB;QACpC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/E,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAA;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,SAAiB;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAA;IAC9D,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,SAAiB;QACjC,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAA;QACnC,gDAAgD;QAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACpC,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAiB;QAChC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAA;QAC/B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACpC,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,SAAiB,EAAE,QAAoB,EAAE,QAAgB,mBAAmB;QAChG,+CAA+C;QAC/C,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QAEzC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACtD,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;YAC3C,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAA;YAC/B,QAAQ,EAAE,CAAA;QACX,CAAC,EAAE,KAAK,CAAC,CAAA;QAET,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,SAAS,SAAS,KAAK,UAAU,CAAC,CAAA;IAC5F,CAAC;IAED;;OAEG;IACH,yBAAyB,CAAC,SAAiB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QACpD,IAAI,OAAO,EAAE,CAAC;YACb,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;YAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,SAAS,EAAE,CAAC,CAAA;QAC9E,CAAC;IACF,CAAC;IAEO,WAAW,CAAC,GAAqB;QACxC,OAAO,GAAG,GAAG,CAAC,EAAE,GAAG,qBAAqB,GAAG,GAAG,CAAC,EAAE,EAAE,CAAA;IACpD,CAAC;IAEO,mBAAmB,CAAC,SAAiB;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAM;QACP,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC;CACD"}
@@ -1,4 +1,5 @@
1
1
  import { Boom } from '@hapi/boom';
2
+ import type { Agent } from 'https';
2
3
  import { Readable, Transform } from 'stream';
3
4
  import { URL } from 'url';
4
5
  import { proto } from '../../WAProto/index.js';
@@ -92,11 +93,26 @@ export declare const downloadContentFromMessage: ({ mediaKey, directPath, url }:
92
93
  * */
93
94
  export declare const downloadEncryptedContent: (downloadUrl: string, { cipherKey, iv }: MediaDecryptionKeyInfo, { startByte, endByte, options }?: MediaDownloadOptions) => Promise<Transform>;
94
95
  export declare function extensionForMediaMessage(message: WAMessageContent): string;
96
+ type MediaUploadResult = {
97
+ url?: string;
98
+ direct_path?: string;
99
+ meta_hmac?: string;
100
+ ts?: number;
101
+ fbid?: number;
102
+ };
103
+ export type UploadParams = {
104
+ url: string;
105
+ filePath: string;
106
+ headers: Record<string, string>;
107
+ timeoutMs?: number;
108
+ agent?: Agent;
109
+ };
110
+ export declare const uploadWithNodeHttp: ({ url, filePath, headers, timeoutMs, agent }: UploadParams, redirectCount?: number) => Promise<MediaUploadResult | undefined>;
95
111
  export declare const getWAUploadToServer: ({ customUploadHosts, fetchAgent, logger, options }: SocketConfig, refreshMediaConn: (force: boolean) => Promise<MediaConnInfo>) => WAMediaUploadFunction;
96
112
  /**
97
113
  * Generate a binary node that will request the phone to re-upload the media & return the newly uploaded URL
98
114
  */
99
- export declare const encryptMediaRetryRequest: (key: WAMessageKey, mediaKey: Buffer | Uint8Array, meId: string) => Promise<BinaryNode>;
115
+ export declare const encryptMediaRetryRequest: (key: WAMessageKey, mediaKey: Buffer | Uint8Array, meId: string) => BinaryNode;
100
116
  export declare const decodeMediaRetryNode: (node: BinaryNode) => {
101
117
  key: WAMessageKey;
102
118
  media?: {
@@ -108,7 +124,7 @@ export declare const decodeMediaRetryNode: (node: BinaryNode) => {
108
124
  export declare const decryptMediaRetryData: ({ ciphertext, iv }: {
109
125
  ciphertext: Uint8Array;
110
126
  iv: Uint8Array;
111
- }, mediaKey: Uint8Array, msgId: string) => Promise<proto.MediaRetryNotification>;
127
+ }, mediaKey: Uint8Array, msgId: string) => proto.MediaRetryNotification;
112
128
  export declare const getStatusCodeForMediaRetry: (code: number) => 200 | 412 | 404 | 418;
113
129
  export {};
114
130
  //# sourceMappingURL=messages-media.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages-media.d.ts","sourceRoot":"","sources":["../../src/Utils/messages-media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages-media.d.ts","sourceRoot":"","sources":["../../src/Utils/messages-media.ts"],"names":[],"mappings":"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"}
@@ -75,7 +75,7 @@ export async function getMediaKeys(buffer, mediaType) {
75
75
  buffer = Buffer.from(buffer.replace('data:;base64,', ''), 'base64');
76
76
  }
77
77
  // expand using HKDF to 112 bytes, also pass in the relevant app info
78
- const expandedMediaKey = await hkdf(buffer, 112, { info: hkdfInfoKey(mediaType) });
78
+ const expandedMediaKey = hkdf(buffer, 112, { info: hkdfInfoKey(mediaType) });
79
79
  return {
80
80
  iv: expandedMediaKey.slice(0, 16),
81
81
  cipherKey: expandedMediaKey.slice(16, 48),
@@ -324,10 +324,13 @@ export const encryptedStream = async (media, mediaType, { logger, saveOriginalFi
324
324
  const hmac = Crypto.createHmac('sha256', macKey).update(iv);
325
325
  const sha256Plain = Crypto.createHash('sha256');
326
326
  const sha256Enc = Crypto.createHash('sha256');
327
- const onChunk = (buff) => {
327
+ const onChunk = async (buff) => {
328
328
  sha256Enc.update(buff);
329
329
  hmac.update(buff);
330
- encFileWriteStream.write(buff);
330
+ // Handle backpressure: if write returns false, wait for drain
331
+ if (!encFileWriteStream.write(buff)) {
332
+ await once(encFileWriteStream, 'drain');
333
+ }
331
334
  };
332
335
  try {
333
336
  for await (const data of stream) {
@@ -345,17 +348,23 @@ export const encryptedStream = async (media, mediaType, { logger, saveOriginalFi
345
348
  }
346
349
  }
347
350
  sha256Plain.update(data);
348
- onChunk(aes.update(data));
351
+ await onChunk(aes.update(data));
349
352
  }
350
- onChunk(aes.final());
353
+ await onChunk(aes.final());
351
354
  const mac = hmac.digest().slice(0, 10);
352
355
  sha256Enc.update(mac);
353
356
  const fileSha256 = sha256Plain.digest();
354
357
  const fileEncSha256 = sha256Enc.digest();
355
358
  encFileWriteStream.write(mac);
359
+ const encFinishPromise = once(encFileWriteStream, 'finish');
360
+ const originalFinishPromise = originalFileStream ? once(originalFileStream, 'finish') : Promise.resolve();
356
361
  encFileWriteStream.end();
357
362
  originalFileStream?.end?.();
358
363
  stream.destroy();
364
+ // Wait for write streams to fully flush to disk
365
+ // This helps reduce memory pressure by allowing OS to release buffers
366
+ await encFinishPromise;
367
+ await originalFinishPromise;
359
368
  logger?.debug('encrypted data successfully');
360
369
  return {
361
370
  mediaKey,
@@ -506,6 +515,117 @@ export function extensionForMediaMessage(message) {
506
515
  }
507
516
  return extension;
508
517
  }
518
+ const isNodeRuntime = () => {
519
+ return (typeof process !== 'undefined' &&
520
+ process.versions?.node !== null &&
521
+ typeof process.versions.bun === 'undefined' &&
522
+ typeof globalThis.Deno === 'undefined');
523
+ };
524
+ export const uploadWithNodeHttp = async ({ url, filePath, headers, timeoutMs, agent }, redirectCount = 0) => {
525
+ if (redirectCount > 5) {
526
+ throw new Error('Too many redirects');
527
+ }
528
+ const parsedUrl = new URL(url);
529
+ const httpModule = parsedUrl.protocol === 'https:' ? await import('https') : await import('http');
530
+ // Get file size for Content-Length header (required for Node.js streaming)
531
+ const fileStats = await fs.stat(filePath);
532
+ const fileSize = fileStats.size;
533
+ return new Promise((resolve, reject) => {
534
+ const req = httpModule.request({
535
+ hostname: parsedUrl.hostname,
536
+ port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
537
+ path: parsedUrl.pathname + parsedUrl.search,
538
+ method: 'POST',
539
+ headers: {
540
+ ...headers,
541
+ 'Content-Length': fileSize
542
+ },
543
+ agent,
544
+ timeout: timeoutMs
545
+ }, res => {
546
+ // Handle redirects (3xx)
547
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
548
+ res.resume(); // Consume response to free resources
549
+ const newUrl = new URL(res.headers.location, url).toString();
550
+ resolve(uploadWithNodeHttp({
551
+ url: newUrl,
552
+ filePath,
553
+ headers,
554
+ timeoutMs,
555
+ agent
556
+ }, redirectCount + 1));
557
+ return;
558
+ }
559
+ let body = '';
560
+ res.on('data', chunk => (body += chunk));
561
+ res.on('end', () => {
562
+ try {
563
+ resolve(JSON.parse(body));
564
+ }
565
+ catch {
566
+ resolve(undefined);
567
+ }
568
+ });
569
+ });
570
+ req.on('error', reject);
571
+ req.on('timeout', () => {
572
+ req.destroy();
573
+ reject(new Error('Upload timeout'));
574
+ });
575
+ const stream = createReadStream(filePath);
576
+ stream.pipe(req);
577
+ stream.on('error', err => {
578
+ req.destroy();
579
+ reject(err);
580
+ });
581
+ });
582
+ };
583
+ const uploadWithFetch = async ({ url, filePath, headers, timeoutMs, agent }) => {
584
+ // Convert Node.js Readable to Web ReadableStream
585
+ const nodeStream = createReadStream(filePath);
586
+ const webStream = Readable.toWeb(nodeStream);
587
+ const response = await fetch(url, {
588
+ dispatcher: agent,
589
+ method: 'POST',
590
+ body: webStream,
591
+ headers,
592
+ duplex: 'half',
593
+ signal: timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined
594
+ });
595
+ try {
596
+ return (await response.json());
597
+ }
598
+ catch {
599
+ return undefined;
600
+ }
601
+ };
602
+ /**
603
+ * Uploads media to WhatsApp servers.
604
+ *
605
+ * ## Why we have two upload implementations:
606
+ *
607
+ * Node.js's native `fetch` (powered by undici) has a known bug where it buffers
608
+ * the entire request body in memory before sending, even when using streams.
609
+ * This causes memory issues with large files (e.g., 1GB file = 1GB+ memory usage).
610
+ * See: https://github.com/nodejs/undici/issues/4058
611
+ *
612
+ * Other runtimes (Bun, Deno, browsers) correctly stream the request body without
613
+ * buffering, so we can use the web-standard Fetch API there.
614
+ *
615
+ * ## Future considerations:
616
+ * Once the undici bug is fixed, we can simplify this to use only the Fetch API
617
+ * across all runtimes. Monitor the GitHub issue for updates.
618
+ */
619
+ const uploadMedia = async (params, logger) => {
620
+ if (isNodeRuntime()) {
621
+ logger?.debug('Using Node.js https module for upload (avoids undici buffering bug)');
622
+ return uploadWithNodeHttp(params);
623
+ }
624
+ else {
625
+ logger?.debug('Using web-standard Fetch API for upload');
626
+ return uploadWithFetch(params);
627
+ }
628
+ };
509
629
  export const getWAUploadToServer = ({ customUploadHosts, fetchAgent, logger, options }, refreshMediaConn) => {
510
630
  return async (filePath, { mediaType, fileEncSha256B64, timeoutMs }) => {
511
631
  // send a query JSON to obtain the url & auth token to upload our media
@@ -513,41 +633,32 @@ export const getWAUploadToServer = ({ customUploadHosts, fetchAgent, logger, opt
513
633
  let urls;
514
634
  const hosts = [...customUploadHosts, ...uploadInfo.hosts];
515
635
  fileEncSha256B64 = encodeBase64EncodedStringForUpload(fileEncSha256B64);
636
+ // Prepare common headers
637
+ const customHeaders = (() => {
638
+ const hdrs = options?.headers;
639
+ if (!hdrs)
640
+ return {};
641
+ return Array.isArray(hdrs) ? Object.fromEntries(hdrs) : hdrs;
642
+ })();
643
+ const headers = {
644
+ ...customHeaders,
645
+ 'Content-Type': 'application/octet-stream',
646
+ Origin: DEFAULT_ORIGIN
647
+ };
516
648
  for (const { hostname } of hosts) {
517
649
  logger.debug(`uploading to "${hostname}"`);
518
- const auth = encodeURIComponent(uploadInfo.auth); // the auth token
650
+ const auth = encodeURIComponent(uploadInfo.auth);
519
651
  const url = `https://${hostname}${MEDIA_PATH_MAP[mediaType]}/${fileEncSha256B64}?auth=${auth}&token=${fileEncSha256B64}`;
520
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
521
652
  let result;
522
653
  try {
523
- const stream = createReadStream(filePath);
524
- const response = await fetch(url, {
525
- dispatcher: fetchAgent,
526
- method: 'POST',
527
- body: stream,
528
- headers: {
529
- ...(() => {
530
- const hdrs = options?.headers;
531
- if (!hdrs)
532
- return {};
533
- return Array.isArray(hdrs) ? Object.fromEntries(hdrs) : hdrs;
534
- })(),
535
- 'Content-Type': 'application/octet-stream',
536
- Origin: DEFAULT_ORIGIN
537
- },
538
- duplex: 'half',
539
- // Note: custom agents/proxy require undici Agent; omitted here.
540
- signal: timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined
541
- });
542
- let parsed = undefined;
543
- try {
544
- parsed = await response.json();
545
- }
546
- catch {
547
- parsed = undefined;
548
- }
549
- result = parsed;
550
- if (result?.url || result?.directPath) {
654
+ result = await uploadMedia({
655
+ url,
656
+ filePath,
657
+ headers,
658
+ timeoutMs,
659
+ agent: fetchAgent
660
+ }, logger);
661
+ if (result?.url || result?.direct_path) {
551
662
  urls = {
552
663
  mediaUrl: result.url,
553
664
  directPath: result.direct_path,
@@ -579,11 +690,11 @@ const getMediaRetryKey = (mediaKey) => {
579
690
  /**
580
691
  * Generate a binary node that will request the phone to re-upload the media & return the newly uploaded URL
581
692
  */
582
- export const encryptMediaRetryRequest = async (key, mediaKey, meId) => {
693
+ export const encryptMediaRetryRequest = (key, mediaKey, meId) => {
583
694
  const recp = { stanzaId: key.id };
584
695
  const recpBuffer = proto.ServerErrorReceipt.encode(recp).finish();
585
696
  const iv = Crypto.randomBytes(12);
586
- const retryKey = await getMediaRetryKey(mediaKey);
697
+ const retryKey = getMediaRetryKey(mediaKey);
587
698
  const ciphertext = aesEncryptGCM(recpBuffer, retryKey, iv, Buffer.from(key.id));
588
699
  const req = {
589
700
  tag: 'receipt',
@@ -648,8 +759,8 @@ export const decodeMediaRetryNode = (node) => {
648
759
  }
649
760
  return event;
650
761
  };
651
- export const decryptMediaRetryData = async ({ ciphertext, iv }, mediaKey, msgId) => {
652
- const retryKey = await getMediaRetryKey(mediaKey);
762
+ export const decryptMediaRetryData = ({ ciphertext, iv }, mediaKey, msgId) => {
763
+ const retryKey = getMediaRetryKey(mediaKey);
653
764
  const plaintext = aesDecryptGCM(ciphertext, retryKey, iv, Buffer.from(msgId));
654
765
  return proto.MediaRetryNotification.decode(plaintext);
655
766
  };