feat(telemprompter): remote control

This commit is contained in:
Carlos Valente
2026-09-09 20:33:11 +02:00
parent 150e0c83e9
commit e1190b1ec7
17 changed files with 445 additions and 111 deletions
+15 -2
View File
@@ -6,6 +6,17 @@ import type { MessageState } from '../../definitions/runtime/MessageControl.type
import type { OffsetMode } from '../../definitions/runtime/Offset.type.js';
import type { RuntimeStore } from '../../definitions/runtime/RuntimeStore.type.js';
export type TeleprompterCommand =
| { type: 'play' }
| { type: 'pause' }
| { type: 'setSpeed'; linesPerMinute: number }
| { type: 'nudge'; lines: number };
export type TeleprompterAction = {
tag: 'teleprompter';
payload: { target: string; commandId: string; command: TeleprompterCommand };
};
export type TeleprompterResponse = { tag: 'teleprompter'; payload: { commandId: string; status: 'delivered' } };
export type VersionAction = {
tag: 'version';
payload: undefined;
@@ -156,7 +167,8 @@ export type ApiAction =
| AddtimeAction
| AuxtimerAction
| ClientAction
| OffsetmodeAction;
| OffsetmodeAction
| TeleprompterAction;
export type ApiResponse =
| VersionResponse
@@ -172,6 +184,7 @@ export type ApiResponse =
| AddtimeResponse
| AuxtimerResponse
| ClientResponse
| OffsetmodeResponse;
| OffsetmodeResponse
| TeleprompterResponse;
export type ApiActionTag = ApiAction['tag'];
@@ -2,6 +2,7 @@ import type { Client } from '../../definitions/Clients.type.js';
import type { Log } from '../../definitions/runtime/Logger.type.js';
import type { RuntimeStore } from '../../definitions/runtime/RuntimeStore.type.js';
import type { MaybeNumber } from '../../utils/utils.type.js';
import type { TeleprompterCommand } from './api.type.js';
import type { RefetchKey } from './refetch.type.js';
export enum MessageTag {
@@ -17,6 +18,7 @@ export enum MessageTag {
Log = 'log',
RuntimeData = 'runtime-data',
Refetch = 'refetch',
TeleprompterCommand = 'teleprompter-command',
}
// CLIENT TO SERVER
@@ -35,6 +37,10 @@ type ListClientPacket = {
payload: Record<string, Client>;
};
type RuntimePacket = { tag: MessageTag.RuntimeData; payload: Partial<RuntimeStore> };
type TeleprompterCommandPacket = {
tag: MessageTag.TeleprompterCommand;
payload: { commandId: string; command: TeleprompterCommand };
};
type RefetchPacket = {
tag: MessageTag.Refetch;
@@ -58,4 +64,5 @@ export type WsPacketToClient =
| LogPacket
| ListClientPacket
| RuntimePacket
| RefetchPacket;
| RefetchPacket
| TeleprompterCommandPacket;
@@ -1,11 +1,23 @@
export type ClientType = 'unknown' | 'ontime' | string;
export type TeleprompterControlMode = 'free' | 'controlled';
export type TeleprompterPlayback = 'playing' | 'paused';
export type TeleprompterParkedAt = 'segment' | 'script' | null;
export type TeleprompterControlState = {
mode: TeleprompterControlMode;
playback: TeleprompterPlayback;
speed: number;
isFollowingLoadedEvent: boolean;
parkedAt: TeleprompterParkedAt;
};
export type Client = {
name: string;
type: ClientType;
identify: boolean;
origin: string;
path: string;
teleprompter?: TeleprompterControlState;
};
export type ClientList = Record<string, Client>;
+10 -2
View File
@@ -107,7 +107,7 @@ export type {
export { MessageTag } from './api/websocket/data.type.js';
export type { WsPacketToServer, WsPacketToClient } from './api/websocket/data.type.js';
export { RefetchKey } from './api/websocket/refetch.type.js';
export type { ApiAction, ApiActionTag, ApiResponse } from './api/websocket/api.type.js';
export type { ApiAction, ApiActionTag, ApiResponse, TeleprompterCommand } from './api/websocket/api.type.js';
// SERVER RUNTIME
export { type Log, LogLevel, type LogMessage, LogOrigin } from './definitions/runtime/Logger.type.js';
export { Playback } from './definitions/runtime/Playback.type.js';
@@ -125,7 +125,15 @@ export { type TimerState, TimerPhase } from './definitions/runtime/TimerState.ty
export { type SimpleTimerState, SimplePlayback, SimpleDirection } from './definitions/runtime/AuxTimer.type.js';
// CLIENT
export type { Client, ClientList, ClientType } from './definitions/Clients.type.js';
export type {
Client,
ClientList,
ClientType,
TeleprompterControlMode,
TeleprompterControlState,
TeleprompterParkedAt,
TeleprompterPlayback,
} from './definitions/Clients.type.js';
// TYPE UTILITIES
export {