11import { ExpectedPackage , Time } from '@sofie-automation/blueprints-integration'
2- import { protectString , unprotectString } from '../protectedString'
3- import { assertNever , getHash } from '../lib'
2+ import { protectString } from '../protectedString'
3+ import { getHash , hashObj } from '../lib'
44import {
55 AdLibActionId ,
66 BucketAdLibActionId ,
@@ -51,33 +51,43 @@ export interface ExpectedPackageDB {
5151
5252 created : Time
5353
54- package : ReadonlyDeep < ExpectedPackage . Any >
54+ package : ReadonlyDeep < Omit < ExpectedPackage . Base , 'listenToPackageInfoUpdates' > >
5555
56- // HACK: This should be ExpectedPackageIngestSource[], but for the first iteration this is limited to a single source
57- ingestSources : [ ExpectedPackageIngestSource ]
56+ /**
57+ * The ingest sources that generated this package.
58+ */
59+ ingestSources : ExpectedPackageIngestSource [ ]
5860
5961 // playoutSources: {
6062 // /** Any playout PieceInstance. This is limited to the current and next partInstances */
6163 // pieceInstanceIds: PieceInstanceId[]
6264 // }
6365}
6466
65- export interface ExpectedPackageIngestSourceBucketPiece {
67+ export interface ExpectedPackageIngestSourceBase {
68+ /** The id of the package as known by the blueprints */
69+ blueprintPackageId : string
70+
71+ /** Whether the blueprints are listening for updates to packageInfos for this package */
72+ listenToPackageInfoUpdates : boolean | undefined
73+ }
74+
75+ export interface ExpectedPackageIngestSourceBucketAdlibPiece extends ExpectedPackageIngestSourceBase {
6676 fromPieceType : ExpectedPackageDBType . BUCKET_ADLIB
6777 /** The Bucket adlib this package belongs to */
6878 pieceId : BucketAdLibId
6979 /** The `externalId` of the Bucket adlib this package belongs to */
7080 pieceExternalId : string
7181}
72- export interface ExpectedPackageIngestSourceBucketAdlibAction {
82+ export interface ExpectedPackageIngestSourceBucketAdlibAction extends ExpectedPackageIngestSourceBase {
7383 fromPieceType : ExpectedPackageDBType . BUCKET_ADLIB_ACTION
7484 /** The Bucket adlib-action this package belongs to */
7585 pieceId : BucketAdLibActionId
7686 /** The `externalId` of the Bucket adlib-action this package belongs to */
7787 pieceExternalId : string
7888}
7989
80- export interface ExpectedPackageIngestSourcePiece {
90+ export interface ExpectedPackageIngestSourcePiece extends ExpectedPackageIngestSourceBase {
8191 fromPieceType : ExpectedPackageDBType . PIECE | ExpectedPackageDBType . ADLIB_PIECE
8292 /** The Piece this package belongs to */
8393 pieceId : PieceId
@@ -86,7 +96,7 @@ export interface ExpectedPackageIngestSourcePiece {
8696 /** The Segment this package belongs to */
8797 segmentId : SegmentId
8898}
89- export interface ExpectedPackageIngestSourceAdlibAction {
99+ export interface ExpectedPackageIngestSourceAdlibAction extends ExpectedPackageIngestSourceBase {
90100 fromPieceType : ExpectedPackageDBType . ADLIB_ACTION
91101 /** The Piece this package belongs to */
92102 pieceId : AdLibActionId
@@ -95,29 +105,29 @@ export interface ExpectedPackageIngestSourceAdlibAction {
95105 /** The Segment this package belongs to */
96106 segmentId : SegmentId
97107}
98- export interface ExpectedPackageIngestSourceBaselineAdlibPiece {
108+ export interface ExpectedPackageIngestSourceBaselineAdlibPiece extends ExpectedPackageIngestSourceBase {
99109 fromPieceType : ExpectedPackageDBType . BASELINE_ADLIB_PIECE
100110 /** The Piece this package belongs to */
101111 pieceId : PieceId
102112}
103- export interface ExpectedPackageIngestSourceBaselineAdlibAction {
113+ export interface ExpectedPackageIngestSourceBaselineAdlibAction extends ExpectedPackageIngestSourceBase {
104114 fromPieceType : ExpectedPackageDBType . BASELINE_ADLIB_ACTION
105115 /** The Piece this package belongs to */
106116 pieceId : RundownBaselineAdLibActionId
107117}
108- export interface ExpectedPackageIngestSourceBaselineObjects {
118+ export interface ExpectedPackageIngestSourceBaselineObjects extends ExpectedPackageIngestSourceBase {
109119 fromPieceType : ExpectedPackageDBType . RUNDOWN_BASELINE_OBJECTS
110120}
111121
112- export interface ExpectedPackageIngestSourceStudioBaseline {
122+ export interface ExpectedPackageIngestSourceStudioBaseline extends ExpectedPackageIngestSourceBase {
113123 // Future: Technically this is a playout source, but for now it needs to be treated as an ingest source
114124 fromPieceType : ExpectedPackageDBType . STUDIO_BASELINE_OBJECTS
115125}
116126
117127export type ExpectedPackageIngestSourcePart = ExpectedPackageIngestSourcePiece | ExpectedPackageIngestSourceAdlibAction
118128
119129export type ExpectedPackageIngestSourceBucket =
120- | ExpectedPackageIngestSourceBucketPiece
130+ | ExpectedPackageIngestSourceBucketAdlibPiece
121131 | ExpectedPackageIngestSourceBucketAdlibAction
122132
123133export type ExpectedPackageIngestSourceRundownBaseline =
@@ -145,56 +155,21 @@ export function getExpectedPackageIdForPieceInstance(
145155}
146156
147157/**
148- * Generate the temporary expectedPackageId for the given package .
149- * Note: This will soon be replaced with a new flow based on the contentVersionHash once shared ownership is implemented .
158+ * Generate the expectedPackageId for the given expectedPackage .
159+ * This is a stable id derived from the package and its parent. This document is expected to be owned by multiple sources .
150160 */
151- export function getExpectedPackageIdFromIngestSource (
161+ export function getExpectedPackageIdNew (
152162 /** Preferably a RundownId or BucketId, but StudioId is allowed when not owned by a rundown or bucket */
153163 parentId : RundownId | StudioId | BucketId ,
154- source : ExpectedPackageIngestSource ,
155164 /** The locally unique id of the expectedPackage */
156- localExpectedPackageId : ExpectedPackage . Base [ '_id' ]
165+ expectedPackage : ReadonlyDeep < Omit < ExpectedPackage . Base , 'listenToPackageInfoUpdates' > >
157166) : ExpectedPackageId {
158- let ownerId : string
159- const ownerPieceType = source . fromPieceType
160- switch ( source . fromPieceType ) {
161- case ExpectedPackageDBType . PIECE :
162- case ExpectedPackageDBType . ADLIB_PIECE :
163- case ExpectedPackageDBType . ADLIB_ACTION :
164- case ExpectedPackageDBType . BASELINE_ADLIB_PIECE :
165- case ExpectedPackageDBType . BASELINE_ADLIB_ACTION :
166- ownerId = unprotectString ( source . pieceId )
167- break
168- case ExpectedPackageDBType . RUNDOWN_BASELINE_OBJECTS :
169- ownerId = 'rundownBaselineObjects'
170- break
171- case ExpectedPackageDBType . STUDIO_BASELINE_OBJECTS :
172- ownerId = 'studioBaseline'
173- break
174- case ExpectedPackageDBType . BUCKET_ADLIB :
175- case ExpectedPackageDBType . BUCKET_ADLIB_ACTION :
176- ownerId = unprotectString ( source . pieceId )
177- break
178-
179- default :
180- assertNever ( source )
181- throw new Error ( `Unknown fromPieceType "${ ownerPieceType } "` )
182- }
183- return protectString ( `${ parentId } _${ ownerId } _${ getHash ( localExpectedPackageId ) } ` )
167+ // This may be too agressive, but we don't know how to merge some of the properties
168+ const objHash = hashObj ( {
169+ ...expectedPackage ,
170+ _id : '' , // Ignore the _id, this is not guaranteed to be stable
171+ listenToPackageInfoUpdates : false , // Not relevant for the hash
172+ } satisfies ReadonlyDeep < ExpectedPackage . Base > )
173+
174+ return protectString ( `${ parentId } _${ getHash ( objHash ) } ` )
184175}
185-
186- // Future implementation of id generation, once shared ownership is implemented
187- // export function getExpectedPackageIdNew(
188- // /** _id of the rundown*/
189- // rundownId: RundownId,
190- // /** The locally unique id of the expectedPackage */
191- // expectedPackage: ReadonlyDeep<ExpectedPackage.Any>
192- // ): ExpectedPackageId {
193- // // This may be too agressive, but we don't know how to merge some of the properties
194- // const objHash = hashObj({
195- // ...expectedPackage,
196- // listenToPackageInfoUpdates: false, // Not relevant for the hash
197- // } satisfies ReadonlyDeep<ExpectedPackage.Any>)
198-
199- // return protectString(`${rundownId}_${getHash(objHash)}`)
200- // }
0 commit comments