matrix-js-sdk 41.8.0 → 41.9.0
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.
- package/CHANGELOG.md +11 -0
- package/README.md +1 -1
- package/lib/@types/AESEncryptedSecretStoragePayload.js +3 -1
- package/lib/@types/IIdentityServerProvider.js +3 -1
- package/lib/@types/PushRules.js +7 -7
- package/lib/@types/PushRules.js.map +1 -1
- package/lib/@types/auth.js +4 -4
- package/lib/@types/auth.js.map +1 -1
- package/lib/@types/beacon.js +2 -2
- package/lib/@types/beacon.js.map +1 -1
- package/lib/@types/common.js +3 -1
- package/lib/@types/crypto.js +3 -1
- package/lib/@types/event.js +20 -20
- package/lib/@types/event.js.map +1 -1
- package/lib/@types/events.js +3 -1
- package/lib/@types/extensible_events.js +6 -6
- package/lib/@types/extensible_events.js.map +1 -1
- package/lib/@types/global.d.js.map +1 -1
- package/lib/@types/json.js +3 -1
- package/lib/@types/local_notifications.js +3 -1
- package/lib/@types/location.js +4 -4
- package/lib/@types/location.js.map +1 -1
- package/lib/@types/matrix-sdk-crypto-wasm.d.js +3 -1
- package/lib/@types/media.js +3 -1
- package/lib/@types/membership.js +1 -1
- package/lib/@types/membership.js.map +1 -1
- package/lib/@types/partials.js +6 -6
- package/lib/@types/partials.js.map +1 -1
- package/lib/@types/polls.js +5 -5
- package/lib/@types/polls.js.map +1 -1
- package/lib/@types/read_receipts.js +2 -2
- package/lib/@types/read_receipts.js.map +1 -1
- package/lib/@types/registration.js +3 -1
- package/lib/@types/requests.js +1 -1
- package/lib/@types/requests.js.map +1 -1
- package/lib/@types/retention.js +1 -1
- package/lib/@types/retention.js.map +1 -1
- package/lib/@types/search.js +1 -1
- package/lib/@types/search.js.map +1 -1
- package/lib/@types/signed.js +3 -1
- package/lib/@types/spaces.js +3 -1
- package/lib/@types/state_events.js +3 -1
- package/lib/@types/synapse.js +3 -1
- package/lib/@types/sync.js +1 -1
- package/lib/@types/sync.js.map +1 -1
- package/lib/@types/threepids.js +1 -1
- package/lib/@types/threepids.js.map +1 -1
- package/lib/@types/topic.js +1 -1
- package/lib/@types/topic.js.map +1 -1
- package/lib/@types/uia.js +3 -1
- package/lib/NamespacedValue.js +8 -8
- package/lib/NamespacedValue.js.map +1 -1
- package/lib/ReEmitter.js +9 -16
- package/lib/ReEmitter.js.map +1 -1
- package/lib/ToDeviceMessageQueue.js +49 -57
- package/lib/ToDeviceMessageQueue.js.map +1 -1
- package/lib/autodiscovery.js +232 -247
- package/lib/autodiscovery.js.map +1 -1
- package/lib/base64.js +1 -1
- package/lib/base64.js.map +1 -1
- package/lib/browser-index.d.ts +2 -2
- package/lib/browser-index.d.ts.map +1 -1
- package/lib/browser-index.js +5 -5
- package/lib/browser-index.js.map +1 -1
- package/lib/capabilityPoller.js +19 -22
- package/lib/capabilityPoller.js.map +1 -1
- package/lib/client.d.ts +2 -8
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +2043 -2487
- package/lib/client.js.map +1 -1
- package/lib/common-crypto/CryptoBackend.js +2 -2
- package/lib/common-crypto/CryptoBackend.js.map +1 -1
- package/lib/common-crypto/key-passphrase.js.map +1 -1
- package/lib/content-helpers.js +43 -48
- package/lib/content-helpers.js.map +1 -1
- package/lib/content-repo.js +14 -24
- package/lib/content-repo.js.map +1 -1
- package/lib/crypto/store/base.js +6 -6
- package/lib/crypto/store/base.js.map +1 -1
- package/lib/crypto/store/indexeddb-crypto-store-backend.js +190 -238
- package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
- package/lib/crypto/store/indexeddb-crypto-store.js +25 -30
- package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
- package/lib/crypto/store/localStorage-crypto-store.js +113 -145
- package/lib/crypto/store/localStorage-crypto-store.js.map +1 -1
- package/lib/crypto/store/memory-crypto-store.js +74 -105
- package/lib/crypto/store/memory-crypto-store.js.map +1 -1
- package/lib/crypto-api/CryptoEvent.js +1 -1
- package/lib/crypto-api/CryptoEvent.js.map +1 -1
- package/lib/crypto-api/CryptoEventHandlerMap.js +3 -1
- package/lib/crypto-api/index.d.ts +15 -6
- package/lib/crypto-api/index.d.ts.map +1 -1
- package/lib/crypto-api/index.js +22 -22
- package/lib/crypto-api/index.js.map +1 -1
- package/lib/crypto-api/key-passphrase.js +15 -23
- package/lib/crypto-api/key-passphrase.js.map +1 -1
- package/lib/crypto-api/keybackup.js +3 -1
- package/lib/crypto-api/recovery-key.js +11 -12
- package/lib/crypto-api/recovery-key.js.map +1 -1
- package/lib/crypto-api/verification.js +3 -3
- package/lib/crypto-api/verification.js.map +1 -1
- package/lib/digest.js +7 -14
- package/lib/digest.js.map +1 -1
- package/lib/embedded.d.ts.map +1 -1
- package/lib/embedded.js +380 -505
- package/lib/embedded.js.map +1 -1
- package/lib/errors.js +2 -2
- package/lib/errors.js.map +1 -1
- package/lib/event-mapper.js +10 -12
- package/lib/event-mapper.js.map +1 -1
- package/lib/extensible_events_v1/ExtensibleEvent.js.map +1 -1
- package/lib/extensible_events_v1/InvalidEventError.js.map +1 -1
- package/lib/extensible_events_v1/MessageEvent.js +11 -13
- package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollEndEvent.js +3 -4
- package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollResponseEvent.js +5 -6
- package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollStartEvent.js +8 -10
- package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
- package/lib/extensible_events_v1/utilities.js.map +1 -1
- package/lib/feature.js +18 -31
- package/lib/feature.js.map +1 -1
- package/lib/filter-component.d.ts.map +1 -1
- package/lib/filter-component.js +20 -26
- package/lib/filter-component.js.map +1 -1
- package/lib/filter.js +14 -17
- package/lib/filter.js.map +1 -1
- package/lib/http-api/errors.js +28 -43
- package/lib/http-api/errors.js.map +1 -1
- package/lib/http-api/fetch.js +141 -159
- package/lib/http-api/fetch.js.map +1 -1
- package/lib/http-api/index.js +17 -20
- package/lib/http-api/index.js.map +1 -1
- package/lib/http-api/interface.js +1 -1
- package/lib/http-api/interface.js.map +1 -1
- package/lib/http-api/method.js +1 -1
- package/lib/http-api/method.js.map +1 -1
- package/lib/http-api/prefix.js +3 -3
- package/lib/http-api/prefix.js.map +1 -1
- package/lib/http-api/refresh.js +74 -94
- package/lib/http-api/refresh.js.map +1 -1
- package/lib/http-api/utils.d.ts +1 -1
- package/lib/http-api/utils.d.ts.map +1 -1
- package/lib/http-api/utils.js +34 -42
- package/lib/http-api/utils.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/indexeddb-helpers.js +3 -3
- package/lib/indexeddb-helpers.js.map +1 -1
- package/lib/indexeddb-worker.js.map +1 -1
- package/lib/interactive-auth.d.ts +5 -5
- package/lib/interactive-auth.d.ts.map +1 -1
- package/lib/interactive-auth.js +172 -204
- package/lib/interactive-auth.js.map +1 -1
- package/lib/logger.js +21 -57
- package/lib/logger.js.map +1 -1
- package/lib/matrix.js +7 -11
- package/lib/matrix.js.map +1 -1
- package/lib/matrixrtc/CallMembership.js +80 -74
- package/lib/matrixrtc/CallMembership.js.map +1 -1
- package/lib/matrixrtc/EncryptionManager.js +1 -1
- package/lib/matrixrtc/EncryptionManager.js.map +1 -1
- package/lib/matrixrtc/IKeyTransport.js +1 -1
- package/lib/matrixrtc/IKeyTransport.js.map +1 -1
- package/lib/matrixrtc/IMembershipManager.js +1 -1
- package/lib/matrixrtc/IMembershipManager.js.map +1 -1
- package/lib/matrixrtc/LivekitTransport.d.ts +1 -1
- package/lib/matrixrtc/LivekitTransport.js +4 -4
- package/lib/matrixrtc/LivekitTransport.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.js +137 -187
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.js +36 -41
- package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
- package/lib/matrixrtc/MembershipManager.js +332 -378
- package/lib/matrixrtc/MembershipManager.js.map +1 -1
- package/lib/matrixrtc/MembershipManagerActionScheduler.js +54 -63
- package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
- package/lib/matrixrtc/RTCEncryptionManager.js +119 -143
- package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
- package/lib/matrixrtc/ToDeviceKeyTransport.js +53 -58
- package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
- package/lib/matrixrtc/index.js.map +1 -1
- package/lib/matrixrtc/membershipData/common.js +1 -1
- package/lib/matrixrtc/membershipData/common.js.map +1 -1
- package/lib/matrixrtc/membershipData/index.js.map +1 -1
- package/lib/matrixrtc/membershipData/rtc.js +15 -23
- package/lib/matrixrtc/membershipData/rtc.js.map +1 -1
- package/lib/matrixrtc/membershipData/session.js +4 -5
- package/lib/matrixrtc/membershipData/session.js.map +1 -1
- package/lib/matrixrtc/types.js +4 -6
- package/lib/matrixrtc/types.js.map +1 -1
- package/lib/matrixrtc/utils.js +4 -11
- package/lib/matrixrtc/utils.js.map +1 -1
- package/lib/models/MSC3089Branch.js +91 -116
- package/lib/models/MSC3089Branch.js.map +1 -1
- package/lib/models/MSC3089TreeSpace.js +209 -245
- package/lib/models/MSC3089TreeSpace.js.map +1 -1
- package/lib/models/ToDeviceMessage.js +3 -1
- package/lib/models/beacon.js +14 -13
- package/lib/models/beacon.js.map +1 -1
- package/lib/models/compare-event-ordering.js +13 -13
- package/lib/models/compare-event-ordering.js.map +1 -1
- package/lib/models/device.js +3 -3
- package/lib/models/device.js.map +1 -1
- package/lib/models/event-context.js +5 -8
- package/lib/models/event-context.js.map +1 -1
- package/lib/models/event-status.js +1 -1
- package/lib/models/event-status.js.map +1 -1
- package/lib/models/event-timeline-set.js +88 -94
- package/lib/models/event-timeline-set.js.map +1 -1
- package/lib/models/event-timeline.js +28 -30
- package/lib/models/event-timeline.js.map +1 -1
- package/lib/models/event.js +182 -226
- package/lib/models/event.js.map +1 -1
- package/lib/models/invites-ignorer-types.js +4 -4
- package/lib/models/invites-ignorer-types.js.map +1 -1
- package/lib/models/invites-ignorer.js +159 -179
- package/lib/models/invites-ignorer.js.map +1 -1
- package/lib/models/poll.js +71 -81
- package/lib/models/poll.js.map +1 -1
- package/lib/models/profile-keys.js +2 -2
- package/lib/models/profile-keys.js.map +1 -1
- package/lib/models/read-receipt.js +40 -56
- package/lib/models/read-receipt.js.map +1 -1
- package/lib/models/related-relations.js.map +1 -1
- package/lib/models/relations-container.js +22 -23
- package/lib/models/relations-container.js.map +1 -1
- package/lib/models/relations.js +133 -159
- package/lib/models/relations.js.map +1 -1
- package/lib/models/room-member.js +24 -29
- package/lib/models/room-member.js.map +1 -1
- package/lib/models/room-receipts.js +29 -43
- package/lib/models/room-receipts.js.map +1 -1
- package/lib/models/room-retention.js +74 -83
- package/lib/models/room-retention.js.map +1 -1
- package/lib/models/room-state.js +143 -172
- package/lib/models/room-state.js.map +1 -1
- package/lib/models/room-sticky-events.d.ts +1 -0
- package/lib/models/room-sticky-events.d.ts.map +1 -1
- package/lib/models/room-sticky-events.js +45 -65
- package/lib/models/room-sticky-events.js.map +1 -1
- package/lib/models/room-summary.js.map +1 -1
- package/lib/models/room.d.ts.map +1 -1
- package/lib/models/room.js +765 -909
- package/lib/models/room.js.map +1 -1
- package/lib/models/search-result.js +5 -5
- package/lib/models/search-result.js.map +1 -1
- package/lib/models/thread.js +225 -285
- package/lib/models/thread.js.map +1 -1
- package/lib/models/typed-event-emitter.js +7 -18
- package/lib/models/typed-event-emitter.js.map +1 -1
- package/lib/models/user.js +8 -8
- package/lib/models/user.js.map +1 -1
- package/lib/oidc/authorize.js +208 -241
- package/lib/oidc/authorize.js.map +1 -1
- package/lib/oidc/discovery.js +23 -36
- package/lib/oidc/discovery.js.map +1 -1
- package/lib/oidc/error.js +1 -1
- package/lib/oidc/error.js.map +1 -1
- package/lib/oidc/index.js +1 -0
- package/lib/oidc/index.js.map +1 -1
- package/lib/oidc/register.js +60 -66
- package/lib/oidc/register.js.map +1 -1
- package/lib/oidc/tokenRefresher.js +77 -91
- package/lib/oidc/tokenRefresher.js.map +1 -1
- package/lib/oidc/validate.js +18 -18
- package/lib/oidc/validate.js.map +1 -1
- package/lib/pushprocessor.js +71 -82
- package/lib/pushprocessor.js.map +1 -1
- package/lib/randomstring.js +9 -9
- package/lib/randomstring.js.map +1 -1
- package/lib/realtime-callbacks.js +25 -28
- package/lib/realtime-callbacks.js.map +1 -1
- package/lib/receipt-accumulator.d.ts +2 -0
- package/lib/receipt-accumulator.d.ts.map +1 -1
- package/lib/receipt-accumulator.js +14 -22
- package/lib/receipt-accumulator.js.map +1 -1
- package/lib/rendezvous/MSC4108SignInWithQR.js +271 -302
- package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
- package/lib/rendezvous/RendezvousChannel.js +3 -1
- package/lib/rendezvous/RendezvousCode.js +3 -1
- package/lib/rendezvous/RendezvousError.js.map +1 -1
- package/lib/rendezvous/RendezvousFailureReason.js +2 -2
- package/lib/rendezvous/RendezvousFailureReason.js.map +1 -1
- package/lib/rendezvous/RendezvousIntent.js +1 -1
- package/lib/rendezvous/RendezvousIntent.js.map +1 -1
- package/lib/rendezvous/RendezvousTransport.js +3 -1
- package/lib/rendezvous/channels/MSC4108SecureChannel.js +123 -147
- package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
- package/lib/rendezvous/index.js +44 -69
- package/lib/rendezvous/index.js.map +1 -1
- package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +1 -1
- package/lib/rendezvous/transports/MSC4108RendezvousSession.js +134 -152
- package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
- package/lib/retentionPolicy.js +6 -9
- package/lib/retentionPolicy.js.map +1 -1
- package/lib/room-hierarchy.js +52 -60
- package/lib/room-hierarchy.js.map +1 -1
- package/lib/rust-crypto/CrossSigningIdentity.js +94 -104
- package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
- package/lib/rust-crypto/DehydratedDeviceManager.js +157 -190
- package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
- package/lib/rust-crypto/KeyClaimManager.js +18 -22
- package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.js +109 -139
- package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
- package/lib/rust-crypto/OutgoingRequestsManager.js +66 -80
- package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
- package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +1 -1
- package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +196 -224
- package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
- package/lib/rust-crypto/RoomEncryptor.js +127 -143
- package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
- package/lib/rust-crypto/backup.js +453 -549
- package/lib/rust-crypto/backup.js.map +1 -1
- package/lib/rust-crypto/constants.js +1 -1
- package/lib/rust-crypto/constants.js.map +1 -1
- package/lib/rust-crypto/device-converter.js +15 -28
- package/lib/rust-crypto/device-converter.js.map +1 -1
- package/lib/rust-crypto/index.js +103 -116
- package/lib/rust-crypto/index.js.map +1 -1
- package/lib/rust-crypto/libolm_migration.js +303 -365
- package/lib/rust-crypto/libolm_migration.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.d.ts +5 -1
- package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +1067 -1332
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/lib/rust-crypto/secret-storage.js +12 -25
- package/lib/rust-crypto/secret-storage.js.map +1 -1
- package/lib/rust-crypto/verification.js +137 -189
- package/lib/rust-crypto/verification.js.map +1 -1
- package/lib/scheduler.js +44 -19
- package/lib/scheduler.js.map +1 -1
- package/lib/secret-storage.js +179 -213
- package/lib/secret-storage.js.map +1 -1
- package/lib/serverCapabilities.js +6 -9
- package/lib/serverCapabilities.js.map +1 -1
- package/lib/service-types.js +1 -1
- package/lib/service-types.js.map +1 -1
- package/lib/sliding-sync-sdk.d.ts.map +1 -1
- package/lib/sliding-sync-sdk.js +368 -424
- package/lib/sliding-sync-sdk.js.map +1 -1
- package/lib/sliding-sync.js +135 -171
- package/lib/sliding-sync.js.map +1 -1
- package/lib/store/index.js +3 -1
- package/lib/store/indexeddb-backend.js +3 -1
- package/lib/store/indexeddb-local-backend.js +194 -253
- package/lib/store/indexeddb-local-backend.js.map +1 -1
- package/lib/store/indexeddb-remote-backend.js +33 -63
- package/lib/store/indexeddb-remote-backend.js.map +1 -1
- package/lib/store/indexeddb-store-worker.js +22 -23
- package/lib/store/indexeddb-store-worker.js.map +1 -1
- package/lib/store/indexeddb.js +44 -71
- package/lib/store/indexeddb.js.map +1 -1
- package/lib/store/local-storage-events-emitter.js +2 -2
- package/lib/store/local-storage-events-emitter.js.map +1 -1
- package/lib/store/memory.js +34 -57
- package/lib/store/memory.js.map +1 -1
- package/lib/store/stub.js +22 -35
- package/lib/store/stub.js.map +1 -1
- package/lib/sync-accumulator.js +54 -66
- package/lib/sync-accumulator.js.map +1 -1
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +905 -998
- package/lib/sync.js.map +1 -1
- package/lib/testing.js +63 -105
- package/lib/testing.js.map +1 -1
- package/lib/thread-utils.js +1 -4
- package/lib/thread-utils.js.map +1 -1
- package/lib/timeline-window.js +89 -102
- package/lib/timeline-window.js.map +1 -1
- package/lib/types.js +1 -1
- package/lib/types.js.map +1 -1
- package/lib/utils/decryptAESSecretStorageItem.js +14 -25
- package/lib/utils/decryptAESSecretStorageItem.js.map +1 -1
- package/lib/utils/encryptAESSecretStorageItem.js +27 -38
- package/lib/utils/encryptAESSecretStorageItem.js.map +1 -1
- package/lib/utils/internal/deriveKeys.js +25 -32
- package/lib/utils/internal/deriveKeys.js.map +1 -1
- package/lib/utils/roomVersion.js +1 -1
- package/lib/utils/roomVersion.js.map +1 -1
- package/lib/utils.js +83 -135
- package/lib/utils.js.map +1 -1
- package/lib/version-support.js +3 -3
- package/lib/version-support.js.map +1 -1
- package/lib/webrtc/audioContext.js +5 -6
- package/lib/webrtc/audioContext.js.map +1 -1
- package/lib/webrtc/call.js +1081 -1250
- package/lib/webrtc/call.js.map +1 -1
- package/lib/webrtc/callEventHandler.js +202 -214
- package/lib/webrtc/callEventHandler.js.map +1 -1
- package/lib/webrtc/callEventTypes.js +2 -2
- package/lib/webrtc/callEventTypes.js.map +1 -1
- package/lib/webrtc/callFeed.js +18 -20
- package/lib/webrtc/callFeed.js.map +1 -1
- package/lib/webrtc/groupCall.js +513 -602
- package/lib/webrtc/groupCall.js.map +1 -1
- package/lib/webrtc/groupCallEventHandler.js +59 -62
- package/lib/webrtc/groupCallEventHandler.js.map +1 -1
- package/lib/webrtc/mediaHandler.js +198 -232
- package/lib/webrtc/mediaHandler.js.map +1 -1
- package/lib/webrtc/stats/callFeedStatsReporter.js +16 -20
- package/lib/webrtc/stats/callFeedStatsReporter.js.map +1 -1
- package/lib/webrtc/stats/callStatsReportGatherer.js +67 -75
- package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
- package/lib/webrtc/stats/callStatsReportSummary.js +3 -1
- package/lib/webrtc/stats/connectionStats.js.map +1 -1
- package/lib/webrtc/stats/connectionStatsBuilder.js +2 -2
- package/lib/webrtc/stats/connectionStatsBuilder.js.map +1 -1
- package/lib/webrtc/stats/connectionStatsReportBuilder.js +20 -24
- package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +1 -1
- package/lib/webrtc/stats/groupCallStats.js +6 -8
- package/lib/webrtc/stats/groupCallStats.js.map +1 -1
- package/lib/webrtc/stats/media/mediaSsrcHandler.js +7 -8
- package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackHandler.js +7 -9
- package/lib/webrtc/stats/media/mediaTrackHandler.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
- package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +7 -7
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
- package/lib/webrtc/stats/statsReport.js +1 -1
- package/lib/webrtc/stats/statsReport.js.map +1 -1
- package/lib/webrtc/stats/statsReportEmitter.js.map +1 -1
- package/lib/webrtc/stats/summaryStatsReportGatherer.js +14 -14
- package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +1 -1
- package/lib/webrtc/stats/trackStatsBuilder.js +32 -34
- package/lib/webrtc/stats/trackStatsBuilder.js.map +1 -1
- package/lib/webrtc/stats/transportStats.js +3 -1
- package/lib/webrtc/stats/transportStatsBuilder.js +9 -9
- package/lib/webrtc/stats/transportStatsBuilder.js.map +1 -1
- package/lib/webrtc/stats/valueFormatter.js +1 -1
- package/lib/webrtc/stats/valueFormatter.js.map +1 -1
- package/package.json +18 -33
- package/src/@types/global.d.ts +2 -2
- package/src/ToDeviceMessageQueue.ts +2 -2
- package/src/browser-index.ts +4 -4
- package/src/client.ts +15 -20
- package/src/crypto-api/index.ts +17 -6
- package/src/embedded.ts +4 -6
- package/src/filter-component.ts +1 -0
- package/src/http-api/utils.ts +1 -1
- package/src/interactive-auth.ts +11 -5
- package/src/matrixrtc/LivekitTransport.ts +1 -1
- package/src/matrixrtc/MatrixRTCSession.ts +1 -1
- package/src/models/MSC3089Branch.ts +1 -1
- package/src/models/room-sticky-events.ts +1 -0
- package/src/models/room.ts +9 -11
- package/src/receipt-accumulator.ts +2 -0
- package/src/rendezvous/index.ts +1 -1
- package/src/rendezvous/transports/MSC4108RendezvousSession.ts +2 -2
- package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +1 -1
- package/src/rust-crypto/index.ts +6 -6
- package/src/rust-crypto/rust-crypto.ts +31 -7
- package/src/rust-crypto/verification.ts +1 -1
- package/src/sliding-sync-sdk.ts +5 -7
- package/src/store/indexeddb-local-backend.ts +3 -3
- package/src/sync.ts +6 -8
package/lib/http-api/fetch.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
3
|
/*
|
|
6
4
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
7
5
|
|
|
@@ -30,16 +28,15 @@ import { anySignal, parseErrorResponse, timeoutSignal } from "./utils.js";
|
|
|
30
28
|
import { TokenRefresher, TokenRefreshOutcome } from "./refresh.js";
|
|
31
29
|
export class FetchHttpApi {
|
|
32
30
|
constructor(eventEmitter, opts) {
|
|
33
|
-
var _opts$useAuthorizatio;
|
|
34
|
-
this.eventEmitter = eventEmitter;
|
|
35
|
-
this.opts = opts;
|
|
36
31
|
_defineProperty(this, "abortController", new AbortController());
|
|
37
32
|
_defineProperty(this, "tokenRefresher", void 0);
|
|
33
|
+
this.eventEmitter = eventEmitter;
|
|
34
|
+
this.opts = opts;
|
|
38
35
|
checkObjectHasKeys(opts, ["baseUrl", "prefix"]);
|
|
39
36
|
if (!opts.onlyData) {
|
|
40
37
|
throw new Error("Constructing FetchHttpApi without `onlyData=true` is no longer supported.");
|
|
41
38
|
}
|
|
42
|
-
opts.useAuthorizationHeader =
|
|
39
|
+
opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;
|
|
43
40
|
this.tokenRefresher = new TokenRefresher(opts);
|
|
44
41
|
}
|
|
45
42
|
abort() {
|
|
@@ -64,20 +61,20 @@ export class FetchHttpApi {
|
|
|
64
61
|
if (!this.opts.idBaseUrl) {
|
|
65
62
|
throw new Error("No identity server base URL set");
|
|
66
63
|
}
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
let queryParams = undefined;
|
|
65
|
+
let body = undefined;
|
|
69
66
|
if (method === Method.Get) {
|
|
70
67
|
queryParams = params;
|
|
71
68
|
} else {
|
|
72
69
|
body = params;
|
|
73
70
|
}
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);
|
|
72
|
+
const opts = {
|
|
76
73
|
json: true,
|
|
77
74
|
headers: {}
|
|
78
75
|
};
|
|
79
76
|
if (accessToken) {
|
|
80
|
-
opts.headers.Authorization =
|
|
77
|
+
opts.headers.Authorization = `Bearer ${accessToken}`;
|
|
81
78
|
}
|
|
82
79
|
return this.requestOtherUrl(method, fullUri, body, opts);
|
|
83
80
|
}
|
|
@@ -100,66 +97,58 @@ export class FetchHttpApi {
|
|
|
100
97
|
* @returns The parsed response.
|
|
101
98
|
* @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.
|
|
102
99
|
*/
|
|
103
|
-
authedRequest(method, path) {
|
|
104
|
-
var queryParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
105
|
-
var body = arguments.length > 3 ? arguments[3] : undefined;
|
|
106
|
-
var paramOpts = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
100
|
+
authedRequest(method, path, queryParams = {}, body, paramOpts = {}) {
|
|
107
101
|
return this.doAuthedRequest(1, method, path, queryParams, body, paramOpts);
|
|
108
102
|
}
|
|
109
103
|
|
|
110
104
|
// Wrapper around public method authedRequest to allow for tracking retry attempt counts
|
|
111
|
-
doAuthedRequest(attempt, method, path, queryParams, body) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
// avoid mutating paramOpts so they can be used on retry
|
|
117
|
-
var opts = deepCopy(paramOpts);
|
|
118
|
-
// we have to manually copy the abortSignal over as it is not a plain object
|
|
119
|
-
opts.abortSignal = paramOpts.abortSignal;
|
|
105
|
+
async doAuthedRequest(attempt, method, path, queryParams, body, paramOpts = {}) {
|
|
106
|
+
// avoid mutating paramOpts so they can be used on retry
|
|
107
|
+
const opts = deepCopy(paramOpts);
|
|
108
|
+
// we have to manually copy the abortSignal over as it is not a plain object
|
|
109
|
+
opts.abortSignal = paramOpts.abortSignal;
|
|
120
110
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
if (!opts.headers.Authorization) {
|
|
129
|
-
opts.headers.Authorization = "Bearer ".concat(requestSnapshot.accessToken);
|
|
130
|
-
}
|
|
131
|
-
if (queryParams.access_token) {
|
|
132
|
-
delete queryParams.access_token;
|
|
133
|
-
}
|
|
134
|
-
} else if (!queryParams.access_token) {
|
|
135
|
-
queryParams.access_token = requestSnapshot.accessToken;
|
|
111
|
+
// Take a snapshot of the current token state before we start the request so we can reference it if we error
|
|
112
|
+
const requestSnapshot = await this.tokenRefresher.prepareForRequest();
|
|
113
|
+
if (requestSnapshot.accessToken) {
|
|
114
|
+
if (this.opts.useAuthorizationHeader) {
|
|
115
|
+
if (!opts.headers) {
|
|
116
|
+
opts.headers = {};
|
|
136
117
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
var response = yield _this.request(method, path, queryParams, body, opts);
|
|
140
|
-
return response;
|
|
141
|
-
} catch (error) {
|
|
142
|
-
if (!(error instanceof MatrixError)) {
|
|
143
|
-
throw error;
|
|
118
|
+
if (!opts.headers.Authorization) {
|
|
119
|
+
opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;
|
|
144
120
|
}
|
|
145
|
-
if (
|
|
146
|
-
|
|
147
|
-
if (outcome === TokenRefreshOutcome.Success) {
|
|
148
|
-
// if we got a new token retry the request
|
|
149
|
-
return _this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);
|
|
150
|
-
}
|
|
151
|
-
if (outcome === TokenRefreshOutcome.Failure) {
|
|
152
|
-
throw new TokenRefreshError(error);
|
|
153
|
-
}
|
|
154
|
-
if (!(opts !== null && opts !== void 0 && opts.inhibitLogoutEmit)) {
|
|
155
|
-
_this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);
|
|
156
|
-
}
|
|
157
|
-
} else if (error.errcode == "M_CONSENT_NOT_GIVEN") {
|
|
158
|
-
_this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);
|
|
121
|
+
if (queryParams.access_token) {
|
|
122
|
+
delete queryParams.access_token;
|
|
159
123
|
}
|
|
124
|
+
} else if (!queryParams.access_token) {
|
|
125
|
+
queryParams.access_token = requestSnapshot.accessToken;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const response = await this.request(method, path, queryParams, body, opts);
|
|
130
|
+
return response;
|
|
131
|
+
} catch (error) {
|
|
132
|
+
if (!(error instanceof MatrixError)) {
|
|
160
133
|
throw error;
|
|
161
134
|
}
|
|
162
|
-
|
|
135
|
+
if (error.errcode === "M_UNKNOWN_TOKEN") {
|
|
136
|
+
const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);
|
|
137
|
+
if (outcome === TokenRefreshOutcome.Success) {
|
|
138
|
+
// if we got a new token retry the request
|
|
139
|
+
return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);
|
|
140
|
+
}
|
|
141
|
+
if (outcome === TokenRefreshOutcome.Failure) {
|
|
142
|
+
throw new TokenRefreshError(error);
|
|
143
|
+
}
|
|
144
|
+
if (!opts?.inhibitLogoutEmit) {
|
|
145
|
+
this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);
|
|
146
|
+
}
|
|
147
|
+
} else if (error.errcode == "M_CONSENT_NOT_GIVEN") {
|
|
148
|
+
this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
163
152
|
}
|
|
164
153
|
|
|
165
154
|
/**
|
|
@@ -179,7 +168,7 @@ export class FetchHttpApi {
|
|
|
179
168
|
* @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.
|
|
180
169
|
*/
|
|
181
170
|
request(method, path, queryParams, body, opts) {
|
|
182
|
-
|
|
171
|
+
const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);
|
|
183
172
|
return this.requestOtherUrl(method, fullUri, body, opts);
|
|
184
173
|
}
|
|
185
174
|
|
|
@@ -195,115 +184,108 @@ export class FetchHttpApi {
|
|
|
195
184
|
* @returns The parsed response.
|
|
196
185
|
* @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.
|
|
197
186
|
*/
|
|
198
|
-
requestOtherUrl(method, url, body) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
var headers = Object.assign({}, opts.headers || {});
|
|
210
|
-
var jsonResponse = !opts.rawResponseBody && opts.json !== false;
|
|
211
|
-
if (jsonResponse) {
|
|
212
|
-
if (!headers["Accept"]) {
|
|
213
|
-
headers["Accept"] = "application/json";
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
var timeout = (_opts$localTimeoutMs = opts.localTimeoutMs) !== null && _opts$localTimeoutMs !== void 0 ? _opts$localTimeoutMs : _this2.opts.localTimeoutMs;
|
|
217
|
-
var keepAlive = (_opts$keepAlive = opts.keepAlive) !== null && _opts$keepAlive !== void 0 ? _opts$keepAlive : false;
|
|
218
|
-
var signals = [_this2.abortController.signal];
|
|
219
|
-
if (timeout !== undefined) {
|
|
220
|
-
signals.push(timeoutSignal(timeout));
|
|
221
|
-
}
|
|
222
|
-
if (opts.abortSignal) {
|
|
223
|
-
signals.push(opts.abortSignal);
|
|
187
|
+
async requestOtherUrl(method, url, body, opts = {}) {
|
|
188
|
+
if (opts.json !== undefined && opts.rawResponseBody !== undefined) {
|
|
189
|
+
throw new Error("Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`");
|
|
190
|
+
}
|
|
191
|
+
const urlForLogs = this.sanitizeUrlForLogs(url);
|
|
192
|
+
this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);
|
|
193
|
+
const headers = Object.assign({}, opts.headers || {});
|
|
194
|
+
const jsonResponse = !opts.rawResponseBody && opts.json !== false;
|
|
195
|
+
if (jsonResponse) {
|
|
196
|
+
if (!headers["Accept"]) {
|
|
197
|
+
headers["Accept"] = "application/json";
|
|
224
198
|
}
|
|
199
|
+
}
|
|
200
|
+
const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;
|
|
201
|
+
const keepAlive = opts.keepAlive ?? false;
|
|
202
|
+
const signals = [this.abortController.signal];
|
|
203
|
+
if (timeout !== undefined) {
|
|
204
|
+
signals.push(timeoutSignal(timeout));
|
|
205
|
+
}
|
|
206
|
+
if (opts.abortSignal) {
|
|
207
|
+
signals.push(opts.abortSignal);
|
|
208
|
+
}
|
|
225
209
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
235
|
-
} else {
|
|
236
|
-
data = body;
|
|
210
|
+
// If the body is an object, encode it as JSON and set the `Content-Type` header,
|
|
211
|
+
// unless that has been explicitly inhibited by setting `opts.json: false`.
|
|
212
|
+
// We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref
|
|
213
|
+
let data;
|
|
214
|
+
if (opts.json !== false && body?.constructor?.name === Object.name) {
|
|
215
|
+
data = JSON.stringify(body);
|
|
216
|
+
if (!headers["Content-Type"]) {
|
|
217
|
+
headers["Content-Type"] = "application/json";
|
|
237
218
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
219
|
+
} else {
|
|
220
|
+
data = body;
|
|
221
|
+
}
|
|
222
|
+
const {
|
|
223
|
+
signal,
|
|
224
|
+
cleanup
|
|
225
|
+
} = anySignal(signals);
|
|
241
226
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
if (e.name === "AbortError") {
|
|
272
|
-
throw e;
|
|
273
|
-
}
|
|
274
|
-
throw new ConnectionError("fetch failed", e);
|
|
275
|
-
} finally {
|
|
276
|
-
cleanup();
|
|
277
|
-
}
|
|
278
|
-
if (!res.ok) {
|
|
279
|
-
throw parseErrorResponse(res, yield res.text());
|
|
280
|
-
}
|
|
281
|
-
if (opts.rawResponseBody) {
|
|
282
|
-
return yield res.blob();
|
|
283
|
-
} else if (jsonResponse) {
|
|
284
|
-
return yield res.json();
|
|
285
|
-
} else {
|
|
286
|
-
return yield res.text();
|
|
227
|
+
// Set cache mode based on presence of Authorization header.
|
|
228
|
+
// Browsers/proxies do not cache responses to requests with Authorization headers.
|
|
229
|
+
// So specifying "no-cache" is redundant, and actually prevents caching
|
|
230
|
+
// of preflight requests in CORS scenarios. As such, we only set "no-cache"
|
|
231
|
+
// when there is no Authorization header.
|
|
232
|
+
const cacheMode = "Authorization" in headers ? undefined : "no-cache";
|
|
233
|
+
let res;
|
|
234
|
+
const start = Date.now();
|
|
235
|
+
try {
|
|
236
|
+
res = await this.fetch(url, {
|
|
237
|
+
signal,
|
|
238
|
+
method,
|
|
239
|
+
body: data,
|
|
240
|
+
headers,
|
|
241
|
+
mode: "cors",
|
|
242
|
+
redirect: "follow",
|
|
243
|
+
referrer: "",
|
|
244
|
+
referrerPolicy: "no-referrer",
|
|
245
|
+
cache: cacheMode,
|
|
246
|
+
credentials: "omit",
|
|
247
|
+
// we send credentials via headers
|
|
248
|
+
keepalive: keepAlive,
|
|
249
|
+
priority: opts.priority
|
|
250
|
+
});
|
|
251
|
+
this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`);
|
|
252
|
+
} catch (e) {
|
|
253
|
+
this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);
|
|
254
|
+
if (e.name === "AbortError") {
|
|
255
|
+
throw e;
|
|
287
256
|
}
|
|
288
|
-
|
|
257
|
+
throw new ConnectionError("fetch failed", e);
|
|
258
|
+
} finally {
|
|
259
|
+
cleanup();
|
|
260
|
+
}
|
|
261
|
+
if (!res.ok) {
|
|
262
|
+
throw parseErrorResponse(res, await res.text());
|
|
263
|
+
}
|
|
264
|
+
if (opts.rawResponseBody) {
|
|
265
|
+
return await res.blob();
|
|
266
|
+
} else if (jsonResponse) {
|
|
267
|
+
return await res.json();
|
|
268
|
+
} else {
|
|
269
|
+
return await res.text();
|
|
270
|
+
}
|
|
289
271
|
}
|
|
290
272
|
sanitizeUrlForLogs(url) {
|
|
291
273
|
try {
|
|
292
|
-
|
|
274
|
+
let asUrl;
|
|
293
275
|
if (typeof url === "string") {
|
|
294
276
|
asUrl = new URL(url);
|
|
295
277
|
} else {
|
|
296
278
|
asUrl = url;
|
|
297
279
|
}
|
|
298
280
|
// Remove the values of any URL params that could contain potential secrets
|
|
299
|
-
|
|
300
|
-
for (
|
|
281
|
+
const sanitizedQs = new URLSearchParams();
|
|
282
|
+
for (const key of asUrl.searchParams.keys()) {
|
|
301
283
|
sanitizedQs.append(key, "xxx");
|
|
302
284
|
}
|
|
303
|
-
|
|
304
|
-
|
|
285
|
+
const sanitizedQsString = sanitizedQs.toString();
|
|
286
|
+
const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : "";
|
|
305
287
|
return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;
|
|
306
|
-
} catch
|
|
288
|
+
} catch {
|
|
307
289
|
// defensive coding for malformed url
|
|
308
290
|
return "??";
|
|
309
291
|
}
|
|
@@ -317,12 +299,12 @@ export class FetchHttpApi {
|
|
|
317
299
|
* @returns URL
|
|
318
300
|
*/
|
|
319
301
|
getUrl(path, queryParams, prefix, baseUrl) {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
302
|
+
const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;
|
|
303
|
+
const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith("/") ? baseUrlWithFallback.slice(0, -1) : baseUrlWithFallback;
|
|
304
|
+
const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);
|
|
323
305
|
// If there are any params, encode and append them to the URL.
|
|
324
306
|
if (this.opts.extraParams || queryParams) {
|
|
325
|
-
|
|
307
|
+
const mergedParams = _objectSpread(_objectSpread({}, this.opts.extraParams), queryParams);
|
|
326
308
|
encodeParams(mergedParams, url.searchParams);
|
|
327
309
|
}
|
|
328
310
|
return url;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","names":["checkObjectHasKeys","deepCopy","encodeParams","Method","ConnectionError","MatrixError","TokenRefreshError","HttpApiEvent","anySignal","parseErrorResponse","timeoutSignal","TokenRefresher","TokenRefreshOutcome","FetchHttpApi","constructor","eventEmitter","opts","_opts$useAuthorizatio","_defineProperty","AbortController","onlyData","Error","useAuthorizationHeader","tokenRefresher","abort","abortController","fetch","resource","options","fetchFn","globalThis","setIdBaseUrl","url","idBaseUrl","idServerRequest","method","path","params","prefix","accessToken","queryParams","undefined","body","Get","fullUri","getUrl","json","headers","Authorization","concat","requestOtherUrl","authedRequest","arguments","length","paramOpts","doAuthedRequest","attempt","_arguments","_this","_asyncToGenerator","abortSignal","requestSnapshot","prepareForRequest","access_token","response","request","error","errcode","outcome","handleUnknownToken","Success","Failure","inhibitLogoutEmit","emit","SessionLoggedOut","NoConsent","message","data","consent_uri","baseUrl","_arguments2","_this2","_this2$opts$logger","_opts$localTimeoutMs","_opts$keepAlive","_body$constructor","rawResponseBody","urlForLogs","sanitizeUrlForLogs","logger","debug","Object","assign","jsonResponse","timeout","localTimeoutMs","keepAlive","signals","signal","push","name","JSON","stringify","_anySignal","cleanup","cacheMode","res","start","Date","now","_this2$opts$logger2","mode","redirect","referrer","referrerPolicy","cache","credentials","keepalive","priority","status","e","_this2$opts$logger3","ok","text","blob","asUrl","URL","sanitizedQs","URLSearchParams","key","searchParams","keys","append","sanitizedQsString","toString","sanitizedQsUrlPiece","origin","pathname","_unused","baseUrlWithFallback","baseUrlWithoutTrailingSlash","endsWith","slice","extraParams","mergedParams","_objectSpread"],"sources":["../../src/http-api/fetch.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nimport { checkObjectHasKeys, deepCopy, encodeParams } from \"../utils.ts\";\nimport { type TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { Method } from \"./method.ts\";\nimport { ConnectionError, MatrixError, TokenRefreshError } from \"./errors.ts\";\nimport {\n type BaseRequestOpts,\n HttpApiEvent,\n type HttpApiEventHandlerMap,\n type IHttpOpts,\n type IRequestOpts,\n type Body,\n} from \"./interface.ts\";\nimport { anySignal, parseErrorResponse, timeoutSignal } from \"./utils.ts\";\nimport { type QueryDict } from \"../utils.ts\";\nimport { TokenRefresher, TokenRefreshOutcome } from \"./refresh.ts\";\n\nexport class FetchHttpApi<O extends IHttpOpts> {\n private abortController = new AbortController();\n private readonly tokenRefresher: TokenRefresher;\n\n public constructor(\n private eventEmitter: TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>,\n public readonly opts: O,\n ) {\n checkObjectHasKeys(opts, [\"baseUrl\", \"prefix\"]);\n if (!opts.onlyData) {\n throw new Error(\"Constructing FetchHttpApi without `onlyData=true` is no longer supported.\");\n }\n opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;\n\n this.tokenRefresher = new TokenRefresher(opts);\n }\n\n public abort(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n public fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.opts.fetchFn) {\n return this.opts.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n /**\n * Sets the base URL for the identity server\n * @param url - The new base url\n */\n public setIdBaseUrl(url?: string): void {\n this.opts.idBaseUrl = url;\n }\n\n public idServerRequest<T extends object = Record<string, unknown>>(\n method: Method,\n path: string,\n params: Record<string, string | string[]> | undefined,\n prefix: string,\n accessToken?: string,\n ): Promise<T> {\n if (!this.opts.idBaseUrl) {\n throw new Error(\"No identity server base URL set\");\n }\n\n let queryParams: QueryDict | undefined = undefined;\n let body: Record<string, string | string[]> | undefined = undefined;\n if (method === Method.Get) {\n queryParams = params;\n } else {\n body = params;\n }\n\n const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);\n\n const opts: IRequestOpts = {\n json: true,\n headers: {},\n };\n if (accessToken) {\n opts.headers!.Authorization = `Bearer ${accessToken}`;\n }\n\n return this.requestOtherUrl(method, fullUri, body, opts);\n }\n\n /**\n * Perform an authorised request to the homeserver.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param paramOpts - additional options.\n * When `paramOpts.doNotAttemptTokenRefresh` is true, token refresh will not be attempted\n * when an expired token is encountered. Used to only attempt token refresh once.\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public authedRequest<T>(\n method: Method,\n path: string,\n queryParams: QueryDict = {},\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n return this.doAuthedRequest<T>(1, method, path, queryParams, body, paramOpts);\n }\n\n // Wrapper around public method authedRequest to allow for tracking retry attempt counts\n private async doAuthedRequest<T>(\n attempt: number,\n method: Method,\n path: string,\n queryParams: QueryDict,\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n // avoid mutating paramOpts so they can be used on retry\n const opts = deepCopy(paramOpts);\n // we have to manually copy the abortSignal over as it is not a plain object\n opts.abortSignal = paramOpts.abortSignal;\n\n // Take a snapshot of the current token state before we start the request so we can reference it if we error\n const requestSnapshot = await this.tokenRefresher.prepareForRequest();\n if (requestSnapshot.accessToken) {\n if (this.opts.useAuthorizationHeader) {\n if (!opts.headers) {\n opts.headers = {};\n }\n if (!opts.headers.Authorization) {\n opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;\n }\n if (queryParams.access_token) {\n delete queryParams.access_token;\n }\n } else if (!queryParams.access_token) {\n queryParams.access_token = requestSnapshot.accessToken;\n }\n }\n\n try {\n const response = await this.request<T>(method, path, queryParams, body, opts);\n return response;\n } catch (error) {\n if (!(error instanceof MatrixError)) {\n throw error;\n }\n\n if (error.errcode === \"M_UNKNOWN_TOKEN\") {\n const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);\n if (outcome === TokenRefreshOutcome.Success) {\n // if we got a new token retry the request\n return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);\n }\n if (outcome === TokenRefreshOutcome.Failure) {\n throw new TokenRefreshError(error);\n }\n\n if (!opts?.inhibitLogoutEmit) {\n this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);\n }\n } else if (error.errcode == \"M_CONSENT_NOT_GIVEN\") {\n this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);\n }\n\n throw error;\n }\n }\n\n /**\n * Perform a request to the homeserver without any credentials.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public request<T>(\n method: Method,\n path: string,\n queryParams?: QueryDict,\n body?: Body,\n opts?: IRequestOpts,\n ): Promise<T> {\n const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);\n return this.requestOtherUrl<T>(method, fullUri, body, opts);\n }\n\n /**\n * Perform a request to an arbitrary URL.\n * @param method - The HTTP method e.g. \"GET\".\n * @param url - The HTTP URL object.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public async requestOtherUrl<T>(\n method: Method,\n url: URL | string,\n body?: Body,\n opts: BaseRequestOpts = {},\n ): Promise<T> {\n if (opts.json !== undefined && opts.rawResponseBody !== undefined) {\n throw new Error(\"Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`\");\n }\n\n const urlForLogs = this.sanitizeUrlForLogs(url);\n\n this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);\n\n const headers = Object.assign({}, opts.headers || {});\n\n const jsonResponse = !opts.rawResponseBody && opts.json !== false;\n if (jsonResponse) {\n if (!headers[\"Accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n }\n\n const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;\n const keepAlive = opts.keepAlive ?? false;\n const signals = [this.abortController.signal];\n if (timeout !== undefined) {\n signals.push(timeoutSignal(timeout));\n }\n if (opts.abortSignal) {\n signals.push(opts.abortSignal);\n }\n\n // If the body is an object, encode it as JSON and set the `Content-Type` header,\n // unless that has been explicitly inhibited by setting `opts.json: false`.\n // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref\n let data: BodyInit;\n if (opts.json !== false && body?.constructor?.name === Object.name) {\n data = JSON.stringify(body);\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n } else {\n data = body as BodyInit;\n }\n\n const { signal, cleanup } = anySignal(signals);\n\n // Set cache mode based on presence of Authorization header.\n // Browsers/proxies do not cache responses to requests with Authorization headers.\n // So specifying \"no-cache\" is redundant, and actually prevents caching\n // of preflight requests in CORS scenarios. As such, we only set \"no-cache\"\n // when there is no Authorization header.\n const cacheMode = \"Authorization\" in headers ? undefined : \"no-cache\";\n\n let res: Response;\n const start = Date.now();\n try {\n res = await this.fetch(url, {\n signal,\n method,\n body: data,\n headers,\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"\",\n referrerPolicy: \"no-referrer\",\n cache: cacheMode,\n credentials: \"omit\", // we send credentials via headers\n keepalive: keepAlive,\n priority: opts.priority,\n });\n\n this.opts.logger?.debug(\n `FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`,\n );\n } catch (e) {\n this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);\n if ((<Error>e).name === \"AbortError\") {\n throw e;\n }\n throw new ConnectionError(\"fetch failed\", <Error>e);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n throw parseErrorResponse(res, await res.text());\n }\n\n if (opts.rawResponseBody) {\n return (await res.blob()) as T;\n } else if (jsonResponse) {\n return await res.json();\n } else {\n return (await res.text()) as T;\n }\n }\n\n private sanitizeUrlForLogs(url: URL | string): string {\n try {\n let asUrl: URL;\n if (typeof url === \"string\") {\n asUrl = new URL(url);\n } else {\n asUrl = url;\n }\n // Remove the values of any URL params that could contain potential secrets\n const sanitizedQs = new URLSearchParams();\n for (const key of asUrl.searchParams.keys()) {\n sanitizedQs.append(key, \"xxx\");\n }\n const sanitizedQsString = sanitizedQs.toString();\n const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : \"\";\n\n return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;\n } catch {\n // defensive coding for malformed url\n return \"??\";\n }\n }\n /**\n * Form and return a homeserver request URL based on the given path params and prefix.\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g. \"/createRoom\".\n * @param queryParams - A dict of query params (these will NOT be urlencoded).\n * @param prefix - The full prefix to use e.g. \"/_matrix/client/v2_alpha\", defaulting to this.opts.prefix.\n * @param baseUrl - The baseUrl to use e.g. \"https://matrix.org\", defaulting to this.opts.baseUrl.\n * @returns URL\n */\n public getUrl(path: string, queryParams?: QueryDict, prefix?: string, baseUrl?: string): URL {\n const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;\n const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith(\"/\")\n ? baseUrlWithFallback.slice(0, -1)\n : baseUrlWithFallback;\n const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);\n // If there are any params, encode and append them to the URL.\n if (this.opts.extraParams || queryParams) {\n const mergedParams = { ...this.opts.extraParams, ...queryParams };\n encodeParams(mergedParams, url.searchParams);\n }\n\n return url;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"fetch.js","names":[],"sources":["../../src/http-api/fetch.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nimport { checkObjectHasKeys, deepCopy, encodeParams } from \"../utils.ts\";\nimport { type TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { Method } from \"./method.ts\";\nimport { ConnectionError, MatrixError, TokenRefreshError } from \"./errors.ts\";\nimport {\n type BaseRequestOpts,\n HttpApiEvent,\n type HttpApiEventHandlerMap,\n type IHttpOpts,\n type IRequestOpts,\n type Body,\n} from \"./interface.ts\";\nimport { anySignal, parseErrorResponse, timeoutSignal } from \"./utils.ts\";\nimport { type QueryDict } from \"../utils.ts\";\nimport { TokenRefresher, TokenRefreshOutcome } from \"./refresh.ts\";\n\nexport class FetchHttpApi<O extends IHttpOpts> {\n private abortController = new AbortController();\n private readonly tokenRefresher: TokenRefresher;\n\n public constructor(\n private eventEmitter: TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>,\n public readonly opts: O,\n ) {\n checkObjectHasKeys(opts, [\"baseUrl\", \"prefix\"]);\n if (!opts.onlyData) {\n throw new Error(\"Constructing FetchHttpApi without `onlyData=true` is no longer supported.\");\n }\n opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;\n\n this.tokenRefresher = new TokenRefresher(opts);\n }\n\n public abort(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n public fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.opts.fetchFn) {\n return this.opts.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n /**\n * Sets the base URL for the identity server\n * @param url - The new base url\n */\n public setIdBaseUrl(url?: string): void {\n this.opts.idBaseUrl = url;\n }\n\n public idServerRequest<T extends object = Record<string, unknown>>(\n method: Method,\n path: string,\n params: Record<string, string | string[]> | undefined,\n prefix: string,\n accessToken?: string,\n ): Promise<T> {\n if (!this.opts.idBaseUrl) {\n throw new Error(\"No identity server base URL set\");\n }\n\n let queryParams: QueryDict | undefined = undefined;\n let body: Record<string, string | string[]> | undefined = undefined;\n if (method === Method.Get) {\n queryParams = params;\n } else {\n body = params;\n }\n\n const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);\n\n const opts: IRequestOpts = {\n json: true,\n headers: {},\n };\n if (accessToken) {\n opts.headers!.Authorization = `Bearer ${accessToken}`;\n }\n\n return this.requestOtherUrl(method, fullUri, body, opts);\n }\n\n /**\n * Perform an authorised request to the homeserver.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param paramOpts - additional options.\n * When `paramOpts.doNotAttemptTokenRefresh` is true, token refresh will not be attempted\n * when an expired token is encountered. Used to only attempt token refresh once.\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public authedRequest<T>(\n method: Method,\n path: string,\n queryParams: QueryDict = {},\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n return this.doAuthedRequest<T>(1, method, path, queryParams, body, paramOpts);\n }\n\n // Wrapper around public method authedRequest to allow for tracking retry attempt counts\n private async doAuthedRequest<T>(\n attempt: number,\n method: Method,\n path: string,\n queryParams: QueryDict,\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n // avoid mutating paramOpts so they can be used on retry\n const opts = deepCopy(paramOpts);\n // we have to manually copy the abortSignal over as it is not a plain object\n opts.abortSignal = paramOpts.abortSignal;\n\n // Take a snapshot of the current token state before we start the request so we can reference it if we error\n const requestSnapshot = await this.tokenRefresher.prepareForRequest();\n if (requestSnapshot.accessToken) {\n if (this.opts.useAuthorizationHeader) {\n if (!opts.headers) {\n opts.headers = {};\n }\n if (!opts.headers.Authorization) {\n opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;\n }\n if (queryParams.access_token) {\n delete queryParams.access_token;\n }\n } else if (!queryParams.access_token) {\n queryParams.access_token = requestSnapshot.accessToken;\n }\n }\n\n try {\n const response = await this.request<T>(method, path, queryParams, body, opts);\n return response;\n } catch (error) {\n if (!(error instanceof MatrixError)) {\n throw error;\n }\n\n if (error.errcode === \"M_UNKNOWN_TOKEN\") {\n const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);\n if (outcome === TokenRefreshOutcome.Success) {\n // if we got a new token retry the request\n return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);\n }\n if (outcome === TokenRefreshOutcome.Failure) {\n throw new TokenRefreshError(error);\n }\n\n if (!opts?.inhibitLogoutEmit) {\n this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);\n }\n } else if (error.errcode == \"M_CONSENT_NOT_GIVEN\") {\n this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);\n }\n\n throw error;\n }\n }\n\n /**\n * Perform a request to the homeserver without any credentials.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public request<T>(\n method: Method,\n path: string,\n queryParams?: QueryDict,\n body?: Body,\n opts?: IRequestOpts,\n ): Promise<T> {\n const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);\n return this.requestOtherUrl<T>(method, fullUri, body, opts);\n }\n\n /**\n * Perform a request to an arbitrary URL.\n * @param method - The HTTP method e.g. \"GET\".\n * @param url - The HTTP URL object.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public async requestOtherUrl<T>(\n method: Method,\n url: URL | string,\n body?: Body,\n opts: BaseRequestOpts = {},\n ): Promise<T> {\n if (opts.json !== undefined && opts.rawResponseBody !== undefined) {\n throw new Error(\"Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`\");\n }\n\n const urlForLogs = this.sanitizeUrlForLogs(url);\n\n this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);\n\n const headers = Object.assign({}, opts.headers || {});\n\n const jsonResponse = !opts.rawResponseBody && opts.json !== false;\n if (jsonResponse) {\n if (!headers[\"Accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n }\n\n const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;\n const keepAlive = opts.keepAlive ?? false;\n const signals = [this.abortController.signal];\n if (timeout !== undefined) {\n signals.push(timeoutSignal(timeout));\n }\n if (opts.abortSignal) {\n signals.push(opts.abortSignal);\n }\n\n // If the body is an object, encode it as JSON and set the `Content-Type` header,\n // unless that has been explicitly inhibited by setting `opts.json: false`.\n // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref\n let data: BodyInit;\n if (opts.json !== false && body?.constructor?.name === Object.name) {\n data = JSON.stringify(body);\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n } else {\n data = body as BodyInit;\n }\n\n const { signal, cleanup } = anySignal(signals);\n\n // Set cache mode based on presence of Authorization header.\n // Browsers/proxies do not cache responses to requests with Authorization headers.\n // So specifying \"no-cache\" is redundant, and actually prevents caching\n // of preflight requests in CORS scenarios. As such, we only set \"no-cache\"\n // when there is no Authorization header.\n const cacheMode = \"Authorization\" in headers ? undefined : \"no-cache\";\n\n let res: Response;\n const start = Date.now();\n try {\n res = await this.fetch(url, {\n signal,\n method,\n body: data,\n headers,\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"\",\n referrerPolicy: \"no-referrer\",\n cache: cacheMode,\n credentials: \"omit\", // we send credentials via headers\n keepalive: keepAlive,\n priority: opts.priority,\n });\n\n this.opts.logger?.debug(\n `FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`,\n );\n } catch (e) {\n this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);\n if ((<Error>e).name === \"AbortError\") {\n throw e;\n }\n throw new ConnectionError(\"fetch failed\", <Error>e);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n throw parseErrorResponse(res, await res.text());\n }\n\n if (opts.rawResponseBody) {\n return (await res.blob()) as T;\n } else if (jsonResponse) {\n return await res.json();\n } else {\n return (await res.text()) as T;\n }\n }\n\n private sanitizeUrlForLogs(url: URL | string): string {\n try {\n let asUrl: URL;\n if (typeof url === \"string\") {\n asUrl = new URL(url);\n } else {\n asUrl = url;\n }\n // Remove the values of any URL params that could contain potential secrets\n const sanitizedQs = new URLSearchParams();\n for (const key of asUrl.searchParams.keys()) {\n sanitizedQs.append(key, \"xxx\");\n }\n const sanitizedQsString = sanitizedQs.toString();\n const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : \"\";\n\n return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;\n } catch {\n // defensive coding for malformed url\n return \"??\";\n }\n }\n /**\n * Form and return a homeserver request URL based on the given path params and prefix.\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g. \"/createRoom\".\n * @param queryParams - A dict of query params (these will NOT be urlencoded).\n * @param prefix - The full prefix to use e.g. \"/_matrix/client/v2_alpha\", defaulting to this.opts.prefix.\n * @param baseUrl - The baseUrl to use e.g. \"https://matrix.org\", defaulting to this.opts.baseUrl.\n * @returns URL\n */\n public getUrl(path: string, queryParams?: QueryDict, prefix?: string, baseUrl?: string): URL {\n const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;\n const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith(\"/\")\n ? baseUrlWithFallback.slice(0, -1)\n : baseUrlWithFallback;\n const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);\n // If there are any params, encode and append them to the URL.\n if (this.opts.extraParams || queryParams) {\n const mergedParams = { ...this.opts.extraParams, ...queryParams };\n encodeParams(mergedParams, url.searchParams);\n }\n\n return url;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/http-api/index.js
CHANGED
|
@@ -28,8 +28,8 @@ export * from "./errors.js";
|
|
|
28
28
|
export * from "./method.js";
|
|
29
29
|
export * from "./utils.js";
|
|
30
30
|
export class MatrixHttpApi extends FetchHttpApi {
|
|
31
|
-
constructor() {
|
|
32
|
-
super(...
|
|
31
|
+
constructor(...args) {
|
|
32
|
+
super(...args);
|
|
33
33
|
_defineProperty(this, "uploads", []);
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
@@ -45,30 +45,28 @@ export class MatrixHttpApi extends FetchHttpApi {
|
|
|
45
45
|
* @throws May throw a `MatrixSafetyError` if content is deemed unsafe.
|
|
46
46
|
* @see MatrixSafetyError
|
|
47
47
|
*/
|
|
48
|
-
uploadContent(file) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
var includeFilename = (_opts$includeFilename = opts.includeFilename) !== null && _opts$includeFilename !== void 0 ? _opts$includeFilename : true;
|
|
52
|
-
var abortController = (_opts$abortController = opts.abortController) !== null && _opts$abortController !== void 0 ? _opts$abortController : new AbortController();
|
|
48
|
+
uploadContent(file, opts = {}) {
|
|
49
|
+
const includeFilename = opts.includeFilename ?? true;
|
|
50
|
+
const abortController = opts.abortController ?? new AbortController();
|
|
53
51
|
|
|
54
52
|
// If the file doesn't have a mime type, use a default since the HS errors if we don't supply one.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
const contentType = (opts.type ?? file.type) || "application/octet-stream";
|
|
54
|
+
const fileName = opts.name ?? file.name;
|
|
55
|
+
const upload = {
|
|
58
56
|
loaded: 0,
|
|
59
57
|
total: 0,
|
|
60
58
|
abortController
|
|
61
59
|
};
|
|
62
|
-
|
|
60
|
+
const uploadResolvers = Promise.withResolvers();
|
|
63
61
|
if (globalThis.XMLHttpRequest) {
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
const xhr = new globalThis.XMLHttpRequest();
|
|
63
|
+
const timeoutFn = function () {
|
|
66
64
|
xhr.abort();
|
|
67
65
|
uploadResolvers.reject(new Error("Timeout"));
|
|
68
66
|
};
|
|
69
67
|
|
|
70
68
|
// set an initial timeout of 30s; we'll advance it each time we get a progress notification
|
|
71
|
-
|
|
69
|
+
let timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
|
|
72
70
|
xhr.onreadystatechange = function () {
|
|
73
71
|
switch (xhr.readyState) {
|
|
74
72
|
case globalThis.XMLHttpRequest.DONE:
|
|
@@ -96,17 +94,16 @@ export class MatrixHttpApi extends FetchHttpApi {
|
|
|
96
94
|
}
|
|
97
95
|
};
|
|
98
96
|
xhr.upload.onprogress = ev => {
|
|
99
|
-
var _opts$progressHandler;
|
|
100
97
|
callbacks.clearTimeout(timeoutTimer);
|
|
101
98
|
upload.loaded = ev.loaded;
|
|
102
99
|
upload.total = ev.total;
|
|
103
100
|
timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
|
|
104
|
-
|
|
101
|
+
opts.progressHandler?.({
|
|
105
102
|
loaded: ev.loaded,
|
|
106
103
|
total: ev.total
|
|
107
104
|
});
|
|
108
105
|
};
|
|
109
|
-
|
|
106
|
+
const url = this.getUrl("/upload", undefined, MediaPrefix.V3);
|
|
110
107
|
if (includeFilename && fileName) {
|
|
111
108
|
url.searchParams.set("filename", encodeURIComponent(fileName));
|
|
112
109
|
}
|
|
@@ -123,11 +120,11 @@ export class MatrixHttpApi extends FetchHttpApi {
|
|
|
123
120
|
xhr.abort();
|
|
124
121
|
});
|
|
125
122
|
} else {
|
|
126
|
-
|
|
123
|
+
const queryParams = {};
|
|
127
124
|
if (includeFilename && fileName) {
|
|
128
125
|
queryParams.filename = fileName;
|
|
129
126
|
}
|
|
130
|
-
|
|
127
|
+
const headers = {
|
|
131
128
|
"Content-Type": contentType
|
|
132
129
|
};
|
|
133
130
|
this.authedRequest(Method.Post, "/upload", queryParams, file, {
|
|
@@ -149,7 +146,7 @@ export class MatrixHttpApi extends FetchHttpApi {
|
|
|
149
146
|
return upload.promise;
|
|
150
147
|
}
|
|
151
148
|
cancelUpload(promise) {
|
|
152
|
-
|
|
149
|
+
const upload = this.uploads.find(u => u.promise === promise);
|
|
153
150
|
if (upload) {
|
|
154
151
|
upload.abortController.abort();
|
|
155
152
|
return true;
|