slidge-whatsapp 0.2.5__cp311-cp311-manylinux_2_36_aarch64.whl → 0.2.7__cp311-cp311-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-311-aarch64-linux-gnu.h +170 -170
  6. slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.so +0 -0
  7. slidge_whatsapp/generated/build.py +135 -135
  8. slidge_whatsapp/generated/whatsapp.c +1496 -1496
  9. slidge_whatsapp/generated/whatsapp.go +1137 -1137
  10. slidge_whatsapp/generated/whatsapp.py +1216 -1216
  11. slidge_whatsapp/generated/whatsapp_go.h +170 -170
  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
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022 Tulir Asokan
1
+ // Copyright (c) 2025 Tulir Asokan
2
2
  //
3
3
  // This Source Code Form is subject to the terms of the Mozilla Public
4
4
  // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -8,14 +8,19 @@
8
8
  package sqlstore
9
9
 
10
10
  import (
11
+ "context"
11
12
  "database/sql"
12
13
  "database/sql/driver"
13
14
  "errors"
14
15
  "fmt"
16
+ "slices"
15
17
  "strings"
16
18
  "sync"
17
19
  "time"
18
20
 
21
+ "go.mau.fi/util/dbutil"
22
+ "go.mau.fi/util/exsync"
23
+
19
24
  "go.mau.fi/whatsmeow/store"
20
25
  "go.mau.fi/whatsmeow/types"
21
26
  "go.mau.fi/whatsmeow/util/keys"
@@ -30,7 +35,7 @@ var ErrInvalidLength = errors.New("database returned byte array with illegal len
30
35
  // When using github.com/lib/pq, you should set
31
36
  //
32
37
  // whatsmeow.PostgresArrayWrapper = pq.Array
33
- var PostgresArrayWrapper func(interface{}) interface {
38
+ var PostgresArrayWrapper func(any) interface {
34
39
  driver.Valuer
35
40
  sql.Scanner
36
41
  }
@@ -43,6 +48,8 @@ type SQLStore struct {
43
48
 
44
49
  contactCache map[types.JID]*types.ContactInfo
45
50
  contactCacheLock sync.Mutex
51
+
52
+ migratedPNSessionsCache *exsync.Set[string]
46
53
  }
47
54
 
48
55
  // NewSQLStore creates a new SQLStore with the given database container and user JID.
@@ -54,10 +61,12 @@ func NewSQLStore(c *Container, jid types.JID) *SQLStore {
54
61
  Container: c,
55
62
  JID: jid.String(),
56
63
  contactCache: make(map[types.JID]*types.ContactInfo),
64
+
65
+ migratedPNSessionsCache: exsync.NewSet[string](),
57
66
  }
58
67
  }
59
68
 
60
- var _ store.AllStores = (*SQLStore)(nil)
69
+ var _ store.AllSessionSpecificStores = (*SQLStore)(nil)
61
70
 
62
71
  const (
63
72
  putIdentityQuery = `
@@ -69,24 +78,24 @@ const (
69
78
  getIdentityQuery = `SELECT identity FROM whatsmeow_identity_keys WHERE our_jid=$1 AND their_id=$2`
70
79
  )
71
80
 
72
- func (s *SQLStore) PutIdentity(address string, key [32]byte) error {
73
- _, err := s.db.Exec(putIdentityQuery, s.JID, address, key[:])
81
+ func (s *SQLStore) PutIdentity(ctx context.Context, address string, key [32]byte) error {
82
+ _, err := s.db.Exec(ctx, putIdentityQuery, s.JID, address, key[:])
74
83
  return err
75
84
  }
76
85
 
77
- func (s *SQLStore) DeleteAllIdentities(phone string) error {
78
- _, err := s.db.Exec(deleteAllIdentitiesQuery, s.JID, phone+":%")
86
+ func (s *SQLStore) DeleteAllIdentities(ctx context.Context, phone string) error {
87
+ _, err := s.db.Exec(ctx, deleteAllIdentitiesQuery, s.JID, phone+":%")
79
88
  return err
80
89
  }
81
90
 
82
- func (s *SQLStore) DeleteIdentity(address string) error {
83
- _, err := s.db.Exec(deleteAllIdentitiesQuery, s.JID, address)
91
+ func (s *SQLStore) DeleteIdentity(ctx context.Context, address string) error {
92
+ _, err := s.db.Exec(ctx, deleteAllIdentitiesQuery, s.JID, address)
84
93
  return err
85
94
  }
86
95
 
87
- func (s *SQLStore) IsTrustedIdentity(address string, key [32]byte) (bool, error) {
96
+ func (s *SQLStore) IsTrustedIdentity(ctx context.Context, address string, key [32]byte) (bool, error) {
88
97
  var existingIdentity []byte
89
- err := s.db.QueryRow(getIdentityQuery, s.JID, address).Scan(&existingIdentity)
98
+ err := s.db.QueryRow(ctx, getIdentityQuery, s.JID, address).Scan(&existingIdentity)
90
99
  if errors.Is(err, sql.ErrNoRows) {
91
100
  // Trust if not known, it'll be saved automatically later
92
101
  return true, nil
@@ -107,39 +116,136 @@ const (
107
116
  `
108
117
  deleteAllSessionsQuery = `DELETE FROM whatsmeow_sessions WHERE our_jid=$1 AND their_id LIKE $2`
109
118
  deleteSessionQuery = `DELETE FROM whatsmeow_sessions WHERE our_jid=$1 AND their_id=$2`
119
+
120
+ migratePNToLIDSessionsQuery = `
121
+ INSERT INTO whatsmeow_sessions (our_jid, their_id, session)
122
+ SELECT our_jid, replace(their_id, $2, $3), session
123
+ FROM whatsmeow_sessions
124
+ WHERE our_jid=$1 AND their_id LIKE $2 || ':%'
125
+ ON CONFLICT (our_jid, their_id) DO UPDATE SET session=excluded.session
126
+ `
127
+ deleteAllIdentityKeysQuery = `DELETE FROM whatsmeow_identity_keys WHERE our_jid=$1 AND their_id LIKE $2`
128
+ migratePNToLIDIdentityKeysQuery = `
129
+ INSERT INTO whatsmeow_identity_keys (our_jid, their_id, identity)
130
+ SELECT our_jid, replace(their_id, $2, $3), identity
131
+ FROM whatsmeow_identity_keys
132
+ WHERE our_jid=$1 AND their_id LIKE $2 || ':%'
133
+ ON CONFLICT (our_jid, their_id) DO UPDATE SET identity=excluded.identity
134
+ `
135
+ deleteAllSenderKeysQuery = `DELETE FROM whatsmeow_sender_keys WHERE our_jid=$1 AND sender_id LIKE $2`
136
+ migratePNToLIDSenderKeysQuery = `
137
+ INSERT INTO whatsmeow_sender_keys (our_jid, chat_id, sender_id, sender_key)
138
+ SELECT our_jid, chat_id, replace(sender_id, $2, $3), sender_key
139
+ FROM whatsmeow_sender_keys
140
+ WHERE our_jid=$1 AND sender_id LIKE $2 || ':%'
141
+ ON CONFLICT (our_jid, chat_id, sender_id) DO UPDATE SET sender_key=excluded.sender_key
142
+ `
110
143
  )
111
144
 
112
- func (s *SQLStore) GetSession(address string) (session []byte, err error) {
113
- err = s.db.QueryRow(getSessionQuery, s.JID, address).Scan(&session)
145
+ func (s *SQLStore) GetSession(ctx context.Context, address string) (session []byte, err error) {
146
+ err = s.db.QueryRow(ctx, getSessionQuery, s.JID, address).Scan(&session)
114
147
  if errors.Is(err, sql.ErrNoRows) {
115
148
  err = nil
116
149
  }
117
150
  return
118
151
  }
119
152
 
120
- func (s *SQLStore) HasSession(address string) (has bool, err error) {
121
- err = s.db.QueryRow(hasSessionQuery, s.JID, address).Scan(&has)
153
+ func (s *SQLStore) HasSession(ctx context.Context, address string) (has bool, err error) {
154
+ err = s.db.QueryRow(ctx, hasSessionQuery, s.JID, address).Scan(&has)
122
155
  if errors.Is(err, sql.ErrNoRows) {
123
156
  err = nil
124
157
  }
125
158
  return
126
159
  }
127
160
 
128
- func (s *SQLStore) PutSession(address string, session []byte) error {
129
- _, err := s.db.Exec(putSessionQuery, s.JID, address, session)
161
+ func (s *SQLStore) PutSession(ctx context.Context, address string, session []byte) error {
162
+ _, err := s.db.Exec(ctx, putSessionQuery, s.JID, address, session)
163
+ return err
164
+ }
165
+
166
+ func (s *SQLStore) DeleteAllSessions(ctx context.Context, phone string) error {
167
+ return s.deleteAllSessions(ctx, phone)
168
+ }
169
+
170
+ func (s *SQLStore) deleteAllSessions(ctx context.Context, phone string) error {
171
+ _, err := s.db.Exec(ctx, deleteAllSessionsQuery, s.JID, phone+":%")
172
+ return err
173
+ }
174
+
175
+ func (s *SQLStore) deleteAllSenderKeys(ctx context.Context, phone string) error {
176
+ _, err := s.db.Exec(ctx, deleteAllSenderKeysQuery, s.JID, phone+":%")
130
177
  return err
131
178
  }
132
179
 
133
- func (s *SQLStore) DeleteAllSessions(phone string) error {
134
- _, err := s.db.Exec(deleteAllSessionsQuery, s.JID, phone+":%")
180
+ func (s *SQLStore) deleteAllIdentityKeys(ctx context.Context, phone string) error {
181
+ _, err := s.db.Exec(ctx, deleteAllIdentityKeysQuery, s.JID, phone+":%")
135
182
  return err
136
183
  }
137
184
 
138
- func (s *SQLStore) DeleteSession(address string) error {
139
- _, err := s.db.Exec(deleteSessionQuery, s.JID, address)
185
+ func (s *SQLStore) DeleteSession(ctx context.Context, address string) error {
186
+ _, err := s.db.Exec(ctx, deleteSessionQuery, s.JID, address)
140
187
  return err
141
188
  }
142
189
 
190
+ func (s *SQLStore) MigratePNToLID(ctx context.Context, pn, lid types.JID) error {
191
+ pnSignal := pn.SignalAddressUser()
192
+ if !s.migratedPNSessionsCache.Add(pnSignal) {
193
+ return nil
194
+ }
195
+ var sessionsUpdated, identityKeysUpdated, senderKeysUpdated int64
196
+ lidSignal := lid.SignalAddressUser()
197
+ err := s.db.DoTxn(ctx, nil, func(ctx context.Context) error {
198
+ res, err := s.db.Exec(ctx, migratePNToLIDSessionsQuery, s.JID, pnSignal, lidSignal)
199
+ if err != nil {
200
+ return fmt.Errorf("failed to migrate sessions: %w", err)
201
+ }
202
+ sessionsUpdated, err = res.RowsAffected()
203
+ if err != nil {
204
+ return fmt.Errorf("failed to get rows affected for sessions: %w", err)
205
+ }
206
+ err = s.deleteAllSessions(ctx, pnSignal)
207
+ if err != nil {
208
+ return fmt.Errorf("failed to delete extra sessions: %w", err)
209
+ }
210
+
211
+ res, err = s.db.Exec(ctx, migratePNToLIDIdentityKeysQuery, s.JID, pnSignal, lidSignal)
212
+ if err != nil {
213
+ return fmt.Errorf("failed to migrate identity keys: %w", err)
214
+ }
215
+ identityKeysUpdated, err = res.RowsAffected()
216
+ if err != nil {
217
+ return fmt.Errorf("failed to get rows affected for identity keys: %w", err)
218
+ }
219
+ err = s.deleteAllIdentityKeys(ctx, pnSignal)
220
+ if err != nil {
221
+ return fmt.Errorf("failed to delete extra identity keys: %w", err)
222
+ }
223
+
224
+ res, err = s.db.Exec(ctx, migratePNToLIDSenderKeysQuery, s.JID, pnSignal, lidSignal)
225
+ if err != nil {
226
+ return fmt.Errorf("failed to migrate sender keys: %w", err)
227
+ }
228
+ senderKeysUpdated, err = res.RowsAffected()
229
+ if err != nil {
230
+ return fmt.Errorf("failed to get rows affected for sender keys: %w", err)
231
+ }
232
+ err = s.deleteAllSenderKeys(ctx, pnSignal)
233
+ if err != nil {
234
+ return fmt.Errorf("failed to delete extra sender keys: %w", err)
235
+ }
236
+ return nil
237
+ })
238
+ if err != nil {
239
+ return err
240
+ }
241
+ if sessionsUpdated > 0 || senderKeysUpdated > 0 || identityKeysUpdated > 0 {
242
+ s.log.Infof("Migrated %d sessions, %d identity keys and %d sender keys from %s to %s", sessionsUpdated, identityKeysUpdated, senderKeysUpdated, pnSignal, lidSignal)
243
+ } else {
244
+ s.log.Debugf("No sessions or sender keys found to migrate from %s to %s", pnSignal, lidSignal)
245
+ }
246
+ return nil
247
+ }
248
+
143
249
  const (
144
250
  getLastPreKeyIDQuery = `SELECT MAX(key_id) FROM whatsmeow_pre_keys WHERE jid=$1`
145
251
  insertPreKeyQuery = `INSERT INTO whatsmeow_pre_keys (jid, key_id, key, uploaded) VALUES ($1, $2, $3, $4)`
@@ -150,36 +256,36 @@ const (
150
256
  getUploadedPreKeyCountQuery = `SELECT COUNT(*) FROM whatsmeow_pre_keys WHERE jid=$1 AND uploaded=true`
151
257
  )
152
258
 
153
- func (s *SQLStore) genOnePreKey(id uint32, markUploaded bool) (*keys.PreKey, error) {
259
+ func (s *SQLStore) genOnePreKey(ctx context.Context, id uint32, markUploaded bool) (*keys.PreKey, error) {
154
260
  key := keys.NewPreKey(id)
155
- _, err := s.db.Exec(insertPreKeyQuery, s.JID, key.KeyID, key.Priv[:], markUploaded)
261
+ _, err := s.db.Exec(ctx, insertPreKeyQuery, s.JID, key.KeyID, key.Priv[:], markUploaded)
156
262
  return key, err
157
263
  }
158
264
 
159
- func (s *SQLStore) getNextPreKeyID() (uint32, error) {
265
+ func (s *SQLStore) getNextPreKeyID(ctx context.Context) (uint32, error) {
160
266
  var lastKeyID sql.NullInt32
161
- err := s.db.QueryRow(getLastPreKeyIDQuery, s.JID).Scan(&lastKeyID)
267
+ err := s.db.QueryRow(ctx, getLastPreKeyIDQuery, s.JID).Scan(&lastKeyID)
162
268
  if err != nil {
163
269
  return 0, fmt.Errorf("failed to query next prekey ID: %w", err)
164
270
  }
165
271
  return uint32(lastKeyID.Int32) + 1, nil
166
272
  }
167
273
 
168
- func (s *SQLStore) GenOnePreKey() (*keys.PreKey, error) {
274
+ func (s *SQLStore) GenOnePreKey(ctx context.Context) (*keys.PreKey, error) {
169
275
  s.preKeyLock.Lock()
170
276
  defer s.preKeyLock.Unlock()
171
- nextKeyID, err := s.getNextPreKeyID()
277
+ nextKeyID, err := s.getNextPreKeyID(ctx)
172
278
  if err != nil {
173
279
  return nil, err
174
280
  }
175
- return s.genOnePreKey(nextKeyID, true)
281
+ return s.genOnePreKey(ctx, nextKeyID, true)
176
282
  }
177
283
 
178
- func (s *SQLStore) GetOrGenPreKeys(count uint32) ([]*keys.PreKey, error) {
284
+ func (s *SQLStore) GetOrGenPreKeys(ctx context.Context, count uint32) ([]*keys.PreKey, error) {
179
285
  s.preKeyLock.Lock()
180
286
  defer s.preKeyLock.Unlock()
181
287
 
182
- res, err := s.db.Query(getUnuploadedPreKeysQuery, s.JID, count)
288
+ res, err := s.db.Query(ctx, getUnuploadedPreKeysQuery, s.JID, count)
183
289
  if err != nil {
184
290
  return nil, fmt.Errorf("failed to query existing prekeys: %w", err)
185
291
  }
@@ -198,12 +304,12 @@ func (s *SQLStore) GetOrGenPreKeys(count uint32) ([]*keys.PreKey, error) {
198
304
 
199
305
  if existingCount < uint32(len(newKeys)) {
200
306
  var nextKeyID uint32
201
- nextKeyID, err = s.getNextPreKeyID()
307
+ nextKeyID, err = s.getNextPreKeyID(ctx)
202
308
  if err != nil {
203
309
  return nil, err
204
310
  }
205
311
  for i := existingCount; i < count; i++ {
206
- newKeys[i], err = s.genOnePreKey(nextKeyID, false)
312
+ newKeys[i], err = s.genOnePreKey(ctx, nextKeyID, false)
207
313
  if err != nil {
208
314
  return nil, fmt.Errorf("failed to generate prekey: %w", err)
209
315
  }
@@ -214,7 +320,7 @@ func (s *SQLStore) GetOrGenPreKeys(count uint32) ([]*keys.PreKey, error) {
214
320
  return newKeys, nil
215
321
  }
216
322
 
217
- func scanPreKey(row scannable) (*keys.PreKey, error) {
323
+ func scanPreKey(row dbutil.Scannable) (*keys.PreKey, error) {
218
324
  var priv []byte
219
325
  var id uint32
220
326
  err := row.Scan(&id, &priv)
@@ -231,22 +337,22 @@ func scanPreKey(row scannable) (*keys.PreKey, error) {
231
337
  }, nil
232
338
  }
233
339
 
234
- func (s *SQLStore) GetPreKey(id uint32) (*keys.PreKey, error) {
235
- return scanPreKey(s.db.QueryRow(getPreKeyQuery, s.JID, id))
340
+ func (s *SQLStore) GetPreKey(ctx context.Context, id uint32) (*keys.PreKey, error) {
341
+ return scanPreKey(s.db.QueryRow(ctx, getPreKeyQuery, s.JID, id))
236
342
  }
237
343
 
238
- func (s *SQLStore) RemovePreKey(id uint32) error {
239
- _, err := s.db.Exec(deletePreKeyQuery, s.JID, id)
344
+ func (s *SQLStore) RemovePreKey(ctx context.Context, id uint32) error {
345
+ _, err := s.db.Exec(ctx, deletePreKeyQuery, s.JID, id)
240
346
  return err
241
347
  }
242
348
 
243
- func (s *SQLStore) MarkPreKeysAsUploaded(upToID uint32) error {
244
- _, err := s.db.Exec(markPreKeysAsUploadedQuery, s.JID, upToID)
349
+ func (s *SQLStore) MarkPreKeysAsUploaded(ctx context.Context, upToID uint32) error {
350
+ _, err := s.db.Exec(ctx, markPreKeysAsUploadedQuery, s.JID, upToID)
245
351
  return err
246
352
  }
247
353
 
248
- func (s *SQLStore) UploadedPreKeyCount() (count int, err error) {
249
- err = s.db.QueryRow(getUploadedPreKeyCountQuery, s.JID).Scan(&count)
354
+ func (s *SQLStore) UploadedPreKeyCount(ctx context.Context) (count int, err error) {
355
+ err = s.db.QueryRow(ctx, getUploadedPreKeyCountQuery, s.JID).Scan(&count)
250
356
  return
251
357
  }
252
358
 
@@ -258,13 +364,13 @@ const (
258
364
  `
259
365
  )
260
366
 
261
- func (s *SQLStore) PutSenderKey(group, user string, session []byte) error {
262
- _, err := s.db.Exec(putSenderKeyQuery, s.JID, group, user, session)
367
+ func (s *SQLStore) PutSenderKey(ctx context.Context, group, user string, session []byte) error {
368
+ _, err := s.db.Exec(ctx, putSenderKeyQuery, s.JID, group, user, session)
263
369
  return err
264
370
  }
265
371
 
266
- func (s *SQLStore) GetSenderKey(group, user string) (key []byte, err error) {
267
- err = s.db.QueryRow(getSenderKeyQuery, s.JID, group, user).Scan(&key)
372
+ func (s *SQLStore) GetSenderKey(ctx context.Context, group, user string) (key []byte, err error) {
373
+ err = s.db.QueryRow(ctx, getSenderKeyQuery, s.JID, group, user).Scan(&key)
268
374
  if errors.Is(err, sql.ErrNoRows) {
269
375
  err = nil
270
376
  }
@@ -282,23 +388,23 @@ const (
282
388
  getLatestAppStateSyncKeyIDQuery = `SELECT key_id FROM whatsmeow_app_state_sync_keys WHERE jid=$1 ORDER BY timestamp DESC LIMIT 1`
283
389
  )
284
390
 
285
- func (s *SQLStore) PutAppStateSyncKey(id []byte, key store.AppStateSyncKey) error {
286
- _, err := s.db.Exec(putAppStateSyncKeyQuery, s.JID, id, key.Data, key.Timestamp, key.Fingerprint)
391
+ func (s *SQLStore) PutAppStateSyncKey(ctx context.Context, id []byte, key store.AppStateSyncKey) error {
392
+ _, err := s.db.Exec(ctx, putAppStateSyncKeyQuery, s.JID, id, key.Data, key.Timestamp, key.Fingerprint)
287
393
  return err
288
394
  }
289
395
 
290
- func (s *SQLStore) GetAppStateSyncKey(id []byte) (*store.AppStateSyncKey, error) {
396
+ func (s *SQLStore) GetAppStateSyncKey(ctx context.Context, id []byte) (*store.AppStateSyncKey, error) {
291
397
  var key store.AppStateSyncKey
292
- err := s.db.QueryRow(getAppStateSyncKeyQuery, s.JID, id).Scan(&key.Data, &key.Timestamp, &key.Fingerprint)
398
+ err := s.db.QueryRow(ctx, getAppStateSyncKeyQuery, s.JID, id).Scan(&key.Data, &key.Timestamp, &key.Fingerprint)
293
399
  if errors.Is(err, sql.ErrNoRows) {
294
400
  return nil, nil
295
401
  }
296
402
  return &key, err
297
403
  }
298
404
 
299
- func (s *SQLStore) GetLatestAppStateSyncKeyID() ([]byte, error) {
405
+ func (s *SQLStore) GetLatestAppStateSyncKeyID(ctx context.Context) ([]byte, error) {
300
406
  var keyID []byte
301
- err := s.db.QueryRow(getLatestAppStateSyncKeyIDQuery, s.JID).Scan(&keyID)
407
+ err := s.db.QueryRow(ctx, getLatestAppStateSyncKeyIDQuery, s.JID).Scan(&keyID)
302
408
  if errors.Is(err, sql.ErrNoRows) {
303
409
  return nil, nil
304
410
  }
@@ -318,14 +424,14 @@ const (
318
424
  getAppStateMutationMACQuery = `SELECT value_mac FROM whatsmeow_app_state_mutation_macs WHERE jid=$1 AND name=$2 AND index_mac=$3 ORDER BY version DESC LIMIT 1`
319
425
  )
320
426
 
321
- func (s *SQLStore) PutAppStateVersion(name string, version uint64, hash [128]byte) error {
322
- _, err := s.db.Exec(putAppStateVersionQuery, s.JID, name, version, hash[:])
427
+ func (s *SQLStore) PutAppStateVersion(ctx context.Context, name string, version uint64, hash [128]byte) error {
428
+ _, err := s.db.Exec(ctx, putAppStateVersionQuery, s.JID, name, version, hash[:])
323
429
  return err
324
430
  }
325
431
 
326
- func (s *SQLStore) GetAppStateVersion(name string) (version uint64, hash [128]byte, err error) {
432
+ func (s *SQLStore) GetAppStateVersion(ctx context.Context, name string) (version uint64, hash [128]byte, err error) {
327
433
  var uncheckedHash []byte
328
- err = s.db.QueryRow(getAppStateVersionQuery, s.JID, name).Scan(&version, &uncheckedHash)
434
+ err = s.db.QueryRow(ctx, getAppStateVersionQuery, s.JID, name).Scan(&version, &uncheckedHash)
329
435
  if errors.Is(err, sql.ErrNoRows) {
330
436
  // version will be 0 and hash will be an empty array, which is the correct initial state
331
437
  err = nil
@@ -341,23 +447,19 @@ func (s *SQLStore) GetAppStateVersion(name string) (version uint64, hash [128]by
341
447
  return
342
448
  }
343
449
 
344
- func (s *SQLStore) DeleteAppStateVersion(name string) error {
345
- _, err := s.db.Exec(deleteAppStateVersionQuery, s.JID, name)
450
+ func (s *SQLStore) DeleteAppStateVersion(ctx context.Context, name string) error {
451
+ _, err := s.db.Exec(ctx, deleteAppStateVersionQuery, s.JID, name)
346
452
  return err
347
453
  }
348
454
 
349
- type execable interface {
350
- Exec(query string, args ...interface{}) (sql.Result, error)
351
- }
352
-
353
- func (s *SQLStore) putAppStateMutationMACs(tx execable, name string, version uint64, mutations []store.AppStateMutationMAC) error {
354
- values := make([]interface{}, 3+len(mutations)*2)
455
+ func (s *SQLStore) putAppStateMutationMACs(ctx context.Context, name string, version uint64, mutations []store.AppStateMutationMAC) error {
456
+ values := make([]any, 3+len(mutations)*2)
355
457
  queryParts := make([]string, len(mutations))
356
458
  values[0] = s.JID
357
459
  values[1] = name
358
460
  values[2] = version
359
461
  placeholderSyntax := "($1, $2, $3, $%d, $%d)"
360
- if s.dialect == "sqlite3" {
462
+ if s.db.Dialect == dbutil.SQLite {
361
463
  placeholderSyntax = "(?1, ?2, ?3, ?%d, ?%d)"
362
464
  }
363
465
  for i, mutation := range mutations {
@@ -366,50 +468,35 @@ func (s *SQLStore) putAppStateMutationMACs(tx execable, name string, version uin
366
468
  values[baseIndex+1] = mutation.ValueMAC
367
469
  queryParts[i] = fmt.Sprintf(placeholderSyntax, baseIndex+1, baseIndex+2)
368
470
  }
369
- _, err := tx.Exec(putAppStateMutationMACsQuery+strings.Join(queryParts, ","), values...)
471
+ _, err := s.db.Exec(ctx, putAppStateMutationMACsQuery+strings.Join(queryParts, ","), values...)
370
472
  return err
371
473
  }
372
474
 
373
475
  const mutationBatchSize = 400
374
476
 
375
- func (s *SQLStore) PutAppStateMutationMACs(name string, version uint64, mutations []store.AppStateMutationMAC) error {
376
- if len(mutations) > mutationBatchSize {
377
- tx, err := s.db.Begin()
378
- if err != nil {
379
- return fmt.Errorf("failed to start transaction: %w", err)
380
- }
381
- for i := 0; i < len(mutations); i += mutationBatchSize {
382
- var mutationSlice []store.AppStateMutationMAC
383
- if len(mutations) > i+mutationBatchSize {
384
- mutationSlice = mutations[i : i+mutationBatchSize]
385
- } else {
386
- mutationSlice = mutations[i:]
387
- }
388
- err = s.putAppStateMutationMACs(tx, name, version, mutationSlice)
477
+ func (s *SQLStore) PutAppStateMutationMACs(ctx context.Context, name string, version uint64, mutations []store.AppStateMutationMAC) error {
478
+ if len(mutations) == 0 {
479
+ return nil
480
+ }
481
+ return s.db.DoTxn(ctx, nil, func(ctx context.Context) error {
482
+ for slice := range slices.Chunk(mutations, mutationBatchSize) {
483
+ err := s.putAppStateMutationMACs(ctx, name, version, slice)
389
484
  if err != nil {
390
- _ = tx.Rollback()
391
485
  return err
392
486
  }
393
487
  }
394
- err = tx.Commit()
395
- if err != nil {
396
- return fmt.Errorf("failed to commit transaction: %w", err)
397
- }
398
488
  return nil
399
- } else if len(mutations) > 0 {
400
- return s.putAppStateMutationMACs(s.db, name, version, mutations)
401
- }
402
- return nil
489
+ })
403
490
  }
404
491
 
405
- func (s *SQLStore) DeleteAppStateMutationMACs(name string, indexMACs [][]byte) (err error) {
492
+ func (s *SQLStore) DeleteAppStateMutationMACs(ctx context.Context, name string, indexMACs [][]byte) (err error) {
406
493
  if len(indexMACs) == 0 {
407
494
  return
408
495
  }
409
- if s.dialect == "postgres" && PostgresArrayWrapper != nil {
410
- _, err = s.db.Exec(deleteAppStateMutationMACsQueryPostgres, s.JID, name, PostgresArrayWrapper(indexMACs))
496
+ if s.db.Dialect == dbutil.Postgres && PostgresArrayWrapper != nil {
497
+ _, err = s.db.Exec(ctx, deleteAppStateMutationMACsQueryPostgres, s.JID, name, PostgresArrayWrapper(indexMACs))
411
498
  } else {
412
- args := make([]interface{}, 2+len(indexMACs))
499
+ args := make([]any, 2+len(indexMACs))
413
500
  args[0] = s.JID
414
501
  args[1] = name
415
502
  queryParts := make([]string, len(indexMACs))
@@ -417,13 +504,13 @@ func (s *SQLStore) DeleteAppStateMutationMACs(name string, indexMACs [][]byte) (
417
504
  args[2+i] = item
418
505
  queryParts[i] = fmt.Sprintf("$%d", i+3)
419
506
  }
420
- _, err = s.db.Exec(deleteAppStateMutationMACsQueryGeneric+"("+strings.Join(queryParts, ",")+")", args...)
507
+ _, err = s.db.Exec(ctx, deleteAppStateMutationMACsQueryGeneric+"("+strings.Join(queryParts, ",")+")", args...)
421
508
  }
422
509
  return
423
510
  }
424
511
 
425
- func (s *SQLStore) GetAppStateMutationMAC(name string, indexMAC []byte) (valueMAC []byte, err error) {
426
- err = s.db.QueryRow(getAppStateMutationMACQuery, s.JID, name, indexMAC).Scan(&valueMAC)
512
+ func (s *SQLStore) GetAppStateMutationMAC(ctx context.Context, name string, indexMAC []byte) (valueMAC []byte, err error) {
513
+ err = s.db.QueryRow(ctx, getAppStateMutationMACQuery, s.JID, name, indexMAC).Scan(&valueMAC)
427
514
  if errors.Is(err, sql.ErrNoRows) {
428
515
  err = nil
429
516
  }
@@ -456,16 +543,16 @@ const (
456
543
  `
457
544
  )
458
545
 
459
- func (s *SQLStore) PutPushName(user types.JID, pushName string) (bool, string, error) {
546
+ func (s *SQLStore) PutPushName(ctx context.Context, user types.JID, pushName string) (bool, string, error) {
460
547
  s.contactCacheLock.Lock()
461
548
  defer s.contactCacheLock.Unlock()
462
549
 
463
- cached, err := s.getContact(user)
550
+ cached, err := s.getContact(ctx, user)
464
551
  if err != nil {
465
552
  return false, "", err
466
553
  }
467
554
  if cached.PushName != pushName {
468
- _, err = s.db.Exec(putPushNameQuery, s.JID, user, pushName)
555
+ _, err = s.db.Exec(ctx, putPushNameQuery, s.JID, user, pushName)
469
556
  if err != nil {
470
557
  return false, "", err
471
558
  }
@@ -477,16 +564,16 @@ func (s *SQLStore) PutPushName(user types.JID, pushName string) (bool, string, e
477
564
  return false, "", nil
478
565
  }
479
566
 
480
- func (s *SQLStore) PutBusinessName(user types.JID, businessName string) (bool, string, error) {
567
+ func (s *SQLStore) PutBusinessName(ctx context.Context, user types.JID, businessName string) (bool, string, error) {
481
568
  s.contactCacheLock.Lock()
482
569
  defer s.contactCacheLock.Unlock()
483
570
 
484
- cached, err := s.getContact(user)
571
+ cached, err := s.getContact(ctx, user)
485
572
  if err != nil {
486
573
  return false, "", err
487
574
  }
488
575
  if cached.BusinessName != businessName {
489
- _, err = s.db.Exec(putBusinessNameQuery, s.JID, user, businessName)
576
+ _, err = s.db.Exec(ctx, putBusinessNameQuery, s.JID, user, businessName)
490
577
  if err != nil {
491
578
  return false, "", err
492
579
  }
@@ -498,16 +585,16 @@ func (s *SQLStore) PutBusinessName(user types.JID, businessName string) (bool, s
498
585
  return false, "", nil
499
586
  }
500
587
 
501
- func (s *SQLStore) PutContactName(user types.JID, firstName, fullName string) error {
588
+ func (s *SQLStore) PutContactName(ctx context.Context, user types.JID, firstName, fullName string) error {
502
589
  s.contactCacheLock.Lock()
503
590
  defer s.contactCacheLock.Unlock()
504
591
 
505
- cached, err := s.getContact(user)
592
+ cached, err := s.getContact(ctx, user)
506
593
  if err != nil {
507
594
  return err
508
595
  }
509
596
  if cached.FirstName != firstName || cached.FullName != fullName {
510
- _, err = s.db.Exec(putContactNameQuery, s.JID, user, firstName, fullName)
597
+ _, err = s.db.Exec(ctx, putContactNameQuery, s.JID, user, firstName, fullName)
511
598
  if err != nil {
512
599
  return err
513
600
  }
@@ -520,12 +607,12 @@ func (s *SQLStore) PutContactName(user types.JID, firstName, fullName string) er
520
607
 
521
608
  const contactBatchSize = 300
522
609
 
523
- func (s *SQLStore) putContactNamesBatch(tx execable, contacts []store.ContactEntry) error {
524
- values := make([]interface{}, 1, 1+len(contacts)*3)
610
+ func (s *SQLStore) putContactNamesBatch(ctx context.Context, contacts []store.ContactEntry) error {
611
+ values := make([]any, 1, 1+len(contacts)*3)
525
612
  queryParts := make([]string, 0, len(contacts))
526
613
  values[0] = s.JID
527
614
  placeholderSyntax := "($1, $%d, $%d, $%d)"
528
- if s.dialect == "sqlite3" {
615
+ if s.db.Dialect == dbutil.SQLite {
529
616
  placeholderSyntax = "(?1, ?%d, ?%d, ?%d)"
530
617
  }
531
618
  i := 0
@@ -547,40 +634,25 @@ func (s *SQLStore) putContactNamesBatch(tx execable, contacts []store.ContactEnt
547
634
  queryParts = append(queryParts, fmt.Sprintf(placeholderSyntax, baseIndex+1, baseIndex+2, baseIndex+3))
548
635
  i++
549
636
  }
550
- _, err := tx.Exec(fmt.Sprintf(putManyContactNamesQuery, strings.Join(queryParts, ",")), values...)
637
+ _, err := s.db.Exec(ctx, fmt.Sprintf(putManyContactNamesQuery, strings.Join(queryParts, ",")), values...)
551
638
  return err
552
639
  }
553
640
 
554
- func (s *SQLStore) PutAllContactNames(contacts []store.ContactEntry) error {
555
- if len(contacts) > contactBatchSize {
556
- tx, err := s.db.Begin()
557
- if err != nil {
558
- return fmt.Errorf("failed to start transaction: %w", err)
559
- }
560
- for i := 0; i < len(contacts); i += contactBatchSize {
561
- var contactSlice []store.ContactEntry
562
- if len(contacts) > i+contactBatchSize {
563
- contactSlice = contacts[i : i+contactBatchSize]
564
- } else {
565
- contactSlice = contacts[i:]
566
- }
567
- err = s.putContactNamesBatch(tx, contactSlice)
641
+ func (s *SQLStore) PutAllContactNames(ctx context.Context, contacts []store.ContactEntry) error {
642
+ if len(contacts) == 0 {
643
+ return nil
644
+ }
645
+ err := s.db.DoTxn(ctx, nil, func(ctx context.Context) error {
646
+ for slice := range slices.Chunk(contacts, contactBatchSize) {
647
+ err := s.putContactNamesBatch(ctx, slice)
568
648
  if err != nil {
569
- _ = tx.Rollback()
570
649
  return err
571
650
  }
572
651
  }
573
- err = tx.Commit()
574
- if err != nil {
575
- return fmt.Errorf("failed to commit transaction: %w", err)
576
- }
577
- } else if len(contacts) > 0 {
578
- err := s.putContactNamesBatch(s.db, contacts)
579
- if err != nil {
580
- return err
581
- }
582
- } else {
583
652
  return nil
653
+ })
654
+ if err != nil {
655
+ return err
584
656
  }
585
657
  s.contactCacheLock.Lock()
586
658
  // Just clear the cache, fetching pushnames and business names would be too much effort
@@ -589,14 +661,14 @@ func (s *SQLStore) PutAllContactNames(contacts []store.ContactEntry) error {
589
661
  return nil
590
662
  }
591
663
 
592
- func (s *SQLStore) getContact(user types.JID) (*types.ContactInfo, error) {
664
+ func (s *SQLStore) getContact(ctx context.Context, user types.JID) (*types.ContactInfo, error) {
593
665
  cached, ok := s.contactCache[user]
594
666
  if ok {
595
667
  return cached, nil
596
668
  }
597
669
 
598
670
  var first, full, push, business sql.NullString
599
- err := s.db.QueryRow(getContactQuery, s.JID, user).Scan(&first, &full, &push, &business)
671
+ err := s.db.QueryRow(ctx, getContactQuery, s.JID, user).Scan(&first, &full, &push, &business)
600
672
  if err != nil && !errors.Is(err, sql.ErrNoRows) {
601
673
  return nil, err
602
674
  }
@@ -611,9 +683,9 @@ func (s *SQLStore) getContact(user types.JID) (*types.ContactInfo, error) {
611
683
  return info, nil
612
684
  }
613
685
 
614
- func (s *SQLStore) GetContact(user types.JID) (types.ContactInfo, error) {
686
+ func (s *SQLStore) GetContact(ctx context.Context, user types.JID) (types.ContactInfo, error) {
615
687
  s.contactCacheLock.Lock()
616
- info, err := s.getContact(user)
688
+ info, err := s.getContact(ctx, user)
617
689
  s.contactCacheLock.Unlock()
618
690
  if err != nil {
619
691
  return types.ContactInfo{}, err
@@ -621,10 +693,10 @@ func (s *SQLStore) GetContact(user types.JID) (types.ContactInfo, error) {
621
693
  return *info, nil
622
694
  }
623
695
 
624
- func (s *SQLStore) GetAllContacts() (map[types.JID]types.ContactInfo, error) {
696
+ func (s *SQLStore) GetAllContacts(ctx context.Context) (map[types.JID]types.ContactInfo, error) {
625
697
  s.contactCacheLock.Lock()
626
698
  defer s.contactCacheLock.Unlock()
627
- rows, err := s.db.Query(getAllContactsQuery, s.JID)
699
+ rows, err := s.db.Query(ctx, getAllContactsQuery, s.JID)
628
700
  if err != nil {
629
701
  return nil, err
630
702
  }
@@ -659,28 +731,28 @@ const (
659
731
  `
660
732
  )
661
733
 
662
- func (s *SQLStore) PutMutedUntil(chat types.JID, mutedUntil time.Time) error {
734
+ func (s *SQLStore) PutMutedUntil(ctx context.Context, chat types.JID, mutedUntil time.Time) error {
663
735
  var val int64
664
736
  if !mutedUntil.IsZero() {
665
737
  val = mutedUntil.Unix()
666
738
  }
667
- _, err := s.db.Exec(fmt.Sprintf(putChatSettingQuery, "muted_until"), s.JID, chat, val)
739
+ _, err := s.db.Exec(ctx, fmt.Sprintf(putChatSettingQuery, "muted_until"), s.JID, chat, val)
668
740
  return err
669
741
  }
670
742
 
671
- func (s *SQLStore) PutPinned(chat types.JID, pinned bool) error {
672
- _, err := s.db.Exec(fmt.Sprintf(putChatSettingQuery, "pinned"), s.JID, chat, pinned)
743
+ func (s *SQLStore) PutPinned(ctx context.Context, chat types.JID, pinned bool) error {
744
+ _, err := s.db.Exec(ctx, fmt.Sprintf(putChatSettingQuery, "pinned"), s.JID, chat, pinned)
673
745
  return err
674
746
  }
675
747
 
676
- func (s *SQLStore) PutArchived(chat types.JID, archived bool) error {
677
- _, err := s.db.Exec(fmt.Sprintf(putChatSettingQuery, "archived"), s.JID, chat, archived)
748
+ func (s *SQLStore) PutArchived(ctx context.Context, chat types.JID, archived bool) error {
749
+ _, err := s.db.Exec(ctx, fmt.Sprintf(putChatSettingQuery, "archived"), s.JID, chat, archived)
678
750
  return err
679
751
  }
680
752
 
681
- func (s *SQLStore) GetChatSettings(chat types.JID) (settings types.LocalChatSettings, err error) {
753
+ func (s *SQLStore) GetChatSettings(ctx context.Context, chat types.JID) (settings types.LocalChatSettings, err error) {
682
754
  var mutedUntil int64
683
- err = s.db.QueryRow(getChatSettingsQuery, s.JID, chat).Scan(&mutedUntil, &settings.Pinned, &settings.Archived)
755
+ err = s.db.QueryRow(ctx, getChatSettingsQuery, s.JID, chat).Scan(&mutedUntil, &settings.Pinned, &settings.Archived)
684
756
  if errors.Is(err, sql.ErrNoRows) {
685
757
  err = nil
686
758
  } else if err != nil {
@@ -705,28 +777,28 @@ const (
705
777
  `
706
778
  )
707
779
 
708
- func (s *SQLStore) PutMessageSecrets(inserts []store.MessageSecretInsert) (err error) {
709
- tx, err := s.db.Begin()
710
- if err != nil {
711
- return fmt.Errorf("failed to begin transaction: %w", err)
712
- }
713
- for _, insert := range inserts {
714
- _, err = tx.Exec(putMsgSecret, s.JID, insert.Chat.ToNonAD(), insert.Sender.ToNonAD(), insert.ID, insert.Secret)
715
- }
716
- err = tx.Commit()
717
- if err != nil {
718
- return fmt.Errorf("failed to commit transaction: %w", err)
780
+ func (s *SQLStore) PutMessageSecrets(ctx context.Context, inserts []store.MessageSecretInsert) (err error) {
781
+ if len(inserts) == 0 {
782
+ return nil
719
783
  }
720
- return
784
+ return s.db.DoTxn(ctx, nil, func(ctx context.Context) error {
785
+ for _, insert := range inserts {
786
+ _, err = s.db.Exec(ctx, putMsgSecret, s.JID, insert.Chat.ToNonAD(), insert.Sender.ToNonAD(), insert.ID, insert.Secret)
787
+ if err != nil {
788
+ return err
789
+ }
790
+ }
791
+ return nil
792
+ })
721
793
  }
722
794
 
723
- func (s *SQLStore) PutMessageSecret(chat, sender types.JID, id types.MessageID, secret []byte) (err error) {
724
- _, err = s.db.Exec(putMsgSecret, s.JID, chat.ToNonAD(), sender.ToNonAD(), id, secret)
795
+ func (s *SQLStore) PutMessageSecret(ctx context.Context, chat, sender types.JID, id types.MessageID, secret []byte) (err error) {
796
+ _, err = s.db.Exec(ctx, putMsgSecret, s.JID, chat.ToNonAD(), sender.ToNonAD(), id, secret)
725
797
  return
726
798
  }
727
799
 
728
- func (s *SQLStore) GetMessageSecret(chat, sender types.JID, id types.MessageID) (secret []byte, err error) {
729
- err = s.db.QueryRow(getMsgSecret, s.JID, chat.ToNonAD(), sender.ToNonAD(), id).Scan(&secret)
800
+ func (s *SQLStore) GetMessageSecret(ctx context.Context, chat, sender types.JID, id types.MessageID) (secret []byte, err error) {
801
+ err = s.db.QueryRow(ctx, getMsgSecret, s.JID, chat.ToNonAD(), sender.ToNonAD(), id).Scan(&secret)
730
802
  if errors.Is(err, sql.ErrNoRows) {
731
803
  err = nil
732
804
  }
@@ -742,7 +814,7 @@ const (
742
814
  getPrivacyToken = `SELECT token, timestamp FROM whatsmeow_privacy_tokens WHERE our_jid=$1 AND their_jid=$2`
743
815
  )
744
816
 
745
- func (s *SQLStore) PutPrivacyTokens(tokens ...store.PrivacyToken) error {
817
+ func (s *SQLStore) PutPrivacyTokens(ctx context.Context, tokens ...store.PrivacyToken) error {
746
818
  args := make([]any, 1+len(tokens)*3)
747
819
  placeholders := make([]string, len(tokens))
748
820
  args[0] = s.JID
@@ -753,15 +825,15 @@ func (s *SQLStore) PutPrivacyTokens(tokens ...store.PrivacyToken) error {
753
825
  placeholders[i] = fmt.Sprintf("($1, $%d, $%d, $%d)", i*3+2, i*3+3, i*3+4)
754
826
  }
755
827
  query := strings.ReplaceAll(putPrivacyTokens, "($1, $2, $3, $4)", strings.Join(placeholders, ","))
756
- _, err := s.db.Exec(query, args...)
828
+ _, err := s.db.Exec(ctx, query, args...)
757
829
  return err
758
830
  }
759
831
 
760
- func (s *SQLStore) GetPrivacyToken(user types.JID) (*store.PrivacyToken, error) {
832
+ func (s *SQLStore) GetPrivacyToken(ctx context.Context, user types.JID) (*store.PrivacyToken, error) {
761
833
  var token store.PrivacyToken
762
834
  token.User = user.ToNonAD()
763
835
  var ts int64
764
- err := s.db.QueryRow(getPrivacyToken, s.JID, token.User).Scan(&token.Token, &ts)
836
+ err := s.db.QueryRow(ctx, getPrivacyToken, s.JID, token.User).Scan(&token.Token, &ts)
765
837
  if errors.Is(err, sql.ErrNoRows) {
766
838
  return nil, nil
767
839
  } else if err != nil {
@@ -771,3 +843,55 @@ func (s *SQLStore) GetPrivacyToken(user types.JID) (*store.PrivacyToken, error)
771
843
  return &token, nil
772
844
  }
773
845
  }
846
+
847
+ const (
848
+ getBufferedEventQuery = `
849
+ SELECT plaintext, server_timestamp, insert_timestamp FROM whatsmeow_event_buffer WHERE our_jid = $1 AND ciphertext_hash = $2
850
+ `
851
+ putBufferedEventQuery = `
852
+ INSERT INTO whatsmeow_event_buffer (our_jid, ciphertext_hash, plaintext, server_timestamp, insert_timestamp)
853
+ VALUES ($1, $2, $3, $4, $5)
854
+ `
855
+ clearBufferedEventPlaintextQuery = `
856
+ UPDATE whatsmeow_event_buffer SET plaintext = NULL WHERE our_jid = $1 AND ciphertext_hash = $2
857
+ `
858
+ deleteOldBufferedHashesQuery = `
859
+ DELETE FROM whatsmeow_event_buffer WHERE insert_timestamp < $1
860
+ `
861
+ )
862
+
863
+ func (s *SQLStore) GetBufferedEvent(ctx context.Context, ciphertextHash [32]byte) (*store.BufferedEvent, error) {
864
+ var insertTimeMS, serverTimeSeconds int64
865
+ var buf store.BufferedEvent
866
+ err := s.db.QueryRow(ctx, getBufferedEventQuery, s.JID, ciphertextHash[:]).Scan(&buf.Plaintext, &serverTimeSeconds, &insertTimeMS)
867
+ if errors.Is(err, sql.ErrNoRows) {
868
+ return nil, nil
869
+ } else if err != nil {
870
+ return nil, err
871
+ }
872
+ buf.ServerTime = time.Unix(serverTimeSeconds, 0)
873
+ buf.InsertTime = time.UnixMilli(insertTimeMS)
874
+ return &buf, nil
875
+ }
876
+
877
+ func (s *SQLStore) PutBufferedEvent(ctx context.Context, ciphertextHash [32]byte, plaintext []byte, serverTimestamp time.Time) error {
878
+ _, err := s.db.Exec(ctx, putBufferedEventQuery, s.JID, ciphertextHash[:], plaintext, serverTimestamp.Unix(), time.Now().UnixMilli())
879
+ return err
880
+ }
881
+
882
+ func (s *SQLStore) DoDecryptionTxn(ctx context.Context, fn func(context.Context) error) error {
883
+ ctx = context.WithValue(ctx, dbutil.ContextKeyDoTxnCallerSkip, 2)
884
+ return s.db.DoTxn(ctx, nil, fn)
885
+ }
886
+
887
+ func (s *SQLStore) ClearBufferedEventPlaintext(ctx context.Context, ciphertextHash [32]byte) error {
888
+ _, err := s.db.Exec(ctx, clearBufferedEventPlaintextQuery, s.JID, ciphertextHash[:])
889
+ return err
890
+ }
891
+
892
+ func (s *SQLStore) DeleteOldBufferedHashes(ctx context.Context) error {
893
+ // The WhatsApp servers only buffer events for 14 days,
894
+ // so we can safely delete anything older than that.
895
+ _, err := s.db.Exec(ctx, deleteOldBufferedHashesQuery, time.Now().Add(-14*24*time.Hour).UnixMilli())
896
+ return err
897
+ }