forked from Sofie-Automation/sofie-core
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrundownContentObserver.ts
More file actions
81 lines (74 loc) · 1.89 KB
/
rundownContentObserver.ts
File metadata and controls
81 lines (74 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { Meteor } from 'meteor/meteor'
import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
import { logger } from '../../logging'
import {
ContentCache,
partFieldSpecifier,
partInstanceFieldSpecifier,
rundownFieldSpecifier,
segmentFieldSpecifier,
} from './reactiveContentCache'
import { PartInstances, Parts, Rundowns, Segments } from '../../collections'
import { waitForAllObserversReady } from '../lib/lib'
export class RundownContentObserver {
readonly #observers: Meteor.LiveQueryHandle[]
readonly #cache: ContentCache
private constructor(cache: ContentCache, observers: Meteor.LiveQueryHandle[]) {
this.#cache = cache
this.#observers = observers
}
static async create(rundownIds: RundownId[], cache: ContentCache): Promise<RundownContentObserver> {
logger.silly(`Creating RundownContentObserver for rundowns "${rundownIds.join(',')}"`)
const observers = await waitForAllObserversReady([
Rundowns.observeChanges(
{
_id: {
$in: rundownIds,
},
},
cache.Rundowns.link(),
{
projection: rundownFieldSpecifier,
}
),
Segments.observeChanges(
{
rundownId: {
$in: rundownIds,
},
},
cache.Segments.link(),
{
projection: segmentFieldSpecifier,
}
),
Parts.observeChanges(
{
rundownId: {
$in: rundownIds,
},
},
cache.Parts.link(),
{
projection: partFieldSpecifier,
}
),
PartInstances.observeChanges(
{
rundownId: { $in: rundownIds },
reset: { $ne: true },
$or: [{ invalidReason: { $exists: true } }, { orphaned: 'deleted' }],
},
cache.PartInstances.link(),
{ projection: partInstanceFieldSpecifier }
),
])
return new RundownContentObserver(cache, observers)
}
public get cache(): ContentCache {
return this.#cache
}
public dispose = (): void => {
this.#observers.forEach((observer) => observer.stop())
}
}