@microsoft/live-share-media 2.0.0-internal.1 → 2.0.0-internal.10

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 (228) hide show
  1. package/README.md +30 -31
  2. package/bin/cjs/IMediaPlayer.d.ts.map +1 -0
  3. package/bin/cjs/IMediaPlayer.js.map +1 -0
  4. package/bin/{LiveMediaSession.d.ts → cjs/LiveMediaSession.d.ts} +16 -9
  5. package/bin/cjs/LiveMediaSession.d.ts.map +1 -0
  6. package/bin/{LiveMediaSession.js → cjs/LiveMediaSession.js} +31 -25
  7. package/bin/cjs/LiveMediaSession.js.map +1 -0
  8. package/bin/{LiveMediaSessionCoordinator.d.ts → cjs/LiveMediaSessionCoordinator.d.ts} +57 -13
  9. package/bin/cjs/LiveMediaSessionCoordinator.d.ts.map +1 -0
  10. package/bin/{LiveMediaSessionCoordinator.js → cjs/LiveMediaSessionCoordinator.js} +152 -64
  11. package/bin/cjs/LiveMediaSessionCoordinator.js.map +1 -0
  12. package/bin/{LiveMediaSessionCoordinatorSuspension.d.ts → cjs/LiveMediaSessionCoordinatorSuspension.d.ts} +1 -1
  13. package/bin/cjs/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -0
  14. package/bin/cjs/LiveMediaSessionCoordinatorSuspension.js.map +1 -0
  15. package/bin/{MediaPlayerSynchronizer.d.ts → cjs/MediaPlayerSynchronizer.d.ts} +22 -8
  16. package/bin/cjs/MediaPlayerSynchronizer.d.ts.map +1 -0
  17. package/bin/{MediaPlayerSynchronizer.js → cjs/MediaPlayerSynchronizer.js} +38 -41
  18. package/bin/cjs/MediaPlayerSynchronizer.js.map +1 -0
  19. package/bin/{MediaSessionActionThrottler.d.ts → cjs/MediaSessionActionThrottler.d.ts} +1 -1
  20. package/bin/cjs/MediaSessionActionThrottler.d.ts.map +1 -0
  21. package/bin/cjs/MediaSessionActionThrottler.js.map +1 -0
  22. package/bin/cjs/MediaSessionExtensions.d.ts.map +1 -0
  23. package/bin/cjs/MediaSessionExtensions.js.map +1 -0
  24. package/bin/{RepeatedActionThrottler.d.ts → cjs/RepeatedActionThrottler.d.ts} +2 -2
  25. package/bin/cjs/RepeatedActionThrottler.d.ts.map +1 -0
  26. package/bin/{RepeatedActionThrottler.js → cjs/RepeatedActionThrottler.js} +2 -2
  27. package/bin/cjs/RepeatedActionThrottler.js.map +1 -0
  28. package/bin/{VolumeManager.d.ts → cjs/VolumeManager.d.ts} +6 -6
  29. package/bin/cjs/VolumeManager.d.ts.map +1 -0
  30. package/bin/{VolumeManager.js → cjs/VolumeManager.js} +5 -5
  31. package/bin/cjs/VolumeManager.js.map +1 -0
  32. package/bin/cjs/index.d.ts +14 -0
  33. package/bin/cjs/index.d.ts.map +1 -0
  34. package/bin/{internals → cjs}/index.js +9 -8
  35. package/bin/cjs/index.js.map +1 -0
  36. package/bin/{internals → cjs/internals}/GroupCoordinatorState.d.ts +14 -12
  37. package/bin/cjs/internals/GroupCoordinatorState.d.ts.map +1 -0
  38. package/bin/{internals → cjs/internals}/GroupCoordinatorState.js +46 -49
  39. package/bin/cjs/internals/GroupCoordinatorState.js.map +1 -0
  40. package/bin/{internals → cjs/internals}/GroupPlaybackPosition.d.ts +6 -5
  41. package/bin/cjs/internals/GroupPlaybackPosition.d.ts.map +1 -0
  42. package/bin/{internals → cjs/internals}/GroupPlaybackPosition.js +3 -3
  43. package/bin/cjs/internals/GroupPlaybackPosition.js.map +1 -0
  44. package/bin/{internals → cjs/internals}/GroupPlaybackRate.d.ts +4 -5
  45. package/bin/cjs/internals/GroupPlaybackRate.d.ts.map +1 -0
  46. package/bin/{internals → cjs/internals}/GroupPlaybackRate.js +2 -5
  47. package/bin/cjs/internals/GroupPlaybackRate.js.map +1 -0
  48. package/bin/{internals → cjs/internals}/GroupPlaybackTrack.d.ts +5 -6
  49. package/bin/cjs/internals/GroupPlaybackTrack.d.ts.map +1 -0
  50. package/bin/{internals → cjs/internals}/GroupPlaybackTrack.js +2 -5
  51. package/bin/cjs/internals/GroupPlaybackTrack.js.map +1 -0
  52. package/bin/{internals → cjs/internals}/GroupPlaybackTrackData.d.ts +5 -6
  53. package/bin/cjs/internals/GroupPlaybackTrackData.d.ts.map +1 -0
  54. package/bin/{internals → cjs/internals}/GroupPlaybackTrackData.js +4 -7
  55. package/bin/cjs/internals/GroupPlaybackTrackData.js.map +1 -0
  56. package/bin/{internals → cjs/internals}/GroupTransportState.d.ts +8 -9
  57. package/bin/cjs/internals/GroupTransportState.d.ts.map +1 -0
  58. package/bin/{internals → cjs/internals}/GroupTransportState.js +4 -7
  59. package/bin/cjs/internals/GroupTransportState.js.map +1 -0
  60. package/bin/cjs/internals/PriorityTimeInterval.d.ts +33 -0
  61. package/bin/cjs/internals/PriorityTimeInterval.d.ts.map +1 -0
  62. package/bin/cjs/internals/PriorityTimeInterval.js +45 -0
  63. package/bin/cjs/internals/PriorityTimeInterval.js.map +1 -0
  64. package/bin/cjs/internals/consts.d.ts.map +1 -0
  65. package/bin/cjs/internals/consts.js.map +1 -0
  66. package/bin/cjs/internals/errors.d.ts.map +1 -0
  67. package/bin/cjs/internals/errors.js.map +1 -0
  68. package/bin/cjs/internals/interfaces.d.ts +23 -0
  69. package/bin/cjs/internals/interfaces.d.ts.map +1 -0
  70. package/bin/{internals → cjs/internals}/interfaces.js.map +1 -1
  71. package/bin/cjs/package.json +1 -0
  72. package/bin/esm/IMediaPlayer.d.ts +21 -0
  73. package/bin/esm/IMediaPlayer.d.ts.map +1 -0
  74. package/bin/esm/IMediaPlayer.js +6 -0
  75. package/bin/esm/IMediaPlayer.js.map +1 -0
  76. package/bin/esm/LiveMediaSession.d.ts +97 -0
  77. package/bin/esm/LiveMediaSession.d.ts.map +1 -0
  78. package/bin/esm/LiveMediaSession.js +257 -0
  79. package/bin/esm/LiveMediaSession.js.map +1 -0
  80. package/bin/esm/LiveMediaSessionCoordinator.d.ts +304 -0
  81. package/bin/esm/LiveMediaSessionCoordinator.d.ts.map +1 -0
  82. package/bin/esm/LiveMediaSessionCoordinator.js +556 -0
  83. package/bin/esm/LiveMediaSessionCoordinator.js.map +1 -0
  84. package/bin/esm/LiveMediaSessionCoordinatorSuspension.d.ts +20 -0
  85. package/bin/esm/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -0
  86. package/bin/esm/LiveMediaSessionCoordinatorSuspension.js +24 -0
  87. package/bin/esm/LiveMediaSessionCoordinatorSuspension.js.map +1 -0
  88. package/bin/esm/MediaPlayerSynchronizer.d.ts +204 -0
  89. package/bin/esm/MediaPlayerSynchronizer.d.ts.map +1 -0
  90. package/bin/esm/MediaPlayerSynchronizer.js +570 -0
  91. package/bin/esm/MediaPlayerSynchronizer.js.map +1 -0
  92. package/bin/esm/MediaSessionActionThrottler.d.ts +12 -0
  93. package/bin/esm/MediaSessionActionThrottler.d.ts.map +1 -0
  94. package/bin/esm/MediaSessionActionThrottler.js +10 -0
  95. package/bin/esm/MediaSessionActionThrottler.js.map +1 -0
  96. package/bin/esm/MediaSessionExtensions.d.ts +177 -0
  97. package/bin/esm/MediaSessionExtensions.d.ts.map +1 -0
  98. package/bin/esm/MediaSessionExtensions.js +23 -0
  99. package/bin/esm/MediaSessionExtensions.js.map +1 -0
  100. package/bin/esm/RepeatedActionThrottler.d.ts +20 -0
  101. package/bin/esm/RepeatedActionThrottler.d.ts.map +1 -0
  102. package/bin/esm/RepeatedActionThrottler.js +59 -0
  103. package/bin/esm/RepeatedActionThrottler.js.map +1 -0
  104. package/bin/esm/VolumeManager.d.ts +84 -0
  105. package/bin/esm/VolumeManager.d.ts.map +1 -0
  106. package/bin/esm/VolumeManager.js +171 -0
  107. package/bin/esm/VolumeManager.js.map +1 -0
  108. package/bin/esm/index.d.ts +14 -0
  109. package/bin/esm/index.d.ts.map +1 -0
  110. package/bin/esm/index.js +14 -0
  111. package/bin/esm/index.js.map +1 -0
  112. package/bin/esm/internals/GroupCoordinatorState.d.ts +110 -0
  113. package/bin/esm/internals/GroupCoordinatorState.d.ts.map +1 -0
  114. package/bin/esm/internals/GroupCoordinatorState.js +512 -0
  115. package/bin/esm/internals/GroupCoordinatorState.js.map +1 -0
  116. package/bin/esm/internals/GroupPlaybackPosition.d.ts +71 -0
  117. package/bin/esm/internals/GroupPlaybackPosition.d.ts.map +1 -0
  118. package/bin/esm/internals/GroupPlaybackPosition.js +166 -0
  119. package/bin/esm/internals/GroupPlaybackPosition.js.map +1 -0
  120. package/bin/esm/internals/GroupPlaybackRate.d.ts +38 -0
  121. package/bin/esm/internals/GroupPlaybackRate.d.ts.map +1 -0
  122. package/bin/esm/internals/GroupPlaybackRate.js +55 -0
  123. package/bin/esm/internals/GroupPlaybackRate.js.map +1 -0
  124. package/bin/esm/internals/GroupPlaybackTrack.d.ts +45 -0
  125. package/bin/esm/internals/GroupPlaybackTrack.d.ts.map +1 -0
  126. package/bin/esm/internals/GroupPlaybackTrack.js +118 -0
  127. package/bin/esm/internals/GroupPlaybackTrack.js.map +1 -0
  128. package/bin/esm/internals/GroupPlaybackTrackData.d.ts +40 -0
  129. package/bin/esm/internals/GroupPlaybackTrackData.d.ts.map +1 -0
  130. package/bin/esm/internals/GroupPlaybackTrackData.js +66 -0
  131. package/bin/esm/internals/GroupPlaybackTrackData.js.map +1 -0
  132. package/bin/esm/internals/GroupTransportState.d.ts +52 -0
  133. package/bin/esm/internals/GroupTransportState.d.ts.map +1 -0
  134. package/bin/esm/internals/GroupTransportState.js +116 -0
  135. package/bin/esm/internals/GroupTransportState.js.map +1 -0
  136. package/bin/esm/internals/PriorityTimeInterval.d.ts +33 -0
  137. package/bin/esm/internals/PriorityTimeInterval.d.ts.map +1 -0
  138. package/bin/esm/internals/PriorityTimeInterval.js +41 -0
  139. package/bin/esm/internals/PriorityTimeInterval.js.map +1 -0
  140. package/bin/esm/internals/consts.d.ts +83 -0
  141. package/bin/esm/internals/consts.d.ts.map +1 -0
  142. package/bin/esm/internals/consts.js +89 -0
  143. package/bin/esm/internals/consts.js.map +1 -0
  144. package/bin/esm/internals/errors.d.ts +17 -0
  145. package/bin/esm/internals/errors.d.ts.map +1 -0
  146. package/bin/esm/internals/errors.js +29 -0
  147. package/bin/esm/internals/errors.js.map +1 -0
  148. package/bin/esm/internals/interfaces.d.ts +23 -0
  149. package/bin/esm/internals/interfaces.d.ts.map +1 -0
  150. package/bin/esm/internals/interfaces.js +2 -0
  151. package/bin/esm/internals/interfaces.js.map +1 -0
  152. package/package.json +31 -12
  153. package/src/LiveMediaSession.ts +29 -14
  154. package/src/LiveMediaSessionCoordinator.ts +149 -37
  155. package/src/LiveMediaSessionCoordinatorSuspension.ts +1 -1
  156. package/src/MediaPlayerSynchronizer.ts +26 -11
  157. package/src/MediaSessionActionThrottler.ts +1 -1
  158. package/src/RepeatedActionThrottler.ts +2 -2
  159. package/src/VolumeManager.ts +6 -6
  160. package/src/index.ts +9 -9
  161. package/src/internals/GroupCoordinatorState.ts +19 -15
  162. package/src/internals/GroupPlaybackPosition.ts +9 -9
  163. package/src/internals/GroupPlaybackRate.ts +4 -4
  164. package/src/internals/GroupPlaybackTrack.ts +5 -5
  165. package/src/internals/GroupPlaybackTrackData.ts +5 -5
  166. package/src/internals/GroupTransportState.ts +8 -8
  167. package/src/internals/PriorityTimeInterval.ts +76 -0
  168. package/src/internals/interfaces.ts +15 -1
  169. package/tsconfig.cjs.json +14 -0
  170. package/tsconfig.json +65 -74
  171. package/.nycrc.json +0 -11
  172. package/bin/IMediaPlayer.d.ts.map +0 -1
  173. package/bin/IMediaPlayer.js.map +0 -1
  174. package/bin/LiveMediaSession.d.ts.map +0 -1
  175. package/bin/LiveMediaSession.js.map +0 -1
  176. package/bin/LiveMediaSessionCoordinator.d.ts.map +0 -1
  177. package/bin/LiveMediaSessionCoordinator.js.map +0 -1
  178. package/bin/LiveMediaSessionCoordinatorSuspension.d.ts.map +0 -1
  179. package/bin/LiveMediaSessionCoordinatorSuspension.js.map +0 -1
  180. package/bin/MediaPlayerSynchronizer.d.ts.map +0 -1
  181. package/bin/MediaPlayerSynchronizer.js.map +0 -1
  182. package/bin/MediaSessionActionThrottler.d.ts.map +0 -1
  183. package/bin/MediaSessionActionThrottler.js.map +0 -1
  184. package/bin/MediaSessionExtensions.d.ts.map +0 -1
  185. package/bin/MediaSessionExtensions.js.map +0 -1
  186. package/bin/RepeatedActionThrottler.d.ts.map +0 -1
  187. package/bin/RepeatedActionThrottler.js.map +0 -1
  188. package/bin/VolumeManager.d.ts.map +0 -1
  189. package/bin/VolumeManager.js.map +0 -1
  190. package/bin/index.d.ts +0 -14
  191. package/bin/index.d.ts.map +0 -1
  192. package/bin/index.js +0 -30
  193. package/bin/index.js.map +0 -1
  194. package/bin/internals/GroupCoordinatorState.d.ts.map +0 -1
  195. package/bin/internals/GroupCoordinatorState.js.map +0 -1
  196. package/bin/internals/GroupPlaybackPosition.d.ts.map +0 -1
  197. package/bin/internals/GroupPlaybackPosition.js.map +0 -1
  198. package/bin/internals/GroupPlaybackRate.d.ts.map +0 -1
  199. package/bin/internals/GroupPlaybackRate.js.map +0 -1
  200. package/bin/internals/GroupPlaybackTrack.d.ts.map +0 -1
  201. package/bin/internals/GroupPlaybackTrack.js.map +0 -1
  202. package/bin/internals/GroupPlaybackTrackData.d.ts.map +0 -1
  203. package/bin/internals/GroupPlaybackTrackData.js.map +0 -1
  204. package/bin/internals/GroupTransportState.d.ts.map +0 -1
  205. package/bin/internals/GroupTransportState.js.map +0 -1
  206. package/bin/internals/consts.d.ts.map +0 -1
  207. package/bin/internals/consts.js.map +0 -1
  208. package/bin/internals/errors.d.ts.map +0 -1
  209. package/bin/internals/errors.js.map +0 -1
  210. package/bin/internals/index.d.ts +0 -13
  211. package/bin/internals/index.d.ts.map +0 -1
  212. package/bin/internals/index.js.map +0 -1
  213. package/bin/internals/interfaces.d.ts +0 -10
  214. package/bin/internals/interfaces.d.ts.map +0 -1
  215. package/src/internals/index.ts +0 -13
  216. package/tsconfig.build.json +0 -9
  217. package/typedoc.json +0 -10
  218. /package/bin/{IMediaPlayer.d.ts → cjs/IMediaPlayer.d.ts} +0 -0
  219. /package/bin/{IMediaPlayer.js → cjs/IMediaPlayer.js} +0 -0
  220. /package/bin/{LiveMediaSessionCoordinatorSuspension.js → cjs/LiveMediaSessionCoordinatorSuspension.js} +0 -0
  221. /package/bin/{MediaSessionActionThrottler.js → cjs/MediaSessionActionThrottler.js} +0 -0
  222. /package/bin/{MediaSessionExtensions.d.ts → cjs/MediaSessionExtensions.d.ts} +0 -0
  223. /package/bin/{MediaSessionExtensions.js → cjs/MediaSessionExtensions.js} +0 -0
  224. /package/bin/{internals → cjs/internals}/consts.d.ts +0 -0
  225. /package/bin/{internals → cjs/internals}/consts.js +0 -0
  226. /package/bin/{internals → cjs/internals}/errors.d.ts +0 -0
  227. /package/bin/{internals → cjs/internals}/errors.js +0 -0
  228. /package/bin/{internals → cjs/internals}/interfaces.js +0 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { IRuntimeSignaler, LiveShareRuntime } from "@microsoft/live-share/internal";
