mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-03 14:37:58 +00:00
92cefa1331
* refactor: these functions don't throw, test the return success and then throw * refactor: no need to catch and re-throw
271 lines
6.9 KiB
TypeScript
271 lines
6.9 KiB
TypeScript
import { messageService } from '../services/message-service/MessageService.js';
|
|
import { PlaybackService } from '../services/PlaybackService.js';
|
|
import { eventStore } from '../stores/EventStore.js';
|
|
import { parse, updateEvent } from './integrationController.config.js';
|
|
|
|
export type ChangeOptions = {
|
|
eventId: string;
|
|
property: string;
|
|
value: unknown;
|
|
};
|
|
|
|
//TODO: re-throwing the error does not add any extra information or value
|
|
export function dispatchFromAdapter(
|
|
type: string,
|
|
args: {
|
|
payload: unknown;
|
|
},
|
|
_source?: 'osc' | 'ws',
|
|
) {
|
|
const payload = args.payload;
|
|
const typeComponents = type.toLowerCase().split('/');
|
|
const mainType = typeComponents[0];
|
|
|
|
switch (mainType) {
|
|
case 'test-ontime': {
|
|
return { topic: 'hello' };
|
|
}
|
|
|
|
case 'ontime-poll': {
|
|
return {
|
|
topic: 'poll',
|
|
payload: eventStore.poll(),
|
|
};
|
|
}
|
|
|
|
case 'set-onair': {
|
|
if (typeof payload !== 'undefined') {
|
|
messageService.setOnAir(Boolean(payload));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 'onair': {
|
|
messageService.setOnAir(true);
|
|
break;
|
|
}
|
|
|
|
case 'offair': {
|
|
messageService.setOnAir(false);
|
|
break;
|
|
}
|
|
|
|
case 'set-timer-blink': {
|
|
if (typeof payload !== 'undefined') {
|
|
messageService.setTimerBlink(Boolean(payload));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 'set-timer-blackout': {
|
|
if (typeof payload !== 'undefined') {
|
|
messageService.setTimerBlackout(Boolean(payload));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 'set-timer-message-text': {
|
|
if (typeof payload !== 'string') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setTimerText(payload);
|
|
break;
|
|
}
|
|
case 'set-timer-message-visible': {
|
|
if (typeof payload === 'undefined') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setTimerVisibility(Boolean(payload));
|
|
break;
|
|
}
|
|
|
|
case 'set-public-message-text': {
|
|
if (typeof payload !== 'string') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setPublicText(payload);
|
|
break;
|
|
}
|
|
case 'set-public-message-visible': {
|
|
if (typeof payload === 'undefined') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setPublicVisibility(Boolean(payload));
|
|
break;
|
|
}
|
|
|
|
case 'set-lower-message-text': {
|
|
if (typeof payload !== 'string') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setLowerText(payload);
|
|
break;
|
|
}
|
|
case 'set-lower-message-visible': {
|
|
if (typeof payload === 'undefined') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setLowerVisibility(Boolean(payload));
|
|
break;
|
|
}
|
|
|
|
case 'set-external-message-text': {
|
|
if (typeof payload !== 'string') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setExternalText(payload);
|
|
return;
|
|
}
|
|
case 'set-external-message-visible': {
|
|
if (typeof payload === 'undefined') {
|
|
throw new Error(`Unable to parse payload: ${payload}`);
|
|
}
|
|
messageService.setExternalVisibility(Boolean(payload));
|
|
break;
|
|
}
|
|
case 'start': {
|
|
PlaybackService.start();
|
|
break;
|
|
}
|
|
|
|
case 'start-next': {
|
|
PlaybackService.startNext();
|
|
break;
|
|
}
|
|
|
|
case 'startindex': {
|
|
const eventIndex = Number(payload);
|
|
if (isNaN(eventIndex) || eventIndex <= 0) {
|
|
throw new Error(`Event index not recognised or out of range ${eventIndex}`);
|
|
}
|
|
|
|
// Indexes in frontend are 1 based
|
|
const success = PlaybackService.startByIndex(eventIndex - 1);
|
|
if (!success) {
|
|
throw new Error(`Event index not recognised or out of range ${eventIndex}`);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 'startid': {
|
|
if (!payload || typeof payload !== 'string') {
|
|
throw new Error(`Event ID not recognised: ${payload}`);
|
|
}
|
|
PlaybackService.startById(payload);
|
|
break;
|
|
}
|
|
|
|
case 'startcue': {
|
|
if (!payload || typeof payload !== 'string') {
|
|
throw new Error(`Event cue not recognised: ${payload}`);
|
|
}
|
|
PlaybackService.startByCue(payload);
|
|
break;
|
|
}
|
|
|
|
case 'pause': {
|
|
PlaybackService.pause();
|
|
break;
|
|
}
|
|
case 'previous': {
|
|
PlaybackService.loadPrevious();
|
|
break;
|
|
}
|
|
case 'next': {
|
|
PlaybackService.loadNext();
|
|
break;
|
|
}
|
|
case 'unload':
|
|
case 'stop': {
|
|
PlaybackService.stop();
|
|
break;
|
|
}
|
|
case 'reload': {
|
|
PlaybackService.reload();
|
|
break;
|
|
}
|
|
case 'roll': {
|
|
PlaybackService.roll();
|
|
break;
|
|
}
|
|
case 'addtime': {
|
|
const time = Number(payload);
|
|
if (isNaN(time)) {
|
|
throw new Error(`Time not recognised ${payload}`);
|
|
}
|
|
|
|
PlaybackService.addTime(time);
|
|
break;
|
|
}
|
|
//deprecated
|
|
case 'delay': {
|
|
const delayTime = Number(payload);
|
|
if (isNaN(delayTime)) {
|
|
throw new Error(`Delay time not recognised ${payload}`);
|
|
}
|
|
|
|
PlaybackService.setDelay(delayTime);
|
|
break;
|
|
}
|
|
case 'gotoindex':
|
|
case 'loadindex': {
|
|
const eventIndex = Number(payload);
|
|
if (isNaN(eventIndex) || eventIndex <= 0) {
|
|
throw new Error(`Event index not recognised or out of range ${eventIndex}`);
|
|
}
|
|
|
|
// Indexes in frontend are 1 based
|
|
const success = PlaybackService.loadByIndex(eventIndex - 1);
|
|
if (!success) {
|
|
throw new Error(`Event index not recognised or out of range ${eventIndex}`);
|
|
}
|
|
break;
|
|
}
|
|
case 'gotoid':
|
|
case 'loadid': {
|
|
if (!payload) {
|
|
throw new Error(`Event ID not recognised: ${payload}`);
|
|
}
|
|
|
|
const success = PlaybackService.loadById(payload.toString().toLowerCase());
|
|
if (!success) {
|
|
throw new Error(`Event ID not found: ${payload}`);
|
|
}
|
|
break;
|
|
}
|
|
case 'gotocue':
|
|
case 'loadcue': {
|
|
if (!payload || typeof payload !== 'string') {
|
|
throw new Error(`Event cue not recognised: ${payload}`);
|
|
}
|
|
|
|
const success = PlaybackService.loadByCue(payload);
|
|
if (!success) {
|
|
throw new Error(`Event cue not found: ${payload}`);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 'get-playback': {
|
|
const playback = eventStore.get('playback');
|
|
return { topic: 'playback', payload: playback };
|
|
}
|
|
|
|
case 'get-timer': {
|
|
const timer = eventStore.get('timer');
|
|
return { topic: 'timer', payload: timer };
|
|
}
|
|
|
|
// WS: {type: 'change', payload: { eventId, property, value } }
|
|
case 'change': {
|
|
const { eventId, property, value } = payload as ChangeOptions;
|
|
const { parsedPayload, parsedProperty } = parse(property, value);
|
|
return updateEvent(eventId, parsedProperty, parsedPayload);
|
|
}
|
|
|
|
default: {
|
|
throw new Error(`Unhandled message ${type}`);
|
|
}
|
|
}
|
|
}
|