slidge-whatsapp 0.2.5__cp312-cp312-manylinux_2_36_aarch64.whl → 0.2.7__cp312-cp312-manylinux_2_36_aarch64.whl

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.

Potentially problematic release.


This version of slidge-whatsapp might be problematic. Click here for more details.

Files changed (357) hide show
  1. slidge_whatsapp/config.py +3 -0
  2. slidge_whatsapp/event.go +31 -26
  3. slidge_whatsapp/gateway.go +13 -9
  4. slidge_whatsapp/gateway.py +2 -2
  5. slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.h +183 -183
  6. slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.so +0 -0
  7. slidge_whatsapp/generated/build.py +148 -148
  8. slidge_whatsapp/generated/whatsapp.c +1490 -1490
  9. slidge_whatsapp/generated/whatsapp.go +1217 -1217
  10. slidge_whatsapp/generated/whatsapp.py +1210 -1210
  11. slidge_whatsapp/generated/whatsapp_go.h +183 -183
  12. slidge_whatsapp/go.mod +15 -12
  13. slidge_whatsapp/go.sum +35 -29
  14. slidge_whatsapp/media/media.go +21 -11
  15. slidge_whatsapp/session.go +73 -66
  16. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
  17. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
  18. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
  19. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
  20. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
  21. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
  22. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
  23. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
  24. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
  25. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
  26. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
  27. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
  28. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
  29. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
  30. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
  31. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
  32. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
  33. slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
  34. slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
  35. slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
  36. slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
  37. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
  38. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
  39. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
  40. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
  41. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
  42. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
  43. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
  44. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
  45. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
  46. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
  47. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
  48. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
  49. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
  50. slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
  51. slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
  52. slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
  53. slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
  54. slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
  55. slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
  56. slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
  57. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
  58. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
  59. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
  60. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
  61. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
  62. slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
  63. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
  64. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
  65. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
  66. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
  67. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
  68. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
  69. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
  70. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
  71. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
  72. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
  73. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
  74. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
  75. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
  76. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
  77. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
  78. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
  79. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
  80. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
  81. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
  82. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
  83. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
  84. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
  85. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
  86. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
  87. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
  88. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +36 -0
  89. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
  90. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
  91. slidge_whatsapp/vendor/go.mau.fi/util/exstrings/stringutil.go +76 -0
  92. slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
  93. slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
  94. slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
  95. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
  96. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
  97. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
  98. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
  99. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
  100. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
  101. slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
  102. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
  103. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
  104. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
  105. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
  106. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +40 -7
  107. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/binary/encoder.go +1 -1
  108. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
  109. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +1 -1
  110. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +119 -37
  111. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +29 -11
  112. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +63 -30
  113. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +74 -34
  114. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
  115. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +61 -31
  116. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +188 -152
  117. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +3 -2
  118. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
  119. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
  120. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +444 -135
  121. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
  122. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +78 -42
  123. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
  124. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
  125. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
  126. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
  127. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
  128. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/extra.go +7 -0
  129. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.pb.go +983 -0
  130. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.proto +85 -0
  131. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/extra.go +3 -0
  132. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.pb.go +197 -0
  133. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.proto +13 -0
  134. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.pb.go +279 -0
  135. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.proto +21 -0
  136. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.pb.go +137 -0
  137. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.proto +10 -0
  138. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.pb.go +313 -0
  139. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.proto +27 -0
  140. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.pb.go +1299 -0
  141. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.proto +112 -0
  142. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.pb.go +514 -0
  143. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.proto +47 -0
  144. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.pb.go +123 -0
  145. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.proto +7 -0
  146. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/extra.go +3 -0
  147. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.pb.go +720 -0
  148. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.proto +59 -0
  149. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/extra.go +3 -0
  150. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.pb.go +365 -0
  151. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.proto +33 -0
  152. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.pb.go +1238 -0
  153. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.proto +105 -0
  154. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
  155. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
  156. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
  157. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +170 -15
  158. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +4 -0
  159. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
  160. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
  161. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
  162. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
  163. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +184 -89
  164. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +2 -1
  165. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
  166. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
  167. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
  168. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +7428 -2151
  169. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +373 -44
  170. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
  171. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
  172. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.pb.go +198 -0
  173. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.proto +14 -0
  174. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
  175. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
  176. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
  177. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
  178. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
  179. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
  180. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
  181. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/extra.go +7 -6
  182. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
  183. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
  184. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +800 -0
  185. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +72 -0
  186. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1344 -438
  187. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +52 -0
  188. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
  189. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
  190. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
  191. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
  192. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +563 -9
  193. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +4 -0
  194. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +25 -9
  195. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingfields.json +1 -0
  196. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingtoken.go +176 -0
  197. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +39 -21
  198. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +261 -75
  199. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +28 -16
  200. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
  201. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
  202. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
  203. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +86 -65
  204. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
  205. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
  206. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +155 -0
  207. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
  208. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
  209. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
  210. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
  211. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
  212. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
  213. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
  214. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/10-chat-db-lid-migration-ts.sql +2 -0
  215. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
  216. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +107 -56
  217. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
  218. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +13 -2
  219. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
  220. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
  221. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +18 -0
  222. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
  223. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
  224. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +47 -29
  225. slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
  226. slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
  227. slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
  228. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
  229. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
  230. slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
  231. slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
  232. slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
  233. slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
  234. slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
  235. slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
  236. slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
  237. slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
  238. slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
  239. slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
  240. slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
  241. slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
  242. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
  243. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
  244. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
  245. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
  246. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
  247. slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
  248. slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
  249. slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
  250. slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
  251. slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
  252. slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
  253. slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
  254. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
  255. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
  256. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
  257. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
  258. slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
  259. slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
  260. slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
  261. slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
  262. slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
  263. slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
  264. slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
  265. slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
  266. slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
  267. slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
  268. slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
  269. slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
  270. slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
  271. slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
  272. slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
  273. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
  274. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
  275. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
  276. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
  277. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
  278. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
  279. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
  280. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
  281. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
  282. slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
  283. slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
  284. slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
  285. slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
  286. slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
  287. slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
  288. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
  289. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
  290. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
  291. slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
  292. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
  293. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
  294. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
  295. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
  296. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
  297. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
  298. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
  299. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
  300. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
  301. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
  302. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
  303. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
  304. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
  305. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
  306. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
  307. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
  308. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
  309. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
  310. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
  311. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
  312. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
  313. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
  314. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
  315. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
  316. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
  317. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
  318. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +3 -0
  319. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
  320. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
  321. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
  322. slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
  323. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
  324. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
  325. slidge_whatsapp/vendor/modules.txt +52 -13
  326. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/METADATA +1 -1
  327. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/RECORD +330 -184
  328. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/WHEEL +1 -1
  329. slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
  330. slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
  331. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
  332. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
  333. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
  334. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
  335. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
  336. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
  337. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
  338. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
  339. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
  340. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
  341. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
  342. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
  343. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
  344. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
  345. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
  346. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
  347. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
  348. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
  349. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
  350. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
  351. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
  352. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
  353. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
  354. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
  355. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
  356. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/LICENSE +0 -0
  357. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/entry_points.txt +0 -0
