1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Rename Syncplay to SyncPlay

This commit is contained in:
gion 2020-05-06 23:41:54 +02:00
parent 11f6217bb2
commit 36d097291e
10 changed files with 162 additions and 162 deletions

View file

@ -1,4 +1,4 @@
define(['events', 'globalize', 'playbackManager', 'connectionManager', 'syncplayManager', 'playMethodHelper', 'layoutManager', 'serverNotifications', 'paper-icon-button-light', 'css!./playerstats'], function (events, globalize, playbackManager, connectionManager, syncplayManager, playMethodHelper, layoutManager, serverNotifications) {
define(['events', 'globalize', 'playbackManager', 'connectionManager', 'syncPlayManager', 'playMethodHelper', 'layoutManager', 'serverNotifications', 'paper-icon-button-light', 'css!./playerstats'], function (events, globalize, playbackManager, connectionManager, syncPlayManager, playMethodHelper, layoutManager, serverNotifications) {
'use strict';
function init(instance) {
@ -327,22 +327,22 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'syncplay
return sessionStats;
}
function getSyncplayStats() {
function getSyncPlayStats() {
var syncStats = [];
var stats = syncplayManager.getStats();
var stats = syncPlayManager.getStats();
syncStats.push({
label: globalize.translate('LabelSyncplayTimeOffset'),
label: globalize.translate('LabelSyncPlayTimeOffset'),
value: stats.TimeOffset + globalize.translate('MillisecondsUnit')
});
syncStats.push({
label: globalize.translate('LabelSyncplayPlaybackDiff'),
label: globalize.translate('LabelSyncPlayPlaybackDiff'),
value: stats.PlaybackDiff + globalize.translate('MillisecondsUnit')
});
syncStats.push({
label: globalize.translate('LabelSyncplaySyncMethod'),
label: globalize.translate('LabelSyncPlaySyncMethod'),
value: stats.SyncMethod
});
@ -405,10 +405,10 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'syncplay
name: 'Original Media Info'
});
if (syncplayManager.isSyncplayEnabled()) {
if (syncPlayManager.isSyncPlayEnabled()) {
categories.push({
stats: getSyncplayStats(),
name: 'Syncplay Info'
stats: getSyncPlayStats(),
name: 'SyncPlay Info'
});
}

View file

@ -1,4 +1,4 @@
define(['connectionManager', 'playbackManager', 'syncplayManager', 'events', 'inputManager', 'focusManager', 'appRouter'], function (connectionManager, playbackManager, syncplayManager, events, inputManager, focusManager, appRouter) {
define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'inputManager', 'focusManager', 'appRouter'], function (connectionManager, playbackManager, syncPlayManager, events, inputManager, focusManager, appRouter) {
'use strict';
var serverNotifications = {};
@ -187,10 +187,10 @@ define(['connectionManager', 'playbackManager', 'syncplayManager', 'events', 'in
events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]);
}
}
} else if (msg.MessageType === 'SyncplayCommand') {
syncplayManager.processCommand(msg.Data, apiClient);
} else if (msg.MessageType === 'SyncplayGroupUpdate') {
syncplayManager.processGroupUpdate(msg.Data, apiClient);
} else if (msg.MessageType === 'SyncPlayCommand') {
syncPlayManager.processCommand(msg.Data, apiClient);
} else if (msg.MessageType === 'SyncPlayGroupUpdate') {
syncPlayManager.processGroupUpdate(msg.Data, apiClient);
} else {
events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]);
}

View file

@ -1,7 +1,7 @@
import events from 'events';
import connectionManager from 'connectionManager';
import playbackManager from 'playbackManager';
import syncplayManager from 'syncplayManager';
import syncPlayManager from 'syncPlayManager';
import loading from 'loading';
import toast from 'toast';
import actionsheet from 'actionsheet';
@ -37,7 +37,7 @@ function showNewJoinGroupSelection (button, user, apiClient) {
console.debug('No item is currently playing.');
}
apiClient.sendSyncplayCommand(sessionId, 'ListGroups').then(function (response) {
apiClient.sendSyncPlayCommand(sessionId, 'ListGroups').then(function (response) {
response.json().then(function (groups) {
var menuItems = groups.map(function (group) {
return {
@ -49,24 +49,24 @@ function showNewJoinGroupSelection (button, user, apiClient) {
};
});
if (inSession && policy.SyncplayAccess === 'CreateAndJoinGroups') {
if (inSession && policy.SyncPlayAccess === 'CreateAndJoinGroups') {
menuItems.push({
name: globalize.translate('LabelSyncplayNewGroup'),
name: globalize.translate('LabelSyncPlayNewGroup'),
icon: 'add',
id: 'new-group',
selected: true,
secondaryText: globalize.translate('LabelSyncplayNewGroupDescription')
secondaryText: globalize.translate('LabelSyncPlayNewGroupDescription')
});
}
if (menuItems.length === 0) {
if (inSession && policy.SyncplayAccess === 'JoinGroups') {
if (inSession && policy.SyncPlayAccess === 'JoinGroups') {
toast({
text: globalize.translate('MessageSyncplayCreateGroupDenied')
text: globalize.translate('MessageSyncPlayCreateGroupDenied')
});
} else {
toast({
text: globalize.translate('MessageSyncplayNoGroupsAvailable')
text: globalize.translate('MessageSyncPlayNoGroupsAvailable')
});
}
loading.hide();
@ -74,7 +74,7 @@ function showNewJoinGroupSelection (button, user, apiClient) {
}
var menuOptions = {
title: globalize.translate('HeaderSyncplaySelectGroup'),
title: globalize.translate('HeaderSyncPlaySelectGroup'),
items: menuItems,
positionTo: button,
resolveOnClick: true,
@ -83,15 +83,15 @@ function showNewJoinGroupSelection (button, user, apiClient) {
actionsheet.show(menuOptions).then(function (id) {
if (id == 'new-group') {
apiClient.sendSyncplayCommand(sessionId, 'NewGroup');
apiClient.sendSyncPlayCommand(sessionId, 'NewGroup');
} else {
apiClient.sendSyncplayCommand(sessionId, 'JoinGroup', {
apiClient.sendSyncPlayCommand(sessionId, 'JoinGroup', {
GroupId: id,
PlayingItemId: playingItemId
});
}
}).catch((error) => {
console.error('Syncplay: unexpected error listing groups:', error);
console.error('SyncPlay: unexpected error listing groups:', error);
});
loading.hide();
@ -100,7 +100,7 @@ function showNewJoinGroupSelection (button, user, apiClient) {
console.error(error);
loading.hide();
toast({
text: globalize.translate('MessageSyncplayErrorAccessingGroups')
text: globalize.translate('MessageSyncPlayErrorAccessingGroups')
});
});
}
@ -114,24 +114,24 @@ function showNewJoinGroupSelection (button, user, apiClient) {
function showLeaveGroupSelection (button, user, apiClient) {
const sessionId = getActivePlayerId();
if (!sessionId) {
syncplayManager.signalError();
syncPlayManager.signalError();
toast({
text: globalize.translate('MessageSyncplayErrorNoActivePlayer')
text: globalize.translate('MessageSyncPlayErrorNoActivePlayer')
});
showNewJoinGroupSelection(button, user, apiClient);
return;
}
const menuItems = [{
name: globalize.translate('LabelSyncplayLeaveGroup'),
name: globalize.translate('LabelSyncPlayLeaveGroup'),
icon: 'meeting_room',
id: 'leave-group',
selected: true,
secondaryText: globalize.translate('LabelSyncplayLeaveGroupDescription')
secondaryText: globalize.translate('LabelSyncPlayLeaveGroupDescription')
}];
var menuOptions = {
title: globalize.translate('HeaderSyncplayEnabled'),
title: globalize.translate('HeaderSyncPlayEnabled'),
items: menuItems,
positionTo: button,
resolveOnClick: true,
@ -140,23 +140,23 @@ function showLeaveGroupSelection (button, user, apiClient) {
actionsheet.show(menuOptions).then(function (id) {
if (id == 'leave-group') {
apiClient.sendSyncplayCommand(sessionId, 'LeaveGroup');
apiClient.sendSyncPlayCommand(sessionId, 'LeaveGroup');
}
}).catch((error) => {
console.error('Syncplay: unexpected error showing group menu:', error);
console.error('SyncPlay: unexpected error showing group menu:', error);
});
loading.hide();
}
// Register to Syncplay events
let syncplayEnabled = false;
events.on(syncplayManager, 'enabled', function (e, enabled) {
syncplayEnabled = enabled;
// Register to SyncPlay events
let syncPlayEnabled = false;
events.on(syncPlayManager, 'enabled', function (e, enabled) {
syncPlayEnabled = enabled;
});
/**
* Shows a menu to handle Syncplay groups.
* Shows a menu to handle SyncPlay groups.
* @param {HTMLElement} button - Element where to place the menu.
*/
export function show (button) {
@ -168,13 +168,13 @@ export function show (button) {
}).catch((error) => {
console.error('Playback not allowed!', error);
toast({
text: globalize.translate('MessageSyncplayPlaybackPermissionRequired')
text: globalize.translate('MessageSyncPlayPlaybackPermissionRequired')
});
});
const apiClient = connectionManager.currentApiClient();
connectionManager.user(apiClient).then((user) => {
if (syncplayEnabled) {
if (syncPlayEnabled) {
showLeaveGroupSelection(button, user, apiClient);
} else {
showNewJoinGroupSelection(button, user, apiClient);
@ -183,7 +183,7 @@ export function show (button) {
console.error(error);
loading.hide();
toast({
text: globalize.translate('MessageSyncplayNoGroupsAvailable')
text: globalize.translate('MessageSyncPlayNoGroupsAvailable')
});
});
}

View file

@ -1,6 +1,6 @@
/**
* Module that manages the Syncplay feature.
* @module components/syncplay/syncplayManager
* Module that manages the SyncPlay feature.
* @module components/syncplay/syncPlayManager
*/
import events from 'events';
@ -62,9 +62,9 @@ const WaitForEventDefaultTimeout = 30000; // milliseconds
const WaitForPlayerEventTimeout = 500; // milliseconds
/**
* Class that manages the Syncplay feature.
* Class that manages the SyncPlay feature.
*/
class SyncplayManager {
class SyncPlayManager {
constructor() {
this.playbackRateSupported = false;
this.syncEnabled = false;
@ -80,8 +80,8 @@ class SyncplayManager {
this.currentPlayer = null;
this.localPlayerPlaybackRate = 1.0; // used to restore user PlaybackRate
this.syncplayEnabledAt = null; // Server time of when Syncplay has been enabled
this.syncplayReady = false; // Syncplay is ready after first ping to server
this.syncPlayEnabledAt = null; // Server time of when SyncPlay has been enabled
this.syncPlayReady = false; // SyncPlay is ready after first ping to server
this.lastCommand = null;
this.queuedCommand = null;
@ -91,7 +91,7 @@ class SyncplayManager {
this.timeOffsetWithServer = 0; // server time minus local time
this.roundTripDuration = 0;
this.notifySyncplayReady = false;
this.notifySyncPlayReady = false;
events.on(playbackManager, 'playbackstart', (player, state) => {
this.onPlaybackStart(player, state);
@ -113,17 +113,17 @@ class SyncplayManager {
events.on(timeSyncManager, 'update', (event, error, timeOffset, ping) => {
if (error) {
console.debug('Syncplay, time update issue', error);
console.debug('SyncPlay, time update issue', error);
return;
}
this.timeOffsetWithServer = timeOffset;
this.roundTripDuration = ping * 2;
if (this.notifySyncplayReady) {
this.syncplayReady = true;
if (this.notifySyncPlayReady) {
this.syncPlayReady = true;
events.trigger(this, 'ready');
this.notifySyncplayReady = false;
this.notifySyncPlayReady = false;
}
// Report ping
@ -134,12 +134,12 @@ class SyncplayManager {
if (!sessionId) {
this.signalError();
toast({
text: globalize.translate('MessageSyncplayErrorMissingSession')
text: globalize.translate('MessageSyncPlayErrorMissingSession')
});
return;
}
apiClient.sendSyncplayCommand(sessionId, 'UpdatePing', {
apiClient.sendSyncPlayCommand(sessionId, 'UpdatePing', {
Ping: ping
});
}
@ -158,8 +158,8 @@ class SyncplayManager {
*/
onPlaybackStop (stopInfo) {
events.trigger(this, 'playbackstop', [stopInfo]);
if (this.isSyncplayEnabled()) {
this.disableSyncplay(false);
if (this.isSyncPlayEnabled()) {
this.disableSyncPlay(false);
}
}
@ -238,7 +238,7 @@ class SyncplayManager {
// FIXME: the following are needed because the 'events' module
// is changing the scope when executing the callbacks.
// For instance, calling 'onPlayerUnpause' from the wrong scope breaks things because 'this'
// points to 'player' (the event emitter) instead of pointing to the SyncplayManager singleton.
// points to 'player' (the event emitter) instead of pointing to the SyncPlayManager singleton.
const self = this;
this._onPlayerUnpause = () => {
self.onPlayerUnpause();
@ -306,48 +306,48 @@ class SyncplayManager {
break;
case 'UserJoined':
toast({
text: globalize.translate('MessageSyncplayUserJoined', cmd.Data)
text: globalize.translate('MessageSyncPlayUserJoined', cmd.Data)
});
break;
case 'UserLeft':
toast({
text: globalize.translate('MessageSyncplayUserLeft', cmd.Data)
text: globalize.translate('MessageSyncPlayUserLeft', cmd.Data)
});
break;
case 'GroupJoined':
this.enableSyncplay(apiClient, new Date(cmd.Data), true);
this.enableSyncPlay(apiClient, new Date(cmd.Data), true);
break;
case 'NotInGroup':
case 'GroupLeft':
this.disableSyncplay(true);
this.disableSyncPlay(true);
break;
case 'GroupWait':
toast({
text: globalize.translate('MessageSyncplayGroupWait', cmd.Data)
text: globalize.translate('MessageSyncPlayGroupWait', cmd.Data)
});
break;
case 'GroupDoesNotExist':
toast({
text: globalize.translate('MessageSyncplayGroupDoesNotExist')
text: globalize.translate('MessageSyncPlayGroupDoesNotExist')
});
break;
case 'CreateGroupDenied':
toast({
text: globalize.translate('MessageSyncplayCreateGroupDenied')
text: globalize.translate('MessageSyncPlayCreateGroupDenied')
});
break;
case 'JoinGroupDenied':
toast({
text: globalize.translate('MessageSyncplayJoinGroupDenied')
text: globalize.translate('MessageSyncPlayJoinGroupDenied')
});
break;
case 'LibraryAccessDenied':
toast({
text: globalize.translate('MessageSyncplayLibraryAccessDenied')
text: globalize.translate('MessageSyncPlayLibraryAccessDenied')
});
break;
default:
console.error('processSyncplayGroupUpdate: command is not recognised: ' + cmd.Type);
console.error('processSyncPlayGroupUpdate: command is not recognised: ' + cmd.Type);
break;
}
}
@ -360,13 +360,13 @@ class SyncplayManager {
processCommand (cmd, apiClient) {
if (cmd === null) return;
if (!this.isSyncplayEnabled()) {
console.debug('Syncplay processCommand: SyncPlay not enabled, ignoring command', cmd);
if (!this.isSyncPlayEnabled()) {
console.debug('SyncPlay processCommand: SyncPlay not enabled, ignoring command', cmd);
return;
}
if (!this.syncplayReady) {
console.debug('Syncplay processCommand: SyncPlay not ready, queued command', cmd);
if (!this.syncPlayReady) {
console.debug('SyncPlay processCommand: SyncPlay not ready, queued command', cmd);
this.queuedCommand = cmd;
return;
}
@ -374,8 +374,8 @@ class SyncplayManager {
cmd.When = new Date(cmd.When);
cmd.EmittedAt = new Date(cmd.EmitttedAt);
if (cmd.EmitttedAt < this.syncplayEnabledAt) {
console.debug('Syncplay processCommand: ignoring old command', cmd);
if (cmd.EmitttedAt < this.syncPlayEnabledAt) {
console.debug('SyncPlay processCommand: ignoring old command', cmd);
return;
}
@ -385,12 +385,12 @@ class SyncplayManager {
this.lastCommand.PositionTicks === cmd.PositionTicks &&
this.Command === cmd.Command
) {
console.debug('Syncplay processCommand: ignoring duplicate command', cmd);
console.debug('SyncPlay processCommand: ignoring duplicate command', cmd);
return;
}
this.lastCommand = cmd;
console.log('Syncplay will', cmd.Command, 'at', cmd.When, 'PositionTicks', cmd.PositionTicks);
console.log('SyncPlay will', cmd.Command, 'at', cmd.When, 'PositionTicks', cmd.PositionTicks);
switch (cmd.Command) {
case 'Play':
@ -430,7 +430,7 @@ class SyncplayManager {
if (!sessionId) {
console.error('Missing sessionId!');
toast({
text: globalize.translate('MessageSyncplayErrorMissingSession')
text: globalize.translate('MessageSyncPlayErrorMissingSession')
});
return;
}
@ -448,22 +448,22 @@ class SyncplayManager {
if (!success) {
console.warning('Error reporting playback state to server. Joining group will fail.');
}
apiClient.sendSyncplayCommand(sessionId, 'JoinGroup', {
apiClient.sendSyncPlayCommand(sessionId, 'JoinGroup', {
GroupId: groupId,
PlayingItemId: playingItemId
});
}).catch(() => {
console.error('Timed out while waiting for `reportplayback` event!');
toast({
text: globalize.translate('MessageSyncplayErrorMedia')
text: globalize.translate('MessageSyncPlayErrorMedia')
});
return;
});
}).catch(() => {
console.error('Timed out while waiting for `playbackstart` event!');
if (!this.isSyncplayEnabled()) {
if (!this.isSyncPlayEnabled()) {
toast({
text: globalize.translate('MessageSyncplayErrorMedia')
text: globalize.translate('MessageSyncPlayErrorMedia')
});
}
return;
@ -471,19 +471,19 @@ class SyncplayManager {
}).catch((error) => {
console.error(error);
toast({
text: globalize.translate('MessageSyncplayErrorMedia')
text: globalize.translate('MessageSyncPlayErrorMedia')
});
});
}
/**
* Enables Syncplay.
* Enables SyncPlay.
* @param {Object} apiClient The ApiClient.
* @param {Date} enabledAt When Syncplay has been enabled. Server side date.
* @param {Date} enabledAt When SyncPlay has been enabled. Server side date.
* @param {boolean} showMessage Display message.
*/
enableSyncplay (apiClient, enabledAt, showMessage = false) {
this.syncplayEnabledAt = enabledAt;
enableSyncPlay (apiClient, enabledAt, showMessage = false) {
this.syncPlayEnabledAt = enabledAt;
this.injectPlaybackManager();
events.trigger(this, 'enabled', [true]);
@ -492,25 +492,25 @@ class SyncplayManager {
this.queuedCommand = null;
});
this.syncplayReady = false;
this.notifySyncplayReady = true;
this.syncPlayReady = false;
this.notifySyncPlayReady = true;
timeSyncManager.forceUpdate();
if (showMessage) {
toast({
text: globalize.translate('MessageSyncplayEnabled')
text: globalize.translate('MessageSyncPlayEnabled')
});
}
}
/**
* Disables Syncplay.
* Disables SyncPlay.
* @param {boolean} showMessage Display message.
*/
disableSyncplay (showMessage = false) {
this.syncplayEnabledAt = null;
this.syncplayReady = false;
disableSyncPlay (showMessage = false) {
this.syncPlayEnabledAt = null;
this.syncPlayReady = false;
this.lastCommand = null;
this.queuedCommand = null;
this.syncEnabled = false;
@ -519,17 +519,17 @@ class SyncplayManager {
if (showMessage) {
toast({
text: globalize.translate('MessageSyncplayDisabled')
text: globalize.translate('MessageSyncPlayDisabled')
});
}
}
/**
* Gets Syncplay status.
* Gets SyncPlay status.
* @returns {boolean} _true_ if user joined a group, _false_ otherwise.
*/
isSyncplayEnabled () {
return this.syncplayEnabledAt !== null;
isSyncPlayEnabled () {
return this.syncPlayEnabledAt !== null;
}
/**
@ -627,8 +627,8 @@ class SyncplayManager {
* Overrides some PlaybackManager's methods to intercept playback commands.
*/
injectPlaybackManager () {
if (!this.isSyncplayEnabled()) return;
if (playbackManager.syncplayEnabled) return;
if (!this.isSyncPlayEnabled()) return;
if (playbackManager.syncPlayEnabled) return;
// TODO: make this less hacky
playbackManager._localUnpause = playbackManager.unpause;
@ -638,20 +638,20 @@ class SyncplayManager {
playbackManager.unpause = this.playRequest;
playbackManager.pause = this.pauseRequest;
playbackManager.seek = this.seekRequest;
playbackManager.syncplayEnabled = true;
playbackManager.syncPlayEnabled = true;
}
/**
* Restores original PlaybackManager's methods.
*/
restorePlaybackManager () {
if (this.isSyncplayEnabled()) return;
if (!playbackManager.syncplayEnabled) return;
if (this.isSyncPlayEnabled()) return;
if (!playbackManager.syncPlayEnabled) return;
playbackManager.unpause = playbackManager._localUnpause;
playbackManager.pause = playbackManager._localPause;
playbackManager.seek = playbackManager._localSeek;
playbackManager.syncplayEnabled = false;
playbackManager.syncPlayEnabled = false;
}
/**
@ -660,7 +660,7 @@ class SyncplayManager {
playRequest (player) {
var apiClient = connectionManager.currentApiClient();
var sessionId = getActivePlayerId();
apiClient.sendSyncplayCommand(sessionId, 'PlayRequest');
apiClient.sendSyncPlayCommand(sessionId, 'PlayRequest');
}
/**
@ -669,7 +669,7 @@ class SyncplayManager {
pauseRequest (player) {
var apiClient = connectionManager.currentApiClient();
var sessionId = getActivePlayerId();
apiClient.sendSyncplayCommand(sessionId, 'PauseRequest');
apiClient.sendSyncPlayCommand(sessionId, 'PauseRequest');
// Pause locally as well, to give the user some little control
playbackManager._localUnpause(player);
}
@ -680,7 +680,7 @@ class SyncplayManager {
seekRequest (PositionTicks, player) {
var apiClient = connectionManager.currentApiClient();
var sessionId = getActivePlayerId();
apiClient.sendSyncplayCommand(sessionId, 'SeekRequest', {
apiClient.sendSyncPlayCommand(sessionId, 'SeekRequest', {
PositionTicks: PositionTicks
});
}
@ -689,7 +689,7 @@ class SyncplayManager {
* Calls original PlaybackManager's unpause method.
*/
localUnpause(player) {
if (playbackManager.syncplayEnabled) {
if (playbackManager.syncPlayEnabled) {
playbackManager._localUnpause(player);
} else {
playbackManager.unpause(player);
@ -700,7 +700,7 @@ class SyncplayManager {
* Calls original PlaybackManager's pause method.
*/
localPause(player) {
if (playbackManager.syncplayEnabled) {
if (playbackManager.syncPlayEnabled) {
playbackManager._localPause(player);
} else {
playbackManager.pause(player);
@ -711,7 +711,7 @@ class SyncplayManager {
* Calls original PlaybackManager's seek method.
*/
localSeek(PositionTicks, player) {
if (playbackManager.syncplayEnabled) {
if (playbackManager.syncPlayEnabled) {
playbackManager._localSeek(PositionTicks, player);
} else {
playbackManager.seek(PositionTicks, player);
@ -800,8 +800,8 @@ class SyncplayManager {
}
/**
* Gets Syncplay stats.
* @returns {Object} The Syncplay stats.
* Gets SyncPlay stats.
* @returns {Object} The SyncPlay stats.
*/
getStats () {
return {
@ -812,7 +812,7 @@ class SyncplayManager {
}
/**
* Emits an event to update the Syncplay status icon.
* Emits an event to update the SyncPlay status icon.
*/
showSyncIcon (syncMethod) {
this.syncMethod = syncMethod;
@ -820,7 +820,7 @@ class SyncplayManager {
}
/**
* Emits an event to clear the Syncplay status icon.
* Emits an event to clear the SyncPlay status icon.
*/
clearSyncIcon () {
this.syncMethod = 'None';
@ -828,12 +828,12 @@ class SyncplayManager {
}
/**
* Signals an error state, which disables and resets Syncplay for a new session.
* Signals an error state, which disables and resets SyncPlay for a new session.
*/
signalError () {
this.disableSyncplay();
this.disableSyncPlay();
}
}
/** SyncplayManager singleton. */
export default new SyncplayManager();
/** SyncPlayManager singleton. */
export default new SyncPlayManager();