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,6 +1,5 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
1
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
3
|
/*
|
|
5
4
|
Copyright 2022 - 2023 The Matrix.org Foundation C.I.C.
|
|
6
5
|
|
|
@@ -42,8 +41,8 @@ export class PollEndEvent extends ExtensibleEvent {
|
|
|
42
41
|
* The closing message for the event.
|
|
43
42
|
*/
|
|
44
43
|
_defineProperty(this, "closingMessage", void 0);
|
|
45
|
-
|
|
46
|
-
if (!REFERENCE_RELATION.matches(rel
|
|
44
|
+
const rel = this.wireContent["m.relates_to"];
|
|
45
|
+
if (!REFERENCE_RELATION.matches(rel?.rel_type) || typeof rel?.event_id !== "string") {
|
|
47
46
|
throw new InvalidEventError("Relationship must be a reference to an event");
|
|
48
47
|
}
|
|
49
48
|
this.pollEventId = rel.event_id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PollEndEvent.js","names":[
|
|
1
|
+
{"version":3,"file":"PollEndEvent.js","names":[],"sources":["../../src/extensible_events_v1/PollEndEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 ExtensibleEventType,\n type IPartialEvent,\n isEventTypeSame,\n M_TEXT,\n REFERENCE_RELATION,\n} from \"../@types/extensible_events.ts\";\nimport { M_POLL_END, type PollEndEventContent } from \"../@types/polls.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { MessageEvent } from \"./MessageEvent.ts\";\n\n/**\n * Represents a poll end/closure event.\n */\nexport class PollEndEvent extends ExtensibleEvent<PollEndEventContent> {\n /**\n * The poll start event ID referenced by the response.\n */\n public readonly pollEventId: string;\n\n /**\n * The closing message for the event.\n */\n public readonly closingMessage: MessageEvent;\n\n /**\n * Creates a new PollEndEvent from a pure format. Note that the event is *not*\n * parsed here: it will be treated as a literal m.poll.response primary typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<PollEndEventContent>) {\n super(wireFormat);\n\n const rel = this.wireContent[\"m.relates_to\"];\n if (!REFERENCE_RELATION.matches(rel?.rel_type) || typeof rel?.event_id !== \"string\") {\n throw new InvalidEventError(\"Relationship must be a reference to an event\");\n }\n\n this.pollEventId = rel.event_id;\n this.closingMessage = new MessageEvent(this.wireFormat);\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_POLL_END);\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: M_POLL_END.name,\n content: {\n \"m.relates_to\": {\n rel_type: REFERENCE_RELATION.name,\n event_id: this.pollEventId,\n },\n [M_POLL_END.name]: {},\n ...this.closingMessage.serialize().content,\n },\n };\n }\n\n /**\n * Creates a new PollEndEvent from a poll event ID.\n * @param pollEventId - The poll start event ID.\n * @param message - A closing message, typically revealing the top answer.\n * @returns The representative poll closure event.\n */\n public static from(pollEventId: string, message: string): PollEndEvent {\n return new PollEndEvent({\n type: M_POLL_END.name,\n content: {\n \"m.relates_to\": {\n rel_type: REFERENCE_RELATION.name,\n event_id: pollEventId,\n },\n [M_POLL_END.name]: {},\n [M_TEXT.name]: message,\n },\n });\n }\n}\n"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAGI,eAAe,EACf,MAAM,EACN,kBAAkB,QACf,gCAAgC;AACvC,SAAS,UAAU,QAAkC,oBAAoB;AACzE,SAAS,eAAe,QAAQ,sBAAsB;AACtD,SAAS,iBAAiB,QAAQ,wBAAwB;AAC1D,SAAS,YAAY,QAAQ,mBAAmB;;AAEhD;AACA;AACA;AACA,OAAO,MAAM,YAAY,SAAS,eAAe,CAAsB;EAWnE;AACJ;AACA;AACA;AACA;EACW,WAAW,CAAC,UAA8C,EAAE;IAC/D,KAAK,CAAC,UAAU,CAAC;IAhBrB;AACJ;AACA;IAFI;IAKA;AACJ;AACA;IAFI;IAaI,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IAC5C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,OAAO,GAAG,EAAE,QAAQ,KAAK,QAAQ,EAAE;MACjF,MAAM,IAAI,iBAAiB,CAAC,8CAA8C,CAAC;IAC/E;IAEA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,QAAQ;IAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;EAC3D;EAEO,cAAc,CAAC,gBAAqC,EAAW;IAClE,OAAO,eAAe,CAAC,gBAAgB,EAAE,UAAU,CAAC;EACxD;EAEO,SAAS,GAA0B;IACtC,OAAO;MACH,IAAI,EAAE,UAAU,CAAC,IAAI;MACrB,OAAO;QACH,cAAc,EAAE;UACZ,QAAQ,EAAE,kBAAkB,CAAC,IAAI;UACjC,QAAQ,EAAE,IAAI,CAAC;QACnB,CAAC;QACD,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;MAAC,GAClB,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;IAElD,CAAC;EACL;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACI,OAAc,IAAI,CAAC,WAAmB,EAAE,OAAe,EAAgB;IACnE,OAAO,IAAI,YAAY,CAAC;MACpB,IAAI,EAAE,UAAU,CAAC,IAAI;MACrB,OAAO,EAAE;QACL,cAAc,EAAE;UACZ,QAAQ,EAAE,kBAAkB,CAAC,IAAI;UACjC,QAAQ,EAAE;QACd,CAAC;QACD,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QACrB,CAAC,MAAM,CAAC,IAAI,GAAG;MACnB;IACJ,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -54,8 +54,8 @@ export class PollResponseEvent extends ExtensibleEvent {
|
|
|
54
54
|
_defineProperty(this, "internalAnswerIds", []);
|
|
55
55
|
_defineProperty(this, "internalSpoiled", false);
|
|
56
56
|
_defineProperty(this, "pollEventId", void 0);
|
|
57
|
-
|
|
58
|
-
if (!REFERENCE_RELATION.matches(rel
|
|
57
|
+
const rel = this.wireContent["m.relates_to"];
|
|
58
|
+
if (!REFERENCE_RELATION.matches(rel?.rel_type) || typeof rel?.event_id !== "string") {
|
|
59
59
|
throw new InvalidEventError("Relationship must be a reference to an event");
|
|
60
60
|
}
|
|
61
61
|
this.pollEventId = rel.event_id;
|
|
@@ -68,14 +68,13 @@ export class PollResponseEvent extends ExtensibleEvent {
|
|
|
68
68
|
* @param poll - The poll start event.
|
|
69
69
|
*/
|
|
70
70
|
validateAgainst(poll) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (!Array.isArray(response === null || response === void 0 ? void 0 : response.answers)) {
|
|
71
|
+
const response = M_POLL_RESPONSE.findIn(this.wireContent);
|
|
72
|
+
if (!Array.isArray(response?.answers)) {
|
|
74
73
|
this.internalSpoiled = true;
|
|
75
74
|
this.internalAnswerIds = [];
|
|
76
75
|
return;
|
|
77
76
|
}
|
|
78
|
-
|
|
77
|
+
let answers = response?.answers ?? [];
|
|
79
78
|
if (answers.some(a => typeof a !== "string") || answers.length === 0) {
|
|
80
79
|
this.internalSpoiled = true;
|
|
81
80
|
this.internalAnswerIds = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PollResponseEvent.js","names":[
|
|
1
|
+
{"version":3,"file":"PollResponseEvent.js","names":[],"sources":["../../src/extensible_events_v1/PollResponseEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport { M_POLL_RESPONSE, type PollResponseEventContent, type PollResponseSubtype } from \"../@types/polls.ts\";\nimport {\n type ExtensibleEventType,\n type IPartialEvent,\n isEventTypeSame,\n REFERENCE_RELATION,\n} from \"../@types/extensible_events.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { type PollStartEvent } from \"./PollStartEvent.ts\";\n\n/**\n * Represents a poll response event.\n */\nexport class PollResponseEvent extends ExtensibleEvent<PollResponseEventContent> {\n private internalAnswerIds: string[] = [];\n private internalSpoiled = false;\n\n /**\n * The provided answers for the poll. Note that this may be falsy/unpredictable if\n * the `spoiled` property is true.\n */\n public get answerIds(): string[] {\n return this.internalAnswerIds;\n }\n\n /**\n * The poll start event ID referenced by the response.\n */\n public readonly pollEventId: string;\n\n /**\n * Whether the vote is spoiled.\n */\n public get spoiled(): boolean {\n return this.internalSpoiled;\n }\n\n /**\n * Creates a new PollResponseEvent from a pure format. Note that the event is *not*\n * parsed here: it will be treated as a literal m.poll.response primary typed event.\n *\n * To validate the response against a poll, call `validateAgainst` after creation.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<PollResponseEventContent>) {\n super(wireFormat);\n\n const rel = this.wireContent[\"m.relates_to\"];\n if (!REFERENCE_RELATION.matches(rel?.rel_type) || typeof rel?.event_id !== \"string\") {\n throw new InvalidEventError(\"Relationship must be a reference to an event\");\n }\n\n this.pollEventId = rel.event_id;\n this.validateAgainst(null);\n }\n\n /**\n * Validates the poll response using the poll start event as a frame of reference. This\n * is used to determine if the vote is spoiled, whether the answers are valid, etc.\n * @param poll - The poll start event.\n */\n public validateAgainst(poll: PollStartEvent | null): void {\n const response = M_POLL_RESPONSE.findIn<PollResponseSubtype>(this.wireContent);\n if (!Array.isArray(response?.answers)) {\n this.internalSpoiled = true;\n this.internalAnswerIds = [];\n return;\n }\n\n let answers = response?.answers ?? [];\n if (answers.some((a) => typeof a !== \"string\") || answers.length === 0) {\n this.internalSpoiled = true;\n this.internalAnswerIds = [];\n return;\n }\n\n if (poll) {\n if (answers.some((a) => !poll.answers.some((pa) => pa.id === a))) {\n this.internalSpoiled = true;\n this.internalAnswerIds = [];\n return;\n }\n\n answers = answers.slice(0, poll.maxSelections);\n }\n\n this.internalAnswerIds = answers;\n this.internalSpoiled = false;\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_POLL_RESPONSE);\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: M_POLL_RESPONSE.name,\n content: {\n \"m.relates_to\": {\n rel_type: REFERENCE_RELATION.name,\n event_id: this.pollEventId,\n },\n [M_POLL_RESPONSE.name]: {\n answers: this.spoiled ? undefined : this.answerIds,\n },\n },\n };\n }\n\n /**\n * Creates a new PollResponseEvent from a set of answers. To spoil the vote, pass an empty\n * answers array.\n * @param answers - The user's answers. Should be valid from a poll's answer IDs.\n * @param pollEventId - The poll start event ID.\n * @returns The representative poll response event.\n */\n public static from(answers: string[], pollEventId: string): PollResponseEvent {\n return new PollResponseEvent({\n type: M_POLL_RESPONSE.name,\n content: {\n \"m.relates_to\": {\n rel_type: REFERENCE_RELATION.name,\n event_id: pollEventId,\n },\n [M_POLL_RESPONSE.name]: {\n answers: answers,\n },\n },\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
1
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
3
|
/*
|
|
5
4
|
Copyright 2022 - 2023 The Matrix.org Foundation C.I.C.
|
|
6
5
|
|
|
@@ -36,7 +35,7 @@ export class PollAnswerSubevent extends MessageEvent {
|
|
|
36
35
|
* The answer ID.
|
|
37
36
|
*/
|
|
38
37
|
_defineProperty(this, "id", void 0);
|
|
39
|
-
|
|
38
|
+
const id = wireFormat.content.id;
|
|
40
39
|
if (!id || typeof id !== "string") {
|
|
41
40
|
throw new InvalidEventError("Answer ID must be a non-empty string");
|
|
42
41
|
}
|
|
@@ -103,8 +102,8 @@ export class PollStartEvent extends ExtensibleEvent {
|
|
|
103
102
|
* The possible answers for the poll.
|
|
104
103
|
*/
|
|
105
104
|
_defineProperty(this, "answers", void 0);
|
|
106
|
-
|
|
107
|
-
if (!
|
|
105
|
+
const poll = M_POLL_START.findIn(this.wireContent);
|
|
106
|
+
if (!poll?.question) {
|
|
108
107
|
throw new InvalidEventError("A question is required");
|
|
109
108
|
}
|
|
110
109
|
this.question = new MessageEvent({
|
|
@@ -121,7 +120,7 @@ export class PollStartEvent extends ExtensibleEvent {
|
|
|
121
120
|
if (!Array.isArray(poll.answers)) {
|
|
122
121
|
throw new InvalidEventError("Poll answers must be an array");
|
|
123
122
|
}
|
|
124
|
-
|
|
123
|
+
const answers = poll.answers.slice(0, 20).map(a => new PollAnswerSubevent({
|
|
125
124
|
type: "org.matrix.sdk.poll.answer",
|
|
126
125
|
content: a
|
|
127
126
|
}));
|
|
@@ -143,7 +142,7 @@ export class PollStartEvent extends ExtensibleEvent {
|
|
|
143
142
|
max_selections: this.maxSelections,
|
|
144
143
|
answers: this.answers.map(a => a.serialize().content)
|
|
145
144
|
},
|
|
146
|
-
[M_TEXT.name]:
|
|
145
|
+
[M_TEXT.name]: `${this.question.text}\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join("\n")}`
|
|
147
146
|
}
|
|
148
147
|
};
|
|
149
148
|
}
|
|
@@ -156,8 +155,7 @@ export class PollStartEvent extends ExtensibleEvent {
|
|
|
156
155
|
* @param maxSelections - The maximum number of selections. Must be 1 or higher.
|
|
157
156
|
* @returns The representative poll start event.
|
|
158
157
|
*/
|
|
159
|
-
static from(question, answers, kind) {
|
|
160
|
-
var maxSelections = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
|
|
158
|
+
static from(question, answers, kind, maxSelections = 1) {
|
|
161
159
|
return new PollStartEvent({
|
|
162
160
|
type: M_POLL_START.name,
|
|
163
161
|
content: {
|
|
@@ -178,7 +176,7 @@ export class PollStartEvent extends ExtensibleEvent {
|
|
|
178
176
|
});
|
|
179
177
|
}
|
|
180
178
|
}
|
|
181
|
-
|
|
179
|
+
const LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
182
180
|
function makeId() {
|
|
183
181
|
return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join("");
|
|
184
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PollStartEvent.js","names":["NamespacedValue","MessageEvent","isEventTypeSame","M_TEXT","M_POLL_KIND_DISCLOSED","M_POLL_KIND_UNDISCLOSED","M_POLL_START","InvalidEventError","ExtensibleEvent","PollAnswerSubevent","constructor","wireFormat","_defineProperty","id","content","serialize","type","_objectSpread","serializeMMessageOnly","from","text","name","PollStartEvent","poll","findIn","wireContent","question","rawKind","kind","matches","maxSelections","Number","isFinite","max_selections","Array","isArray","answers","slice","map","a","length","isEquivalentTo","primaryEventType","concat","i","join","arguments","undefined","makeId","LETTERS","charAt","Math","floor","random"],"sources":["../../src/extensible_events_v1/PollStartEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 { NamespacedValue } from \"matrix-events-sdk\";\n\nimport { MessageEvent } from \"./MessageEvent.ts\";\nimport { type ExtensibleEventType, type IPartialEvent, isEventTypeSame, M_TEXT } from \"../@types/extensible_events.ts\";\nimport {\n type KnownPollKind,\n M_POLL_KIND_DISCLOSED,\n M_POLL_KIND_UNDISCLOSED,\n M_POLL_START,\n type PollStartEventContent,\n type PollStartSubtype,\n type PollAnswer,\n} from \"../@types/polls.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\n\n/**\n * Represents a poll answer. Note that this is represented as a subtype and is\n * not registered as a parsable event - it is implied for usage exclusively\n * within the PollStartEvent parsing.\n */\nexport class PollAnswerSubevent extends MessageEvent {\n /**\n * The answer ID.\n */\n public readonly id: string;\n\n public constructor(wireFormat: IPartialEvent<PollAnswer>) {\n super(wireFormat);\n\n const id = wireFormat.content.id;\n if (!id || typeof id !== \"string\") {\n throw new InvalidEventError(\"Answer ID must be a non-empty string\");\n }\n this.id = id;\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: this.id,\n ...this.serializeMMessageOnly(),\n },\n };\n }\n\n /**\n * Creates a new PollAnswerSubevent from ID and text.\n * @param id - The answer ID (unique within the poll).\n * @param text - The text.\n * @returns The representative answer.\n */\n public static from(id: string, text: string): PollAnswerSubevent {\n return new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: id,\n [M_TEXT.name]: text,\n },\n });\n }\n}\n\n/**\n * Represents a poll start event.\n */\nexport class PollStartEvent extends ExtensibleEvent<PollStartEventContent> {\n /**\n * The question being asked, as a MessageEvent node.\n */\n public readonly question: MessageEvent;\n\n /**\n * The interpreted kind of poll. Note that this will infer a value that is known to the\n * SDK rather than verbatim - this means unknown types will be represented as undisclosed\n * polls.\n *\n * To get the raw kind, use rawKind.\n */\n public readonly kind: KnownPollKind;\n\n /**\n * The true kind as provided by the event sender. Might not be valid.\n */\n public readonly rawKind: string;\n\n /**\n * The maximum number of selections a user is allowed to make.\n */\n public readonly maxSelections: number;\n\n /**\n * The possible answers for the poll.\n */\n public readonly answers: PollAnswerSubevent[];\n\n /**\n * Creates a new PollStartEvent from a pure format. Note that the event is *not*\n * parsed here: it will be treated as a literal m.poll.start primary typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<PollStartEventContent>) {\n super(wireFormat);\n\n const poll = M_POLL_START.findIn<PollStartSubtype>(this.wireContent);\n\n if (!poll?.question) {\n throw new InvalidEventError(\"A question is required\");\n }\n\n this.question = new MessageEvent({ type: \"org.matrix.sdk.poll.question\", content: poll.question });\n\n this.rawKind = poll.kind;\n if (M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {\n this.kind = M_POLL_KIND_DISCLOSED;\n } else {\n this.kind = M_POLL_KIND_UNDISCLOSED; // default & assumed value\n }\n\n this.maxSelections =\n Number.isFinite(poll.max_selections) && poll.max_selections! > 0 ? poll.max_selections! : 1;\n\n if (!Array.isArray(poll.answers)) {\n throw new InvalidEventError(\"Poll answers must be an array\");\n }\n const answers = poll.answers.slice(0, 20).map(\n (a) =>\n new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: a,\n }),\n );\n if (answers.length <= 0) {\n throw new InvalidEventError(\"No answers available\");\n }\n this.answers = answers;\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_POLL_START);\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: M_POLL_START.name,\n content: {\n [M_POLL_START.name]: {\n question: this.question.serialize().content,\n kind: this.rawKind,\n max_selections: this.maxSelections,\n answers: this.answers.map((a) => a.serialize().content),\n },\n [M_TEXT.name]: `${this.question.text}\\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join(\"\\n\")}`,\n },\n };\n }\n\n /**\n * Creates a new PollStartEvent from question, answers, and metadata.\n * @param question - The question to ask.\n * @param answers - The answers. Should be unique within each other.\n * @param kind - The kind of poll.\n * @param maxSelections - The maximum number of selections. Must be 1 or higher.\n * @returns The representative poll start event.\n */\n public static from(\n question: string,\n answers: string[],\n kind: KnownPollKind | string,\n maxSelections = 1,\n ): PollStartEvent {\n return new PollStartEvent({\n type: M_POLL_START.name,\n content: {\n [M_TEXT.name]: question, // unused by parsing\n [M_POLL_START.name]: {\n question: { [M_TEXT.name]: question },\n kind: kind instanceof NamespacedValue ? kind.name : kind,\n max_selections: maxSelections,\n answers: answers.map((a) => ({ id: makeId(), [M_TEXT.name]: a })),\n },\n },\n });\n }\n}\n\nconst LETTERS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nfunction makeId(): string {\n return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join(\"\");\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PollStartEvent.js","names":[],"sources":["../../src/extensible_events_v1/PollStartEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 { NamespacedValue } from \"matrix-events-sdk\";\n\nimport { MessageEvent } from \"./MessageEvent.ts\";\nimport { type ExtensibleEventType, type IPartialEvent, isEventTypeSame, M_TEXT } from \"../@types/extensible_events.ts\";\nimport {\n type KnownPollKind,\n M_POLL_KIND_DISCLOSED,\n M_POLL_KIND_UNDISCLOSED,\n M_POLL_START,\n type PollStartEventContent,\n type PollStartSubtype,\n type PollAnswer,\n} from \"../@types/polls.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\nimport { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\n\n/**\n * Represents a poll answer. Note that this is represented as a subtype and is\n * not registered as a parsable event - it is implied for usage exclusively\n * within the PollStartEvent parsing.\n */\nexport class PollAnswerSubevent extends MessageEvent {\n /**\n * The answer ID.\n */\n public readonly id: string;\n\n public constructor(wireFormat: IPartialEvent<PollAnswer>) {\n super(wireFormat);\n\n const id = wireFormat.content.id;\n if (!id || typeof id !== \"string\") {\n throw new InvalidEventError(\"Answer ID must be a non-empty string\");\n }\n this.id = id;\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: this.id,\n ...this.serializeMMessageOnly(),\n },\n };\n }\n\n /**\n * Creates a new PollAnswerSubevent from ID and text.\n * @param id - The answer ID (unique within the poll).\n * @param text - The text.\n * @returns The representative answer.\n */\n public static from(id: string, text: string): PollAnswerSubevent {\n return new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: {\n id: id,\n [M_TEXT.name]: text,\n },\n });\n }\n}\n\n/**\n * Represents a poll start event.\n */\nexport class PollStartEvent extends ExtensibleEvent<PollStartEventContent> {\n /**\n * The question being asked, as a MessageEvent node.\n */\n public readonly question: MessageEvent;\n\n /**\n * The interpreted kind of poll. Note that this will infer a value that is known to the\n * SDK rather than verbatim - this means unknown types will be represented as undisclosed\n * polls.\n *\n * To get the raw kind, use rawKind.\n */\n public readonly kind: KnownPollKind;\n\n /**\n * The true kind as provided by the event sender. Might not be valid.\n */\n public readonly rawKind: string;\n\n /**\n * The maximum number of selections a user is allowed to make.\n */\n public readonly maxSelections: number;\n\n /**\n * The possible answers for the poll.\n */\n public readonly answers: PollAnswerSubevent[];\n\n /**\n * Creates a new PollStartEvent from a pure format. Note that the event is *not*\n * parsed here: it will be treated as a literal m.poll.start primary typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<PollStartEventContent>) {\n super(wireFormat);\n\n const poll = M_POLL_START.findIn<PollStartSubtype>(this.wireContent);\n\n if (!poll?.question) {\n throw new InvalidEventError(\"A question is required\");\n }\n\n this.question = new MessageEvent({ type: \"org.matrix.sdk.poll.question\", content: poll.question });\n\n this.rawKind = poll.kind;\n if (M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {\n this.kind = M_POLL_KIND_DISCLOSED;\n } else {\n this.kind = M_POLL_KIND_UNDISCLOSED; // default & assumed value\n }\n\n this.maxSelections =\n Number.isFinite(poll.max_selections) && poll.max_selections! > 0 ? poll.max_selections! : 1;\n\n if (!Array.isArray(poll.answers)) {\n throw new InvalidEventError(\"Poll answers must be an array\");\n }\n const answers = poll.answers.slice(0, 20).map(\n (a) =>\n new PollAnswerSubevent({\n type: \"org.matrix.sdk.poll.answer\",\n content: a,\n }),\n );\n if (answers.length <= 0) {\n throw new InvalidEventError(\"No answers available\");\n }\n this.answers = answers;\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_POLL_START);\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: M_POLL_START.name,\n content: {\n [M_POLL_START.name]: {\n question: this.question.serialize().content,\n kind: this.rawKind,\n max_selections: this.maxSelections,\n answers: this.answers.map((a) => a.serialize().content),\n },\n [M_TEXT.name]: `${this.question.text}\\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join(\"\\n\")}`,\n },\n };\n }\n\n /**\n * Creates a new PollStartEvent from question, answers, and metadata.\n * @param question - The question to ask.\n * @param answers - The answers. Should be unique within each other.\n * @param kind - The kind of poll.\n * @param maxSelections - The maximum number of selections. Must be 1 or higher.\n * @returns The representative poll start event.\n */\n public static from(\n question: string,\n answers: string[],\n kind: KnownPollKind | string,\n maxSelections = 1,\n ): PollStartEvent {\n return new PollStartEvent({\n type: M_POLL_START.name,\n content: {\n [M_TEXT.name]: question, // unused by parsing\n [M_POLL_START.name]: {\n question: { [M_TEXT.name]: question },\n kind: kind instanceof NamespacedValue ? kind.name : kind,\n max_selections: maxSelections,\n answers: answers.map((a) => ({ id: makeId(), [M_TEXT.name]: a })),\n },\n },\n });\n }\n}\n\nconst LETTERS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nfunction makeId(): string {\n return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join(\"\");\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","names":[
|
|
1
|
+
{"version":3,"file":"utilities.js","names":[],"sources":["../../src/extensible_events_v1/utilities.ts"],"sourcesContent":["/*\nCopyright 2021 - 2023 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 Optional } from \"matrix-events-sdk\";\n\n/**\n * Determines if the given optional was provided a value.\n * @param s - The optional to test.\n * @returns True if the value is defined.\n */\nexport function isProvided<T>(s: Optional<T>): s is T {\n return s !== null && s !== undefined;\n}\n\n/**\n * Determines if the given optional string is a defined string.\n * @param s - The input string.\n * @returns True if the input is a defined string.\n */\nexport function isOptionalAString(s: Optional<string>): s is string {\n return isProvided(s) && typeof s === \"string\";\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,UAAU,CAAI,CAAc,EAAU;EAClD,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,iBAAiB,CAAC,CAAmB,EAAe;EAChE,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;AACjD","ignoreList":[]}
|
package/lib/feature.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
1
|
/*
|
|
4
2
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
5
3
|
|
|
@@ -16,13 +14,13 @@ See the License for the specific language governing permissions and
|
|
|
16
14
|
limitations under the License.
|
|
17
15
|
*/
|
|
18
16
|
|
|
19
|
-
export
|
|
17
|
+
export let ServerSupport = /*#__PURE__*/function (ServerSupport) {
|
|
20
18
|
ServerSupport[ServerSupport["Stable"] = 0] = "Stable";
|
|
21
19
|
ServerSupport[ServerSupport["Unstable"] = 1] = "Unstable";
|
|
22
20
|
ServerSupport[ServerSupport["Unsupported"] = 2] = "Unsupported";
|
|
23
21
|
return ServerSupport;
|
|
24
22
|
}({});
|
|
25
|
-
export
|
|
23
|
+
export let Feature = /*#__PURE__*/function (Feature) {
|
|
26
24
|
Feature["Thread"] = "Thread";
|
|
27
25
|
Feature["ThreadUnreadNotifications"] = "ThreadUnreadNotifications";
|
|
28
26
|
/**
|
|
@@ -35,7 +33,7 @@ export var Feature = /*#__PURE__*/function (Feature) {
|
|
|
35
33
|
Feature["IntentionalMentions"] = "IntentionalMentions";
|
|
36
34
|
return Feature;
|
|
37
35
|
}({});
|
|
38
|
-
|
|
36
|
+
const featureSupportResolver = {
|
|
39
37
|
[Feature.Thread]: {
|
|
40
38
|
unstablePrefixes: ["org.matrix.msc3440"],
|
|
41
39
|
matrixVersion: "v1.3"
|
|
@@ -62,32 +60,21 @@ var featureSupportResolver = {
|
|
|
62
60
|
matrixVersion: "v1.7"
|
|
63
61
|
}
|
|
64
62
|
};
|
|
65
|
-
export function buildFeatureSupportMap(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
var _versions$unstable_fe;
|
|
79
|
-
return ((_versions$unstable_fe = versions.unstable_features) === null || _versions$unstable_fe === void 0 ? void 0 : _versions$unstable_fe[unstablePrefix]) === true;
|
|
80
|
-
})) !== null && _supportCondition$uns !== void 0 ? _supportCondition$uns : false;
|
|
81
|
-
if (supportMatrixVersion) {
|
|
82
|
-
supportMap.set(feature, ServerSupport.Stable);
|
|
83
|
-
} else if (supportUnstablePrefixes) {
|
|
84
|
-
supportMap.set(feature, ServerSupport.Unstable);
|
|
85
|
-
} else {
|
|
86
|
-
supportMap.set(feature, ServerSupport.Unsupported);
|
|
87
|
-
}
|
|
63
|
+
export async function buildFeatureSupportMap(versions) {
|
|
64
|
+
const supportMap = new Map();
|
|
65
|
+
for (const [feature, supportCondition] of Object.entries(featureSupportResolver)) {
|
|
66
|
+
const supportMatrixVersion = versions.versions?.includes(supportCondition.matrixVersion || "") ?? false;
|
|
67
|
+
const supportUnstablePrefixes = supportCondition.unstablePrefixes?.every(unstablePrefix => {
|
|
68
|
+
return versions.unstable_features?.[unstablePrefix] === true;
|
|
69
|
+
}) ?? false;
|
|
70
|
+
if (supportMatrixVersion) {
|
|
71
|
+
supportMap.set(feature, ServerSupport.Stable);
|
|
72
|
+
} else if (supportUnstablePrefixes) {
|
|
73
|
+
supportMap.set(feature, ServerSupport.Unstable);
|
|
74
|
+
} else {
|
|
75
|
+
supportMap.set(feature, ServerSupport.Unsupported);
|
|
88
76
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return _buildFeatureSupportMap.apply(this, arguments);
|
|
77
|
+
}
|
|
78
|
+
return supportMap;
|
|
92
79
|
}
|
|
93
80
|
//# sourceMappingURL=feature.js.map
|
package/lib/feature.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.js","names":[
|
|
1
|
+
{"version":3,"file":"feature.js","names":[],"sources":["../src/feature.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 IServerVersions } from \"./client.ts\";\n\nexport enum ServerSupport {\n Stable,\n Unstable,\n Unsupported,\n}\n\nexport enum Feature {\n Thread = \"Thread\",\n ThreadUnreadNotifications = \"ThreadUnreadNotifications\",\n /**\n * @deprecated this is now exposed as a capability not a feature\n */\n LoginTokenRequest = \"LoginTokenRequest\",\n RelationBasedRedactions = \"RelationBasedRedactions\",\n AccountDataDeletion = \"AccountDataDeletion\",\n RelationsRecursion = \"RelationsRecursion\",\n IntentionalMentions = \"IntentionalMentions\",\n}\n\ntype FeatureSupportCondition = {\n unstablePrefixes?: string[];\n matrixVersion?: string;\n};\n\nconst featureSupportResolver: Record<string, FeatureSupportCondition> = {\n [Feature.Thread]: {\n unstablePrefixes: [\"org.matrix.msc3440\"],\n matrixVersion: \"v1.3\",\n },\n [Feature.ThreadUnreadNotifications]: {\n unstablePrefixes: [\"org.matrix.msc3771\", \"org.matrix.msc3773\"],\n matrixVersion: \"v1.4\",\n },\n [Feature.LoginTokenRequest]: {\n unstablePrefixes: [\"org.matrix.msc3882\"],\n },\n [Feature.RelationBasedRedactions]: {\n unstablePrefixes: [\"org.matrix.msc3912\"],\n },\n [Feature.AccountDataDeletion]: {\n unstablePrefixes: [\"org.matrix.msc3391\"],\n },\n [Feature.RelationsRecursion]: {\n unstablePrefixes: [\"org.matrix.msc3981\"],\n matrixVersion: \"v1.10\",\n },\n [Feature.IntentionalMentions]: {\n unstablePrefixes: [\"org.matrix.msc3952_intentional_mentions\"],\n matrixVersion: \"v1.7\",\n },\n};\n\nexport async function buildFeatureSupportMap(versions: IServerVersions): Promise<Map<Feature, ServerSupport>> {\n const supportMap = new Map<Feature, ServerSupport>();\n for (const [feature, supportCondition] of Object.entries(featureSupportResolver)) {\n const supportMatrixVersion = versions.versions?.includes(supportCondition.matrixVersion || \"\") ?? false;\n const supportUnstablePrefixes =\n supportCondition.unstablePrefixes?.every((unstablePrefix) => {\n return versions.unstable_features?.[unstablePrefix] === true;\n }) ?? false;\n if (supportMatrixVersion) {\n supportMap.set(feature as Feature, ServerSupport.Stable);\n } else if (supportUnstablePrefixes) {\n supportMap.set(feature as Feature, ServerSupport.Unstable);\n } else {\n supportMap.set(feature as Feature, ServerSupport.Unsupported);\n }\n }\n return supportMap;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,WAAY,aAAa,0BAAb,aAAa;EAAb,aAAa,CAAb,aAAa;EAAb,aAAa,CAAb,aAAa;EAAb,aAAa,CAAb,aAAa;EAAA,OAAb,aAAa;AAAA;AAMzB,WAAY,OAAO,0BAAP,OAAO;EAAP,OAAO;EAAP,OAAO;EAGf;AACJ;AACA;EALY,OAAO;EAAP,OAAO;EAAP,OAAO;EAAP,OAAO;EAAP,OAAO;EAAA,OAAP,OAAO;AAAA;AAkBnB,MAAM,sBAA+D,GAAG;EACpE,CAAC,OAAO,CAAC,MAAM,GAAG;IACd,gBAAgB,EAAE,CAAC,oBAAoB,CAAC;IACxC,aAAa,EAAE;EACnB,CAAC;EACD,CAAC,OAAO,CAAC,yBAAyB,GAAG;IACjC,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IAC9D,aAAa,EAAE;EACnB,CAAC;EACD,CAAC,OAAO,CAAC,iBAAiB,GAAG;IACzB,gBAAgB,EAAE,CAAC,oBAAoB;EAC3C,CAAC;EACD,CAAC,OAAO,CAAC,uBAAuB,GAAG;IAC/B,gBAAgB,EAAE,CAAC,oBAAoB;EAC3C,CAAC;EACD,CAAC,OAAO,CAAC,mBAAmB,GAAG;IAC3B,gBAAgB,EAAE,CAAC,oBAAoB;EAC3C,CAAC;EACD,CAAC,OAAO,CAAC,kBAAkB,GAAG;IAC1B,gBAAgB,EAAE,CAAC,oBAAoB,CAAC;IACxC,aAAa,EAAE;EACnB,CAAC;EACD,CAAC,OAAO,CAAC,mBAAmB,GAAG;IAC3B,gBAAgB,EAAE,CAAC,yCAAyC,CAAC;IAC7D,aAAa,EAAE;EACnB;AACJ,CAAC;AAED,OAAO,eAAe,sBAAsB,CAAC,QAAyB,EAAwC;EAC1G,MAAM,UAAU,GAAG,IAAI,GAAG,CAAyB,CAAC;EACpD,KAAK,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE;IAC9E,MAAM,oBAAoB,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,aAAa,IAAI,EAAE,CAAC,IAAI,KAAK;IACvG,MAAM,uBAAuB,GACzB,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,CAAE,cAAc,IAAK;MACzD,OAAO,QAAQ,CAAC,iBAAiB,GAAG,cAAc,CAAC,KAAK,IAAI;IAChE,CAAC,CAAC,IAAI,KAAK;IACf,IAAI,oBAAoB,EAAE;MACtB,UAAU,CAAC,GAAG,CAAC,OAAO,EAAa,aAAa,CAAC,MAAM,CAAC;IAC5D,CAAC,MAAM,IAAI,uBAAuB,EAAE;MAChC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAa,aAAa,CAAC,QAAQ,CAAC;IAC9D,CAAC,MAAM;MACH,UAAU,CAAC,GAAG,CAAC,OAAO,EAAa,aAAa,CAAC,WAAW,CAAC;IACjE;EACJ;EACA,OAAO,UAAU;AACrB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-component.d.ts","sourceRoot":"","sources":["../src/filter-component.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAoBrD,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGlC,6BAA6B,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;IAC7D,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1C;AAGD;;;;;;;GAOG;AACH,qBAAa,eAAe;IAEpB,OAAO,CAAC,UAAU;aACF,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;gBAD1C,UAAU,EAAE,gBAAgB,EACpB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAGtD;;;;OAIG;IACI,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAuBzC;;OAEG;IACI,MAAM,IAAI,MAAM;IAgBvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAwDnB,OAAO,CAAC,kBAAkB;IAS1B;;;;OAIG;IACI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"filter-component.d.ts","sourceRoot":"","sources":["../src/filter-component.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAoBrD,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGlC,6BAA6B,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;IAC7D,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1C;AAGD;;;;;;;GAOG;AACH,qBAAa,eAAe;IAEpB,OAAO,CAAC,UAAU;aACF,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;gBAD1C,UAAU,EAAE,gBAAgB,EACpB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAGtD;;;;OAIG;IACI,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAuBzC;;OAEG;IACI,MAAM,IAAI,MAAM;IAgBvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAwDnB,OAAO,CAAC,kBAAkB;IAS1B;;;;OAIG;IACI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAKnD;;;;OAIG;IACI,KAAK,IAAI,MAAM;CAGzB"}
|
package/lib/filter-component.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
1
|
/*
|
|
3
2
|
Copyright 2016 - 2021 The Matrix.org Foundation C.I.C.
|
|
4
3
|
|
|
@@ -26,7 +25,7 @@ import { FILTER_RELATED_BY_REL_TYPES, FILTER_RELATED_BY_SENDERS, THREAD_RELATION
|
|
|
26
25
|
*/
|
|
27
26
|
function matchesWildcard(actualValue, filterValue) {
|
|
28
27
|
if (filterValue.endsWith("*")) {
|
|
29
|
-
|
|
28
|
+
const typePrefix = filterValue.slice(0, -1);
|
|
30
29
|
return actualValue.slice(0, typePrefix.length) === typePrefix;
|
|
31
30
|
} else {
|
|
32
31
|
return actualValue === filterValue;
|
|
@@ -57,16 +56,15 @@ export class FilterComponent {
|
|
|
57
56
|
* @returns true if the event matches the filter
|
|
58
57
|
*/
|
|
59
58
|
check(event) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
var relations = Object.keys(bundledRelationships);
|
|
59
|
+
const bundledRelationships = event.getUnsigned()?.["m.relations"] || {};
|
|
60
|
+
const relations = Object.keys(bundledRelationships);
|
|
63
61
|
// Relation senders allows in theory a look-up of any senders
|
|
64
62
|
// however clients can only know about the current user participation status
|
|
65
63
|
// as sending a whole list of participants could be proven problematic in terms
|
|
66
64
|
// of performance
|
|
67
65
|
// This should be improved when bundled relationships solve that problem
|
|
68
|
-
|
|
69
|
-
if (this.userId && bundledRelationships
|
|
66
|
+
const relationSenders = [];
|
|
67
|
+
if (this.userId && bundledRelationships?.[THREAD_RELATION_TYPE.name]?.current_user_participated) {
|
|
70
68
|
relationSenders.push(this.userId);
|
|
71
69
|
}
|
|
72
70
|
return this.checkFields(event.getRoomId(), event.getSender(), event.getType(), event.getContent() ? event.getContent().url !== undefined : false, relations, relationSenders);
|
|
@@ -86,12 +84,7 @@ export class FilterComponent {
|
|
|
86
84
|
contains_url: this.filterJson.contains_url,
|
|
87
85
|
[FILTER_RELATED_BY_SENDERS.name]: this.filterJson[FILTER_RELATED_BY_SENDERS.name],
|
|
88
86
|
[FILTER_RELATED_BY_REL_TYPES.name]: this.filterJson[FILTER_RELATED_BY_REL_TYPES.name]
|
|
89
|
-
}).filter(
|
|
90
|
-
var _ref2 = _slicedToArray(_ref, 2),
|
|
91
|
-
_key = _ref2[0],
|
|
92
|
-
value = _ref2[1];
|
|
93
|
-
return value;
|
|
94
|
-
}));
|
|
87
|
+
}).filter(([_key, value]) => value));
|
|
95
88
|
}
|
|
96
89
|
|
|
97
90
|
/**
|
|
@@ -105,40 +98,40 @@ export class FilterComponent {
|
|
|
105
98
|
* @returns true if the event fields match the filter
|
|
106
99
|
*/
|
|
107
100
|
checkFields(roomId, sender, eventType, containsUrl, relationTypes, relationSenders) {
|
|
108
|
-
|
|
109
|
-
rooms: function
|
|
101
|
+
const literalKeys = {
|
|
102
|
+
rooms: function (v) {
|
|
110
103
|
return roomId === v;
|
|
111
104
|
},
|
|
112
|
-
senders: function
|
|
105
|
+
senders: function (v) {
|
|
113
106
|
return sender === v;
|
|
114
107
|
},
|
|
115
|
-
types: function
|
|
108
|
+
types: function (v) {
|
|
116
109
|
return matchesWildcard(eventType, v);
|
|
117
110
|
}
|
|
118
111
|
};
|
|
119
|
-
for (
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (disallowedValues
|
|
112
|
+
for (const name in literalKeys) {
|
|
113
|
+
const matchFunc = literalKeys[name];
|
|
114
|
+
const notName = "not_" + name;
|
|
115
|
+
const disallowedValues = this.filterJson[notName];
|
|
116
|
+
if (disallowedValues?.some(matchFunc)) {
|
|
124
117
|
return false;
|
|
125
118
|
}
|
|
126
|
-
|
|
119
|
+
const allowedValues = this.filterJson[name];
|
|
127
120
|
if (allowedValues && !allowedValues.some(matchFunc)) {
|
|
128
121
|
return false;
|
|
129
122
|
}
|
|
130
123
|
}
|
|
131
|
-
|
|
124
|
+
const containsUrlFilter = this.filterJson.contains_url;
|
|
132
125
|
if (containsUrlFilter !== undefined && containsUrlFilter !== containsUrl) {
|
|
133
126
|
return false;
|
|
134
127
|
}
|
|
135
|
-
|
|
128
|
+
const relationTypesFilter = this.filterJson[FILTER_RELATED_BY_REL_TYPES.name];
|
|
136
129
|
if (relationTypesFilter !== undefined) {
|
|
137
130
|
if (!this.arrayMatchesFilter(relationTypesFilter, relationTypes)) {
|
|
138
131
|
return false;
|
|
139
132
|
}
|
|
140
133
|
}
|
|
141
|
-
|
|
134
|
+
const relationSendersFilter = this.filterJson[FILTER_RELATED_BY_SENDERS.name];
|
|
142
135
|
if (relationSendersFilter !== undefined) {
|
|
143
136
|
if (!this.arrayMatchesFilter(relationSendersFilter, relationSenders)) {
|
|
144
137
|
return false;
|
|
@@ -158,6 +151,7 @@ export class FilterComponent {
|
|
|
158
151
|
* @returns events which matched the filter component
|
|
159
152
|
*/
|
|
160
153
|
filter(events) {
|
|
154
|
+
// oxlint-disable-next-line typescript/unbound-method
|
|
161
155
|
return events.filter(this.check, this);
|
|
162
156
|
}
|
|
163
157
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-component.js","names":["FILTER_RELATED_BY_REL_TYPES","FILTER_RELATED_BY_SENDERS","THREAD_RELATION_TYPE","matchesWildcard","actualValue","filterValue","endsWith","typePrefix","slice","length","FilterComponent","constructor","filterJson","userId","check","event","_event$getUnsigned","_bundledRelationships","bundledRelationships","getUnsigned","relations","Object","keys","relationSenders","name","current_user_participated","push","checkFields","getRoomId","getSender","getType","getContent","url","undefined","toJSON","fromEntries","entries","types","not_types","rooms","not_rooms","senders","not_senders","contains_url","filter","_ref","_ref2","_slicedToArray","_key","value","roomId","sender","eventType","containsUrl","relationTypes","literalKeys","v","matchFunc","notName","disallowedValues","some","allowedValues","containsUrlFilter","relationTypesFilter","arrayMatchesFilter","relationSendersFilter","values","every","includes","events","limit"],"sources":["../src/filter-component.ts"],"sourcesContent":["/*\nCopyright 2016 - 2021 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 RelationType } from \"./@types/event.ts\";\nimport { type MatrixEvent } from \"./models/event.ts\";\nimport { FILTER_RELATED_BY_REL_TYPES, FILTER_RELATED_BY_SENDERS, THREAD_RELATION_TYPE } from \"./models/thread.ts\";\n\n/**\n * Checks if a value matches a given field value, which may be a * terminated\n * wildcard pattern.\n * @param actualValue - The value to be compared\n * @param filterValue - The filter pattern to be compared\n * @returns true if the actualValue matches the filterValue\n */\nfunction matchesWildcard(actualValue: string, filterValue: string): boolean {\n if (filterValue.endsWith(\"*\")) {\n const typePrefix = filterValue.slice(0, -1);\n return actualValue.slice(0, typePrefix.length) === typePrefix;\n } else {\n return actualValue === filterValue;\n }\n}\n\n/* eslint-disable camelcase */\nexport interface IFilterComponent {\n \"types\"?: string[];\n \"not_types\"?: string[];\n \"rooms\"?: string[];\n \"not_rooms\"?: string[];\n \"senders\"?: string[];\n \"not_senders\"?: string[];\n \"contains_url\"?: boolean;\n \"limit\"?: number;\n \"related_by_senders\"?: Array<RelationType | string>;\n \"related_by_rel_types\"?: string[];\n\n // Unstable values\n \"io.element.relation_senders\"?: Array<RelationType | string>;\n \"io.element.relation_types\"?: string[];\n}\n/* eslint-enable camelcase */\n\n/**\n * FilterComponent is a section of a Filter definition which defines the\n * types, rooms, senders filters etc to be applied to a particular type of resource.\n * This is all ported over from synapse's Filter object.\n *\n * N.B. that synapse refers to these as 'Filters', and what js-sdk refers to as\n * 'Filters' are referred to as 'FilterCollections'.\n */\nexport class FilterComponent {\n public constructor(\n private filterJson: IFilterComponent,\n public readonly userId?: string | undefined | null,\n ) {}\n\n /**\n * Checks with the filter component matches the given event\n * @param event - event to be checked against the filter\n * @returns true if the event matches the filter\n */\n public check(event: MatrixEvent): boolean {\n const bundledRelationships = event.getUnsigned()?.[\"m.relations\"] || {};\n const relations: Array<string | RelationType> = Object.keys(bundledRelationships);\n // Relation senders allows in theory a look-up of any senders\n // however clients can only know about the current user participation status\n // as sending a whole list of participants could be proven problematic in terms\n // of performance\n // This should be improved when bundled relationships solve that problem\n const relationSenders: string[] = [];\n if (this.userId && bundledRelationships?.[THREAD_RELATION_TYPE.name]?.current_user_participated) {\n relationSenders.push(this.userId);\n }\n\n return this.checkFields(\n event.getRoomId(),\n event.getSender(),\n event.getType(),\n event.getContent() ? event.getContent().url !== undefined : false,\n relations,\n relationSenders,\n );\n }\n\n /**\n * Converts the filter component into the form expected over the wire\n */\n public toJSON(): object {\n return Object.fromEntries(\n Object.entries({\n types: this.filterJson.types,\n not_types: this.filterJson.not_types,\n rooms: this.filterJson.rooms,\n not_rooms: this.filterJson.not_rooms,\n senders: this.filterJson.senders,\n not_senders: this.filterJson.not_senders,\n contains_url: this.filterJson.contains_url,\n [FILTER_RELATED_BY_SENDERS.name]: this.filterJson[FILTER_RELATED_BY_SENDERS.name],\n [FILTER_RELATED_BY_REL_TYPES.name]: this.filterJson[FILTER_RELATED_BY_REL_TYPES.name],\n }).filter(([_key, value]) => value),\n );\n }\n\n /**\n * Checks whether the filter component matches the given event fields.\n * @param roomId - the roomId for the event being checked\n * @param sender - the sender of the event being checked\n * @param eventType - the type of the event being checked\n * @param containsUrl - whether the event contains a content.url field\n * @param relationTypes - whether has aggregated relation of the given type\n * @param relationSenders - whether one of the relation is sent by the user listed\n * @returns true if the event fields match the filter\n */\n private checkFields(\n roomId: string | undefined,\n sender: string | undefined,\n eventType: string,\n containsUrl: boolean,\n relationTypes: Array<RelationType | string>,\n relationSenders: string[],\n ): boolean {\n const literalKeys = {\n rooms: function (v: string): boolean {\n return roomId === v;\n },\n senders: function (v: string): boolean {\n return sender === v;\n },\n types: function (v: string): boolean {\n return matchesWildcard(eventType, v);\n },\n } as const;\n\n for (const name in literalKeys) {\n const matchFunc = literalKeys[<keyof typeof literalKeys>name];\n const notName = \"not_\" + name;\n const disallowedValues = this.filterJson[<`not_${keyof typeof literalKeys}`>notName];\n if (disallowedValues?.some(matchFunc)) {\n return false;\n }\n\n const allowedValues = this.filterJson[name as keyof typeof literalKeys];\n if (allowedValues && !allowedValues.some(matchFunc)) {\n return false;\n }\n }\n\n const containsUrlFilter = this.filterJson.contains_url;\n if (containsUrlFilter !== undefined && containsUrlFilter !== containsUrl) {\n return false;\n }\n\n const relationTypesFilter = this.filterJson[FILTER_RELATED_BY_REL_TYPES.name];\n if (relationTypesFilter !== undefined) {\n if (!this.arrayMatchesFilter(relationTypesFilter, relationTypes)) {\n return false;\n }\n }\n\n const relationSendersFilter = this.filterJson[FILTER_RELATED_BY_SENDERS.name];\n if (relationSendersFilter !== undefined) {\n if (!this.arrayMatchesFilter(relationSendersFilter, relationSenders)) {\n return false;\n }\n }\n\n return true;\n }\n\n private arrayMatchesFilter(filter: any[], values: any[]): boolean {\n return (\n values.length > 0 &&\n filter.every((value) => {\n return values.includes(value);\n })\n );\n }\n\n /**\n * Filters a list of events down to those which match this filter component\n * @param events - Events to be checked against the filter component\n * @returns events which matched the filter component\n */\n public filter(events: MatrixEvent[]): MatrixEvent[] {\n return events.filter(this.check, this);\n }\n\n /**\n * Returns the limit field for a given filter component, providing a default of\n * 10 if none is otherwise specified. Cargo-culted from Synapse.\n * @returns the limit for this filter component.\n */\n public limit(): number {\n return this.filterJson.limit !== undefined ? this.filterJson.limit : 10;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"filter-component.js","names":[],"sources":["../src/filter-component.ts"],"sourcesContent":["/*\nCopyright 2016 - 2021 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 RelationType } from \"./@types/event.ts\";\nimport { type MatrixEvent } from \"./models/event.ts\";\nimport { FILTER_RELATED_BY_REL_TYPES, FILTER_RELATED_BY_SENDERS, THREAD_RELATION_TYPE } from \"./models/thread.ts\";\n\n/**\n * Checks if a value matches a given field value, which may be a * terminated\n * wildcard pattern.\n * @param actualValue - The value to be compared\n * @param filterValue - The filter pattern to be compared\n * @returns true if the actualValue matches the filterValue\n */\nfunction matchesWildcard(actualValue: string, filterValue: string): boolean {\n if (filterValue.endsWith(\"*\")) {\n const typePrefix = filterValue.slice(0, -1);\n return actualValue.slice(0, typePrefix.length) === typePrefix;\n } else {\n return actualValue === filterValue;\n }\n}\n\n/* eslint-disable camelcase */\nexport interface IFilterComponent {\n \"types\"?: string[];\n \"not_types\"?: string[];\n \"rooms\"?: string[];\n \"not_rooms\"?: string[];\n \"senders\"?: string[];\n \"not_senders\"?: string[];\n \"contains_url\"?: boolean;\n \"limit\"?: number;\n \"related_by_senders\"?: Array<RelationType | string>;\n \"related_by_rel_types\"?: string[];\n\n // Unstable values\n \"io.element.relation_senders\"?: Array<RelationType | string>;\n \"io.element.relation_types\"?: string[];\n}\n/* eslint-enable camelcase */\n\n/**\n * FilterComponent is a section of a Filter definition which defines the\n * types, rooms, senders filters etc to be applied to a particular type of resource.\n * This is all ported over from synapse's Filter object.\n *\n * N.B. that synapse refers to these as 'Filters', and what js-sdk refers to as\n * 'Filters' are referred to as 'FilterCollections'.\n */\nexport class FilterComponent {\n public constructor(\n private filterJson: IFilterComponent,\n public readonly userId?: string | undefined | null,\n ) {}\n\n /**\n * Checks with the filter component matches the given event\n * @param event - event to be checked against the filter\n * @returns true if the event matches the filter\n */\n public check(event: MatrixEvent): boolean {\n const bundledRelationships = event.getUnsigned()?.[\"m.relations\"] || {};\n const relations: Array<string | RelationType> = Object.keys(bundledRelationships);\n // Relation senders allows in theory a look-up of any senders\n // however clients can only know about the current user participation status\n // as sending a whole list of participants could be proven problematic in terms\n // of performance\n // This should be improved when bundled relationships solve that problem\n const relationSenders: string[] = [];\n if (this.userId && bundledRelationships?.[THREAD_RELATION_TYPE.name]?.current_user_participated) {\n relationSenders.push(this.userId);\n }\n\n return this.checkFields(\n event.getRoomId(),\n event.getSender(),\n event.getType(),\n event.getContent() ? event.getContent().url !== undefined : false,\n relations,\n relationSenders,\n );\n }\n\n /**\n * Converts the filter component into the form expected over the wire\n */\n public toJSON(): object {\n return Object.fromEntries(\n Object.entries({\n types: this.filterJson.types,\n not_types: this.filterJson.not_types,\n rooms: this.filterJson.rooms,\n not_rooms: this.filterJson.not_rooms,\n senders: this.filterJson.senders,\n not_senders: this.filterJson.not_senders,\n contains_url: this.filterJson.contains_url,\n [FILTER_RELATED_BY_SENDERS.name]: this.filterJson[FILTER_RELATED_BY_SENDERS.name],\n [FILTER_RELATED_BY_REL_TYPES.name]: this.filterJson[FILTER_RELATED_BY_REL_TYPES.name],\n }).filter(([_key, value]) => value),\n );\n }\n\n /**\n * Checks whether the filter component matches the given event fields.\n * @param roomId - the roomId for the event being checked\n * @param sender - the sender of the event being checked\n * @param eventType - the type of the event being checked\n * @param containsUrl - whether the event contains a content.url field\n * @param relationTypes - whether has aggregated relation of the given type\n * @param relationSenders - whether one of the relation is sent by the user listed\n * @returns true if the event fields match the filter\n */\n private checkFields(\n roomId: string | undefined,\n sender: string | undefined,\n eventType: string,\n containsUrl: boolean,\n relationTypes: Array<RelationType | string>,\n relationSenders: string[],\n ): boolean {\n const literalKeys = {\n rooms: function (v: string): boolean {\n return roomId === v;\n },\n senders: function (v: string): boolean {\n return sender === v;\n },\n types: function (v: string): boolean {\n return matchesWildcard(eventType, v);\n },\n } as const;\n\n for (const name in literalKeys) {\n const matchFunc = literalKeys[<keyof typeof literalKeys>name];\n const notName = \"not_\" + name;\n const disallowedValues = this.filterJson[<`not_${keyof typeof literalKeys}`>notName];\n if (disallowedValues?.some(matchFunc)) {\n return false;\n }\n\n const allowedValues = this.filterJson[name as keyof typeof literalKeys];\n if (allowedValues && !allowedValues.some(matchFunc)) {\n return false;\n }\n }\n\n const containsUrlFilter = this.filterJson.contains_url;\n if (containsUrlFilter !== undefined && containsUrlFilter !== containsUrl) {\n return false;\n }\n\n const relationTypesFilter = this.filterJson[FILTER_RELATED_BY_REL_TYPES.name];\n if (relationTypesFilter !== undefined) {\n if (!this.arrayMatchesFilter(relationTypesFilter, relationTypes)) {\n return false;\n }\n }\n\n const relationSendersFilter = this.filterJson[FILTER_RELATED_BY_SENDERS.name];\n if (relationSendersFilter !== undefined) {\n if (!this.arrayMatchesFilter(relationSendersFilter, relationSenders)) {\n return false;\n }\n }\n\n return true;\n }\n\n private arrayMatchesFilter(filter: any[], values: any[]): boolean {\n return (\n values.length > 0 &&\n filter.every((value) => {\n return values.includes(value);\n })\n );\n }\n\n /**\n * Filters a list of events down to those which match this filter component\n * @param events - Events to be checked against the filter component\n * @returns events which matched the filter component\n */\n public filter(events: MatrixEvent[]): MatrixEvent[] {\n // oxlint-disable-next-line typescript/unbound-method\n return events.filter(this.check, this);\n }\n\n /**\n * Returns the limit field for a given filter component, providing a default of\n * 10 if none is otherwise specified. Cargo-culted from Synapse.\n * @returns the limit for this filter component.\n */\n public limit(): number {\n return this.filterJson.limit !== undefined ? this.filterJson.limit : 10;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|