@observertc/observer-js 1.0.1-c3edea3.0 → 1.0.1-ea70eab.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.
Files changed (140) hide show
  1. package/lib/ObservedCall.d.ts +43 -7
  2. package/lib/ObservedCall.d.ts.map +1 -1
  3. package/lib/ObservedCall.js +129 -13
  4. package/lib/ObservedCallEventMonitor.d.ts +104 -0
  5. package/lib/ObservedCallEventMonitor.d.ts.map +1 -0
  6. package/lib/ObservedCallEventMonitor.js +314 -0
  7. package/lib/ObservedCallSummary.d.ts +18 -0
  8. package/lib/ObservedCallSummary.d.ts.map +1 -0
  9. package/lib/ObservedClient.d.ts +70 -11
  10. package/lib/ObservedClient.d.ts.map +1 -1
  11. package/lib/ObservedClient.js +392 -72
  12. package/lib/ObservedClientEventMonitor.d.ts +89 -0
  13. package/lib/ObservedClientEventMonitor.d.ts.map +1 -0
  14. package/lib/ObservedClientEventMonitor.js +247 -0
  15. package/lib/ObservedClientSummary.d.ts +23 -0
  16. package/lib/ObservedClientSummary.d.ts.map +1 -0
  17. package/lib/ObservedClientSummary.js +2 -0
  18. package/lib/ObservedDataChannel.d.ts +6 -0
  19. package/lib/ObservedDataChannel.d.ts.map +1 -1
  20. package/lib/ObservedDataChannel.js +30 -0
  21. package/lib/ObservedIceCandidatePair.d.ts +6 -1
  22. package/lib/ObservedIceCandidatePair.d.ts.map +1 -1
  23. package/lib/ObservedIceCandidatePair.js +45 -1
  24. package/lib/ObservedIceTransport.d.ts +4 -0
  25. package/lib/ObservedIceTransport.d.ts.map +1 -1
  26. package/lib/ObservedIceTransport.js +28 -0
  27. package/lib/ObservedInboundTrack.d.ts +2 -0
  28. package/lib/ObservedInboundTrack.d.ts.map +1 -1
  29. package/lib/ObservedInboundTrack.js +2 -0
  30. package/lib/ObservedOutboundTrack.d.ts +2 -0
  31. package/lib/ObservedOutboundTrack.d.ts.map +1 -1
  32. package/lib/ObservedOutboundTrack.js +2 -0
  33. package/lib/ObservedPeerConnection.d.ts +29 -2
  34. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  35. package/lib/ObservedPeerConnection.js +181 -29
  36. package/lib/ObservedTURN.d.ts +31 -0
  37. package/lib/ObservedTURN.d.ts.map +1 -0
  38. package/lib/ObservedTURN.js +58 -0
  39. package/lib/ObservedTurnServer.d.ts +25 -0
  40. package/lib/ObservedTurnServer.d.ts.map +1 -0
  41. package/lib/ObservedTurnServer.js +59 -0
  42. package/lib/Observer.d.ts +43 -22
  43. package/lib/Observer.d.ts.map +1 -1
  44. package/lib/Observer.js +126 -40
  45. package/lib/ObserverEventMonitor.d.ts +130 -0
  46. package/lib/ObserverEventMonitor.d.ts.map +1 -0
  47. package/lib/ObserverEventMonitor.js +404 -0
  48. package/lib/ObserverSummary.d.ts +13 -0
  49. package/lib/ObserverSummary.d.ts.map +1 -0
  50. package/lib/ObserverSummary.js +2 -0
  51. package/lib/common/utils.d.ts +2 -1
  52. package/lib/common/utils.d.ts.map +1 -1
  53. package/lib/common/utils.js +11 -3
  54. package/lib/index.d.ts +6 -0
  55. package/lib/index.d.ts.map +1 -1
  56. package/lib/index.js +9 -1
  57. package/lib/schema/ClientEventTypes.d.ts +160 -0
  58. package/lib/schema/ClientEventTypes.d.ts.map +1 -0
  59. package/lib/schema/ClientEventTypes.js +38 -0
  60. package/lib/schema/{metaTypes.d.ts → ClientMetaTypes.d.ts} +2 -2
  61. package/lib/schema/ClientMetaTypes.d.ts.map +1 -0
  62. package/lib/schema/ClientMetaTypes.js +16 -0
  63. package/lib/schema/ClientSample.d.ts +1 -1
  64. package/lib/schema/ClientSample.d.ts.map +1 -1
  65. package/lib/updaters/CallUpdater.d.ts.map +1 -0
  66. package/lib/updaters/CallUpdater.js +2 -0
  67. package/lib/updaters/ObserverUpdater.d.ts +5 -0
  68. package/lib/updaters/ObserverUpdater.d.ts.map +1 -0
  69. package/lib/updaters/ObserverUpdater.js +2 -0
  70. package/lib/updaters/OnAllCallObserverUpdater.d.ts +15 -0
  71. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +1 -0
  72. package/lib/updaters/OnAllCallObserverUpdater.js +50 -0
  73. package/lib/updaters/OnAllClientCallUpdater.d.ts +15 -0
  74. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +1 -0
  75. package/lib/updaters/OnAllClientCallUpdater.js +53 -0
  76. package/lib/updaters/OnAnyCallObserverUpdater.d.ts +12 -0
  77. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +1 -0
  78. package/lib/updaters/OnAnyCallObserverUpdater.js +37 -0
  79. package/lib/updaters/OnAnyClientCallUpdater.d.ts +12 -0
  80. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +1 -0
  81. package/lib/updaters/OnAnyClientCallUpdater.js +36 -0
  82. package/lib/updaters/OnIntervalUpdater.d.ts +10 -0
  83. package/lib/updaters/OnIntervalUpdater.d.ts.map +1 -0
  84. package/lib/updaters/OnIntervalUpdater.js +17 -0
  85. package/lib/updaters/Updater.d.ts +6 -0
  86. package/lib/updaters/Updater.d.ts.map +1 -0
  87. package/lib/updaters/Updater.js +2 -0
  88. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +25 -0
  89. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +1 -0
  90. package/lib/utils/MediasoupRemoteTrackResolver.js +110 -0
  91. package/package.json +1 -1
  92. package/src/ObservedCall.ts +210 -16
  93. package/src/ObservedCallEventMonitor.ts +392 -0
  94. package/src/ObservedCallSummary.ts +22 -0
  95. package/src/ObservedClient.ts +490 -79
  96. package/src/ObservedClientEventMonitor.ts +301 -0
  97. package/src/ObservedClientSummary.ts +24 -0
  98. package/src/ObservedDataChannel.ts +32 -0
  99. package/src/ObservedIceCandidatePair.ts +44 -2
  100. package/src/ObservedIceTransport.ts +29 -0
  101. package/src/ObservedInboundTrack.ts +3 -0
  102. package/src/ObservedOutboundTrack.ts +3 -0
  103. package/src/ObservedPeerConnection.ts +210 -46
  104. package/src/ObservedTURN.ts +86 -0
  105. package/src/ObservedTurnServer.ts +72 -0
  106. package/src/Observer.ts +179 -64
  107. package/src/ObserverEventMonitor.ts +518 -0
  108. package/src/ObserverSummary.ts +15 -0
  109. package/src/common/utils.ts +12 -2
  110. package/src/index.ts +6 -0
  111. package/src/schema/ClientEventTypes.ts +176 -0
  112. package/src/schema/{metaTypes.ts → ClientMetaTypes.ts} +1 -1
  113. package/src/schema/ClientSample.ts +1 -1
  114. package/src/updaters/ObserverUpdater.ts +5 -0
  115. package/src/updaters/OnAllCallObserverUpdater.ts +59 -0
  116. package/src/updaters/OnAllClientCallUpdater.ts +61 -0
  117. package/src/updaters/OnAnyCallObserverUpdater.ts +41 -0
  118. package/src/updaters/OnAnyClientCallUpdater.ts +39 -0
  119. package/src/updaters/OnIntervalUpdater.ts +19 -0
  120. package/src/updaters/Updater.ts +5 -0
  121. package/src/utils/MediasoupRemoteTrackResolver.ts +155 -0
  122. package/tsconfig.json +1 -1
  123. package/lib/schema/eventTypes.d.ts +0 -33
  124. package/lib/schema/eventTypes.d.ts.map +0 -1
  125. package/lib/schema/eventTypes.js +0 -38
  126. package/lib/schema/metaTypes.d.ts.map +0 -1
  127. package/lib/schema/metaTypes.js +0 -16
  128. package/lib/utils/CallUpdater.d.ts.map +0 -1
  129. package/lib/utils/OnAllClientCallUpdater.d.ts +0 -16
  130. package/lib/utils/OnAllClientCallUpdater.d.ts.map +0 -1
  131. package/lib/utils/OnAllClientCallUpdater.js +0 -58
  132. package/lib/utils/onAnyClientCallUpdater.d.ts +0 -14
  133. package/lib/utils/onAnyClientCallUpdater.d.ts.map +0 -1
  134. package/lib/utils/onAnyClientCallUpdater.js +0 -51
  135. package/src/schema/eventTypes.ts +0 -36
  136. package/src/utils/OnAllClientCallUpdater.ts +0 -68
  137. package/src/utils/onAnyClientCallUpdater.ts +0 -59
  138. /package/lib/{utils/CallUpdater.js → ObservedCallSummary.js} +0 -0
  139. /package/lib/{utils → updaters}/CallUpdater.d.ts +0 -0
  140. /package/src/{utils → updaters}/CallUpdater.ts +0 -0
