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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSC4108SecureChannel.js","names":["Ecies","QrCodeData","QrCodeIntent","ClientRendezvousFailureReason","MSC4108FailureReason","RendezvousError","logger","MSC4108SecureChannel","constructor","rendezvousSession","theirPublicKey","onFailure","_defineProperty","secureChannel","generateCode","mode","serverName","_this","_asyncToGenerator","url","Error","public_key","Reciprocate","undefined","toBytes","getCheckCode","_this$establishedChan","x","establishedChannel","check_code","Array","from","as_bytes","map","b","concat","join","connect","_this2","connected","result","establish_outbound_channel","channel","info","send","initial_message","ciphertext","receive","UnexpectedMessageReceived","candidateLoginOkMessage","decrypt","InsecureChannelDetected","loginInitiateMessage","_this2$secureChannel$","establish_inbound_channel","candidateLoginInitiateMessage","message","loginOkMessage","encrypt","_this3","plaintext","_this4","secureSend","payload","_this5","stringifiedPayload","JSON","stringify","debug","type","secureReceive","_this6","json","parse","close","_this7","cancel","reason","_this8","_this8$onFailure","call","UserDeclined","UserCancelled","cancelled"],"sources":["../../../src/rendezvous/channels/MSC4108SecureChannel.ts"],"sourcesContent":["/*\nCopyright 2024 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\nimport {\n type Curve25519PublicKey,\n Ecies,\n type EstablishedEcies,\n QrCodeData,\n QrCodeIntent,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n type MSC4108Payload,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"../index.ts\";\nimport { type MSC4108RendezvousSession } from \"../transports/MSC4108RendezvousSession.ts\";\nimport { logger } from \"../../logger.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n * Imports @matrix-org/matrix-sdk-crypto-wasm so should be async-imported to avoid bundling the WASM into the main bundle.\n */\nexport class MSC4108SecureChannel {\n private readonly secureChannel: Ecies;\n private establishedChannel?: EstablishedEcies;\n private connected = false;\n\n public constructor(\n private rendezvousSession: MSC4108RendezvousSession,\n private theirPublicKey?: Curve25519PublicKey,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.secureChannel = new Ecies();\n }\n\n /**\n * Generate a QR code for the current session.\n * @param mode the mode to generate the QR code in, either `Login` or `Reciprocate`.\n * @param serverName the name of the homeserver to connect to, as defined by server discovery in the spec, required for `Reciprocate` mode.\n */\n public async generateCode(mode: QrCodeIntent.Login): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent.Reciprocate, serverName: string): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent, serverName?: string): Promise<Uint8Array> {\n const { url } = this.rendezvousSession;\n\n if (!url) {\n throw new Error(\"No rendezvous session URL\");\n }\n\n return new QrCodeData(\n this.secureChannel.public_key(),\n url,\n mode === QrCodeIntent.Reciprocate ? serverName : undefined,\n ).toBytes();\n }\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public getCheckCode(): string | undefined {\n const x = this.establishedChannel?.check_code();\n\n if (!x) {\n return undefined;\n }\n return Array.from(x.as_bytes())\n .map((b) => `${b % 10}`)\n .join(\"\");\n }\n\n /**\n * Connects and establishes a secure channel with the other device.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n throw new Error(\"Channel already connected\");\n }\n\n if (this.theirPublicKey) {\n // We are the scanning device\n const result = this.secureChannel.establish_outbound_channel(\n this.theirPublicKey,\n \"MATRIX_QR_CODE_LOGIN_INITIATE\",\n );\n this.establishedChannel = result.channel;\n\n /*\n Secure Channel step 4. Device S sends the initial message\n\n Nonce := 0\n SH := ECDH(Ss, Gp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n TaggedCiphertext := ChaCha20Poly1305_Encrypt(EncKey, Nonce, \"MATRIX_QR_CODE_LOGIN_INITIATE\")\n Nonce := Nonce + 2\n LoginInitiateMessage := UnpaddedBase64(TaggedCiphertext) || \"|\" || UnpaddedBase64(Sp)\n */\n {\n logger.info(\"Sending LoginInitiateMessage\");\n await this.rendezvousSession.send(result.initial_message);\n }\n\n /*\n Secure Channel step 6. Verification by Device S\n\n Nonce_G := 1\n (TaggedCiphertext, Sp) := Unpack(Message)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_G, TaggedCiphertext)\n Nonce_G := Nonce_G + 2\n\n unless Plaintext == \"MATRIX_QR_CODE_LOGIN_OK\":\n FAIL\n */\n {\n logger.info(\"Waiting for LoginOkMessage\");\n const ciphertext = await this.rendezvousSession.receive();\n\n if (!ciphertext) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n const candidateLoginOkMessage = await this.decrypt(ciphertext);\n\n if (candidateLoginOkMessage !== \"MATRIX_QR_CODE_LOGIN_OK\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n\n // Step 6 is now complete. We trust the channel\n }\n } else {\n /*\n Secure Channel step 5. Device G confirms\n\n Nonce_S := 0\n (TaggedCiphertext, Sp) := Unpack(LoginInitiateMessage)\n SH := ECDH(Gs, Sp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_S, TaggedCiphertext)\n Nonce_S := Nonce_S + 2\n */\n // wait for the other side to send us their public key\n logger.info(\"Waiting for LoginInitiateMessage\");\n const loginInitiateMessage = await this.rendezvousSession.receive();\n if (!loginInitiateMessage) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n const { channel, message: candidateLoginInitiateMessage } =\n this.secureChannel.establish_inbound_channel(loginInitiateMessage);\n this.establishedChannel = channel;\n\n if (candidateLoginInitiateMessage !== \"MATRIX_QR_CODE_LOGIN_INITIATE\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n logger.info(\"LoginInitiateMessage received\");\n\n logger.info(\"Sending LoginOkMessage\");\n const loginOkMessage = await this.encrypt(\"MATRIX_QR_CODE_LOGIN_OK\");\n await this.rendezvousSession.send(loginOkMessage);\n\n // Step 5 is complete. We don't yet trust the channel\n\n // next step will be for the user to confirm the check code on the other device\n }\n\n this.connected = true;\n }\n\n private async decrypt(ciphertext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.decrypt(ciphertext);\n }\n\n private async encrypt(plaintext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.encrypt(plaintext);\n }\n\n /**\n * Sends a payload securely to the other device.\n * @param payload the payload to encrypt and send\n */\n public async secureSend<T extends MSC4108Payload>(payload: T): Promise<void> {\n if (!this.connected) {\n throw new Error(\"Channel closed\");\n }\n\n const stringifiedPayload = JSON.stringify(payload);\n logger.debug(`=> {\"type\": ${JSON.stringify(payload.type)}, ...}`);\n\n await this.rendezvousSession.send(await this.encrypt(stringifiedPayload));\n }\n\n /**\n * Receives an encrypted payload from the other device and decrypts it.\n */\n public async secureReceive<T extends MSC4108Payload>(): Promise<Partial<T> | undefined> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n const ciphertext = await this.rendezvousSession.receive();\n if (!ciphertext) {\n return undefined;\n }\n const plaintext = await this.decrypt(ciphertext);\n const json = JSON.parse(plaintext);\n\n logger.debug(`<= {\"type\": ${JSON.stringify(json.type)}, ...}`);\n return json as Partial<T> | undefined;\n }\n\n /**\n * Closes the secure channel.\n */\n public async close(): Promise<void> {\n await this.rendezvousSession.close();\n }\n\n /**\n * Cancels the secure channel.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n try {\n await this.rendezvousSession.cancel(reason);\n this.onFailure?.(reason);\n } finally {\n if (\n reason !== ClientRendezvousFailureReason.UserDeclined &&\n reason !== MSC4108FailureReason.UserCancelled\n ) {\n await this.close();\n }\n }\n }\n\n /**\n * Returns whether the rendezvous session has been cancelled.\n */\n public get cancelled(): boolean {\n return this.rendezvousSession.cancelled;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MSC4108SecureChannel.js","names":[],"sources":["../../../src/rendezvous/channels/MSC4108SecureChannel.ts"],"sourcesContent":["/*\nCopyright 2024 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\nimport {\n type Curve25519PublicKey,\n Ecies,\n type EstablishedEcies,\n QrCodeData,\n QrCodeIntent,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n type MSC4108Payload,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"../index.ts\";\nimport { type MSC4108RendezvousSession } from \"../transports/MSC4108RendezvousSession.ts\";\nimport { logger } from \"../../logger.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n * Imports @matrix-org/matrix-sdk-crypto-wasm so should be async-imported to avoid bundling the WASM into the main bundle.\n */\nexport class MSC4108SecureChannel {\n private readonly secureChannel: Ecies;\n private establishedChannel?: EstablishedEcies;\n private connected = false;\n\n public constructor(\n private rendezvousSession: MSC4108RendezvousSession,\n private theirPublicKey?: Curve25519PublicKey,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.secureChannel = new Ecies();\n }\n\n /**\n * Generate a QR code for the current session.\n * @param mode the mode to generate the QR code in, either `Login` or `Reciprocate`.\n * @param serverName the name of the homeserver to connect to, as defined by server discovery in the spec, required for `Reciprocate` mode.\n */\n public async generateCode(mode: QrCodeIntent.Login): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent.Reciprocate, serverName: string): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent, serverName?: string): Promise<Uint8Array> {\n const { url } = this.rendezvousSession;\n\n if (!url) {\n throw new Error(\"No rendezvous session URL\");\n }\n\n return new QrCodeData(\n this.secureChannel.public_key(),\n url,\n mode === QrCodeIntent.Reciprocate ? serverName : undefined,\n ).toBytes();\n }\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public getCheckCode(): string | undefined {\n const x = this.establishedChannel?.check_code();\n\n if (!x) {\n return undefined;\n }\n return Array.from(x.as_bytes())\n .map((b) => `${b % 10}`)\n .join(\"\");\n }\n\n /**\n * Connects and establishes a secure channel with the other device.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n throw new Error(\"Channel already connected\");\n }\n\n if (this.theirPublicKey) {\n // We are the scanning device\n const result = this.secureChannel.establish_outbound_channel(\n this.theirPublicKey,\n \"MATRIX_QR_CODE_LOGIN_INITIATE\",\n );\n this.establishedChannel = result.channel;\n\n /*\n Secure Channel step 4. Device S sends the initial message\n\n Nonce := 0\n SH := ECDH(Ss, Gp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n TaggedCiphertext := ChaCha20Poly1305_Encrypt(EncKey, Nonce, \"MATRIX_QR_CODE_LOGIN_INITIATE\")\n Nonce := Nonce + 2\n LoginInitiateMessage := UnpaddedBase64(TaggedCiphertext) || \"|\" || UnpaddedBase64(Sp)\n */\n {\n logger.info(\"Sending LoginInitiateMessage\");\n await this.rendezvousSession.send(result.initial_message);\n }\n\n /*\n Secure Channel step 6. Verification by Device S\n\n Nonce_G := 1\n (TaggedCiphertext, Sp) := Unpack(Message)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_G, TaggedCiphertext)\n Nonce_G := Nonce_G + 2\n\n unless Plaintext == \"MATRIX_QR_CODE_LOGIN_OK\":\n FAIL\n */\n {\n logger.info(\"Waiting for LoginOkMessage\");\n const ciphertext = await this.rendezvousSession.receive();\n\n if (!ciphertext) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n const candidateLoginOkMessage = await this.decrypt(ciphertext);\n\n if (candidateLoginOkMessage !== \"MATRIX_QR_CODE_LOGIN_OK\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n\n // Step 6 is now complete. We trust the channel\n }\n } else {\n /*\n Secure Channel step 5. Device G confirms\n\n Nonce_S := 0\n (TaggedCiphertext, Sp) := Unpack(LoginInitiateMessage)\n SH := ECDH(Gs, Sp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_S, TaggedCiphertext)\n Nonce_S := Nonce_S + 2\n */\n // wait for the other side to send us their public key\n logger.info(\"Waiting for LoginInitiateMessage\");\n const loginInitiateMessage = await this.rendezvousSession.receive();\n if (!loginInitiateMessage) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n const { channel, message: candidateLoginInitiateMessage } =\n this.secureChannel.establish_inbound_channel(loginInitiateMessage);\n this.establishedChannel = channel;\n\n if (candidateLoginInitiateMessage !== \"MATRIX_QR_CODE_LOGIN_INITIATE\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n logger.info(\"LoginInitiateMessage received\");\n\n logger.info(\"Sending LoginOkMessage\");\n const loginOkMessage = await this.encrypt(\"MATRIX_QR_CODE_LOGIN_OK\");\n await this.rendezvousSession.send(loginOkMessage);\n\n // Step 5 is complete. We don't yet trust the channel\n\n // next step will be for the user to confirm the check code on the other device\n }\n\n this.connected = true;\n }\n\n private async decrypt(ciphertext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.decrypt(ciphertext);\n }\n\n private async encrypt(plaintext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.encrypt(plaintext);\n }\n\n /**\n * Sends a payload securely to the other device.\n * @param payload the payload to encrypt and send\n */\n public async secureSend<T extends MSC4108Payload>(payload: T): Promise<void> {\n if (!this.connected) {\n throw new Error(\"Channel closed\");\n }\n\n const stringifiedPayload = JSON.stringify(payload);\n logger.debug(`=> {\"type\": ${JSON.stringify(payload.type)}, ...}`);\n\n await this.rendezvousSession.send(await this.encrypt(stringifiedPayload));\n }\n\n /**\n * Receives an encrypted payload from the other device and decrypts it.\n */\n public async secureReceive<T extends MSC4108Payload>(): Promise<Partial<T> | undefined> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n const ciphertext = await this.rendezvousSession.receive();\n if (!ciphertext) {\n return undefined;\n }\n const plaintext = await this.decrypt(ciphertext);\n const json = JSON.parse(plaintext);\n\n logger.debug(`<= {\"type\": ${JSON.stringify(json.type)}, ...}`);\n return json as Partial<T> | undefined;\n }\n\n /**\n * Closes the secure channel.\n */\n public async close(): Promise<void> {\n await this.rendezvousSession.close();\n }\n\n /**\n * Cancels the secure channel.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n try {\n await this.rendezvousSession.cancel(reason);\n this.onFailure?.(reason);\n } finally {\n if (\n reason !== ClientRendezvousFailureReason.UserDeclined &&\n reason !== MSC4108FailureReason.UserCancelled\n ) {\n await this.close();\n }\n }\n }\n\n /**\n * Returns whether the rendezvous session has been cancelled.\n */\n public get cancelled(): boolean {\n return this.rendezvousSession.cancelled;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/lib/rendezvous/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
1
|
/*
|
|
3
2
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
4
3
|
|
|
@@ -35,8 +34,22 @@ export * from "./channels/index.js";
|
|
|
35
34
|
* @param client the client to check for sign-in with QR support
|
|
36
35
|
* @returns true if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use, false otherwise.
|
|
37
36
|
*/
|
|
38
|
-
export function isSignInWithQRAvailable(
|
|
39
|
-
|
|
37
|
+
export async function isSignInWithQRAvailable(client) {
|
|
38
|
+
let metadata;
|
|
39
|
+
try {
|
|
40
|
+
metadata = await client.getAuthMetadata();
|
|
41
|
+
} catch (e) {
|
|
42
|
+
logger.warn("Failed to fetch auth metadata, assuming sign-in with QR is unavailable", e);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// check for support of device authorization grant
|
|
47
|
+
if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// check for unstable support for MSC4108 2024 version
|
|
52
|
+
return client.doesServerSupportUnstableFeature("org.matrix.msc4108");
|
|
40
53
|
}
|
|
41
54
|
|
|
42
55
|
/**
|
|
@@ -51,28 +64,9 @@ export function isSignInWithQRAvailable(_x) {
|
|
|
51
64
|
* This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.
|
|
52
65
|
* @returns a promise that resolves to an instance of the linking flow
|
|
53
66
|
*/
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
metadata = yield client.getAuthMetadata();
|
|
59
|
-
} catch (e) {
|
|
60
|
-
logger.warn("Failed to fetch auth metadata, assuming sign-in with QR is unavailable", e);
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// check for support of device authorization grant
|
|
65
|
-
if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// check for unstable support for MSC4108 2024 version
|
|
70
|
-
return client.doesServerSupportUnstableFeature("org.matrix.msc4108");
|
|
71
|
-
});
|
|
72
|
-
return _isSignInWithQRAvailable.apply(this, arguments);
|
|
73
|
-
}
|
|
74
|
-
export function linkNewDeviceByGeneratingQR(_x2, _x3, _x4) {
|
|
75
|
-
return _linkNewDeviceByGeneratingQR.apply(this, arguments);
|
|
67
|
+
export async function linkNewDeviceByGeneratingQR(client, onFailure, abortSignal) {
|
|
68
|
+
// we assume rust crypto is already initialised
|
|
69
|
+
return initGenerateQrFlow(RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE, client, onFailure, abortSignal);
|
|
76
70
|
}
|
|
77
71
|
|
|
78
72
|
/**
|
|
@@ -87,52 +81,33 @@ export function linkNewDeviceByGeneratingQR(_x2, _x3, _x4) {
|
|
|
87
81
|
* This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.
|
|
88
82
|
* @returns a promise that resolves to an instance of the sign-in flow
|
|
89
83
|
*/
|
|
90
|
-
function
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return _linkNewDeviceByGeneratingQR.apply(this, arguments);
|
|
96
|
-
}
|
|
97
|
-
export function signInByGeneratingQR(_x5, _x6, _x7) {
|
|
98
|
-
return _signInByGeneratingQR.apply(this, arguments);
|
|
84
|
+
export async function signInByGeneratingQR(tempClient, onFailure, abortSignal) {
|
|
85
|
+
// ensure rust crypto is initialized as needed for the secure channel
|
|
86
|
+
const RustSdkCryptoJs = await import("@matrix-org/matrix-sdk-crypto-wasm");
|
|
87
|
+
await RustSdkCryptoJs.initAsync();
|
|
88
|
+
return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);
|
|
99
89
|
}
|
|
100
|
-
function
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
yield RustSdkCryptoJs.initAsync();
|
|
105
|
-
return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);
|
|
90
|
+
async function initGenerateQrFlow(intent, client, onFailure, abortSignal) {
|
|
91
|
+
const session = new MSC4108RendezvousSession({
|
|
92
|
+
onFailure,
|
|
93
|
+
client
|
|
106
94
|
});
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
var flow = new MSC4108SignInWithQR(channel, false, intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client, onFailure);
|
|
120
|
-
if (abortSignal.aborted) return flow;
|
|
121
|
-
abortSignal.onabort = () => {
|
|
122
|
-
// Detach failure handlers
|
|
123
|
-
session.onFailure = undefined;
|
|
124
|
-
channel.onFailure = undefined;
|
|
125
|
-
flow.onFailure = undefined;
|
|
126
|
-
// Cancel the session
|
|
127
|
-
flow.cancel(MSC4108FailureReason.UserCancelled);
|
|
128
|
-
};
|
|
129
|
-
yield session.send(""); // open channel
|
|
95
|
+
const channel = new MSC4108SecureChannel(session, undefined, onFailure);
|
|
96
|
+
const flow = new MSC4108SignInWithQR(channel, false, intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client, onFailure);
|
|
97
|
+
if (abortSignal.aborted) return flow;
|
|
98
|
+
abortSignal.onabort = () => {
|
|
99
|
+
// Detach failure handlers
|
|
100
|
+
session.onFailure = undefined;
|
|
101
|
+
channel.onFailure = undefined;
|
|
102
|
+
flow.onFailure = undefined;
|
|
103
|
+
// Cancel the session
|
|
104
|
+
void flow.cancel(MSC4108FailureReason.UserCancelled);
|
|
105
|
+
};
|
|
106
|
+
await session.send(""); // open channel
|
|
130
107
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
});
|
|
136
|
-
return _initGenerateQrFlow.apply(this, arguments);
|
|
108
|
+
if (!abortSignal.aborted) {
|
|
109
|
+
await flow.generateCode();
|
|
110
|
+
}
|
|
111
|
+
return flow;
|
|
137
112
|
}
|
|
138
113
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/rendezvous/index.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\nimport { type MatrixClient, OAuthGrantType, type OidcClientConfig } from \"../matrix.ts\";\nimport { MSC4108FailureReason, type RendezvousFailureListener } from \"./RendezvousFailureReason.ts\";\nimport { MSC4108SignInWithQR } from \"./MSC4108SignInWithQR.ts\";\nimport { MSC4108RendezvousSession } from \"./transports/MSC4108RendezvousSession.ts\";\nimport { MSC4108SecureChannel } from \"./channels/MSC4108SecureChannel.ts\";\nimport { RendezvousIntent } from \"./RendezvousIntent.ts\";\nimport { logger } from \"../logger.ts\";\n\nexport * from \"./MSC4108SignInWithQR.ts\";\nexport type * from \"./RendezvousChannel.ts\";\nexport type * from \"./RendezvousCode.ts\";\nexport * from \"./RendezvousError.ts\";\nexport * from \"./RendezvousFailureReason.ts\";\nexport * from \"./RendezvousIntent.ts\";\nexport type * from \"./RendezvousTransport.ts\";\nexport * from \"./transports/index.ts\";\nexport * from \"./channels/index.ts\";\n\n/**\n * Check if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use.\n *\n * @param client the client to check for sign-in with QR support\n * @returns true if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use, false otherwise.\n */\nexport async function isSignInWithQRAvailable(client: MatrixClient): Promise<boolean> {\n let metadata: OidcClientConfig;\n try {\n metadata = await client.getAuthMetadata();\n } catch (e) {\n logger.warn(\"Failed to fetch auth metadata, assuming sign-in with QR is unavailable\", e);\n return false;\n }\n\n // check for support of device authorization grant\n if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {\n return false;\n }\n\n // check for unstable support for MSC4108 2024 version\n return client.doesServerSupportUnstableFeature(\"org.matrix.msc4108\");\n}\n\n/**\n * Start a linking flow from an existing authenticated client by generating a QR code that can be scanned by the new device.\n * The new device will then authenticate with the server and link itself to the same account as the existing client and\n * share the end-to-end encryption keys.\n *\n * @param client the existing client\n * @param onFailure callback for when the linking process fails\n * @param abortSignal an AbortSignal that can be used to cancel the linking process,\n * for example when the user cancels out of the flow.\n * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.\n * @returns a promise that resolves to an instance of the linking flow\n */\nexport async function linkNewDeviceByGeneratingQR(\n client: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n // we assume rust crypto is already initialised\n return initGenerateQrFlow(RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE, client, onFailure, abortSignal);\n}\n\n/**\n * Start a sign-in flow by generating a QR code that can be scanned by an existing authenticated client.\n * The existing client will then help complete the authentication of the new device and link it to the same account,\n * sharing the end-to-end encryption keys.\n *\n * @param tempClient temporary client used during the flow for the rendezvous channel\n * @param onFailure callback for when the sign-in process fails\n * @param abortSignal an AbortSignal that can be used to cancel the linking process,\n * for example when the user cancels out of the flow.\n * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.\n * @returns a promise that resolves to an instance of the sign-in flow\n */\nexport async function signInByGeneratingQR(\n tempClient: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n // ensure rust crypto is initialized as needed for the secure channel\n const RustSdkCryptoJs = await import(\"@matrix-org/matrix-sdk-crypto-wasm\");\n await RustSdkCryptoJs.initAsync();\n\n return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);\n}\n\nasync function initGenerateQrFlow(\n intent: RendezvousIntent,\n client: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n const session = new MSC4108RendezvousSession({\n onFailure,\n client,\n });\n const channel = new MSC4108SecureChannel(session, undefined, onFailure);\n const flow = new MSC4108SignInWithQR(\n channel,\n false,\n intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client,\n onFailure,\n );\n\n if (abortSignal.aborted) return flow;\n\n abortSignal.onabort = (): void => {\n // Detach failure handlers\n session.onFailure = undefined;\n channel.onFailure = undefined;\n flow.onFailure = undefined;\n // Cancel the session\n void flow.cancel(MSC4108FailureReason.UserCancelled);\n };\n\n await session.send(\"\"); // open channel\n\n if (!abortSignal.aborted) {\n await flow.generateCode();\n }\n\n return flow;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -44,7 +44,7 @@ export declare class MSC4108RendezvousSession {
|
|
|
44
44
|
send(data: string): Promise<void>;
|
|
45
45
|
/**
|
|
46
46
|
* Receives data from the rendezvous channel.
|
|
47
|
-
* @
|
|
47
|
+
* @returns the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.
|
|
48
48
|
*/
|
|
49
49
|
receive(): Promise<string | undefined>;
|
|
50
50
|
/**
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
2
|
/*
|
|
4
3
|
Copyright 2024 The Matrix.org Foundation C.I.C.
|
|
@@ -28,12 +27,13 @@ import { ClientPrefix } from "../../http-api/index.js";
|
|
|
28
27
|
* @experimental Note that this is UNSTABLE and may have breaking changes without notice.
|
|
29
28
|
*/
|
|
30
29
|
export class MSC4108RendezvousSession {
|
|
31
|
-
constructor(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
constructor({
|
|
31
|
+
fetchFn,
|
|
32
|
+
onFailure,
|
|
33
|
+
url,
|
|
34
|
+
client,
|
|
35
|
+
fallbackRzServer
|
|
36
|
+
}) {
|
|
37
37
|
_defineProperty(this, "url", void 0);
|
|
38
38
|
_defineProperty(this, "client", void 0);
|
|
39
39
|
_defineProperty(this, "fallbackRzServer", void 0);
|
|
@@ -70,135 +70,124 @@ export class MSC4108RendezvousSession {
|
|
|
70
70
|
}
|
|
71
71
|
return globalThis.fetch(resource, options);
|
|
72
72
|
}
|
|
73
|
-
getPostEndpoint() {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (yield _this.client.doesServerSupportUnstableFeature("org.matrix.msc4108")) {
|
|
79
|
-
return _this.client.http.getUrl("/org.matrix.msc4108/rendezvous", undefined, ClientPrefix.Unstable).toString();
|
|
80
|
-
}
|
|
81
|
-
} catch (err) {
|
|
82
|
-
logger.warn("Failed to get unstable features", err);
|
|
73
|
+
async getPostEndpoint() {
|
|
74
|
+
if (this.client) {
|
|
75
|
+
try {
|
|
76
|
+
if (await this.client.doesServerSupportUnstableFeature("org.matrix.msc4108")) {
|
|
77
|
+
return this.client.http.getUrl("/org.matrix.msc4108/rendezvous", undefined, ClientPrefix.Unstable).toString();
|
|
83
78
|
}
|
|
79
|
+
} catch (err) {
|
|
80
|
+
logger.warn("Failed to get unstable features", err);
|
|
84
81
|
}
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
}
|
|
83
|
+
return this.fallbackRzServer;
|
|
87
84
|
}
|
|
88
85
|
|
|
89
86
|
/**
|
|
90
87
|
* Sends data via the rendezvous channel.
|
|
91
88
|
* @param data the payload to send
|
|
92
89
|
*/
|
|
93
|
-
send(data) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
var headers = {
|
|
106
|
-
"content-type": "text/plain"
|
|
107
|
-
};
|
|
90
|
+
async send(data) {
|
|
91
|
+
if (this._cancelled) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const method = this.url ? Method.Put : Method.Post;
|
|
95
|
+
const uri = this.url ?? (await this.getPostEndpoint());
|
|
96
|
+
if (!uri) {
|
|
97
|
+
throw new Error("Invalid rendezvous URI");
|
|
98
|
+
}
|
|
99
|
+
const headers = {
|
|
100
|
+
"content-type": "text/plain"
|
|
101
|
+
};
|
|
108
102
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
_this2.expiresAt = new Date(expires);
|
|
136
|
-
_this2.expiresTimer = setTimeout(() => {
|
|
137
|
-
_this2.expiresTimer = undefined;
|
|
138
|
-
_this2.cancel(ClientRendezvousFailureReason.Expired);
|
|
139
|
-
}, _this2.expiresAt.getTime() - Date.now());
|
|
140
|
-
}
|
|
141
|
-
// MSC4108: we expect a JSON response with a rendezvous URL
|
|
142
|
-
var json = yield res.json();
|
|
143
|
-
if (typeof json.url !== "string") {
|
|
144
|
-
throw new Error("No rendezvous URL given");
|
|
103
|
+
// if we didn't create the rendezvous channel, we need to fetch the first etag if needed
|
|
104
|
+
if (!this.etag && this.url) {
|
|
105
|
+
await this.receive();
|
|
106
|
+
}
|
|
107
|
+
if (this.etag) {
|
|
108
|
+
headers["if-match"] = this.etag;
|
|
109
|
+
}
|
|
110
|
+
logger.info(`=> ${method} ${uri} with ${data} if-match: ${this.etag}`);
|
|
111
|
+
const res = await this.fetch(uri, {
|
|
112
|
+
method,
|
|
113
|
+
headers,
|
|
114
|
+
body: data,
|
|
115
|
+
redirect: "follow"
|
|
116
|
+
});
|
|
117
|
+
if (res.status === 404) {
|
|
118
|
+
return this.cancel(ClientRendezvousFailureReason.Unknown);
|
|
119
|
+
}
|
|
120
|
+
this.etag = res.headers.get("etag") ?? undefined;
|
|
121
|
+
logger.info(`Received etag: ${this.etag}`);
|
|
122
|
+
if (method === Method.Post) {
|
|
123
|
+
const expires = res.headers.get("expires");
|
|
124
|
+
if (expires) {
|
|
125
|
+
if (this.expiresTimer) {
|
|
126
|
+
clearTimeout(this.expiresTimer);
|
|
127
|
+
this.expiresTimer = undefined;
|
|
145
128
|
}
|
|
146
|
-
|
|
147
|
-
|
|
129
|
+
this.expiresAt = new Date(expires);
|
|
130
|
+
this.expiresTimer = setTimeout(() => {
|
|
131
|
+
this.expiresTimer = undefined;
|
|
132
|
+
void this.cancel(ClientRendezvousFailureReason.Expired);
|
|
133
|
+
}, this.expiresAt.getTime() - Date.now());
|
|
134
|
+
}
|
|
135
|
+
// MSC4108: we expect a JSON response with a rendezvous URL
|
|
136
|
+
const json = await res.json();
|
|
137
|
+
if (typeof json.url !== "string") {
|
|
138
|
+
throw new Error("No rendezvous URL given");
|
|
148
139
|
}
|
|
149
|
-
|
|
140
|
+
this.url = json.url;
|
|
141
|
+
this._ready = true;
|
|
142
|
+
}
|
|
150
143
|
}
|
|
151
144
|
|
|
152
145
|
/**
|
|
153
146
|
* Receives data from the rendezvous channel.
|
|
154
|
-
* @
|
|
147
|
+
* @returns the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.
|
|
155
148
|
*/
|
|
156
|
-
receive() {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
149
|
+
async receive() {
|
|
150
|
+
if (!this.url) {
|
|
151
|
+
throw new Error("Rendezvous not set up");
|
|
152
|
+
}
|
|
153
|
+
// eslint-disable-next-line no-constant-condition
|
|
154
|
+
while (true) {
|
|
155
|
+
if (this._cancelled) {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
const headers = {};
|
|
159
|
+
if (this.etag) {
|
|
160
|
+
headers["if-none-match"] = this.etag;
|
|
161
|
+
}
|
|
162
|
+
logger.info(`=> GET ${this.url} if-none-match: ${this.etag}`);
|
|
163
|
+
const poll = await this.fetch(this.url, {
|
|
164
|
+
method: Method.Get,
|
|
165
|
+
headers
|
|
166
|
+
});
|
|
167
|
+
if (poll.status === 404) {
|
|
168
|
+
await this.cancel(ClientRendezvousFailureReason.Unknown);
|
|
169
|
+
return undefined;
|
|
161
170
|
}
|
|
162
|
-
// eslint-disable-next-line no-constant-condition
|
|
163
|
-
while (true) {
|
|
164
|
-
var _poll$headers$get;
|
|
165
|
-
if (_this3._cancelled) {
|
|
166
|
-
return undefined;
|
|
167
|
-
}
|
|
168
|
-
var headers = {};
|
|
169
|
-
if (_this3.etag) {
|
|
170
|
-
headers["if-none-match"] = _this3.etag;
|
|
171
|
-
}
|
|
172
|
-
logger.info("=> GET ".concat(_this3.url, " if-none-match: ").concat(_this3.etag));
|
|
173
|
-
var poll = yield _this3.fetch(_this3.url, {
|
|
174
|
-
method: Method.Get,
|
|
175
|
-
headers
|
|
176
|
-
});
|
|
177
|
-
if (poll.status === 404) {
|
|
178
|
-
yield _this3.cancel(ClientRendezvousFailureReason.Unknown);
|
|
179
|
-
return undefined;
|
|
180
|
-
}
|
|
181
171
|
|
|
182
|
-
|
|
172
|
+
// rely on server expiring the channel rather than checking ourselves
|
|
183
173
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
_this3.etag = etag;
|
|
195
|
-
var text = yield poll.text();
|
|
196
|
-
logger.info("Received: ".concat(text, " with etag ").concat(_this3.etag));
|
|
197
|
-
return text;
|
|
174
|
+
const etag = poll.headers.get("etag") ?? undefined;
|
|
175
|
+
if (poll.headers.get("content-type") !== "text/plain") {
|
|
176
|
+
this.etag = etag;
|
|
177
|
+
} else if (poll.status === 200) {
|
|
178
|
+
if (!etag) {
|
|
179
|
+
// Some browsers & extensions block the ETag header for anti-tracking purposes
|
|
180
|
+
// We try and detect this so the client can give the user a somewhat helpful message
|
|
181
|
+
await this.cancel(ClientRendezvousFailureReason.ETagMissing);
|
|
182
|
+
return undefined;
|
|
198
183
|
}
|
|
199
|
-
|
|
184
|
+
this.etag = etag;
|
|
185
|
+
const text = await poll.text();
|
|
186
|
+
logger.info(`Received: ${text} with etag ${this.etag}`);
|
|
187
|
+
return text;
|
|
200
188
|
}
|
|
201
|
-
|
|
189
|
+
await sleep(1000);
|
|
190
|
+
}
|
|
202
191
|
}
|
|
203
192
|
|
|
204
193
|
/**
|
|
@@ -206,48 +195,41 @@ export class MSC4108RendezvousSession {
|
|
|
206
195
|
* If the reason is user_declined or user_cancelled then the channel will also be closed.
|
|
207
196
|
* @param reason the reason to cancel with
|
|
208
197
|
*/
|
|
209
|
-
cancel(reason) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (reason === ClientRendezvousFailureReason.UserDeclined || reason === MSC4108FailureReason.UserCancelled) {
|
|
225
|
-
yield _this4.close();
|
|
226
|
-
}
|
|
227
|
-
})();
|
|
198
|
+
async cancel(reason) {
|
|
199
|
+
if (this._cancelled) return;
|
|
200
|
+
if (this.expiresTimer) {
|
|
201
|
+
clearTimeout(this.expiresTimer);
|
|
202
|
+
this.expiresTimer = undefined;
|
|
203
|
+
}
|
|
204
|
+
if (reason === ClientRendezvousFailureReason.Unknown && this.expiresAt && this.expiresAt.getTime() < Date.now()) {
|
|
205
|
+
reason = ClientRendezvousFailureReason.Expired;
|
|
206
|
+
}
|
|
207
|
+
this._cancelled = true;
|
|
208
|
+
this._ready = false;
|
|
209
|
+
this.onFailure?.(reason);
|
|
210
|
+
if (reason === ClientRendezvousFailureReason.UserDeclined || reason === MSC4108FailureReason.UserCancelled) {
|
|
211
|
+
await this.close();
|
|
212
|
+
}
|
|
228
213
|
}
|
|
229
214
|
|
|
230
215
|
/**
|
|
231
216
|
* Closes the rendezvous channel.
|
|
232
217
|
*/
|
|
233
|
-
close() {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
logger.warn(e);
|
|
249
|
-
}
|
|
250
|
-
})();
|
|
218
|
+
async close() {
|
|
219
|
+
if (this.expiresTimer) {
|
|
220
|
+
clearTimeout(this.expiresTimer);
|
|
221
|
+
this.expiresTimer = undefined;
|
|
222
|
+
}
|
|
223
|
+
if (!this.url) return;
|
|
224
|
+
try {
|
|
225
|
+
const method = Method.Delete;
|
|
226
|
+
logger.info(`=> ${method} ${this.url}`);
|
|
227
|
+
await this.fetch(this.url, {
|
|
228
|
+
method
|
|
229
|
+
});
|
|
230
|
+
} catch (e) {
|
|
231
|
+
logger.warn(e);
|
|
232
|
+
}
|
|
251
233
|
}
|
|
252
234
|
}
|
|
253
235
|
//# sourceMappingURL=MSC4108RendezvousSession.js.map
|