@@ -20,6 +20,8 @@ import (
20
20
  "time"
21
21
 
22
22
  "github.com/gorilla/websocket"
23
+ "go.mau.fi/util/exhttp"
24
+ "go.mau.fi/util/exsync"
23
25
  "go.mau.fi/util/random"
24
26
  "golang.org/x/net/proxy"
25
27
 
@@ -38,12 +40,13 @@ import (
38
40
 
39
41
  // EventHandler is a function that can handle events from WhatsApp.
40
42
  type EventHandler func(evt any)
43
+ type EventHandlerWithSuccessStatus func(evt any) bool
41
44
  type nodeHandler func(node *waBinary.Node)
42
45
 
43
46
  var nextHandlerID uint32
44
47
 
45
48
  type wrappedEventHandler struct {
46
- fn EventHandler
49
+ fn EventHandlerWithSuccessStatus
47
50
  id uint32
48
51
  }
49
52
 
@@ -65,15 +68,18 @@ type Client struct {
65
68
  wsDialer *websocket.Dialer
66
69
 
67
70
  isLoggedIn atomic.Bool
68
- expectedDisconnect atomic.Bool
71
+ expectedDisconnect *exsync.Event
69
72
  EnableAutoReconnect bool
73
+ InitialAutoReconnect bool
70
74
  LastSuccessfulConnect time.Time
71
75
  AutoReconnectErrors int
72
76
  // AutoReconnectHook is called when auto-reconnection fails. If the function returns false,
73
77
  // the client will not attempt to reconnect. The number of retries can be read from AutoReconnectErrors.
74
78
  AutoReconnectHook func(error) bool
75
79
  // If SynchronousAck is set, acks for messages will only be sent after all event handlers return.
76
- SynchronousAck bool
80
+ SynchronousAck bool
81
+ EnableDecryptedEventBuffer bool
82
+ lastDecryptedBufferClear time.Time
77
83
 
78
84
  DisableLoginAutoReconnect bool
79
85
 
@@ -92,6 +98,7 @@ type Client struct {
92
98
 
93
99
  historySyncNotifications chan *waE2E.HistorySyncNotification
94
100
  historySyncHandlerStarted atomic.Bool
101
+ ManualHistorySyncDownload bool
95
102
 
96
103
  uploadPreKeysLock sync.Mutex
97
104
  lastPreKeyUpload time.Time
@@ -120,10 +127,10 @@ type Client struct {
120
127
 
121
128
  privacySettingsCache atomic.Value
122
129
 
123
- groupParticipantsCache map[types.JID][]types.JID
124
- groupParticipantsCacheLock sync.Mutex
125
- userDevicesCache map[types.JID]deviceCache
126
- userDevicesCacheLock sync.Mutex
130
+ groupCache map[types.JID]*groupMetaCache
131
+ groupCacheLock sync.Mutex
132
+ userDevicesCache map[types.JID]deviceCache
133
+ userDevicesCacheLock sync.Mutex
127
134
 
128
135
  recentMessagesMap map[recentMessageKey]RecentMessage
129
136
  recentMessagesList [recentMessagesSize]recentMessageKey
@@ -155,6 +162,10 @@ type Client struct {
155
162
  // Should SubscribePresence return an error if no privacy token is stored for the user?
156
163
  ErrorOnSubscribePresenceWithoutToken bool
157
164
 
165
+ SendReportingTokens bool
166
+
167
+ BackgroundEventCtx context.Context
168
+
158
169
  phoneLinkingCache *phoneLinkingCache
159
170
 
160
171
  uniqueID string
@@ -171,7 +182,13 @@ type Client struct {
171
182
  // separate library for all the non-e2ee-related stuff like logging in.
172
183
  // The library is currently embedded in mautrix-meta (https://github.com/mautrix/meta), but may be separated later.
173
184
  MessengerConfig *MessengerConfig
174
- RefreshCAT func() error
185
+ RefreshCAT func(context.Context) error
186
+ }
187
+
188
+ type groupMetaCache struct {
189
+ AddressingMode types.AddressingMode
190
+ CommunityAnnouncementGroup bool
191
+ Members []types.JID
175
192
  }
176
193
 
177
194
  type MessengerConfig struct {
@@ -209,25 +226,26 @@ func NewClient(deviceStore *store.Device, log waLog.Logger) *Client {
209
226
  http: &http.Client{
210
227
  Transport: (http.DefaultTransport.(*http.Transport)).Clone(),
211
228
  },
212
- proxy: http.ProxyFromEnvironment,
213
- Store: deviceStore,
214
- Log: log,
215
- recvLog: log.Sub("Recv"),
216
- sendLog: log.Sub("Send"),
217
- uniqueID: fmt.Sprintf("%d.%d-", uniqueIDPrefix[0], uniqueIDPrefix[1]),
218
- responseWaiters: make(map[string]chan<- *waBinary.Node),
219
- eventHandlers: make([]wrappedEventHandler, 0, 1),
220
- messageRetries: make(map[string]int),
221
- handlerQueue: make(chan *waBinary.Node, handlerQueueSize),
222
- appStateProc: appstate.NewProcessor(deviceStore, log.Sub("AppState")),
223
- socketWait: make(chan struct{}),
229
+ proxy: http.ProxyFromEnvironment,
230
+ Store: deviceStore,
231
+ Log: log,
232
+ recvLog: log.Sub("Recv"),
233
+ sendLog: log.Sub("Send"),
234
+ uniqueID: fmt.Sprintf("%d.%d-", uniqueIDPrefix[0], uniqueIDPrefix[1]),
235
+ responseWaiters: make(map[string]chan<- *waBinary.Node),
236
+ eventHandlers: make([]wrappedEventHandler, 0, 1),
237
+ messageRetries: make(map[string]int),
238
+ handlerQueue: make(chan *waBinary.Node, handlerQueueSize),
239
+ appStateProc: appstate.NewProcessor(deviceStore, log.Sub("AppState")),
240
+ socketWait: make(chan struct{}),
241
+ expectedDisconnect: exsync.NewEvent(),
224
242
 
225
243
  incomingRetryRequestCounter: make(map[incomingRetryKey]int),
226
244
 
227
245
  historySyncNotifications: make(chan *waE2E.HistorySyncNotification, 32),
228
246
 
229
- groupParticipantsCache: make(map[types.JID][]types.JID),
230
- userDevicesCache: make(map[types.JID]deviceCache),
247
+ groupCache: make(map[types.JID]*groupMetaCache),
248
+ userDevicesCache: make(map[types.JID]deviceCache),
231
249
 
232
250
  recentMessagesMap: make(map[recentMessageKey]RecentMessage, recentMessagesSize),
233
251
  sessionRecreateHistory: make(map[types.JID]time.Time),
@@ -238,6 +256,8 @@ func NewClient(deviceStore *store.Device, log waLog.Logger) *Client {
238
256
 
239
257
  EnableAutoReconnect: true,
240
258
  AutoTrustIdentity: true,
259
+
260
+ BackgroundEventCtx: context.Background(),
241
261
  }
242
262
  cli.nodeHandlers = map[string]nodeHandler{
243
263
  "message": cli.handleEncryptedMessage,
@@ -378,11 +398,14 @@ func (cli *Client) getOwnID() types.JID {
378
398
  if cli == nil {
379
399
  return types.EmptyJID
380
400
  }
381
- id := cli.Store.ID
382
- if id == nil {
401
+ return cli.Store.GetJID()
402
+ }
403
+
404
+ func (cli *Client) getOwnLID() types.JID {
405
+ if cli == nil {
383
406
  return types.EmptyJID
384
407
  }
385
- return *id
408
+ return cli.Store.GetLID()
386
409
  }
387
410
 
388
411
  func (cli *Client) WaitForConnection(timeout time.Duration) bool {
@@ -398,6 +421,8 @@ func (cli *Client) WaitForConnection(timeout time.Duration) bool {
398
421
  case <-ch:
399
422
  case <-timeoutChan:
400
423
  return false
424
+ case <-cli.expectedDisconnect.GetChan():
425
+ return false
401
426
  }
402
427
  cli.socketLock.RLock()
403
428
  }
@@ -415,8 +440,28 @@ func (cli *Client) Connect() error {
415
440
  if cli == nil {
416
441
  return ErrClientIsNil
417
442
  }
443
+
444
+ cli.socketLock.Lock()
445
+ defer cli.socketLock.Unlock()
446
+
447
+ err := cli.unlockedConnect()
448
+ if exhttp.IsNetworkError(err) && cli.InitialAutoReconnect && cli.EnableAutoReconnect {
449
+ cli.Log.Errorf("Initial connection failed but reconnecting in background (%v)", err)
450
+ go cli.dispatchEvent(&events.Disconnected{})
451
+ go cli.autoReconnect()
452
+ return nil
453
+ }
454
+ return err
455
+ }
456
+
457
+ func (cli *Client) connect() error {
418
458
  cli.socketLock.Lock()
419
459
  defer cli.socketLock.Unlock()
460
+
461
+ return cli.unlockedConnect()
462
+ }
463
+
464
+ func (cli *Client) unlockedConnect() error {
420
465
  if cli.socket != nil {
421
466
  if !cli.socket.IsConnected() {
422
467
  cli.unlockedDisconnect()
@@ -490,15 +535,15 @@ func (cli *Client) onDisconnect(ns *socket.NoiseSocket, remote bool) {
490
535
  }
491
536
 
492
537
  func (cli *Client) expectDisconnect() {
493
- cli.expectedDisconnect.Store(true)
538
+ cli.expectedDisconnect.Set()
494
539
  }
495
540
 
496
541
  func (cli *Client) resetExpectedDisconnect() {
497
- cli.expectedDisconnect.Store(false)
542
+ cli.expectedDisconnect.Clear()
498
543
  }
499
544
 
500
545
  func (cli *Client) isExpectedDisconnect() bool {
501
- return cli.expectedDisconnect.Load()
546
+ return cli.expectedDisconnect.IsSet()
502
547
  }
503
548
 
504
549
  func (cli *Client) autoReconnect() {
@@ -509,12 +554,17 @@ func (cli *Client) autoReconnect() {
509
554
  autoReconnectDelay := time.Duration(cli.AutoReconnectErrors) * 2 * time.Second
510
555
  cli.Log.Debugf("Automatically reconnecting after %v", autoReconnectDelay)
511
556
  cli.AutoReconnectErrors++
512
- time.Sleep(autoReconnectDelay)
513
- err := cli.Connect()
557
+ if cli.expectedDisconnect.WaitTimeout(autoReconnectDelay) {
558
+ return
559
+ }
560
+ err := cli.connect()
514
561
  if errors.Is(err, ErrAlreadyConnected) {
515
562
  cli.Log.Debugf("Connect() said we're already connected after autoreconnect sleep")
516
563
  return
517
564
  } else if err != nil {
565
+ if cli.expectedDisconnect.IsSet() {
566
+ return
567
+ }
518
568
  cli.Log.Errorf("Error reconnecting after autoreconnect sleep: %v", err)
519
569
  if cli.AutoReconnectHook != nil && !cli.AutoReconnectHook(err) {
520
570
  cli.Log.Debugf("AutoReconnectHook returned false, not reconnecting")
@@ -543,10 +593,11 @@ func (cli *Client) IsConnected() bool {
543
593
  // This will not emit any events, the Disconnected event is only used when the
544
594
  // connection is closed by the server or a network error.
545
595
  func (cli *Client) Disconnect() {
546
- if cli == nil || cli.socket == nil {
596
+ if cli == nil {
547
597
  return
548
598
  }
549
599
  cli.socketLock.Lock()
600
+ cli.expectDisconnect()
550
601
  cli.unlockedDisconnect()
551
602
  cli.socketLock.Unlock()
552
603
  cli.clearDelayedMessageRequests()
@@ -568,7 +619,7 @@ func (cli *Client) unlockedDisconnect() {
568
619
  //
569
620
  // Note that this will not emit any events. The LoggedOut event is only used for external logouts
570
621
  // (triggered by the user from the main device or by WhatsApp servers).
571
- func (cli *Client) Logout() error {
622
+ func (cli *Client) Logout(ctx context.Context) error {
572
623
  if cli == nil {
573
624
  return ErrClientIsNil
574
625
  } else if cli.MessengerConfig != nil {
@@ -594,7 +645,7 @@ func (cli *Client) Logout() error {
594
645
  return fmt.Errorf("error sending logout request: %w", err)
595
646
  }
596
647
  cli.Disconnect()
597
- err = cli.Store.Delete()
648
+ err = cli.Store.Delete(ctx)
598
649
  if err != nil {
599
650
  return fmt.Errorf("error deleting data from store: %w", err)
600
651
  }
@@ -633,6 +684,13 @@ func (cli *Client) Logout() error {
633
684
  // // Handle event and access mycli.WAClient
634
685
  // }
635
686
  func (cli *Client) AddEventHandler(handler EventHandler) uint32 {
687
+ return cli.AddEventHandlerWithSuccessStatus(func(evt any) bool {
688
+ handler(evt)
689
+ return true
690
+ })
691
+ }
692
+
693
+ func (cli *Client) AddEventHandlerWithSuccessStatus(handler EventHandlerWithSuccessStatus) uint32 {
636
694
  nextID := atomic.AddUint32(&nextHandlerID, 1)
637
695
  cli.eventHandlersLock.Lock()
638
696
  cli.eventHandlers = append(cli.eventHandlers, wrappedEventHandler{handler, nextID})
@@ -779,7 +837,7 @@ func (cli *Client) sendNode(node waBinary.Node) error {
779
837
  return err
780
838
  }
781
839
 
782
- func (cli *Client) dispatchEvent(evt any) {
840
+ func (cli *Client) dispatchEvent(evt any) (handlerFailed bool) {
783
841
  cli.eventHandlersLock.RLock()
784
842
  defer func() {
785
843
  cli.eventHandlersLock.RUnlock()
@@ -789,8 +847,11 @@ func (cli *Client) dispatchEvent(evt any) {
789
847
  }
790
848
  }()
791
849
  for _, handler := range cli.eventHandlers {
792
- handler.fn(evt)
850
+ if !handler.fn(evt) {
851
+ return true
852
+ }
793
853
  }
854
+ return false
794
855
  }
795
856
 
796
857
  // ParseWebMessage parses a WebMessageInfo object into *events.Message to match what real-time messages have.
@@ -816,7 +877,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
816
877
  IsFromMe: webMsg.GetKey().GetFromMe(),
817
878
  IsGroup: chatJID.Server == types.GroupServer,
818
879
  },
819
- ID: webMsg.GetKey().GetId(),
880
+ ID: webMsg.GetKey().GetID(),
820
881
  PushName: webMsg.GetPushName(),
821
882
  Timestamp: time.Unix(int64(webMsg.GetMessageTimestamp()), 0),
822
883
  }
@@ -825,7 +886,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
825
886
  if info.Sender.IsEmpty() {
826
887
  return nil, ErrNotLoggedIn
827
888
  }
828
- } else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.NewsletterServer {
889
+ } else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.HiddenUserServer || chatJID.Server == types.NewsletterServer {
829
890
  info.Sender = chatJID
830
891
  } else if webMsg.GetParticipant() != "" {
831
892
  info.Sender, err = types.ParseJID(webMsg.GetParticipant())
@@ -837,6 +898,10 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
837
898
  if err != nil {
838
899
  return nil, fmt.Errorf("failed to parse sender of message %s: %v", info.ID, err)
839
900
  }
901
+ if pk := webMsg.GetCommentMetadata().GetCommentParentKey(); pk != nil {
902
+ info.MsgMetaInfo.ThreadMessageID = pk.GetID()
903
+ info.MsgMetaInfo.ThreadMessageSenderJID, _ = types.ParseJID(pk.GetParticipant())
904
+ }
840
905
  evt := &events.Message{
841
906
  RawMessage: webMsg.GetMessage(),
842
907
  SourceWebMsg: webMsg,
@@ -849,3 +914,20 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
849
914
  }
850
915
  return evt, nil
851
916
  }
917
+
918
+ func (cli *Client) StoreLIDPNMapping(ctx context.Context, first, second types.JID) {
919
+ var lid, pn types.JID
920
+ if first.Server == types.HiddenUserServer && second.Server == types.DefaultUserServer {
921
+ lid = first
922
+ pn = second
923
+ } else if first.Server == types.DefaultUserServer && second.Server == types.HiddenUserServer {
924
+ lid = second
925
+ pn = first
926
+ } else {
927
+ return
928
+ }
929
+ err := cli.Store.LIDs.PutLIDMapping(ctx, lid, pn)
930
+ if err != nil {
931
+ cli.Log.Errorf("Failed to store LID-PN mapping for %s -> %s: %v", lid, pn, err)
932
+ }
933
+ }
@@ -7,6 +7,7 @@
7
7
  package whatsmeow
8
8
 
9
9
  import (
10
+ "context"
10
11
  "time"
11
12
 
12
13
  waBinary "go.mau.fi/whatsmeow/binary"
@@ -16,6 +17,7 @@ import (
16
17
  )
17
18
 
18
19
  func (cli *Client) handleStreamError(node *waBinary.Node) {
20
+ ctx := cli.BackgroundEventCtx
19
21
  cli.isLoggedIn.Store(false)
20
22
  cli.clearResponseWaiters(node)
21
23
  code, _ := node.Attrs["code"].(string)
@@ -31,7 +33,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
31
33
  cli.Log.Infof("Got 515 code, reconnecting...")
32
34
  go func() {
33
35
  cli.Disconnect()
34
- err := cli.Connect()
36
+ err := cli.connect()
35
37
  if err != nil {
36
38
  cli.Log.Errorf("Failed to reconnect after 515 code: %v", err)
37
39
  }
@@ -40,7 +42,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
40
42
  cli.expectDisconnect()
41
43
  cli.Log.Infof("Got device removed stream error, sending LoggedOut event and deleting session")
42
44
  go cli.dispatchEvent(&events.LoggedOut{OnConnect: false, Reason: events.ConnectFailureLoggedOut})
43
- err := cli.Store.Delete()
45
+ err := cli.Store.Delete(ctx)
44
46
  if err != nil {
45
47
  cli.Log.Warnf("Failed to delete store after device_removed error: %v", err)
46
48
  }
@@ -56,7 +58,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
56
58
  cli.Log.Infof("Got %s stream error, refreshing CAT before reconnecting...", code)
57
59
  cli.socketLock.RLock()
58
60
  defer cli.socketLock.RUnlock()
59
- err := cli.RefreshCAT()
61
+ err := cli.RefreshCAT(ctx)
60
62
  if err != nil {
61
63
  cli.Log.Errorf("Failed to refresh CAT: %v", err)
62
64
  cli.expectDisconnect()
@@ -92,6 +94,7 @@ func (cli *Client) handleIB(node *waBinary.Node) {
92
94
  }
93
95
 
94
96
  func (cli *Client) handleConnectFailure(node *waBinary.Node) {
97
+ ctx := cli.BackgroundEventCtx
95
98
  ag := node.AttrGetter()
96
99
  reason := events.ConnectFailureReason(ag.Int("reason"))
97
100
  message := ag.OptionalString("message")
@@ -118,7 +121,7 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
118
121
  if reason.IsLoggedOut() {
119
122
  cli.Log.Infof("Got %s connect failure, sending LoggedOut event and deleting session", reason)
120
123
  go cli.dispatchEvent(&events.LoggedOut{OnConnect: true, Reason: reason})
121
- err := cli.Store.Delete()
124
+ err := cli.Store.Delete(ctx)
122
125
  if err != nil {
123
126
  cli.Log.Warnf("Failed to delete store after %d failure: %v", int(reason), err)
124
127
  }
@@ -133,7 +136,7 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
133
136
  go cli.dispatchEvent(&events.ClientOutdated{})
134
137
  } else if reason == events.ConnectFailureCATInvalid || reason == events.ConnectFailureCATExpired {
135
138
  cli.Log.Infof("Got %d/%s connect failure, refreshing CAT before reconnecting...", int(reason), message)
136
- err := cli.RefreshCAT()
139
+ err := cli.RefreshCAT(ctx)
137
140
  if err != nil {
138
141
  cli.Log.Errorf("Failed to refresh CAT: %v", err)
139
142
  cli.expectDisconnect()
@@ -148,24 +151,38 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
148
151
  }
149
152
 
150
153
  func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
154
+ ctx := cli.BackgroundEventCtx
151
155
  cli.Log.Infof("Successfully authenticated")
152
156
  cli.LastSuccessfulConnect = time.Now()
153
157
  cli.AutoReconnectErrors = 0
154
158
  cli.isLoggedIn.Store(true)
159
+ nodeLID := node.AttrGetter().JID("lid")
160
+ if cli.Store.LID.IsEmpty() && !nodeLID.IsEmpty() {
161
+ cli.Store.LID = nodeLID
162
+ err := cli.Store.Save(ctx)
163
+ if err != nil {
164
+ cli.Log.Warnf("Failed to save device after updating LID: %v", err)
165
+ } else {
166
+ cli.Log.Infof("Updated LID to %s", cli.Store.LID)
167
+ }
168
+ }
169
+ // Some users are missing their own LID-PN mapping even though it's already in the device table,
170
+ // so do this unconditionally for a few months to ensure everyone gets the row.
171
+ cli.StoreLIDPNMapping(ctx, cli.Store.GetLID(), cli.Store.GetJID())
155
172
  go func() {
156
- if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(); err != nil {
173
+ if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(ctx); err != nil {
157
174
  cli.Log.Errorf("Failed to get number of prekeys in database: %v", err)
158
- } else if serverCount, err := cli.getServerPreKeyCount(); err != nil {
175
+ } else if serverCount, err := cli.getServerPreKeyCount(ctx); err != nil {
159
176
  cli.Log.Warnf("Failed to get number of prekeys on server: %v", err)
160
177
  } else {
161
178
  cli.Log.Debugf("Database has %d prekeys, server says we have %d", dbCount, serverCount)
162
179
  if serverCount < MinPreKeyCount || dbCount < MinPreKeyCount {
163
- cli.uploadPreKeys()
164
- sc, _ := cli.getServerPreKeyCount()
180
+ cli.uploadPreKeys(ctx)
181
+ sc, _ := cli.getServerPreKeyCount(ctx)
165
182
  cli.Log.Debugf("Prekey count after upload: %d", sc)
166
183
  }
167
184
  }
168
- err := cli.SetPassive(false)
185
+ err := cli.SetPassive(ctx, false)
169
186
  if err != nil {
170
187
  cli.Log.Warnf("Failed to send post-connect passive IQ: %v", err)
171
188
  }
@@ -178,7 +195,7 @@ func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
178
195
  //
179
196
  // This seems to mostly affect whether the device receives certain events.
180
197
  // By default, whatsmeow will automatically do SetPassive(false) after connecting.
181
- func (cli *Client) SetPassive(passive bool) error {
198
+ func (cli *Client) SetPassive(ctx context.Context, passive bool) error {
182
199
  tag := "active"
183
200
  if passive {
184
201
  tag = "passive"
@@ -187,6 +204,7 @@ func (cli *Client) SetPassive(passive bool) error {
187
204
  Namespace: "passive",
188
205
  Type: "set",
189
206
  To: types.ServerJID,
207
+ Context: ctx,
190
208
  Content: []waBinary.Node{{Tag: tag}},
191
209
  })
192
210
  if err != nil {
@@ -7,6 +7,7 @@
7
7
  package whatsmeow
8
8
 
9
9
  import (
10
+ "context"
10
11
  "crypto/hmac"
11
12
  "crypto/sha256"
12
13
  "encoding/base64"
@@ -37,7 +38,7 @@ type File interface {
37
38
  // DownloadToFile downloads the attachment from the given protobuf message.
38
39
  //
39
40
  // This is otherwise identical to [Download], but writes the attachment to a file instead of returning it as a byte slice.
40
- func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
41
+ func (cli *Client) DownloadToFile(ctx context.Context, msg DownloadableMessage, file File) error {
41
42
  if cli == nil {
42
43
  return ErrClientIsNil
43
44
  }
@@ -53,9 +54,9 @@ func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
53
54
  isWebWhatsappNetURL = strings.HasPrefix(url, "https://web.whatsapp.net")
54
55
  }
55
56
  if len(url) > 0 && !isWebWhatsappNetURL {
56
- return cli.downloadAndDecryptToFile(url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256(), file)
57
+ return cli.downloadAndDecryptToFile(ctx, url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256(), file)
57
58
  } else if len(msg.GetDirectPath()) > 0 {
58
- return cli.DownloadMediaWithPathToFile(msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType], file)
59
+ return cli.DownloadMediaWithPathToFile(ctx, msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType], file)
59
60
  } else {
60
61
  if isWebWhatsappNetURL {
61
62
  cli.Log.Warnf("Got a media message with a web.whatsapp.net URL (%s) and no direct path", url)
@@ -64,12 +65,25 @@ func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
64
65
  }
65
66
  }
66
67
 
67
- func (cli *Client) DownloadFBToFile(transport *waMediaTransport.WAMediaTransport_Integral, mediaType MediaType, file File) error {
68
- return cli.DownloadMediaWithPathToFile(transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType], file)
68
+ func (cli *Client) DownloadFBToFile(
69
+ ctx context.Context,
70
+ transport *waMediaTransport.WAMediaTransport_Integral,
71
+ mediaType MediaType,
72
+ file File,
73
+ ) error {
74
+ return cli.DownloadMediaWithPathToFile(ctx, transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType], file)
69
75
  }
70
76
 
71
- func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, fileHash, mediaKey []byte, fileLength int, mediaType MediaType, mmsType string, file File) error {
72
- mediaConn, err := cli.refreshMediaConn(false)
77
+ func (cli *Client) DownloadMediaWithPathToFile(
78
+ ctx context.Context,
79
+ directPath string,
80
+ encFileHash, fileHash, mediaKey []byte,
81
+ fileLength int,
82
+ mediaType MediaType,
83
+ mmsType string,
84
+ file File,
85
+ ) error {
86
+ mediaConn, err := cli.refreshMediaConn(ctx, false)
73
87
  if err != nil {
74
88
  return fmt.Errorf("failed to refresh media connections: %w", err)
75
89
  }
@@ -79,9 +93,14 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
79
93
  for i, host := range mediaConn.Hosts {
80
94
  // TODO omit hash for unencrypted media?
81
95
  mediaURL := fmt.Sprintf("https://%s%s&hash=%s&mms-type=%s&__wa-mms=", host.Hostname, directPath, base64.URLEncoding.EncodeToString(encFileHash), mmsType)
82
- err = cli.downloadAndDecryptToFile(mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
83
- if err == nil || errors.Is(err, ErrFileLengthMismatch) || errors.Is(err, ErrInvalidMediaSHA256) ||
84
- errors.Is(err, ErrMediaDownloadFailedWith403) || errors.Is(err, ErrMediaDownloadFailedWith404) || errors.Is(err, ErrMediaDownloadFailedWith410) {
96
+ err = cli.downloadAndDecryptToFile(ctx, mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
97
+ if err == nil ||
98
+ errors.Is(err, ErrFileLengthMismatch) ||
99
+ errors.Is(err, ErrInvalidMediaSHA256) ||
100
+ errors.Is(err, ErrMediaDownloadFailedWith403) ||
101
+ errors.Is(err, ErrMediaDownloadFailedWith404) ||
102
+ errors.Is(err, ErrMediaDownloadFailedWith410) ||
103
+ errors.Is(err, context.Canceled) {
85
104
  return err
86
105
  } else if i >= len(mediaConn.Hosts)-1 {
87
106
  return fmt.Errorf("failed to download media from last host: %w", err)
@@ -91,10 +110,18 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
91
110
  return err
92
111
  }
93
112
 
94
- func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo MediaType, fileLength int, fileEncSHA256, fileSHA256 []byte, file File) error {
113
+ func (cli *Client) downloadAndDecryptToFile(
114
+ ctx context.Context,
115
+ url string,
116
+ mediaKey []byte,
117
+ appInfo MediaType,
118
+ fileLength int,
119
+ fileEncSHA256, fileSHA256 []byte,
120
+ file File,
121
+ ) error {
95
122
  iv, cipherKey, macKey, _ := getMediaKeys(mediaKey, appInfo)
96
123
  hasher := sha256.New()
97
- if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(url, fileEncSHA256, file); err != nil {
124
+ if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(ctx, url, fileEncSHA256, file); err != nil {
98
125
  return err
99
126
  } else if mediaKey == nil && fileEncSHA256 == nil && mac == nil {
100
127
  // Unencrypted media, just return the downloaded data
@@ -105,26 +132,28 @@ func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo
105
132
  return fmt.Errorf("failed to seek to start of file after validating mac: %w", err)
106
133
  } else if err = cbcutil.DecryptFile(cipherKey, iv, file); err != nil {
107
134
  return fmt.Errorf("failed to decrypt file: %w", err)
108
- } else if info, err := file.Stat(); err != nil {
109
- return fmt.Errorf("failed to stat file: %w", err)
110
- } else if info.Size() != int64(fileLength) {
111
- return fmt.Errorf("%w: expected %d, got %d", ErrFileLengthMismatch, fileLength, info.Size())
112
- } else if _, err = file.Seek(0, io.SeekStart); err != nil {
113
- return fmt.Errorf("failed to seek to start of file after decrypting: %w", err)
114
- } else if _, err = io.Copy(hasher, file); err != nil {
115
- return fmt.Errorf("failed to hash file: %w", err)
116
- } else if !hmac.Equal(fileSHA256, hasher.Sum(nil)) {
117
- return ErrInvalidMediaSHA256
135
+ } else if ReturnDownloadWarnings {
136
+ if info, err := file.Stat(); err != nil {
137
+ return fmt.Errorf("failed to stat file: %w", err)
138
+ } else if fileLength >= 0 && info.Size() != int64(fileLength) {
139
+ return fmt.Errorf("%w: expected %d, got %d", ErrFileLengthMismatch, fileLength, info.Size())
140
+ } else if _, err = file.Seek(0, io.SeekStart); err != nil {
141
+ return fmt.Errorf("failed to seek to start of file after decrypting: %w", err)
142
+ } else if _, err = io.Copy(hasher, file); err != nil {
143
+ return fmt.Errorf("failed to hash file: %w", err)
144
+ } else if !hmac.Equal(fileSHA256, hasher.Sum(nil)) {
145
+ return ErrInvalidMediaSHA256
146
+ }
118
147
  }
119
148
  return nil
120
149
  }
121
150
 
122
- func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, checksum []byte, file File) (mac []byte, err error) {
151
+ func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(ctx context.Context, url string, checksum []byte, file File) (mac []byte, err error) {
123
152
  for retryNum := 0; retryNum < 5; retryNum++ {
124
153
  if checksum == nil {
125
- _, _, err = cli.downloadMediaToFile(url, file)
154
+ _, _, err = cli.downloadMediaToFile(ctx, url, file)
126
155
  } else {
127
- mac, err = cli.downloadEncryptedMediaToFile(url, checksum, file)
156
+ mac, err = cli.downloadEncryptedMediaToFile(ctx, url, checksum, file)
128
157
  }
129
158
  if err == nil || !shouldRetryMediaDownload(err) {
130
159
  return
@@ -139,13 +168,17 @@ func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, c
139
168
  if err != nil {
140
169
  return nil, fmt.Errorf("failed to seek to start of file to retry download: %w", err)
141
170
  }
142
- time.Sleep(retryDuration)
171
+ select {
172
+ case <-ctx.Done():
173
+ return nil, ctx.Err()
174
+ case <-time.After(retryDuration):
175
+ }
143
176
  }
144
177
  return
145
178
  }
146
179
 
147
- func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byte, error) {
148
- resp, err := cli.doMediaDownloadRequest(url)
180
+ func (cli *Client) downloadMediaToFile(ctx context.Context, url string, file io.Writer) (int64, []byte, error) {
181
+ resp, err := cli.doMediaDownloadRequest(ctx, url)
149
182
  if err != nil {
150
183
  return 0, nil, err
151
184
  }
@@ -162,8 +195,8 @@ func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byt
162
195
  return n, hasher.Sum(nil), err
163
196
  }
164
197
 
165
- func (cli *Client) downloadEncryptedMediaToFile(url string, checksum []byte, file File) ([]byte, error) {
166
- size, hash, err := cli.downloadMediaToFile(url, file)
198
+ func (cli *Client) downloadEncryptedMediaToFile(ctx context.Context, url string, checksum []byte, file File) ([]byte, error) {
199
+ size, hash, err := cli.downloadMediaToFile(ctx, url, file)
167
200
  if err != nil {
168
201
  return nil, err
169
202
  } else if size <= mediaHMACLength {