@@ -18,6 +18,7 @@ import { ObservedRemoteOutboundRtp } from './ObservedRemoteOutboundRtp';
18
18
  import { ObservedInboundTrack } from './ObservedInboundTrack';
19
19
  import { ObservedOutboundTrack } from './ObservedOutboundTrack';
20
20
  import { CalculatedScore } from './scores/CalculatedScore';
21
+ import { ObservedTurnServer } from './ObservedTurnServer';
21
22
  export type ObservedPeerConnectionEvents = {
22
23
  iceconnectionstatechange: [
23
24
  {
@@ -65,6 +66,22 @@ export type ObservedPeerConnectionEvents = {
65
66
  'removed-peer-connection-transport': [ObservedPeerConnectionTransport];
66
67
  'removed-remote-inbound-rtp': [ObservedRemoteInboundRtp];
67
68
  'removed-remote-outbound-rtp': [ObservedRemoteOutboundRtp];
69
+ 'updated-inbound-rtp': [ObservedInboundRtp];
70
+ 'updated-outbound-rtp': [ObservedOutboundRtp];
71
+ 'updated-inbound-track': [ObservedInboundTrack];
72
+ 'updated-outbound-track': [ObservedOutboundTrack];
73
+ 'updated-ice-candidate-pair': [ObservedIceCandidatePair];
74
+ 'updated-ice-transport': [ObservedIceTransport];
75
+ 'updated-peer-connection-transport': [ObservedPeerConnectionTransport];
76
+ 'updated-media-source': [ObservedMediaSource];
77
+ 'updated-media-playout': [ObservedMediaPlayout];
78
+ 'updated-data-channel': [ObservedDataChannel];
79
+ 'updated-ice-candidate': [ObservedIceCandidate];
80
+ 'updated-certificate': [ObservedCertificate];
81
+ 'updated-codec': [ObservedCodec];
82
+ 'updated-remote-inbound-rtp': [ObservedRemoteInboundRtp];
83
+ 'updated-remote-outbound-rtp': [ObservedRemoteOutboundRtp];
84
+ 'update': [];
68
85
  close: [];
69
86
  };
70
87
  export declare interface ObservedPeerConnection {
@@ -83,11 +100,15 @@ export declare class ObservedPeerConnection extends EventEmitter {
83
100
  openedAt?: number;
84
101
  closedAt?: number;
85
102
  updated: number;
103
+ availableIncomingBitrate: number;
104
+ availableOutgoingBitrate: number;
86
105
  totalInboundPacketsLost: number;
87
106
  totalInboundPacketsReceived: number;
88
107
  totalOutboundPacketsSent: number;
89
108
  totalDataChannelBytesSent: number;
90
109
  totalDataChannelBytesReceived: number;
110
+ totalDataChannelMessagesSent: number;
111
+ totalDataChannelMessagesReceived: number;
91
112
  totalSentAudioBytes: number;
92
113
  totalSentVideoBytes: number;
93
114
  totalSentAudioPackets: number;
@@ -101,6 +122,8 @@ export declare class ObservedPeerConnection extends EventEmitter {
101
122
  deltaOutboundPacketsSent: number;
102
123
  deltaDataChannelBytesSent: number;
103
124
  deltaDataChannelBytesReceived: number;
125
+ deltaDataChannelMessagesSent: number;
126
+ deltaDataChannelMessagesReceived: number;
104
127
  deltaInboundReceivedBytes: number;
105
128
  deltaOutboundSentBytes: number;
106
129
  deltaReceivedAudioBytes: number;
@@ -109,16 +132,19 @@ export declare class ObservedPeerConnection extends EventEmitter {
109
132
  deltaReceivedVideoPackets: number;
110
133
  deltaSentAudioBytes: number;
111
134
  deltaSentVideoBytes: number;
135
+ deltaTransportSentBytes: number;
136
+ deltaTransportReceivedBytes: number;
112
137
  receivingPacketsPerSecond: number;
113
138
  sendingPacketsPerSecond: number;
114
139
  sendingAudioBitrate: number;
115
140
  sendingVideoBitrate: number;
116
141
  receivingAudioBitrate: number;
117
142
  receivingVideoBitrate: number;
118
- avgRttInMs?: number;
119
- avgJitter?: number;
143
+ currentRttInMs?: number;
144
+ currentJitter?: number;
120
145
  usingTCP: boolean;
121
146
  usingTURN: boolean;
147
+ observedTurnServer?: ObservedTurnServer;
122
148
  readonly observedCertificates: Map<string, ObservedCertificate>;
123
149
  readonly observedCodecs: Map<string, ObservedCodec>;
124
150
  readonly observedDataChannels: Map<string, ObservedDataChannel>;
@@ -151,6 +177,7 @@ export declare class ObservedPeerConnection extends EventEmitter {
151
177
  get iceCandidatePairs(): ObservedIceCandidatePair[];
152
178
  get certificates(): ObservedCertificate[];
153
179
  get selectedIceCandidatePairs(): ObservedIceCandidatePair[];
180
+ get selectedIceCandiadtePairForTurn(): ObservedIceCandidatePair[];
154
181
  close(): void;
155
182
  accept(sample: PeerConnectionSample): void;
156
183
  private _checkVisited;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAiK,mBAAmB,EAAE,oBAAoB,EAA+E,MAAM,uBAAuB,CAAC;AAC9T,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,MAAM,MAAM,4BAA4B,GAAG;IAC1C,wBAAwB,EAAE;QACzB;YACC,KAAK,EAAE,MAAM,CAAC;SACd;KACD,CAAC;IACF,uBAAuB,EAAE;QACxB;YACC,KAAK,EAAE,MAAM,CAAC;SACd;KACD,CAAC;IACF,qBAAqB,EAAE;QACtB;YACC,KAAK,EAAE,MAAM,CAAC;SACd;KACD,CAAC;IACF,qBAAqB,EAAE,EAAE,CAAC;IAE1B,mBAAmB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC3C,aAAa,EAAE,CAAC,aAAa,CAAC,CAAC;IAC/B,oBAAoB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC5C,qBAAqB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC9C,0BAA0B,EAAE,CAAC,wBAAwB,CAAC,CAAC;IACvD,qBAAqB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC9C,mBAAmB,EAAE,CAAC,kBAAkB,CAAC,CAAC;IAC1C,qBAAqB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC9C,qBAAqB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC9C,oBAAoB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC5C,oBAAoB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC5C,sBAAsB,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAChD,iCAAiC,EAAE,CAAC,+BAA+B,CAAC,CAAC;IACrE,0BAA0B,EAAE,CAAC,wBAAwB,CAAC,CAAC;IACvD,2BAA2B,EAAE,CAAC,yBAAyB,CAAC,CAAC;IACzD,qBAAqB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC7C,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;IACjC,sBAAsB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC9C,uBAAuB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAChD,4BAA4B,EAAE,CAAC,wBAAwB,CAAC,CAAC;IACzD,uBAAuB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAChD,qBAAqB,EAAE,CAAC,kBAAkB,CAAC,CAAC;IAC5C,uBAAuB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAChD,uBAAuB,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAChD,sBAAsB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC9C,sBAAsB,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC9C,wBAAwB,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAClD,mCAAmC,EAAE,CAAC,+BAA+B,CAAC,CAAC;IACvE,4BAA4B,EAAE,CAAC,wBAAwB,CAAC,CAAC;IACzD,6BAA6B,EAAE,CAAC,yBAAyB,CAAC,CAAC;IAE3D,KAAK,EAAE,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,sBAAsB;IAC9C,EAAE,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAC9C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC1D,IAAI,CAAC;IACR,GAAG,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAC/C,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC1D,IAAI,CAAC;IACR,IAAI,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAChD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAC1D,IAAI,CAAC;IACR,IAAI,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChH;AAED,qBAAa,sBAAuB,SAAQ,YAAY;aA2EpB,gBAAgB,EAAE,MAAM;aAAkB,MAAM,EAAE,cAAc;IA1EnG,OAAO,CAAC,QAAQ,CAAQ;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,SAAgB,eAAe,EAAE,eAAe,CAG9C;IAEK,MAAM,UAAS;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,SAAc;IAErB,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAElC,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,qBAAqB,SAAK;IAC1B,qBAAqB,SAAK;IAC1B,yBAAyB,SAAK;IAC9B,yBAAyB,SAAK;IAC9B,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAE5B,uBAAuB,SAAK;IAC5B,2BAA2B,SAAK;IAChC,wBAAwB,SAAK;IAC7B,yBAAyB,SAAK;IAC9B,6BAA6B,SAAK;IAClC,yBAAyB,SAAK;IAC9B,sBAAsB,SAAK;IAE3B,uBAAuB,SAAK;IAC5B,uBAAuB,SAAK;IAC5B,yBAAyB,SAAK;IAC9B,yBAAyB,SAAK;IAC9B,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IAExB,yBAAyB,SAAK;IAC9B,uBAAuB,SAAK;IAC5B,mBAAmB,SAAK;IACxB,mBAAmB,SAAK;IACxB,qBAAqB,SAAK;IAC1B,qBAAqB,SAAK;IAE1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,QAAQ,UAAS;IACjB,SAAS,UAAS;IAEzB,SAAgB,oBAAoB,mCAA0C;IAC9E,SAAgB,cAAc,6BAAoC;IAClE,SAAgB,oBAAoB,mCAA0C;IAC9E,SAAgB,qBAAqB,oCAA2C;IAChF,SAAgB,yBAAyB,wCAA+C;IACxF,SAAgB,qBAAqB,oCAA2C;IAChF,SAAgB,mBAAmB,kCAAyC;IAC5E,SAAgB,qBAAqB,oCAA2C;IAChF,SAAgB,qBAAqB,oCAA2C;IAChF,SAAgB,oBAAoB,mCAA0C;IAC9E,SAAgB,oBAAoB,mCAA0C;IAC9E,SAAgB,sBAAsB,qCAA4C;IAClF,SAAgB,gCAAgC,+CAAsD;IACtG,SAAgB,yBAAyB,wCAA+C;IACxF,SAAgB,0BAA0B,yCAAgD;gBAEvD,gBAAgB,EAAE,MAAM,EAAkB,MAAM,EAAE,cAAc;IAKnG,IAAW,KAAK,uBAEf;IAED,IAAW,OAAO,YAMjB;IAED,IAAW,MAAM,oBAEhB;IAED,IAAW,WAAW,yBAErB;IAED,IAAW,kBAAkB,gCAE5B;IAED,IAAW,YAAY,0BAEtB;IAED,IAAW,iBAAiB,+BAE3B;IAED,IAAW,YAAY,0BAEtB;IAED,IAAW,aAAa,2BAEvB;IAED,IAAW,YAAY,0BAEtB;IAED,IAAW,wBAAwB,sCAElC;IAED,IAAW,aAAa,2BAEvB;IAED,IAAW,aAAa,2BAEvB;IAED,IAAW,iBAAiB,+BAE3B;IAED,IAAW,YAAY,0BAEtB;IAED,IAAW,yBAAyB,+BAGnC;IAEM,KAAK;IAuBL,MAAM,CAAC,MAAM,EAAE,oBAAoB;IA6K1C,OAAO,CAAC,aAAa;IA4FrB,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,4BAA4B;IAsBpC,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,yBAAyB;IAiCjC,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,uBAAuB;IA2B/B,OAAO,CAAC,uBAAuB;IA4BxB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB;IAgC5D,OAAO,CAAC,mCAAmC;IAsB3C,OAAO,CAAC,4BAA4B;IA4BpC,OAAO,CAAC,6BAA6B;CA2BrC"}
1
+ {"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ const ObservedRemoteInboundRtp_1 = require("./ObservedRemoteInboundRtp");
18
18
  const ObservedRemoteOutboundRtp_1 = require("./ObservedRemoteOutboundRtp");
19
19
  const ObservedInboundTrack_1 = require("./ObservedInboundTrack");
20
20
  const ObservedOutboundTrack_1 = require("./ObservedOutboundTrack");
21
+ const utils_1 = require("./common/utils");
21
22
  const logger = (0, logger_1.createLogger)('ObservedPeerConnection');
22
23
  class ObservedPeerConnection extends events_1.EventEmitter {
23
24
  peerConnectionId;
@@ -34,11 +35,15 @@ class ObservedPeerConnection extends events_1.EventEmitter {
34
35
  // timestamp of the PEER_CONNECTION_CLOSED event
35
36
  closedAt;
36
37
  updated = Date.now();
38
+ availableIncomingBitrate = 0;
39
+ availableOutgoingBitrate = 0;
37
40
  totalInboundPacketsLost = 0;
38
41
  totalInboundPacketsReceived = 0;
39
42
  totalOutboundPacketsSent = 0;
40
43
  totalDataChannelBytesSent = 0;
41
44
  totalDataChannelBytesReceived = 0;
45
+ totalDataChannelMessagesSent = 0;
46
+ totalDataChannelMessagesReceived = 0;
42
47
  totalSentAudioBytes = 0;
43
48
  totalSentVideoBytes = 0;
44
49
  totalSentAudioPackets = 0;
@@ -52,6 +57,8 @@ class ObservedPeerConnection extends events_1.EventEmitter {
52
57
  deltaOutboundPacketsSent = 0;
53
58
  deltaDataChannelBytesSent = 0;
54
59
  deltaDataChannelBytesReceived = 0;
60
+ deltaDataChannelMessagesSent = 0;
61
+ deltaDataChannelMessagesReceived = 0;
55
62
  deltaInboundReceivedBytes = 0;
56
63
  deltaOutboundSentBytes = 0;
57
64
  deltaReceivedAudioBytes = 0;
@@ -60,16 +67,19 @@ class ObservedPeerConnection extends events_1.EventEmitter {
60
67
  deltaReceivedVideoPackets = 0;
61
68
  deltaSentAudioBytes = 0;
62
69
  deltaSentVideoBytes = 0;
70
+ deltaTransportSentBytes = 0;
71
+ deltaTransportReceivedBytes = 0;
63
72
  receivingPacketsPerSecond = 0;
64
73
  sendingPacketsPerSecond = 0;
65
74
  sendingAudioBitrate = 0;
66
75
  sendingVideoBitrate = 0;
67
76
  receivingAudioBitrate = 0;
68
77
  receivingVideoBitrate = 0;
69
- avgRttInMs;
70
- avgJitter;
78
+ currentRttInMs;
79
+ currentJitter;
71
80
  usingTCP = false;
72
81
  usingTURN = false;
82
+ observedTurnServer;
73
83
  observedCertificates = new Map();
74
84
  observedCodecs = new Map();
75
85
  observedDataChannels = new Map();
@@ -142,6 +152,11 @@ class ObservedPeerConnection extends events_1.EventEmitter {
142
152
  return this.iceTransports.map((iceTransport) => iceTransport.getSelectedCandidatePair())
143
153
  .filter((pair) => pair !== undefined);
144
154
  }
155
+ get selectedIceCandiadtePairForTurn() {
156
+ return this.selectedIceCandidatePairs
157
+ .filter((pair) => pair.getLocalCandidate()?.candidateType === 'relay' &&
158
+ pair.getRemoteCandidate()?.url?.startsWith('turn:'));
159
+ }
145
160
  close() {
146
161
  if (this.closed)
147
162
  return;
@@ -161,12 +176,17 @@ class ObservedPeerConnection extends events_1.EventEmitter {
161
176
  this.observedPeerConnectionTransports.clear();
162
177
  this.observedRemoteInboundRtps.clear();
163
178
  this.observedRemoteOutboundRtps.clear();
179
+ this.client.call.observer.observedTURN.removePeerConnection(this);
180
+ if (!this.closedAt)
181
+ this.closedAt = Date.now();
164
182
  this.emit('close');
165
183
  }
166
184
  accept(sample) {
167
185
  if (this.closed)
168
186
  return;
169
187
  this._visited = true;
188
+ this.availableIncomingBitrate = 0;
189
+ this.availableOutgoingBitrate = 0;
170
190
  this.deltaInboundPacketsLost = 0;
171
191
  this.deltaInboundPacketsReceived = 0;
172
192
  this.deltaOutboundPacketsSent = 0;
@@ -180,6 +200,8 @@ class ObservedPeerConnection extends events_1.EventEmitter {
180
200
  this.deltaReceivedVideoPackets = 0;
181
201
  this.deltaSentAudioBytes = 0;
182
202
  this.deltaSentVideoBytes = 0;
203
+ this.deltaTransportReceivedBytes = 0;
204
+ this.deltaTransportSentBytes = 0;
183
205
  this.sendingAudioBitrate = 0;
184
206
  this.sendingVideoBitrate = 0;
185
207
  this.receivingAudioBitrate = 0;
@@ -187,6 +209,8 @@ class ObservedPeerConnection extends events_1.EventEmitter {
187
209
  const now = Date.now();
188
210
  const elapsedTimeInMs = now - this.updated;
189
211
  const elapsedTimeInSec = elapsedTimeInMs / 1000;
212
+ const rttMeasurementsInSec = [];
213
+ const jitterMeasurements = [];
190
214
  if (sample.certificates) {
191
215
  for (const certificate of sample.certificates) {
192
216
  this._updateCertificateStats(certificate);
@@ -199,7 +223,13 @@ class ObservedPeerConnection extends events_1.EventEmitter {
199
223
  }
200
224
  if (sample.dataChannels) {
201
225
  for (const dataChannel of sample.dataChannels) {
202
- this._updateDataChannelStats(dataChannel);
226
+ const observedDataChannel = this._updateDataChannelStats(dataChannel);
227
+ if (!observedDataChannel)
228
+ continue;
229
+ this.deltaDataChannelBytesSent += observedDataChannel.deltaBytesSent;
230
+ this.deltaDataChannelBytesReceived += observedDataChannel.deltaBytesReceived;
231
+ this.deltaDataChannelMessagesSent += observedDataChannel.deltaMessagesSent;
232
+ this.deltaDataChannelMessagesReceived += observedDataChannel.deltaMessagesReceived;
203
233
  }
204
234
  }
205
235
  if (sample.iceCandidates) {
@@ -209,12 +239,26 @@ class ObservedPeerConnection extends events_1.EventEmitter {
209
239
  }
210
240
  if (sample.iceCandidatePairs) {
211
241
  for (const iceCandidatePair of sample.iceCandidatePairs) {
212
- this._updateIceCandidatePairStats(iceCandidatePair);
242
+ const observedCandidatePair = this._updateIceCandidatePairStats(iceCandidatePair);
243
+ if (!observedCandidatePair)
244
+ continue;
245
+ if (observedCandidatePair.currentRoundTripTime) {
246
+ rttMeasurementsInSec.push(observedCandidatePair.currentRoundTripTime);
247
+ }
248
+ if (observedCandidatePair.availableIncomingBitrate) {
249
+ this.availableIncomingBitrate += observedCandidatePair.availableIncomingBitrate;
250
+ }
251
+ if (observedCandidatePair.availableOutgoingBitrate) {
252
+ this.availableOutgoingBitrate += observedCandidatePair.availableOutgoingBitrate;
253
+ }
213
254
  }
214
255
  }
215
256
  if (sample.iceTransports) {
216
257
  for (const iceTransport of sample.iceTransports) {
217
- this._updateIceTransportStats(iceTransport);
258
+ const observedIceTransport = this._updateIceTransportStats(iceTransport);
259
+ if (!observedIceTransport)
260
+ return;
261
+ observedIceTransport.bytesReceived;
218
262
  }
219
263
  }
220
264
  if (sample.inboundRtps) {
@@ -235,6 +279,9 @@ class ObservedPeerConnection extends events_1.EventEmitter {
235
279
  this.deltaReceivedVideoPackets += observedInboundRtp.deltaReceivedPackets;
236
280
  break;
237
281
  }
282
+ if (observedInboundRtp.jitter) {
283
+ jitterMeasurements.push(observedInboundRtp.jitter);
284
+ }
238
285
  }
239
286
  }
240
287
  if (sample.mediaPlayouts) {
@@ -268,12 +315,19 @@ class ObservedPeerConnection extends events_1.EventEmitter {
268
315
  }
269
316
  if (sample.peerConnectionTransports) {
270
317
  for (const peerConnectionTransport of sample.peerConnectionTransports) {
271
- this._updatePeerConnectionTransportStats(peerConnectionTransport);
318
+ const observedTransport = this._updatePeerConnectionTransportStats(peerConnectionTransport);
319
+ if (!observedTransport)
320
+ continue;
272
321
  }
273
322
  }
274
323
  if (sample.remoteInboundRtps) {
275
324
  for (const remoteInboundRtp of sample.remoteInboundRtps) {
276
- this._updateRemoteInboundRtpStats(remoteInboundRtp);
325
+ const observedRemoteInboundRtp = this._updateRemoteInboundRtpStats(remoteInboundRtp);
326
+ if (!observedRemoteInboundRtp)
327
+ continue;
328
+ if (observedRemoteInboundRtp.roundTripTime) {
329
+ rttMeasurementsInSec.push(observedRemoteInboundRtp.roundTripTime);
330
+ }
277
331
  }
278
332
  }
279
333
  if (sample.remoteOutboundRtps) {
@@ -300,6 +354,8 @@ class ObservedPeerConnection extends events_1.EventEmitter {
300
354
  this.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;
301
355
  this.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;
302
356
  this.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;
357
+ this.totalDataChannelMessagesSent += this.deltaDataChannelMessagesSent;
358
+ this.totalDataChannelMessagesReceived += this.deltaDataChannelMessagesReceived;
303
359
  this.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;
304
360
  this.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;
305
361
  this.totalSentAudioBytes += this.deltaSentAudioBytes;
@@ -310,17 +366,53 @@ class ObservedPeerConnection extends events_1.EventEmitter {
310
366
  this.totalSentVideoPackets += this.deltaSentVideoBytes;
311
367
  this.receivingPacketsPerSecond = this.deltaInboundPacketsReceived / elapsedTimeInSec;
312
368
  this.sendingPacketsPerSecond = this.deltaOutboundPacketsSent / elapsedTimeInSec;
313
- this.sendingAudioBitrate = this.deltaSentAudioBytes * 8 / elapsedTimeInSec;
314
- this.sendingVideoBitrate = this.deltaSentVideoBytes * 8 / elapsedTimeInSec;
315
- this.receivingAudioBitrate = this.deltaReceivedAudioBytes * 8 / elapsedTimeInSec;
316
- this.receivingVideoBitrate = this.deltaReceivedVideoBytes * 8 / elapsedTimeInSec;
369
+ this.sendingAudioBitrate = (this.deltaSentAudioBytes * 8) / elapsedTimeInSec;
370
+ this.sendingVideoBitrate = (this.deltaSentVideoBytes * 8) / elapsedTimeInSec;
371
+ this.receivingAudioBitrate = (this.deltaReceivedAudioBytes * 8) / elapsedTimeInSec;
372
+ this.receivingVideoBitrate = (this.deltaReceivedVideoBytes * 8) / elapsedTimeInSec;
373
+ if (rttMeasurementsInSec.length > 0) {
374
+ this.currentRttInMs = (0, utils_1.getMedian)(rttMeasurementsInSec, false) * 1000;
375
+ }
376
+ else {
377
+ this.currentRttInMs = undefined;
378
+ }
379
+ if (jitterMeasurements.length > 0) {
380
+ this.currentJitter = (0, utils_1.getMedian)(jitterMeasurements, false);
381
+ }
382
+ else {
383
+ this.currentJitter = undefined;
384
+ }
385
+ const wasUsingTURN = this.usingTURN;
317
386
  const selectedIceCandidatePairs = this.selectedIceCandidatePairs;
318
- this.usingTCP = selectedIceCandidatePairs.some((pair) => pair.getLocalCandidate()?.protocol === 'tcp');
319
- this.usingTURN = selectedIceCandidatePairs.some((pair) => pair.getLocalCandidate()?.candidateType === 'relay') &&
320
- selectedIceCandidatePairs.some((pair) => pair.getRemoteCandidate()?.url?.startsWith('turn:'));
387
+ const selectedCandidatePairForTurn = [];
388
+ this.usingTCP = false;
389
+ this.usingTURN = false;
390
+ for (const selectedCandidatePair of selectedIceCandidatePairs) {
391
+ if (selectedCandidatePair.getLocalCandidate()?.protocol === 'tcp') {
392
+ this.usingTCP = true;
393
+ }
394
+ if (selectedCandidatePair.getLocalCandidate()?.candidateType === 'relay' && selectedCandidatePair.getRemoteCandidate()?.url?.startsWith('turn:')) {
395
+ selectedCandidatePairForTurn.push(selectedCandidatePair);
396
+ this.usingTURN = true;
397
+ }
398
+ this.deltaTransportReceivedBytes += selectedCandidatePair.deltaBytesReceived;
399
+ this.deltaTransportSentBytes += selectedCandidatePair.deltaBytesSent;
400
+ }
401
+ if (this.usingTURN) {
402
+ if (!this.observedTurnServer) {
403
+ this.observedTurnServer = this.client.call.observer.observedTURN.addPeerConnection(this);
404
+ }
405
+ this.observedTurnServer?.updateTurnUsage(...selectedCandidatePairForTurn);
406
+ }
407
+ else if (wasUsingTURN) {
408
+ if (!this.usingTURN) {
409
+ this.client.call.observer.observedTURN.removePeerConnection(this);
410
+ }
411
+ }
321
412
  this.calculatedScore.value = sample.score;
322
413
  this.updated = now;
323
414
  this._checkVisited();
415
+ this.emit('update');
324
416
  }
325
417
  _checkVisited() {
326
418
  for (const certificate of [...this.observedCertificates.values()]) {
@@ -420,10 +512,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
420
512
  return logger.warn(`ObservedPeerConnection received an invalid CertificateStats (missing timestamp OR id OR fingerprint field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
421
513
  }
422
514
  observedCertificate = new ObservedCertificate_1.ObservedCertificate(stats.timestamp, stats.id, this);
515
+ observedCertificate.update(stats);
423
516
  this.observedCertificates.set(stats.id, observedCertificate);
424
517
  this.emit('added-certificate', observedCertificate);
425
518
  }
426
- observedCertificate.update(stats);
519
+ else {
520
+ observedCertificate.update(stats);
521
+ this.emit('updated-certificate', observedCertificate);
522
+ }
427
523
  return observedCertificate;
428
524
  }
429
525
  _updateCodecStats(stats) {
@@ -433,10 +529,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
433
529
  return logger.warn(`ObservedPeerConnection received an invalid CodecStats (missing timestamp OR id OR mimeType field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
434
530
  }
435
531
  observedCodec = new ObservedCodec_1.ObservedCodec(stats.timestamp, stats.id, stats.mimeType, this);
532
+ observedCodec.update(stats);
436
533
  this.observedCodecs.set(stats.id, observedCodec);
437
534
  this.emit('added-codec', observedCodec);
438
535
  }
439
- observedCodec.update(stats);
536
+ else {
537
+ observedCodec.update(stats);
538
+ this.emit('updated-codec', observedCodec);
539
+ }
440
540
  return observedCodec;
441
541
  }
442
542
  _updateDataChannelStats(stats) {
@@ -446,10 +546,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
446
546
  return logger.warn(`ObservedPeerConnection received an invalid DataChannelStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
447
547
  }
448
548
  observedDataChannel = new ObservedDataChannel_1.ObservedDataChannel(stats.timestamp, stats.id, this);
549
+ observedDataChannel.update(stats);
449
550
  this.observedDataChannels.set(stats.id, observedDataChannel);
450
551
  this.emit('added-data-channel', observedDataChannel);
451
552
  }
452
- observedDataChannel.update(stats);
553
+ else {
554
+ observedDataChannel.update(stats);
555
+ this.emit('updated-data-channel', observedDataChannel);
556
+ }
453
557
  return observedDataChannel;
454
558
  }
455
559
  _updateIceCandidateStats(stats) {
@@ -459,10 +563,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
459
563
  return logger.warn(`ObservedPeerConnection received an invalid IceCandidateStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
460
564
  }
461
565
  observedIceCandidate = new ObservedIceCandidate_1.ObservedIceCandidate(stats.timestamp, stats.id, this);
566
+ observedIceCandidate.update(stats);
462
567
  this.observedIceCandidates.set(stats.id, observedIceCandidate);
463
568
  this.emit('added-ice-candidate', observedIceCandidate);
464
569
  }
465
- observedIceCandidate.update(stats);
570
+ else {
571
+ observedIceCandidate.update(stats);
572
+ this.emit('updated-ice-candidate', observedIceCandidate);
573
+ }
466
574
  return observedIceCandidate;
467
575
  }
468
576
  _updateIceCandidatePairStats(stats) {
@@ -472,10 +580,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
472
580
  return logger.warn(`ObservedPeerConnection received an invalid IceCandidateStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
473
581
  }
474
582
  observedIceCandidatePair = new ObservedIceCandidatePair_1.ObservedIceCandidatePair(stats.timestamp, stats.id, this);
583
+ observedIceCandidatePair.update(stats);
475
584
  this.observedIceCandidatesPair.set(stats.id, observedIceCandidatePair);
476
585
  this.emit('added-ice-candidate-pair', observedIceCandidatePair);
477
586
  }
478
- observedIceCandidatePair.update(stats);
587
+ else {
588
+ observedIceCandidatePair.update(stats);
589
+ this.emit('updated-ice-candidate-pair', observedIceCandidatePair);
590
+ }
479
591
  return observedIceCandidatePair;
480
592
  }
481
593
  _updateIceTransportStats(stats) {
@@ -485,10 +597,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
485
597
  return logger.warn(`ObservedPeerConnection received an invalid IceCandidateStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
486
598
  }
487
599
  observedIceTransport = new ObservedIceTransport_1.ObservedIceTransport(stats.timestamp, stats.id, this);
600
+ observedIceTransport.update(stats);
488
601
  this.observedIceTransports.set(stats.id, observedIceTransport);
489
602
  this.emit('added-ice-transport', observedIceTransport);
490
603
  }
491
- observedIceTransport.update(stats);
604
+ else {
605
+ observedIceTransport.update(stats);
606
+ this.emit('updated-ice-transport', observedIceTransport);
607
+ }
492
608
  return observedIceTransport;
493
609
  }
494
610
  _updateInboundRtpStats(stats) {
@@ -498,10 +614,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
498
614
  return logger.warn(`ObservedPeerConnection received an invalid InboundRtpStats (missing timestamp OR id OR ssrc OR kind OR trackIdentifier field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
499
615
  }
500
616
  observedInboundRtp = new ObservedInboundRtp_1.ObservedInboundRtp(stats.timestamp, stats.id, stats.ssrc, stats.kind, stats.trackIdentifier, this);
617
+ observedInboundRtp.update(stats);
501
618
  this.observedInboundRtps.set(stats.ssrc, observedInboundRtp);
502
619
  this.emit('added-inbound-rtp', observedInboundRtp);
503
620
  }
504
- observedInboundRtp.update(stats);
621
+ else {
622
+ observedInboundRtp.update(stats);
623
+ this.emit('updated-inbound-rtp', observedInboundRtp);
624
+ }
505
625
  return observedInboundRtp;
506
626
  }
507
627
  _updateInboundTrackSample(stats) {
@@ -514,10 +634,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
514
634
  const mediaPlayout = inboundRtp ?
515
635
  [...this.observedMediaPlayouts.values()].find((mp) => mp.id === inboundRtp.playoutId) : undefined;
516
636
  observedInboundTrack = new ObservedInboundTrack_1.ObservedInboundTrack(stats.timestamp, stats.id, stats.kind, this, inboundRtp, mediaPlayout);
637
+ observedInboundTrack.update(stats);
517
638
  this.observedInboundTracks.set(stats.id, observedInboundTrack);
518
639
  this.emit('added-inbound-track', observedInboundTrack);
519
640
  }
520
- observedInboundTrack.update(stats);
641
+ else {
642
+ observedInboundTrack.update(stats);
643
+ this.emit('updated-inbound-track', observedInboundTrack);
644
+ }
521
645
  return observedInboundTrack;
522
646
  }
523
647
  _updateMediaPlayoutStats(stats) {
@@ -527,10 +651,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
527
651
  return logger.warn(`ObservedPeerConnection received an invalid InboundRtpStats (missing timestamp OR id OR kind OR trackIdentifier field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
528
652
  }
529
653
  observedMediaPlayout = new ObservedMediaPlayout_1.ObservedMediaPlayout(stats.timestamp, stats.id, stats.kind, this);
654
+ observedMediaPlayout.update(stats);
530
655
  this.observedMediaPlayouts.set(stats.id, observedMediaPlayout);
531
656
  this.emit('added-media-playout', observedMediaPlayout);
532
657
  }
533
- observedMediaPlayout.update(stats);
658
+ else {
659
+ observedMediaPlayout.update(stats);
660
+ this.emit('updated-media-playout', observedMediaPlayout);
661
+ }
534
662
  return observedMediaPlayout;
535
663
  }
536
664
  _updateMediaSourceStats(stats) {
@@ -540,10 +668,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
540
668
  return logger.warn(`ObservedPeerConnection received an invalid InboundRtpStats (missing timestamp OR id OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
541
669
  }
542
670
  observedMediaSource = new ObservedMediaSource_1.ObservedMediaSource(stats.timestamp, stats.id, stats.kind, this);
671
+ observedMediaSource.update(stats);
543
672
  this.observedMediaSources.set(stats.id, observedMediaSource);
544
673
  this.emit('added-media-source', observedMediaSource);
545
674
  }
546
- observedMediaSource.update(stats);
675
+ else {
676
+ observedMediaSource.update(stats);
677
+ this.emit('updated-media-source', observedMediaSource);
678
+ }
547
679
  return observedMediaSource;
548
680
  }
549
681
  _updateOutboundRtpStats(stats) {
@@ -553,10 +685,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
553
685
  return logger.warn(`ObservedPeerConnection received an invalid OutboundRtpStats (missing timestamp OR id OR ssrc OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
554
686
  }
555
687
  observedOutboundRtp = new ObservedOutboundRtp_1.ObservedOutboundRtp(stats.timestamp, stats.id, stats.ssrc, stats.kind, this);
688
+ observedOutboundRtp.update(stats);
556
689
  this.observedOutboundRtps.set(stats.ssrc, observedOutboundRtp);
557
690
  this.emit('added-outbound-rtp', observedOutboundRtp);
558
691
  }
559
- observedOutboundRtp.update(stats);
692
+ else {
693
+ observedOutboundRtp.update(stats);
694
+ this.emit('updated-outbound-rtp', observedOutboundRtp);
695
+ }
560
696
  return observedOutboundRtp;
561
697
  }
562
698
  _updateOutboundTrackSample(stats) {
@@ -569,10 +705,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
569
705
  const outboundRtps = observedMediaSource
570
706
  ? [...this.observedOutboundRtps.values()].filter((outboundRtp) => outboundRtp.mediaSourceId === observedMediaSource?.id) : undefined;
571
707
  observedOutboundTrack = new ObservedOutboundTrack_1.ObservedOutboundTrack(stats.timestamp, stats.id, stats.kind, this, outboundRtps, observedMediaSource);
708
+ observedOutboundTrack.update(stats);
572
709
  this.observedOutboundTracks.set(stats.id, observedOutboundTrack);
573
710
  this.emit('added-outbound-track', observedOutboundTrack);
574
711
  }
575
- observedOutboundTrack.update(stats);
712
+ else {
713
+ observedOutboundTrack.update(stats);
714
+ this.emit('updated-outbound-track', observedOutboundTrack);
715
+ }
576
716
  return observedOutboundTrack;
577
717
  }
578
718
  _updatePeerConnectionTransportStats(stats) {
@@ -582,10 +722,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
582
722
  return logger.warn(`ObservedPeerConnection received an invalid PeerConnectionTransportStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
583
723
  }
584
724
  observedPeerConnectionTransport = new ObservedPeerConnectionTransport_1.ObservedPeerConnectionTransport(stats.timestamp, stats.id, this);
725
+ observedPeerConnectionTransport.update(stats);
585
726
  this.observedPeerConnectionTransports.set(stats.id, observedPeerConnectionTransport);
586
727
  this.emit('added-peer-connection-transport', observedPeerConnectionTransport);
587
728
  }
588
- observedPeerConnectionTransport.update(stats);
729
+ else {
730
+ observedPeerConnectionTransport.update(stats);
731
+ this.emit('updated-peer-connection-transport', observedPeerConnectionTransport);
732
+ }
589
733
  return observedPeerConnectionTransport;
590
734
  }
591
735
  _updateRemoteInboundRtpStats(stats) {
@@ -595,10 +739,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
595
739
  return logger.warn(`ObservedPeerConnection received an invalid RemoteInboundRtpStats (missing timestamp OR id OR ssrc OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
596
740
  }
597
741
  observedRemoteInboundRtp = new ObservedRemoteInboundRtp_1.ObservedRemoteInboundRtp(stats.timestamp, stats.id, stats.ssrc, stats.kind, this);
742
+ observedRemoteInboundRtp.update(stats);
598
743
  this.observedRemoteInboundRtps.set(stats.ssrc, observedRemoteInboundRtp);
599
744
  this.emit('added-remote-inbound-rtp', observedRemoteInboundRtp);
600
745
  }
601
- observedRemoteInboundRtp.update(stats);
746
+ else {
747
+ observedRemoteInboundRtp.update(stats);
748
+ this.emit('updated-remote-inbound-rtp', observedRemoteInboundRtp);
749
+ }
602
750
  return observedRemoteInboundRtp;
603
751
  }
604
752
  _updateRemoteOutboundRtpStats(stats) {
@@ -608,10 +756,14 @@ class ObservedPeerConnection extends events_1.EventEmitter {
608
756
  return logger.warn(`ObservedPeerConnection received an invalid RemoteOutboundRtpStats (missing timestamp OR id OR ssrc OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`, stats);
609
757
  }
610
758
  observedRemoteOutboundRtp = new ObservedRemoteOutboundRtp_1.ObservedRemoteOutboundRtp(stats.timestamp, stats.id, stats.ssrc, stats.kind, this);
759
+ observedRemoteOutboundRtp.update(stats);
611
760
  this.observedRemoteOutboundRtps.set(stats.ssrc, observedRemoteOutboundRtp);
612
761
  this.emit('added-remote-outbound-rtp', observedRemoteOutboundRtp);
613
762
  }
614
- observedRemoteOutboundRtp.update(stats);
763
+ else {
764
+ observedRemoteOutboundRtp.update(stats);
765
+ this.emit('updated-remote-outbound-rtp', observedRemoteOutboundRtp);
766
+ }
615
767
  return observedRemoteOutboundRtp;
616
768
  }
617
769
  }
@@ -0,0 +1,31 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'stream';
3
+ import { ObservedPeerConnection } from './ObservedPeerConnection';
4
+ import { ObservedTurnServer } from './ObservedTurnServer';
5
+ export type ObservedTURNEventMap = {
6
+ 'update': [ObservedTURN];
7
+ 'close': [];
8
+ };
9
+ export declare interface ObservedTURN {
10
+ on<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
11
+ off<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
12
+ once<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
13
+ emit<U extends keyof ObservedTURNEventMap>(event: U, ...args: ObservedTURNEventMap[U]): boolean;
14
+ }
15
+ export declare class ObservedTURN extends EventEmitter {
16
+ totalBytesSent: number;
17
+ totalBytesReceived: number;
18
+ totalPacketsSent: number;
19
+ totalPacketsReceived: number;
20
+ packetsSentPerSecond: number;
21
+ packetsReceivedPerSecond: number;
22
+ outboundBitrate: number;
23
+ inboundBitrate: number;
24
+ numberOfClients: number;
25
+ readonly servers: Map<string, ObservedTurnServer>;
26
+ constructor();
27
+ update(): void;
28
+ addPeerConnection(peerConnection: ObservedPeerConnection): ObservedTurnServer | undefined;
29
+ removePeerConnection(peerConnection: ObservedPeerConnection): void;
30
+ }
31
+ //# sourceMappingURL=ObservedTURN.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObservedTURN.d.ts","sourceRoot":"","sources":["../src/ObservedTURN.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,EAAE,EAAE,CAAC;CACZ,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,YAAY;IACpC,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/G,GAAG,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACjH,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChG;AAED,qBAAa,YAAa,SAAQ,YAAY;IACtC,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,gBAAgB,SAAK;IACrB,oBAAoB,SAAK;IAEzB,oBAAoB,SAAK;IACzB,wBAAwB,SAAK;IAC7B,eAAe,SAAK;IACpB,cAAc,SAAK;IACnB,eAAe,SAAK;IAE3B,SAAgB,OAAO,kCAAyC;;IAOzD,MAAM;IAgBN,iBAAiB,CAAC,cAAc,EAAE,sBAAsB;IAyBxD,oBAAoB,CAAC,cAAc,EAAE,sBAAsB;CAMlE"}