Skip to content

Commit ff6516b

Browse files
committed
refactor(LSG): move classes and types around
1 parent eae0cb1 commit ff6516b

23 files changed

+332
-263
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { CorelibPubSubCollections, CorelibPubSubTypes } from '@sofie-automation/corelib/dist/pubsub'
2+
import {
3+
StudioId,
4+
CoreConnection,
5+
ProtectedString,
6+
Collection as CoreCollection,
7+
CollectionDocCheck,
8+
} from '@sofie-automation/server-core-integration'
9+
import throttleToNextTick from '@sofie-automation/shared-lib/dist/lib/throttleToNextTick'
10+
import * as _ from 'underscore'
11+
import { Logger } from 'winston'
12+
import { CoreHandler } from './coreHandler'
13+
import { arePropertiesShallowEqual } from './helpers/equality'
14+
import { CollectionHandlers } from './liveStatusServer'
15+
import { ObserverCallback } from './wsHandler'
16+
17+
export const DEFAULT_THROTTLE_PERIOD_MS = 20
18+
19+
export abstract class CollectionBase<T, TCollection extends keyof CorelibPubSubCollections> {
20+
protected _name: string
21+
protected _collectionName: TCollection
22+
protected _logger: Logger
23+
protected _coreHandler: CoreHandler
24+
protected _studioId!: StudioId
25+
protected _observers: Map<
26+
ObserverCallback<T, keyof T>,
27+
{ keysToPick: readonly (keyof T)[] | undefined; lastData: T | undefined }
28+
> = new Map()
29+
protected _collectionData: T | undefined
30+
31+
protected get _core(): CoreConnection<CorelibPubSubTypes, CorelibPubSubCollections> {
32+
return this._coreHandler.core
33+
}
34+
protected throttledChanged: () => void
35+
36+
constructor(
37+
collection: TCollection,
38+
logger: Logger,
39+
coreHandler: CoreHandler,
40+
throttlePeriodMs = DEFAULT_THROTTLE_PERIOD_MS
41+
) {
42+
this._name = this.constructor.name
43+
this._collectionName = collection
44+
this._logger = logger
45+
this._coreHandler = coreHandler
46+
47+
this.throttledChanged = throttleToNextTick(
48+
throttlePeriodMs > 0
49+
? _.throttle(() => this.changed(), throttlePeriodMs, { leading: true, trailing: true })
50+
: () => this.changed()
51+
)
52+
53+
this._logger.info(`Starting ${this._name} handler`)
54+
}
55+
56+
init(_handlers: CollectionHandlers): void {
57+
if (!this._coreHandler.studioId) throw new Error('StudioId is not defined')
58+
this._studioId = this._coreHandler.studioId
59+
}
60+
61+
close(): void {
62+
this._logger.info(`Closing ${this._name} handler`)
63+
}
64+
65+
subscribe<K extends keyof T>(callback: ObserverCallback<T, K>, keysToPick?: readonly K[]): void {
66+
//this._logger.info(`${name}' added observer for '${this._name}'`)
67+
if (this._collectionData) callback(this._collectionData)
68+
this._observers.set(callback, { keysToPick, lastData: this.shallowClone(this._collectionData) })
69+
}
70+
71+
/**
72+
* Called after a batch of updates to documents in the collection
73+
*/
74+
protected changed(): void {
75+
// override me
76+
}
77+
78+
notify(data: T | undefined): void {
79+
for (const [observer, o] of this._observers) {
80+
if (
81+
!o.lastData ||
82+
!o.keysToPick ||
83+
!data ||
84+
!arePropertiesShallowEqual(o.lastData, data, undefined, o.keysToPick)
85+
) {
86+
observer(data)
87+
o.lastData = this.shallowClone(data)
88+
}
89+
}
90+
}
91+
92+
protected shallowClone(data: T | undefined): T | undefined {
93+
if (data === undefined) return undefined
94+
if (Array.isArray(data)) return [...data] as T
95+
if (typeof data === 'object') return { ...data }
96+
return data
97+
}
98+
99+
protected logDocumentChange(documentId: string | ProtectedString<any>, changeType: string): void {
100+
this._logger.silly(`${this._name} ${changeType} ${documentId}`)
101+
}
102+
103+
protected logUpdateReceived(collectionName: string, updateCount: number | undefined): void
104+
protected logUpdateReceived(collectionName: string, extraInfo?: string): void
105+
protected logUpdateReceived(
106+
collectionName: string,
107+
extraInfoOrUpdateCount: string | number | undefined | null = null
108+
): void {
109+
let message = `${this._name} received ${collectionName} update`
110+
if (typeof extraInfoOrUpdateCount === 'string') {
111+
message += `, ${extraInfoOrUpdateCount}`
112+
} else if (extraInfoOrUpdateCount !== null) {
113+
message += `(${extraInfoOrUpdateCount})`
114+
}
115+
this._logger.debug(message)
116+
}
117+
118+
protected logNotifyingUpdate(updateCount: number | undefined): void {
119+
this._logger.debug(`${this._name} notifying update with ${updateCount} ${this._collectionName}`)
120+
}
121+
122+
protected getCollectionOrFail(): CoreCollection<CollectionDocCheck<CorelibPubSubCollections[TCollection]>> {
123+
const collection = this._core.getCollection<TCollection>(this._collectionName)
124+
if (!collection) throw new Error(`collection '${this._collectionName}' not found!`)
125+
return collection
126+
}
127+
}

