@norskvideo/norsk-studio-source-switcher 1.9.0

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,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const react_1 = require("react");
5
+ const webrtc_client_1 = require("@norskvideo/webrtc-client");
6
+ const activeClasses = "active text-green-300 dark:text-green-300";
7
+ const availableClasses = "available text-green-300 dark:text-green-300";
8
+ const inactiveClasses = "inactive text-orange-300 dark:text-orange-300";
9
+ var currentClient = undefined;
10
+ function SummaryView({ state, config, sendCommand }) {
11
+ const [previewSource, setPreviewSource] = (0, react_1.useState)(undefined);
12
+ const [activePlayerSource, setActivePlayerSource] = (0, react_1.useState)(undefined);
13
+ const [initialLoad, setInitialLoad] = (0, react_1.useState)(true);
14
+ (0, react_1.useEffect)(() => {
15
+ if (previewSource !== activePlayerSource || initialLoad) {
16
+ const player = previewSource == undefined ? state.previewPlayerUrl : state.players.find((p) => p.source.id == previewSource.id && p.source.key == previewSource.key)?.player;
17
+ if (!player)
18
+ return;
19
+ if (currentClient) {
20
+ currentClient.videoElements.forEach((e) => {
21
+ e.remove();
22
+ });
23
+ }
24
+ currentClient = new webrtc_client_1.WhepClient({ url: player, container: document.getElementById(`${config.id}-preview`) ?? undefined });
25
+ void currentClient.start();
26
+ setActivePlayerSource(previewSource);
27
+ setInitialLoad(false);
28
+ }
29
+ }, [
30
+ previewSource,
31
+ activePlayerSource,
32
+ initialLoad,
33
+ state.players
34
+ ]);
35
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("h5", { children: "Sources" }), (0, jsx_runtime_1.jsx)("ul", { children: state.knownSources.map((s, i) => state.activeSource.id == s.id && state.activeSource.key == s.key ?
36
+ (0, jsx_runtime_1.jsxs)("li", { className: activeClasses, children: [s.key ?? s.id, " <--"] }, i)
37
+ : state.availableSources.find((a) => s.id == a.id && s.key == a.key)
38
+ ? (0, jsx_runtime_1.jsxs)("li", { className: availableClasses, children: [s.key ?? s.id, " (available)"] }, i)
39
+ : (0, jsx_runtime_1.jsxs)("li", { className: inactiveClasses, children: [s.key ?? s.id, " (inactive)"] }, i)) }), (0, jsx_runtime_1.jsx)("h2", { children: "Controls" }), (0, jsx_runtime_1.jsx)("h4", { children: previewSource ? previewSource.key ?? previewSource.id : "Preview" }), (0, jsx_runtime_1.jsx)("div", { id: `${config.id}-preview` }), (0, jsx_runtime_1.jsx)("label", { htmlFor: "select-preview", className: "mt-2", children: "Source" }), (0, jsx_runtime_1.jsxs)("select", { id: "select-preview", className: "mt-2 node-editor-select-input", onChange: (e) => {
40
+ setPreviewSource(JSON.parse(e.currentTarget.value));
41
+ }, children: [(0, jsx_runtime_1.jsx)("option", { selected: previewSource === undefined, children: "---" }), state.availableSources.map((s, i) => (0, jsx_runtime_1.jsx)("option", { selected: previewSource == s, value: JSON.stringify(s), children: s.key ?? s.id }, i))] }), previewSource ? (0, jsx_runtime_1.jsx)("button", { type: "button", className: "mt-2 mb-2 text-white w-full justify-center bg-primary-700 hover:bg-primary-800 focus:ring-4 focus:outline-none focus:ring-primary-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800", onClick: (e) => {
42
+ e.preventDefault();
43
+ sendCommand({ type: "select-source", source: previewSource, overlays: [] });
44
+ setPreviewSource(undefined);
45
+ }, children: "Make Active" }) : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {})] });
46
+ }
47
+ exports.default = SummaryView;
48
+ //# sourceMappingURL=summary-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-view.js","sourceRoot":"","sources":["../src/summary-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const norsk_sdk_1 = require("@norskvideo/norsk-sdk");
30
+ const client_types_1 = require("@norskvideo/norsk-studio/lib/extension/client-types");
31
+ const builder_1 = require("@norskvideo/norsk-studio/lib/test/_util/builder");
32
+ const runtime_1 = require("@norskvideo/norsk-studio/lib/test/_util/runtime");
33
+ const sinks_1 = require("@norskvideo/norsk-studio/lib/test/_util/sinks");
34
+ const sources_1 = require("@norskvideo/norsk-studio/lib/test/_util/sources");
35
+ const yaml_1 = __importDefault(require("yaml"));
36
+ const document = __importStar(require("@norskvideo/norsk-studio/lib/runtime/document"));
37
+ const execution_1 = __importDefault(require("@norskvideo/norsk-studio/lib/runtime/execution"));
38
+ const info_1 = __importDefault(require("../info"));
39
+ const runtime_2 = __importDefault(require("../runtime"));
40
+ const chai_1 = require("chai");
41
+ const util_1 = require("@norskvideo/norsk-studio/lib/shared/util");
42
+ const logging_1 = require("@norskvideo/norsk-studio/lib/server/logging");
43
+ const runtime_types_1 = require("@norskvideo/norsk-studio/lib/extension/runtime-types");
44
+ const CameraSelectInfo = (0, info_1.default)(client_types_1.RegistrationConsts);
45
+ async function testRuntime() {
46
+ const runtime = await (0, runtime_1.testRuntime)();
47
+ runtime.registerComponent(new runtime_2.default(), CameraSelectInfo, "");
48
+ return runtime;
49
+ }
50
+ describe("Multi camera select", () => {
51
+ const config = {
52
+ id: 'ss',
53
+ displayName: "sss",
54
+ resolution: {
55
+ width: 1920,
56
+ height: 1080
57
+ },
58
+ frameRate: {
59
+ frames: 25,
60
+ seconds: 1
61
+ },
62
+ sampleRate: 48000,
63
+ channelLayout: "mono",
64
+ };
65
+ describe("Runtime - Component", () => {
66
+ let norsk = undefined;
67
+ let result = undefined;
68
+ afterEach(async () => {
69
+ await norsk?.close();
70
+ await new Promise((r) => {
71
+ setTimeout(() => {
72
+ r();
73
+ }, 10.0);
74
+ });
75
+ norsk = undefined;
76
+ result = undefined;
77
+ });
78
+ const latestState = () => {
79
+ return result?.runtimeState.getNodeState('select');
80
+ };
81
+ const sendCommand = (command) => {
82
+ const definition = result?.document.components["select"].definition;
83
+ const node = result?.components["select"];
84
+ (0, logging_1.debuglog)("Sending command to node", { id: node.id, command });
85
+ definition.handleCommand(node, command);
86
+ };
87
+ const compileDocument = async () => {
88
+ const runtime = await testRuntime();
89
+ const yaml = new builder_1.YamlBuilder()
90
+ .addNode(new builder_1.YamlNodeBuilder('select', CameraSelectInfo, config).reify()).reify();
91
+ return document.load(__filename, runtime, yaml_1.default.stringify(yaml), { resolveConfig: true });
92
+ };
93
+ describe("No inputs", () => {
94
+ it("Should output A/V from the fallback source", async () => {
95
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
96
+ const compiled = await compileDocument();
97
+ result = await (0, execution_1.default)(norsk, compiled);
98
+ const switcher = result.components['select'];
99
+ await Promise.all([
100
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
101
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
102
+ (0, sinks_1.waitForAssert)(() => latestState()?.availableSources.length == 1, () => {
103
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('fallback', "Active source on component");
104
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('fallback', "active source on runtime state");
105
+ (0, chai_1.expect)(latestState()?.availableSources).length(1, "available sources");
106
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
107
+ }, 60000.0, 10.0),
108
+ ]);
109
+ });
110
+ });
111
+ describe("Single input, no commands sent", () => {
112
+ it("Should output A/V from the fallback source", async () => {
113
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
114
+ const source = await (0, sources_1.videoAndAudio)(norsk, "primary");
115
+ const compiled = await compileDocument();
116
+ result = await (0, execution_1.default)(norsk, compiled);
117
+ const switcher = result.components['select'];
118
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-first-stream", select: client_types_1.Av })]);
119
+ await Promise.all([
120
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
121
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
122
+ (0, sinks_1.waitForAssert)(() => latestState()?.availableSources.length == 2, () => {
123
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('fallback', "Active source on component");
124
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('fallback', "active source in runtime state");
125
+ (0, chai_1.expect)(latestState()?.availableSources).length(2, "available sources");
126
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('primary');
127
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
128
+ }, 10000.0, 10.0),
129
+ ]);
130
+ });
131
+ });
132
+ describe("Sending a switch source command when the source exists", () => {
133
+ it("switches to that source", async () => {
134
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
135
+ const source = await (0, sources_1.videoAndAudio)(norsk, "primary");
136
+ const compiled = await compileDocument();
137
+ result = await (0, execution_1.default)(norsk, compiled);
138
+ const switcher = result.components['select'];
139
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-first-stream", select: client_types_1.Av })]);
140
+ await (0, util_1.waitForCondition)(() => latestState()?.availableSources.length == 2);
141
+ sendCommand({
142
+ type: 'select-source', source: { id: 'primary' }, overlays: []
143
+ });
144
+ await Promise.all([
145
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
146
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
147
+ (0, sinks_1.waitForAssert)(() => latestState()?.activeSource.id == 'primary', () => {
148
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('primary', "Active source on component");
149
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('primary', "active source in runtime state");
150
+ (0, chai_1.expect)(latestState()?.availableSources).length(2, "available sources");
151
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('primary');
152
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
153
+ }, 60000.0, 10.0),
154
+ ]);
155
+ });
156
+ });
157
+ describe("Sending a switch source command when the source does not exist", () => {
158
+ it("leaves the current source intact", async () => {
159
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
160
+ const source = await (0, sources_1.videoAndAudio)(norsk, "primary");
161
+ const compiled = await compileDocument();
162
+ result = await (0, execution_1.default)(norsk, compiled);
163
+ const switcher = result.components['select'];
164
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-first-stream", select: client_types_1.Av })]);
165
+ await (0, util_1.waitForCondition)(() => latestState()?.availableSources.length == 2);
166
+ sendCommand({
167
+ type: 'select-source', source: { id: 'primary' }, overlays: []
168
+ });
169
+ await (0, util_1.waitForCondition)(() => latestState()?.activeSource.id == 'primary');
170
+ sendCommand({
171
+ type: 'select-source', source: { id: 'utter nonsense' }, overlays: []
172
+ });
173
+ await Promise.all([
174
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
175
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
176
+ (0, sinks_1.waitForAssert)(() => latestState()?.activeSource.id == 'primary', () => {
177
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('primary', "Active source on component");
178
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('primary', "active source in runtime state");
179
+ (0, chai_1.expect)(latestState()?.availableSources).length(2, "available sources");
180
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('primary');
181
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
182
+ }, 10000.0, 10.0),
183
+ ]);
184
+ });
185
+ });
186
+ describe("terminating the active source", () => {
187
+ it("switches to fallback, removes the source from available", async () => {
188
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
189
+ const source = await (0, sources_1.videoAndAudio)(norsk, "primary");
190
+ const compiled = await compileDocument();
191
+ result = await (0, execution_1.default)(norsk, compiled);
192
+ const switcher = result.components['select'];
193
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-first-stream", select: client_types_1.Av })]);
194
+ await (0, util_1.waitForCondition)(() => latestState()?.availableSources.length == 2 && latestState()?.activeSource.id == 'fallback');
195
+ sendCommand({
196
+ type: 'select-source', source: { id: 'primary' }, overlays: []
197
+ });
198
+ await (0, util_1.waitForCondition)(() => latestState()?.activeSource.id == 'primary');
199
+ await source.close();
200
+ await Promise.all([
201
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
202
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
203
+ (0, sinks_1.waitForAssert)(() => latestState().availableSources.length == 1 && latestState()?.activeSource.id == 'fallback', () => {
204
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('fallback', "Active source on component");
205
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('fallback', "active source on runtime state");
206
+ (0, chai_1.expect)(latestState()?.availableSources).length(1, "available sources");
207
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
208
+ }, 10000.0, 10.0),
209
+ ]);
210
+ });
211
+ });
212
+ describe("reviving a previously active source after termination", () => {
213
+ it("stays on fallback, source is available", async () => {
214
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
215
+ const source = await (0, sources_1.videoAndAudio)(norsk, "primary");
216
+ const compiled = await compileDocument();
217
+ result = await (0, execution_1.default)(norsk, compiled);
218
+ const switcher = result.components['select'];
219
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-first-stream", select: client_types_1.Av })]);
220
+ await (0, util_1.waitForCondition)(() => latestState()?.availableSources.length == 2 && latestState()?.activeSource.id == 'fallback');
221
+ sendCommand({
222
+ type: 'select-source', source: { id: 'primary' }, overlays: []
223
+ });
224
+ await (0, util_1.waitForCondition)(() => latestState()?.activeSource.id == 'primary');
225
+ switcher.subscribe([]);
226
+ await (0, util_1.waitForCondition)(() => latestState()?.availableSources.length == 1 && latestState()?.activeSource.id == 'fallback');
227
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-first-stream", select: client_types_1.Av })]);
228
+ await Promise.all([
229
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
230
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
231
+ (0, sinks_1.waitForAssert)(() => latestState()?.availableSources.length == 2, () => {
232
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('fallback', "Active source on component");
233
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('fallback', "active source on runtime state");
234
+ (0, chai_1.expect)(latestState()?.availableSources).length(2, "available sources");
235
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('primary');
236
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
237
+ }, 10000.0, 10.0),
238
+ ]);
239
+ });
240
+ });
241
+ describe("subscribing to a multi-av input", () => {
242
+ it("the subscribed-to entries are listed as known/available streams", async () => {
243
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
244
+ const sourceConfig = { id: 'foo', displayName: 'Foo', inputs: ["one", "two", "three"] };
245
+ const runtime = await testRuntime();
246
+ const yaml = new builder_1.YamlBuilder()
247
+ .addNode(new builder_1.YamlNodeBuilder('source', runtime_1.AvMultiInput.info, sourceConfig).reify())
248
+ .addNode(new builder_1.YamlNodeBuilder('select', CameraSelectInfo, config).reify())
249
+ .reify();
250
+ const compiled = document.load(__filename, runtime, yaml_1.default.stringify(yaml), { resolveConfig: true });
251
+ result = await (0, execution_1.default)(norsk, compiled);
252
+ const switcher = result.components['select'];
253
+ const source = result.components['source'];
254
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, compiled.components['source'].yaml, { type: "take-specific-streams", select: client_types_1.Av, filter: ["one", "two"] }, runtime_1.AvMultiInput.info)]);
255
+ await Promise.all([
256
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
257
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
258
+ (0, sinks_1.waitForAssert)(() => latestState()?.availableSources.length == 3, () => {
259
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('fallback', "Active source on component");
260
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('fallback', "active source on runtime state");
261
+ (0, chai_1.expect)(latestState()?.availableSources).length(3, "available sources");
262
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.key)).contains('one');
263
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.key)).contains('two');
264
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
265
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.key)).contains('one');
266
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.key)).contains('two');
267
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.id)).contains('fallback');
268
+ }, 10000.0, 10.0),
269
+ ]);
270
+ });
271
+ it("Unavailable entries are shown as known about but not available", async () => {
272
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
273
+ const sourceConfig = { id: 'source', displayName: "source", inputs: ["one", "two", "three"] };
274
+ const runtime = await testRuntime();
275
+ const yaml = new builder_1.YamlBuilder()
276
+ .addNode(new builder_1.YamlNodeBuilder('source', runtime_1.AvMultiInput.info, sourceConfig).reify())
277
+ .addNode(new builder_1.YamlNodeBuilder('select', CameraSelectInfo, config).reify())
278
+ .reify();
279
+ const compiled = document.load(__filename, runtime, yaml_1.default.stringify(yaml), { resolveConfig: true });
280
+ result = await (0, execution_1.default)(norsk, compiled);
281
+ const switcher = result.components['select'];
282
+ const source = result.components['source'];
283
+ const sourceNodeDescription = compiled.components['source'].yaml;
284
+ sourceNodeDescription.config = { ...sourceConfig, inputs: ['nope', ...sourceConfig.inputs] };
285
+ switcher.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, sourceNodeDescription, { type: "take-specific-streams", select: client_types_1.Av, filter: ["one", "two", "nope"] }, runtime_1.AvMultiInput.info)]);
286
+ await Promise.all([
287
+ (0, sinks_1.assertNodeOutputsAudioFrames)(norsk, result, 'select'),
288
+ (0, sinks_1.assertNodeOutputsVideoFrames)(norsk, result, 'select'),
289
+ (0, sinks_1.waitForAssert)(() => latestState()?.availableSources.length == 3, () => {
290
+ (0, chai_1.expect)(switcher.activeSource.primary.id).equals('fallback', "Active source on component");
291
+ (0, chai_1.expect)(latestState()?.activeSource.id).equals('fallback', "active source on runtime state");
292
+ (0, chai_1.expect)(latestState()?.availableSources).length(3, "available sources");
293
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.key)).contains('one');
294
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.key)).contains('two');
295
+ (0, chai_1.expect)(latestState()?.availableSources.map((s) => s.id)).contains('fallback');
296
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.key)).contains('one');
297
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.key)).contains('two');
298
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.key)).contains('nope');
299
+ (0, chai_1.expect)(latestState()?.knownSources.map((s) => s.id)).contains('fallback');
300
+ }, 10000.0, 10.0),
301
+ ]);
302
+ });
303
+ });
304
+ });
305
+ });
306
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/test/runtime.ts"],"names":[],"mappings":"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"}
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/lib/types.yaml ADDED
@@ -0,0 +1,120 @@
1
+ openapi: 3.0.0
2
+ components:
3
+ schemas:
4
+ stream:
5
+ type: string
6
+ example: source1-stream
7
+ rect:
8
+ type: object
9
+ required:
10
+ - x
11
+ - y
12
+ - width
13
+ - height
14
+ properties:
15
+ x:
16
+ type: number
17
+ "y":
18
+ type: number
19
+ width:
20
+ type: number
21
+ height:
22
+ type: number
23
+
24
+ overlay:
25
+ type: object
26
+ required:
27
+ - source
28
+ properties:
29
+ source:
30
+ $ref: '#/components/schemas/stream'
31
+ sourceRect:
32
+ $ref: '#/components/schemas/rect'
33
+ destRect:
34
+ $ref: '#/components/schemas/rect'
35
+
36
+ status-update:
37
+ type: object
38
+ required:
39
+ - primary
40
+ properties:
41
+ primary:
42
+ $ref: '#/components/schemas/stream'
43
+ transition:
44
+ $ref: '#/components/schemas/transition'
45
+ overlays:
46
+ type: array
47
+ items:
48
+ $ref: '#/components/schemas/overlay'
49
+ active-source:
50
+ type: object
51
+ required:
52
+ - source
53
+ - resolution
54
+ - age
55
+ properties:
56
+ source:
57
+ $ref: '#/components/schemas/stream'
58
+ resolution:
59
+ type: object
60
+ properties:
61
+ width:
62
+ type: 'number'
63
+ height:
64
+ type: 'number'
65
+ age:
66
+ type: number
67
+ description: "The number of milliseconds this source has been active"
68
+ frameRate:
69
+ type: object
70
+ properties:
71
+ frames:
72
+ type: 'number'
73
+ seconds:
74
+ type: 'number'
75
+
76
+ status:
77
+ type: object
78
+ required:
79
+ - active
80
+ - available
81
+ properties:
82
+ active:
83
+ type: object
84
+ required:
85
+ - primary
86
+ - overlays
87
+ properties:
88
+ primary:
89
+ $ref: '#/components/schemas/stream'
90
+ overlays:
91
+ type: array
92
+ items:
93
+ $ref: '#/components/schemas/overlay'
94
+ available:
95
+ type: array
96
+ items:
97
+ $ref: '#/components/schemas/active-source'
98
+
99
+ transition:
100
+ discriminator:
101
+ propertyName: type
102
+ oneOf:
103
+ - type: object
104
+ properties:
105
+ type:
106
+ type: string
107
+ enum:
108
+ - fade
109
+ durationMs:
110
+ type: number
111
+ description: How long this transition should take
112
+ - type: object
113
+ properties:
114
+ type:
115
+ type: string
116
+ enum:
117
+ - animate
118
+ durationMs:
119
+ type: number
120
+ description: How long this transition should take
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@norskvideo/norsk-studio-source-switcher",
3
+ "version": "1.9.0",
4
+ "description": "",
5
+ "scripts": {
6
+ "clean": "rm -rf lib",
7
+ "build": "npx npm-run-all build:* && rm -rf build",
8
+ "build:server": "npx tsc",
9
+ "build:client": "npx tsc -p tsconfig-client.json && npx studio-bundle build/info.js client/info.js",
10
+ "build:css": "cp src/style.css client/style.css",
11
+ "build:types": "cp src/types.yaml lib/types.yaml",
12
+ "build:tailwind": "npx tailwindcss -i src/tailwind.css -o client/tailwind.css",
13
+ "build:eslint": "npx eslint src",
14
+ "test": "mocha --no-parallel --jobs=0 --timeout 120000 --recursive lib/test"
15
+ },
16
+ "files": [
17
+ "lib",
18
+ "client"
19
+ ],
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "@aws-sdk/client-mediaconnect": "^3.499.0",
23
+ "@aws-sdk/client-medialive": "^3.499.0",
24
+ "@aws-sdk/client-mediapackage": "^3.499.0",
25
+ "@aws-sdk/client-translate": "^3.535.0",
26
+ "@norskvideo/norsk-sdk": "^1.0.375",
27
+ "@norskvideo/norsk-studio": "^1.21.0",
28
+ "@norskvideo/norsk-studio-built-ins": "^1.13.0",
29
+ "@norskvideo/webrtc-client": "^0.1.2",
30
+ "express": "^4.18.2",
31
+ "express-ws": "^5.0.2",
32
+ "json-refs": "^3.0.15",
33
+ "openapi-types": "^12.1.3"
34
+ },
35
+ "main": "lib/index.js",
36
+ "devDependencies": {
37
+ "@types/chai": "^4.3.11",
38
+ "@types/express": "^4.17.20",
39
+ "@types/express-ws": "^3.0.3",
40
+ "@types/hls-parser": "^0.8.7",
41
+ "@types/mocha": "^10.0.6",
42
+ "@types/node-fetch": "^2.6.9",
43
+ "@types/react": "^18.2.33",
44
+ "@types/react-dom": "^18.2.14",
45
+ "@typescript-eslint/eslint-plugin": "^6.19.0",
46
+ "@typescript-eslint/parser": "^6.9.1",
47
+ "chai": "^4.3.10",
48
+ "chart.js": "^4.4.2",
49
+ "esbuild": "^0.20.2",
50
+ "esbuild-plugin-external-global": "^1.0.1",
51
+ "eslint": "^8.53.0",
52
+ "hls-parser": "^0.10.8",
53
+ "hls.js": "^1.5.8",
54
+ "interactjs": "^1.10.27",
55
+ "JSX": "^1.1.0",
56
+ "mocha": "^10.4.0",
57
+ "node-fetch": "^2.7.0",
58
+ "npm-run-all": "^4.1.5",
59
+ "puppeteer": "^21.5.2",
60
+ "react": "^18.3.0",
61
+ "tailwindcss": "^3.4.1",
62
+ "typescript": "^5.4.5",
63
+ "yaml": "^2.3.3"
64
+ }
65
+ }