Skip to content

Commit 3286d49

Browse files
committed
fix: change part mos item statuses to be an array, to avoid minimongo key errors
1 parent 7b5f0a4 commit 3286d49

File tree

5 files changed

+39
-19
lines changed

5 files changed

+39
-19
lines changed

meteor/server/publications/ingestStatus/createIngestRundownStatus.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ function createIngestPartStatus(
127127
externalId: ingestPart.externalId,
128128

129129
isReady: isReady ?? null,
130-
itemsReady: itemsReady ?? {},
130+
itemsReady: itemsReady ?? [],
131131

132132
playbackStatus,
133133
}

packages/blueprints-integration/src/documents/part.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { UserEditingDefinition } from '../userEditing'
22
import type { NoteSeverity } from '../lib'
33
import type { ITranslatableMessage } from '../translations'
4+
import type { IngestPartNotifyItemReady } from '@sofie-automation/shared-lib/dist/ingest/rundownStatus'
45

56
/** Timings for the inTransition, when supported and allowed */
67
export interface IBlueprintPartInTransition {
@@ -65,7 +66,7 @@ export interface IBlueprintMutatablePart<TPrivateData = unknown, TPublicData = u
6566
ingestNotifyPartReady?: boolean | null
6667

6768
/** Report items as ready to the ingest-device. Only named items will be reported, using the boolean value provided */
68-
ingestNotifyItemsReady?: Record<string, boolean | undefined>
69+
ingestNotifyItemsReady?: IngestPartNotifyItemReady[]
6970

7071
/** Classes to set on the TimelineGroupObj for this part */
7172
classes?: string[]

packages/job-worker/src/blueprints/context/lib.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import {
6060
} from '@sofie-automation/blueprints-integration/dist/userEditing'
6161
import type { PlayoutMutatablePart } from '../../playout/model/PlayoutPartInstanceModel'
6262
import { BlueprintQuickLookInfo } from '@sofie-automation/blueprints-integration/dist/context/quickLoopInfo'
63+
import { IngestPartNotifyItemReady } from '@sofie-automation/shared-lib/dist/ingest/rundownStatus'
6364

6465
/**
6566
* Convert an object to have all the values of all keys (including optionals) be 'true'
@@ -274,7 +275,7 @@ export function convertPartToBlueprints(part: ReadonlyDeep<DBPart>): IBlueprintP
274275
holdMode: part.holdMode,
275276
shouldNotifyCurrentPlayingPart: part.shouldNotifyCurrentPlayingPart,
276277
ingestNotifyPartReady: part.ingestNotifyPartReady,
277-
ingestNotifyItemsReady: clone(part.ingestNotifyItemsReady),
278+
ingestNotifyItemsReady: clone<IngestPartNotifyItemReady[] | undefined>(part.ingestNotifyItemsReady),
278279
classes: clone<string[] | undefined>(part.classes),
279280
classesForNext: clone<string[] | undefined>(part.classesForNext),
280281
displayDurationGroup: part.displayDurationGroup,

packages/mos-gateway/src/mosStatus/diff.ts

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { IMOSObjectStatus } from '@mos-connection/connector'
22
import type { MosDeviceStatusesConfig } from '../generated/devices'
33
import {
4+
IngestPartNotifyItemReady,
45
IngestPartPlaybackStatus,
56
type IngestPartStatus,
67
type IngestRundownStatus,
@@ -51,14 +52,12 @@ export function diffStatuses(
5152
})
5253

5354
// Clear any items too
54-
for (const [itemId, isReady] of Object.entries<boolean | undefined>(story.itemsReady)) {
55-
if (isReady === undefined) continue
56-
55+
for (const itemStatus of story.itemsReady) {
5756
statuses.push({
5857
type: 'item',
5958
rundownExternalId,
6059
storyId,
61-
itemId: itemId,
60+
itemId: itemStatus.externalId,
6261
mosStatus: MOS_STATUS_UNKNOWN,
6362
})
6463
}
@@ -88,21 +87,35 @@ export function diffStatuses(
8887
})
8988
}
9089

91-
// Diff each item in the story
92-
const previousItemStatuses = previousStatus?.itemsReady ?? {}
93-
const allItemIds = new Set<string>([...Object.keys(status.itemsReady), ...Object.keys(previousItemStatuses)])
90+
const allItemIds = new Set<string>()
91+
const previousItemStatuses = new Map<string, IngestPartNotifyItemReady>()
92+
const newItemStatuses = new Map<string, IngestPartNotifyItemReady>()
9493

94+
for (const itemStatus of previousStatus?.itemsReady ?? []) {
95+
previousItemStatuses.set(itemStatus.externalId, itemStatus)
96+
allItemIds.add(itemStatus.externalId)
97+
}
98+
for (const itemStatus of status.itemsReady) {
99+
newItemStatuses.set(itemStatus.externalId, itemStatus)
100+
allItemIds.add(itemStatus.externalId)
101+
}
102+
103+
// Diff each item in the story
95104
for (const itemId of allItemIds) {
96-
const newReady = status.itemsReady[itemId]
97-
const previousReady = previousItemStatuses[itemId]
105+
const newItemStatus = newItemStatuses.get(itemId)
106+
const previousItemStatus = previousItemStatuses.get(itemId)
98107

99-
const newMosStatus =
100-
newReady !== undefined
101-
? buildMosStatus(config, status.playbackStatus, newReady, newStatuses?.active)
102-
: null
108+
const newMosStatus = newItemStatus
109+
? buildMosStatus(config, status.playbackStatus, newItemStatus.ready, newStatuses?.active)
110+
: null
103111
const previousMosStatus =
104-
previousReady !== undefined && previousStatus
105-
? buildMosStatus(config, previousStatus.playbackStatus, previousReady, previousStatuses?.active)
112+
previousItemStatus && previousStatus
113+
? buildMosStatus(
114+
config,
115+
previousStatus.playbackStatus,
116+
previousItemStatus.ready,
117+
previousStatuses?.active
118+
)
106119
: null
107120

108121
if ((newMosStatus !== null || previousMosStatus !== null) && previousMosStatus !== newMosStatus) {

packages/shared-lib/src/ingest/rundownStatus.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export interface IngestPartStatus {
3030

3131
isReady: boolean | null
3232

33-
itemsReady: Record<string, boolean | undefined>
33+
itemsReady: IngestPartNotifyItemReady[]
3434

3535
playbackStatus: IngestPartPlaybackStatus
3636
}
@@ -40,3 +40,8 @@ export enum IngestPartPlaybackStatus {
4040
PLAY = 'play',
4141
STOP = 'stop',
4242
}
43+
44+
export interface IngestPartNotifyItemReady {
45+
externalId: string
46+
ready: boolean
47+
}

0 commit comments

Comments
 (0)