@clockworkdog/cogs-client 0.16.0 → 1.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const urls_1 = require("./helpers/urls");
4
+ const VideoState_1 = require("./types/VideoState");
5
+ const DEFAULT_PARENT_ELEMENT = document.body;
6
+ class VideoPlayer {
7
+ constructor(cogsConnection, parentElement = DEFAULT_PARENT_ELEMENT) {
8
+ this.eventTarget = new EventTarget();
9
+ this.globalVolume = 1;
10
+ this.videoClipPlayers = {};
11
+ this.parentElement = parentElement;
12
+ // Send the current status of each clip to COGS
13
+ this.addEventListener('videoClipState', ({ detail }) => {
14
+ cogsConnection.sendMediaClipState(detail);
15
+ });
16
+ // Listen for video control messages
17
+ cogsConnection.addEventListener('message', (event) => {
18
+ const message = event.detail;
19
+ switch (message.type) {
20
+ case 'media_config_update':
21
+ this.setGlobalVolume(message.globalVolume);
22
+ this.updateConfig(message.files);
23
+ break;
24
+ case 'video_play':
25
+ this.playVideoClip(message.file, {
26
+ playId: message.playId,
27
+ volume: message.volume,
28
+ loop: Boolean(message.loop),
29
+ fit: message.fit,
30
+ });
31
+ break;
32
+ case 'video_pause':
33
+ this.pauseVideoClip();
34
+ break;
35
+ case 'video_stop':
36
+ this.stopVideoClip();
37
+ break;
38
+ case 'video_set_volume':
39
+ this.setVideoClipVolume({ volume: message.volume });
40
+ break;
41
+ case 'video_set_fit':
42
+ this.setVideoClipFit({ fit: message.fit });
43
+ break;
44
+ }
45
+ });
46
+ // On connection, send the current playing state of all clips
47
+ // (Usually empty unless websocket is reconnecting)
48
+ const sendInitialClipStates = () => {
49
+ const files = Object.entries(this.videoClipPlayers).map(([file, player]) => {
50
+ const status = !player.videoElement.paused
51
+ ? 'playing'
52
+ : player.videoElement.currentTime === 0 || player.videoElement.currentTime === player.videoElement.duration
53
+ ? 'paused'
54
+ : 'stopped';
55
+ return [file, status];
56
+ });
57
+ cogsConnection.sendInitialMediaClipStates({ mediaType: 'video', files });
58
+ };
59
+ cogsConnection.addEventListener('open', sendInitialClipStates);
60
+ sendInitialClipStates();
61
+ }
62
+ setParentElement(parentElement) {
63
+ this.parentElement = parentElement;
64
+ Object.values(this.videoClipPlayers).forEach((clipPlayer) => {
65
+ parentElement.appendChild(clipPlayer.videoElement);
66
+ });
67
+ }
68
+ resetParentElement() {
69
+ this.setParentElement(DEFAULT_PARENT_ELEMENT);
70
+ }
71
+ setGlobalVolume(globalVolume) {
72
+ Object.values(this.videoClipPlayers).forEach((clipPlayer) => {
73
+ clipPlayer.videoElement.volume = clipPlayer.volume * globalVolume;
74
+ });
75
+ this.globalVolume = globalVolume;
76
+ this.notifyStateListeners();
77
+ }
78
+ playVideoClip(path, { playId, volume, loop, fit }) {
79
+ if (this.activeClip) {
80
+ if (this.activeClip.path !== path) {
81
+ this.stopVideoClip();
82
+ }
83
+ }
84
+ else {
85
+ if (!this.videoClipPlayers[path]) {
86
+ this.videoClipPlayers[path] = this.createClipPlayer(path, { preload: false, ephemeral: true, fit });
87
+ }
88
+ }
89
+ this.activeClip = { path, playId };
90
+ this.updateVideoClipPlayer(path, (clipPlayer) => {
91
+ clipPlayer.volume = volume;
92
+ clipPlayer.videoElement.volume = volume * this.globalVolume;
93
+ clipPlayer.videoElement.loop = loop;
94
+ clipPlayer.videoElement.style.objectFit = fit;
95
+ if (clipPlayer.videoElement.currentTime === clipPlayer.videoElement.duration) {
96
+ clipPlayer.videoElement.currentTime = 0;
97
+ }
98
+ clipPlayer.videoElement.play();
99
+ clipPlayer.videoElement.style.display = 'block';
100
+ return clipPlayer;
101
+ });
102
+ }
103
+ pauseVideoClip() {
104
+ if (this.activeClip) {
105
+ const { playId, path } = this.activeClip;
106
+ this.updateVideoClipPlayer(path, (clipPlayer) => {
107
+ var _a;
108
+ (_a = clipPlayer.videoElement) === null || _a === void 0 ? void 0 : _a.pause();
109
+ return clipPlayer;
110
+ });
111
+ this.notifyClipStateListeners(playId, path, 'paused');
112
+ }
113
+ }
114
+ stopVideoClip() {
115
+ if (this.activeClip) {
116
+ this.handleStoppedClip(this.activeClip.path);
117
+ }
118
+ }
119
+ setVideoClipVolume({ volume }) {
120
+ if (!this.activeClip) {
121
+ return;
122
+ }
123
+ if (!(volume >= 0 && volume <= 1)) {
124
+ console.warn('Invalid volume', volume);
125
+ return;
126
+ }
127
+ this.updateVideoClipPlayer(this.activeClip.path, (clipPlayer) => {
128
+ if (clipPlayer.videoElement) {
129
+ clipPlayer.videoElement.volume = volume * this.globalVolume;
130
+ }
131
+ return clipPlayer;
132
+ });
133
+ }
134
+ setVideoClipLoop({ loop }) {
135
+ if (!this.activeClip) {
136
+ return;
137
+ }
138
+ this.updateVideoClipPlayer(this.activeClip.path, (clipPlayer) => {
139
+ if (clipPlayer.videoElement) {
140
+ clipPlayer.videoElement.loop = loop || false;
141
+ }
142
+ return clipPlayer;
143
+ });
144
+ }
145
+ setVideoClipFit({ fit }) {
146
+ if (!this.activeClip) {
147
+ return;
148
+ }
149
+ this.updateVideoClipPlayer(this.activeClip.path, (clipPlayer) => {
150
+ if (clipPlayer.videoElement) {
151
+ clipPlayer.videoElement.style.objectFit = fit;
152
+ }
153
+ return clipPlayer;
154
+ });
155
+ }
156
+ handleStoppedClip(path) {
157
+ if (!this.activeClip || this.activeClip.path !== path) {
158
+ return;
159
+ }
160
+ const playId = this.activeClip.playId;
161
+ // Once an ephemeral clip stops, cleanup and remove the player
162
+ if (this.videoClipPlayers[this.activeClip.path].config.ephemeral) {
163
+ this.unloadClip(path);
164
+ }
165
+ this.activeClip = undefined;
166
+ this.updateVideoClipPlayer(path, (clipPlayer) => {
167
+ clipPlayer.videoElement.pause();
168
+ clipPlayer.videoElement.currentTime = 0;
169
+ clipPlayer.videoElement.style.display = 'none';
170
+ return clipPlayer;
171
+ });
172
+ this.notifyClipStateListeners(playId, path, 'stopped');
173
+ }
174
+ updateVideoClipPlayer(path, update) {
175
+ if (this.videoClipPlayers[path]) {
176
+ const newPlayer = update(this.videoClipPlayers[path]);
177
+ if (newPlayer) {
178
+ this.videoClipPlayers[path] = newPlayer;
179
+ }
180
+ else {
181
+ delete this.videoClipPlayers[path];
182
+ }
183
+ this.notifyStateListeners();
184
+ }
185
+ }
186
+ updateConfig(newPaths) {
187
+ const newVideoPaths = Object.fromEntries(Object.entries(newPaths).filter(([, { type }]) => type === 'video' || !type));
188
+ const previousClipPlayers = this.videoClipPlayers;
189
+ this.videoClipPlayers = (() => {
190
+ const clipPlayers = { ...previousClipPlayers };
191
+ const removedClips = Object.keys(previousClipPlayers).filter((previousPath) => !(previousPath in newVideoPaths) && !previousClipPlayers[previousPath].config.ephemeral);
192
+ removedClips.forEach((path) => {
193
+ this.unloadClip(path);
194
+ delete clipPlayers[path];
195
+ });
196
+ const addedClips = Object.entries(newVideoPaths).filter(([newFile]) => !previousClipPlayers[newFile]);
197
+ addedClips.forEach(([path, config]) => {
198
+ clipPlayers[path] = this.createClipPlayer(path, { ...config, ephemeral: false, fit: 'contain' });
199
+ });
200
+ const updatedClips = Object.entries(previousClipPlayers).filter(([previousPath]) => previousPath in newVideoPaths);
201
+ updatedClips.forEach(([path, previousClipPlayer]) => {
202
+ if (previousClipPlayer.config.preload !== newVideoPaths[path].preload) {
203
+ this.unloadClip(path);
204
+ clipPlayers[path] = this.createClipPlayer(path, { ...previousClipPlayer.config, preload: newVideoPaths[path].preload, ephemeral: false });
205
+ }
206
+ });
207
+ return clipPlayers;
208
+ })();
209
+ this.notifyStateListeners();
210
+ }
211
+ notifyStateListeners() {
212
+ var _a, _b, _c, _d, _e, _f;
213
+ const VideoState = {
214
+ globalVolume: this.globalVolume,
215
+ isPlaying: this.activeClip ? !((_a = this.videoClipPlayers[this.activeClip.path].videoElement) === null || _a === void 0 ? void 0 : _a.paused) : false,
216
+ clips: { ...this.videoClipPlayers },
217
+ activeClip: this.activeClip
218
+ ? {
219
+ path: this.activeClip.path,
220
+ state: !((_b = this.videoClipPlayers[this.activeClip.path].videoElement) === null || _b === void 0 ? void 0 : _b.paused) ? VideoState_1.ActiveVideoClipState.Playing : VideoState_1.ActiveVideoClipState.Paused,
221
+ loop: (_d = (_c = this.videoClipPlayers[this.activeClip.path].videoElement) === null || _c === void 0 ? void 0 : _c.loop) !== null && _d !== void 0 ? _d : false,
222
+ volume: (_f = (_e = this.videoClipPlayers[this.activeClip.path].videoElement) === null || _e === void 0 ? void 0 : _e.volume) !== null && _f !== void 0 ? _f : 0,
223
+ }
224
+ : undefined,
225
+ };
226
+ this.dispatchEvent('state', VideoState);
227
+ }
228
+ notifyClipStateListeners(playId, file, status) {
229
+ this.dispatchEvent('videoClipState', { playId, mediaType: 'video', file, status });
230
+ }
231
+ // Type-safe wrapper around EventTarget
232
+ addEventListener(type, listener, options) {
233
+ this.eventTarget.addEventListener(type, listener, options);
234
+ }
235
+ removeEventListener(type, listener, options) {
236
+ this.eventTarget.removeEventListener(type, listener, options);
237
+ }
238
+ dispatchEvent(type, detail) {
239
+ this.eventTarget.dispatchEvent(new CustomEvent(type, { detail }));
240
+ }
241
+ createVideoElement(path, config, { volume }) {
242
+ const videoElement = document.createElement('video');
243
+ videoElement.src = urls_1.assetUrl(path);
244
+ videoElement.autoplay = false;
245
+ videoElement.loop = false;
246
+ videoElement.volume = this.globalVolume * volume;
247
+ videoElement.preload = config.preload ? 'metadata' : 'none';
248
+ videoElement.addEventListener('playing', () => {
249
+ var _a;
250
+ if (((_a = this.activeClip) === null || _a === void 0 ? void 0 : _a.path) === path) {
251
+ this.notifyClipStateListeners(this.activeClip.playId, path, 'playing');
252
+ }
253
+ });
254
+ videoElement.addEventListener('ended', () => {
255
+ if (!videoElement.loop) {
256
+ this.handleStoppedClip(path);
257
+ }
258
+ });
259
+ videoElement.style.position = 'absolute';
260
+ videoElement.style.top = '0';
261
+ videoElement.style.left = '0';
262
+ videoElement.style.width = '100%';
263
+ videoElement.style.height = '100%';
264
+ videoElement.style.objectFit = config.fit;
265
+ videoElement.style.display = 'none';
266
+ this.parentElement.appendChild(videoElement);
267
+ return videoElement;
268
+ }
269
+ createClipPlayer(path, config) {
270
+ const volume = 1;
271
+ return {
272
+ config,
273
+ videoElement: this.createVideoElement(path, config, { volume }),
274
+ volume,
275
+ };
276
+ }
277
+ unloadClip(path) {
278
+ var _a, _b;
279
+ if (((_a = this.activeClip) === null || _a === void 0 ? void 0 : _a.path) === path) {
280
+ this.activeClip = undefined;
281
+ }
282
+ (_b = this.videoClipPlayers[path]) === null || _b === void 0 ? void 0 : _b.videoElement.remove();
283
+ this.updateVideoClipPlayer(path, () => null);
284
+ }
285
+ }
286
+ exports.default = VideoPlayer;
287
+ //# sourceMappingURL=VideoPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../src/VideoPlayer.ts"],"names":[],"mappings":"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"}