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,4 +1,3 @@
|
|
|
1
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
1
|
/*
|
|
3
2
|
Copyright 2023 The Matrix.org Foundation C.I.C.
|
|
4
3
|
|
|
@@ -17,46 +16,43 @@ limitations under the License.
|
|
|
17
16
|
|
|
18
17
|
export class ConnectionStatsReportBuilder {
|
|
19
18
|
static build(stats) {
|
|
20
|
-
|
|
19
|
+
const report = {};
|
|
21
20
|
|
|
22
21
|
// process stats
|
|
23
|
-
|
|
22
|
+
const totalPackets = {
|
|
24
23
|
download: 0,
|
|
25
24
|
upload: 0
|
|
26
25
|
};
|
|
27
|
-
|
|
26
|
+
const lostPackets = {
|
|
28
27
|
download: 0,
|
|
29
28
|
upload: 0
|
|
30
29
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
let bitrateDownload = 0;
|
|
31
|
+
let bitrateUpload = 0;
|
|
32
|
+
const resolutions = {
|
|
34
33
|
local: new Map(),
|
|
35
34
|
remote: new Map()
|
|
36
35
|
};
|
|
37
|
-
|
|
36
|
+
const framerates = {
|
|
38
37
|
local: new Map(),
|
|
39
38
|
remote: new Map()
|
|
40
39
|
};
|
|
41
|
-
|
|
40
|
+
const codecs = {
|
|
42
41
|
local: new Map(),
|
|
43
42
|
remote: new Map()
|
|
44
43
|
};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
for (
|
|
54
|
-
var _ref2 = _slicedToArray(_ref3, 2);
|
|
55
|
-
var trackId = _ref2[0];
|
|
56
|
-
var trackStats = _ref2[1];
|
|
44
|
+
const jitter = new Map();
|
|
45
|
+
const audioConcealment = new Map();
|
|
46
|
+
let audioBitrateDownload = 0;
|
|
47
|
+
let audioBitrateUpload = 0;
|
|
48
|
+
let videoBitrateDownload = 0;
|
|
49
|
+
let videoBitrateUpload = 0;
|
|
50
|
+
let totalConcealedAudio = 0;
|
|
51
|
+
let totalAudioDuration = 0;
|
|
52
|
+
for (const [trackId, trackStats] of stats) {
|
|
57
53
|
// process packet loss stats
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
const loss = trackStats.getLoss();
|
|
55
|
+
const type = loss.isDownloadStream ? "download" : "upload";
|
|
60
56
|
totalPackets[type] += loss.packetsTotal;
|
|
61
57
|
lostPackets[type] += loss.packetsLost;
|
|
62
58
|
|
|
@@ -67,7 +63,7 @@ export class ConnectionStatsReportBuilder {
|
|
|
67
63
|
// collect resolutions and framerates
|
|
68
64
|
if (trackStats.kind === "audio") {
|
|
69
65
|
// process audio quality stats
|
|
70
|
-
|
|
66
|
+
const audioConcealmentForTrack = trackStats.getAudioConcealment();
|
|
71
67
|
totalConcealedAudio += audioConcealmentForTrack.concealedAudio;
|
|
72
68
|
totalAudioDuration += audioConcealmentForTrack.totalAudioDuration;
|
|
73
69
|
audioBitrateDownload += trackStats.getBitrate().download;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionStatsReportBuilder.js","names":["ConnectionStatsReportBuilder","build","stats","report","totalPackets","download","upload","lostPackets","bitrateDownload","bitrateUpload","resolutions","local","Map","remote","framerates","codecs","jitter","audioConcealment","audioBitrateDownload","audioBitrateUpload","videoBitrateDownload","videoBitrateUpload","totalConcealedAudio","totalAudioDuration","_ref3","_ref2","_slicedToArray","trackId","trackStats","loss","getLoss","type","isDownloadStream","packetsTotal","packetsLost","getBitrate","kind","audioConcealmentForTrack","getAudioConcealment","concealedAudio","getType","set","getResolution","getFramerate","getCodec","getJitter","resetBitrate","bitrate","audio","video","packetLoss","total","calculatePacketLoss","totalAudioConcealment","framerate","resolution","codec","Math","round"],"sources":["../../../src/webrtc/stats/connectionStatsReportBuilder.ts"],"sourcesContent":["/*\nCopyright 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*/\nimport {\n type AudioConcealment,\n type CodecMap,\n type ConnectionStatsReport,\n type FramerateMap,\n type ResolutionMap,\n type TrackID,\n} from \"./statsReport.ts\";\nimport { type MediaTrackStats, type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport class ConnectionStatsReportBuilder {\n public static build(stats: Map<TrackID, MediaTrackStats>): ConnectionStatsReport {\n const report = {} as ConnectionStatsReport;\n\n // process stats\n const totalPackets = {\n download: 0,\n upload: 0,\n };\n const lostPackets = {\n download: 0,\n upload: 0,\n };\n let bitrateDownload = 0;\n let bitrateUpload = 0;\n const resolutions: ResolutionMap = {\n local: new Map<TrackID, Resolution>(),\n remote: new Map<TrackID, Resolution>(),\n };\n const framerates: FramerateMap = { local: new Map<TrackID, number>(), remote: new Map<TrackID, number>() };\n const codecs: CodecMap = { local: new Map<TrackID, string>(), remote: new Map<TrackID, string>() };\n const jitter = new Map<TrackID, number>();\n const audioConcealment = new Map<TrackID, AudioConcealment>();\n\n let audioBitrateDownload = 0;\n let audioBitrateUpload = 0;\n let videoBitrateDownload = 0;\n let videoBitrateUpload = 0;\n\n let totalConcealedAudio = 0;\n let totalAudioDuration = 0;\n\n for (const [trackId, trackStats] of stats) {\n // process packet loss stats\n const loss = trackStats.getLoss();\n const type = loss.isDownloadStream ? \"download\" : \"upload\";\n\n totalPackets[type] += loss.packetsTotal;\n lostPackets[type] += loss.packetsLost;\n\n // process bitrate stats\n bitrateDownload += trackStats.getBitrate().download;\n bitrateUpload += trackStats.getBitrate().upload;\n\n // collect resolutions and framerates\n if (trackStats.kind === \"audio\") {\n // process audio quality stats\n const audioConcealmentForTrack = trackStats.getAudioConcealment();\n totalConcealedAudio += audioConcealmentForTrack.concealedAudio;\n totalAudioDuration += audioConcealmentForTrack.totalAudioDuration;\n\n audioBitrateDownload += trackStats.getBitrate().download;\n audioBitrateUpload += trackStats.getBitrate().upload;\n } else {\n videoBitrateDownload += trackStats.getBitrate().download;\n videoBitrateUpload += trackStats.getBitrate().upload;\n }\n\n resolutions[trackStats.getType()].set(trackId, trackStats.getResolution());\n framerates[trackStats.getType()].set(trackId, trackStats.getFramerate());\n codecs[trackStats.getType()].set(trackId, trackStats.getCodec());\n if (trackStats.getType() === \"remote\") {\n jitter.set(trackId, trackStats.getJitter());\n if (trackStats.kind === \"audio\") {\n audioConcealment.set(trackId, trackStats.getAudioConcealment());\n }\n }\n\n trackStats.resetBitrate();\n }\n\n report.bitrate = {\n upload: bitrateUpload,\n download: bitrateDownload,\n };\n\n report.bitrate.audio = {\n upload: audioBitrateUpload,\n download: audioBitrateDownload,\n };\n\n report.bitrate.video = {\n upload: videoBitrateUpload,\n download: videoBitrateDownload,\n };\n\n report.packetLoss = {\n total: ConnectionStatsReportBuilder.calculatePacketLoss(\n lostPackets.download + lostPackets.upload,\n totalPackets.download + totalPackets.upload,\n ),\n download: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.download, totalPackets.download),\n upload: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.upload, totalPackets.upload),\n };\n report.audioConcealment = audioConcealment;\n report.totalAudioConcealment = {\n concealedAudio: totalConcealedAudio,\n totalAudioDuration,\n };\n\n report.framerate = framerates;\n report.resolution = resolutions;\n report.codec = codecs;\n report.jitter = jitter;\n return report;\n }\n\n private static calculatePacketLoss(lostPackets: number, totalPackets: number): number {\n if (!totalPackets || totalPackets <= 0 || !lostPackets || lostPackets <= 0) {\n return 0;\n }\n\n return Math.round((lostPackets / totalPackets) * 100);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"connectionStatsReportBuilder.js","names":[],"sources":["../../../src/webrtc/stats/connectionStatsReportBuilder.ts"],"sourcesContent":["/*\nCopyright 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*/\nimport {\n type AudioConcealment,\n type CodecMap,\n type ConnectionStatsReport,\n type FramerateMap,\n type ResolutionMap,\n type TrackID,\n} from \"./statsReport.ts\";\nimport { type MediaTrackStats, type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport class ConnectionStatsReportBuilder {\n public static build(stats: Map<TrackID, MediaTrackStats>): ConnectionStatsReport {\n const report = {} as ConnectionStatsReport;\n\n // process stats\n const totalPackets = {\n download: 0,\n upload: 0,\n };\n const lostPackets = {\n download: 0,\n upload: 0,\n };\n let bitrateDownload = 0;\n let bitrateUpload = 0;\n const resolutions: ResolutionMap = {\n local: new Map<TrackID, Resolution>(),\n remote: new Map<TrackID, Resolution>(),\n };\n const framerates: FramerateMap = { local: new Map<TrackID, number>(), remote: new Map<TrackID, number>() };\n const codecs: CodecMap = { local: new Map<TrackID, string>(), remote: new Map<TrackID, string>() };\n const jitter = new Map<TrackID, number>();\n const audioConcealment = new Map<TrackID, AudioConcealment>();\n\n let audioBitrateDownload = 0;\n let audioBitrateUpload = 0;\n let videoBitrateDownload = 0;\n let videoBitrateUpload = 0;\n\n let totalConcealedAudio = 0;\n let totalAudioDuration = 0;\n\n for (const [trackId, trackStats] of stats) {\n // process packet loss stats\n const loss = trackStats.getLoss();\n const type = loss.isDownloadStream ? \"download\" : \"upload\";\n\n totalPackets[type] += loss.packetsTotal;\n lostPackets[type] += loss.packetsLost;\n\n // process bitrate stats\n bitrateDownload += trackStats.getBitrate().download;\n bitrateUpload += trackStats.getBitrate().upload;\n\n // collect resolutions and framerates\n if (trackStats.kind === \"audio\") {\n // process audio quality stats\n const audioConcealmentForTrack = trackStats.getAudioConcealment();\n totalConcealedAudio += audioConcealmentForTrack.concealedAudio;\n totalAudioDuration += audioConcealmentForTrack.totalAudioDuration;\n\n audioBitrateDownload += trackStats.getBitrate().download;\n audioBitrateUpload += trackStats.getBitrate().upload;\n } else {\n videoBitrateDownload += trackStats.getBitrate().download;\n videoBitrateUpload += trackStats.getBitrate().upload;\n }\n\n resolutions[trackStats.getType()].set(trackId, trackStats.getResolution());\n framerates[trackStats.getType()].set(trackId, trackStats.getFramerate());\n codecs[trackStats.getType()].set(trackId, trackStats.getCodec());\n if (trackStats.getType() === \"remote\") {\n jitter.set(trackId, trackStats.getJitter());\n if (trackStats.kind === \"audio\") {\n audioConcealment.set(trackId, trackStats.getAudioConcealment());\n }\n }\n\n trackStats.resetBitrate();\n }\n\n report.bitrate = {\n upload: bitrateUpload,\n download: bitrateDownload,\n };\n\n report.bitrate.audio = {\n upload: audioBitrateUpload,\n download: audioBitrateDownload,\n };\n\n report.bitrate.video = {\n upload: videoBitrateUpload,\n download: videoBitrateDownload,\n };\n\n report.packetLoss = {\n total: ConnectionStatsReportBuilder.calculatePacketLoss(\n lostPackets.download + lostPackets.upload,\n totalPackets.download + totalPackets.upload,\n ),\n download: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.download, totalPackets.download),\n upload: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.upload, totalPackets.upload),\n };\n report.audioConcealment = audioConcealment;\n report.totalAudioConcealment = {\n concealedAudio: totalConcealedAudio,\n totalAudioDuration,\n };\n\n report.framerate = framerates;\n report.resolution = resolutions;\n report.codec = codecs;\n report.jitter = jitter;\n return report;\n }\n\n private static calculatePacketLoss(lostPackets: number, totalPackets: number): number {\n if (!totalPackets || totalPackets <= 0 || !lostPackets || lostPackets <= 0) {\n return 0;\n }\n\n return Math.round((lostPackets / totalPackets) * 100);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -19,15 +19,14 @@ import { StatsReportEmitter } from "./statsReportEmitter.js";
|
|
|
19
19
|
import { SummaryStatsReportGatherer } from "./summaryStatsReportGatherer.js";
|
|
20
20
|
import { logger } from "../../logger.js";
|
|
21
21
|
export class GroupCallStats {
|
|
22
|
-
constructor(groupCallId, userId) {
|
|
23
|
-
var interval = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000;
|
|
24
|
-
this.groupCallId = groupCallId;
|
|
25
|
-
this.userId = userId;
|
|
26
|
-
this.interval = interval;
|
|
22
|
+
constructor(groupCallId, userId, interval = 10000) {
|
|
27
23
|
_defineProperty(this, "timer", void 0);
|
|
28
24
|
_defineProperty(this, "gatherers", new Map());
|
|
29
25
|
_defineProperty(this, "reports", new StatsReportEmitter());
|
|
30
26
|
_defineProperty(this, "summaryStatsReportGatherer", new SummaryStatsReportGatherer(this.reports));
|
|
27
|
+
this.groupCallId = groupCallId;
|
|
28
|
+
this.userId = userId;
|
|
29
|
+
this.interval = interval;
|
|
31
30
|
}
|
|
32
31
|
start() {
|
|
33
32
|
if (this.timer === undefined && this.interval > 0) {
|
|
@@ -59,11 +58,10 @@ export class GroupCallStats {
|
|
|
59
58
|
return this.hasStatsReportGatherer(callId) ? this.gatherers.get(callId) : undefined;
|
|
60
59
|
}
|
|
61
60
|
updateOpponentMember(callId, opponentMember) {
|
|
62
|
-
|
|
63
|
-
(_this$getStatsReportG = this.getStatsReportGatherer(callId)) === null || _this$getStatsReportG === void 0 || _this$getStatsReportG.setOpponentMemberId(opponentMember);
|
|
61
|
+
this.getStatsReportGatherer(callId)?.setOpponentMemberId(opponentMember);
|
|
64
62
|
}
|
|
65
63
|
processStats() {
|
|
66
|
-
|
|
64
|
+
const summary = [];
|
|
67
65
|
this.gatherers.forEach(c => {
|
|
68
66
|
summary.push(c.processStats(this.groupCallId, this.userId));
|
|
69
67
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groupCallStats.js","names":[
|
|
1
|
+
{"version":3,"file":"groupCallStats.js","names":[],"sources":["../../../src/webrtc/stats/groupCallStats.ts"],"sourcesContent":["/*\nCopyright 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*/\nimport { CallStatsReportGatherer } from \"./callStatsReportGatherer.ts\";\nimport { StatsReportEmitter } from \"./statsReportEmitter.ts\";\nimport { type CallStatsReportSummary } from \"./callStatsReportSummary.ts\";\nimport { SummaryStatsReportGatherer } from \"./summaryStatsReportGatherer.ts\";\nimport { logger } from \"../../logger.ts\";\n\nexport class GroupCallStats {\n private timer: undefined | ReturnType<typeof setTimeout>;\n private readonly gatherers: Map<string, CallStatsReportGatherer> = new Map<string, CallStatsReportGatherer>();\n public readonly reports = new StatsReportEmitter();\n private readonly summaryStatsReportGatherer = new SummaryStatsReportGatherer(this.reports);\n\n public constructor(\n private groupCallId: string,\n private userId: string,\n private interval: number = 10000,\n ) {}\n\n public start(): void {\n if (this.timer === undefined && this.interval > 0) {\n this.timer = setInterval(() => {\n this.processStats();\n }, this.interval);\n }\n }\n\n public stop(): void {\n if (this.timer !== undefined) {\n clearInterval(this.timer);\n this.gatherers.forEach((c) => c.stopProcessingStats());\n }\n }\n\n public hasStatsReportGatherer(callId: string): boolean {\n return this.gatherers.has(callId);\n }\n\n public addStatsReportGatherer(\n callId: string,\n opponentMemberId: string,\n peerConnection: RTCPeerConnection,\n ): boolean {\n if (this.hasStatsReportGatherer(callId)) {\n return false;\n }\n this.gatherers.set(callId, new CallStatsReportGatherer(callId, opponentMemberId, peerConnection, this.reports));\n return true;\n }\n\n public removeStatsReportGatherer(callId: string): boolean {\n return this.gatherers.delete(callId);\n }\n\n public getStatsReportGatherer(callId: string): CallStatsReportGatherer | undefined {\n return this.hasStatsReportGatherer(callId) ? this.gatherers.get(callId) : undefined;\n }\n\n public updateOpponentMember(callId: string, opponentMember: string): void {\n this.getStatsReportGatherer(callId)?.setOpponentMemberId(opponentMember);\n }\n\n private processStats(): void {\n const summary: Promise<CallStatsReportSummary>[] = [];\n this.gatherers.forEach((c) => {\n summary.push(c.processStats(this.groupCallId, this.userId));\n });\n\n Promise.all(summary)\n .then((s: Awaited<CallStatsReportSummary>[]) => this.summaryStatsReportGatherer.build(s))\n .catch((err) => {\n logger.error(\"Could not build summary stats report\", err);\n });\n }\n\n public setInterval(interval: number): void {\n this.interval = interval;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,7 +24,7 @@ export class MediaSsrcHandler {
|
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
findMidBySsrc(ssrc, type) {
|
|
27
|
-
|
|
27
|
+
let mid;
|
|
28
28
|
this.ssrcToMid[type].forEach((ssrcs, m) => {
|
|
29
29
|
if (ssrcs.find(s => s == ssrc)) {
|
|
30
30
|
mid = m;
|
|
@@ -34,18 +34,17 @@ export class MediaSsrcHandler {
|
|
|
34
34
|
return mid;
|
|
35
35
|
}
|
|
36
36
|
parse(description, type) {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const sdp = parseSdp(description);
|
|
38
|
+
const ssrcToMid = new Map();
|
|
39
39
|
sdp.media.forEach(m => {
|
|
40
40
|
if (!!m.mid && m.type === "video" || m.type === "audio") {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
(_m$ssrcs = m.ssrcs) === null || _m$ssrcs === void 0 || _m$ssrcs.forEach(ssrc => {
|
|
41
|
+
const ssrcs = [];
|
|
42
|
+
m.ssrcs?.forEach(ssrc => {
|
|
44
43
|
if (ssrc.attribute === "cname") {
|
|
45
|
-
ssrcs.push(
|
|
44
|
+
ssrcs.push(`${ssrc.id}`);
|
|
46
45
|
}
|
|
47
46
|
});
|
|
48
|
-
ssrcToMid.set(
|
|
47
|
+
ssrcToMid.set(`${m.mid}`, ssrcs);
|
|
49
48
|
}
|
|
50
49
|
});
|
|
51
50
|
this.ssrcToMid[type] = ssrcToMid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaSsrcHandler.js","names":[
|
|
1
|
+
{"version":3,"file":"mediaSsrcHandler.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaSsrcHandler.ts"],"sourcesContent":["/*\nCopyright 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 { parse as parseSdp } from \"sdp-transform\";\n\nexport type Mid = string;\nexport type Ssrc = string;\nexport type MapType = \"local\" | \"remote\";\n\nexport class MediaSsrcHandler {\n private readonly ssrcToMid = { local: new Map<Mid, Ssrc[]>(), remote: new Map<Mid, Ssrc[]>() };\n\n public findMidBySsrc(ssrc: Ssrc, type: \"local\" | \"remote\"): Mid | undefined {\n let mid: Mid | undefined;\n this.ssrcToMid[type].forEach((ssrcs, m) => {\n if (ssrcs.find((s) => s == ssrc)) {\n mid = m;\n return;\n }\n });\n return mid;\n }\n\n public parse(description: string, type: MapType): void {\n const sdp = parseSdp(description);\n const ssrcToMid = new Map<Mid, Ssrc[]>();\n sdp.media.forEach((m) => {\n if ((!!m.mid && m.type === \"video\") || m.type === \"audio\") {\n const ssrcs: Ssrc[] = [];\n m.ssrcs?.forEach((ssrc) => {\n if (ssrc.attribute === \"cname\") {\n ssrcs.push(`${ssrc.id}`);\n }\n });\n ssrcToMid.set(`${m.mid}`, ssrcs);\n }\n });\n this.ssrcToMid[type] = ssrcToMid;\n }\n\n public getSsrcToMidMap(type: MapType): Map<Mid, Ssrc[]> {\n return this.ssrcToMid[type];\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,KAAK,IAAI,QAAQ,QAAQ,eAAe;AAMjD,OAAO,MAAM,gBAAgB,CAAC;EAAA;IAAA,mCACG;MAAE,KAAK,EAAE,IAAI,GAAG,CAAc,CAAC;MAAE,MAAM,EAAE,IAAI,GAAG,CAAc;IAAE,CAAC;EAAA;EAEvF,aAAa,CAAC,IAAU,EAAE,IAAwB,EAAmB;IACxE,IAAI,GAAoB;IACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK;MACvC,IAAI,KAAK,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,IAAI,IAAI,CAAC,EAAE;QAC9B,GAAG,GAAG,CAAC;QACP;MACJ;IACJ,CAAC,CAAC;IACF,OAAO,GAAG;EACd;EAEO,KAAK,CAAC,WAAmB,EAAE,IAAa,EAAQ;IACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAc,CAAC;IACxC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,IAAK;MACrB,IAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAK,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;QACvD,MAAM,KAAa,GAAG,EAAE;QACxB,CAAC,CAAC,KAAK,EAAE,OAAO,CAAE,IAAI,IAAK;UACvB,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;UAC5B;QACJ,CAAC,CAAC;QACF,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC;MACpC;IACJ,CAAC,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS;EACpC;EAEO,eAAe,CAAC,IAAa,EAAoB;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;EAC/B;AACJ","ignoreList":[]}
|
|
@@ -19,31 +19,29 @@ export class MediaTrackHandler {
|
|
|
19
19
|
this.pc = pc;
|
|
20
20
|
}
|
|
21
21
|
getLocalTracks(kind) {
|
|
22
|
-
|
|
22
|
+
const isNotNullAndKind = track => {
|
|
23
23
|
return track !== null && track.kind === kind;
|
|
24
24
|
};
|
|
25
25
|
return this.pc.getTransceivers().filter(t => t.currentDirection === "sendonly" || t.currentDirection === "sendrecv").filter(t => t.sender !== null).map(t => t.sender).map(s => s.track).filter(isNotNullAndKind);
|
|
26
26
|
}
|
|
27
27
|
getTackById(trackId) {
|
|
28
28
|
return this.pc.getTransceivers().map(t => {
|
|
29
|
-
if (
|
|
29
|
+
if (t?.sender.track !== null && t.sender.track.id === trackId) {
|
|
30
30
|
return t.sender.track;
|
|
31
31
|
}
|
|
32
|
-
if (
|
|
32
|
+
if (t?.receiver.track !== null && t.receiver.track.id === trackId) {
|
|
33
33
|
return t.receiver.track;
|
|
34
34
|
}
|
|
35
35
|
return undefined;
|
|
36
36
|
}).find(t => t !== undefined);
|
|
37
37
|
}
|
|
38
38
|
getLocalTrackIdByMid(mid) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return transceiver === null || transceiver === void 0 || (_transceiver$sender = transceiver.sender) === null || _transceiver$sender === void 0 || (_transceiver$sender = _transceiver$sender.track) === null || _transceiver$sender === void 0 ? void 0 : _transceiver$sender.id;
|
|
39
|
+
const transceiver = this.pc.getTransceivers().find(t => t.mid === mid);
|
|
40
|
+
return transceiver?.sender?.track?.id;
|
|
42
41
|
}
|
|
43
42
|
getRemoteTrackIdByMid(mid) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return transceiver === null || transceiver === void 0 || (_transceiver$receiver = transceiver.receiver) === null || _transceiver$receiver === void 0 || (_transceiver$receiver = _transceiver$receiver.track) === null || _transceiver$receiver === void 0 ? void 0 : _transceiver$receiver.id;
|
|
43
|
+
const transceiver = this.pc.getTransceivers().find(t => t.mid === mid);
|
|
44
|
+
return transceiver?.receiver?.track?.id;
|
|
47
45
|
}
|
|
48
46
|
getActiveSimulcastStreams() {
|
|
49
47
|
//@TODO implement this right.. Check how many layer configured
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaTrackHandler.js","names":[
|
|
1
|
+
{"version":3,"file":"mediaTrackHandler.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaTrackHandler.ts"],"sourcesContent":["/*\nCopyright 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\nexport type TrackId = string;\n\nexport class MediaTrackHandler {\n public constructor(private readonly pc: RTCPeerConnection) {}\n\n public getLocalTracks(kind: \"audio\" | \"video\"): MediaStreamTrack[] {\n const isNotNullAndKind = (track: MediaStreamTrack | null): boolean => {\n return track !== null && track.kind === kind;\n };\n return this.pc\n .getTransceivers()\n .filter((t) => t.currentDirection === \"sendonly\" || t.currentDirection === \"sendrecv\")\n .filter((t) => t.sender !== null)\n .map((t) => t.sender)\n .map((s) => s.track)\n .filter(isNotNullAndKind) as MediaStreamTrack[];\n }\n\n public getTackById(trackId: string): MediaStreamTrack | undefined {\n return this.pc\n .getTransceivers()\n .map((t) => {\n if (t?.sender.track !== null && t.sender.track.id === trackId) {\n return t.sender.track;\n }\n if (t?.receiver.track !== null && t.receiver.track.id === trackId) {\n return t.receiver.track;\n }\n return undefined;\n })\n .find((t) => t !== undefined);\n }\n\n public getLocalTrackIdByMid(mid: string): string | undefined {\n const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);\n return transceiver?.sender?.track?.id;\n }\n\n public getRemoteTrackIdByMid(mid: string): string | undefined {\n const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);\n return transceiver?.receiver?.track?.id;\n }\n\n public getActiveSimulcastStreams(): number {\n //@TODO implement this right.. Check how many layer configured\n return 3;\n }\n\n public getTransceiverByTrackId(trackId: TrackId): RTCRtpTransceiver | undefined {\n return this.pc.getTransceivers().find((t) => {\n return t.receiver.track.id === trackId || (t.sender.track !== null && t.sender.track.id === trackId);\n });\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,MAAM,iBAAiB,CAAC;EACpB,WAAW,CAAkB,EAAqB,EAAE;IAAA,KAAvB,EAAqB,GAArB,EAAqB;EAAG;EAErD,cAAc,CAAC,IAAuB,EAAsB;IAC/D,MAAM,gBAAgB,GAAI,KAA8B,IAAc;MAClE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;IAChD,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,CACT,eAAe,CAAC,CAAC,CACjB,MAAM,CAAE,CAAC,IAAK,CAAC,CAAC,gBAAgB,KAAK,UAAU,IAAI,CAAC,CAAC,gBAAgB,KAAK,UAAU,CAAC,CACrF,MAAM,CAAE,CAAC,IAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAChC,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,MAAM,CAAC,CACpB,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,KAAK,CAAC,CACnB,MAAM,CAAC,gBAAgB,CAAC;EACjC;EAEO,WAAW,CAAC,OAAe,EAAgC;IAC9D,OAAO,IAAI,CAAC,EAAE,CACT,eAAe,CAAC,CAAC,CACjB,GAAG,CAAE,CAAC,IAAK;MACR,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE;QAC3D,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK;MACzB;MACA,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE;QAC/D,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK;MAC3B;MACA,OAAO,SAAS;IACpB,CAAC,CAAC,CACD,IAAI,CAAE,CAAC,IAAK,CAAC,KAAK,SAAS,CAAC;EACrC;EAEO,oBAAoB,CAAC,GAAW,EAAsB;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACxE,OAAO,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;EACzC;EAEO,qBAAqB,CAAC,GAAW,EAAsB;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACxE,OAAO,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;EAC3C;EAEO,yBAAyB,GAAW;IACvC;IACA,OAAO,CAAC;EACZ;EAEO,uBAAuB,CAAC,OAAgB,EAAiC;IAC5E,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK;MACzC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,IAAK,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,OAAQ;IACxG,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -17,9 +17,6 @@ limitations under the License.
|
|
|
17
17
|
|
|
18
18
|
export class MediaTrackStats {
|
|
19
19
|
constructor(trackId, type, kind) {
|
|
20
|
-
this.trackId = trackId;
|
|
21
|
-
this.type = type;
|
|
22
|
-
this.kind = kind;
|
|
23
20
|
_defineProperty(this, "loss", {
|
|
24
21
|
packetsTotal: 0,
|
|
25
22
|
packetsLost: 0,
|
|
@@ -43,6 +40,9 @@ export class MediaTrackStats {
|
|
|
43
40
|
_defineProperty(this, "isAlive", true);
|
|
44
41
|
_defineProperty(this, "isMuted", false);
|
|
45
42
|
_defineProperty(this, "isEnabled", true);
|
|
43
|
+
this.trackId = trackId;
|
|
44
|
+
this.type = type;
|
|
45
|
+
this.kind = kind;
|
|
46
46
|
}
|
|
47
47
|
getType() {
|
|
48
48
|
return this.type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaTrackStats.js","names":[
|
|
1
|
+
{"version":3,"file":"mediaTrackStats.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaTrackStats.ts"],"sourcesContent":["/*\nCopyright 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 AudioConcealment } from \"../statsReport.ts\";\nimport { type TrackId } from \"./mediaTrackHandler.ts\";\n\nexport interface PacketLoss {\n packetsTotal: number;\n packetsLost: number;\n isDownloadStream: boolean;\n}\n\nexport interface Bitrate {\n /**\n * bytes per second\n */\n download: number;\n /**\n * bytes per second\n */\n upload: number;\n}\nexport interface ConcealedAudio {\n /**\n * duration in ms\n */\n duration: number;\n\n ratio: number;\n}\nexport interface Resolution {\n width: number;\n height: number;\n}\n\nexport type TrackStatsType = \"local\" | \"remote\";\n\nexport class MediaTrackStats {\n private loss: PacketLoss = { packetsTotal: 0, packetsLost: 0, isDownloadStream: false };\n private bitrate: Bitrate = { download: 0, upload: 0 };\n private resolution: Resolution = { width: -1, height: -1 };\n private audioConcealment: AudioConcealment = { concealedAudio: 0, totalAudioDuration: 0 };\n private framerate = 0;\n private jitter = 0;\n private codec = \"\";\n private isAlive = true;\n private isMuted = false;\n private isEnabled = true;\n\n public constructor(\n public readonly trackId: TrackId,\n public readonly type: TrackStatsType,\n public readonly kind: \"audio\" | \"video\",\n ) {}\n\n public getType(): TrackStatsType {\n return this.type;\n }\n\n public setLoss(loss: PacketLoss): void {\n this.loss = loss;\n }\n\n public getLoss(): PacketLoss {\n return this.loss;\n }\n\n public setResolution(resolution: Resolution): void {\n this.resolution = resolution;\n }\n\n public getResolution(): Resolution {\n return this.resolution;\n }\n\n public setFramerate(framerate: number): void {\n this.framerate = framerate;\n }\n\n public getFramerate(): number {\n return this.framerate;\n }\n\n public setBitrate(bitrate: Bitrate): void {\n this.bitrate = bitrate;\n }\n\n public getBitrate(): Bitrate {\n return this.bitrate;\n }\n\n public setCodec(codecShortType: string): boolean {\n this.codec = codecShortType;\n return true;\n }\n\n public getCodec(): string {\n return this.codec;\n }\n\n public resetBitrate(): void {\n this.bitrate = { download: 0, upload: 0 };\n }\n\n public set alive(isAlive: boolean) {\n this.isAlive = isAlive;\n }\n\n /**\n * A MediaTrackState is alive if the corresponding MediaStreamTrack track bound to a transceiver and the\n * MediaStreamTrack is in state MediaStreamTrack.readyState === live\n */\n public get alive(): boolean {\n return this.isAlive;\n }\n\n public set muted(isMuted: boolean) {\n this.isMuted = isMuted;\n }\n\n /**\n * A MediaTrackState.isMuted corresponding to MediaStreamTrack.muted.\n * But these values only match if MediaTrackState.isAlive.\n */\n public get muted(): boolean {\n return this.isMuted;\n }\n\n public set enabled(isEnabled: boolean) {\n this.isEnabled = isEnabled;\n }\n\n /**\n * A MediaTrackState.isEnabled corresponding to MediaStreamTrack.enabled.\n * But these values only match if MediaTrackState.isAlive.\n */\n public get enabled(): boolean {\n return this.isEnabled;\n }\n\n public setJitter(jitter: number): void {\n this.jitter = jitter;\n }\n\n /**\n * Jitter in milliseconds\n */\n public getJitter(): number {\n return this.jitter;\n }\n\n /**\n * Audio concealment ration (conceled duration / total duration)\n */\n public setAudioConcealment(concealedAudioDuration: number, totalAudioDuration: number): void {\n this.audioConcealment.concealedAudio = concealedAudioDuration;\n this.audioConcealment.totalAudioDuration = totalAudioDuration;\n }\n\n public getAudioConcealment(): AudioConcealment {\n return this.audioConcealment;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -18,9 +18,9 @@ limitations under the License.
|
|
|
18
18
|
import { MediaTrackStats } from "./mediaTrackStats.js";
|
|
19
19
|
export class MediaTrackStatsHandler {
|
|
20
20
|
constructor(mediaSsrcHandler, mediaTrackHandler) {
|
|
21
|
+
_defineProperty(this, "track2stats", new Map());
|
|
21
22
|
this.mediaSsrcHandler = mediaSsrcHandler;
|
|
22
23
|
this.mediaTrackHandler = mediaTrackHandler;
|
|
23
|
-
_defineProperty(this, "track2stats", new Map());
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
@@ -31,13 +31,13 @@ export class MediaTrackStatsHandler {
|
|
|
31
31
|
* https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats
|
|
32
32
|
*/
|
|
33
33
|
findTrack2Stats(report, type) {
|
|
34
|
-
|
|
34
|
+
let trackID;
|
|
35
35
|
if (report.trackIdentifier) {
|
|
36
36
|
trackID = report.trackIdentifier;
|
|
37
37
|
} else if (report.mid) {
|
|
38
38
|
trackID = type === "remote" ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid) : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);
|
|
39
39
|
} else if (report.ssrc) {
|
|
40
|
-
|
|
40
|
+
const mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);
|
|
41
41
|
if (!mid) {
|
|
42
42
|
return undefined;
|
|
43
43
|
}
|
|
@@ -46,11 +46,11 @@ export class MediaTrackStatsHandler {
|
|
|
46
46
|
if (!trackID) {
|
|
47
47
|
return undefined;
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
let trackStats = this.track2stats.get(trackID);
|
|
50
50
|
if (!trackStats) {
|
|
51
|
-
|
|
51
|
+
const track = this.mediaTrackHandler.getTackById(trackID);
|
|
52
52
|
if (track !== undefined) {
|
|
53
|
-
|
|
53
|
+
const kind = track.kind === "audio" ? track.kind : "video";
|
|
54
54
|
trackStats = new MediaTrackStats(trackID, type, kind);
|
|
55
55
|
this.track2stats.set(trackID, trackStats);
|
|
56
56
|
} else {
|
|
@@ -60,7 +60,7 @@ export class MediaTrackStatsHandler {
|
|
|
60
60
|
return trackStats;
|
|
61
61
|
}
|
|
62
62
|
findLocalVideoTrackStats(report) {
|
|
63
|
-
|
|
63
|
+
const localVideoTracks = this.mediaTrackHandler.getLocalTracks("video");
|
|
64
64
|
if (localVideoTracks.length === 0) {
|
|
65
65
|
return undefined;
|
|
66
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaTrackStatsHandler.js","names":[
|
|
1
|
+
{"version":3,"file":"mediaTrackStatsHandler.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaTrackStatsHandler.ts"],"sourcesContent":["/*\nCopyright 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*/\nimport { type TrackID } from \"../statsReport.ts\";\nimport { MediaTrackStats } from \"./mediaTrackStats.ts\";\nimport { type MediaTrackHandler, type TrackId } from \"./mediaTrackHandler.ts\";\nimport { type MediaSsrcHandler } from \"./mediaSsrcHandler.ts\";\n\nexport class MediaTrackStatsHandler {\n private readonly track2stats = new Map<TrackID, MediaTrackStats>();\n\n public constructor(\n public readonly mediaSsrcHandler: MediaSsrcHandler,\n public readonly mediaTrackHandler: MediaTrackHandler,\n ) {}\n\n /**\n * Find tracks by rtc stats\n * Argument report is any because the stats api is not consistent:\n * For example `trackIdentifier`, `mid` not existing in every implementations\n * https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats\n * https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats\n */\n public findTrack2Stats(report: any, type: \"remote\" | \"local\"): MediaTrackStats | undefined {\n let trackID;\n if (report.trackIdentifier) {\n trackID = report.trackIdentifier;\n } else if (report.mid) {\n trackID =\n type === \"remote\"\n ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)\n : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);\n } else if (report.ssrc) {\n const mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);\n if (!mid) {\n return undefined;\n }\n trackID =\n type === \"remote\"\n ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)\n : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);\n }\n\n if (!trackID) {\n return undefined;\n }\n\n let trackStats = this.track2stats.get(trackID);\n\n if (!trackStats) {\n const track = this.mediaTrackHandler.getTackById(trackID);\n if (track !== undefined) {\n const kind: \"audio\" | \"video\" = track.kind === \"audio\" ? track.kind : \"video\";\n trackStats = new MediaTrackStats(trackID, type, kind);\n this.track2stats.set(trackID, trackStats);\n } else {\n return undefined;\n }\n }\n return trackStats;\n }\n\n public findLocalVideoTrackStats(report: any): MediaTrackStats | undefined {\n const localVideoTracks = this.mediaTrackHandler.getLocalTracks(\"video\");\n if (localVideoTracks.length === 0) {\n return undefined;\n }\n return this.findTrack2Stats(report, \"local\");\n }\n\n public getTrack2stats(): Map<TrackID, MediaTrackStats> {\n return this.track2stats;\n }\n\n public findTransceiverByTrackId(trackID: TrackId): undefined | RTCRtpTransceiver {\n return this.mediaTrackHandler.getTransceiverByTrackId(trackID);\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,eAAe,QAAQ,sBAAsB;AAItD,OAAO,MAAM,sBAAsB,CAAC;EAGzB,WAAW,CACE,gBAAkC,EAClC,iBAAoC,EACtD;IAAA,qCAL6B,IAAI,GAAG,CAA2B,CAAC;IAAA,KAG9C,gBAAkC,GAAlC,gBAAkC;IAAA,KAClC,iBAAoC,GAApC,iBAAoC;EACrD;;EAEH;AACJ;AACA;AACA;AACA;AACA;AACA;EACW,eAAe,CAAC,MAAW,EAAE,IAAwB,EAA+B;IACvF,IAAI,OAAO;IACX,IAAI,MAAM,CAAC,eAAe,EAAE;MACxB,OAAO,GAAG,MAAM,CAAC,eAAe;IACpC,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE;MACnB,OAAO,GACH,IAAI,KAAK,QAAQ,GACX,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,GACxD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;MACpB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;MAClE,IAAI,CAAC,GAAG,EAAE;QACN,OAAO,SAAS;MACpB;MACA,OAAO,GACH,IAAI,KAAK,QAAQ,GACX,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,GACxD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE;IAEA,IAAI,CAAC,OAAO,EAAE;MACV,OAAO,SAAS;IACpB;IAEA,IAAI,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;IAE9C,IAAI,CAAC,UAAU,EAAE;MACb,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC;MACzD,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,MAAM,IAAuB,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,OAAO;QAC7E,UAAU,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC;MAC7C,CAAC,MAAM;QACH,OAAO,SAAS;MACpB;IACJ;IACA,OAAO,UAAU;EACrB;EAEO,wBAAwB,CAAC,MAAW,EAA+B;IACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC;IACvE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;MAC/B,OAAO,SAAS;IACpB;IACA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;EAChD;EAEO,cAAc,GAAkC;IACnD,OAAO,IAAI,CAAC,WAAW;EAC3B;EAEO,wBAAwB,CAAC,OAAgB,EAAiC;IAC7E,OAAO,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,OAAO,CAAC;EAClE;AACJ","ignoreList":[]}
|
|
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|
|
14
14
|
limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
export
|
|
17
|
+
export let StatsReport = /*#__PURE__*/function (StatsReport) {
|
|
18
18
|
StatsReport["CONNECTION_STATS"] = "StatsReport.connection_stats";
|
|
19
19
|
StatsReport["CALL_FEED_REPORT"] = "StatsReport.call_feed_report";
|
|
20
20
|
StatsReport["BYTE_SENT_STATS"] = "StatsReport.byte_sent_stats";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statsReport.js","names":[
|
|
1
|
+
{"version":3,"file":"statsReport.js","names":[],"sources":["../../../src/webrtc/stats/statsReport.ts"],"sourcesContent":["/*\nCopyright 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 ConnectionStatsBandwidth, type ConnectionStatsBitrate, type PacketLoss } from \"./connectionStats.ts\";\nimport { type TransportStats } from \"./transportStats.ts\";\nimport { type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport enum StatsReport {\n CONNECTION_STATS = \"StatsReport.connection_stats\",\n CALL_FEED_REPORT = \"StatsReport.call_feed_report\",\n BYTE_SENT_STATS = \"StatsReport.byte_sent_stats\",\n SUMMARY_STATS = \"StatsReport.summary_stats\",\n}\n\n/// ByteSentStatsReport ################################################################################################\nexport interface ByteSentStatsReport extends Map<TrackID, ByteSend> {\n callId?: string;\n opponentMemberId?: string;\n // is a map: `local trackID` => byte send\n}\n\nexport type TrackID = string;\nexport type ByteSend = number;\n\n/// ConnectionStatsReport ##############################################################################################\nexport interface ConnectionStatsReport {\n callId?: string;\n opponentMemberId?: string;\n bandwidth: ConnectionStatsBandwidth;\n bitrate: ConnectionStatsBitrate;\n packetLoss: PacketLoss;\n audioConcealment: Map<TrackID, AudioConcealment>;\n totalAudioConcealment: AudioConcealment;\n resolution: ResolutionMap;\n framerate: FramerateMap;\n codec: CodecMap;\n jitter: Map<TrackID, number>;\n transport: TransportStats[];\n}\n\nexport interface AudioConcealment {\n concealedAudio: number;\n totalAudioDuration: number;\n}\n\nexport interface ResolutionMap {\n local: Map<TrackID, Resolution>;\n remote: Map<TrackID, Resolution>;\n}\n\nexport interface FramerateMap {\n local: Map<TrackID, number>;\n remote: Map<TrackID, number>;\n}\n\nexport interface CodecMap {\n local: Map<TrackID, string>;\n remote: Map<TrackID, string>;\n}\n\n/// SummaryStatsReport #################################################################################################\nexport interface SummaryStatsReport {\n /**\n * Aggregated the information for percentage of received media\n *\n * This measure whether the current user receive data from a call participants.\n * As soon as a participant sends at least a byte media to this user, this counts as one measurement unit.\n * The units of measure divided by the total number of participants is a value between 0 and 1.\n */\n percentageReceivedMedia: number;\n percentageReceivedAudioMedia: number;\n percentageReceivedVideoMedia: number;\n maxJitter: number;\n maxPacketLoss: number;\n percentageConcealedAudio: number;\n peerConnections: number;\n opponentUsersInCall?: number;\n opponentDevicesInCall?: number;\n diffDevicesToPeerConnections?: number;\n ratioPeerConnectionToDevices?: number;\n // Todo: Decide if we want an index (or a timestamp) of this report in relation to the group call, to help differenciate when issues occur and ignore/track initial connection delays.\n}\n\n/// CallFeedReport #####################################################################################################\nexport interface CallFeedReport {\n callId: string;\n opponentMemberId: string;\n transceiver: TransceiverStats[];\n callFeeds: CallFeedStats[];\n}\n\nexport interface CallFeedStats {\n stream: string;\n type: \"remote\" | \"local\";\n audio: TrackStats | null;\n video: TrackStats | null;\n purpose: string;\n prefix: string;\n isVideoMuted: boolean;\n isAudioMuted: boolean;\n}\n\nexport interface TransceiverStats {\n readonly mid: string;\n readonly sender: TrackStats | null;\n readonly receiver: TrackStats | null;\n readonly direction: string;\n readonly currentDirection: string;\n}\n\nexport interface TrackStats {\n readonly id: string;\n readonly kind: \"audio\" | \"video\";\n readonly settingDeviceId: string;\n readonly constrainDeviceId: string;\n readonly muted: boolean;\n readonly enabled: boolean;\n readonly readyState: \"ended\" | \"live\";\n readonly label: string;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,WAAY,WAAW,0BAAX,WAAW;EAAX,WAAW;EAAX,WAAW;EAAX,WAAW;EAAX,WAAW;EAAA,OAAX,WAAW;AAAA;;AAOvB;;AAUA;;AAoCA;;AAuBA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statsReportEmitter.js","names":[
|
|
1
|
+
{"version":3,"file":"statsReportEmitter.js","names":[],"sources":["../../../src/webrtc/stats/statsReportEmitter.ts"],"sourcesContent":["/*\nCopyright 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 { TypedEventEmitter } from \"../../models/typed-event-emitter.ts\";\nimport {\n type ByteSentStatsReport,\n type CallFeedReport,\n type ConnectionStatsReport,\n StatsReport,\n type SummaryStatsReport,\n} from \"./statsReport.ts\";\n\nexport type StatsReportHandlerMap = {\n [StatsReport.BYTE_SENT_STATS]: (report: ByteSentStatsReport) => void;\n [StatsReport.CONNECTION_STATS]: (report: ConnectionStatsReport) => void;\n [StatsReport.CALL_FEED_REPORT]: (report: CallFeedReport) => void;\n [StatsReport.SUMMARY_STATS]: (report: SummaryStatsReport) => void;\n};\n\nexport class StatsReportEmitter extends TypedEventEmitter<StatsReport, StatsReportHandlerMap> {\n public emitByteSendReport(byteSentStats: ByteSentStatsReport): void {\n this.emit(StatsReport.BYTE_SENT_STATS, byteSentStats);\n }\n\n public emitConnectionStatsReport(report: ConnectionStatsReport): void {\n this.emit(StatsReport.CONNECTION_STATS, report);\n }\n\n public emitCallFeedReport(report: CallFeedReport): void {\n this.emit(StatsReport.CALL_FEED_REPORT, report);\n }\n\n public emitSummaryStatsReport(report: SummaryStatsReport): void {\n this.emit(StatsReport.SUMMARY_STATS, report);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,iBAAiB,QAAQ,qCAAqC;AACvE,SAII,WAAW,QAER,kBAAkB;AASzB,OAAO,MAAM,kBAAkB,SAAS,iBAAiB,CAAqC;EACnF,kBAAkB,CAAC,aAAkC,EAAQ;IAChE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,aAAa,CAAC;EACzD;EAEO,yBAAyB,CAAC,MAA6B,EAAQ;IAClE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC;EACnD;EAEO,kBAAkB,CAAC,MAAsB,EAAQ;IACpD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC;EACnD;EAEO,sBAAsB,CAAC,MAA0B,EAAQ;IAC5D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC;EAChD;AACJ","ignoreList":[]}
|
|
@@ -19,30 +19,30 @@ export class SummaryStatsReportGatherer {
|
|
|
19
19
|
// Filter all stats which collect the first time webrtc stats.
|
|
20
20
|
// Because stats based on time interval and the first collection of a summery stats has no previous
|
|
21
21
|
// webrtcStats as basement all the calculation are 0. We don't want track the 0 stats.
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const summary = allSummary.filter(s => !s.isFirstCollection);
|
|
23
|
+
const summaryTotalCount = summary.length;
|
|
24
24
|
// For counting the peer connections we also want to consider the ignored summaries
|
|
25
|
-
|
|
25
|
+
const peerConnectionsCount = allSummary.length;
|
|
26
26
|
if (summaryTotalCount === 0) {
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
const summaryCounter = {
|
|
30
30
|
receivedAudio: 0,
|
|
31
31
|
receivedVideo: 0,
|
|
32
32
|
receivedMedia: 0,
|
|
33
33
|
concealedAudio: 0,
|
|
34
34
|
totalAudio: 0
|
|
35
35
|
};
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
let maxJitter = 0;
|
|
37
|
+
let maxPacketLoss = 0;
|
|
38
38
|
summary.forEach(stats => {
|
|
39
39
|
this.countTrackListReceivedMedia(summaryCounter, stats);
|
|
40
40
|
this.countConcealedAudio(summaryCounter, stats);
|
|
41
41
|
maxJitter = this.buildMaxJitter(maxJitter, stats);
|
|
42
42
|
maxPacketLoss = this.buildMaxPacketLoss(maxPacketLoss, stats);
|
|
43
43
|
});
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
const decimalPlaces = 5;
|
|
45
|
+
const report = {
|
|
46
46
|
percentageReceivedMedia: Number((summaryCounter.receivedMedia / summaryTotalCount).toFixed(decimalPlaces)),
|
|
47
47
|
percentageReceivedVideoMedia: Number((summaryCounter.receivedVideo / summaryTotalCount).toFixed(decimalPlaces)),
|
|
48
48
|
percentageReceivedAudioMedia: Number((summaryCounter.receivedAudio / summaryTotalCount).toFixed(decimalPlaces)),
|
|
@@ -57,11 +57,11 @@ export class SummaryStatsReportGatherer {
|
|
|
57
57
|
// Calculate the actual number of devices based on the participants state event
|
|
58
58
|
// (this is used, to compare the expected participant count from the room state with the acutal peer connections)
|
|
59
59
|
// const devices = callParticipants.()
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
for (
|
|
60
|
+
const devices = [];
|
|
61
|
+
const users = [];
|
|
62
|
+
for (const userEntry of callParticipants) {
|
|
63
63
|
users.push(userEntry);
|
|
64
|
-
for (
|
|
64
|
+
for (const device of userEntry[1]) {
|
|
65
65
|
devices.push(device);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
@@ -71,8 +71,8 @@ export class SummaryStatsReportGatherer {
|
|
|
71
71
|
report.ratioPeerConnectionToDevices = Math.max(0, devices.length - 1) == 0 ? 0 : report.peerConnections / (devices.length - 1);
|
|
72
72
|
}
|
|
73
73
|
countTrackListReceivedMedia(counter, stats) {
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
let hasReceivedAudio = false;
|
|
75
|
+
let hasReceivedVideo = false;
|
|
76
76
|
if (stats.receivedAudioMedia > 0 || stats.audioTrackSummary.count === 0) {
|
|
77
77
|
counter.receivedAudio++;
|
|
78
78
|
hasReceivedAudio = true;
|