Skip to content

Commit eada9c8

Browse files
committed
feat: make tsr action execution methods be strongly typed
1 parent e732d93 commit eada9c8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+799
-852
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@
5252
"typescript": "~4.9.5"
5353
},
5454
"prettier": "@sofie-automation/code-standard-preset/.prettierrc.json",
55-
"packageManager": "yarn@4.6.0"
55+
"packageManager": "yarn@3.5.0"
5656
}

packages/quick-tsr/src/tsrHandler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import {
1313
Datastore,
1414
DeviceStatus,
1515
DeviceType,
16-
CasparCGActions,
1716
ActionExecutionResultCode,
17+
ListMediaResult,
18+
ActionExecutionResult,
1819
} from 'timeline-state-resolver-types'
1920
import { ThreadedClass } from 'threadedclass'
2021

@@ -114,7 +115,7 @@ export class TSRHandler {
114115

115116
console.log(`Fetching media list for ${device.deviceId}...`)
116117

117-
const list = await device.executeAction(CasparCGActions.ListMedia, undefined)
118+
const list: ActionExecutionResult<ListMediaResult> = await device.executeAction('listMedia', {})
118119

119120
if (list.result === ActionExecutionResultCode.Error) {
120121
console.log(`Error fetching media list: ${list.response?.key}`)

packages/timeline-state-resolver-types/src/__tests__/__snapshots__/index.spec.ts.snap

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22

33
exports[`index imports 1`] = `
44
[
5-
"AbstractActions",
65
"ActionExecutionResultCode",
7-
"AtemActions",
86
"AtemMediaPoolType",
97
"AtemTransitionStyle",
108
"BlendMode",
119
"BorderBevel",
12-
"CasparCGActions",
1310
"ChannelFormat",
1411
"Chroma",
1512
"DeviceType",
@@ -20,8 +17,6 @@ exports[`index imports 1`] = `
2017
"FlyKeyKeyFrame",
2118
"FocusMode",
2219
"HttpMethod",
23-
"HttpSendActions",
24-
"HyperdeckActions",
2520
"LawoDeviceMode",
2621
"MappingAtemType",
2722
"MappingCasparCGType",
@@ -40,17 +35,12 @@ exports[`index imports 1`] = `
4035
"MultiOSCDeviceType",
4136
"OSCDeviceType",
4237
"OSCValueType",
43-
"PanasonicPTZActions",
44-
"QuantelActions",
4538
"QuantelControlMode",
4639
"QuantelTransitionType",
4740
"ShotokuTransitionType",
48-
"SisyfosActions",
4941
"SlotId",
5042
"SlotStatus",
51-
"SofieChefActions",
5243
"StatusCode",
53-
"TcpSendActions",
5444
"Timeline",
5545
"TimelineContentTypeAtem",
5646
"TimelineContentTypeCasparCg",
@@ -79,10 +69,6 @@ exports[`index imports 1`] = `
7969
"VMixInputType",
8070
"VMixTransitionType",
8171
"VideoFormat",
82-
"ViscaOverIPActions",
83-
"VizMSEActions",
84-
"VmixActions",
85-
"WebsocketClientActions",
8672
"fillStateFromDatastore",
8773
"interpolateTemplateString",
8874
"interpolateTemplateStringIfNeeded",

packages/timeline-state-resolver-types/src/device.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,28 @@ import {
22
DeviceType,
33
AtemOptions,
44
CasparCGOptions,
5-
HTTPSendOptions,
5+
HttpSendOptions,
66
HyperdeckOptions,
7-
OBSOptions,
8-
OSCOptions,
7+
ObsOptions,
8+
OscOptions,
99
PharosOptions,
1010
QuantelOptions,
1111
SingularLiveOptions,
1212
SisyfosOptions,
1313
SofieChefOptions,
14-
TCPSendOptions,
14+
TcpSendOptions,
1515
AbstractOptions,
1616
LawoOptions,
1717
PanasonicPTZOptions,
18-
HTTPWatcherOptions,
18+
HttpWatcherOptions,
1919
VizMSEOptions,
20-
VMixOptions,
20+
VmixOptions,
2121
ShotokuOptions,
2222
TelemetricsOptions,
2323
TriCasterOptions,
24-
MultiOSCOptions,
24+
MultiOscOptions,
2525
ViscaOverIPOptions,
26-
WebSocketClientOptions,
26+
WebsocketClientOptions,
2727
} from '.'
2828
import { DeviceCommonOptions } from './generated/common-options'
2929

@@ -93,13 +93,13 @@ export interface DeviceOptionsAtem extends DeviceOptionsBase<AtemOptions> {
9393
export interface DeviceOptionsLawo extends DeviceOptionsBase<LawoOptions> {
9494
type: DeviceType.LAWO
9595
}
96-
export interface DeviceOptionsHTTPSend extends DeviceOptionsBase<HTTPSendOptions> {
96+
export interface DeviceOptionsHTTPSend extends DeviceOptionsBase<HttpSendOptions> {
9797
type: DeviceType.HTTPSEND
9898
}
9999
export interface DeviceOptionsPanasonicPTZ extends DeviceOptionsBase<PanasonicPTZOptions> {
100100
type: DeviceType.PANASONIC_PTZ
101101
}
102-
export interface DeviceOptionsTCPSend extends DeviceOptionsBase<TCPSendOptions> {
102+
export interface DeviceOptionsTCPSend extends DeviceOptionsBase<TcpSendOptions> {
103103
type: DeviceType.TCPSEND
104104
}
105105
export interface DeviceOptionsHyperdeck extends DeviceOptionsBase<HyperdeckOptions> {
@@ -108,13 +108,13 @@ export interface DeviceOptionsHyperdeck extends DeviceOptionsBase<HyperdeckOptio
108108
export interface DeviceOptionsPharos extends DeviceOptionsBase<PharosOptions> {
109109
type: DeviceType.PHAROS
110110
}
111-
export interface DeviceOptionsOBS extends DeviceOptionsBase<OBSOptions> {
111+
export interface DeviceOptionsOBS extends DeviceOptionsBase<ObsOptions> {
112112
type: DeviceType.OBS
113113
}
114-
export interface DeviceOptionsOSC extends DeviceOptionsBase<OSCOptions> {
114+
export interface DeviceOptionsOSC extends DeviceOptionsBase<OscOptions> {
115115
type: DeviceType.OSC
116116
}
117-
export interface DeviceOptionsHTTPWatcher extends DeviceOptionsBase<HTTPWatcherOptions> {
117+
export interface DeviceOptionsHTTPWatcher extends DeviceOptionsBase<HttpWatcherOptions> {
118118
type: DeviceType.HTTPWATCHER
119119
}
120120
export interface DeviceOptionsSisyfos extends DeviceOptionsBase<SisyfosOptions> {
@@ -135,7 +135,7 @@ export interface DeviceOptionsSingularLive extends DeviceOptionsBase<SingularLiv
135135
export interface DeviceOptionsShotoku extends DeviceOptionsBase<ShotokuOptions> {
136136
type: DeviceType.SHOTOKU
137137
}
138-
export interface DeviceOptionsVMix extends DeviceOptionsBase<VMixOptions> {
138+
export interface DeviceOptionsVMix extends DeviceOptionsBase<VmixOptions> {
139139
type: DeviceType.VMIX
140140
}
141141
export interface DeviceOptionsTelemetrics extends DeviceOptionsBase<TelemetricsOptions> {
@@ -144,13 +144,13 @@ export interface DeviceOptionsTelemetrics extends DeviceOptionsBase<TelemetricsO
144144
export interface DeviceOptionsTriCaster extends DeviceOptionsBase<TriCasterOptions> {
145145
type: DeviceType.TRICASTER
146146
}
147-
export interface DeviceOptionsMultiOSC extends DeviceOptionsBase<MultiOSCOptions> {
147+
export interface DeviceOptionsMultiOSC extends DeviceOptionsBase<MultiOscOptions> {
148148
type: DeviceType.MULTI_OSC
149149
}
150150
export interface DeviceOptionsViscaOverIP extends DeviceOptionsBase<ViscaOverIPOptions> {
151151
type: DeviceType.VISCA_OVER_IP
152152
}
153153

154-
export interface DeviceOptionsWebSocketClient extends DeviceOptionsBase<WebSocketClientOptions> {
154+
export interface DeviceOptionsWebSocketClient extends DeviceOptionsBase<WebsocketClientOptions> {
155155
type: DeviceType.WEBSOCKET_CLIENT
156156
}

packages/timeline-state-resolver-types/src/generated/abstract.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,12 @@ export interface AbstractOptions {}
1010

1111
export type SomeMappingAbstract = Record<string, never>
1212

13-
export enum AbstractActions {
14-
TestAction = 'testAction'
13+
export interface AbstractActionMethods {
14+
testAction: (id: string, payload: Record<string, never>) => Promise<ActionExecutionResult<void>>
1515
}
16-
export interface AbstractActionExecutionResults {
17-
testAction: () => void
18-
}
19-
export type AbstractActionExecutionPayload<A extends keyof AbstractActionExecutionResults> = Parameters<
20-
AbstractActionExecutionResults[A]
21-
>[0]
2216

23-
export type AbstractActionExecutionResult<A extends keyof AbstractActionExecutionResults> =
24-
ActionExecutionResult<ReturnType<AbstractActionExecutionResults[A]>>
17+
export interface AbstractDeviceTypes {
18+
Options: AbstractOptions
19+
Mappings: SomeMappingAbstract
20+
Actions: AbstractActionMethods
21+
}

packages/timeline-state-resolver-types/src/generated/atem.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,12 @@ export enum MappingAtemType {
8787

8888
export type SomeMappingAtem = MappingAtemMixEffect | MappingAtemDownStreamKeyer | MappingAtemSuperSourceBox | MappingAtemAuxilliary | MappingAtemMediaPlayer | MappingAtemSuperSourceProperties | MappingAtemAudioChannel | MappingAtemMacroPlayer | MappingAtemAudioRouting | MappingAtemColorGenerator
8989

90-
export enum AtemActions {
91-
Resync = 'resync'
90+
export interface AtemActionMethods {
91+
resync: (id: string, payload: Record<string, never>) => Promise<ActionExecutionResult<void>>
9292
}
93-
export interface AtemActionExecutionResults {
94-
resync: () => void
95-
}
96-
export type AtemActionExecutionPayload<A extends keyof AtemActionExecutionResults> = Parameters<
97-
AtemActionExecutionResults[A]
98-
>[0]
9993

100-
export type AtemActionExecutionResult<A extends keyof AtemActionExecutionResults> =
101-
ActionExecutionResult<ReturnType<AtemActionExecutionResults[A]>>
94+
export interface AtemDeviceTypes {
95+
Options: AtemOptions
96+
Mappings: SomeMappingAtem
97+
Actions: AtemActionMethods
98+
}

packages/timeline-state-resolver-types/src/generated/casparCG.ts

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,14 @@ export type ListMediaResult = {
5454
framerate: number
5555
}[]
5656

57-
export enum CasparCGActions {
58-
ClearAllChannels = 'clearAllChannels',
59-
RestartServer = 'restartServer',
60-
ListMedia = 'listMedia'
57+
export interface CasparCGActionMethods {
58+
clearAllChannels: (id: string, payload: Record<string, never>) => Promise<ActionExecutionResult<void>>,
59+
restartServer: (id: string, payload: Record<string, never>) => Promise<ActionExecutionResult<void>>,
60+
listMedia: (id: string, payload: ListMediaPayload) => Promise<ActionExecutionResult<ListMediaResult>>
6161
}
62-
export interface CasparCGActionExecutionResults {
63-
clearAllChannels: () => void,
64-
restartServer: () => void,
65-
listMedia: (payload: ListMediaPayload) => ListMediaResult
66-
}
67-
export type CasparCGActionExecutionPayload<A extends keyof CasparCGActionExecutionResults> = Parameters<
68-
CasparCGActionExecutionResults[A]
69-
>[0]
7062

71-
export type CasparCGActionExecutionResult<A extends keyof CasparCGActionExecutionResults> =
72-
ActionExecutionResult<ReturnType<CasparCGActionExecutionResults[A]>>
63+
export interface CasparCGDeviceTypes {
64+
Options: CasparCGOptions
65+
Mappings: SomeMappingCasparCG
66+
Actions: CasparCGActionMethods
67+
}

packages/timeline-state-resolver-types/src/generated/generic-ptz-actions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ export enum FocusMode {
8282

8383
export interface GetFocusPositionResult {
8484
/**
85-
* Zoom Position; Range: [0.0, 1.0]; 0.0 = furthest NEAR, 1.0 = furthest FAR (each protocol might internally support a different range, which the value will be mapped from)
85+
* Focus Position; Range: [0.0, 1.0]; 0.0 = furthest NEAR, 1.0 = furthest FAR (each protocol might internally support a different range, which the value will be mapped from)
8686
*/
87-
zoomPosition: number
87+
focusPosition: number
8888
}
8989

9090
export type FocusModeResult = FocusMode

packages/timeline-state-resolver-types/src/generated/httpSend.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
import { ActionExecutionResult } from ".."
88

9-
export interface HTTPSendOptions {
9+
export interface HttpSendOptions {
1010
/**
1111
* Minimum time in ms before a command is resent, set to <= 0 or undefined to disable
1212
*/
@@ -69,17 +69,13 @@ export interface SendCommandResult {
6969
body: string
7070
}
7171

72-
export enum HttpSendActions {
73-
Resync = 'resync',
74-
SendCommand = 'sendCommand'
72+
export interface HttpSendActionMethods {
73+
resync: (id: string, payload: Record<string, never>) => Promise<ActionExecutionResult<void>>,
74+
sendCommand: (id: string, payload: HTTPSendCommandContent) => Promise<ActionExecutionResult<SendCommandResult>>
7575
}
76-
export interface HttpSendActionExecutionResults {
77-
resync: () => void,
78-
sendCommand: (payload: HTTPSendCommandContent) => SendCommandResult
79-
}
80-
export type HttpSendActionExecutionPayload<A extends keyof HttpSendActionExecutionResults> = Parameters<
81-
HttpSendActionExecutionResults[A]
82-
>[0]
8376

84-
export type HttpSendActionExecutionResult<A extends keyof HttpSendActionExecutionResults> =
85-
ActionExecutionResult<ReturnType<HttpSendActionExecutionResults[A]>>
77+
export interface HttpSendDeviceTypes {
78+
Options: HttpSendOptions
79+
Mappings: SomeMappingHttpSend
80+
Actions: HttpSendActionMethods
81+
}

packages/timeline-state-resolver-types/src/generated/httpWatcher.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* and run "yarn generate-schema-types" to regenerate this file.
66
*/
77

8-
export interface HTTPWatcherOptions {
8+
export interface HttpWatcherOptions {
99
uri: string
1010
httpMethod?: HttpMethod
1111
expectedHttpResponse?: number
@@ -24,3 +24,9 @@ export enum HttpMethod {
2424
}
2525

2626
export type SomeMappingHttpWatcher = Record<string, never>
27+
28+
export interface HttpWatcherDeviceTypes {
29+
Options: HttpWatcherOptions
30+
Mappings: SomeMappingHttpWatcher
31+
Actions: null
32+
}

0 commit comments

Comments
 (0)