@norskvideo/norsk-studio-source-switcher 1.27.0-2025-03-14-ed70a41a → 1.27.0-2025-03-15-26d7b0b8
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.
- package/client/info.js +154 -238
- package/lib/info.js +6 -30
- package/lib/info.js.map +1 -1
- package/package.json +3 -3
package/client/info.js
CHANGED
@@ -4,16 +4,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
5
|
var __getProtoOf = Object.getPrototypeOf;
|
6
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
7
|
-
var __esm = (fn, res) => function __init() {
|
8
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
9
|
-
};
|
10
7
|
var __commonJS = (cb, mod) => function __require() {
|
11
8
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
12
9
|
};
|
13
|
-
var __export = (target, all) => {
|
14
|
-
for (var name in all)
|
15
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
16
|
-
};
|
17
10
|
var __copyProps = (to, from, except, desc) => {
|
18
11
|
if (from && typeof from === "object" || typeof from === "function") {
|
19
12
|
for (let key of __getOwnPropNames(from))
|
@@ -31,13 +24,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
31
24
|
mod
|
32
25
|
));
|
33
26
|
|
34
|
-
// external-global-plugin:react
|
35
|
-
var require_react = __commonJS({
|
36
|
-
"external-global-plugin:react"(exports, module) {
|
37
|
-
module.exports = window.ReactExports;
|
38
|
-
}
|
39
|
-
});
|
40
|
-
|
41
27
|
// external-global-plugin:react/jsx-runtime
|
42
28
|
var require_jsx_runtime = __commonJS({
|
43
29
|
"external-global-plugin:react/jsx-runtime"(exports, module) {
|
@@ -70,41 +56,6 @@ var require_shared_views = __commonJS({
|
|
70
56
|
var require_config = __commonJS({
|
71
57
|
"../core/lib/shared/config.js"(exports) {
|
72
58
|
"use strict";
|
73
|
-
var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) {
|
74
|
-
if (k2 === void 0)
|
75
|
-
k2 = k;
|
76
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
77
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
78
|
-
desc = { enumerable: true, get: function() {
|
79
|
-
return m[k];
|
80
|
-
} };
|
81
|
-
}
|
82
|
-
Object.defineProperty(o, k2, desc);
|
83
|
-
} : function(o, m, k, k2) {
|
84
|
-
if (k2 === void 0)
|
85
|
-
k2 = k;
|
86
|
-
o[k2] = m[k];
|
87
|
-
});
|
88
|
-
var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) {
|
89
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
90
|
-
} : function(o, v) {
|
91
|
-
o["default"] = v;
|
92
|
-
});
|
93
|
-
var __importStar = exports && exports.__importStar || function(mod) {
|
94
|
-
if (mod && mod.__esModule)
|
95
|
-
return mod;
|
96
|
-
var result = {};
|
97
|
-
if (mod != null) {
|
98
|
-
for (var k in mod)
|
99
|
-
if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
|
100
|
-
__createBinding(result, mod, k);
|
101
|
-
}
|
102
|
-
__setModuleDefault(result, mod);
|
103
|
-
return result;
|
104
|
-
};
|
105
|
-
var __importDefault = exports && exports.__importDefault || function(mod) {
|
106
|
-
return mod && mod.__esModule ? mod : { "default": mod };
|
107
|
-
};
|
108
59
|
Object.defineProperty(exports, "__esModule", { value: true });
|
109
60
|
exports.GlobalIceServers = GlobalIceServers2;
|
110
61
|
exports.GlobalEzDrmConfig = GlobalEzDrmConfig;
|
@@ -112,12 +63,10 @@ var require_config = __commonJS({
|
|
112
63
|
exports.contractHardwareAcceleration = contractHardwareAcceleration;
|
113
64
|
exports.HardwareSelection = HardwareSelection2;
|
114
65
|
exports.RootDataDir = RootDataDir;
|
115
|
-
var
|
66
|
+
var shared_views_1 = require_shared_views();
|
67
|
+
var shared_views_2 = require_shared_views();
|
68
|
+
var shared_views_3 = require_shared_views();
|
116
69
|
function GlobalIceServers2(f) {
|
117
|
-
const GlobalIceServerView = react_1.default.lazy(async () => {
|
118
|
-
const views = await Promise.resolve().then(() => __importStar(require_shared_views()));
|
119
|
-
return { default: views.GlobalIceServerView };
|
120
|
-
});
|
121
70
|
const { validation: { Z } } = f;
|
122
71
|
return {
|
123
72
|
id: "ice-servers",
|
@@ -157,7 +106,7 @@ var require_config = __commonJS({
|
|
157
106
|
}
|
158
107
|
}
|
159
108
|
},
|
160
|
-
view: GlobalIceServerView,
|
109
|
+
view: shared_views_3.GlobalIceServerView,
|
161
110
|
defaultValue: [{
|
162
111
|
url: "stun:stun.l.google.com:19302"
|
163
112
|
}]
|
@@ -166,10 +115,6 @@ var require_config = __commonJS({
|
|
166
115
|
};
|
167
116
|
}
|
168
117
|
function GlobalEzDrmConfig(_f) {
|
169
|
-
const EzDrmConfigView = react_1.default.lazy(async () => {
|
170
|
-
const views = await Promise.resolve().then(() => __importStar(require_shared_views()));
|
171
|
-
return { default: views.EzDrmConfigView };
|
172
|
-
});
|
173
118
|
return {
|
174
119
|
id: "ezdrm-config",
|
175
120
|
form: {
|
@@ -195,16 +140,12 @@ var require_config = __commonJS({
|
|
195
140
|
}
|
196
141
|
}
|
197
142
|
},
|
198
|
-
view: EzDrmConfigView
|
143
|
+
view: shared_views_2.EzDrmConfigView
|
199
144
|
}
|
200
145
|
}
|
201
146
|
};
|
202
147
|
}
|
203
148
|
function GlobalAxinomConfig(_f) {
|
204
|
-
const AxinomConfigView = react_1.default.lazy(async () => {
|
205
|
-
const views = await Promise.resolve().then(() => __importStar(require_shared_views()));
|
206
|
-
return { default: views.AxinomConfigView };
|
207
|
-
});
|
208
149
|
return {
|
209
150
|
id: "axinom-config",
|
210
151
|
form: {
|
@@ -244,7 +185,7 @@ var require_config = __commonJS({
|
|
244
185
|
}
|
245
186
|
}
|
246
187
|
},
|
247
|
-
view: AxinomConfigView
|
188
|
+
view: shared_views_1.AxinomConfigView
|
248
189
|
}
|
249
190
|
}
|
250
191
|
};
|
@@ -292,23 +233,10 @@ var require_config = __commonJS({
|
|
292
233
|
}
|
293
234
|
});
|
294
235
|
|
295
|
-
//
|
296
|
-
var
|
297
|
-
|
298
|
-
|
299
|
-
});
|
300
|
-
function InlineView({ state }) {
|
301
|
-
return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime.jsx)("ul", { children: state.knownSources.map((s, i) => state.activeSource.sourceName == s.sourceName ? (0, import_jsx_runtime.jsxs)("li", { className: activeClasses, children: [s.sourceName, " <--"] }, i) : state.availableSources.find((a) => a.sourceName == s.sourceName) ? (0, import_jsx_runtime.jsxs)("li", { className: availableClasses, children: [s.sourceName, " (available)"] }, i) : (0, import_jsx_runtime.jsxs)("li", { className: inactiveClasses, children: [s.sourceName, " (inactive)"] }, i)) })] });
|
302
|
-
}
|
303
|
-
var import_jsx_runtime, activeClasses, availableClasses, inactiveClasses, inline_view_default;
|
304
|
-
var init_inline_view = __esm({
|
305
|
-
"build/inline-view.js"() {
|
306
|
-
"use strict";
|
307
|
-
import_jsx_runtime = __toESM(require_jsx_runtime());
|
308
|
-
activeClasses = "active text-green-500 dark:text-green-300";
|
309
|
-
availableClasses = "available text-green-500 dark:text-green-300";
|
310
|
-
inactiveClasses = "inactive text-orange-500 dark:text-orange-300";
|
311
|
-
inline_view_default = InlineView;
|
236
|
+
// external-global-plugin:react
|
237
|
+
var require_react = __commonJS({
|
238
|
+
"external-global-plugin:react"(exports, module) {
|
239
|
+
module.exports = window.ReactExports;
|
312
240
|
}
|
313
241
|
});
|
314
242
|
|
@@ -319,59 +247,6 @@ var require_webrtc_client = __commonJS({
|
|
319
247
|
}
|
320
248
|
});
|
321
249
|
|
322
|
-
// build/summary-view.js
|
323
|
-
var summary_view_exports = {};
|
324
|
-
__export(summary_view_exports, {
|
325
|
-
default: () => summary_view_default
|
326
|
-
});
|
327
|
-
function SummaryView({ state, config, sendCommand }) {
|
328
|
-
const [previewSource, setPreviewSource] = (0, import_react.useState)(void 0);
|
329
|
-
const [activePlayerSource, setActivePlayerSource] = (0, import_react.useState)(void 0);
|
330
|
-
const [initialLoad, setInitialLoad] = (0, import_react.useState)(true);
|
331
|
-
(0, import_react.useEffect)(() => {
|
332
|
-
if (previewSource !== activePlayerSource || initialLoad) {
|
333
|
-
const player = previewSource == void 0 ? state.previewPlayerUrl : state.players.find((p) => p.source.sourceName == previewSource.sourceName)?.player;
|
334
|
-
if (!player)
|
335
|
-
return;
|
336
|
-
if (currentClient) {
|
337
|
-
currentClient.videoElements.forEach((e) => {
|
338
|
-
e.remove();
|
339
|
-
});
|
340
|
-
}
|
341
|
-
currentClient = new import_webrtc_client.WhepClient({ url: player, container: document.getElementById(`${config.id}-preview`) ?? void 0 });
|
342
|
-
void currentClient.start();
|
343
|
-
setActivePlayerSource(previewSource);
|
344
|
-
setInitialLoad(false);
|
345
|
-
}
|
346
|
-
}, [
|
347
|
-
previewSource,
|
348
|
-
activePlayerSource,
|
349
|
-
initialLoad,
|
350
|
-
state.players
|
351
|
-
]);
|
352
|
-
return (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [(0, import_jsx_runtime2.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime2.jsx)("ul", { children: state.knownSources.map((s, i) => state.activeSource.sourceName == s.sourceName && state.activeSource.sourceName == s.sourceName ? (0, import_jsx_runtime2.jsxs)("li", { className: activeClasses2, children: [s.sourceName, " <--"] }, i) : state.availableSources.find((a) => s.sourceName == a.sourceName) ? (0, import_jsx_runtime2.jsxs)("li", { className: availableClasses2, children: [s.sourceName, " (available)"] }, i) : (0, import_jsx_runtime2.jsxs)("li", { className: inactiveClasses2, children: [s.sourceName, " (inactive)"] }, i)) }), config.enablePreviews ? (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [(0, import_jsx_runtime2.jsx)("h4", { children: previewSource ? previewSource.sourceName : "Preview" }), (0, import_jsx_runtime2.jsx)("div", { id: `${config.id}-preview` })] }) : null, (0, import_jsx_runtime2.jsx)("label", { htmlFor: "select-preview", className: "mt-2", children: "Source" }), (0, import_jsx_runtime2.jsxs)("select", { id: "select-preview", className: "mt-2 node-editor-select-input", onChange: (e) => {
|
353
|
-
setPreviewSource(JSON.parse(e.currentTarget.value));
|
354
|
-
}, children: [(0, import_jsx_runtime2.jsx)("option", { selected: previewSource === void 0, children: "---" }), state.availableSources.map((s, i) => (0, import_jsx_runtime2.jsx)("option", { selected: previewSource == s, value: JSON.stringify(s), children: s.sourceName }, i))] }), previewSource ? (0, import_jsx_runtime2.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) => {
|
355
|
-
e.preventDefault();
|
356
|
-
sendCommand({ type: "select-source", source: previewSource, overlays: [] });
|
357
|
-
setPreviewSource(void 0);
|
358
|
-
}, children: "Make Active" }) : (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, {})] });
|
359
|
-
}
|
360
|
-
var import_jsx_runtime2, import_react, import_webrtc_client, activeClasses2, availableClasses2, inactiveClasses2, currentClient, summary_view_default;
|
361
|
-
var init_summary_view = __esm({
|
362
|
-
"build/summary-view.js"() {
|
363
|
-
"use strict";
|
364
|
-
import_jsx_runtime2 = __toESM(require_jsx_runtime());
|
365
|
-
import_react = __toESM(require_react());
|
366
|
-
import_webrtc_client = __toESM(require_webrtc_client());
|
367
|
-
activeClasses2 = "active text-green-500 dark:text-green-300";
|
368
|
-
availableClasses2 = "available text-green-500 dark:text-green-300";
|
369
|
-
inactiveClasses2 = "inactive text-orange-500 dark:text-orange-300";
|
370
|
-
currentClient = void 0;
|
371
|
-
summary_view_default = SummaryView;
|
372
|
-
}
|
373
|
-
});
|
374
|
-
|
375
250
|
// ../../node_modules/interactjs/dist/interact.min.js
|
376
251
|
var require_interact_min = __commonJS({
|
377
252
|
"../../node_modules/interactjs/dist/interact.min.js"(exports, module) {
|
@@ -2858,11 +2733,147 @@ var require_interact_min = __commonJS({
|
|
2858
2733
|
}
|
2859
2734
|
});
|
2860
2735
|
|
2736
|
+
// build/info.js
|
2737
|
+
var import_config = __toESM(require_config());
|
2738
|
+
|
2739
|
+
// build/inline-view.js
|
2740
|
+
var import_jsx_runtime = __toESM(require_jsx_runtime());
|
2741
|
+
var activeClasses = "active text-green-500 dark:text-green-300";
|
2742
|
+
var availableClasses = "available text-green-500 dark:text-green-300";
|
2743
|
+
var inactiveClasses = "inactive text-orange-500 dark:text-orange-300";
|
2744
|
+
function InlineView({ state }) {
|
2745
|
+
return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime.jsx)("ul", { children: state.knownSources.map((s, i) => state.activeSource.sourceName == s.sourceName ? (0, import_jsx_runtime.jsxs)("li", { className: activeClasses, children: [s.sourceName, " <--"] }, i) : state.availableSources.find((a) => a.sourceName == s.sourceName) ? (0, import_jsx_runtime.jsxs)("li", { className: availableClasses, children: [s.sourceName, " (available)"] }, i) : (0, import_jsx_runtime.jsxs)("li", { className: inactiveClasses, children: [s.sourceName, " (inactive)"] }, i)) })] });
|
2746
|
+
}
|
2747
|
+
var inline_view_default = InlineView;
|
2748
|
+
|
2749
|
+
// build/summary-view.js
|
2750
|
+
var import_jsx_runtime2 = __toESM(require_jsx_runtime());
|
2751
|
+
var import_react = __toESM(require_react());
|
2752
|
+
var import_webrtc_client = __toESM(require_webrtc_client());
|
2753
|
+
var activeClasses2 = "active text-green-500 dark:text-green-300";
|
2754
|
+
var availableClasses2 = "available text-green-500 dark:text-green-300";
|
2755
|
+
var inactiveClasses2 = "inactive text-orange-500 dark:text-orange-300";
|
2756
|
+
var currentClient = void 0;
|
2757
|
+
function SummaryView({ state, config, sendCommand }) {
|
2758
|
+
const [previewSource, setPreviewSource] = (0, import_react.useState)(void 0);
|
2759
|
+
const [activePlayerSource, setActivePlayerSource] = (0, import_react.useState)(void 0);
|
2760
|
+
const [initialLoad, setInitialLoad] = (0, import_react.useState)(true);
|
2761
|
+
(0, import_react.useEffect)(() => {
|
2762
|
+
if (previewSource !== activePlayerSource || initialLoad) {
|
2763
|
+
const player = previewSource == void 0 ? state.previewPlayerUrl : state.players.find((p) => p.source.sourceName == previewSource.sourceName)?.player;
|
2764
|
+
if (!player)
|
2765
|
+
return;
|
2766
|
+
if (currentClient) {
|
2767
|
+
currentClient.videoElements.forEach((e) => {
|
2768
|
+
e.remove();
|
2769
|
+
});
|
2770
|
+
}
|
2771
|
+
currentClient = new import_webrtc_client.WhepClient({ url: player, container: document.getElementById(`${config.id}-preview`) ?? void 0 });
|
2772
|
+
void currentClient.start();
|
2773
|
+
setActivePlayerSource(previewSource);
|
2774
|
+
setInitialLoad(false);
|
2775
|
+
}
|
2776
|
+
}, [
|
2777
|
+
previewSource,
|
2778
|
+
activePlayerSource,
|
2779
|
+
initialLoad,
|
2780
|
+
state.players
|
2781
|
+
]);
|
2782
|
+
return (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [(0, import_jsx_runtime2.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime2.jsx)("ul", { children: state.knownSources.map((s, i) => state.activeSource.sourceName == s.sourceName && state.activeSource.sourceName == s.sourceName ? (0, import_jsx_runtime2.jsxs)("li", { className: activeClasses2, children: [s.sourceName, " <--"] }, i) : state.availableSources.find((a) => s.sourceName == a.sourceName) ? (0, import_jsx_runtime2.jsxs)("li", { className: availableClasses2, children: [s.sourceName, " (available)"] }, i) : (0, import_jsx_runtime2.jsxs)("li", { className: inactiveClasses2, children: [s.sourceName, " (inactive)"] }, i)) }), config.enablePreviews ? (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [(0, import_jsx_runtime2.jsx)("h4", { children: previewSource ? previewSource.sourceName : "Preview" }), (0, import_jsx_runtime2.jsx)("div", { id: `${config.id}-preview` })] }) : null, (0, import_jsx_runtime2.jsx)("label", { htmlFor: "select-preview", className: "mt-2", children: "Source" }), (0, import_jsx_runtime2.jsxs)("select", { id: "select-preview", className: "mt-2 node-editor-select-input", onChange: (e) => {
|
2783
|
+
setPreviewSource(JSON.parse(e.currentTarget.value));
|
2784
|
+
}, children: [(0, import_jsx_runtime2.jsx)("option", { selected: previewSource === void 0, children: "---" }), state.availableSources.map((s, i) => (0, import_jsx_runtime2.jsx)("option", { selected: previewSource == s, value: JSON.stringify(s), children: s.sourceName }, i))] }), previewSource ? (0, import_jsx_runtime2.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) => {
|
2785
|
+
e.preventDefault();
|
2786
|
+
sendCommand({ type: "select-source", source: previewSource, overlays: [] });
|
2787
|
+
setPreviewSource(void 0);
|
2788
|
+
}, children: "Make Active" }) : (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, {})] });
|
2789
|
+
}
|
2790
|
+
var summary_view_default = SummaryView;
|
2791
|
+
|
2861
2792
|
// build/fullscreen-view.js
|
2862
|
-
var
|
2863
|
-
|
2864
|
-
|
2865
|
-
|
2793
|
+
var import_jsx_runtime3 = __toESM(require_jsx_runtime());
|
2794
|
+
var import_react2 = __toESM(require_react());
|
2795
|
+
var import_interactjs = __toESM(require_interact_min());
|
2796
|
+
var import_webrtc_client2 = __toESM(require_webrtc_client());
|
2797
|
+
var DEFAULT_OVERLAY_WIDTH = 100;
|
2798
|
+
var MyWhepClient = class extends import_webrtc_client2.WhepClient {
|
2799
|
+
started;
|
2800
|
+
resolveStartedPromise;
|
2801
|
+
mediaStream;
|
2802
|
+
sourceName;
|
2803
|
+
constructor(config) {
|
2804
|
+
super(config);
|
2805
|
+
this.sourceName = config.sourceName;
|
2806
|
+
this.started = new Promise((resolve, _reject) => {
|
2807
|
+
this.resolveStartedPromise = resolve;
|
2808
|
+
if (this.mediaStream) {
|
2809
|
+
this.resolveStartedPromise = void 0;
|
2810
|
+
resolve(this.mediaStream);
|
2811
|
+
}
|
2812
|
+
});
|
2813
|
+
}
|
2814
|
+
async handleGotTrack(ev) {
|
2815
|
+
if (ev.track.kind == "video" && ev.streams.length > 0) {
|
2816
|
+
this.outputVideoTracks.push(ev.track);
|
2817
|
+
}
|
2818
|
+
if (ev.track.kind == "audio") {
|
2819
|
+
this.outputAudioTrack = ev.track;
|
2820
|
+
}
|
2821
|
+
if (this.outputAudioTrack && this.outputVideoTracks.length > this.videoElements.length) {
|
2822
|
+
for (let i = 0; i < this.outputVideoTracks.length; i++) {
|
2823
|
+
if (this.videoElements[i])
|
2824
|
+
continue;
|
2825
|
+
let stream = void 0;
|
2826
|
+
if (i == 0) {
|
2827
|
+
stream = new MediaStream([this.outputAudioTrack, this.outputVideoTracks[i]]);
|
2828
|
+
} else {
|
2829
|
+
stream = new MediaStream([this.outputVideoTracks[i]]);
|
2830
|
+
}
|
2831
|
+
if (this.container) {
|
2832
|
+
const e = createPlayerElement(stream, this.container);
|
2833
|
+
this.mediaStream = stream;
|
2834
|
+
this.videoElements.push(e);
|
2835
|
+
this.resolveStartedPromise?.(stream);
|
2836
|
+
e.style.userSelect = "none";
|
2837
|
+
e.style.touchAction = "none";
|
2838
|
+
e.setAttribute("data-source", this.sourceName);
|
2839
|
+
let element = void 0;
|
2840
|
+
let target = void 0;
|
2841
|
+
(0, import_interactjs.default)(e).draggable({
|
2842
|
+
listeners: {
|
2843
|
+
start: (e2) => {
|
2844
|
+
element = document.createElement("video");
|
2845
|
+
element.controls = false;
|
2846
|
+
element.style.position = "absolute";
|
2847
|
+
element.style.left = `${e2.page.x}px`;
|
2848
|
+
element.style.top = `${e2.page.y}px`;
|
2849
|
+
element.style.width = `${DEFAULT_OVERLAY_WIDTH}px`;
|
2850
|
+
document.body.appendChild(element);
|
2851
|
+
element.muted = true;
|
2852
|
+
element.autoplay = true;
|
2853
|
+
element.srcObject = stream;
|
2854
|
+
return true;
|
2855
|
+
},
|
2856
|
+
move: (e2) => {
|
2857
|
+
if (element) {
|
2858
|
+
element.style.left = `${e2.page.x}px`;
|
2859
|
+
element.style.top = `${e2.page.y}px`;
|
2860
|
+
}
|
2861
|
+
if (e2.dragEnter) {
|
2862
|
+
target = e2.dragEnter;
|
2863
|
+
}
|
2864
|
+
if (e2.dragLeave && target) {
|
2865
|
+
target = void 0;
|
2866
|
+
}
|
2867
|
+
}
|
2868
|
+
}
|
2869
|
+
}).on("dragend", () => {
|
2870
|
+
element?.remove();
|
2871
|
+
});
|
2872
|
+
}
|
2873
|
+
}
|
2874
|
+
}
|
2875
|
+
}
|
2876
|
+
};
|
2866
2877
|
function createPlayerElement(stream, container) {
|
2867
2878
|
const element = document.createElement("video");
|
2868
2879
|
element.controls = true;
|
@@ -3107,106 +3118,11 @@ function isSourceSwitchSourceEqual(a, b) {
|
|
3107
3118
|
function mkContainerId(source) {
|
3108
3119
|
return `preview-container-${source.sourceName}`;
|
3109
3120
|
}
|
3110
|
-
var
|
3111
|
-
var init_fullscreen_view = __esm({
|
3112
|
-
"build/fullscreen-view.js"() {
|
3113
|
-
"use strict";
|
3114
|
-
import_jsx_runtime3 = __toESM(require_jsx_runtime());
|
3115
|
-
import_react2 = __toESM(require_react());
|
3116
|
-
import_interactjs = __toESM(require_interact_min());
|
3117
|
-
import_webrtc_client2 = __toESM(require_webrtc_client());
|
3118
|
-
DEFAULT_OVERLAY_WIDTH = 100;
|
3119
|
-
MyWhepClient = class extends import_webrtc_client2.WhepClient {
|
3120
|
-
started;
|
3121
|
-
resolveStartedPromise;
|
3122
|
-
mediaStream;
|
3123
|
-
sourceName;
|
3124
|
-
constructor(config) {
|
3125
|
-
super(config);
|
3126
|
-
this.sourceName = config.sourceName;
|
3127
|
-
this.started = new Promise((resolve, _reject) => {
|
3128
|
-
this.resolveStartedPromise = resolve;
|
3129
|
-
if (this.mediaStream) {
|
3130
|
-
this.resolveStartedPromise = void 0;
|
3131
|
-
resolve(this.mediaStream);
|
3132
|
-
}
|
3133
|
-
});
|
3134
|
-
}
|
3135
|
-
async handleGotTrack(ev) {
|
3136
|
-
if (ev.track.kind == "video" && ev.streams.length > 0) {
|
3137
|
-
this.outputVideoTracks.push(ev.track);
|
3138
|
-
}
|
3139
|
-
if (ev.track.kind == "audio") {
|
3140
|
-
this.outputAudioTrack = ev.track;
|
3141
|
-
}
|
3142
|
-
if (this.outputAudioTrack && this.outputVideoTracks.length > this.videoElements.length) {
|
3143
|
-
for (let i = 0; i < this.outputVideoTracks.length; i++) {
|
3144
|
-
if (this.videoElements[i])
|
3145
|
-
continue;
|
3146
|
-
let stream = void 0;
|
3147
|
-
if (i == 0) {
|
3148
|
-
stream = new MediaStream([this.outputAudioTrack, this.outputVideoTracks[i]]);
|
3149
|
-
} else {
|
3150
|
-
stream = new MediaStream([this.outputVideoTracks[i]]);
|
3151
|
-
}
|
3152
|
-
if (this.container) {
|
3153
|
-
const e = createPlayerElement(stream, this.container);
|
3154
|
-
this.mediaStream = stream;
|
3155
|
-
this.videoElements.push(e);
|
3156
|
-
this.resolveStartedPromise?.(stream);
|
3157
|
-
e.style.userSelect = "none";
|
3158
|
-
e.style.touchAction = "none";
|
3159
|
-
e.setAttribute("data-source", this.sourceName);
|
3160
|
-
let element = void 0;
|
3161
|
-
let target = void 0;
|
3162
|
-
(0, import_interactjs.default)(e).draggable({
|
3163
|
-
listeners: {
|
3164
|
-
start: (e2) => {
|
3165
|
-
element = document.createElement("video");
|
3166
|
-
element.controls = false;
|
3167
|
-
element.style.position = "absolute";
|
3168
|
-
element.style.left = `${e2.page.x}px`;
|
3169
|
-
element.style.top = `${e2.page.y}px`;
|
3170
|
-
element.style.width = `${DEFAULT_OVERLAY_WIDTH}px`;
|
3171
|
-
document.body.appendChild(element);
|
3172
|
-
element.muted = true;
|
3173
|
-
element.autoplay = true;
|
3174
|
-
element.srcObject = stream;
|
3175
|
-
return true;
|
3176
|
-
},
|
3177
|
-
move: (e2) => {
|
3178
|
-
if (element) {
|
3179
|
-
element.style.left = `${e2.page.x}px`;
|
3180
|
-
element.style.top = `${e2.page.y}px`;
|
3181
|
-
}
|
3182
|
-
if (e2.dragEnter) {
|
3183
|
-
target = e2.dragEnter;
|
3184
|
-
}
|
3185
|
-
if (e2.dragLeave && target) {
|
3186
|
-
target = void 0;
|
3187
|
-
}
|
3188
|
-
}
|
3189
|
-
}
|
3190
|
-
}).on("dragend", () => {
|
3191
|
-
element?.remove();
|
3192
|
-
});
|
3193
|
-
}
|
3194
|
-
}
|
3195
|
-
}
|
3196
|
-
}
|
3197
|
-
};
|
3198
|
-
fullscreen_view_default = FullScreenView;
|
3199
|
-
}
|
3200
|
-
});
|
3121
|
+
var fullscreen_view_default = FullScreenView;
|
3201
3122
|
|
3202
3123
|
// build/info.js
|
3203
|
-
var import_react3 = __toESM(require_react());
|
3204
|
-
var import_config = __toESM(require_config());
|
3205
3124
|
function info_default(R) {
|
3206
3125
|
const { defineComponent, Av, common: { Resolutions, FrameRates } } = R;
|
3207
|
-
const InlineView2 = import_react3.default.lazy(async () => Promise.resolve().then(() => (init_inline_view(), inline_view_exports)));
|
3208
|
-
const SummaryView2 = import_react3.default.lazy(async () => Promise.resolve().then(() => (init_summary_view(), summary_view_exports)));
|
3209
|
-
const FullscreenView = import_react3.default.lazy(async () => Promise.resolve().then(() => (init_fullscreen_view(), fullscreen_view_exports)));
|
3210
3126
|
return defineComponent({
|
3211
3127
|
identifier: "processor.sourceSwitcher",
|
3212
3128
|
category: "processor",
|
@@ -3295,9 +3211,9 @@ function info_default(R) {
|
|
3295
3211
|
assertUnreachable(evType);
|
3296
3212
|
}
|
3297
3213
|
},
|
3298
|
-
inline:
|
3299
|
-
summary:
|
3300
|
-
fullscreen:
|
3214
|
+
inline: inline_view_default,
|
3215
|
+
summary: summary_view_default,
|
3216
|
+
fullscreen: fullscreen_view_default
|
3301
3217
|
},
|
3302
3218
|
configForm: {
|
3303
3219
|
global: {
|
package/lib/info.js
CHANGED
@@ -1,39 +1,15 @@
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
4
|
};
|
28
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
29
6
|
exports.default = default_1;
|
30
|
-
const react_1 = __importDefault(require("react"));
|
31
7
|
const config_1 = require("@norskvideo/norsk-studio/lib/shared/config");
|
8
|
+
const inline_view_1 = __importDefault(require("./inline-view"));
|
9
|
+
const summary_view_1 = __importDefault(require("./summary-view"));
|
10
|
+
const fullscreen_view_1 = __importDefault(require("./fullscreen-view"));
|
32
11
|
function default_1(R) {
|
33
12
|
const { defineComponent, Av, common: { Resolutions, FrameRates } } = R;
|
34
|
-
const InlineView = react_1.default.lazy(async () => Promise.resolve().then(() => __importStar(require('./inline-view'))));
|
35
|
-
const SummaryView = react_1.default.lazy(async () => Promise.resolve().then(() => __importStar(require('./summary-view'))));
|
36
|
-
const FullscreenView = react_1.default.lazy(async () => Promise.resolve().then(() => __importStar(require('./fullscreen-view'))));
|
37
13
|
return defineComponent({
|
38
14
|
identifier: 'processor.sourceSwitcher',
|
39
15
|
category: 'processor',
|
@@ -123,9 +99,9 @@ function default_1(R) {
|
|
123
99
|
assertUnreachable(evType);
|
124
100
|
}
|
125
101
|
},
|
126
|
-
inline:
|
127
|
-
summary:
|
128
|
-
fullscreen:
|
102
|
+
inline: inline_view_1.default,
|
103
|
+
summary: summary_view_1.default,
|
104
|
+
fullscreen: fullscreen_view_1.default
|
129
105
|
},
|
130
106
|
configForm: {
|
131
107
|
global: {
|
package/lib/info.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"info.js","sourceRoot":"","sources":["../src/info.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../src/info.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@norskvideo/norsk-studio-source-switcher",
|
3
|
-
"version": "1.27.0-2025-03-
|
3
|
+
"version": "1.27.0-2025-03-15-26d7b0b8",
|
4
4
|
"description": "",
|
5
5
|
"scripts": {
|
6
6
|
"clean": "rm -rf lib",
|
@@ -24,8 +24,8 @@
|
|
24
24
|
"@aws-sdk/client-medialive": "^3.499.0",
|
25
25
|
"@aws-sdk/client-mediapackage": "^3.499.0",
|
26
26
|
"@aws-sdk/client-translate": "^3.535.0",
|
27
|
-
"@norskvideo/norsk-sdk": "^1.0.401-2025-03-
|
28
|
-
"@norskvideo/norsk-studio": "1.27.0-2025-03-
|
27
|
+
"@norskvideo/norsk-sdk": "^1.0.401-2025-03-15-041dfcda",
|
28
|
+
"@norskvideo/norsk-studio": "1.27.0-2025-03-15-26d7b0b8",
|
29
29
|
"@norskvideo/webrtc-client": "^0.1.2",
|
30
30
|
"express": "^4.18.2",
|
31
31
|
"express-ws": "^5.0.2",
|