6
+ import { GroupTransportState } from "./GroupTransportState.js";
7
+ import { CoordinationWaitPoint, ExtendedMediaSessionPlaybackState } from "../MediaSessionExtensions.js";
8
+ import { GroupPlaybackRate } from "./GroupPlaybackRate.js";
9
+ import { PriorityTimeInterval } from "./PriorityTimeInterval.js";
10
+ /**
11
+ * Per client position
12
+ * @hidden
13
+ */
14
+ export interface ICurrentPlaybackPosition {
15
+ playbackState: ExtendedMediaSessionPlaybackState;
16
+ waitPoint?: CoordinationWaitPoint;
17
+ position: number;
18
+ duration?: number;
19
+ timestamp: number;
20
+ clientId: string;
21
+ }
22
+ /**
23
+ * @hidden
24
+ */
25
+ export declare class GroupPlaybackPosition {
26
+ private _transportState;
27
+ private _playbackRate;
28
+ private _runtime;
29
+ private _liveRuntime;
30
+ private _updateInterval;
31
+ private _positions;
32
+ constructor(transportState: GroupTransportState, playbackRate: GroupPlaybackRate, runtime: IRuntimeSignaler, liveRuntime: LiveShareRuntime, updateInterval: PriorityTimeInterval);
33
+ /**
34
+ * Returns the latest position info for the local client.
35
+ */
36
+ get localPosition(): ICurrentPlaybackPosition | undefined;
37
+ /**
38
+ * Returns the total number of clients actively being tracked.
39
+ */
40
+ get totalClients(): number;
41
+ /**
42
+ * Returns true if all clients being tracked are reporting that they have
43
+ * either ended or haven't started.
44
+ */
45
+ get trackEnded(): boolean;
46
+ /**
47
+ * Returns the number of clients we're waiting for before we can stop waiting.
48
+ */
49
+ get clientsWaiting(): number;
50
+ /**
51
+ * Returns the max playback position relative to the start position.
52
+ *
53
+ * @remarks
54
+ * This is called when calculating the current seekTo position.
55
+ */
56
+ get maxPosition(): number;
57
+ /**
58
+ * Optional media duration if known.
59
+ */
60
+ mediaDuration?: number;
61
+ get targetPosition(): number;
62
+ /**
63
+ * Enumerates every reported playback position.
64
+ * @param callbackFn Function applied to each position,
65
+ */
66
+ forEach(callbackFn: (position: ICurrentPlaybackPosition, projectedPosition: number) => void): void;
67
+ UpdatePlaybackPosition(position: ICurrentPlaybackPosition): void;
68
+ private getMostProgressedPosition;
69
+ private limitProjectedPosition;
70
+ }
71
+ //# sourceMappingURL=GroupPlaybackPosition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackPosition.d.ts","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackPosition.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EACH,qBAAqB,EACrB,iCAAiC,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACrC,aAAa,EAAE,iCAAiC,CAAC;IACjD,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,UAAU,CAAwC;gBAGtD,cAAc,EAAE,mBAAmB,EACnC,YAAY,EAAE,iBAAiB,EAC/B,OAAO,EAAE,gBAAgB,EACzB,WAAW,EAAE,gBAAgB,EAC7B,cAAc,EAAE,oBAAoB;IAoBxC;;OAEG;IACH,IAAW,aAAa,IAAI,wBAAwB,GAAG,SAAS,CAE/D;IAED;;OAEG;IACH,IAAW,YAAY,IAAI,MAAM,CAIhC;IAED;;;OAGG;IACH,IAAW,UAAU,IAAI,OAAO,CAe/B;IAED;;OAEG;IACH,IAAW,cAAc,IAAI,MAAM,CAqBlC;IAED;;;;;OAKG;IACH,IAAW,WAAW,IAAI,MAAM,CAW/B;IAED;;OAEG;IACI,aAAa,CAAC,EAAE,MAAM,CAAC;IAE9B,IAAW,cAAc,IAAI,MAAM,CAMlC;IAED;;;OAGG;IACI,OAAO,CACV,UAAU,EAAE,CACR,QAAQ,EAAE,wBAAwB,EAClC,iBAAiB,EAAE,MAAM,KACxB,IAAI,GACV,IAAI;IAoBA,sBAAsB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAkBvE,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,sBAAsB;CAKjC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { GroupPlaybackTrackEvents } from "./GroupPlaybackTrack.js";
6
+ /**
7
+ * @hidden
8
+ */
9
+ export class GroupPlaybackPosition {
10
+ constructor(transportState, playbackRate, runtime, liveRuntime, updateInterval) {
11
+ this._transportState = transportState;
12
+ this._playbackRate = playbackRate;
13
+ this._runtime = runtime;
14
+ this._liveRuntime = liveRuntime;
15
+ this._updateInterval = updateInterval;
16
+ this._positions = new Map();
17
+ // Listen for track change
18
+ this._transportState.track.on(GroupPlaybackTrackEvents.trackChange, (_) => {
19
+ // Reset position tracking and duration
20
+ this._positions = new Map();
21
+ this.mediaDuration = undefined;
22
+ });
23
+ }
24
+ /**
25
+ * Returns the latest position info for the local client.
26
+ */
27
+ get localPosition() {
28
+ return this._positions.get(this._runtime.clientId);
29
+ }
30
+ /**
31
+ * Returns the total number of clients actively being tracked.
32
+ */
33
+ get totalClients() {
34
+ let cnt = 0;
35
+ this.forEach((_) => cnt++);
36
+ return cnt;
37
+ }
38
+ /**
39
+ * Returns true if all clients being tracked are reporting that they have
40
+ * either ended or haven't started.
41
+ */
42
+ get trackEnded() {
43
+ let playing = 0;
44
+ this.forEach((position, projectedPosition) => {
45
+ switch (position.playbackState) {
46
+ case "none":
47
+ case "ended":
48
+ // not playing.
49
+ break;
50
+ default:
51
+ playing++;
52
+ break;
53
+ }
54
+ });
55
+ return playing == 0;
56
+ }
57
+ /**
58
+ * Returns the number of clients we're waiting for before we can stop waiting.
59
+ */
60
+ get clientsWaiting() {
61
+ var _a;
62
+ let cnt = 0;
63
+ const waitPoint = (_a = this.localPosition) === null || _a === void 0 ? void 0 : _a.waitPoint;
64
+ if (waitPoint &&
65
+ (waitPoint.maxClients == undefined ||
66
+ this.totalClients <= waitPoint.maxClients)) {
67
+ this.forEach((position, projectedPosition) => {
68
+ if (position.playbackState == "suspended" &&
69
+ position.waitPoint) {
70
+ cnt++;
71
+ }
72
+ else if (position.position < waitPoint.position) {
73
+ cnt++;
74
+ }
75
+ });
76
+ }
77
+ return cnt;
78
+ }
79
+ /**
80
+ * Returns the max playback position relative to the start position.
81
+ *
82
+ * @remarks
83
+ * This is called when calculating the current seekTo position.
84
+ */
85
+ get maxPosition() {
86
+ if (this._transportState.playbackState == "playing") {
87
+ const now = this._liveRuntime.getTimestamp();
88
+ const projected = this._transportState.startPosition +
89
+ ((now - this._transportState.timestamp) / 1000) *
90
+ this._playbackRate.rate;
91
+ return this.limitProjectedPosition(projected);
92
+ }
93
+ else {
94
+ return this._transportState.startPosition;
95
+ }
96
+ }
97
+ get targetPosition() {
98
+ if (this._transportState.playbackState == "playing") {
99
+ return this.getMostProgressedPosition();
100
+ }
101
+ else {
102
+ return this._transportState.startPosition;
103
+ }
104
+ }
105
+ /**
106
+ * Enumerates every reported playback position.
107
+ * @param callbackFn Function applied to each position,
108
+ */
109
+ forEach(callbackFn) {
110
+ var _a;
111
+ const now = this._liveRuntime.getTimestamp();
112
+ const ignoreBefore = now - this._updateInterval.maxMilliseconds * 2;
113
+ const shouldProject = !((_a = this._transportState.track.metadata) === null || _a === void 0 ? void 0 : _a.liveStream);
114
+ this._positions.forEach((position, _) => {
115
+ // Ignore any old updates
116
+ if (position.timestamp > ignoreBefore) {
117
+ // Compute projected playback position
118
+ // - This computation does not take into account future wait points.
119
+ const projected = position.playbackState == "playing" && shouldProject
120
+ ? position.position +
121
+ ((now - position.timestamp) / 1000) *
122
+ this._playbackRate.rate
123
+ : position.position;
124
+ callbackFn(position, this.limitProjectedPosition(projected));
125
+ }
126
+ });
127
+ }
128
+ UpdatePlaybackPosition(position) {
129
+ // Update duration
130
+ if (position.duration != undefined) {
131
+ this.mediaDuration = position.duration;
132
+ }
133
+ // Save last position
134
+ if (this._positions.has(position.clientId)) {
135
+ // Only update if newer position
136
+ const current = this._positions.get(position.clientId);
137
+ if (position.timestamp >= current.timestamp) {
138
+ this._positions.set(position.clientId, position);
139
+ }
140
+ }
141
+ else {
142
+ this._positions.set(position.clientId, position);
143
+ }
144
+ }
145
+ getMostProgressedPosition() {
146
+ // Compute the max possible position for the current transport state.
147
+ // - This is needed to properly handle seeking backwards in time. Some playback heads may
148
+ // not have performed their seek yet and will therefore be ahead of the local player.
149
+ const maxPosition = this.maxPosition;
150
+ // Compute max progress
151
+ let progress = -1;
152
+ this.forEach((position, projectedPosition) => {
153
+ if (projectedPosition <= maxPosition &&
154
+ projectedPosition > progress) {
155
+ progress = projectedPosition;
156
+ }
157
+ });
158
+ return progress;
159
+ }
160
+ limitProjectedPosition(position) {
161
+ return this.mediaDuration != undefined
162
+ ? Math.min(position, this.mediaDuration)
163
+ : position;
164
+ }
165
+ }
166
+ //# sourceMappingURL=GroupPlaybackPosition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackPosition.js","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackPosition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
+ import { ExtendedMediaSessionActionSource } from "../MediaSessionExtensions.js";
7
+ import { IGroupStateEvent, IGenericTypedEvents } from "./interfaces.js";
8
+ /**
9
+ * @hidden
10
+ */
11
+ export interface IPlaybackRate {
12
+ playbackRate: number;
13
+ timestamp: number;
14
+ clientId: string;
15
+ }
16
+ /**
17
+ * @hidden
18
+ */
19
+ export declare enum PlaybackRateEvents {
20
+ rateChange = "rateChange"
21
+ }
22
+ /**
23
+ * @hidden
24
+ */
25
+ export interface IPlaybackRateChangeEvent extends IGroupStateEvent {
26
+ playbackRate: number;
27
+ }
28
+ /**
29
+ * @hidden
30
+ */
31
+ export declare class GroupPlaybackRate extends TypedEventEmitter<IGenericTypedEvents> {
32
+ private _current;
33
+ constructor();
34
+ get current(): Readonly<IPlaybackRate>;
35
+ get rate(): number;
36
+ updatePlaybackRate(newRate: IPlaybackRate, source: ExtendedMediaSessionActionSource): boolean;
37
+ }
38
+ //# sourceMappingURL=GroupPlaybackRate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackRate.d.ts","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackRate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,kBAAkB;IAC1B,UAAU,eAAe;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAC9D,YAAY,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,iBAAiB,CAAC,mBAAmB,CAAC;IACzE,OAAO,CAAC,QAAQ,CAAgB;;IAOhC,IAAW,OAAO,IAAI,QAAQ,CAAC,aAAa,CAAC,CAE5C;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,kBAAkB,CACrB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,gCAAgC,GACzC,OAAO;CAmCb"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
+ /**
7
+ * @hidden
8
+ */
9
+ export var PlaybackRateEvents;
10
+ (function (PlaybackRateEvents) {
11
+ PlaybackRateEvents["rateChange"] = "rateChange";
12
+ })(PlaybackRateEvents || (PlaybackRateEvents = {}));
13
+ /**
14
+ * @hidden
15
+ */
16
+ export class GroupPlaybackRate extends TypedEventEmitter {
17
+ constructor() {
18
+ super();
19
+ this._current = { playbackRate: 1.0, timestamp: 0, clientId: "" };
20
+ }
21
+ get current() {
22
+ return this._current;
23
+ }
24
+ get rate() {
25
+ return this.current.playbackRate;
26
+ }
27
+ updatePlaybackRate(newRate, source) {
28
+ // Ignore state changes that are older
29
+ const current = this.current;
30
+ if (newRate.timestamp < current.timestamp) {
31
+ return false;
32
+ }
33
+ // Ignore state changes that have the same timestamp and the clientId sorts higher.
34
+ if (newRate.timestamp == current.timestamp &&
35
+ newRate.clientId.localeCompare(current.clientId) > 0) {
36
+ return false;
37
+ }
38
+ // Ignore state changes for same data object
39
+ if (current.playbackRate == newRate.playbackRate) {
40
+ return false;
41
+ }
42
+ // Update current data
43
+ this._current = newRate;
44
+ const event = {
45
+ name: PlaybackRateEvents.rateChange,
46
+ clientId: newRate.clientId,
47
+ playbackRate: newRate.playbackRate,
48
+ source,
49
+ };
50
+ // Notify listeners
51
+ this.emit(PlaybackRateEvents.rateChange, event);
52
+ return true;
53
+ }
54
+ }
55
+ //# sourceMappingURL=GroupPlaybackRate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackRate.js","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackRate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAajE;;GAEG;AACH,MAAM,CAAN,IAAY,kBAEX;AAFD,WAAY,kBAAkB;IAC1B,+CAAyB,CAAA;AAC7B,CAAC,EAFW,kBAAkB,KAAlB,kBAAkB,QAE7B;AASD;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,iBAAsC;IAGzE;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACrC,CAAC;IAEM,kBAAkB,CACrB,OAAsB,EACtB,MAAwC;QAExC,sCAAsC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,mFAAmF;QACnF,IACI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;YACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EACtD,CAAC;YACC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,MAAM,KAAK,GAA6B;YACpC,IAAI,EAAE,kBAAkB,CAAC,UAAU;YACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM;SACT,CAAC;QAEF,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAEhD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { IMediaPlayerState } from "../LiveMediaSessionCoordinator.js";
6
+ import { CoordinationWaitPoint, ExtendedMediaMetadata, ExtendedMediaSessionActionSource } from "../MediaSessionExtensions.js";
7
+ import { IGenericTypedEvents, IGroupStateEvent } from "./interfaces.js";
8
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
9
+ /**
10
+ * @hidden
11
+ */
12
+ export interface IPlaybackTrack {
13
+ metadata: ExtendedMediaMetadata | null;
14
+ waitPoints: CoordinationWaitPoint[];
15
+ timestamp: number;
16
+ clientId: string;
17
+ }
18
+ /**
19
+ * @hidden
20
+ */
21
+ export declare enum GroupPlaybackTrackEvents {
22
+ trackChange = "trackChange"
23
+ }
24
+ /**
25
+ * @hidden
26
+ */
27
+ export interface IPlaybackTrackChangeEvent extends IGroupStateEvent {
28
+ metadata: ExtendedMediaMetadata | null;
29
+ }
30
+ /**
31
+ * @hidden
32
+ */
33
+ export declare class GroupPlaybackTrack extends TypedEventEmitter<IGenericTypedEvents> {
34
+ private readonly _getMediaPlayerState;
35
+ private _current;
36
+ constructor(getMediaPlayerState: () => IMediaPlayerState);
37
+ get current(): Readonly<IPlaybackTrack>;
38
+ get metadata(): ExtendedMediaMetadata | null;
39
+ addWaitPoint(waitPoint: CoordinationWaitPoint): boolean;
40
+ findNextWaitPoint(lastWaitPoint: CoordinationWaitPoint | undefined): CoordinationWaitPoint | undefined;
41
+ updateTrack(track: IPlaybackTrack, source: ExtendedMediaSessionActionSource): boolean;
42
+ compare(metadata: ExtendedMediaMetadata | null): boolean;
43
+ static compareMetadata(current: ExtendedMediaMetadata | null, metadata: ExtendedMediaMetadata | null): boolean;
44
+ }
45
+ //# sourceMappingURL=GroupPlaybackTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackTrack.d.ts","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackTrack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,gCAAgC,EACnC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,wBAAwB;IAChC,WAAW,gBAAgB;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IAC/D,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB,CAAC,mBAAmB,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0B;IAC/D,OAAO,CAAC,QAAQ,CAAiB;gBAErB,mBAAmB,EAAE,MAAM,iBAAiB;IAWxD,IAAW,OAAO,IAAI,QAAQ,CAAC,cAAc,CAAC,CAO7C;IAED,IAAW,QAAQ,IAAI,qBAAqB,GAAG,IAAI,CAElD;IAEM,YAAY,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO;IAkBvD,iBAAiB,CACpB,aAAa,EAAE,qBAAqB,GAAG,SAAS,GACjD,qBAAqB,GAAG,SAAS;IAa7B,WAAW,CACd,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,gCAAgC,GACzC,OAAO;IAyDH,OAAO,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO;WAOjD,eAAe,CACzB,OAAO,EAAE,qBAAqB,GAAG,IAAI,EACrC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GACvC,OAAO;CAUb"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
6
+ /**
7
+ * @hidden
8
+ */
9
+ export var GroupPlaybackTrackEvents;
10
+ (function (GroupPlaybackTrackEvents) {
11
+ GroupPlaybackTrackEvents["trackChange"] = "trackChange";
12
+ })(GroupPlaybackTrackEvents || (GroupPlaybackTrackEvents = {}));
13
+ /**
14
+ * @hidden
15
+ */
16
+ export class GroupPlaybackTrack extends TypedEventEmitter {
17
+ constructor(getMediaPlayerState) {
18
+ super();
19
+ this._current = {
20
+ metadata: null,
21
+ waitPoints: [],
22
+ timestamp: 0,
23
+ clientId: "",
24
+ };
25
+ this._getMediaPlayerState = getMediaPlayerState;
26
+ }
27
+ get current() {
28
+ // Populate with sessions current metadata if null
29
+ if (!this._current.metadata) {
30
+ this._current.metadata = this._getMediaPlayerState().metadata;
31
+ }
32
+ return this._current;
33
+ }
34
+ get metadata() {
35
+ return this.current.metadata;
36
+ }
37
+ addWaitPoint(waitPoint) {
38
+ for (let i = 0; i < this._current.waitPoints.length; i++) {
39
+ const current = this._current.waitPoints[i];
40
+ if (current.position == waitPoint.position) {
41
+ // Already exists
42
+ return false;
43
+ }
44
+ else if (current.position > waitPoint.position) {
45
+ // Insert before current position
46
+ this._current.waitPoints.splice(i, 0, waitPoint);
47
+ return true;
48
+ }
49
+ }
50
+ // Append to list
51
+ this._current.waitPoints.push(waitPoint);
52
+ return true;
53
+ }
54
+ findNextWaitPoint(lastWaitPoint) {
55
+ const waitPoints = this._current.waitPoints || [];
56
+ for (const waitPoint of waitPoints) {
57
+ if (lastWaitPoint && waitPoint.position <= lastWaitPoint.position) {
58
+ continue;
59
+ }
60
+ return waitPoint;
61
+ }
62
+ return undefined;
63
+ }
64
+ updateTrack(track, source) {
65
+ // Guard against missing waitPoints collection
66
+ if (!Array.isArray(track.waitPoints)) {
67
+ track.waitPoints = [];
68
+ }
69
+ // Is this the same track?
70
+ const current = this.current;
71
+ if (GroupPlaybackTrack.compareMetadata(this.current.metadata, track.metadata)) {
72
+ // Add any dynamic wait points.
73
+ track.waitPoints.forEach((waitPoint) => {
74
+ this.addWaitPoint(waitPoint);
75
+ });
76
+ // Ignore if same playback state
77
+ if (track.timestamp == current.timestamp &&
78
+ track.clientId == current.clientId) {
79
+ return false;
80
+ }
81
+ }
82
+ // Ignore state changes that are older
83
+ if (track.timestamp < current.timestamp) {
84
+ return false;
85
+ }
86
+ // Ignore state changes that are from a clientId that sorts higher then the current one.
87
+ // - current.clientId should not be empty if current.timestamp != 0
88
+ if (track.timestamp == current.timestamp &&
89
+ track.clientId.localeCompare(current.clientId) > 0) {
90
+ return false;
91
+ }
92
+ // Update current track
93
+ this._current = track;
94
+ // Notify listeners
95
+ const event = {
96
+ name: GroupPlaybackTrackEvents.trackChange,
97
+ clientId: track.clientId,
98
+ metadata: track.metadata,
99
+ source,
100
+ };
101
+ this.emit(GroupPlaybackTrackEvents.trackChange, event);
102
+ return true;
103
+ }
104
+ compare(metadata) {
105
+ return GroupPlaybackTrack.compareMetadata(this.current.metadata, metadata);
106
+ }
107
+ static compareMetadata(current, metadata) {
108
+ // Only compare when we have two metadata instances
109
+ if (current && metadata) {
110
+ return JSON.stringify(current) == JSON.stringify(metadata);
111
+ }
112
+ else if (!current && metadata) {
113
+ return false;
114
+ }
115
+ return true;
116
+ }
117
+ }
118
+ //# sourceMappingURL=GroupPlaybackTrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackTrack.js","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackTrack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { GroupPlaybackTrack } from "./GroupPlaybackTrack.js";
6
+ import { ExtendedMediaSessionActionSource } from "../MediaSessionExtensions.js";
7
+ import { IGenericTypedEvents, IGroupStateEvent } from "./interfaces.js";
8
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
9
+ /**
10
+ * @hidden
11
+ */
12
+ export interface IPlaybackTrackData {
13
+ data: object | null;
14
+ timestamp: number;
15
+ clientId: string;
16
+ }
17
+ /**
18
+ * @hidden
19
+ */
20
+ export declare enum PlaybackTrackDataEvents {
21
+ dataChange = "dataChange"
22
+ }
23
+ /**
24
+ * @hidden
25
+ */
26
+ export interface IPlaybackTrackDataChangeEvent extends IGroupStateEvent {
27
+ data: object | null;
28
+ }
29
+ /**
30
+ * @hidden
31
+ */
32
+ export declare class GroupPlaybackTrackData extends TypedEventEmitter<IGenericTypedEvents> {
33
+ private _track;
34
+ private _current;
35
+ constructor(track: GroupPlaybackTrack);
36
+ get current(): Readonly<IPlaybackTrackData>;
37
+ get data(): object | null;
38
+ updateData(trackData: IPlaybackTrackData, source: ExtendedMediaSessionActionSource): boolean;
39
+ }
40
+ //# sourceMappingURL=GroupPlaybackTrackData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackTrackData.d.ts","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackTrackData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,kBAAkB,EAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,uBAAuB;IAC/B,UAAU,eAAe;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,6BAA8B,SAAQ,gBAAgB;IACnE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB,CAAC,mBAAmB,CAAC;IAC9E,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,KAAK,EAAE,kBAAkB;IAgBrC,IAAW,OAAO,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAEjD;IAED,IAAW,IAAI,IAAI,MAAM,GAAG,IAAI,CAE/B;IAEM,UAAU,CACb,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,gCAAgC,GACzC,OAAO;CAkCb"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { GroupPlaybackTrackEvents, } from "./GroupPlaybackTrack.js";
6
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
7
+ /**
8
+ * @hidden
9
+ */
10
+ export var PlaybackTrackDataEvents;
11
+ (function (PlaybackTrackDataEvents) {
12
+ PlaybackTrackDataEvents["dataChange"] = "dataChange";
13
+ })(PlaybackTrackDataEvents || (PlaybackTrackDataEvents = {}));
14
+ /**
15
+ * @hidden
16
+ */
17
+ export class GroupPlaybackTrackData extends TypedEventEmitter {
18
+ constructor(track) {
19
+ super();
20
+ this._track = track;
21
+ this._current = { data: null, timestamp: 0, clientId: "" };
22
+ // Listen for track changes
23
+ this._track.on(GroupPlaybackTrackEvents.trackChange, () => {
24
+ // Track changed so reset state to empty object
25
+ this._current = {
26
+ data: null,
27
+ timestamp: this._track.current.timestamp,
28
+ clientId: this._track.current.clientId,
29
+ };
30
+ });
31
+ }
32
+ get current() {
33
+ return this._current;
34
+ }
35
+ get data() {
36
+ return this.current.data;
37
+ }
38
+ updateData(trackData, source) {
39
+ // Ignore state changes that are older
40
+ const current = this.current;
41
+ if (trackData.timestamp < current.timestamp) {
42
+ return false;
43
+ }
44
+ // Ignore state changes that have the same timestamp and the clientId sorts higher.
45
+ if (trackData.timestamp == current.timestamp &&
46
+ trackData.clientId.localeCompare(current.clientId) > 0) {
47
+ return false;
48
+ }
49
+ // Ignore state changes for same data object
50
+ if (JSON.stringify(current.data) == JSON.stringify(trackData.data)) {
51
+ return false;
52
+ }
53
+ // Update current data
54
+ this._current = trackData;
55
+ // Notify listeners
56
+ const event = {
57
+ name: PlaybackTrackDataEvents.dataChange,
58
+ clientId: trackData.clientId,
59
+ data: trackData.data,
60
+ source,
61
+ };
62
+ this.emit(PlaybackTrackDataEvents.dataChange, event);
63
+ return true;
64
+ }
65
+ }
66
+ //# sourceMappingURL=GroupPlaybackTrackData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPlaybackTrackData.js","sourceRoot":"","sources":["../../../src/internals/GroupPlaybackTrackData.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAEH,wBAAwB,GAC3B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAWjE;;GAEG;AACH,MAAM,CAAN,IAAY,uBAEX;AAFD,WAAY,uBAAuB;IAC/B,oDAAyB,CAAA;AAC7B,CAAC,EAFW,uBAAuB,KAAvB,uBAAuB,QAElC;AASD;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,iBAAsC;IAI9E,YAAY,KAAyB;QACjC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAE3D,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,WAAW,EAAE,GAAG,EAAE;YACtD,+CAA+C;YAC/C,IAAI,CAAC,QAAQ,GAAG;gBACZ,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS;gBACxC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ;aACzC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAEM,UAAU,CACb,SAA6B,EAC7B,MAAwC;QAExC,sCAAsC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,mFAAmF;QACnF,IACI,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;YACxC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EACxD,CAAC;YACC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAE1B,mBAAmB;QACnB,MAAM,KAAK,GAAkC;YACzC,IAAI,EAAE,uBAAuB,CAAC,UAAU;YACxC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM;SACT,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAErD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}