packages/live-status-gateway/src/collections/adLibActionsHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { AdLibAction } from '@sofie-automation/corelib/dist/dataModel/AdlibAction'
56
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
67
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
78
import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
89
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
910
import { CollectionHandlers } from '../liveStatusServer'
11+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
1012

1113
const PLAYLIST_KEYS = ['currentPartInfo', 'nextPartInfo'] as const
12-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
14+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
1315

1416
export class AdLibActionsHandler
1517
extends PublicationCollection<AdLibAction[], CorelibPubSub.adLibActions, CollectionName.AdLibActions>

packages/live-status-gateway/src/collections/adLibsHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { AdLibPiece } from '@sofie-automation/corelib/dist/dataModel/AdLibPiece'
56
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
67
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
78
import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
89
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
910
import { CollectionHandlers } from '../liveStatusServer'
11+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
1012

1113
const PLAYLIST_KEYS = ['currentPartInfo', 'nextPartInfo'] as const
12-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
14+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
1315

1416
export class AdLibsHandler
1517
extends PublicationCollection<AdLibPiece[], CorelibPubSub.adLibPieces, CollectionName.AdLibPieces>

packages/live-status-gateway/src/collections/globalAdLibActionsHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { RundownBaselineAdLibAction } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibAction'
56
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
67
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
78
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
89
import { CollectionHandlers } from '../liveStatusServer'
910
import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
11+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
1012

1113
const PLAYLIST_KEYS = ['currentPartInfo', 'nextPartInfo'] as const
12-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
14+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
1315

1416
export class GlobalAdLibActionsHandler
1517
extends PublicationCollection<

packages/live-status-gateway/src/collections/globalAdLibsHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { RundownBaselineAdLibItem } from '@sofie-automation/corelib/dist/dataModel/RundownBaselineAdLibPiece'
56
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
67
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
78
import { RundownId } from '@sofie-automation/corelib/dist/dataModel/Ids'
89
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
910
import { CollectionHandlers } from '../liveStatusServer'
11+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
1012

1113
const PLAYLIST_KEYS = ['currentPartInfo', 'nextPartInfo'] as const
12-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
14+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
1315

1416
export class GlobalAdLibsHandler
1517
extends PublicationCollection<

packages/live-status-gateway/src/collections/partHandler.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
56
import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
67
import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
@@ -9,12 +10,13 @@ import { PartsHandler } from './partsHandler'
910
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
1011
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
1112
import { CollectionHandlers } from '../liveStatusServer'
13+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
1214

