@unwanted/matrix-sdk-mini 34.12.0-1 → 34.12.0-2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. package/git-revision.txt +1 -1
  2. package/lib/@types/event.d.ts +0 -19
  3. package/lib/@types/event.d.ts.map +1 -1
  4. package/lib/@types/event.js.map +1 -1
  5. package/lib/client.d.ts +2 -50
  6. package/lib/client.d.ts.map +1 -1
  7. package/lib/client.js +391 -501
  8. package/lib/client.js.map +1 -1
  9. package/lib/embedded.d.ts.map +1 -1
  10. package/lib/embedded.js +0 -1
  11. package/lib/embedded.js.map +1 -1
  12. package/lib/matrix.d.ts +0 -6
  13. package/lib/matrix.d.ts.map +1 -1
  14. package/lib/matrix.js +1 -5
  15. package/lib/matrix.js.map +1 -1
  16. package/package.json +1 -1
  17. package/src/@types/event.ts +2 -36
  18. package/src/client.ts +1 -150
  19. package/src/embedded.ts +0 -2
  20. package/src/matrix.ts +0 -13
  21. package/lib/matrixrtc/CallMembership.d.ts +0 -66
  22. package/lib/matrixrtc/CallMembership.d.ts.map +0 -1
  23. package/lib/matrixrtc/CallMembership.js +0 -197
  24. package/lib/matrixrtc/CallMembership.js.map +0 -1
  25. package/lib/matrixrtc/LivekitFocus.d.ts +0 -16
  26. package/lib/matrixrtc/LivekitFocus.d.ts.map +0 -1
  27. package/lib/matrixrtc/LivekitFocus.js +0 -20
  28. package/lib/matrixrtc/LivekitFocus.js.map +0 -1
  29. package/lib/matrixrtc/MatrixRTCSession.d.ts +0 -295
  30. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +0 -1
  31. package/lib/matrixrtc/MatrixRTCSession.js +0 -1043
  32. package/lib/matrixrtc/MatrixRTCSession.js.map +0 -1
  33. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +0 -40
  34. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +0 -1
  35. package/lib/matrixrtc/MatrixRTCSessionManager.js +0 -146
  36. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +0 -1
  37. package/lib/matrixrtc/focus.d.ts +0 -10
  38. package/lib/matrixrtc/focus.d.ts.map +0 -1
  39. package/lib/matrixrtc/focus.js +0 -1
  40. package/lib/matrixrtc/focus.js.map +0 -1
  41. package/lib/matrixrtc/index.d.ts +0 -7
  42. package/lib/matrixrtc/index.d.ts.map +0 -1
  43. package/lib/matrixrtc/index.js +0 -21
  44. package/lib/matrixrtc/index.js.map +0 -1
  45. package/lib/matrixrtc/types.d.ts +0 -19
  46. package/lib/matrixrtc/types.d.ts.map +0 -1
  47. package/lib/matrixrtc/types.js +0 -1
  48. package/lib/matrixrtc/types.js.map +0 -1
  49. package/lib/webrtc/audioContext.d.ts +0 -15
  50. package/lib/webrtc/audioContext.d.ts.map +0 -1
  51. package/lib/webrtc/audioContext.js +0 -46
  52. package/lib/webrtc/audioContext.js.map +0 -1
  53. package/lib/webrtc/call.d.ts +0 -560
  54. package/lib/webrtc/call.d.ts.map +0 -1
  55. package/lib/webrtc/call.js +0 -2541
  56. package/lib/webrtc/call.js.map +0 -1
  57. package/lib/webrtc/callEventHandler.d.ts +0 -37
  58. package/lib/webrtc/callEventHandler.d.ts.map +0 -1
  59. package/lib/webrtc/callEventHandler.js +0 -344
  60. package/lib/webrtc/callEventHandler.js.map +0 -1
  61. package/lib/webrtc/callEventTypes.d.ts +0 -73
  62. package/lib/webrtc/callEventTypes.d.ts.map +0 -1
  63. package/lib/webrtc/callEventTypes.js +0 -13
  64. package/lib/webrtc/callEventTypes.js.map +0 -1
  65. package/lib/webrtc/callFeed.d.ts +0 -128
  66. package/lib/webrtc/callFeed.d.ts.map +0 -1
  67. package/lib/webrtc/callFeed.js +0 -289
  68. package/lib/webrtc/callFeed.js.map +0 -1
  69. package/lib/webrtc/groupCall.d.ts +0 -323
  70. package/lib/webrtc/groupCall.d.ts.map +0 -1
  71. package/lib/webrtc/groupCall.js +0 -1337
  72. package/lib/webrtc/groupCall.js.map +0 -1
  73. package/lib/webrtc/groupCallEventHandler.d.ts +0 -31
  74. package/lib/webrtc/groupCallEventHandler.d.ts.map +0 -1
  75. package/lib/webrtc/groupCallEventHandler.js +0 -178
  76. package/lib/webrtc/groupCallEventHandler.js.map +0 -1
  77. package/lib/webrtc/mediaHandler.d.ts +0 -89
  78. package/lib/webrtc/mediaHandler.d.ts.map +0 -1
  79. package/lib/webrtc/mediaHandler.js +0 -437
  80. package/lib/webrtc/mediaHandler.js.map +0 -1
  81. package/lib/webrtc/stats/callFeedStatsReporter.d.ts +0 -8
  82. package/lib/webrtc/stats/callFeedStatsReporter.d.ts.map +0 -1
  83. package/lib/webrtc/stats/callFeedStatsReporter.js +0 -82
  84. package/lib/webrtc/stats/callFeedStatsReporter.js.map +0 -1
  85. package/lib/webrtc/stats/callStatsReportGatherer.d.ts +0 -25
  86. package/lib/webrtc/stats/callStatsReportGatherer.d.ts.map +0 -1
  87. package/lib/webrtc/stats/callStatsReportGatherer.js +0 -199
  88. package/lib/webrtc/stats/callStatsReportGatherer.js.map +0 -1
  89. package/lib/webrtc/stats/callStatsReportSummary.d.ts +0 -17
  90. package/lib/webrtc/stats/callStatsReportSummary.d.ts.map +0 -1
  91. package/lib/webrtc/stats/callStatsReportSummary.js +0 -1
  92. package/lib/webrtc/stats/callStatsReportSummary.js.map +0 -1
  93. package/lib/webrtc/stats/connectionStats.d.ts +0 -28
  94. package/lib/webrtc/stats/connectionStats.d.ts.map +0 -1
  95. package/lib/webrtc/stats/connectionStats.js +0 -26
  96. package/lib/webrtc/stats/connectionStats.js.map +0 -1
  97. package/lib/webrtc/stats/connectionStatsBuilder.d.ts +0 -5
  98. package/lib/webrtc/stats/connectionStatsBuilder.d.ts.map +0 -1
  99. package/lib/webrtc/stats/connectionStatsBuilder.js +0 -27
  100. package/lib/webrtc/stats/connectionStatsBuilder.js.map +0 -1
  101. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts +0 -7
  102. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts.map +0 -1
  103. package/lib/webrtc/stats/connectionStatsReportBuilder.js +0 -121
  104. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +0 -1
  105. package/lib/webrtc/stats/groupCallStats.d.ts +0 -22
  106. package/lib/webrtc/stats/groupCallStats.d.ts.map +0 -1
  107. package/lib/webrtc/stats/groupCallStats.js +0 -78
  108. package/lib/webrtc/stats/groupCallStats.js.map +0 -1
  109. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts +0 -10
  110. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts.map +0 -1
  111. package/lib/webrtc/stats/media/mediaSsrcHandler.js +0 -57
  112. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +0 -1
  113. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts +0 -12
  114. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts.map +0 -1
  115. package/lib/webrtc/stats/media/mediaTrackHandler.js +0 -62
  116. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +0 -1
  117. package/lib/webrtc/stats/media/mediaTrackStats.d.ts +0 -86
  118. package/lib/webrtc/stats/media/mediaTrackStats.d.ts.map +0 -1
  119. package/lib/webrtc/stats/media/mediaTrackStats.js +0 -142
  120. package/lib/webrtc/stats/media/mediaTrackStats.js.map +0 -1
  121. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts +0 -22
  122. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts.map +0 -1
  123. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +0 -76
  124. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +0 -1
  125. package/lib/webrtc/stats/statsReport.d.ts +0 -99
  126. package/lib/webrtc/stats/statsReport.d.ts.map +0 -1
  127. package/lib/webrtc/stats/statsReport.js +0 -32
  128. package/lib/webrtc/stats/statsReport.js.map +0 -1
  129. package/lib/webrtc/stats/statsReportEmitter.d.ts +0 -15
  130. package/lib/webrtc/stats/statsReportEmitter.d.ts.map +0 -1
  131. package/lib/webrtc/stats/statsReportEmitter.js +0 -33
  132. package/lib/webrtc/stats/statsReportEmitter.js.map +0 -1
  133. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts +0 -16
  134. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts.map +0 -1
  135. package/lib/webrtc/stats/summaryStatsReportGatherer.js +0 -116
  136. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +0 -1
  137. package/lib/webrtc/stats/trackStatsBuilder.d.ts +0 -19
  138. package/lib/webrtc/stats/trackStatsBuilder.d.ts.map +0 -1
  139. package/lib/webrtc/stats/trackStatsBuilder.js +0 -168
  140. package/lib/webrtc/stats/trackStatsBuilder.js.map +0 -1
  141. package/lib/webrtc/stats/transportStats.d.ts +0 -11
  142. package/lib/webrtc/stats/transportStats.d.ts.map +0 -1
  143. package/lib/webrtc/stats/transportStats.js +0 -1
  144. package/lib/webrtc/stats/transportStats.js.map +0 -1
  145. package/lib/webrtc/stats/transportStatsBuilder.d.ts +0 -5
  146. package/lib/webrtc/stats/transportStatsBuilder.d.ts.map +0 -1
  147. package/lib/webrtc/stats/transportStatsBuilder.js +0 -34
  148. package/lib/webrtc/stats/transportStatsBuilder.js.map +0 -1
  149. package/lib/webrtc/stats/valueFormatter.d.ts +0 -4
  150. package/lib/webrtc/stats/valueFormatter.d.ts.map +0 -1
  151. package/lib/webrtc/stats/valueFormatter.js +0 -25
  152. package/lib/webrtc/stats/valueFormatter.js.map +0 -1
  153. package/src/matrixrtc/CallMembership.ts +0 -247
  154. package/src/matrixrtc/LivekitFocus.ts +0 -39
  155. package/src/matrixrtc/MatrixRTCSession.ts +0 -1319
  156. package/src/matrixrtc/MatrixRTCSessionManager.ts +0 -166
  157. package/src/matrixrtc/focus.ts +0 -25
  158. package/src/matrixrtc/index.ts +0 -22
  159. package/src/matrixrtc/types.ts +0 -36
  160. package/src/webrtc/audioContext.ts +0 -44
  161. package/src/webrtc/call.ts +0 -3074
  162. package/src/webrtc/callEventHandler.ts +0 -425
  163. package/src/webrtc/callEventTypes.ts +0 -93
  164. package/src/webrtc/callFeed.ts +0 -364
  165. package/src/webrtc/groupCall.ts +0 -1735
  166. package/src/webrtc/groupCallEventHandler.ts +0 -234
  167. package/src/webrtc/mediaHandler.ts +0 -484
  168. package/src/webrtc/stats/callFeedStatsReporter.ts +0 -94
  169. package/src/webrtc/stats/callStatsReportGatherer.ts +0 -219
  170. package/src/webrtc/stats/callStatsReportSummary.ts +0 -30
  171. package/src/webrtc/stats/connectionStats.ts +0 -47
  172. package/src/webrtc/stats/connectionStatsBuilder.ts +0 -28
  173. package/src/webrtc/stats/connectionStatsReportBuilder.ts +0 -140
  174. package/src/webrtc/stats/groupCallStats.ts +0 -93
  175. package/src/webrtc/stats/media/mediaSsrcHandler.ts +0 -57
  176. package/src/webrtc/stats/media/mediaTrackHandler.ts +0 -76
  177. package/src/webrtc/stats/media/mediaTrackStats.ts +0 -176
  178. package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +0 -90
  179. package/src/webrtc/stats/statsReport.ts +0 -133
  180. package/src/webrtc/stats/statsReportEmitter.ts +0 -49
  181. package/src/webrtc/stats/summaryStatsReportGatherer.ts +0 -148
  182. package/src/webrtc/stats/trackStatsBuilder.ts +0 -207
  183. package/src/webrtc/stats/transportStats.ts +0 -26
  184. package/src/webrtc/stats/transportStatsBuilder.ts +0 -48
  185. package/src/webrtc/stats/valueFormatter.ts +0 -27
