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,5 +1,3 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
2
|
/*
|
|
5
3
|
Copyright 2026 Element Creations Ltd.
|
|
@@ -34,90 +32,82 @@ import { ROOM_RETENTION_TYPE } from "../@types/retention.js";
|
|
|
34
32
|
*/
|
|
35
33
|
export class RoomRetentionPolicy {
|
|
36
34
|
constructor(room, retentionService, store) {
|
|
37
|
-
var _this = this;
|
|
38
|
-
this.room = room;
|
|
39
|
-
this.retentionService = retentionService;
|
|
40
|
-
this.store = store;
|
|
41
35
|
// minRetention is not implemented.
|
|
42
36
|
_defineProperty(this, "maxRetention", null);
|
|
43
37
|
_defineProperty(this, "retentionTimeout", void 0);
|
|
44
38
|
_defineProperty(this, "logger", void 0);
|
|
45
|
-
_defineProperty(this, "handleRetentionUpdate",
|
|
39
|
+
_defineProperty(this, "handleRetentionUpdate", async () => {
|
|
46
40
|
// First store if we currently have a retention period.
|
|
47
|
-
|
|
41
|
+
const hadRetentionPeriod = this.maxRetention !== null;
|
|
48
42
|
try {
|
|
49
|
-
|
|
43
|
+
await this.recalculateRetention(this.room.currentState);
|
|
50
44
|
} catch (err) {
|
|
51
|
-
|
|
45
|
+
this.logger.warn("Failed to recalculate retention policy", err);
|
|
52
46
|
return;
|
|
53
47
|
}
|
|
54
48
|
|
|
55
49
|
// Bind/unbind the Timeline event handler based on whether we should be running retention.
|
|
56
|
-
if (hadRetentionPeriod !== (
|
|
57
|
-
|
|
50
|
+
if (hadRetentionPeriod !== (this.maxRetention !== null)) {
|
|
51
|
+
this.logger.info("retention recalculated to be", this.maxRetention);
|
|
58
52
|
// We've changed
|
|
59
|
-
if (
|
|
60
|
-
|
|
53
|
+
if (this.maxRetention) {
|
|
54
|
+
this.room.on(RoomEvent.Timeline, this.timelineUpdated);
|
|
61
55
|
} else {
|
|
62
|
-
|
|
56
|
+
this.room.off(RoomEvent.Timeline, this.timelineUpdated);
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
|
-
})
|
|
66
|
-
_defineProperty(this, "recalculateRetention",
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
59
|
+
});
|
|
60
|
+
_defineProperty(this, "recalculateRetention", async roomState => {
|
|
61
|
+
const unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find(e => e.getStateKey() === "");
|
|
62
|
+
const stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find(e => e.getStateKey() === "");
|
|
63
|
+
const serverPolicy = this.retentionService.getCached();
|
|
64
|
+
const serverRoomPolicy = serverPolicy?.policies?.[this.room.roomId];
|
|
65
|
+
const roomStatePolicy = unstableEvent?.getContent() ?? stableEvent?.getContent();
|
|
66
|
+
const content =
|
|
67
|
+
// * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.
|
|
68
|
+
serverRoomPolicy ??
|
|
69
|
+
// * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:
|
|
70
|
+
roomStatePolicy ??
|
|
71
|
+
// * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:
|
|
72
|
+
serverPolicy?.policies?.["*"];
|
|
73
|
+
if (!content) {
|
|
74
|
+
// * otherwise, don't apply a retention policy in this room.
|
|
75
|
+
this.maxRetention = null;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const validatePolicy = !serverRoomPolicy && roomStatePolicy;
|
|
85
79
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
if (typeof maxLifetime !== "number") {
|
|
98
|
-
throw Error("max_lifetime must be a number, got \"".concat(maxLifetime, "\""));
|
|
99
|
-
}
|
|
100
|
-
if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {
|
|
101
|
-
throw Error("max_lifetime must be >= 0, got ".concat(maxLifetime));
|
|
102
|
-
}
|
|
103
|
-
_this.maxRetention = maxLifetime;
|
|
104
|
-
if (validatePolicy && serverPolicy !== null && serverPolicy !== void 0 && (_serverPolicy$limits2 = serverPolicy.limits) !== null && _serverPolicy$limits2 !== void 0 && _serverPolicy$limits2.max_lifetime) {
|
|
105
|
-
var _serverPolicy$limits$, _serverPolicy$limits$2;
|
|
106
|
-
// We're using room state so we need to validate this policy matches the server.
|
|
107
|
-
/**
|
|
108
|
-
if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.
|
|
109
|
-
if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.
|
|
110
|
-
if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.
|
|
111
|
-
*/
|
|
112
|
-
_this.maxRetention = Math.max(_this.maxRetention, (_serverPolicy$limits$ = serverPolicy.limits.max_lifetime.min) !== null && _serverPolicy$limits$ !== void 0 ? _serverPolicy$limits$ : 0);
|
|
113
|
-
_this.maxRetention = Math.min(_this.maxRetention, (_serverPolicy$limits$2 = serverPolicy.limits.max_lifetime.max) !== null && _serverPolicy$limits$2 !== void 0 ? _serverPolicy$limits$2 : Number.MAX_SAFE_INTEGER);
|
|
80
|
+
// Parse it
|
|
81
|
+
let {
|
|
82
|
+
max_lifetime: maxLifetime
|
|
83
|
+
} = content;
|
|
84
|
+
if (!maxLifetime && validatePolicy) {
|
|
85
|
+
// if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).
|
|
86
|
+
maxLifetime = serverPolicy?.limits?.max_lifetime?.min;
|
|
87
|
+
if (!maxLifetime) {
|
|
88
|
+
this.maxRetention = null;
|
|
89
|
+
return;
|
|
114
90
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
91
|
+
}
|
|
92
|
+
if (typeof maxLifetime !== "number") {
|
|
93
|
+
throw Error(`max_lifetime must be a number, got "${maxLifetime}"`);
|
|
94
|
+
}
|
|
95
|
+
if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {
|
|
96
|
+
throw Error(`max_lifetime must be >= 0, got ${maxLifetime}`);
|
|
97
|
+
}
|
|
98
|
+
this.maxRetention = maxLifetime;
|
|
99
|
+
if (validatePolicy && serverPolicy?.limits?.max_lifetime) {
|
|
100
|
+
// We're using room state so we need to validate this policy matches the server.
|
|
101
|
+
/**
|
|
102
|
+
if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.
|
|
103
|
+
if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.
|
|
104
|
+
if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.
|
|
105
|
+
*/
|
|
106
|
+
this.maxRetention = Math.max(this.maxRetention, serverPolicy.limits.max_lifetime.min ?? 0);
|
|
107
|
+
this.maxRetention = Math.min(this.maxRetention, serverPolicy.limits.max_lifetime.max ?? Number.MAX_SAFE_INTEGER);
|
|
108
|
+
}
|
|
109
|
+
this.processTimeline();
|
|
110
|
+
});
|
|
121
111
|
_defineProperty(this, "timelineUpdated", () => {
|
|
122
112
|
this.logger.info("timelineUpdated");
|
|
123
113
|
this.scheduleTimelineCheck(200);
|
|
@@ -131,7 +121,10 @@ export class RoomRetentionPolicy {
|
|
|
131
121
|
this.retentionTimeout = undefined;
|
|
132
122
|
}, nextTs);
|
|
133
123
|
});
|
|
134
|
-
this.
|
|
124
|
+
this.room = room;
|
|
125
|
+
this.retentionService = retentionService;
|
|
126
|
+
this.store = store;
|
|
127
|
+
this.logger = rootLogger.getChild(`RetentionPolicy ${room.roomId}`);
|
|
135
128
|
|
|
136
129
|
// Recalculate on room state update.
|
|
137
130
|
room.on(RoomStateEvent.Events, event => {
|
|
@@ -155,31 +148,29 @@ export class RoomRetentionPolicy {
|
|
|
155
148
|
if (!this.maxRetention) {
|
|
156
149
|
return true;
|
|
157
150
|
}
|
|
158
|
-
|
|
151
|
+
const expireBefore = Date.now() - this.maxRetention;
|
|
159
152
|
return ev.getTs() > expireBefore;
|
|
160
153
|
}
|
|
161
154
|
processTimeline() {
|
|
162
155
|
if (!this.maxRetention) {
|
|
163
156
|
return; // No policy, skip.
|
|
164
157
|
}
|
|
165
|
-
this.logger.info(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
_events$filter$sort2 = _slicedToArray(_events$filter$sort, 1),
|
|
171
|
-
earliestExpiringEvent = _events$filter$sort2[0];
|
|
158
|
+
this.logger.info(`Running processTimeline`);
|
|
159
|
+
const expireBefore = Date.now() - this.maxRetention;
|
|
160
|
+
const events = this.room.getLiveTimeline().getEvents().filter(ev => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== "m.room.redaction");
|
|
161
|
+
const expiredEvents = events.filter(ev => ev.getTs() < expireBefore);
|
|
162
|
+
const [earliestExpiringEvent] = events.filter(ev => ev.getTs() >= expireBefore).sort((a, b) => a.getTs() - b.getTs());
|
|
172
163
|
if (earliestExpiringEvent) {
|
|
173
|
-
|
|
174
|
-
this.logger.info(
|
|
164
|
+
const nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();
|
|
165
|
+
this.logger.info(`Next expiry scheduled for ${nextTs}`);
|
|
175
166
|
this.scheduleTimelineCheck(nextTs);
|
|
176
167
|
}
|
|
177
168
|
if (expiredEvents.length === 0) {
|
|
178
169
|
this.logger.info("Found no expired events");
|
|
179
170
|
return;
|
|
180
171
|
}
|
|
181
|
-
this.logger.info(
|
|
182
|
-
for (
|
|
172
|
+
this.logger.info(`Found ${expiredEvents.length} expired events`);
|
|
173
|
+
for (const event of expiredEvents) {
|
|
183
174
|
this.room.tryApplyRedaction(new MatrixEvent({
|
|
184
175
|
type: EventType.RoomRedaction,
|
|
185
176
|
sender: event.getSender(),
|
|
@@ -194,7 +185,7 @@ export class RoomRetentionPolicy {
|
|
|
194
185
|
}));
|
|
195
186
|
}
|
|
196
187
|
void this.store.removeEventsFromRoom(this.room.roomId, expiredEvents.map(e => e.getId())).catch(ex => {
|
|
197
|
-
this.logger.warn(
|
|
188
|
+
this.logger.warn(`Failed to remove events from store`, ex);
|
|
198
189
|
});
|
|
199
190
|
}
|
|
200
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-retention.js","names":["MatrixEvent","RoomEvent","RoomStateEvent","logger","rootLogger","EventType","ROOM_RETENTION_TYPE","RoomRetentionPolicy","constructor","room","retentionService","store","_this","_defineProperty","_asyncToGenerator","hadRetentionPeriod","maxRetention","recalculateRetention","currentState","err","warn","info","on","Timeline","timelineUpdated","off","_ref2","roomState","_serverPolicy$policie","_unstableEvent$getCon","_ref3","_serverPolicy$policie2","_serverPolicy$limits2","unstableEvent","getStateEvents","name","find","e","getStateKey","stableEvent","altName","serverPolicy","getCached","serverRoomPolicy","policies","roomId","roomStatePolicy","getContent","content","validatePolicy","maxLifetime","max_lifetime","_serverPolicy$limits","limits","min","Error","concat","Number","isInteger","_serverPolicy$limits$","_serverPolicy$limits$2","Math","max","MAX_SAFE_INTEGER","processTimeline","_x","apply","arguments","scheduleTimelineCheck","nextTs","retentionTimeout","clearTimeout","setTimeout","undefined","getChild","Events","event","getType","handleRetentionUpdate","shouldEventBeRetained","ev","expireBefore","Date","now","getTs","events","getLiveTimeline","getEvents","filter","isRedacted","expiredEvents","_events$filter$sort","sort","a","b","_events$filter$sort2","_slicedToArray","earliestExpiringEvent","length","tryApplyRedaction","type","RoomRedaction","sender","getSender","event_id","room_id","redacts","getId","reason","origin_server_ts","unsigned","removeEventsFromRoom","map","catch","ex"],"sources":["../../src/models/room-retention.ts"],"sourcesContent":["/*\nCopyright 2026 Element Creations Ltd.\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 { MatrixEvent } from \"../models/event.ts\";\nimport { RoomEvent, type Room } from \"./room.ts\";\nimport { RoomStateEvent, type RoomState } from \"./room-state.ts\";\nimport { type Logger, logger as rootLogger } from \"../logger.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport type { RetentionPolicyService } from \"../retentionPolicy.ts\";\nimport type { IStore } from \"../store/index.ts\";\nimport { ROOM_RETENTION_TYPE, type RoomRetentionContent } from \"../@types/retention.ts\";\n\n/**\n * Applies https://github.com/matrix-org/matrix-spec-proposals/pull/1763 by checking the current\n * state of the room and applying the *latest* retention policy to all preceeding events.\n * Currently does not:\n * - Apply global server policies (requires Synapse work)\n * - React at all to `min_retention` configs.\n * - Loop\n */\nexport class RoomRetentionPolicy {\n // minRetention is not implemented.\n private maxRetention: number | null = null;\n private retentionTimeout?: ReturnType<typeof setTimeout>;\n private readonly logger: Logger;\n\n public constructor(\n private readonly room: Room,\n private readonly retentionService: RetentionPolicyService,\n private readonly store: IStore,\n ) {\n this.logger = rootLogger.getChild(`RetentionPolicy ${room.roomId}`);\n\n // Recalculate on room state update.\n room.on(RoomStateEvent.Events, (event) => {\n if (\n event.getStateKey() !== \"\" ||\n (event.getType() !== \"org.matrix.msc1763.retention\" && event.getType() !== \"m.room.retention\")\n ) {\n return;\n }\n void this.handleRetentionUpdate();\n });\n\n // Recalculate our retention whenever the global policy changes.\n this.retentionService.on(\"update\", () => {\n this.logger.info(\"Got global retention policy update!\");\n void this.handleRetentionUpdate();\n });\n // Do an initial check on construction.\n void this.handleRetentionUpdate();\n\n // Only bind RoomEvent.Timeline once we know we have a retention policy.\n }\n\n public shouldEventBeRetained(ev: MatrixEvent): boolean {\n if (!this.maxRetention) {\n return true;\n }\n const expireBefore = Date.now() - this.maxRetention;\n return ev.getTs() > expireBefore;\n }\n\n private readonly handleRetentionUpdate = async (): Promise<void> => {\n // First store if we currently have a retention period.\n const hadRetentionPeriod = this.maxRetention !== null;\n\n try {\n await this.recalculateRetention(this.room.currentState);\n } catch (err) {\n this.logger.warn(\"Failed to recalculate retention policy\", err);\n return;\n }\n\n // Bind/unbind the Timeline event handler based on whether we should be running retention.\n if (hadRetentionPeriod !== (this.maxRetention !== null)) {\n this.logger.info(\"retention recalculated to be\", this.maxRetention);\n // We've changed\n if (this.maxRetention) {\n this.room.on(RoomEvent.Timeline, this.timelineUpdated);\n } else {\n this.room.off(RoomEvent.Timeline, this.timelineUpdated);\n }\n }\n };\n\n private readonly recalculateRetention = async (roomState: RoomState): Promise<void> => {\n const unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find((e) => e.getStateKey() === \"\");\n const stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find((e) => e.getStateKey() === \"\");\n\n const serverPolicy = this.retentionService.getCached();\n\n const serverRoomPolicy = serverPolicy?.policies?.[this.room.roomId];\n const roomStatePolicy =\n unstableEvent?.getContent<RoomRetentionContent>() ?? stableEvent?.getContent<RoomRetentionContent>();\n\n const content =\n // * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.\n serverRoomPolicy ??\n // * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:\n roomStatePolicy ??\n // * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:\n serverPolicy?.policies?.[\"*\"];\n\n if (!content) {\n // * otherwise, don't apply a retention policy in this room.\n this.maxRetention = null;\n return;\n }\n\n const validatePolicy = !serverRoomPolicy && roomStatePolicy;\n\n // Parse it\n let { max_lifetime: maxLifetime } = content;\n\n if (!maxLifetime && validatePolicy) {\n // if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).\n maxLifetime = serverPolicy?.limits?.max_lifetime?.min;\n if (!maxLifetime) {\n this.maxRetention = null;\n return;\n }\n }\n\n if (typeof maxLifetime !== \"number\") {\n throw Error(`max_lifetime must be a number, got \"${maxLifetime}\"`);\n }\n if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {\n throw Error(`max_lifetime must be >= 0, got ${maxLifetime}`);\n }\n this.maxRetention = maxLifetime;\n\n if (validatePolicy && serverPolicy?.limits?.max_lifetime) {\n // We're using room state so we need to validate this policy matches the server.\n /**\n if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.\n if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.\n if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.\n */\n this.maxRetention = Math.max(this.maxRetention, serverPolicy.limits.max_lifetime.min ?? 0);\n this.maxRetention = Math.min(\n this.maxRetention,\n serverPolicy.limits.max_lifetime.max ?? Number.MAX_SAFE_INTEGER,\n );\n }\n\n this.processTimeline();\n };\n\n private readonly timelineUpdated = (): void => {\n this.logger.info(\"timelineUpdated\");\n this.scheduleTimelineCheck(200);\n };\n\n private readonly scheduleTimelineCheck = (nextTs: number): void => {\n if (this.retentionTimeout) {\n clearTimeout(this.retentionTimeout);\n }\n this.retentionTimeout = setTimeout(() => {\n this.processTimeline();\n this.retentionTimeout = undefined;\n }, nextTs);\n };\n\n private processTimeline(): void {\n if (!this.maxRetention) {\n return; // No policy, skip.\n }\n this.logger.info(`Running processTimeline`);\n const expireBefore = Date.now() - this.maxRetention;\n const events = this.room\n .getLiveTimeline()\n .getEvents()\n .filter((ev) => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== \"m.room.redaction\");\n\n const expiredEvents = events.filter((ev) => ev.getTs() < expireBefore);\n const [earliestExpiringEvent] = events\n .filter((ev) => ev.getTs() >= expireBefore)\n .sort((a, b) => a.getTs() - b.getTs());\n\n if (earliestExpiringEvent) {\n const nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();\n this.logger.info(`Next expiry scheduled for ${nextTs}`);\n this.scheduleTimelineCheck(nextTs);\n }\n\n if (expiredEvents.length === 0) {\n this.logger.info(\"Found no expired events\");\n return;\n }\n this.logger.info(`Found ${expiredEvents.length} expired events`);\n for (const event of expiredEvents) {\n this.room.tryApplyRedaction(\n new MatrixEvent({\n type: EventType.RoomRedaction,\n sender: event.getSender(),\n event_id: \"$synthetic_redaction\",\n room_id: this.room.roomId,\n redacts: event.getId(),\n content: {\n reason: \"Retention policy\",\n },\n origin_server_ts: Date.now(),\n unsigned: {},\n }),\n );\n }\n void this.store\n .removeEventsFromRoom(\n this.room.roomId,\n expiredEvents.map((e) => e.getId()!),\n )\n .catch((ex) => {\n this.logger.warn(`Failed to remove events from store`, ex);\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"room-retention.js","names":[],"sources":["../../src/models/room-retention.ts"],"sourcesContent":["/*\nCopyright 2026 Element Creations Ltd.\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 { MatrixEvent } from \"../models/event.ts\";\nimport { RoomEvent, type Room } from \"./room.ts\";\nimport { RoomStateEvent, type RoomState } from \"./room-state.ts\";\nimport { type Logger, logger as rootLogger } from \"../logger.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport type { RetentionPolicyService } from \"../retentionPolicy.ts\";\nimport type { IStore } from \"../store/index.ts\";\nimport { ROOM_RETENTION_TYPE, type RoomRetentionContent } from \"../@types/retention.ts\";\n\n/**\n * Applies https://github.com/matrix-org/matrix-spec-proposals/pull/1763 by checking the current\n * state of the room and applying the *latest* retention policy to all preceeding events.\n * Currently does not:\n * - Apply global server policies (requires Synapse work)\n * - React at all to `min_retention` configs.\n * - Loop\n */\nexport class RoomRetentionPolicy {\n // minRetention is not implemented.\n private maxRetention: number | null = null;\n private retentionTimeout?: ReturnType<typeof setTimeout>;\n private readonly logger: Logger;\n\n public constructor(\n private readonly room: Room,\n private readonly retentionService: RetentionPolicyService,\n private readonly store: IStore,\n ) {\n this.logger = rootLogger.getChild(`RetentionPolicy ${room.roomId}`);\n\n // Recalculate on room state update.\n room.on(RoomStateEvent.Events, (event) => {\n if (\n event.getStateKey() !== \"\" ||\n (event.getType() !== \"org.matrix.msc1763.retention\" && event.getType() !== \"m.room.retention\")\n ) {\n return;\n }\n void this.handleRetentionUpdate();\n });\n\n // Recalculate our retention whenever the global policy changes.\n this.retentionService.on(\"update\", () => {\n this.logger.info(\"Got global retention policy update!\");\n void this.handleRetentionUpdate();\n });\n // Do an initial check on construction.\n void this.handleRetentionUpdate();\n\n // Only bind RoomEvent.Timeline once we know we have a retention policy.\n }\n\n public shouldEventBeRetained(ev: MatrixEvent): boolean {\n if (!this.maxRetention) {\n return true;\n }\n const expireBefore = Date.now() - this.maxRetention;\n return ev.getTs() > expireBefore;\n }\n\n private readonly handleRetentionUpdate = async (): Promise<void> => {\n // First store if we currently have a retention period.\n const hadRetentionPeriod = this.maxRetention !== null;\n\n try {\n await this.recalculateRetention(this.room.currentState);\n } catch (err) {\n this.logger.warn(\"Failed to recalculate retention policy\", err);\n return;\n }\n\n // Bind/unbind the Timeline event handler based on whether we should be running retention.\n if (hadRetentionPeriod !== (this.maxRetention !== null)) {\n this.logger.info(\"retention recalculated to be\", this.maxRetention);\n // We've changed\n if (this.maxRetention) {\n this.room.on(RoomEvent.Timeline, this.timelineUpdated);\n } else {\n this.room.off(RoomEvent.Timeline, this.timelineUpdated);\n }\n }\n };\n\n private readonly recalculateRetention = async (roomState: RoomState): Promise<void> => {\n const unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find((e) => e.getStateKey() === \"\");\n const stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find((e) => e.getStateKey() === \"\");\n\n const serverPolicy = this.retentionService.getCached();\n\n const serverRoomPolicy = serverPolicy?.policies?.[this.room.roomId];\n const roomStatePolicy =\n unstableEvent?.getContent<RoomRetentionContent>() ?? stableEvent?.getContent<RoomRetentionContent>();\n\n const content =\n // * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.\n serverRoomPolicy ??\n // * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:\n roomStatePolicy ??\n // * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:\n serverPolicy?.policies?.[\"*\"];\n\n if (!content) {\n // * otherwise, don't apply a retention policy in this room.\n this.maxRetention = null;\n return;\n }\n\n const validatePolicy = !serverRoomPolicy && roomStatePolicy;\n\n // Parse it\n let { max_lifetime: maxLifetime } = content;\n\n if (!maxLifetime && validatePolicy) {\n // if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).\n maxLifetime = serverPolicy?.limits?.max_lifetime?.min;\n if (!maxLifetime) {\n this.maxRetention = null;\n return;\n }\n }\n\n if (typeof maxLifetime !== \"number\") {\n throw Error(`max_lifetime must be a number, got \"${maxLifetime}\"`);\n }\n if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {\n throw Error(`max_lifetime must be >= 0, got ${maxLifetime}`);\n }\n this.maxRetention = maxLifetime;\n\n if (validatePolicy && serverPolicy?.limits?.max_lifetime) {\n // We're using room state so we need to validate this policy matches the server.\n /**\n if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.\n if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.\n if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.\n */\n this.maxRetention = Math.max(this.maxRetention, serverPolicy.limits.max_lifetime.min ?? 0);\n this.maxRetention = Math.min(\n this.maxRetention,\n serverPolicy.limits.max_lifetime.max ?? Number.MAX_SAFE_INTEGER,\n );\n }\n\n this.processTimeline();\n };\n\n private readonly timelineUpdated = (): void => {\n this.logger.info(\"timelineUpdated\");\n this.scheduleTimelineCheck(200);\n };\n\n private readonly scheduleTimelineCheck = (nextTs: number): void => {\n if (this.retentionTimeout) {\n clearTimeout(this.retentionTimeout);\n }\n this.retentionTimeout = setTimeout(() => {\n this.processTimeline();\n this.retentionTimeout = undefined;\n }, nextTs);\n };\n\n private processTimeline(): void {\n if (!this.maxRetention) {\n return; // No policy, skip.\n }\n this.logger.info(`Running processTimeline`);\n const expireBefore = Date.now() - this.maxRetention;\n const events = this.room\n .getLiveTimeline()\n .getEvents()\n .filter((ev) => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== \"m.room.redaction\");\n\n const expiredEvents = events.filter((ev) => ev.getTs() < expireBefore);\n const [earliestExpiringEvent] = events\n .filter((ev) => ev.getTs() >= expireBefore)\n .sort((a, b) => a.getTs() - b.getTs());\n\n if (earliestExpiringEvent) {\n const nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();\n this.logger.info(`Next expiry scheduled for ${nextTs}`);\n this.scheduleTimelineCheck(nextTs);\n }\n\n if (expiredEvents.length === 0) {\n this.logger.info(\"Found no expired events\");\n return;\n }\n this.logger.info(`Found ${expiredEvents.length} expired events`);\n for (const event of expiredEvents) {\n this.room.tryApplyRedaction(\n new MatrixEvent({\n type: EventType.RoomRedaction,\n sender: event.getSender(),\n event_id: \"$synthetic_redaction\",\n room_id: this.room.roomId,\n redacts: event.getId(),\n content: {\n reason: \"Retention policy\",\n },\n origin_server_ts: Date.now(),\n unsigned: {},\n }),\n );\n }\n void this.store\n .removeEventsFromRoom(\n this.room.roomId,\n expiredEvents.map((e) => e.getId()!),\n )\n .catch((ex) => {\n this.logger.warn(`Failed to remove events from store`, ex);\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|