@microsoft/live-share-media 0.5.1 → 1.0.0-preview.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nycrc.json +10 -10
- package/.vscode/launch.json +29 -0
- package/.vscode/settings.json +2 -0
- package/LICENSE +86 -86
- package/README.md +138 -137
- package/bin/IMediaPlayer.d.ts.map +1 -1
- package/bin/{EphemeralMediaSession.d.ts → LiveMediaSession.d.ts} +14 -21
- package/bin/LiveMediaSession.d.ts.map +1 -0
- package/bin/{EphemeralMediaSession.js → LiveMediaSession.js} +39 -37
- package/bin/LiveMediaSession.js.map +1 -0
- package/bin/{EphemeralMediaSessionCoordinator.d.ts → LiveMediaSessionCoordinator.d.ts} +5 -5
- package/bin/LiveMediaSessionCoordinator.d.ts.map +1 -0
- package/bin/{EphemeralMediaSessionCoordinator.js → LiveMediaSessionCoordinator.js} +60 -48
- package/bin/LiveMediaSessionCoordinator.js.map +1 -0
- package/bin/{EphemeralMediaSessionCoordinatorSuspension.d.ts → LiveMediaSessionCoordinatorSuspension.d.ts} +3 -3
- package/bin/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -0
- package/bin/{EphemeralMediaSessionCoordinatorSuspension.js → LiveMediaSessionCoordinatorSuspension.js} +4 -4
- package/bin/LiveMediaSessionCoordinatorSuspension.js.map +1 -0
- package/bin/MediaPlayerSynchronizer.d.ts +11 -11
- package/bin/MediaPlayerSynchronizer.d.ts.map +1 -1
- package/bin/MediaPlayerSynchronizer.js +132 -75
- package/bin/MediaPlayerSynchronizer.js.map +1 -1
- package/bin/MediaSessionActionThrottler.d.ts +1 -1
- package/bin/MediaSessionActionThrottler.d.ts.map +1 -1
- package/bin/MediaSessionActionThrottler.js.map +1 -1
- package/bin/MediaSessionExtensions.d.ts.map +1 -1
- package/bin/RepeatedActionThrottler.d.ts +2 -2
- package/bin/RepeatedActionThrottler.d.ts.map +1 -1
- package/bin/RepeatedActionThrottler.js +9 -3
- package/bin/RepeatedActionThrottler.js.map +1 -1
- package/bin/VolumeManager.d.ts +84 -0
- package/bin/VolumeManager.d.ts.map +1 -0
- package/bin/VolumeManager.js +175 -0
- package/bin/VolumeManager.js.map +1 -0
- package/bin/index.d.ts +9 -9
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +4 -4
- package/bin/index.js.map +1 -1
- package/bin/internals/GroupCoordinatorState.d.ts +12 -12
- package/bin/internals/GroupCoordinatorState.d.ts.map +1 -1
- package/bin/internals/GroupCoordinatorState.js +94 -56
- package/bin/internals/GroupCoordinatorState.js.map +1 -1
- package/bin/internals/GroupPlaybackPosition.d.ts +3 -3
- package/bin/internals/GroupPlaybackPosition.d.ts.map +1 -1
- package/bin/internals/GroupPlaybackPosition.js +24 -15
- package/bin/internals/GroupPlaybackPosition.js.map +1 -1
- package/bin/internals/GroupPlaybackTrack.d.ts +4 -4
- package/bin/internals/GroupPlaybackTrack.d.ts.map +1 -1
- package/bin/internals/GroupPlaybackTrack.js +14 -4
- package/bin/internals/GroupPlaybackTrack.js.map +1 -1
- package/bin/internals/GroupPlaybackTrackData.d.ts +3 -3
- package/bin/internals/GroupPlaybackTrackData.d.ts.map +1 -1
- package/bin/internals/GroupPlaybackTrackData.js +8 -4
- package/bin/internals/GroupPlaybackTrackData.js.map +1 -1
- package/bin/internals/GroupTransportState.d.ts +5 -5
- package/bin/internals/GroupTransportState.d.ts.map +1 -1
- package/bin/internals/GroupTransportState.js +28 -13
- package/bin/internals/GroupTransportState.js.map +1 -1
- package/bin/internals/consts.d.ts.map +1 -1
- package/bin/internals/consts.js +54 -54
- package/bin/internals/consts.js.map +1 -1
- package/bin/internals/index.d.ts +6 -6
- package/package.json +38 -38
- package/src/IMediaPlayer.ts +29 -21
- package/src/LiveMediaSession.ts +300 -0
- package/src/LiveMediaSessionCoordinator.ts +621 -0
- package/src/{EphemeralMediaSessionCoordinatorSuspension.ts → LiveMediaSessionCoordinatorSuspension.ts} +39 -31
- package/src/MediaPlayerSynchronizer.ts +627 -450
- package/src/MediaSessionActionThrottler.ts +16 -14
- package/src/MediaSessionExtensions.ts +52 -42
- package/src/RepeatedActionThrottler.ts +74 -56
- package/src/VolumeManager.ts +197 -0
- package/src/index.ts +14 -15
- package/src/internals/GroupCoordinatorState.ts +606 -446
- package/src/internals/GroupPlaybackPosition.ts +227 -193
- package/src/internals/GroupPlaybackTrack.ts +176 -147
- package/src/internals/GroupPlaybackTrackData.ts +98 -90
- package/src/internals/GroupTransportState.ts +157 -127
- package/src/internals/consts.ts +98 -80
- package/src/internals/index.ts +11 -11
- package/src/test/GroupPlaybackPosition.spec.ts +600 -340
- package/src/test/GroupPlaybackTrack.spec.ts +122 -66
- package/src/test/SharedMediaSession.spec.ts +149 -113
- package/src/test/SharedMediaSessionCoordinator.spec.ts +271 -231
- package/src/test/VolumeManager.spec.ts +219 -0
- package/tsconfig.build.json +8 -8
- package/tsconfig.json +76 -75
- package/bin/EphemeralMediaSession.d.ts.map +0 -1
- package/bin/EphemeralMediaSession.js.map +0 -1
- package/bin/EphemeralMediaSessionCoordinator.d.ts.map +0 -1
- package/bin/EphemeralMediaSessionCoordinator.js.map +0 -1
- package/bin/EphemeralMediaSessionCoordinatorSuspension.d.ts.map +0 -1
- package/bin/EphemeralMediaSessionCoordinatorSuspension.js.map +0 -1
- package/bin/VolumeLimiter.d.ts +0 -70
- package/bin/VolumeLimiter.d.ts.map +0 -1
- package/bin/VolumeLimiter.js +0 -170
- package/bin/VolumeLimiter.js.map +0 -1
- package/src/EphemeralMediaSession.ts +0 -248
- package/src/EphemeralMediaSessionCoordinator.ts +0 -461
- package/src/VolumeLimiter.ts +0 -182
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.VolumeManager = exports.LimitLevelType = void 0;
|
|
8
|
+
const live_share_1 = require("@microsoft/live-share");
|
|
9
|
+
var LimitLevelType;
|
|
10
|
+
(function (LimitLevelType) {
|
|
11
|
+
LimitLevelType[LimitLevelType["fixed"] = 0] = "fixed";
|
|
12
|
+
LimitLevelType[LimitLevelType["percentage"] = 1] = "percentage";
|
|
13
|
+
})(LimitLevelType = exports.LimitLevelType || (exports.LimitLevelType = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Smooth audio level changes when volume is modified, or if volume limiting has started/ended.
|
|
16
|
+
*/
|
|
17
|
+
class VolumeManager {
|
|
18
|
+
constructor(player) {
|
|
19
|
+
this._volumeChangeDuration = new live_share_1.TimeInterval(500);
|
|
20
|
+
// defaults to player volume
|
|
21
|
+
this._volume = 0.0;
|
|
22
|
+
this._isLimiting = false;
|
|
23
|
+
this._limitLevel = 0.1;
|
|
24
|
+
this._limitLevelType = LimitLevelType.fixed;
|
|
25
|
+
this._startTime = 0;
|
|
26
|
+
this._startVolume = 0;
|
|
27
|
+
this._running = false;
|
|
28
|
+
this._player = player;
|
|
29
|
+
this._volume = this._player.volume;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The selected volume.
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* Expressed as a value between 0.0 and 1.0. The default value is 1.0.
|
|
36
|
+
* Can be used for things like volume sliders.
|
|
37
|
+
*
|
|
38
|
+
* Does not return the current volume if limiting is enabled, but the desired volume.
|
|
39
|
+
*/
|
|
40
|
+
get volume() {
|
|
41
|
+
return this._volume;
|
|
42
|
+
}
|
|
43
|
+
set volume(value) {
|
|
44
|
+
if (value < 0 || value > 1.0) {
|
|
45
|
+
throw new Error(`VolumeManager: cannot set volume to ${value}. Level must be between 0.0 and 1.0.`);
|
|
46
|
+
}
|
|
47
|
+
this._volume = value;
|
|
48
|
+
this.startAdjusting();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Target level to lower volume to.
|
|
52
|
+
*
|
|
53
|
+
* @remarks
|
|
54
|
+
* Expressed as a value between 0.0 and 1.0. The value is applied based upon the configured
|
|
55
|
+
* `levelType`. The default value is 0.1.
|
|
56
|
+
*
|
|
57
|
+
* For a level type of `LevelType.fixed` the value is the exact level the volume will be
|
|
58
|
+
* lowered to. The default value of 0.1 would cause the volume to be lowered to 0.1.
|
|
59
|
+
*
|
|
60
|
+
* For a level type of `LevelType.percentage` the value is the percentage by which the volume
|
|
61
|
+
* level should be lowered to. The default value of 0.1 would cause the volume to be lowered
|
|
62
|
+
* to 10% of its starting value.
|
|
63
|
+
*/
|
|
64
|
+
get limitLevel() {
|
|
65
|
+
return this._limitLevel;
|
|
66
|
+
}
|
|
67
|
+
set limitLevel(value) {
|
|
68
|
+
if (value < 0 || value > 1.0) {
|
|
69
|
+
throw new Error(`VolumeManager: cannot set level to ${value}. Level must be between 0.0 and 1.0.`);
|
|
70
|
+
}
|
|
71
|
+
this._limitLevel = value;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The type of level represented by the `limitLevel` property.
|
|
75
|
+
*/
|
|
76
|
+
get limitLevelType() {
|
|
77
|
+
return this._limitLevelType;
|
|
78
|
+
}
|
|
79
|
+
set limitLevelType(value) {
|
|
80
|
+
this._limitLevelType = value;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Amount of time, in seconds, it should take to change the volume up or down to the desired level.
|
|
84
|
+
*
|
|
85
|
+
* @remarks
|
|
86
|
+
* Default `volumeChangeDuration` is 0.5 seconds.
|
|
87
|
+
*/
|
|
88
|
+
get volumeChangeDuration() {
|
|
89
|
+
return this._volumeChangeDuration.seconds;
|
|
90
|
+
}
|
|
91
|
+
set volumeChangeDuration(value) {
|
|
92
|
+
this._volumeChangeDuration.seconds = Math.abs(value);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Whether or not volume limiting is currently enabled.
|
|
96
|
+
*/
|
|
97
|
+
get isLimiting() {
|
|
98
|
+
return this._isLimiting;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Limits volume based on `limitLevel` and `limitLevelType` properties.
|
|
102
|
+
* @see `limitLevel`
|
|
103
|
+
* @see `limitLevelType`
|
|
104
|
+
*/
|
|
105
|
+
startLimiting() {
|
|
106
|
+
this._isLimiting = true;
|
|
107
|
+
this.startAdjusting();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Disables volume limit.
|
|
111
|
+
*/
|
|
112
|
+
stopLimiting() {
|
|
113
|
+
this._isLimiting = false;
|
|
114
|
+
this.startAdjusting();
|
|
115
|
+
}
|
|
116
|
+
startAdjusting() {
|
|
117
|
+
const adjustVolume = () => {
|
|
118
|
+
// Schedule next animation frame if volume change not finished
|
|
119
|
+
if (this.millisSinceVolumeChangeStart() <=
|
|
120
|
+
this._volumeChangeDuration.milliseconds) {
|
|
121
|
+
this._player.volume = this.computeInterpolatedVolume();
|
|
122
|
+
this.scheduleAnimationFrame(adjustVolume);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this._player.volume = this.computeTargetVolume();
|
|
126
|
+
this._running = false;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
this._startTime = new Date().getTime();
|
|
130
|
+
this._startVolume = this._player.volume;
|
|
131
|
+
if (!this._running) {
|
|
132
|
+
this._running = true;
|
|
133
|
+
this.scheduleAnimationFrame(adjustVolume);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
scheduleAnimationFrame(callback) {
|
|
137
|
+
if (typeof requestAnimationFrame == "function") {
|
|
138
|
+
requestAnimationFrame(callback);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
setTimeout(callback, 20);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
computeInterpolatedVolume() {
|
|
145
|
+
const volumeChangeMillis = this._volumeChangeDuration.milliseconds;
|
|
146
|
+
const volumeDifference = this.computeTargetVolume() - this._startVolume;
|
|
147
|
+
const adjustmentFromStart = (volumeDifference / volumeChangeMillis) *
|
|
148
|
+
this.millisSinceVolumeChangeStart();
|
|
149
|
+
return this._startVolume + adjustmentFromStart;
|
|
150
|
+
}
|
|
151
|
+
computeTargetVolume() {
|
|
152
|
+
if (this._limitLevelType == LimitLevelType.percentage) {
|
|
153
|
+
if (this._isLimiting) {
|
|
154
|
+
return this._volume * this._limitLevel;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return this._volume;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
if (this._isLimiting && this._volume > this._limitLevel) {
|
|
162
|
+
return this._limitLevel;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
return this._volume;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
millisSinceVolumeChangeStart() {
|
|
170
|
+
const now = new Date().getTime();
|
|
171
|
+
return now - this._startTime;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.VolumeManager = VolumeManager;
|
|
175
|
+
//# sourceMappingURL=VolumeManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeManager.js","sourceRoot":"","sources":["../src/VolumeManager.ts"],"names":[],"mappings":"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"}
|
package/bin/index.d.ts
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
3
|
* Licensed under the Microsoft Live Share SDK License.
|
|
4
4
|
*/
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
9
|
-
export * from
|
|
10
|
-
export * from
|
|
11
|
-
export * from
|
|
12
|
-
export * from
|
|
13
|
-
export * from
|
|
5
|
+
export * from "./LiveMediaSession";
|
|
6
|
+
export * from "./LiveMediaSessionCoordinator";
|
|
7
|
+
export * from "./LiveMediaSessionCoordinatorSuspension";
|
|
8
|
+
export * from "./IMediaPlayer";
|
|
9
|
+
export * from "./MediaPlayerSynchronizer";
|
|
10
|
+
export * from "./MediaSessionActionThrottler";
|
|
11
|
+
export * from "./MediaSessionExtensions";
|
|
12
|
+
export * from "./RepeatedActionThrottler";
|
|
13
|
+
export * from "./VolumeManager";
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
package/bin/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC"}
|
package/bin/index.js
CHANGED
|
@@ -18,13 +18,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
18
18
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
19
|
};
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
__exportStar(require("./
|
|
22
|
-
__exportStar(require("./
|
|
23
|
-
__exportStar(require("./
|
|
21
|
+
__exportStar(require("./LiveMediaSession"), exports);
|
|
22
|
+
__exportStar(require("./LiveMediaSessionCoordinator"), exports);
|
|
23
|
+
__exportStar(require("./LiveMediaSessionCoordinatorSuspension"), exports);
|
|
24
24
|
__exportStar(require("./IMediaPlayer"), exports);
|
|
25
25
|
__exportStar(require("./MediaPlayerSynchronizer"), exports);
|
|
26
26
|
__exportStar(require("./MediaSessionActionThrottler"), exports);
|
|
27
27
|
__exportStar(require("./MediaSessionExtensions"), exports);
|
|
28
28
|
__exportStar(require("./RepeatedActionThrottler"), exports);
|
|
29
|
-
__exportStar(require("./
|
|
29
|
+
__exportStar(require("./VolumeManager"), exports);
|
|
30
30
|
//# sourceMappingURL=index.js.map
|
package/bin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,qDAAmC;AACnC,gEAA8C;AAC9C,0EAAwD;AACxD,iDAA+B;AAC/B,4DAA0C;AAC1C,gEAA8C;AAC9C,2DAAyC;AACzC,4DAA0C;AAC1C,kDAAgC"}
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* Licensed under the Microsoft Live Share SDK License.
|
|
4
4
|
*/
|
|
5
5
|
/// <reference types="node" />
|
|
6
|
-
import { IEvent,
|
|
7
|
-
import EventEmitter from
|
|
8
|
-
import { ExtendedMediaMetadata, CoordinationWaitPoint, ExtendedMediaSessionPlaybackState, ExtendedMediaSessionActionDetails } from
|
|
9
|
-
import { GroupPlaybackTrack, IPlaybackTrack } from
|
|
10
|
-
import { GroupTransportState, ITransportState } from
|
|
11
|
-
import { GroupPlaybackPosition } from
|
|
12
|
-
import { IMediaPlayerState } from
|
|
13
|
-
import { GroupPlaybackTrackData, IPlaybackTrackData } from
|
|
6
|
+
import { IEvent, ILiveEvent, TimeInterval, IRuntimeSignaler } from "@microsoft/live-share";
|
|
7
|
+
import EventEmitter from "events";
|
|
8
|
+
import { ExtendedMediaMetadata, CoordinationWaitPoint, ExtendedMediaSessionPlaybackState, ExtendedMediaSessionActionDetails } from "../MediaSessionExtensions";
|
|
9
|
+
import { GroupPlaybackTrack, IPlaybackTrack } from "./GroupPlaybackTrack";
|
|
10
|
+
import { GroupTransportState, ITransportState } from "./GroupTransportState";
|
|
11
|
+
import { GroupPlaybackPosition } from "./GroupPlaybackPosition";
|
|
12
|
+
import { IMediaPlayerState } from "../LiveMediaSessionCoordinator";
|
|
13
|
+
import { GroupPlaybackTrackData, IPlaybackTrackData } from "./GroupPlaybackTrackData";
|
|
14
14
|
/**
|
|
15
15
|
* @hidden
|
|
16
16
|
*/
|
|
17
|
-
export interface IPositionUpdateEvent extends
|
|
17
|
+
export interface IPositionUpdateEvent extends ILiveEvent {
|
|
18
18
|
track: IPlaybackTrack;
|
|
19
19
|
trackData: IPlaybackTrackData;
|
|
20
20
|
transport: ITransportState;
|
|
@@ -25,21 +25,21 @@ export interface IPositionUpdateEvent extends IEphemeralEvent {
|
|
|
25
25
|
/**
|
|
26
26
|
* @hidden
|
|
27
27
|
*/
|
|
28
|
-
export interface ITransportCommandEvent extends
|
|
28
|
+
export interface ITransportCommandEvent extends ILiveEvent {
|
|
29
29
|
track: IPlaybackTrack;
|
|
30
30
|
position: number;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* @hidden
|
|
34
34
|
*/
|
|
35
|
-
export interface ISetTrackEvent extends
|
|
35
|
+
export interface ISetTrackEvent extends ILiveEvent {
|
|
36
36
|
metadata: ExtendedMediaMetadata | null;
|
|
37
37
|
waitPoints: CoordinationWaitPoint[];
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* @hidden
|
|
41
41
|
*/
|
|
42
|
-
export interface ISetTrackDataEvent extends
|
|
42
|
+
export interface ISetTrackDataEvent extends ILiveEvent {
|
|
43
43
|
data: object | null;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupCoordinatorState.d.ts","sourceRoot":"","sources":["../../src/internals/GroupCoordinatorState.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"GroupCoordinatorState.d.ts","sourceRoot":"","sources":["../../src/internals/GroupCoordinatorState.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,10 +45,10 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
45
45
|
// - Soft suspensions temporarily disconnect the local media session when transitioning between
|
|
46
46
|
// paused, playing, and none states. This is to give the local client time to finish any inprogress
|
|
47
47
|
// operations like sending a transport command or ending a suspension.
|
|
48
|
-
this._lastStateChange =
|
|
48
|
+
this._lastStateChange = "none";
|
|
49
49
|
this._lastStateChangeTime = 0;
|
|
50
50
|
this._runtime = runtime;
|
|
51
|
-
this._logger = new live_share_1.
|
|
51
|
+
this._logger = new live_share_1.LiveTelemetryLogger(runtime);
|
|
52
52
|
this._maxPlaybackDrift = maxPlaybackDrift;
|
|
53
53
|
this._playbackTrack = new GroupPlaybackTrack_1.GroupPlaybackTrack(getMediaPlayerState);
|
|
54
54
|
this._playbackTrackData = new GroupPlaybackTrackData_1.GroupPlaybackTrackData(this._playbackTrack);
|
|
@@ -56,7 +56,7 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
56
56
|
this._playbackPosition = new GroupPlaybackPosition_1.GroupPlaybackPosition(this._transportState, this._runtime, positionUpdateInterval);
|
|
57
57
|
this._getMediaPlayerState = getMediaPlayerState;
|
|
58
58
|
// Listen track related events
|
|
59
|
-
this._playbackTrack.on(GroupPlaybackTrack_1.GroupPlaybackTrackEvents.trackChange, evt => {
|
|
59
|
+
this._playbackTrack.on(GroupPlaybackTrack_1.GroupPlaybackTrackEvents.trackChange, (evt) => {
|
|
60
60
|
if (!this.isSuspended) {
|
|
61
61
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackChanged);
|
|
62
62
|
this.emitSetTrack(evt.metadata);
|
|
@@ -66,39 +66,52 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
// Listen for track data changes
|
|
69
|
-
this._playbackTrackData.on(GroupPlaybackTrackData_1.PlaybackTrackDataEvents.dataChange, evt => {
|
|
69
|
+
this._playbackTrackData.on(GroupPlaybackTrackData_1.PlaybackTrackDataEvents.dataChange, (evt) => {
|
|
70
70
|
if (!this.isSuspended && !this.isWaiting) {
|
|
71
71
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackDataChanged);
|
|
72
|
-
this.emitTriggerAction({
|
|
72
|
+
this.emitTriggerAction({
|
|
73
|
+
action: "datachange",
|
|
74
|
+
data: evt.data,
|
|
75
|
+
});
|
|
73
76
|
}
|
|
74
77
|
else {
|
|
75
78
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackDataChangeDelayed);
|
|
76
79
|
}
|
|
77
80
|
});
|
|
78
81
|
// Listen to transport related events
|
|
79
|
-
this._transportState.on(GroupTransportState_2.GroupTransportStateEvents.transportStateChange, evt => {
|
|
82
|
+
this._transportState.on(GroupTransportState_2.GroupTransportStateEvents.transportStateChange, (evt) => {
|
|
80
83
|
if (!this.isSuspended && !this.isWaiting) {
|
|
81
84
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TransportStateChanged, null, {
|
|
82
85
|
action: evt.action,
|
|
83
|
-
seekTime: evt.seekTime
|
|
86
|
+
seekTime: evt.seekTime,
|
|
84
87
|
});
|
|
85
88
|
// Trigger action
|
|
86
89
|
switch (evt.action) {
|
|
87
|
-
case
|
|
88
|
-
this.emitTriggerAction({
|
|
90
|
+
case "play":
|
|
91
|
+
this.emitTriggerAction({
|
|
92
|
+
action: "play",
|
|
93
|
+
seekTime: evt.seekTime,
|
|
94
|
+
});
|
|
89
95
|
break;
|
|
90
|
-
case
|
|
91
|
-
this.emitTriggerAction({
|
|
96
|
+
case "pause":
|
|
97
|
+
this.emitTriggerAction({
|
|
98
|
+
action: "pause",
|
|
99
|
+
seekTime: evt.seekTime,
|
|
100
|
+
});
|
|
92
101
|
break;
|
|
93
|
-
case
|
|
94
|
-
this.emitTriggerAction({
|
|
102
|
+
case "seekto":
|
|
103
|
+
this.emitTriggerAction({
|
|
104
|
+
action: "seekto",
|
|
105
|
+
seekTime: evt.seekTime,
|
|
106
|
+
});
|
|
95
107
|
break;
|
|
96
108
|
}
|
|
97
109
|
}
|
|
98
110
|
else {
|
|
99
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator
|
|
111
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator
|
|
112
|
+
.TransportStateChangeDelayed, null, {
|
|
100
113
|
action: evt.action,
|
|
101
|
-
seekTime: evt.seekTime
|
|
114
|
+
seekTime: evt.seekTime,
|
|
102
115
|
});
|
|
103
116
|
}
|
|
104
117
|
});
|
|
@@ -151,9 +164,9 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
151
164
|
track: this.playbackTrack.current,
|
|
152
165
|
trackData: this.playbackTrackData.current,
|
|
153
166
|
transport: this.transportState.current,
|
|
154
|
-
playbackState:
|
|
167
|
+
playbackState: "suspended",
|
|
155
168
|
position: (positionState === null || positionState === void 0 ? void 0 : positionState.position) || 0.0,
|
|
156
|
-
waitPoint: this._waitPoint
|
|
169
|
+
waitPoint: this._waitPoint,
|
|
157
170
|
};
|
|
158
171
|
}
|
|
159
172
|
else {
|
|
@@ -162,9 +175,9 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
162
175
|
track: this.playbackTrack.current,
|
|
163
176
|
trackData: this.playbackTrackData.current,
|
|
164
177
|
transport: this.transportState.current,
|
|
165
|
-
playbackState: this._waitPoint ?
|
|
178
|
+
playbackState: this._waitPoint ? "waiting" : playbackState,
|
|
166
179
|
position: (positionState === null || positionState === void 0 ? void 0 : positionState.position) || 0.0,
|
|
167
|
-
waitPoint: this._waitPoint
|
|
180
|
+
waitPoint: this._waitPoint,
|
|
168
181
|
};
|
|
169
182
|
}
|
|
170
183
|
}
|
|
@@ -175,10 +188,12 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
175
188
|
metadata: event.metadata,
|
|
176
189
|
waitPoints: event.waitPoints,
|
|
177
190
|
timestamp: event.timestamp,
|
|
178
|
-
clientId: event.clientId ||
|
|
191
|
+
clientId: event.clientId || "",
|
|
179
192
|
});
|
|
180
193
|
if (updated) {
|
|
181
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator.RemoteSetTrackReceived, null, {
|
|
194
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator.RemoteSetTrackReceived, null, {
|
|
195
|
+
correlationId: live_share_1.LiveTelemetryLogger.formatCorrelationId(event.clientId, event.timestamp),
|
|
196
|
+
});
|
|
182
197
|
}
|
|
183
198
|
}
|
|
184
199
|
handleSetTrackData(event, local) {
|
|
@@ -187,10 +202,12 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
187
202
|
const updated = this.playbackTrackData.updateData({
|
|
188
203
|
data: event.data,
|
|
189
204
|
timestamp: event.timestamp,
|
|
190
|
-
clientId: event.clientId ||
|
|
205
|
+
clientId: event.clientId || "",
|
|
191
206
|
});
|
|
192
207
|
if (updated) {
|
|
193
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator.RemoteSetTrackReceived, null, {
|
|
208
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator.RemoteSetTrackReceived, null, {
|
|
209
|
+
correlationId: live_share_1.LiveTelemetryLogger.formatCorrelationId(event.clientId, event.timestamp),
|
|
210
|
+
});
|
|
194
211
|
}
|
|
195
212
|
}
|
|
196
213
|
handleTransportCommand(event, local) {
|
|
@@ -201,11 +218,11 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
201
218
|
// Update playback state
|
|
202
219
|
let playbackState = this.transportState.playbackState;
|
|
203
220
|
switch (event.name) {
|
|
204
|
-
case
|
|
205
|
-
playbackState =
|
|
221
|
+
case "play":
|
|
222
|
+
playbackState = "playing";
|
|
206
223
|
break;
|
|
207
|
-
case
|
|
208
|
-
playbackState =
|
|
224
|
+
case "pause":
|
|
225
|
+
playbackState = "paused";
|
|
209
226
|
break;
|
|
210
227
|
}
|
|
211
228
|
// Try to update playback state
|
|
@@ -213,20 +230,29 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
213
230
|
playbackState: playbackState,
|
|
214
231
|
startPosition: event.position,
|
|
215
232
|
timestamp: event.timestamp,
|
|
216
|
-
clientId: event.clientId ||
|
|
233
|
+
clientId: event.clientId || "",
|
|
217
234
|
};
|
|
218
235
|
const updated = this.transportState.updateState(newState);
|
|
219
236
|
if (updated) {
|
|
220
|
-
const correlationId = live_share_1.
|
|
237
|
+
const correlationId = live_share_1.LiveTelemetryLogger.formatCorrelationId(event.clientId, event.timestamp);
|
|
221
238
|
switch (event.name) {
|
|
222
|
-
case
|
|
223
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
|
|
239
|
+
case "play":
|
|
240
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
|
|
241
|
+
.RemotePlayReceived, null, {
|
|
242
|
+
correlationId: correlationId,
|
|
243
|
+
});
|
|
224
244
|
break;
|
|
225
|
-
case
|
|
226
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
|
|
245
|
+
case "pause":
|
|
246
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
|
|
247
|
+
.RemotePauseReceived, null, {
|
|
248
|
+
correlationId: correlationId,
|
|
249
|
+
});
|
|
227
250
|
break;
|
|
228
|
-
case
|
|
229
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
|
|
251
|
+
case "seekTo":
|
|
252
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
|
|
253
|
+
.RemoteSeekToReceived, null, {
|
|
254
|
+
correlationId: correlationId,
|
|
255
|
+
});
|
|
230
256
|
break;
|
|
231
257
|
}
|
|
232
258
|
}
|
|
@@ -242,7 +268,7 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
242
268
|
// Update transport state if needed
|
|
243
269
|
// - Ignore transport state changes if the client has ended as this will cause the local
|
|
244
270
|
// player to start playback even though the video may have ended for everyone.
|
|
245
|
-
if (event.playbackState !=
|
|
271
|
+
if (event.playbackState != "ended") {
|
|
246
272
|
this.transportState.updateState(event.transport);
|
|
247
273
|
}
|
|
248
274
|
// Ensure change is for current transport state
|
|
@@ -253,7 +279,7 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
253
279
|
waitPoint: event.waitPoint,
|
|
254
280
|
position: event.position,
|
|
255
281
|
timestamp: event.timestamp,
|
|
256
|
-
clientId: event.clientId ||
|
|
282
|
+
clientId: event.clientId || "",
|
|
257
283
|
};
|
|
258
284
|
this.playbackPosition.UpdatePlaybackPosition(position);
|
|
259
285
|
// Ensure local media session is in sync with group
|
|
@@ -263,13 +289,15 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
263
289
|
// the rest of the group while the local player is trying to to seek to a
|
|
264
290
|
// new position.
|
|
265
291
|
switch (event.playbackState) {
|
|
266
|
-
case
|
|
267
|
-
case
|
|
268
|
-
case
|
|
292
|
+
case "none":
|
|
293
|
+
case "paused":
|
|
294
|
+
case "playing":
|
|
269
295
|
if (event.playbackState != this._lastStateChange) {
|
|
270
|
-
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator
|
|
296
|
+
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator
|
|
297
|
+
.BeginSoftSuspension, null, { playbackState: event.playbackState });
|
|
271
298
|
this._lastStateChange = event.playbackState;
|
|
272
|
-
this._lastStateChangeTime =
|
|
299
|
+
this._lastStateChangeTime =
|
|
300
|
+
live_share_1.LiveEvent.getTimestamp();
|
|
273
301
|
}
|
|
274
302
|
break;
|
|
275
303
|
}
|
|
@@ -293,7 +321,7 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
293
321
|
syncLocalMediaSession() {
|
|
294
322
|
return __awaiter(this, void 0, void 0, function* () {
|
|
295
323
|
// Skip further syncs if we're waiting or in a "soft suspension".
|
|
296
|
-
const softSuspensionDelta = live_share_1.
|
|
324
|
+
const softSuspensionDelta = live_share_1.LiveEvent.getTimestamp() - this._lastStateChangeTime;
|
|
297
325
|
if (!this.isWaiting && softSuspensionDelta >= 1000) {
|
|
298
326
|
let { metadata, trackData, positionState, playbackState } = this._getMediaPlayerState();
|
|
299
327
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.CheckingForSyncIssues);
|
|
@@ -309,7 +337,8 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
309
337
|
// else has finished the video.
|
|
310
338
|
// - Should another user seek or press play after the video has ended that will cause
|
|
311
339
|
// a transport action to trigger which will take the player out of the ended state.
|
|
312
|
-
if (playbackState != "ended" &&
|
|
340
|
+
if (playbackState != "ended" &&
|
|
341
|
+
!this._playbackPosition.trackEnded) {
|
|
313
342
|
// Ensure we have a position
|
|
314
343
|
let position = positionState === null || positionState === void 0 ? void 0 : positionState.position;
|
|
315
344
|
if (position == undefined) {
|
|
@@ -318,32 +347,41 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
318
347
|
// Check for catchup
|
|
319
348
|
// - Target can return -1 in cases where there is no position tracking data
|
|
320
349
|
const target = this.playbackPosition.targetPosition;
|
|
321
|
-
if (target >= 0.0 &&
|
|
350
|
+
if (target >= 0.0 &&
|
|
351
|
+
Math.abs(target - position) >=
|
|
352
|
+
this._maxPlaybackDrift.seconds) {
|
|
322
353
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.PositionOutOfSync, null, {
|
|
323
354
|
current: position,
|
|
324
|
-
target: target
|
|
355
|
+
target: target,
|
|
356
|
+
});
|
|
357
|
+
yield this.emitTriggerAction({
|
|
358
|
+
action: "catchup",
|
|
359
|
+
seekTime: target,
|
|
325
360
|
});
|
|
326
|
-
yield this.emitTriggerAction({ action: 'catchup', seekTime: target });
|
|
327
361
|
}
|
|
328
362
|
// Sync transport state
|
|
329
363
|
if (this.transportState.playbackState != playbackState) {
|
|
330
364
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TransportOutOfSync, null, {
|
|
331
365
|
current: playbackState,
|
|
332
|
-
target: this.transportState.playbackState
|
|
366
|
+
target: this.transportState.playbackState,
|
|
333
367
|
});
|
|
334
368
|
switch (this.transportState.playbackState) {
|
|
335
|
-
case
|
|
336
|
-
yield this.emitTriggerAction({ action:
|
|
369
|
+
case "playing":
|
|
370
|
+
yield this.emitTriggerAction({ action: "play" });
|
|
337
371
|
break;
|
|
338
|
-
case
|
|
339
|
-
yield this.emitTriggerAction({ action:
|
|
372
|
+
case "paused":
|
|
373
|
+
yield this.emitTriggerAction({ action: "pause" });
|
|
340
374
|
break;
|
|
341
375
|
}
|
|
342
376
|
}
|
|
343
377
|
// Sync track data
|
|
344
|
-
if (JSON.stringify(this.playbackTrackData.data) !=
|
|
378
|
+
if (JSON.stringify(this.playbackTrackData.data) !=
|
|
379
|
+
JSON.stringify(trackData)) {
|
|
345
380
|
this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackDataOutOfSync);
|
|
346
|
-
yield this.emitTriggerAction({
|
|
381
|
+
yield this.emitTriggerAction({
|
|
382
|
+
action: "datachange",
|
|
383
|
+
data: this.playbackTrackData.data,
|
|
384
|
+
});
|
|
347
385
|
}
|
|
348
386
|
}
|
|
349
387
|
}
|
|
@@ -353,12 +391,12 @@ class GroupCoordinatorState extends events_1.default {
|
|
|
353
391
|
// Reset tracking states
|
|
354
392
|
this._waitPoint = undefined;
|
|
355
393
|
// Trigger settrack action
|
|
356
|
-
this.emitTriggerAction({ action:
|
|
394
|
+
this.emitTriggerAction({ action: "settrack", metadata: metadata });
|
|
357
395
|
}
|
|
358
396
|
emitTriggerAction(details) {
|
|
359
397
|
const evt = {
|
|
360
398
|
name: GroupCoordinatorStateEvents.triggeraction,
|
|
361
|
-
details: details
|
|
399
|
+
details: details,
|
|
362
400
|
};
|
|
363
401
|
this.emit(GroupCoordinatorStateEvents.triggeraction, evt);
|
|
364
402
|
}
|