1315
const PLAYLIST_KEYS = ['_id', 'rundownIdsInOrder'] as const
14-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
16+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
1517

1618
const PART_INSTANCES_KEYS = ['current'] as const
17-
type PartInstances = PickArr<SelectedPartInstances, typeof PART_INSTANCES_KEYS>
19+
type PartInstances = PickKeys<SelectedPartInstances, typeof PART_INSTANCES_KEYS>
1820

1921
export class PartHandler
2022
extends PublicationCollection<DBPart, CorelibPubSub.parts, CollectionName.Parts>

packages/live-status-gateway/src/collections/partInstancesHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
56
import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
67
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
@@ -10,6 +11,7 @@ import throttleToNextTick from '@sofie-automation/shared-lib/dist/lib/throttleTo
1011
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'
1112
import { RundownId, RundownPlaylistActivationId } from '@sofie-automation/corelib/dist/dataModel/Ids'
1213
import { CollectionHandlers } from '../liveStatusServer'
14+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
1315

1416
export interface SelectedPartInstances {
1517
previous: DBPartInstance | undefined
@@ -27,7 +29,7 @@ const PLAYLIST_KEYS = [
2729
'nextPartInfo',
2830
'rundownIdsInOrder',
2931
] as const
30-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
32+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
3133

3234
export class PartInstancesHandler
3335
extends PublicationCollection<SelectedPartInstances, CorelibPubSub.partInstances, CollectionName.PartInstances>

packages/live-status-gateway/src/collections/partsHandler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { CollectionBase, Collection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { CollectionBase } from '../collectionBase'
45
import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
56
import _ = require('underscore')
67
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'

packages/live-status-gateway/src/collections/pieceInstancesHandler.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { Collection, PickArr, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
45
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
56
import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
67
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
@@ -20,6 +21,7 @@ import { DBPartInstance } from '@sofie-automation/corelib/dist/dataModel/PartIns
2021
import { arePropertiesDeepEqual } from '../helpers/equality'
2122
import { CollectionHandlers } from '../liveStatusServer'
2223
import { ReadonlyDeep } from 'type-fest'
24+
import { PickKeys } from '@sofie-automation/shared-lib/dist/lib/types'
2325

2426
const PLAYLIST_KEYS = [
2527
'_id',
@@ -29,13 +31,13 @@ const PLAYLIST_KEYS = [
2931
'previousPartInfo',
3032
'rundownIdsInOrder',
3133
] as const
32-
type Playlist = PickArr<DBRundownPlaylist, typeof PLAYLIST_KEYS>
34+
type Playlist = PickKeys<DBRundownPlaylist, typeof PLAYLIST_KEYS>
3335

3436
const PART_INSTANCES_KEYS = ['previous', 'current'] as const
35-
type PartInstances = PickArr<SelectedPartInstances, typeof PART_INSTANCES_KEYS>
37+
type PartInstances = PickKeys<SelectedPartInstances, typeof PART_INSTANCES_KEYS>
3638

3739
const SHOW_STYLE_BASE_KEYS = ['sourceLayers'] as const
38-
type ShowStyle = PickArr<ShowStyleBaseExt, typeof SHOW_STYLE_BASE_KEYS>
40+
type ShowStyle = PickKeys<ShowStyleBaseExt, typeof SHOW_STYLE_BASE_KEYS>
3941

4042
export type PieceInstanceMin = Omit<ReadonlyDeep<PieceInstance>, 'reportedStartedPlayback' | 'reportedStoppedPlayback'>
4143

packages/live-status-gateway/src/collections/playlistHandler.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { Logger } from 'winston'
22
import { CoreHandler } from '../coreHandler'
3-
import { CollectionBase, Collection, PublicationCollection } from '../wsHandler'
3+
import { Collection } from '../wsHandler'
4+
import { PublicationCollection } from '../publicationCollection'
5+
import { CollectionBase } from '../collectionBase'
46
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
57
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
68
import { CorelibPubSub } from '@sofie-automation/corelib/dist/pubsub'

0 commit comments

Comments
 (0)