11import { ExpectedPackage , Time } from '@sofie-automation/blueprints-integration'
2- import { protectString , unprotectString } from '../protectedString.js'
3- import { getHash , assertNever } from '../lib.js'
2+ import { protectString } from '../protectedString.js'
3+ import { getHash , hashObj } from '../lib.js'
44import {
55 AdLibActionId ,
66 BucketAdLibActionId ,
@@ -52,33 +52,43 @@ export interface ExpectedPackageDB {
5252
5353 created : Time
5454
55- package : ReadonlyDeep < ExpectedPackage . Any >
55+ package : ReadonlyDeep < Omit < ExpectedPackage . Base , 'listenToPackageInfoUpdates' > >
5656
57- // HACK: This should be ExpectedPackageIngestSource[], but for the first iteration this is limited to a single source
58- ingestSources : [ ExpectedPackageIngestSource ]
57+ /**
58+ * The ingest sources that generated this package.
59+ */
60+ ingestSources : ExpectedPackageIngestSource [ ]
5961
6062 // playoutSources: {
6163 // /** Any playout PieceInstance. This is limited to the current and next partInstances */
6264 // pieceInstanceIds: PieceInstanceId[]
6365 // }
6466}
6567
66- export interface ExpectedPackageIngestSourceBucketPiece {
68+ export interface ExpectedPackageIngestSourceBase {
69+ /** The id of the package as known by the blueprints */
70+ blueprintPackageId : string
71+
72+ /** Whether the blueprints are listening for updates to packageInfos for this package */
73+ listenToPackageInfoUpdates : boolean | undefined
74+ }
75+
76+ export interface ExpectedPackageIngestSourceBucketAdlibPiece extends ExpectedPackageIngestSourceBase {
6777 fromPieceType : ExpectedPackageDBType . BUCKET_ADLIB
6878 /** The Bucket adlib this package belongs to */
6979 pieceId : BucketAdLibId
7080 /** The `externalId` of the Bucket adlib this package belongs to */
7181 pieceExternalId : string
7282}
73- export interface ExpectedPackageIngestSourceBucketAdlibAction {
83+ export interface ExpectedPackageIngestSourceBucketAdlibAction extends ExpectedPackageIngestSourceBase {
7484 fromPieceType : ExpectedPackageDBType . BUCKET_ADLIB_ACTION
7585 /** The Bucket adlib-action this package belongs to */
7686 pieceId : BucketAdLibActionId
7787 /** The `externalId` of the Bucket adlib-action this package belongs to */
7888 pieceExternalId : string
7989}
8090
81- export interface ExpectedPackageIngestSourcePiece {
91+ export interface ExpectedPackageIngestSourcePiece extends ExpectedPackageIngestSourceBase {
8292 fromPieceType : ExpectedPackageDBType . PIECE | ExpectedPackageDBType . ADLIB_PIECE
8393 /** The Piece this package belongs to */
8494 pieceId : PieceId
@@ -87,7 +97,7 @@ export interface ExpectedPackageIngestSourcePiece {
8797 /** The Segment this package belongs to */
8898 segmentId : SegmentId
8999}
90- export interface ExpectedPackageIngestSourceAdlibAction {
100+ export interface ExpectedPackageIngestSourceAdlibAction extends ExpectedPackageIngestSourceBase {
91101 fromPieceType : ExpectedPackageDBType . ADLIB_ACTION
92102 /** The Piece this package belongs to */
93103 pieceId : AdLibActionId
@@ -96,34 +106,34 @@ export interface ExpectedPackageIngestSourceAdlibAction {
96106 /** The Segment this package belongs to */
97107 segmentId : SegmentId
98108}
99- export interface ExpectedPackageIngestSourceBaselinePiece {
109+ export interface ExpectedPackageIngestSourceBaselinePiece extends ExpectedPackageIngestSourceBase {
100110 fromPieceType : ExpectedPackageDBType . BASELINE_PIECE
101111 /** The Piece this package belongs to */
102112 pieceId : PieceId
103113}
104- export interface ExpectedPackageIngestSourceBaselineAdlibPiece {
114+ export interface ExpectedPackageIngestSourceBaselineAdlibPiece extends ExpectedPackageIngestSourceBase {
105115 fromPieceType : ExpectedPackageDBType . BASELINE_ADLIB_PIECE
106116 /** The Piece this package belongs to */
107117 pieceId : PieceId
108118}
109- export interface ExpectedPackageIngestSourceBaselineAdlibAction {
119+ export interface ExpectedPackageIngestSourceBaselineAdlibAction extends ExpectedPackageIngestSourceBase {
110120 fromPieceType : ExpectedPackageDBType . BASELINE_ADLIB_ACTION
111121 /** The Piece this package belongs to */
112122 pieceId : RundownBaselineAdLibActionId
113123}
114- export interface ExpectedPackageIngestSourceBaselineObjects {
124+ export interface ExpectedPackageIngestSourceBaselineObjects extends ExpectedPackageIngestSourceBase {
115125 fromPieceType : ExpectedPackageDBType . RUNDOWN_BASELINE_OBJECTS
116126}
117127
118- export interface ExpectedPackageIngestSourceStudioBaseline {
128+ export interface ExpectedPackageIngestSourceStudioBaseline extends ExpectedPackageIngestSourceBase {
119129 // Future: Technically this is a playout source, but for now it needs to be treated as an ingest source
120130 fromPieceType : ExpectedPackageDBType . STUDIO_BASELINE_OBJECTS
121131}
122132
123133export type ExpectedPackageIngestSourcePart = ExpectedPackageIngestSourcePiece | ExpectedPackageIngestSourceAdlibAction
124134
125135export type ExpectedPackageIngestSourceBucket =
126- | ExpectedPackageIngestSourceBucketPiece
136+ | ExpectedPackageIngestSourceBucketAdlibPiece
127137 | ExpectedPackageIngestSourceBucketAdlibAction
128138
129139export type ExpectedPackageIngestSourceRundownBaseline =
@@ -152,57 +162,21 @@ export function getExpectedPackageIdForPieceInstance(
152162}
153163
154164/**
155- * Generate the temporary expectedPackageId for the given package .
156- * Note: This will soon be replaced with a new flow based on the contentVersionHash once shared ownership is implemented .
165+ * Generate the expectedPackageId for the given expectedPackage .
166+ * This is a stable id derived from the package and its parent. This document is expected to be owned by multiple sources .
157167 */
158- export function getExpectedPackageIdFromIngestSource (
168+ export function getExpectedPackageIdNew (
159169 /** Preferably a RundownId or BucketId, but StudioId is allowed when not owned by a rundown or bucket */
160170 parentId : RundownId | StudioId | BucketId ,
161- source : ExpectedPackageIngestSource ,
162171 /** The locally unique id of the expectedPackage */
163- localExpectedPackageId : ExpectedPackage . Base [ '_id' ]
172+ expectedPackage : ReadonlyDeep < Omit < ExpectedPackage . Base , 'listenToPackageInfoUpdates' > >
164173) : ExpectedPackageId {
165- let ownerId : string
166- const ownerPieceType = source . fromPieceType
167- switch ( source . fromPieceType ) {
168- case ExpectedPackageDBType . PIECE :
169- case ExpectedPackageDBType . ADLIB_PIECE :
170- case ExpectedPackageDBType . ADLIB_ACTION :
171- case ExpectedPackageDBType . BASELINE_PIECE :
172- case ExpectedPackageDBType . BASELINE_ADLIB_PIECE :
173- case ExpectedPackageDBType . BASELINE_ADLIB_ACTION :
174- ownerId = unprotectString ( source . pieceId )
175- break
176- case ExpectedPackageDBType . RUNDOWN_BASELINE_OBJECTS :
177- ownerId = 'rundownBaselineObjects'
178- break
179- case ExpectedPackageDBType . STUDIO_BASELINE_OBJECTS :
180- ownerId = 'studioBaseline'
181- break
182- case ExpectedPackageDBType . BUCKET_ADLIB :
183- case ExpectedPackageDBType . BUCKET_ADLIB_ACTION :
184- ownerId = unprotectString ( source . pieceId )
185- break
186-
187- default :
188- assertNever ( source )
189- throw new Error ( `Unknown fromPieceType "${ ownerPieceType } "` )
190- }
191- return protectString ( `${ parentId } _${ ownerId } _${ getHash ( localExpectedPackageId ) } ` )
174+ // This may be too agressive, but we don't know how to merge some of the properties
175+ const objHash = hashObj ( {
176+ ...expectedPackage ,
177+ _id : '' , // Ignore the _id, this is not guaranteed to be stable
178+ listenToPackageInfoUpdates : false , // Not relevant for the hash
179+ } satisfies ReadonlyDeep < ExpectedPackage . Base > )
180+
181+ return protectString ( `${ parentId } _${ getHash ( objHash ) } ` )
192182}
193-
194- // Future implementation of id generation, once shared ownership is implemented
195- // export function getExpectedPackageIdNew(
196- // /** _id of the rundown*/
197- // rundownId: RundownId,
198- // /** The locally unique id of the expectedPackage */
199- // expectedPackage: ReadonlyDeep<ExpectedPackage.Any>
200- // ): ExpectedPackageId {
201- // // This may be too agressive, but we don't know how to merge some of the properties
202- // const objHash = hashObj({
203- // ...expectedPackage,
204- // listenToPackageInfoUpdates: false, // Not relevant for the hash
205- // } satisfies ReadonlyDeep<ExpectedPackage.Any>)
206-
207- // return protectString(`${rundownId}_${getHash(objHash)}`)
208- // }
0 commit comments