@microsoft/live-share-media 1.0.0-preview.11 → 1.0.0-preview.12

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 (86) hide show
  1. package/README.md +1 -1
  2. package/bin/EphemeralMediaSession.d.ts +102 -0
  3. package/bin/EphemeralMediaSession.d.ts.map +1 -0
  4. package/bin/EphemeralMediaSession.js +226 -0
  5. package/bin/EphemeralMediaSession.js.map +1 -0
  6. package/bin/EphemeralMediaSessionCoordinator.d.ts +228 -0
  7. package/bin/EphemeralMediaSessionCoordinator.d.ts.map +1 -0
  8. package/bin/EphemeralMediaSessionCoordinator.js +396 -0
  9. package/bin/EphemeralMediaSessionCoordinator.js.map +1 -0
  10. package/bin/EphemeralMediaSessionCoordinatorSuspension.d.ts +20 -0
  11. package/bin/EphemeralMediaSessionCoordinatorSuspension.d.ts.map +1 -0
  12. package/bin/EphemeralMediaSessionCoordinatorSuspension.js +28 -0
  13. package/bin/EphemeralMediaSessionCoordinatorSuspension.js.map +1 -0
  14. package/bin/IMediaPlayer.d.ts +21 -0
  15. package/bin/IMediaPlayer.d.ts.map +1 -0
  16. package/bin/IMediaPlayer.js +7 -0
  17. package/bin/IMediaPlayer.js.map +1 -0
  18. package/bin/LiveMediaSession.d.ts +95 -0
  19. package/bin/LiveMediaSession.d.ts.map +1 -0
  20. package/bin/LiveMediaSession.js +232 -0
  21. package/bin/LiveMediaSession.js.map +1 -0
  22. package/bin/LiveMediaSessionCoordinator.d.ts +228 -0
  23. package/bin/LiveMediaSessionCoordinator.d.ts.map +1 -0
  24. package/bin/LiveMediaSessionCoordinator.js +408 -0
  25. package/bin/LiveMediaSessionCoordinator.js.map +1 -0
  26. package/bin/LiveMediaSessionCoordinatorSuspension.d.ts +20 -0
  27. package/bin/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -0
  28. package/bin/LiveMediaSessionCoordinatorSuspension.js +28 -0
  29. package/bin/LiveMediaSessionCoordinatorSuspension.js.map +1 -0
  30. package/bin/MediaPlayerSynchronizer.d.ts +164 -0
  31. package/bin/MediaPlayerSynchronizer.d.ts.map +1 -0
  32. package/bin/MediaPlayerSynchronizer.js +469 -0
  33. package/bin/MediaPlayerSynchronizer.js.map +1 -0
  34. package/bin/MediaSessionActionThrottler.d.ts +12 -0
  35. package/bin/MediaSessionActionThrottler.d.ts.map +1 -0
  36. package/bin/MediaSessionActionThrottler.js +14 -0
  37. package/bin/MediaSessionActionThrottler.js.map +1 -0
  38. package/bin/MediaSessionExtensions.d.ts +35 -0
  39. package/bin/MediaSessionExtensions.d.ts.map +1 -0
  40. package/bin/MediaSessionExtensions.js +13 -0
  41. package/bin/MediaSessionExtensions.js.map +1 -0
  42. package/bin/RepeatedActionThrottler.d.ts +20 -0
  43. package/bin/RepeatedActionThrottler.d.ts.map +1 -0
  44. package/bin/RepeatedActionThrottler.js +63 -0
  45. package/bin/RepeatedActionThrottler.js.map +1 -0
  46. package/bin/VolumeLimiter.d.ts +70 -0
  47. package/bin/VolumeLimiter.d.ts.map +1 -0
  48. package/bin/VolumeLimiter.js +170 -0
  49. package/bin/VolumeLimiter.js.map +1 -0
  50. package/bin/VolumeManager.d.ts +84 -0
  51. package/bin/VolumeManager.d.ts.map +1 -0
  52. package/bin/VolumeManager.js +175 -0
  53. package/bin/VolumeManager.js.map +1 -0
  54. package/bin/index.d.ts +14 -0
  55. package/bin/index.d.ts.map +1 -0
  56. package/bin/index.js +30 -0
  57. package/bin/index.js.map +1 -0
  58. package/bin/internals/GroupCoordinatorState.d.ts +93 -0
  59. package/bin/internals/GroupCoordinatorState.d.ts.map +1 -0
  60. package/bin/internals/GroupCoordinatorState.js +405 -0
  61. package/bin/internals/GroupCoordinatorState.js.map +1 -0
  62. package/bin/internals/GroupPlaybackPosition.d.ts +67 -0
  63. package/bin/internals/GroupPlaybackPosition.d.ts.map +1 -0
  64. package/bin/internals/GroupPlaybackPosition.js +167 -0
  65. package/bin/internals/GroupPlaybackPosition.js.map +1 -0
  66. package/bin/internals/GroupPlaybackTrack.d.ts +46 -0
  67. package/bin/internals/GroupPlaybackTrack.d.ts.map +1 -0
  68. package/bin/internals/GroupPlaybackTrack.js +122 -0
  69. package/bin/internals/GroupPlaybackTrack.js.map +1 -0
  70. package/bin/internals/GroupPlaybackTrackData.d.ts +40 -0
  71. package/bin/internals/GroupPlaybackTrackData.d.ts.map +1 -0
  72. package/bin/internals/GroupPlaybackTrackData.js +70 -0
  73. package/bin/internals/GroupPlaybackTrackData.js.map +1 -0
  74. package/bin/internals/GroupTransportState.d.ts +49 -0
  75. package/bin/internals/GroupTransportState.d.ts.map +1 -0
  76. package/bin/internals/GroupTransportState.js +112 -0
  77. package/bin/internals/GroupTransportState.js.map +1 -0
  78. package/bin/internals/consts.d.ts +73 -0
  79. package/bin/internals/consts.d.ts.map +1 -0
  80. package/bin/internals/consts.js +82 -0
  81. package/bin/internals/consts.js.map +1 -0
  82. package/bin/internals/index.d.ts +11 -0
  83. package/bin/internals/index.d.ts.map +1 -0
  84. package/bin/internals/index.js +27 -0
  85. package/bin/internals/index.js.map +1 -0
  86. package/package.json +3 -3
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ /// <reference types="node" />
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
+ /**
15
+ * @hidden
16
+ */
17
+ export interface IPositionUpdateEvent extends ILiveEvent {
18
+ track: IPlaybackTrack;
19
+ trackData: IPlaybackTrackData;
20
+ transport: ITransportState;
21
+ playbackState: ExtendedMediaSessionPlaybackState;
22
+ position: number;
23
+ waitPoint?: CoordinationWaitPoint;
24
+ }
25
+ /**
26
+ * @hidden
27
+ */
28
+ export interface ITransportCommandEvent extends ILiveEvent {
29
+ track: IPlaybackTrack;
30
+ position: number;
31
+ }
32
+ /**
33
+ * @hidden
34
+ */
35
+ export interface ISetTrackEvent extends ILiveEvent {
36
+ metadata: ExtendedMediaMetadata | null;
37
+ waitPoints: CoordinationWaitPoint[];
38
+ }
39
+ /**
40
+ * @hidden
41
+ */
42
+ export interface ISetTrackDataEvent extends ILiveEvent {
43
+ data: object | null;
44
+ }
45
+ /**
46
+ * @hidden
47
+ */
48
+ export interface ITriggerActionEvent extends IEvent {
49
+ details: ExtendedMediaSessionActionDetails;
50
+ }
51
+ /**
52
+ * @hidden
53
+ */
54
+ export declare enum GroupCoordinatorStateEvents {
55
+ newwaitpoint = "newwaitpoint",
56
+ triggeraction = "triggeraction"
57
+ }
58
+ /**
59
+ * @hidden
60
+ */
61
+ export declare class GroupCoordinatorState extends EventEmitter {
62
+ private readonly _runtime;
63
+ private readonly _logger;
64
+ private readonly _maxPlaybackDrift;
65
+ private _getMediaPlayerState;
66
+ private _playbackTrack;
67
+ private _playbackTrackData;
68
+ private _transportState;
69
+ private _playbackPosition;
70
+ private _suspensionCnt;
71
+ private _waitPoint?;
72
+ private _lastStateChange;
73
+ private _lastStateChangeTime;
74
+ constructor(runtime: IRuntimeSignaler, maxPlaybackDrift: TimeInterval, positionUpdateInterval: TimeInterval, getMediaPlayerState: () => IMediaPlayerState);
75
+ get playbackTrack(): GroupPlaybackTrack;
76
+ get playbackTrackData(): GroupPlaybackTrackData;
77
+ get transportState(): GroupTransportState;
78
+ get playbackPosition(): GroupPlaybackPosition;
79
+ get waitingAt(): CoordinationWaitPoint | undefined;
80
+ get isSuspended(): boolean;
81
+ get isWaiting(): boolean;
82
+ beginSuspension(waitPoint?: CoordinationWaitPoint): void;
83
+ endSuspension(syncState: boolean): void;
84
+ createPositionUpdateEvent(state: IMediaPlayerState): Partial<IPositionUpdateEvent>;
85
+ handleSetTrack(event: ISetTrackEvent, local: boolean): void;
86
+ handleSetTrackData(event: ISetTrackDataEvent, local: boolean): void;
87
+ handleTransportCommand(event: ITransportCommandEvent, local: boolean): void;
88
+ handlePositionUpdate(event: IPositionUpdateEvent, local: boolean): void;
89
+ syncLocalMediaSession(): Promise<void>;
90
+ private emitSetTrack;
91
+ private emitTriggerAction;
92
+ }
93
+ //# sourceMappingURL=GroupCoordinatorState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupCoordinatorState.d.ts","sourceRoot":"","sources":["../../src/internals/GroupCoordinatorState.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EACH,MAAM,EACN,UAAU,EAEV,YAAY,EACZ,gBAAgB,EAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACrB,iCAAiC,EACjC,iCAAiC,EACpC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,kBAAkB,EAElB,cAAc,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACH,qBAAqB,EAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EACH,sBAAsB,EAEtB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACpD,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,eAAe,CAAC;IAC3B,aAAa,EAAE,iCAAiC,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACtD,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,UAAU;IAC9C,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IAClD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,MAAM;IAC/C,OAAO,EAAE,iCAAiC,CAAC;CAC9C;AAED;;GAEG;AACH,oBAAY,2BAA2B;IACnC,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;CAClC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,oBAAoB,CAA0B;IAGtD,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,iBAAiB,CAAwB;IAGjD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,UAAU,CAAC,CAAwB;IAM3C,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,oBAAoB,CAAa;gBAGrC,OAAO,EAAE,gBAAgB,EACzB,gBAAgB,EAAE,YAAY,EAC9B,sBAAsB,EAAE,YAAY,EACpC,mBAAmB,EAAE,MAAM,iBAAiB;IA2GhD,IAAW,aAAa,IAAI,kBAAkB,CAE7C;IAED,IAAW,iBAAiB,IAAI,sBAAsB,CAErD;IAED,IAAW,cAAc,IAAI,mBAAmB,CAE/C;IAED,IAAW,gBAAgB,IAAI,qBAAqB,CAEnD;IAED,IAAW,SAAS,IAAI,qBAAqB,GAAG,SAAS,CAExD;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,SAAS,IAAI,OAAO,CAE9B;IAEM,eAAe,CAAC,SAAS,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAYxD,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAYvC,yBAAyB,CAC5B,KAAK,EAAE,iBAAiB,GACzB,OAAO,CAAC,oBAAoB,CAAC;IAyBzB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAwB3D,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAuBnE,sBAAsB,CACzB,KAAK,EAAE,sBAAsB,EAC7B,KAAK,EAAE,OAAO,GACf,IAAI;IAkEA,oBAAoB,CACvB,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,OAAO,GACf,IAAI;IAqEM,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA+FnD,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,iBAAiB;CAS5B"}
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Microsoft Corporation. All rights reserved.
4
+ * Licensed under the Microsoft Live Share SDK License.
5
+ */
6
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
+ return new (P || (P = Promise))(function (resolve, reject) {
9
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
13
+ });
14
+ };
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.GroupCoordinatorState = exports.GroupCoordinatorStateEvents = void 0;
20
+ const live_share_1 = require("@microsoft/live-share");
21
+ const events_1 = __importDefault(require("events"));
22
+ const GroupPlaybackTrack_1 = require("./GroupPlaybackTrack");
23
+ const GroupTransportState_1 = require("./GroupTransportState");
24
+ const GroupPlaybackPosition_1 = require("./GroupPlaybackPosition");
25
+ const GroupTransportState_2 = require("./GroupTransportState");
26
+ const GroupPlaybackTrackData_1 = require("./GroupPlaybackTrackData");
27
+ const consts_1 = require("./consts");
28
+ /**
29
+ * @hidden
30
+ */
31
+ var GroupCoordinatorStateEvents;
32
+ (function (GroupCoordinatorStateEvents) {
33
+ GroupCoordinatorStateEvents["newwaitpoint"] = "newwaitpoint";
34
+ GroupCoordinatorStateEvents["triggeraction"] = "triggeraction";
35
+ })(GroupCoordinatorStateEvents = exports.GroupCoordinatorStateEvents || (exports.GroupCoordinatorStateEvents = {}));
36
+ /**
37
+ * @hidden
38
+ */
39
+ class GroupCoordinatorState extends events_1.default {
40
+ constructor(runtime, maxPlaybackDrift, positionUpdateInterval, getMediaPlayerState) {
41
+ super();
42
+ // Suspension tracking
43
+ this._suspensionCnt = 0;
44
+ // "Soft Suspension" tracking
45
+ // - Soft suspensions temporarily disconnect the local media session when transitioning between
46
+ // paused, playing, and none states. This is to give the local client time to finish any inprogress
47
+ // operations like sending a transport command or ending a suspension.
48
+ this._lastStateChange = "none";
49
+ this._lastStateChangeTime = 0;
50
+ this._runtime = runtime;
51
+ this._logger = new live_share_1.LiveTelemetryLogger(runtime);
52
+ this._maxPlaybackDrift = maxPlaybackDrift;
53
+ this._playbackTrack = new GroupPlaybackTrack_1.GroupPlaybackTrack(getMediaPlayerState);
54
+ this._playbackTrackData = new GroupPlaybackTrackData_1.GroupPlaybackTrackData(this._playbackTrack);
55
+ this._transportState = new GroupTransportState_1.GroupTransportState(this._playbackTrack, getMediaPlayerState);
56
+ this._playbackPosition = new GroupPlaybackPosition_1.GroupPlaybackPosition(this._transportState, this._runtime, positionUpdateInterval);
57
+ this._getMediaPlayerState = getMediaPlayerState;
58
+ // Listen track related events
59
+ this._playbackTrack.on(GroupPlaybackTrack_1.GroupPlaybackTrackEvents.trackChange, (evt) => {
60
+ if (!this.isSuspended) {
61
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackChanged);
62
+ this.emitSetTrack(evt.metadata);
63
+ }
64
+ else {
65
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackChangeDelayed);
66
+ }
67
+ });
68
+ // Listen for track data changes
69
+ this._playbackTrackData.on(GroupPlaybackTrackData_1.PlaybackTrackDataEvents.dataChange, (evt) => {
70
+ if (!this.isSuspended && !this.isWaiting) {
71
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackDataChanged);
72
+ this.emitTriggerAction({
73
+ action: "datachange",
74
+ data: evt.data,
75
+ });
76
+ }
77
+ else {
78
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackDataChangeDelayed);
79
+ }
80
+ });
81
+ // Listen to transport related events
82
+ this._transportState.on(GroupTransportState_2.GroupTransportStateEvents.transportStateChange, (evt) => {
83
+ if (!this.isSuspended && !this.isWaiting) {
84
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TransportStateChanged, null, {
85
+ action: evt.action,
86
+ seekTime: evt.seekTime,
87
+ });
88
+ // Trigger action
89
+ switch (evt.action) {
90
+ case "play":
91
+ this.emitTriggerAction({
92
+ action: "play",
93
+ seekTime: evt.seekTime,
94
+ });
95
+ break;
96
+ case "pause":
97
+ this.emitTriggerAction({
98
+ action: "pause",
99
+ seekTime: evt.seekTime,
100
+ });
101
+ break;
102
+ case "seekto":
103
+ this.emitTriggerAction({
104
+ action: "seekto",
105
+ seekTime: evt.seekTime,
106
+ });
107
+ break;
108
+ }
109
+ }
110
+ else {
111
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator
112
+ .TransportStateChangeDelayed, null, {
113
+ action: evt.action,
114
+ seekTime: evt.seekTime,
115
+ });
116
+ }
117
+ });
118
+ }
119
+ get playbackTrack() {
120
+ return this._playbackTrack;
121
+ }
122
+ get playbackTrackData() {
123
+ return this._playbackTrackData;
124
+ }
125
+ get transportState() {
126
+ return this._transportState;
127
+ }
128
+ get playbackPosition() {
129
+ return this._playbackPosition;
130
+ }
131
+ get waitingAt() {
132
+ return this._waitPoint;
133
+ }
134
+ get isSuspended() {
135
+ return this._suspensionCnt > 0;
136
+ }
137
+ get isWaiting() {
138
+ return !!this._waitPoint;
139
+ }
140
+ beginSuspension(waitPoint) {
141
+ this._suspensionCnt++;
142
+ if (waitPoint) {
143
+ // Save most recent wait point
144
+ this._waitPoint = waitPoint;
145
+ // Add to track state if dynamic wait point
146
+ this.playbackTrack.addWaitPoint(waitPoint);
147
+ }
148
+ }
149
+ endSuspension(syncState) {
150
+ if (this._suspensionCnt == 0) {
151
+ throw new Error(`Too many suspensions.`);
152
+ }
153
+ this._suspensionCnt--;
154
+ if (this._suspensionCnt == 0 && syncState) {
155
+ // Sync media session to group
156
+ this.syncLocalMediaSession();
157
+ }
158
+ }
159
+ createPositionUpdateEvent(state) {
160
+ const { positionState, playbackState } = state;
161
+ if (this.isSuspended) {
162
+ // Report suspension state
163
+ return {
164
+ track: this.playbackTrack.current,
165
+ trackData: this.playbackTrackData.current,
166
+ transport: this.transportState.current,
167
+ playbackState: "suspended",
168
+ position: (positionState === null || positionState === void 0 ? void 0 : positionState.position) || 0.0,
169
+ waitPoint: this._waitPoint,
170
+ };
171
+ }
172
+ else {
173
+ // Report current position
174
+ return {
175
+ track: this.playbackTrack.current,
176
+ trackData: this.playbackTrackData.current,
177
+ transport: this.transportState.current,
178
+ playbackState: this._waitPoint ? "waiting" : playbackState,
179
+ position: (positionState === null || positionState === void 0 ? void 0 : positionState.position) || 0.0,
180
+ waitPoint: this._waitPoint,
181
+ };
182
+ }
183
+ }
184
+ handleSetTrack(event, local) {
185
+ // Update shared track
186
+ // - Will trigger 'trackChange' event to update media session
187
+ const updated = this.playbackTrack.updateTrack({
188
+ metadata: event.metadata,
189
+ waitPoints: event.waitPoints,
190
+ timestamp: event.timestamp,
191
+ clientId: event.clientId || "",
192
+ });
193
+ if (updated) {
194
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator.RemoteSetTrackReceived, null, {
195
+ correlationId: live_share_1.LiveTelemetryLogger.formatCorrelationId(event.clientId, event.timestamp),
196
+ });
197
+ }
198
+ }
199
+ handleSetTrackData(event, local) {
200
+ // Update shared track data
201
+ // - Will trigger 'dataChange' event to update media session
202
+ const updated = this.playbackTrackData.updateData({
203
+ data: event.data,
204
+ timestamp: event.timestamp,
205
+ clientId: event.clientId || "",
206
+ });
207
+ if (updated) {
208
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator.RemoteSetTrackReceived, null, {
209
+ correlationId: live_share_1.LiveTelemetryLogger.formatCorrelationId(event.clientId, event.timestamp),
210
+ });
211
+ }
212
+ }
213
+ handleTransportCommand(event, local) {
214
+ // Ensure change is for current track
215
+ // - Will trigger a 'trackChange' event if newer track.
216
+ this.playbackTrack.updateTrack(event.track);
217
+ if (this.playbackTrack.compare(event.track.metadata)) {
218
+ // Update playback state
219
+ let playbackState = this.transportState.playbackState;
220
+ switch (event.name) {
221
+ case "play":
222
+ playbackState = "playing";
223
+ break;
224
+ case "pause":
225
+ playbackState = "paused";
226
+ break;
227
+ }
228
+ // Try to update playback state
229
+ const newState = {
230
+ playbackState: playbackState,
231
+ startPosition: event.position,
232
+ timestamp: event.timestamp,
233
+ clientId: event.clientId || "",
234
+ };
235
+ const updated = this.transportState.updateState(newState);
236
+ if (updated) {
237
+ const correlationId = live_share_1.LiveTelemetryLogger.formatCorrelationId(event.clientId, event.timestamp);
238
+ switch (event.name) {
239
+ case "play":
240
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
241
+ .RemotePlayReceived, null, {
242
+ correlationId: correlationId,
243
+ });
244
+ break;
245
+ case "pause":
246
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
247
+ .RemotePauseReceived, null, {
248
+ correlationId: correlationId,
249
+ });
250
+ break;
251
+ case "seekTo":
252
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.SessionCoordinator
253
+ .RemoteSeekToReceived, null, {
254
+ correlationId: correlationId,
255
+ });
256
+ break;
257
+ }
258
+ }
259
+ }
260
+ }
261
+ handlePositionUpdate(event, local) {
262
+ // Ensure change is for current track
263
+ // - Will trigger a 'trackChange' event if newer track.
264
+ this.playbackTrack.updateTrack(event.track);
265
+ if (this.playbackTrack.compare(event.track.metadata)) {
266
+ // Ensure we have the latest track data
267
+ this.playbackTrackData.updateData(event.trackData);
268
+ // Update transport state if needed
269
+ // - Ignore transport state changes if the client has ended as this will cause the local
270
+ // player to start playback even though the video may have ended for everyone.
271
+ if (event.playbackState != "ended") {
272
+ this.transportState.updateState(event.transport);
273
+ }
274
+ // Ensure change is for current transport state
275
+ if (this.transportState.compare(event.transport)) {
276
+ // Update playback position
277
+ const position = {
278
+ playbackState: event.playbackState,
279
+ waitPoint: event.waitPoint,
280
+ position: event.position,
281
+ timestamp: event.timestamp,
282
+ clientId: event.clientId || "",
283
+ };
284
+ this.playbackPosition.UpdatePlaybackPosition(position);
285
+ // Ensure local media session is in sync with group
286
+ if (local && !this.isSuspended) {
287
+ // Begin a "soft suspension" on select state changes
288
+ // - This is needed because the catchup logic can try to sink the client with
289
+ // the rest of the group while the local player is trying to to seek to a
290
+ // new position.
291
+ switch (event.playbackState) {
292
+ case "none":
293
+ case "paused":
294
+ case "playing":
295
+ if (event.playbackState != this._lastStateChange) {
296
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator
297
+ .BeginSoftSuspension, null, { playbackState: event.playbackState });
298
+ this._lastStateChange = event.playbackState;
299
+ this._lastStateChangeTime =
300
+ live_share_1.LiveShareClient.getTimestamp();
301
+ }
302
+ break;
303
+ }
304
+ // Are we waiting?
305
+ if (this.isWaiting) {
306
+ // Check for end of waiting
307
+ if (this.playbackPosition.clientsWaiting == 0) {
308
+ this._waitPoint = undefined;
309
+ // Start syncing again
310
+ this.syncLocalMediaSession();
311
+ }
312
+ }
313
+ else {
314
+ // Sync client with group
315
+ this.syncLocalMediaSession();
316
+ }
317
+ }
318
+ }
319
+ }
320
+ }
321
+ syncLocalMediaSession() {
322
+ return __awaiter(this, void 0, void 0, function* () {
323
+ // Skip further syncs if we're waiting or in a "soft suspension".
324
+ const softSuspensionDelta = live_share_1.LiveShareClient.getTimestamp() - this._lastStateChangeTime;
325
+ if (!this.isWaiting && softSuspensionDelta >= 1000) {
326
+ let { metadata, trackData, positionState, playbackState } = this._getMediaPlayerState();
327
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.CheckingForSyncIssues);
328
+ // Check for track change
329
+ if (!this.playbackTrack.compare(metadata)) {
330
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackOutOfSync);
331
+ this.emitSetTrack(this.playbackTrack.metadata);
332
+ return;
333
+ }
334
+ // Once local playback has ended there's no need to further sync the client. In fact
335
+ // doing so could cause the player to loop.
336
+ // - The playbackPosition.trackEnded check is to catch late joiners and prevents syncing if everyone
337
+ // else has finished the video.
338
+ // - Should another user seek or press play after the video has ended that will cause
339
+ // a transport action to trigger which will take the player out of the ended state.
340
+ if (playbackState != "ended" &&
341
+ !this._playbackPosition.trackEnded) {
342
+ // Ensure we have a position
343
+ let position = positionState === null || positionState === void 0 ? void 0 : positionState.position;
344
+ if (position == undefined) {
345
+ position = 0.0;
346
+ }
347
+ // Check for catchup
348
+ // - Target can return -1 in cases where there is no position tracking data
349
+ const target = this.playbackPosition.targetPosition;
350
+ if (target >= 0.0 &&
351
+ Math.abs(target - position) >=
352
+ this._maxPlaybackDrift.seconds) {
353
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.PositionOutOfSync, null, {
354
+ current: position,
355
+ target: target,
356
+ });
357
+ yield this.emitTriggerAction({
358
+ action: "catchup",
359
+ seekTime: target,
360
+ });
361
+ }
362
+ // Sync transport state
363
+ if (this.transportState.playbackState != playbackState) {
364
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TransportOutOfSync, null, {
365
+ current: playbackState,
366
+ target: this.transportState.playbackState,
367
+ });
368
+ switch (this.transportState.playbackState) {
369
+ case "playing":
370
+ yield this.emitTriggerAction({ action: "play" });
371
+ break;
372
+ case "paused":
373
+ yield this.emitTriggerAction({ action: "pause" });
374
+ break;
375
+ }
376
+ }
377
+ // Sync track data
378
+ if (JSON.stringify(this.playbackTrackData.data) !=
379
+ JSON.stringify(trackData)) {
380
+ this._logger.sendTelemetryEvent(consts_1.TelemetryEvents.GroupCoordinator.TrackDataOutOfSync);
381
+ yield this.emitTriggerAction({
382
+ action: "datachange",
383
+ data: this.playbackTrackData.data,
384
+ });
385
+ }
386
+ }
387
+ }
388
+ });
389
+ }
390
+ emitSetTrack(metadata) {
391
+ // Reset tracking states
392
+ this._waitPoint = undefined;
393
+ // Trigger settrack action
394
+ this.emitTriggerAction({ action: "settrack", metadata: metadata });
395
+ }
396
+ emitTriggerAction(details) {
397
+ const evt = {
398
+ name: GroupCoordinatorStateEvents.triggeraction,
399
+ details: details,
400
+ };
401
+ this.emit(GroupCoordinatorStateEvents.triggeraction, evt);
402
+ }
403
+ }
404
+ exports.GroupCoordinatorState = GroupCoordinatorState;
405
+ //# sourceMappingURL=GroupCoordinatorState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupCoordinatorState.js","sourceRoot":"","sources":["../../src/internals/GroupCoordinatorState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the Microsoft Live Share SDK License.
4
+ */
5
+ import { IRuntimeSignaler, TimeInterval } from "@microsoft/live-share";
6
+ import { GroupTransportState } from "./GroupTransportState";
7
+ import { CoordinationWaitPoint, ExtendedMediaSessionPlaybackState } from "../MediaSessionExtensions";
8
+ /**
9
+ *Per client position
10
+ * @hidden
11
+ */
12
+ export interface ICurrentPlaybackPosition {
13
+ playbackState: ExtendedMediaSessionPlaybackState;
14
+ waitPoint?: CoordinationWaitPoint;
15
+ position: number;
16
+ duration?: number;
17
+ timestamp: number;
18
+ clientId: string;
19
+ }
20
+ /**
21
+ * @hidden
22
+ */
23
+ export declare class GroupPlaybackPosition {
24
+ private _transportState;
25
+ private _runtime;
26
+ private _updateInterval;
27
+ private _positions;
28
+ constructor(transportState: GroupTransportState, runtime: IRuntimeSignaler, updateInterval: TimeInterval);
29
+ /**
30
+ * Returns the latest position info for the local client.
31
+ */
32
+ get localPosition(): ICurrentPlaybackPosition | undefined;
33
+ /**
34
+ * Returns the total number of clients actively being tracked.
35
+ */
36
+ get totalClients(): number;
37
+ /**
38
+ * Returns true if all clients being tracked are reporting that they have
39
+ * either ended or haven't started.
40
+ */
41
+ get trackEnded(): boolean;
42
+ /**
43
+ * Returns the number of clients we're waiting for before we can stop waiting.
44
+ */
45
+ get clientsWaiting(): number;
46
+ /**
47
+ * Returns the max playback position relative to the start position.
48
+ *
49
+ * @remarks
50
+ * This is called when calculating the current seekTo position.
51
+ */
52
+ get maxPosition(): number;
53
+ /**
54
+ * Optional media duration if known.
55
+ */
56
+ mediaDuration?: number;
57
+ get targetPosition(): number;
58
+ /**
59
+ * Enumerates every reported playback position.
60
+ * @param callbackFn Function applied to each position,
61
+ */
62
+ forEach(callbackFn: (position: ICurrentPlaybackPosition, projectedPosition: number) => void): void;
63
+ UpdatePlaybackPosition(position: ICurrentPlaybackPosition): void;
64
+ private getMostProgressedPosition;
65
+ private limitProjectedPosition;
66
+ }
67
+ //# 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,YAAY,EAEf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EACH,qBAAqB,EACrB,iCAAiC,EACpC,MAAM,2BAA2B,CAAC;AAEnC;;;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,QAAQ,CAAmB;IACnC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,UAAU,CAAwC;gBAGtD,cAAc,EAAE,mBAAmB,EACnC,OAAO,EAAE,gBAAgB,EACzB,cAAc,EAAE,YAAY;IAkBhC;;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,CAU/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"}