@@ -1 +0,0 @@
1
- {"version":3,"file":"summaryStatsReportGatherer.js","names":["SummaryStatsReportGatherer","constructor","emitter","build","allSummary","summary","filter","s","isFirstCollection","summaryTotalCount","length","peerConnectionsCount","summaryCounter","receivedAudio","receivedVideo","receivedMedia","concealedAudio","totalAudio","maxJitter","maxPacketLoss","forEach","stats","countTrackListReceivedMedia","countConcealedAudio","buildMaxJitter","buildMaxPacketLoss","decimalPlaces","report","percentageReceivedMedia","Number","toFixed","percentageReceivedVideoMedia","percentageReceivedAudioMedia","percentageConcealedAudio","peerConnections","emitSummaryStatsReport","extendSummaryReport","callParticipants","devices","users","userEntry","push","device","opponentDevicesInCall","Math","max","opponentUsersInCall","diffDevicesToPeerConnections","ratioPeerConnectionToDevices","counter","hasReceivedAudio","hasReceivedVideo","receivedAudioMedia","audioTrackSummary","count","receivedVideoMedia","videoTrackSummary","muted"],"sources":["../../../src/webrtc/stats/summaryStatsReportGatherer.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\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 http://www.apache.org/licenses/LICENSE-2.0\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 { StatsReportEmitter } from \"./statsReportEmitter.ts\";\nimport { CallStatsReportSummary } from \"./callStatsReportSummary.ts\";\nimport { SummaryStatsReport } from \"./statsReport.ts\";\nimport { ParticipantState } from \"../groupCall.ts\";\nimport { RoomMember } from \"../../matrix.ts\";\n\ninterface CallStatsReportSummaryCounter {\n receivedAudio: number;\n receivedVideo: number;\n receivedMedia: number;\n concealedAudio: number;\n totalAudio: number;\n}\n\nexport class SummaryStatsReportGatherer {\n public constructor(private emitter: StatsReportEmitter) {}\n\n public build(allSummary: CallStatsReportSummary[]): void {\n // Filter all stats which collect the first time webrtc stats.\n // Because stats based on time interval and the first collection of a summery stats has no previous\n // webrtcStats as basement all the calculation are 0. We don't want track the 0 stats.\n const summary = allSummary.filter((s) => !s.isFirstCollection);\n const summaryTotalCount = summary.length;\n // For counting the peer connections we also want to consider the ignored summaries\n const peerConnectionsCount = allSummary.length;\n if (summaryTotalCount === 0) {\n return;\n }\n\n const summaryCounter: CallStatsReportSummaryCounter = {\n receivedAudio: 0,\n receivedVideo: 0,\n receivedMedia: 0,\n concealedAudio: 0,\n totalAudio: 0,\n };\n let maxJitter = 0;\n let maxPacketLoss = 0;\n summary.forEach((stats) => {\n this.countTrackListReceivedMedia(summaryCounter, stats);\n this.countConcealedAudio(summaryCounter, stats);\n maxJitter = this.buildMaxJitter(maxJitter, stats);\n maxPacketLoss = this.buildMaxPacketLoss(maxPacketLoss, stats);\n });\n const decimalPlaces = 5;\n const report = {\n percentageReceivedMedia: Number((summaryCounter.receivedMedia / summaryTotalCount).toFixed(decimalPlaces)),\n percentageReceivedVideoMedia: Number(\n (summaryCounter.receivedVideo / summaryTotalCount).toFixed(decimalPlaces),\n ),\n percentageReceivedAudioMedia: Number(\n (summaryCounter.receivedAudio / summaryTotalCount).toFixed(decimalPlaces),\n ),\n maxJitter,\n maxPacketLoss,\n percentageConcealedAudio: Number(\n summaryCounter.totalAudio > 0\n ? (summaryCounter.concealedAudio / summaryCounter.totalAudio).toFixed(decimalPlaces)\n : 0,\n ),\n peerConnections: peerConnectionsCount,\n } as SummaryStatsReport;\n this.emitter.emitSummaryStatsReport(report);\n }\n\n public static extendSummaryReport(\n report: SummaryStatsReport,\n callParticipants: Map<RoomMember, Map<string, ParticipantState>>,\n ): void {\n // Calculate the actual number of devices based on the participants state event\n // (this is used, to compare the expected participant count from the room state with the acutal peer connections)\n // const devices = callParticipants.()\n const devices: [string, ParticipantState][] = [];\n const users: [RoomMember, Map<string, ParticipantState>][] = [];\n for (const userEntry of callParticipants) {\n users.push(userEntry);\n for (const device of userEntry[1]) {\n devices.push(device);\n }\n }\n report.opponentDevicesInCall = Math.max(0, devices.length - 1);\n report.opponentUsersInCall = Math.max(0, users.length - 1);\n report.diffDevicesToPeerConnections = Math.max(0, devices.length - 1) - report.peerConnections;\n report.ratioPeerConnectionToDevices =\n Math.max(0, devices.length - 1) == 0 ? 0 : report.peerConnections / (devices.length - 1);\n }\n\n private countTrackListReceivedMedia(counter: CallStatsReportSummaryCounter, stats: CallStatsReportSummary): void {\n let hasReceivedAudio = false;\n let hasReceivedVideo = false;\n if (stats.receivedAudioMedia > 0 || stats.audioTrackSummary.count === 0) {\n counter.receivedAudio++;\n hasReceivedAudio = true;\n }\n if (stats.receivedVideoMedia > 0 || stats.videoTrackSummary.count === 0) {\n counter.receivedVideo++;\n hasReceivedVideo = true;\n } else {\n if (stats.videoTrackSummary.muted > 0 && stats.videoTrackSummary.muted === stats.videoTrackSummary.count) {\n counter.receivedVideo++;\n hasReceivedVideo = true;\n }\n }\n\n if (hasReceivedVideo && hasReceivedAudio) {\n counter.receivedMedia++;\n }\n }\n\n private buildMaxJitter(maxJitter: number, stats: CallStatsReportSummary): number {\n if (maxJitter < stats.videoTrackSummary.maxJitter) {\n maxJitter = stats.videoTrackSummary.maxJitter;\n }\n\n if (maxJitter < stats.audioTrackSummary.maxJitter) {\n maxJitter = stats.audioTrackSummary.maxJitter;\n }\n return maxJitter;\n }\n\n private buildMaxPacketLoss(maxPacketLoss: number, stats: CallStatsReportSummary): number {\n if (maxPacketLoss < stats.videoTrackSummary.maxPacketLoss) {\n maxPacketLoss = stats.videoTrackSummary.maxPacketLoss;\n }\n\n if (maxPacketLoss < stats.audioTrackSummary.maxPacketLoss) {\n maxPacketLoss = stats.audioTrackSummary.maxPacketLoss;\n }\n return maxPacketLoss;\n }\n\n private countConcealedAudio(summaryCounter: CallStatsReportSummaryCounter, stats: CallStatsReportSummary): void {\n summaryCounter.concealedAudio += stats.audioTrackSummary.concealedAudio;\n summaryCounter.totalAudio += stats.audioTrackSummary.totalAudio;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,19 +0,0 @@
1
- import { MediaTrackStats } from "./media/mediaTrackStats.ts";
2
- import { TrackSummary } from "./callStatsReportSummary.ts";
3
- export declare class TrackStatsBuilder {
4
- static buildFramerateResolution(trackStats: MediaTrackStats, now: any): void;
5
- static calculateSimulcastFramerate(trackStats: MediaTrackStats, now: any, before: any, layer: number): void;
6
- static buildCodec(report: RTCStatsReport | undefined, trackStats: MediaTrackStats, now: any): void;
7
- static buildBitrateReceived(trackStats: MediaTrackStats, now: any, before: any): void;
8
- static buildBitrateSend(trackStats: MediaTrackStats, now: any, before: any): void;
9
- static buildPacketsLost(trackStats: MediaTrackStats, now: any, before: any): void;
10
- private static calculateBitrate;
11
- static setTrackStatsState(trackStats: MediaTrackStats, transceiver: RTCRtpTransceiver | undefined): void;
12
- static buildTrackSummary(trackStatsList: MediaTrackStats[]): {
13
- audioTrackSummary: TrackSummary;
14
- videoTrackSummary: TrackSummary;
15
- };
16
- static buildJitter(trackStats: MediaTrackStats, statsReport: any): void;
17
- static buildAudioConcealment(trackStats: MediaTrackStats, statsReport: any): void;
18
- }
19
- //# sourceMappingURL=trackStatsBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trackStatsBuilder.d.ts","sourceRoot":"","sources":["../../../src/webrtc/stats/trackStatsBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,qBAAa,iBAAiB;WACZ,wBAAwB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;WAarE,2BAA2B,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;WAuBpG,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;WAe3F,oBAAoB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;WAY9E,gBAAgB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;WAO1E,gBAAgB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAsBxF,OAAO,CAAC,MAAM,CAAC,gBAAgB;WAoBjB,kBAAkB,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI;WAqBjG,iBAAiB,CAAC,cAAc,EAAE,eAAe,EAAE,GAAG;QAChE,iBAAiB,EAAE,YAAY,CAAC;QAChC,iBAAiB,EAAE,YAAY,CAAC;KACnC;WA0Ca,WAAW,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,GAAG,IAAI;WAchE,qBAAqB,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,GAAG,IAAI;CAS3F"}
@@ -1,168 +0,0 @@
1
- import { ValueFormatter } from "./valueFormatter.js";
2
- export class TrackStatsBuilder {
3
- static buildFramerateResolution(trackStats, now) {
4
- var resolution = {
5
- height: now.frameHeight,
6
- width: now.frameWidth
7
- };
8
- var frameRate = now.framesPerSecond;
9
- if (resolution.height && resolution.width) {
10
- trackStats.setResolution(resolution);
11
- }
12
- trackStats.setFramerate(Math.round(frameRate || 0));
13
- }
14
- static calculateSimulcastFramerate(trackStats, now, before, layer) {
15
- var frameRate = trackStats.getFramerate();
16
- if (!frameRate) {
17
- if (before) {
18
- var timeMs = now.timestamp - before.timestamp;
19
- if (timeMs > 0 && now.framesSent) {
20
- var numberOfFramesSinceBefore = now.framesSent - before.framesSent;
21
- frameRate = numberOfFramesSinceBefore / timeMs * 1000;
22
- }
23
- }
24
- if (!frameRate) {
25
- return;
26
- }
27
- }
28
-
29
- // Reset frame rate to 0 when video is suspended as a result of endpoint falling out of last-n.
30
- frameRate = layer ? Math.round(frameRate / layer) : 0;
31
- trackStats.setFramerate(frameRate);
32
- }
33
- static buildCodec(report, trackStats, now) {
34
- var codec = report === null || report === void 0 ? void 0 : report.get(now.codecId);
35
- if (codec) {
36
- /**
37
- * The mime type has the following form: video/VP8 or audio/ISAC,
38
- * so we what to keep just the type after the '/', audio and video
39
- * keys will be added on the processing side.
40
- */
41
- var codecShortType = codec.mimeType.split("/")[1];
42
- if (codecShortType) trackStats.setCodec(codecShortType);
43
- }
44
- }
45
- static buildBitrateReceived(trackStats, now, before) {
46
- trackStats.setBitrate({
47
- download: TrackStatsBuilder.calculateBitrate(now.bytesReceived, before.bytesReceived, now.timestamp, before.timestamp),
48
- upload: 0
49
- });
50
- }
51
- static buildBitrateSend(trackStats, now, before) {
52
- trackStats.setBitrate({
53
- download: 0,
54
- upload: this.calculateBitrate(now.bytesSent, before.bytesSent, now.timestamp, before.timestamp)
55
- });
56
- }
57
- static buildPacketsLost(trackStats, now, before) {
58
- var key = now.type === "outbound-rtp" ? "packetsSent" : "packetsReceived";
59
- var packetsNow = now[key];
60
- if (!packetsNow || packetsNow < 0) {
61
- packetsNow = 0;
62
- }
63
- var packetsBefore = ValueFormatter.getNonNegativeValue(before[key]);
64
- var packetsDiff = Math.max(0, packetsNow - packetsBefore);
65
- var packetsLostNow = ValueFormatter.getNonNegativeValue(now.packetsLost);
66
- var packetsLostBefore = ValueFormatter.getNonNegativeValue(before.packetsLost);
67
- var packetsLostDiff = Math.max(0, packetsLostNow - packetsLostBefore);
68
- trackStats.setLoss({
69
- packetsTotal: packetsDiff + packetsLostDiff,
70
- packetsLost: packetsLostDiff,
71
- isDownloadStream: now.type !== "outbound-rtp"
72
- });
73
- }
74
- static calculateBitrate(bytesNowAny, bytesBeforeAny, nowTimestamp, beforeTimestamp) {
75
- var bytesNow = ValueFormatter.getNonNegativeValue(bytesNowAny);
76
- var bytesBefore = ValueFormatter.getNonNegativeValue(bytesBeforeAny);
77
- var bytesProcessed = Math.max(0, bytesNow - bytesBefore);
78
- var timeMs = nowTimestamp - beforeTimestamp;
79
- var bitrateKbps = 0;
80
- if (timeMs > 0) {
81
- bitrateKbps = Math.round(bytesProcessed * 8 / timeMs);
82
- }
83
- return bitrateKbps;
84
- }
85
- static setTrackStatsState(trackStats, transceiver) {
86
- var _transceiver$sender;
87
- if (transceiver === undefined) {
88
- trackStats.alive = false;
89
- return;
90
- }
91
- var track = trackStats.getType() === "remote" ? transceiver.receiver.track : transceiver === null || transceiver === void 0 || (_transceiver$sender = transceiver.sender) === null || _transceiver$sender === void 0 ? void 0 : _transceiver$sender.track;
92
- if (track === undefined || track === null) {
93
- trackStats.alive = false;
94
- return;
95
- }
96
- if (track.readyState === "ended") {
97
- trackStats.alive = false;
98
- return;
99
- }
100
- trackStats.muted = track.muted;
101
- trackStats.enabled = track.enabled;
102
- trackStats.alive = true;
103
- }
104
- static buildTrackSummary(trackStatsList) {
105
- var videoTrackSummary = {
106
- count: 0,
107
- muted: 0,
108
- maxJitter: 0,
109
- maxPacketLoss: 0,
110
- concealedAudio: 0,
111
- totalAudio: 0
112
- };
113
- var audioTrackSummary = {
114
- count: 0,
115
- muted: 0,
116
- maxJitter: 0,
117
- maxPacketLoss: 0,
118
- concealedAudio: 0,
119
- totalAudio: 0
120
- };
121
- var remoteTrackList = trackStatsList.filter(t => t.getType() === "remote");
122
- var audioTrackList = remoteTrackList.filter(t => t.kind === "audio");
123
- remoteTrackList.forEach(stats => {
124
- var trackSummary = stats.kind === "video" ? videoTrackSummary : audioTrackSummary;
125
- trackSummary.count++;
126
- if (stats.alive && stats.muted) {
127
- trackSummary.muted++;
128
- }
129
- if (trackSummary.maxJitter < stats.getJitter()) {
130
- trackSummary.maxJitter = stats.getJitter();
131
- }
132
- if (trackSummary.maxPacketLoss < stats.getLoss().packetsLost) {
133
- trackSummary.maxPacketLoss = stats.getLoss().packetsLost;
134
- }
135
- if (audioTrackList.length > 0) {
136
- var _stats$getAudioConcea, _stats$getAudioConcea2;
137
- trackSummary.concealedAudio += (_stats$getAudioConcea = stats.getAudioConcealment()) === null || _stats$getAudioConcea === void 0 ? void 0 : _stats$getAudioConcea.concealedAudio;
138
- trackSummary.totalAudio += (_stats$getAudioConcea2 = stats.getAudioConcealment()) === null || _stats$getAudioConcea2 === void 0 ? void 0 : _stats$getAudioConcea2.totalAudioDuration;
139
- }
140
- });
141
- return {
142
- audioTrackSummary,
143
- videoTrackSummary
144
- };
145
- }
146
- static buildJitter(trackStats, statsReport) {
147
- if (statsReport.type !== "inbound-rtp") {
148
- return;
149
- }
150
- var jitterStr = statsReport === null || statsReport === void 0 ? void 0 : statsReport.jitter;
151
- if (jitterStr !== undefined) {
152
- var jitter = ValueFormatter.getNonNegativeValue(jitterStr);
153
- trackStats.setJitter(Math.round(jitter * 1000));
154
- } else {
155
- trackStats.setJitter(-1);
156
- }
157
- }
158
- static buildAudioConcealment(trackStats, statsReport) {
159
- if (statsReport.type !== "inbound-rtp") {
160
- return;
161
- }
162
- var msPerSample = 1000 * (statsReport === null || statsReport === void 0 ? void 0 : statsReport.totalSamplesDuration) / (statsReport === null || statsReport === void 0 ? void 0 : statsReport.totalSamplesReceived);
163
- var concealedAudioDuration = msPerSample * (statsReport === null || statsReport === void 0 ? void 0 : statsReport.concealedSamples);
164
- var totalAudioDuration = 1000 * (statsReport === null || statsReport === void 0 ? void 0 : statsReport.totalSamplesDuration);
165
- trackStats.setAudioConcealment(concealedAudioDuration, totalAudioDuration);
166
- }
167
- }
168
- //# sourceMappingURL=trackStatsBuilder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trackStatsBuilder.js","names":["ValueFormatter","TrackStatsBuilder","buildFramerateResolution","trackStats","now","resolution","height","frameHeight","width","frameWidth","frameRate","framesPerSecond","setResolution","setFramerate","Math","round","calculateSimulcastFramerate","before","layer","getFramerate","timeMs","timestamp","framesSent","numberOfFramesSinceBefore","buildCodec","report","codec","get","codecId","codecShortType","mimeType","split","setCodec","buildBitrateReceived","setBitrate","download","calculateBitrate","bytesReceived","upload","buildBitrateSend","bytesSent","buildPacketsLost","key","type","packetsNow","packetsBefore","getNonNegativeValue","packetsDiff","max","packetsLostNow","packetsLost","packetsLostBefore","packetsLostDiff","setLoss","packetsTotal","isDownloadStream","bytesNowAny","bytesBeforeAny","nowTimestamp","beforeTimestamp","bytesNow","bytesBefore","bytesProcessed","bitrateKbps","setTrackStatsState","transceiver","_transceiver$sender","undefined","alive","track","getType","receiver","sender","readyState","muted","enabled","buildTrackSummary","trackStatsList","videoTrackSummary","count","maxJitter","maxPacketLoss","concealedAudio","totalAudio","audioTrackSummary","remoteTrackList","filter","t","audioTrackList","kind","forEach","stats","trackSummary","getJitter","getLoss","length","_stats$getAudioConcea","_stats$getAudioConcea2","getAudioConcealment","totalAudioDuration","buildJitter","statsReport","jitterStr","jitter","setJitter","buildAudioConcealment","msPerSample","totalSamplesDuration","totalSamplesReceived","concealedAudioDuration","concealedSamples","setAudioConcealment"],"sources":["../../../src/webrtc/stats/trackStatsBuilder.ts"],"sourcesContent":["import { MediaTrackStats } from \"./media/mediaTrackStats.ts\";\nimport { ValueFormatter } from \"./valueFormatter.ts\";\nimport { TrackSummary } from \"./callStatsReportSummary.ts\";\n\nexport class TrackStatsBuilder {\n public static buildFramerateResolution(trackStats: MediaTrackStats, now: any): void {\n const resolution = {\n height: now.frameHeight,\n width: now.frameWidth,\n };\n const frameRate = now.framesPerSecond;\n\n if (resolution.height && resolution.width) {\n trackStats.setResolution(resolution);\n }\n trackStats.setFramerate(Math.round(frameRate || 0));\n }\n\n public static calculateSimulcastFramerate(trackStats: MediaTrackStats, now: any, before: any, layer: number): void {\n let frameRate = trackStats.getFramerate();\n if (!frameRate) {\n if (before) {\n const timeMs = now.timestamp - before.timestamp;\n\n if (timeMs > 0 && now.framesSent) {\n const numberOfFramesSinceBefore = now.framesSent - before.framesSent;\n\n frameRate = (numberOfFramesSinceBefore / timeMs) * 1000;\n }\n }\n\n if (!frameRate) {\n return;\n }\n }\n\n // Reset frame rate to 0 when video is suspended as a result of endpoint falling out of last-n.\n frameRate = layer ? Math.round(frameRate / layer) : 0;\n trackStats.setFramerate(frameRate);\n }\n\n public static buildCodec(report: RTCStatsReport | undefined, trackStats: MediaTrackStats, now: any): void {\n const codec = report?.get(now.codecId);\n\n if (codec) {\n /**\n * The mime type has the following form: video/VP8 or audio/ISAC,\n * so we what to keep just the type after the '/', audio and video\n * keys will be added on the processing side.\n */\n const codecShortType = codec.mimeType.split(\"/\")[1];\n\n if (codecShortType) trackStats.setCodec(codecShortType);\n }\n }\n\n public static buildBitrateReceived(trackStats: MediaTrackStats, now: any, before: any): void {\n trackStats.setBitrate({\n download: TrackStatsBuilder.calculateBitrate(\n now.bytesReceived,\n before.bytesReceived,\n now.timestamp,\n before.timestamp,\n ),\n upload: 0,\n });\n }\n\n public static buildBitrateSend(trackStats: MediaTrackStats, now: any, before: any): void {\n trackStats.setBitrate({\n download: 0,\n upload: this.calculateBitrate(now.bytesSent, before.bytesSent, now.timestamp, before.timestamp),\n });\n }\n\n public static buildPacketsLost(trackStats: MediaTrackStats, now: any, before: any): void {\n const key = now.type === \"outbound-rtp\" ? \"packetsSent\" : \"packetsReceived\";\n\n let packetsNow = now[key];\n if (!packetsNow || packetsNow < 0) {\n packetsNow = 0;\n }\n\n const packetsBefore = ValueFormatter.getNonNegativeValue(before[key]);\n const packetsDiff = Math.max(0, packetsNow - packetsBefore);\n\n const packetsLostNow = ValueFormatter.getNonNegativeValue(now.packetsLost);\n const packetsLostBefore = ValueFormatter.getNonNegativeValue(before.packetsLost);\n const packetsLostDiff = Math.max(0, packetsLostNow - packetsLostBefore);\n\n trackStats.setLoss({\n packetsTotal: packetsDiff + packetsLostDiff,\n packetsLost: packetsLostDiff,\n isDownloadStream: now.type !== \"outbound-rtp\",\n });\n }\n\n private static calculateBitrate(\n bytesNowAny: any,\n bytesBeforeAny: any,\n nowTimestamp: number,\n beforeTimestamp: number,\n ): number {\n const bytesNow = ValueFormatter.getNonNegativeValue(bytesNowAny);\n const bytesBefore = ValueFormatter.getNonNegativeValue(bytesBeforeAny);\n const bytesProcessed = Math.max(0, bytesNow - bytesBefore);\n\n const timeMs = nowTimestamp - beforeTimestamp;\n let bitrateKbps = 0;\n\n if (timeMs > 0) {\n bitrateKbps = Math.round((bytesProcessed * 8) / timeMs);\n }\n\n return bitrateKbps;\n }\n\n public static setTrackStatsState(trackStats: MediaTrackStats, transceiver: RTCRtpTransceiver | undefined): void {\n if (transceiver === undefined) {\n trackStats.alive = false;\n return;\n }\n\n const track = trackStats.getType() === \"remote\" ? transceiver.receiver.track : transceiver?.sender?.track;\n if (track === undefined || track === null) {\n trackStats.alive = false;\n return;\n }\n\n if (track.readyState === \"ended\") {\n trackStats.alive = false;\n return;\n }\n trackStats.muted = track.muted;\n trackStats.enabled = track.enabled;\n trackStats.alive = true;\n }\n\n public static buildTrackSummary(trackStatsList: MediaTrackStats[]): {\n audioTrackSummary: TrackSummary;\n videoTrackSummary: TrackSummary;\n } {\n const videoTrackSummary: TrackSummary = {\n count: 0,\n muted: 0,\n maxJitter: 0,\n maxPacketLoss: 0,\n concealedAudio: 0,\n totalAudio: 0,\n };\n const audioTrackSummary: TrackSummary = {\n count: 0,\n muted: 0,\n maxJitter: 0,\n maxPacketLoss: 0,\n concealedAudio: 0,\n totalAudio: 0,\n };\n\n const remoteTrackList = trackStatsList.filter((t) => t.getType() === \"remote\");\n const audioTrackList = remoteTrackList.filter((t) => t.kind === \"audio\");\n\n remoteTrackList.forEach((stats) => {\n const trackSummary = stats.kind === \"video\" ? videoTrackSummary : audioTrackSummary;\n trackSummary.count++;\n if (stats.alive && stats.muted) {\n trackSummary.muted++;\n }\n if (trackSummary.maxJitter < stats.getJitter()) {\n trackSummary.maxJitter = stats.getJitter();\n }\n if (trackSummary.maxPacketLoss < stats.getLoss().packetsLost) {\n trackSummary.maxPacketLoss = stats.getLoss().packetsLost;\n }\n if (audioTrackList.length > 0) {\n trackSummary.concealedAudio += stats.getAudioConcealment()?.concealedAudio;\n trackSummary.totalAudio += stats.getAudioConcealment()?.totalAudioDuration;\n }\n });\n\n return { audioTrackSummary, videoTrackSummary };\n }\n\n public static buildJitter(trackStats: MediaTrackStats, statsReport: any): void {\n if (statsReport.type !== \"inbound-rtp\") {\n return;\n }\n\n const jitterStr = statsReport?.jitter;\n if (jitterStr !== undefined) {\n const jitter = ValueFormatter.getNonNegativeValue(jitterStr);\n trackStats.setJitter(Math.round(jitter * 1000));\n } else {\n trackStats.setJitter(-1);\n }\n }\n\n public static buildAudioConcealment(trackStats: MediaTrackStats, statsReport: any): void {\n if (statsReport.type !== \"inbound-rtp\") {\n return;\n }\n const msPerSample = (1000 * statsReport?.totalSamplesDuration) / statsReport?.totalSamplesReceived;\n const concealedAudioDuration = msPerSample * statsReport?.concealedSamples;\n const totalAudioDuration = 1000 * statsReport?.totalSamplesDuration;\n trackStats.setAudioConcealment(concealedAudioDuration, totalAudioDuration);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +0,0 @@
1
- export interface TransportStats {
2
- ip: string;
3
- type: string;
4
- localIp: string;
5
- isFocus: boolean;
6
- localCandidateType: string;
7
- remoteCandidateType: string;
8
- networkType: string;
9
- rtt: number;
10
- }
11
- //# sourceMappingURL=transportStats.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transportStats.d.ts","sourceRoot":"","sources":["../../../src/webrtc/stats/transportStats.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACf"}
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"transportStats.js","names":[],"sources":["../../../src/webrtc/stats/transportStats.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 interface TransportStats {\n ip: string;\n type: string;\n localIp: string;\n isFocus: boolean;\n localCandidateType: string;\n remoteCandidateType: string;\n networkType: string;\n rtt: number;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- import { TransportStats } from "./transportStats.ts";
2
- export declare class TransportStatsBuilder {
3
- static buildReport(report: RTCStatsReport | undefined, now: RTCIceCandidatePairStats, conferenceStatsTransport: TransportStats[], isFocus: boolean): TransportStats[];
4
- }
5
- //# sourceMappingURL=transportStatsBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transportStatsBuilder.d.ts","sourceRoot":"","sources":["../../../src/webrtc/stats/transportStatsBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,qBAAqB;WAChB,WAAW,CACrB,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,wBAAwB,EAC7B,wBAAwB,EAAE,cAAc,EAAE,EAC1C,OAAO,EAAE,OAAO,GACjB,cAAc,EAAE;CAuCtB"}
@@ -1,34 +0,0 @@
1
- export class TransportStatsBuilder {
2
- static buildReport(report, now, conferenceStatsTransport, isFocus) {
3
- var localUsedCandidate = report === null || report === void 0 ? void 0 : report.get(now.localCandidateId);
4
- var remoteUsedCandidate = report === null || report === void 0 ? void 0 : report.get(now.remoteCandidateId);
5
-
6
- // RTCIceCandidateStats
7
- // https://w3c.github.io/webrtc-stats/#icecandidate-dict*
8
- if (remoteUsedCandidate && localUsedCandidate) {
9
- var remoteIpAddress = remoteUsedCandidate.ip !== undefined ? remoteUsedCandidate.ip : remoteUsedCandidate.address;
10
- var remotePort = remoteUsedCandidate.port;
11
- var ip = "".concat(remoteIpAddress, ":").concat(remotePort);
12
- var localIpAddress = localUsedCandidate.ip !== undefined ? localUsedCandidate.ip : localUsedCandidate.address;
13
- var localPort = localUsedCandidate.port;
14
- var localIp = "".concat(localIpAddress, ":").concat(localPort);
15
- var type = remoteUsedCandidate.protocol;
16
-
17
- // Save the address unless it has been saved already.
18
- if (!conferenceStatsTransport.some(t => t.ip === ip && t.type === type && t.localIp === localIp)) {
19
- conferenceStatsTransport.push({
20
- ip,
21
- type,
22
- localIp,
23
- isFocus,
24
- localCandidateType: localUsedCandidate.candidateType,
25
- remoteCandidateType: remoteUsedCandidate.candidateType,
26
- networkType: localUsedCandidate.networkType,
27
- rtt: now.currentRoundTripTime ? now.currentRoundTripTime * 1000 : NaN
28
- });
29
- }
30
- }
31
- return conferenceStatsTransport;
32
- }
33
- }
34
- //# sourceMappingURL=transportStatsBuilder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transportStatsBuilder.js","names":["TransportStatsBuilder","buildReport","report","now","conferenceStatsTransport","isFocus","localUsedCandidate","get","localCandidateId","remoteUsedCandidate","remoteCandidateId","remoteIpAddress","ip","undefined","address","remotePort","port","concat","localIpAddress","localPort","localIp","type","protocol","some","t","push","localCandidateType","candidateType","remoteCandidateType","networkType","rtt","currentRoundTripTime","NaN"],"sources":["../../../src/webrtc/stats/transportStatsBuilder.ts"],"sourcesContent":["import { TransportStats } from \"./transportStats.ts\";\n\nexport class TransportStatsBuilder {\n public static buildReport(\n report: RTCStatsReport | undefined,\n now: RTCIceCandidatePairStats,\n conferenceStatsTransport: TransportStats[],\n isFocus: boolean,\n ): TransportStats[] {\n const localUsedCandidate = report?.get(now.localCandidateId);\n const remoteUsedCandidate = report?.get(now.remoteCandidateId);\n\n // RTCIceCandidateStats\n // https://w3c.github.io/webrtc-stats/#icecandidate-dict*\n if (remoteUsedCandidate && localUsedCandidate) {\n const remoteIpAddress =\n remoteUsedCandidate.ip !== undefined ? remoteUsedCandidate.ip : remoteUsedCandidate.address;\n const remotePort = remoteUsedCandidate.port;\n const ip = `${remoteIpAddress}:${remotePort}`;\n\n const localIpAddress =\n localUsedCandidate.ip !== undefined ? localUsedCandidate.ip : localUsedCandidate.address;\n const localPort = localUsedCandidate.port;\n const localIp = `${localIpAddress}:${localPort}`;\n\n const type = remoteUsedCandidate.protocol;\n\n // Save the address unless it has been saved already.\n if (\n !conferenceStatsTransport.some(\n (t: TransportStats) => t.ip === ip && t.type === type && t.localIp === localIp,\n )\n ) {\n conferenceStatsTransport.push({\n ip,\n type,\n localIp,\n isFocus,\n localCandidateType: localUsedCandidate.candidateType,\n remoteCandidateType: remoteUsedCandidate.candidateType,\n networkType: localUsedCandidate.networkType,\n rtt: now.currentRoundTripTime ? now.currentRoundTripTime * 1000 : NaN,\n } as TransportStats);\n }\n }\n return conferenceStatsTransport;\n }\n}\n"],"mappings":"AAEA,OAAO,MAAMA,qBAAqB,CAAC;EAC/B,OAAcC,WAAWA,CACrBC,MAAkC,EAClCC,GAA6B,EAC7BC,wBAA0C,EAC1CC,OAAgB,EACA;IAChB,IAAMC,kBAAkB,GAAGJ,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEK,GAAG,CAACJ,GAAG,CAACK,gBAAgB,CAAC;IAC5D,IAAMC,mBAAmB,GAAGP,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEK,GAAG,CAACJ,GAAG,CAACO,iBAAiB,CAAC;;IAE9D;IACA;IACA,IAAID,mBAAmB,IAAIH,kBAAkB,EAAE;MAC3C,IAAMK,eAAe,GACjBF,mBAAmB,CAACG,EAAE,KAAKC,SAAS,GAAGJ,mBAAmB,CAACG,EAAE,GAAGH,mBAAmB,CAACK,OAAO;MAC/F,IAAMC,UAAU,GAAGN,mBAAmB,CAACO,IAAI;MAC3C,IAAMJ,EAAE,MAAAK,MAAA,CAAMN,eAAe,OAAAM,MAAA,CAAIF,UAAU,CAAE;MAE7C,IAAMG,cAAc,GAChBZ,kBAAkB,CAACM,EAAE,KAAKC,SAAS,GAAGP,kBAAkB,CAACM,EAAE,GAAGN,kBAAkB,CAACQ,OAAO;MAC5F,IAAMK,SAAS,GAAGb,kBAAkB,CAACU,IAAI;MACzC,IAAMI,OAAO,MAAAH,MAAA,CAAMC,cAAc,OAAAD,MAAA,CAAIE,SAAS,CAAE;MAEhD,IAAME,IAAI,GAAGZ,mBAAmB,CAACa,QAAQ;;MAEzC;MACA,IACI,CAAClB,wBAAwB,CAACmB,IAAI,CACzBC,CAAiB,IAAKA,CAAC,CAACZ,EAAE,KAAKA,EAAE,IAAIY,CAAC,CAACH,IAAI,KAAKA,IAAI,IAAIG,CAAC,CAACJ,OAAO,KAAKA,OAC3E,CAAC,EACH;QACEhB,wBAAwB,CAACqB,IAAI,CAAC;UAC1Bb,EAAE;UACFS,IAAI;UACJD,OAAO;UACPf,OAAO;UACPqB,kBAAkB,EAAEpB,kBAAkB,CAACqB,aAAa;UACpDC,mBAAmB,EAAEnB,mBAAmB,CAACkB,aAAa;UACtDE,WAAW,EAAEvB,kBAAkB,CAACuB,WAAW;UAC3CC,GAAG,EAAE3B,GAAG,CAAC4B,oBAAoB,GAAG5B,GAAG,CAAC4B,oBAAoB,GAAG,IAAI,GAAGC;QACtE,CAAmB,CAAC;MACxB;IACJ;IACA,OAAO5B,wBAAwB;EACnC;AACJ","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- export declare class ValueFormatter {
2
- static getNonNegativeValue(imput: any): number;
3
- }
4
- //# sourceMappingURL=valueFormatter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../src/webrtc/stats/valueFormatter.ts"],"names":[],"mappings":"AAYA,qBAAa,cAAc;WACT,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;CAaxD"}
@@ -1,25 +0,0 @@
1
- /*
2
- Copyright 2023 The Matrix.org Foundation C.I.C.
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
6
- http://www.apache.org/licenses/LICENSE-2.0
7
- Unless required by applicable law or agreed to in writing, software
8
- distributed under the License is distributed on an "AS IS" BASIS,
9
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
- See the License for the specific language governing permissions and
11
- limitations under the License.
12
- */
13
- export class ValueFormatter {
14
- static getNonNegativeValue(imput) {
15
- var value = imput;
16
- if (typeof value !== "number") {
17
- value = Number(value);
18
- }
19
- if (isNaN(value)) {
20
- return 0;
21
- }
22
- return Math.max(0, value);
23
- }
24
- }
25
- //# sourceMappingURL=valueFormatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"valueFormatter.js","names":["ValueFormatter","getNonNegativeValue","imput","value","Number","isNaN","Math","max"],"sources":["../../../src/webrtc/stats/valueFormatter.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\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 http://www.apache.org/licenses/LICENSE-2.0\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*/\nexport class ValueFormatter {\n public static getNonNegativeValue(imput: any): number {\n let value = imput;\n\n if (typeof value !== \"number\") {\n value = Number(value);\n }\n\n if (isNaN(value)) {\n return 0;\n }\n\n return Math.max(0, value);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,cAAc,CAAC;EACxB,OAAcC,mBAAmBA,CAACC,KAAU,EAAU;IAClD,IAAIC,KAAK,GAAGD,KAAK;IAEjB,IAAI,OAAOC,KAAK,KAAK,QAAQ,EAAE;MAC3BA,KAAK,GAAGC,MAAM,CAACD,KAAK,CAAC;IACzB;IAEA,IAAIE,KAAK,CAACF,KAAK,CAAC,EAAE;MACd,OAAO,CAAC;IACZ;IAEA,OAAOG,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,KAAK,CAAC;EAC7B;AACJ","ignoreList":[]}
@@ -1,247 +0,0 @@
1
- /*
2
- Copyright 2023 The Matrix.org Foundation C.I.C.
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- import { EitherAnd } from "matrix-events-sdk/lib/types";
18
-
19
- import { MatrixEvent } from "../matrix.ts";
20
- import { deepCompare } from "../utils.ts";
21
- import { Focus } from "./focus.ts";
22
- import { isLivekitFocusActive } from "./LivekitFocus.ts";
23
-
24
- type CallScope = "m.room" | "m.user";
25
- // Represents an entry in the memberships section of an m.call.member event as it is on the wire
26
-
27
- // There are two different data interfaces. One for the Legacy types and one compliant with MSC4143
28
-
29
- // MSC4143 (MatrixRTC) session membership data
30
-
31
- export type SessionMembershipData = {
32
- application: string;
33
- call_id: string;
34
- device_id: string;
35
-
36
- focus_active: Focus;
37
- foci_preferred: Focus[];
38
- created_ts?: number;
39
-
40
- // Application specific data
41
- scope?: CallScope;
42
- };
43
-
44
- export const isSessionMembershipData = (data: CallMembershipData): data is SessionMembershipData =>
45
- "focus_active" in data;
46
-
47
- const checkSessionsMembershipData = (data: any, errors: string[]): data is SessionMembershipData => {
48
- const prefix = "Malformed session membership event: ";
49
- if (typeof data.device_id !== "string") errors.push(prefix + "device_id must be string");
50
- if (typeof data.call_id !== "string") errors.push(prefix + "call_id must be string");
51
- if (typeof data.application !== "string") errors.push(prefix + "application must be a string");
52
- if (typeof data.focus_active?.type !== "string") errors.push(prefix + "focus_active.type must be a string");
53
- if (!Array.isArray(data.foci_preferred)) errors.push(prefix + "foci_preferred must be an array");
54
- // optional parameters
55
- if (data.created_ts && typeof data.created_ts !== "number") errors.push(prefix + "created_ts must be number");
56
-
57
- // application specific data (we first need to check if they exist)
58
- if (data.scope && typeof data.scope !== "string") errors.push(prefix + "scope must be string");
59
- return errors.length === 0;
60
- };
61
-
62
- // Legacy session membership data
63
-
64
- export type CallMembershipDataLegacy = {
65
- application: string;
66
- call_id: string;
67
- scope: CallScope;
68
- device_id: string;
69
- membershipID: string;
70
- created_ts?: number;
71
- foci_active?: Focus[];
72
- } & EitherAnd<{ expires: number }, { expires_ts: number }>;
73
-
74
- export const isLegacyCallMembershipData = (data: CallMembershipData): data is CallMembershipDataLegacy =>
75
- "membershipID" in data;
76
-
77
- const checkCallMembershipDataLegacy = (data: any, errors: string[]): data is CallMembershipDataLegacy => {
78
- const prefix = "Malformed legacy rtc membership event: ";
79
- if (!("expires" in data || "expires_ts" in data)) {
80
- errors.push(prefix + "expires_ts or expires must be present");
81
- }
82
- if ("expires" in data) {
83
- if (typeof data.expires !== "number") {
84
- errors.push(prefix + "expires must be numeric");
85
- }
86
- }
87
- if ("expires_ts" in data) {
88
- if (typeof data.expires_ts !== "number") {
89
- errors.push(prefix + "expires_ts must be numeric");
90
- }
91
- }
92
-
93
- if (typeof data.device_id !== "string") errors.push(prefix + "device_id must be string");
94
- if (typeof data.call_id !== "string") errors.push(prefix + "call_id must be string");
95
- if (typeof data.application !== "string") errors.push(prefix + "application must be a string");
96
- if (typeof data.membershipID !== "string") errors.push(prefix + "membershipID must be a string");
97
- // optional elements
98
- if (data.created_ts && typeof data.created_ts !== "number") errors.push(prefix + "created_ts must be number");
99
- // application specific data (we first need to check if they exist)
100
- if (data.scope && typeof data.scope !== "string") errors.push(prefix + "scope must be string");
101
- return errors.length === 0;
102
- };
103
-
104
- export type CallMembershipData = CallMembershipDataLegacy | SessionMembershipData;
105
-
106
- export class CallMembership {
107
- public static equal(a: CallMembership, b: CallMembership): boolean {
108
- return deepCompare(a.membershipData, b.membershipData);
109
- }
110
- private membershipData: CallMembershipData;
111
-
112
- public constructor(
113
- private parentEvent: MatrixEvent,
114
- data: any,
115
- ) {
116
- const sessionErrors: string[] = [];
117
- const legacyErrors: string[] = [];
118
- if (!checkSessionsMembershipData(data, sessionErrors) && !checkCallMembershipDataLegacy(data, legacyErrors)) {
119
- throw Error(
120
- `unknown CallMembership data. Does not match legacy call.member (${legacyErrors.join(" & ")}) events nor MSC4143 (${sessionErrors.join(" & ")})`,
121
- );
122
- } else {
123
- this.membershipData = data;
124
- }
125
- }
126
-
127
- public get sender(): string | undefined {
128
- return this.parentEvent.getSender();
129
- }
130
-
131
- public get eventId(): string | undefined {
132
- return this.parentEvent.getId();
133
- }
134
-
135
- public get callId(): string {
136
- return this.membershipData.call_id;
137
- }
138
-
139
- public get deviceId(): string {
140
- return this.membershipData.device_id;
141
- }
142
-
143
- public get application(): string | undefined {
144
- return this.membershipData.application;
145
- }
146
-
147
- public get scope(): CallScope | undefined {
148
- return this.membershipData.scope;
149
- }
150
-
151
- public get membershipID(): string {
152
- if (isLegacyCallMembershipData(this.membershipData)) return this.membershipData.membershipID;
153
- // the createdTs behaves equivalent to the membershipID.
154
- // we only need the field for the legacy member envents where we needed to update them
155
- // synapse ignores sending state events if they have the same content.
156
- else return this.createdTs().toString();
157
- }
158
-
159
- public createdTs(): number {
160
- return this.membershipData.created_ts ?? this.parentEvent.getTs();
161
- }
162
-
163
- /**
164
- * Gets the absolute expiry time of the membership if applicable to this membership type.
165
- * @returns The absolute expiry time of the membership as a unix timestamp in milliseconds or undefined if not applicable
166
- */
167
- public getAbsoluteExpiry(): number | undefined {
168
- // if the membership is not a legacy membership, we assume it is MSC4143
169
- if (!isLegacyCallMembershipData(this.membershipData)) return undefined;
170
-
171
- if ("expires" in this.membershipData) {
172
- // we know createdTs exists since we already do the isLegacyCallMembershipData check
173
- return this.createdTs() + this.membershipData.expires;
174
- } else {
175
- // We know it exists because we checked for this in the constructor.
176
- return this.membershipData.expires_ts;
177
- }
178
- }
179
-
180
- /**
181
- * Gets the expiry time of the event, converted into the device's local time.
182
- * @deprecated This function has been observed returning bad data and is no longer used by MatrixRTC.
183
- * @returns The local expiry time of the membership as a unix timestamp in milliseconds or undefined if not applicable
184
- */
185
- public getLocalExpiry(): number | undefined {
186
- // if the membership is not a legacy membership, we assume it is MSC4143
187
- if (!isLegacyCallMembershipData(this.membershipData)) return undefined;
188
-
189
- if ("expires" in this.membershipData) {
190
- // we know createdTs exists since we already do the isLegacyCallMembershipData check
191
- const relativeCreationTime = this.parentEvent.getTs() - this.createdTs();
192
-
193
- const localCreationTs = this.parentEvent.localTimestamp - relativeCreationTime;
194
-
195
- return localCreationTs + this.membershipData.expires;
196
- } else {
197
- // With expires_ts we cannot convert to local time.
198
- // TODO: Check the server timestamp and compute a diff to local time.
199
- return this.membershipData.expires_ts;
200
- }
201
- }
202
-
203
- /**
204
- * @returns The number of milliseconds until the membership expires or undefined if applicable
205
- */
206
- public getMsUntilExpiry(): number | undefined {
207
- if (isLegacyCallMembershipData(this.membershipData)) {
208
- // Assume that local clock is sufficiently in sync with other clocks in the distributed system.
209
- // We used to try and adjust for the local clock being skewed, but there are cases where this is not accurate.
210
- // The current implementation allows for the local clock to be -infinity to +MatrixRTCSession.MEMBERSHIP_EXPIRY_TIME/2
211
- return this.getAbsoluteExpiry()! - Date.now();
212
- }
213
-
214
- // Assumed to be MSC4143
215
- return undefined;
216
- }
217
-
218
- /**
219
- * @returns true if the membership has expired, otherwise false
220
- */
221
- public isExpired(): boolean {
222
- if (isLegacyCallMembershipData(this.membershipData)) return this.getMsUntilExpiry()! <= 0;
223
-
224
- // MSC4143 events expire by being updated. So if the event exists, its not expired.
225
- return false;
226
- }
227
-
228
- public getPreferredFoci(): Focus[] {
229
- // To support both, the new and the old MatrixRTC memberships have two cases based
230
- // on the availablitiy of `foci_preferred`
231
- if (isLegacyCallMembershipData(this.membershipData)) return this.membershipData.foci_active ?? [];
232
-
233
- // MSC4143 style membership
234
- return this.membershipData.foci_preferred;
235
- }
236
-
237
- public getFocusSelection(): string | undefined {
238
- if (isLegacyCallMembershipData(this.membershipData)) {
239
- return "oldest_membership";
240
- } else {
241
- const focusActive = this.membershipData.focus_active;
242
- if (isLivekitFocusActive(focusActive)) {
243
- return focusActive.focus_selection;
244
- }
245
- }
246
- }
247
- }