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.
- slidge_whatsapp/config.py +3 -0
- slidge_whatsapp/event.go +31 -26
- slidge_whatsapp/gateway.go +13 -9
- slidge_whatsapp/gateway.py +2 -2
- slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.h +170 -170
- slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.so +0 -0
- slidge_whatsapp/generated/build.py +135 -135
- slidge_whatsapp/generated/whatsapp.c +1496 -1496
- slidge_whatsapp/generated/whatsapp.go +1137 -1137
- slidge_whatsapp/generated/whatsapp.py +1216 -1216
- slidge_whatsapp/generated/whatsapp_go.h +170 -170
- slidge_whatsapp/go.mod +15 -12
- slidge_whatsapp/go.sum +35 -29
- slidge_whatsapp/media/media.go +21 -11
- slidge_whatsapp/session.go +73 -66
- slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
- slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
- slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
- slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
- slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
- slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +36 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exstrings/stringutil.go +76 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
- slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +40 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/binary/encoder.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +119 -37
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +29 -11
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +63 -30
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +74 -34
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +61 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +188 -152
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +444 -135
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +78 -42
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/extra.go +7 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.pb.go +983 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.proto +85 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.pb.go +197 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.proto +13 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.pb.go +279 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.proto +21 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.pb.go +137 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.proto +10 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.pb.go +313 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.proto +27 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.pb.go +1299 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.proto +112 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.pb.go +514 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.proto +47 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.pb.go +123 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.proto +7 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.pb.go +720 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.proto +59 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.pb.go +365 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.proto +33 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.pb.go +1238 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.proto +105 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +170 -15
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +184 -89
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +7428 -2151
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +373 -44
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.pb.go +198 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.proto +14 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/extra.go +7 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +800 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +72 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1344 -438
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +52 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +563 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +25 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingfields.json +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingtoken.go +176 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +39 -21
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +261 -75
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +28 -16
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +86 -65
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +155 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/10-chat-db-lid-migration-ts.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +107 -56
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +13 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +18 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +47 -29
- slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
- slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
- slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
- slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
- slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
- slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
- slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
- slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
- slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
- slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +3 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
- slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
- slidge_whatsapp/vendor/modules.txt +52 -13
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/METADATA +1 -1
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/RECORD +330 -184
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/WHEEL +1 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/LICENSE +0 -0
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
// Copyright (c) 2023 Tulir Asokan
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package dbutil
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"bytes"
|
|
11
|
+
"context"
|
|
12
|
+
"errors"
|
|
13
|
+
"fmt"
|
|
14
|
+
"io/fs"
|
|
15
|
+
"path/filepath"
|
|
16
|
+
"regexp"
|
|
17
|
+
"strconv"
|
|
18
|
+
"strings"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
type TxnMode string
|
|
22
|
+
|
|
23
|
+
const (
|
|
24
|
+
TxnModeOn TxnMode = "on"
|
|
25
|
+
TxnModeOff TxnMode = "off"
|
|
26
|
+
TxnModeSQLiteForeignKeysOff TxnMode = "sqlite-fkey-off"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
type UpgradeTable []upgrade
|
|
30
|
+
|
|
31
|
+
func (ut *UpgradeTable) extend(toSize int) {
|
|
32
|
+
if cap(*ut) >= toSize {
|
|
33
|
+
*ut = (*ut)[:toSize]
|
|
34
|
+
} else {
|
|
35
|
+
resized := make([]upgrade, toSize)
|
|
36
|
+
copy(resized, *ut)
|
|
37
|
+
*ut = resized
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func (ut *UpgradeTable) Register(from, to, compat int, message string, txn TxnMode, fn upgradeFunc) {
|
|
42
|
+
if from < 0 {
|
|
43
|
+
from += to
|
|
44
|
+
}
|
|
45
|
+
if from < 0 {
|
|
46
|
+
panic("invalid from value in UpgradeTable.Register() call")
|
|
47
|
+
}
|
|
48
|
+
if compat <= 0 {
|
|
49
|
+
compat = to
|
|
50
|
+
}
|
|
51
|
+
upg := upgrade{message: message, fn: fn, upgradesTo: to, compatVersion: compat, transaction: txn}
|
|
52
|
+
if len(*ut) == from {
|
|
53
|
+
*ut = append(*ut, upg)
|
|
54
|
+
return
|
|
55
|
+
} else if len(*ut) < from {
|
|
56
|
+
ut.extend(from + 1)
|
|
57
|
+
} else if (*ut)[from].fn != nil {
|
|
58
|
+
panic(fmt.Errorf("tried to override upgrade at %d ('%s') with '%s'", from, (*ut)[from].message, upg.message))
|
|
59
|
+
}
|
|
60
|
+
(*ut)[from] = upg
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Syntax is either
|
|
64
|
+
//
|
|
65
|
+
// -- v0 -> v1: Message
|
|
66
|
+
//
|
|
67
|
+
// or
|
|
68
|
+
//
|
|
69
|
+
// -- v1: Message
|
|
70
|
+
//
|
|
71
|
+
// Both syntaxes may also have a compatibility notice before the colon:
|
|
72
|
+
//
|
|
73
|
+
// -- v5 (compatible with v3+): Upgrade with backwards compatibility
|
|
74
|
+
var upgradeHeaderRegex = regexp.MustCompile(`^-- (?:v(\d+) -> )?v(\d+)(?: \(compatible with v(\d+)\+\))?: (.+)$`)
|
|
75
|
+
|
|
76
|
+
// To disable wrapping the upgrade in a single transaction, put `--transaction: off` on the second line.
|
|
77
|
+
//
|
|
78
|
+
// -- v5: Upgrade without transaction
|
|
79
|
+
// -- transaction: off
|
|
80
|
+
// // do dangerous stuff
|
|
81
|
+
var transactionDisableRegex = regexp.MustCompile(`^-- transaction: ([a-z-]*)`)
|
|
82
|
+
|
|
83
|
+
func parseFileHeader(file []byte) (from, to, compat int, message string, txn TxnMode, lines [][]byte, err error) {
|
|
84
|
+
lines = bytes.Split(file, []byte("\n"))
|
|
85
|
+
if len(lines) < 2 {
|
|
86
|
+
err = errors.New("upgrade file too short")
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
var maybeFrom int
|
|
90
|
+
match := upgradeHeaderRegex.FindSubmatch(lines[0])
|
|
91
|
+
lines = lines[1:]
|
|
92
|
+
if match == nil {
|
|
93
|
+
err = errors.New("header not found")
|
|
94
|
+
} else if len(match) != 5 {
|
|
95
|
+
err = errors.New("unexpected number of items in regex match")
|
|
96
|
+
} else if maybeFrom, err = strconv.Atoi(string(match[1])); len(match[1]) > 0 && err != nil {
|
|
97
|
+
err = fmt.Errorf("invalid source version: %w", err)
|
|
98
|
+
} else if to, err = strconv.Atoi(string(match[2])); err != nil {
|
|
99
|
+
err = fmt.Errorf("invalid target version: %w", err)
|
|
100
|
+
} else if compat, err = strconv.Atoi(string(match[3])); len(match[3]) > 0 && err != nil {
|
|
101
|
+
err = fmt.Errorf("invalid compatible version: %w", err)
|
|
102
|
+
} else {
|
|
103
|
+
err = nil
|
|
104
|
+
if len(match[1]) > 0 {
|
|
105
|
+
from = maybeFrom
|
|
106
|
+
} else {
|
|
107
|
+
from = -1
|
|
108
|
+
}
|
|
109
|
+
message = string(match[4])
|
|
110
|
+
txn = "on"
|
|
111
|
+
match = transactionDisableRegex.FindSubmatch(lines[0])
|
|
112
|
+
if match != nil {
|
|
113
|
+
lines = lines[1:]
|
|
114
|
+
txn = TxnMode(match[1])
|
|
115
|
+
switch txn {
|
|
116
|
+
case TxnModeOff, TxnModeOn, TxnModeSQLiteForeignKeysOff:
|
|
117
|
+
// ok
|
|
118
|
+
default:
|
|
119
|
+
err = fmt.Errorf("invalid value %q for transaction flag", match[1])
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// To limit the next line to one dialect:
|
|
127
|
+
//
|
|
128
|
+
// -- only: postgres
|
|
129
|
+
//
|
|
130
|
+
// To limit the next N lines:
|
|
131
|
+
//
|
|
132
|
+
// -- only: sqlite for next 123 lines
|
|
133
|
+
//
|
|
134
|
+
// To limit a block of code, fenced by another directive:
|
|
135
|
+
//
|
|
136
|
+
// -- only: sqlite until "end only"
|
|
137
|
+
// QUERY;
|
|
138
|
+
// ANOTHER QUERY;
|
|
139
|
+
// -- end only sqlite
|
|
140
|
+
//
|
|
141
|
+
// If the single-line limit is on the second line of the file, the whole file is limited to that dialect.
|
|
142
|
+
//
|
|
143
|
+
// If the filter ends with `(lines commented)`, then ALL lines chosen by the filter will be uncommented.
|
|
144
|
+
var dialectLineFilter = regexp.MustCompile(`^\s*-- only: (postgres|sqlite)(?: for next (\d+) lines| until "(end) only")?(?: \(lines? (commented)\))?`)
|
|
145
|
+
|
|
146
|
+
// Constants used to make parseDialectFilter clearer
|
|
147
|
+
const (
|
|
148
|
+
skipUntilEndTag = -1
|
|
149
|
+
skipNothing = 0
|
|
150
|
+
skipNextLine = 1
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
func (db *Database) parseDialectFilter(line []byte) (dialect Dialect, lineCount int, uncomment bool, err error) {
|
|
154
|
+
match := dialectLineFilter.FindSubmatch(line)
|
|
155
|
+
if match == nil {
|
|
156
|
+
return
|
|
157
|
+
}
|
|
158
|
+
dialect, err = ParseDialect(string(match[1]))
|
|
159
|
+
if err != nil {
|
|
160
|
+
return
|
|
161
|
+
}
|
|
162
|
+
uncomment = bytes.Equal(match[4], []byte("commented"))
|
|
163
|
+
if bytes.Equal(match[3], []byte("end")) {
|
|
164
|
+
lineCount = skipUntilEndTag
|
|
165
|
+
} else if len(match[2]) == 0 {
|
|
166
|
+
lineCount = skipNextLine
|
|
167
|
+
} else {
|
|
168
|
+
lineCount, err = strconv.Atoi(string(match[2]))
|
|
169
|
+
if err != nil {
|
|
170
|
+
err = fmt.Errorf("invalid line count %q: %w", match[2], err)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
var endLineFilter = regexp.MustCompile(`^\s*-- end only (postgres|sqlite)$`)
|
|
177
|
+
|
|
178
|
+
func (db *Database) Internals() *publishDatabaseInternals {
|
|
179
|
+
return (*publishDatabaseInternals)(db)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
type publishDatabaseInternals Database
|
|
183
|
+
|
|
184
|
+
func (di *publishDatabaseInternals) FilterSQLUpgrade(lines [][]byte) (string, error) {
|
|
185
|
+
return (*Database)(di).filterSQLUpgrade(lines)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
func (db *Database) filterSQLUpgrade(lines [][]byte) (string, error) {
|
|
189
|
+
output := make([][]byte, 0, len(lines))
|
|
190
|
+
for i := 0; i < len(lines); i++ {
|
|
191
|
+
dialect, lineCount, uncomment, err := db.parseDialectFilter(lines[i])
|
|
192
|
+
if err != nil {
|
|
193
|
+
return "", err
|
|
194
|
+
} else if lineCount == skipNothing {
|
|
195
|
+
output = append(output, lines[i])
|
|
196
|
+
} else if lineCount == skipUntilEndTag {
|
|
197
|
+
startedAt := i
|
|
198
|
+
startedAtMatch := dialectLineFilter.FindSubmatch(lines[startedAt])
|
|
199
|
+
// Skip filter start line
|
|
200
|
+
i++
|
|
201
|
+
for ; i < len(lines); i++ {
|
|
202
|
+
if match := endLineFilter.FindSubmatch(lines[i]); match != nil {
|
|
203
|
+
if !bytes.Equal(match[1], startedAtMatch[1]) {
|
|
204
|
+
return "", fmt.Errorf(`unexpected end tag %q for %q start at line %d`, string(match[0]), string(startedAtMatch[1]), startedAt)
|
|
205
|
+
}
|
|
206
|
+
break
|
|
207
|
+
}
|
|
208
|
+
if dialect == db.Dialect {
|
|
209
|
+
if uncomment {
|
|
210
|
+
output = append(output, bytes.TrimPrefix(lines[i], []byte("--")))
|
|
211
|
+
} else {
|
|
212
|
+
output = append(output, lines[i])
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if i == len(lines) {
|
|
217
|
+
return "", fmt.Errorf(`didn't get end tag matching start %q at line %d`, string(startedAtMatch[1]), startedAt)
|
|
218
|
+
}
|
|
219
|
+
} else if dialect != db.Dialect {
|
|
220
|
+
i += lineCount
|
|
221
|
+
} else {
|
|
222
|
+
// Skip current line, uncomment the specified number of lines
|
|
223
|
+
i++
|
|
224
|
+
targetI := i + lineCount
|
|
225
|
+
for ; i < targetI; i++ {
|
|
226
|
+
if uncomment {
|
|
227
|
+
output = append(output, bytes.TrimPrefix(lines[i], []byte("--")))
|
|
228
|
+
} else {
|
|
229
|
+
output = append(output, lines[i])
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Decrement counter to avoid skipping the next line
|
|
233
|
+
i--
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return string(bytes.Join(output, []byte("\n"))), nil
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
func sqlUpgradeFunc(fileName string, lines [][]byte) upgradeFunc {
|
|
240
|
+
return func(ctx context.Context, db *Database) error {
|
|
241
|
+
if dialect, skip, _, err := db.parseDialectFilter(lines[0]); err == nil && skip == skipNextLine && dialect != db.Dialect {
|
|
242
|
+
return nil
|
|
243
|
+
} else if upgradeSQL, err := db.filterSQLUpgrade(lines); err != nil {
|
|
244
|
+
panic(fmt.Errorf("failed to parse upgrade %s: %w", fileName, err))
|
|
245
|
+
} else {
|
|
246
|
+
_, err = db.Exec(ctx, upgradeSQL)
|
|
247
|
+
return err
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
func splitSQLUpgradeFunc(sqliteData, postgresData string) upgradeFunc {
|
|
253
|
+
return func(ctx context.Context, db *Database) (err error) {
|
|
254
|
+
switch db.Dialect {
|
|
255
|
+
case SQLite:
|
|
256
|
+
_, err = db.Exec(ctx, sqliteData)
|
|
257
|
+
case Postgres:
|
|
258
|
+
_, err = db.Exec(ctx, postgresData)
|
|
259
|
+
default:
|
|
260
|
+
err = fmt.Errorf("unknown dialect %s", db.Dialect)
|
|
261
|
+
}
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
func parseSplitSQLUpgrade(name string, fs fullFS, skipNames map[string]struct{}) (from, to, compat int, message string, txn TxnMode, fn upgradeFunc) {
|
|
267
|
+
postgresName := fmt.Sprintf("%s.postgres.sql", name)
|
|
268
|
+
sqliteName := fmt.Sprintf("%s.sqlite.sql", name)
|
|
269
|
+
skipNames[postgresName] = struct{}{}
|
|
270
|
+
skipNames[sqliteName] = struct{}{}
|
|
271
|
+
postgresData, err := fs.ReadFile(postgresName)
|
|
272
|
+
if err != nil {
|
|
273
|
+
panic(err)
|
|
274
|
+
}
|
|
275
|
+
sqliteData, err := fs.ReadFile(sqliteName)
|
|
276
|
+
if err != nil {
|
|
277
|
+
panic(err)
|
|
278
|
+
}
|
|
279
|
+
from, to, compat, message, txn, _, err = parseFileHeader(postgresData)
|
|
280
|
+
if err != nil {
|
|
281
|
+
panic(fmt.Errorf("failed to parse header in %s: %w", postgresName, err))
|
|
282
|
+
}
|
|
283
|
+
sqliteFrom, sqliteTo, sqliteCompat, sqliteMessage, sqliteTxn, _, err := parseFileHeader(sqliteData)
|
|
284
|
+
if err != nil {
|
|
285
|
+
panic(fmt.Errorf("failed to parse header in %s: %w", sqliteName, err))
|
|
286
|
+
}
|
|
287
|
+
if from != sqliteFrom || to != sqliteTo || compat != sqliteCompat {
|
|
288
|
+
panic(fmt.Errorf("mismatching versions in postgres and sqlite versions of %s: %d/%d -> %d/%d", name, from, sqliteFrom, to, sqliteTo))
|
|
289
|
+
} else if message != sqliteMessage {
|
|
290
|
+
panic(fmt.Errorf("mismatching message in postgres and sqlite versions of %s: %q != %q", name, message, sqliteMessage))
|
|
291
|
+
} else if txn != sqliteTxn {
|
|
292
|
+
panic(fmt.Errorf("mismatching transaction flag in postgres and sqlite versions of %s: %s != %s", name, txn, sqliteTxn))
|
|
293
|
+
}
|
|
294
|
+
fn = splitSQLUpgradeFunc(string(sqliteData), string(postgresData))
|
|
295
|
+
return
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
type fullFS interface {
|
|
299
|
+
fs.ReadFileFS
|
|
300
|
+
fs.ReadDirFS
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
var splitFileNameRegex = regexp.MustCompile(`^(.+)\.(postgres|sqlite)\.sql$`)
|
|
304
|
+
|
|
305
|
+
func (ut *UpgradeTable) RegisterFS(fs fullFS) {
|
|
306
|
+
ut.RegisterFSPath(fs, ".")
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
func (ut *UpgradeTable) RegisterFSPath(fs fullFS, dir string) {
|
|
310
|
+
files, err := fs.ReadDir(dir)
|
|
311
|
+
if err != nil {
|
|
312
|
+
panic(err)
|
|
313
|
+
}
|
|
314
|
+
skipNames := map[string]struct{}{}
|
|
315
|
+
for _, file := range files {
|
|
316
|
+
if file.IsDir() || !strings.HasSuffix(file.Name(), ".sql") {
|
|
317
|
+
// do nothing
|
|
318
|
+
} else if _, skip := skipNames[file.Name()]; skip {
|
|
319
|
+
// also do nothing
|
|
320
|
+
} else if splitName := splitFileNameRegex.FindStringSubmatch(file.Name()); splitName != nil {
|
|
321
|
+
from, to, compat, message, txn, fn := parseSplitSQLUpgrade(splitName[1], fs, skipNames)
|
|
322
|
+
ut.Register(from, to, compat, message, txn, fn)
|
|
323
|
+
} else if data, err := fs.ReadFile(filepath.Join(dir, file.Name())); err != nil {
|
|
324
|
+
panic(err)
|
|
325
|
+
} else if from, to, compat, message, txn, lines, err := parseFileHeader(data); err != nil {
|
|
326
|
+
panic(fmt.Errorf("failed to parse header in %s: %w", file.Name(), err))
|
|
327
|
+
} else {
|
|
328
|
+
ut.Register(from, to, compat, message, txn, sqlUpgradeFunc(file.Name(), lines))
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) 2022 Tulir Asokan
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exerrors
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"errors"
|
|
11
|
+
"fmt"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
type DualError struct {
|
|
15
|
+
High error
|
|
16
|
+
Low error
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func NewDualError(high, low error) DualError {
|
|
20
|
+
return DualError{high, low}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func (err DualError) Is(other error) bool {
|
|
24
|
+
return errors.Is(other, err.High) || errors.Is(other, err.Low)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func (err DualError) Unwrap() error {
|
|
28
|
+
return err.Low
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func (err DualError) Error() string {
|
|
32
|
+
return fmt.Sprintf("%v: %v", err.High, err.Low)
|
|
33
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright (c) 2024 Tulir Asokan
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exerrors
|
|
8
|
+
|
|
9
|
+
func Must[T any](val T, err error) T {
|
|
10
|
+
PanicIfNotNil(err)
|
|
11
|
+
return val
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
func Must2[T any, T2 any](val T, val2 T2, err error) (T, T2) {
|
|
15
|
+
PanicIfNotNil(err)
|
|
16
|
+
return val, val2
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func PanicIfNotNil(err error) {
|
|
20
|
+
if err != nil {
|
|
21
|
+
panic(err)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Copyright (c) 2024 Sumner Evans
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exhttp
|
|
8
|
+
|
|
9
|
+
import "net/http"
|
|
10
|
+
|
|
11
|
+
func AddCORSHeaders(w http.ResponseWriter) {
|
|
12
|
+
// Recommended CORS headers can be found in https://spec.matrix.org/v1.3/client-server-api/#web-browser-clients
|
|
13
|
+
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
14
|
+
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
|
|
15
|
+
w.Header().Set("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Authorization")
|
|
16
|
+
w.Header().Set("Content-Security-Policy", "sandbox; default-src 'none'; script-src 'none'; plugin-types application/pdf; style-src 'unsafe-inline'; object-src 'self';")
|
|
17
|
+
// Allow browsers to cache above for 1 day
|
|
18
|
+
w.Header().Set("Access-Control-Max-Age", "86400")
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// CORSMiddleware adds CORS headers to the response and handles OPTIONS
|
|
22
|
+
// requests by returning 200 OK immediately.
|
|
23
|
+
func CORSMiddleware(next http.Handler) http.Handler {
|
|
24
|
+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
25
|
+
AddCORSHeaders(w)
|
|
26
|
+
if r.Method == http.MethodOptions {
|
|
27
|
+
w.WriteHeader(http.StatusOK)
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
next.ServeHTTP(w, r)
|
|
31
|
+
})
|
|
32
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Copyright (c) 2024 Sumner Evans
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exhttp
|
|
8
|
+
|
|
9
|
+
import "net/http"
|
|
10
|
+
|
|
11
|
+
type ErrorBodyGenerators struct {
|
|
12
|
+
NotFound func() []byte
|
|
13
|
+
MethodNotAllowed func() []byte
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
func HandleErrors(next http.Handler, gen ErrorBodyGenerators) http.Handler {
|
|
17
|
+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
18
|
+
next.ServeHTTP(&bodyOverrider{
|
|
19
|
+
ResponseWriter: w,
|
|
20
|
+
statusNotFoundBodyGenerator: gen.NotFound,
|
|
21
|
+
statusMethodNotAllowedBodyGenerator: gen.MethodNotAllowed,
|
|
22
|
+
}, r)
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type bodyOverrider struct {
|
|
27
|
+
http.ResponseWriter
|
|
28
|
+
|
|
29
|
+
code int
|
|
30
|
+
override bool
|
|
31
|
+
|
|
32
|
+
statusNotFoundBodyGenerator func() []byte
|
|
33
|
+
statusMethodNotAllowedBodyGenerator func() []byte
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
var _ http.ResponseWriter = (*bodyOverrider)(nil)
|
|
37
|
+
|
|
38
|
+
func (b *bodyOverrider) WriteHeader(code int) {
|
|
39
|
+
if b.Header().Get("Content-Type") == "text/plain; charset=utf-8" {
|
|
40
|
+
b.Header().Set("Content-Type", "application/json")
|
|
41
|
+
|
|
42
|
+
b.override = true
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
b.code = code
|
|
46
|
+
b.ResponseWriter.WriteHeader(code)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func (b *bodyOverrider) Write(body []byte) (int, error) {
|
|
50
|
+
if b.override {
|
|
51
|
+
switch b.code {
|
|
52
|
+
case http.StatusNotFound:
|
|
53
|
+
if b.statusNotFoundBodyGenerator != nil {
|
|
54
|
+
body = b.statusNotFoundBodyGenerator()
|
|
55
|
+
}
|
|
56
|
+
case http.StatusMethodNotAllowed:
|
|
57
|
+
if b.statusMethodNotAllowedBodyGenerator != nil {
|
|
58
|
+
body = b.statusMethodNotAllowedBodyGenerator()
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return b.ResponseWriter.Write(body)
|
|
64
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright (c) 2024 Sumner Evans
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exhttp
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"encoding/json"
|
|
11
|
+
"net/http"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
var AutoAllowCORS = true
|
|
15
|
+
|
|
16
|
+
func WriteJSONResponse(w http.ResponseWriter, httpStatusCode int, jsonData any) {
|
|
17
|
+
if AutoAllowCORS {
|
|
18
|
+
AddCORSHeaders(w)
|
|
19
|
+
}
|
|
20
|
+
w.Header().Set("Content-Type", "application/json")
|
|
21
|
+
w.WriteHeader(httpStatusCode)
|
|
22
|
+
_ = json.NewEncoder(w).Encode(jsonData)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
func WriteJSONData(w http.ResponseWriter, httpStatusCode int, data []byte) {
|
|
26
|
+
if AutoAllowCORS {
|
|
27
|
+
AddCORSHeaders(w)
|
|
28
|
+
}
|
|
29
|
+
w.Header().Set("Content-Type", "application/json")
|
|
30
|
+
w.WriteHeader(httpStatusCode)
|
|
31
|
+
_, _ = w.Write(data)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func WriteEmptyJSONResponse(w http.ResponseWriter, httpStatusCode int) {
|
|
35
|
+
WriteJSONData(w, httpStatusCode, []byte("{}"))
|
|
36
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright (c) 2024 Sumner Evans
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exhttp
|
|
8
|
+
|
|
9
|
+
import "net/http"
|
|
10
|
+
|
|
11
|
+
// Middleware represents a middleware that can be applied to an [http.Handler].
|
|
12
|
+
type Middleware func(http.Handler) http.Handler
|
|
13
|
+
|
|
14
|
+
// ApplyMiddleware applies the provided [Middleware] functions to the given
|
|
15
|
+
// router. The middlewares will be applied in the order they are provided.
|
|
16
|
+
func ApplyMiddleware(router http.Handler, middlewares ...Middleware) http.Handler {
|
|
17
|
+
// Apply middlewares in reverse order because the first middleware provided
|
|
18
|
+
// needs to be the outermost one.
|
|
19
|
+
for i := len(middlewares) - 1; i >= 0; i-- {
|
|
20
|
+
router = middlewares[i](router)
|
|
21
|
+
}
|
|
22
|
+
return router
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// StripPrefix is a wrapper for [http.StripPrefix] is compatible with the middleware pattern.
|
|
26
|
+
func StripPrefix(prefix string) Middleware {
|
|
27
|
+
return func(next http.Handler) http.Handler {
|
|
28
|
+
return http.StripPrefix(prefix, next)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Copyright (c) 2025 Toni Spets
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exhttp
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"errors"
|
|
11
|
+
"net"
|
|
12
|
+
"syscall"
|
|
13
|
+
|
|
14
|
+
"golang.org/x/net/http2"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
func IsNetworkError(err error) bool {
|
|
18
|
+
if errno := syscall.Errno(0); errors.As(err, &errno) {
|
|
19
|
+
// common errnos for network related operations
|
|
20
|
+
return errno == syscall.ENETDOWN ||
|
|
21
|
+
errno == syscall.ENETUNREACH ||
|
|
22
|
+
errno == syscall.ENETRESET ||
|
|
23
|
+
errno == syscall.ECONNABORTED ||
|
|
24
|
+
errno == syscall.ECONNRESET ||
|
|
25
|
+
errno == syscall.ENOBUFS ||
|
|
26
|
+
errno == syscall.ETIMEDOUT ||
|
|
27
|
+
errno == syscall.ECONNREFUSED ||
|
|
28
|
+
errno == syscall.EHOSTDOWN ||
|
|
29
|
+
errno == syscall.EHOSTUNREACH
|
|
30
|
+
} else if netError := net.Error(nil); errors.As(err, &netError) {
|
|
31
|
+
return true
|
|
32
|
+
} else if errors.As(err, &http2.StreamError{}) {
|
|
33
|
+
return true
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return false
|
|
37
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Copyright (c) 2025 Tulir Asokan
|
|
2
|
+
//
|
|
3
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
4
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
5
|
+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
6
|
+
|
|
7
|
+
package exstrings
|
|
8
|
+
|
|
9
|
+
import (
|
|
10
|
+
"crypto/sha256"
|
|
11
|
+
"crypto/subtle"
|
|
12
|
+
"strings"
|
|
13
|
+
"unsafe"
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
// UnsafeBytes returns a byte slice that points to the same memory as the input string.
|
|
17
|
+
//
|
|
18
|
+
// The returned byte slice must not be modified.
|
|
19
|
+
func UnsafeBytes(str string) []byte {
|
|
20
|
+
return unsafe.Slice(unsafe.StringData(str), len(str))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// SHA256 returns the SHA-256 hash of the input string without copying the string.
|
|
24
|
+
func SHA256(str string) [32]byte {
|
|
25
|
+
return sha256.Sum256(UnsafeBytes(str))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ConstantTimeEqual compares two strings using [subtle.ConstantTimeCompare] without copying the strings.
|
|
29
|
+
//
|
|
30
|
+
// Note that ConstantTimeCompare is not constant time if the strings are of different length.
|
|
31
|
+
func ConstantTimeEqual(a, b string) bool {
|
|
32
|
+
return subtle.ConstantTimeCompare(UnsafeBytes(a), UnsafeBytes(b)) == 1
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// LongestSequenceOf returns the length of the longest contiguous sequence of a single rune in a string.
|
|
36
|
+
func LongestSequenceOf(a string, b rune) int {
|
|
37
|
+
// IndexRune has some optimizations, so use it to find the starting point
|
|
38
|
+
firstIndex := strings.IndexRune(a, b)
|
|
39
|
+
if firstIndex == -1 {
|
|
40
|
+
return 0
|
|
41
|
+
}
|
|
42
|
+
count := 0
|
|
43
|
+
maxCount := 0
|
|
44
|
+
for _, r := range a[firstIndex:] {
|
|
45
|
+
if r == b {
|
|
46
|
+
count++
|
|
47
|
+
if count > maxCount {
|
|
48
|
+
maxCount = count
|
|
49
|
+
}
|
|
50
|
+
} else {
|
|
51
|
+
count = 0
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return maxCount
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// LongestSequenceOfFunc returns the length of the longest contiguous sequence of runes in a string.
|
|
58
|
+
//
|
|
59
|
+
// If the provided function returns zero or higher, the return value is added to the current count.
|
|
60
|
+
// If the return value is negative, the count is reset to zero.
|
|
61
|
+
func LongestSequenceOfFunc(a string, fn func(b rune) int) int {
|
|
62
|
+
count := 0
|
|
63
|
+
maxCount := 0
|
|
64
|
+
for _, r := range a {
|
|
65
|
+
val := fn(r)
|
|
66
|
+
if val < 0 {
|
|
67
|
+
count = 0
|
|
68
|
+
} else {
|
|
69
|
+
count += val
|
|
70
|
+
if count > maxCount {
|
|
71
|
+
maxCount = count
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return maxCount
|
|
76
|
+
}
|