refactor: improve typing in backend (#748)

This commit is contained in:
Carlos Valente
2024-01-30 21:12:19 +01:00
committed by GitHub
parent 39711c1edd
commit 6a5020424b
26 changed files with 703 additions and 147 deletions
+9 -9
View File
@@ -1,14 +1,14 @@
import { Playback } from 'ontime-types';
import { MaybeNumber, MaybeString, Playback } from 'ontime-types';
import { JSONFile } from 'lowdb/node';
import { resolveRestoreFile } from '../setup.js';
export type RestorePoint = {
playback: Playback;
selectedEventId: string | null;
startedAt: number | null;
addedTime: number | null;
pausedAt: number | null;
selectedEventId: MaybeString;
startedAt: MaybeNumber;
addedTime: number;
pausedAt: MaybeNumber;
};
/**
@@ -35,7 +35,7 @@ export function isRestorePoint(obj: unknown): obj is RestorePoint {
return false;
}
if (typeof restorePoint.addedTime !== 'number' && restorePoint.addedTime !== null) {
if (typeof restorePoint.addedTime !== 'number') {
return false;
}
@@ -55,9 +55,9 @@ export function isRestorePoint(obj: unknown): obj is RestorePoint {
* that can then be restored when reopening
*/
export class RestoreService {
private readonly filePath: string | null;
private readonly filePath: MaybeString;
private readonly file: JSONFile<RestorePoint | null>;
private lastStore: string | null;
private lastStore: MaybeString;
private failedCreateAttempts: number;
constructor(filePath: string) {
@@ -128,7 +128,7 @@ export class RestoreService {
*/
async clear() {
try {
await this.write(null);
await this.file.write(null);
} catch (_error) {
// nothing to do
}
@@ -7,8 +7,8 @@ import { isRestorePoint, RestorePoint, RestoreService } from '../RestoreService.
describe('isRestorePoint()', () => {
it('validates a well defined object', () => {
let restorePoint = {
playback: 'play',
let restorePoint: RestorePoint = {
playback: Playback.Roll,
selectedEventId: '123',
startedAt: 1,
addedTime: 2,
@@ -17,10 +17,10 @@ describe('isRestorePoint()', () => {
expect(isRestorePoint(restorePoint)).toBe(true);
restorePoint = {
playback: 'roll',
playback: Playback.Roll,
selectedEventId: '123',
startedAt: null,
addedTime: null,
addedTime: 0,
pausedAt: null,
};
expect(isRestorePoint(restorePoint)).toBe(true);
@@ -32,7 +32,7 @@ describe('isRestorePoint()', () => {
playback: 'unknown',
selectedEventId: '123',
startedAt: null,
addedTime: null,
addedTime: 0,
pausedAt: null,
};
expect(isRestorePoint(restorePoint)).toBe(false);
@@ -41,17 +41,17 @@ describe('isRestorePoint()', () => {
const restorePoint = {
selectedEventId: '123',
startedAt: null,
addedTime: null,
addedTime: 0,
pausedAt: null,
};
expect(isRestorePoint(restorePoint)).toBe(false);
});
it('with incorrect value', () => {
const restorePoint = {
playback: 'roll',
playback: Playback.Roll,
selectedEventId: '123',
startedAt: 'testing',
addedTime: null,
addedTime: 0,
pausedAt: null,
};
expect(isRestorePoint(restorePoint)).toBe(false);
@@ -62,7 +62,7 @@ describe('isRestorePoint()', () => {
describe('RestoreService()', () => {
describe('load()', () => {
it('loads working file with times', async () => {
const expected = {
const expected: RestorePoint = {
playback: Playback.Play,
selectedEventId: 'da5b4',
startedAt: 1234,
@@ -78,11 +78,11 @@ describe('RestoreService()', () => {
});
it('loads working file without times', async () => {
const expected = {
const expected: RestorePoint = {
playback: Playback.Stop,
selectedEventId: null,
startedAt: null,
addedTime: null,
addedTime: 0,
pausedAt: null,
};
+6 -2
View File
@@ -1,4 +1,4 @@
import { isOntimeBlock, isOntimeEvent, OntimeRundown, SupportedEvent } from 'ontime-types';
import { isOntimeBlock, isOntimeDelay, isOntimeEvent, OntimeRundown } from 'ontime-types';
import { deleteAtIndex } from '../utils/arrayUtils.js';
@@ -6,7 +6,11 @@ export function _applyDelay(eventId: string, rundown: OntimeRundown): OntimeRund
const delayIndex = rundown.findIndex((event) => event.id === eventId);
const delayEvent = rundown.at(delayIndex);
if (delayEvent.type !== SupportedEvent.Delay) {
if (!delayEvent) {
throw new Error('Given event ID not found');
}
if (!isOntimeDelay(delayEvent)) {
throw new Error('Given event ID is not a delay');
}
@@ -8,7 +8,7 @@ export type GetTimeFn = () => number;
export class ExtraTimerService {
private timer: SimpleTimer;
private interval: NodeJS.Timer;
private interval: NodeJS.Timer | null = null;
private emit: EmitFn;
private getTime: GetTimeFn;
@@ -23,7 +23,9 @@ export class ExtraTimerService {
}
private stopInterval() {
clearInterval(this.interval);
if (this.interval) {
clearInterval(this.interval);
}
}
@broadcastReturn
@@ -19,7 +19,7 @@ function formatDisplayFromString(value: string, hideZero = false): string {
return formatted;
}
type AliasesDefinition = Record<string, { key: string; cb: (value: unknown) => string }>;
type AliasesDefinition = Record<string, { key: string; cb: (value: string) => string }>;
const quickAliases: AliasesDefinition = {
clock: { key: 'timer.clock', cb: (value: string) => formatDisplayFromString(value) },
duration: { key: 'timer.duration', cb: (value: string) => formatDisplayFromString(value, true) },
@@ -88,6 +88,9 @@ export async function addEvent(eventData: Partial<OntimeEvent> | Partial<OntimeD
}
export async function editEvent(eventData: Partial<OntimeEvent> | Partial<OntimeBlock> | Partial<OntimeDelay>) {
if (!eventData?.id) {
throw new Error('Event misses ID');
}
if (isOntimeEvent(eventData) && eventData?.cue === '') {
throw new Error('Cue value invalid');
}
@@ -114,7 +117,7 @@ export async function batchEditEvents(ids: string[], data: Partial<OntimeEvent>)
* @param eventId
* @returns {Promise<void>}
*/
export async function deleteEvent(eventId) {
export async function deleteEvent(eventId: string) {
await cachedDelete(eventId);
notifyChanges({ timer: [eventId], external: true });
@@ -12,7 +12,7 @@ import { state, stateMutations } from '../../state.js';
* Coordinating with necessary services
*/
class RuntimeService {
private eventTimer: TimerService;
private eventTimer: TimerService | null = null;
constructor() {}
@@ -28,8 +28,10 @@ class RuntimeService {
}
shutdown() {
logger.info(LogOrigin.Server, 'Runtime service shutting down');
this.eventTimer.shutdown();
if (this.eventTimer) {
logger.info(LogOrigin.Server, 'Runtime service shutting down');
this.eventTimer.shutdown();
}
}
/**
+2 -4
View File
@@ -15,9 +15,8 @@ export const normaliseEndTime = (start: number, end: number) => (end < start ? e
*/
export function getExpectedFinish(state: TState): MaybeNumber {
const { startedAt, finishedAt, duration, addedTime } = state.timer;
const { timerType } = state.eventNow;
const { timerType, timeEnd } = state.eventNow;
const { pausedAt } = state._timer;
const { timeEnd } = state.eventNow;
const { clock } = state;
if (startedAt === null) {
@@ -51,9 +50,8 @@ export function getExpectedFinish(state: TState): MaybeNumber {
*/
export function getCurrent(state: TState): number {
const { startedAt, duration, addedTime } = state.timer;
const { timerType } = state.eventNow;
const { timerType, timeEnd } = state.eventNow;
const { pausedAt } = state._timer;
const { timeEnd } = state.eventNow;
const { clock } = state;
if (timerType === TimerType.TimeToEnd) {