@norskvideo/norsk-studio-built-ins 1.12.0-2025-02-13-eeaecbf9 → 1.12.0-2025-02-17-a1f6bf72

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.
Files changed (35) hide show
  1. package/client/info.js +48 -8
  2. package/client/output.preview/styles.css +69 -69
  3. package/client/style.css +28 -0
  4. package/lib/output.preview/info.d.ts +5 -2
  5. package/lib/output.preview/info.js +16 -2
  6. package/lib/output.preview/info.js.map +1 -1
  7. package/lib/output.preview/inline-view.js +29 -5
  8. package/lib/output.preview/inline-view.js.map +1 -1
  9. package/lib/output.preview/runtime.d.ts +16 -13
  10. package/lib/output.preview/runtime.js +112 -30
  11. package/lib/output.preview/runtime.js.map +1 -1
  12. package/lib/output.preview/types.d.ts +56 -0
  13. package/lib/output.preview/types.js +3 -0
  14. package/lib/output.preview/types.js.map +1 -0
  15. package/lib/output.preview/types.yaml +37 -0
  16. package/lib/processor.browserOverlay/runtime.js +6 -26
  17. package/lib/processor.browserOverlay/runtime.js.map +1 -1
  18. package/lib/processor.fixedLadder/info.d.ts +32 -6
  19. package/lib/processor.fixedLadder/info.js +4 -1
  20. package/lib/processor.fixedLadder/info.js.map +1 -1
  21. package/lib/processor.fixedLadder/runtime.d.ts +12 -30
  22. package/lib/processor.fixedLadder/runtime.js +1 -1
  23. package/lib/processor.fixedLadder/runtime.js.map +1 -1
  24. package/lib/processor.fixedLadder/types.d.ts +114 -0
  25. package/lib/processor.fixedLadder/types.js +3 -0
  26. package/lib/processor.fixedLadder/types.js.map +1 -0
  27. package/lib/processor.fixedLadder/types.yaml +244 -0
  28. package/lib/processor.onscreenGraphic/runtime.js +7 -33
  29. package/lib/processor.onscreenGraphic/runtime.js.map +1 -1
  30. package/lib/shared/api.d.ts +35 -0
  31. package/lib/shared/api.js +34 -0
  32. package/lib/shared/api.js.map +1 -0
  33. package/lib/test/preview.js +69 -64
  34. package/lib/test/preview.js.map +1 -1
  35. package/package.json +3 -3
package/client/info.js CHANGED
@@ -642,6 +642,16 @@ function InlineView6({ state, config, raise }) {
642
642
  video.remove();
643
643
  });
644
644
  };
645
+ const [loadedImage, setLoadedImage] = (0, import_react6.useState)(void 0);
646
+ (0, import_react6.useEffect)(() => {
647
+ const container = document.getElementById(`preview-${id}`) ?? void 0;
648
+ if (!container)
649
+ return;
650
+ container.innerHTML = "";
651
+ if (loadedImage) {
652
+ container.appendChild(loadedImage);
653
+ }
654
+ }, [loadedImage]);
645
655
  (0, import_react6.useEffect)(() => {
646
656
  if (!url || !showPreview) {
647
657
  if (client) {
@@ -650,11 +660,24 @@ function InlineView6({ state, config, raise }) {
650
660
  }
651
661
  return;
652
662
  }
653
- const newClient = createClient(url);
654
- setClient(newClient);
655
- return () => {
656
- cleanupClient(newClient);
657
- };
663
+ if (config.previewMode == "image") {
664
+ const container = document.getElementById(`preview-${id}`) ?? void 0;
665
+ if (!container)
666
+ return;
667
+ const img = document.createElement("img");
668
+ img.width = 420;
669
+ img.height = 236;
670
+ img.onload = () => {
671
+ setLoadedImage(img);
672
+ };
673
+ img.src = url;
674
+ } else {
675
+ const newClient = createClient(url);
676
+ setClient(newClient);
677
+ return () => {
678
+ cleanupClient(newClient);
679
+ };
680
+ }
658
681
  }, [state.url, showPreview]);
659
682
  (0, import_react6.useEffect)(() => {
660
683
  setShowPreview(config.showPreview ?? true);
@@ -16824,6 +16847,9 @@ function info_default9(R) {
16824
16847
  case "audio-levels":
16825
16848
  state.levels = ev.levels;
16826
16849
  break;
16850
+ case "source-lost":
16851
+ state = {};
16852
+ break;
16827
16853
  default:
16828
16854
  assertUnreachable4(evType);
16829
16855
  }
@@ -16837,9 +16863,20 @@ function info_default9(R) {
16837
16863
  hardware: (0, import_config2.HardwareSelection)()
16838
16864
  },
16839
16865
  form: {
16840
- bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16841
- skipTranscode: { help: "Skip transcoding for WebRTC-ready streams", hint: { type: "boolean", defaultValue: false } },
16866
+ previewMode: {
16867
+ help: "How to display the video",
16868
+ hint: {
16869
+ type: "select",
16870
+ defaultValue: "image",
16871
+ options: [
16872
+ { value: "video_encode", display: "WebRTC (Re-Encode)" },
16873
+ { value: "video_passthrough", display: "WebRTC (Passthrough)" },
16874
+ { value: "images", display: "JPEG Only" }
16875
+ ]
16876
+ }
16877
+ },
16842
16878
  showPreview: { help: "Show video preview", hint: { type: "boolean", defaultValue: true } },
16879
+ bufferDelayMs: { help: "How many milliseconds in the jitter buffer (WebRTC only)", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16843
16880
  notes: {
16844
16881
  help: "Additional notes about this component",
16845
16882
  hint: { type: "text", optional: true }
@@ -17576,7 +17613,10 @@ function createLoganRung(rung) {
17576
17613
  function createRungImpl({ name, threads, bitrate }) {
17577
17614
  const codec = {
17578
17615
  type: "x264",
17579
- bitrateMode: { value: bitrate, mode: "abr" },
17616
+ bitrateMode: {
17617
+ value: bitrate,
17618
+ mode: "abr"
17619
+ },
17580
17620
  keyFrameIntervalMax: 50,
17581
17621
  keyFrameIntervalMin: 50,
17582
17622
  sceneCut: 0,
@@ -1,128 +1,128 @@
1
1
  .preview-outer-container {
2
- height: 237px;
3
- width: 450px;
2
+ height: 237px;
3
+ width: 450px;
4
4
  }
5
5
 
6
6
  .preview-video {
7
- width: 420px;
7
+ width: 420px;
8
8
  }
9
9
 
10
10
  .preview-outer-container div {
11
- float: left;
11
+ float: left;
12
12
  }
13
13
 
14
14
  .preview-levels {
15
- height: 100%;
16
- width: 30px;
17
- background-color: #333;
18
- border-radius: 2px;
19
- display: flex;
20
- flex-direction: row;
21
- padding: 4px 3px;
22
- margin: auto;
23
- margin-top: 0px;
15
+ height: 100%;
16
+ width: 30px;
17
+ background-color: #333;
18
+ border-radius: 2px;
19
+ display: flex;
20
+ flex-direction: row;
21
+ padding: 4px 3px;
22
+ margin: auto;
23
+ margin-top: 0px;
24
24
  }
25
25
 
26
26
  /* paint not glowing LEDs */
27
27
  .preview-level {
28
- position: relative;
29
- margin: 0 2px;
30
- flex-grow: 1;
31
- z-index: 3;
32
- background-color: transparent;
33
- background-repeat: repeat-y;
34
- background-image: linear-gradient(to bottom, #666 3px, transparent 1px);
35
- background-size: 100% 4px;
28
+ position: relative;
29
+ margin: 0 2px;
30
+ flex-grow: 1;
31
+ z-index: 3;
32
+ background-color: transparent;
33
+ background-repeat: repeat-y;
34
+ background-image: linear-gradient(to bottom, #666 3px, transparent 1px);
35
+ background-size: 100% 4px;
36
36
  }
37
37
 
38
38
  /* paint glowing LEDs */
39
39
  .preview-level:before {
40
- width: 100%;
41
- height: 100%;
42
- content: ' ';
43
- position: absolute;
44
- top: 0px;
45
- left: 0px;
46
- z-index: 1;
47
- background-repeat: no-repeat;
48
- background-image: linear-gradient(to top, green 0%, yellow 80%, red 100%);
49
- background-size: 100% 100%;
40
+ width: 100%;
41
+ height: 100%;
42
+ content: ' ';
43
+ position: absolute;
44
+ top: 0px;
45
+ left: 0px;
46
+ z-index: 1;
47
+ background-repeat: no-repeat;
48
+ background-image: linear-gradient(to top, green 0%, yellow 80%, red 100%);
49
+ background-size: 100% 100%;
50
50
  }
51
51
 
52
52
  .clip-0-preview:before {
53
- clip-path: inset(100% 0 0 0);
54
- -webkit-clip-path: inset(100% 0 0 0);
53
+ clip-path: inset(100% 0 0 0);
54
+ -webkit-clip-path: inset(100% 0 0 0);
55
55
  }
56
56
 
57
57
  .clip-10-preview:before {
58
- clip-path: inset(90% 0 0 0);
59
- -webkit-clip-path: inset(90% 0 0 0);
58
+ clip-path: inset(90% 0 0 0);
59
+ -webkit-clip-path: inset(90% 0 0 0);
60
60
  }
61
61
 
62
62
  .clip-20-preview:before {
63
- clip-path: inset(80% 0 0 0);
64
- -webkit-clip-path: inset(80% 0 0 0);
63
+ clip-path: inset(80% 0 0 0);
64
+ -webkit-clip-path: inset(80% 0 0 0);
65
65
  }
66
66
 
67
67
  .clip-30-preview:before {
68
- clip-path: inset(70% 0 0 0);
69
- -webkit-clip-path: inset(70% 0 0 0);
68
+ clip-path: inset(70% 0 0 0);
69
+ -webkit-clip-path: inset(70% 0 0 0);
70
70
  }
71
71
 
72
72
 
73
73
  .clip-40-preview:before {
74
- clip-path: inset(60% 0 0 0);
75
- -webkit-clip-path: inset(60% 0 0 0);
74
+ clip-path: inset(60% 0 0 0);
75
+ -webkit-clip-path: inset(60% 0 0 0);
76
76
  }
77
77
 
78
78
  .clip-50-preview:before {
79
- clip-path: inset(50% 0 0 0);
80
- -webkit-clip-path: inset(50% 0 0 0);
79
+ clip-path: inset(50% 0 0 0);
80
+ -webkit-clip-path: inset(50% 0 0 0);
81
81
  }
82
82
 
83
83
  .clip-60-preview:before {
84
- clip-path: inset(40% 0 0 0);
85
- -webkit-clip-path: inset(40% 0 0 0);
84
+ clip-path: inset(40% 0 0 0);
85
+ -webkit-clip-path: inset(40% 0 0 0);
86
86
  }
87
87
 
88
88
  .clip-70-preview:before {
89
- clip-path: inset(30% 0 0 0);
90
- -webkit-clip-path: inset(30% 0 0 0);
89
+ clip-path: inset(30% 0 0 0);
90
+ -webkit-clip-path: inset(30% 0 0 0);
91
91
  }
92
92
 
93
93
 
94
94
  .clip-80-preview:before {
95
- clip-path: inset(20% 0 0 0);
96
- -webkit-clip-path: inset(20% 0 0 0);
95
+ clip-path: inset(20% 0 0 0);
96
+ -webkit-clip-path: inset(20% 0 0 0);
97
97
  }
98
98
 
99
99
  .clip-90-preview:before {
100
- clip-path: inset(10% 0 0 0);
101
- -webkit-clip-path: inset(10% 0 0 0);
100
+ clip-path: inset(10% 0 0 0);
101
+ -webkit-clip-path: inset(10% 0 0 0);
102
102
  }
103
103
 
104
104
  .clip-100-preview:before {
105
- clip-path: inset(0% 0 0 0);
106
- -webkit-clip-path: inset(0% 0 0 0);
105
+ clip-path: inset(0% 0 0 0);
106
+ -webkit-clip-path: inset(0% 0 0 0);
107
107
  }
108
108
 
109
109
 
110
110
 
111
111
  /* paint gap lines of LEDs */
112
112
  .preview-level::after {
113
- width: 100%;
114
- height: 100%;
115
- content: ' ';
116
- position: absolute;
117
- top: 0px;
118
- left: 0px;
119
- z-index: 2;
120
- margin-top: 3px;
121
- background-image: linear-gradient(to bottom, #333 1px
122
- /* space between leds*/
123
- , transparent 1px);
124
- background-repeat: repeat-y;
125
- background-size: 100% 4px;
126
- /* 4px LED height */
127
- background-color: transparent;
128
- }
113
+ width: 100%;
114
+ height: 100%;
115
+ content: ' ';
116
+ position: absolute;
117
+ top: 0px;
118
+ left: 0px;
119
+ z-index: 2;
120
+ margin-top: 3px;
121
+ background-image: linear-gradient(to bottom, #333 1px
122
+ /* space between leds*/
123
+ , transparent 1px);
124
+ background-repeat: repeat-y;
125
+ background-size: 100% 4px;
126
+ /* 4px LED height */
127
+ background-color: transparent;
128
+ }
package/client/style.css CHANGED
@@ -48,41 +48,69 @@
48
48
  --tw-drop-shadow: ;
49
49
  }
50
50
 
51
+ .\!container {
52
+ width: 100% !important;
53
+ }
54
+
51
55
  .container {
52
56
  width: 100%;
53
57
  }
54
58
 
55
59
  @media (min-width: 300px) {
60
+ .\!container {
61
+ max-width: 300px !important;
62
+ }
63
+
56
64
  .container {
57
65
  max-width: 300px;
58
66
  }
59
67
  }
60
68
 
61
69
  @media (min-width: 640px) {
70
+ .\!container {
71
+ max-width: 640px !important;
72
+ }
73
+
62
74
  .container {
63
75
  max-width: 640px;
64
76
  }
65
77
  }
66
78
 
67
79
  @media (min-width: 768px) {
80
+ .\!container {
81
+ max-width: 768px !important;
82
+ }
83
+
68
84
  .container {
69
85
  max-width: 768px;
70
86
  }
71
87
  }
72
88
 
73
89
  @media (min-width: 1024px) {
90
+ .\!container {
91
+ max-width: 1024px !important;
92
+ }
93
+
74
94
  .container {
75
95
  max-width: 1024px;
76
96
  }
77
97
  }
78
98
 
79
99
  @media (min-width: 1280px) {
100
+ .\!container {
101
+ max-width: 1280px !important;
102
+ }
103
+
80
104
  .container {
81
105
  max-width: 1280px;
82
106
  }
83
107
  }
84
108
 
85
109
  @media (min-width: 1536px) {
110
+ .\!container {
111
+ max-width: 1536px !important;
112
+ }
113
+
86
114
  .container {
87
115
  max-width: 1536px;
88
116
  }
@@ -1,5 +1,8 @@
1
- import type { PreviewOutputEvent, PreviewOutputSettings, PreviewOutputState } from "./runtime";
1
+ import type { PreviewOutputEvent, PreviewOutputSettings } from "./runtime";
2
2
  import type Registration from "@norskvideo/norsk-studio/lib/extension/registration";
3
- export default function (R: Registration): import("@norskvideo/norsk-studio/lib/extension/client-types").NodeInfo<PreviewOutputSettings, PreviewOutputState, object, PreviewOutputEvent>;
3
+ export default function (R: Registration): import("@norskvideo/norsk-studio/lib/extension/client-types").NodeInfo<PreviewOutputSettings, {
4
+ url?: string;
5
+ levels?: import("./types").components["schemas"]["audio_level"];
6
+ }, object, PreviewOutputEvent>;
4
7
  export declare const hardwareNames: readonly ["quadra", "nvidia"];
5
8
  export type HardwareName = typeof hardwareNames[number];
@@ -76,6 +76,9 @@ function default_1(R) {
76
76
  case 'audio-levels':
77
77
  state.levels = ev.levels;
78
78
  break;
79
+ case 'source-lost':
80
+ state = {};
81
+ break;
79
82
  default:
80
83
  assertUnreachable(evType);
81
84
  }
@@ -89,9 +92,20 @@ function default_1(R) {
89
92
  hardware: (0, config_1.HardwareSelection)()
90
93
  },
91
94
  form: {
92
- bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: 'numeric', validation: JitterBuffer, defaultValue: 500.0 } },
93
- skipTranscode: { help: "Skip transcoding for WebRTC-ready streams", hint: { type: 'boolean', defaultValue: false } },
95
+ previewMode: {
96
+ help: "How to display the video",
97
+ hint: {
98
+ type: 'select',
99
+ defaultValue: 'image',
100
+ options: [
101
+ { value: 'video_encode', display: 'WebRTC (Re-Encode)' },
102
+ { value: 'video_passthrough', display: 'WebRTC (Passthrough)' },
103
+ { value: 'images', display: 'JPEG Only' }
104
+ ]
105
+ }
106
+ },
94
107
  showPreview: { help: "Show video preview", hint: { type: 'boolean', defaultValue: true } },
108
+ bufferDelayMs: { help: "How many milliseconds in the jitter buffer (WebRTC only)", hint: { type: 'numeric', validation: JitterBuffer, defaultValue: 500.0 } },
95
109
  notes: {
96
110
  help: "Additional notes about this component",
97
111
  hint: { type: 'text', optional: true }
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/output.preview/info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/output.preview/info.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,16 @@ function InlineView({ state, config, raise }) {
26
26
  video.remove();
27
27
  });
28
28
  };
29
+ const [loadedImage, setLoadedImage] = (0, react_1.useState)(undefined);
30
+ (0, react_1.useEffect)(() => {
31
+ const container = document.getElementById(`preview-${id}`) ?? undefined;
32
+ if (!container)
33
+ return;
34
+ container.innerHTML = '';
35
+ if (loadedImage) {
36
+ container.appendChild(loadedImage);
37
+ }
38
+ }, [loadedImage]);
29
39
  (0, react_1.useEffect)(() => {
30
40
  if (!url || !showPreview) {
31
41
  if (client) {
@@ -34,11 +44,25 @@ function InlineView({ state, config, raise }) {
34
44
  }
35
45
  return;
36
46
  }
37
- const newClient = createClient(url);
38
- setClient(newClient);
39
- return () => {
40
- cleanupClient(newClient);
41
- };
47
+ if (config.previewMode == "image") {
48
+ const container = document.getElementById(`preview-${id}`) ?? undefined;
49
+ if (!container)
50
+ return;
51
+ const img = document.createElement('img');
52
+ img.width = 420;
53
+ img.height = 236;
54
+ img.onload = () => {
55
+ setLoadedImage(img);
56
+ };
57
+ img.src = url;
58
+ }
59
+ else {
60
+ const newClient = createClient(url);
61
+ setClient(newClient);
62
+ return () => {
63
+ cleanupClient(newClient);
64
+ };
65
+ }
42
66
  }, [state.url, showPreview]);
43
67
  (0, react_1.useEffect)(() => {
44
68
  setShowPreview(config.showPreview ?? true);
@@ -1 +1 @@
1
- {"version":3,"file":"inline-view.js","sourceRoot":"","sources":["../../src/output.preview/inline-view.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-view.js","sourceRoot":"","sources":["../../src/output.preview/inline-view.tsx"],"names":[],"mappings":"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"}
@@ -1,27 +1,23 @@
1
- import { AudioMeasureLevelsNode, Norsk, WhepOutputSettings as SdkSettings, SourceMediaNode, WhepOutputNode } from '@norskvideo/norsk-sdk';
2
- import { OnCreated, RuntimeUpdates, ServerComponentDefinition, StudioNodeSubscriptionSource, StudioRuntime, StudioShared } from '@norskvideo/norsk-studio/lib/extension/runtime-types';
3
- import { CustomSinkNode, SimpleSinkWrapper, SubscriptionOpts } from '@norskvideo/norsk-studio/lib/extension/base-nodes';
1
+ import { AudioMeasureLevelsNode, ImagePreviewOutputNode, Norsk, ReceiveFromAddressAuto, WhepOutputSettings as SdkSettings, SourceMediaNode, SubscriptionError, WhepOutputNode } from '@norskvideo/norsk-sdk';
2
+ import { InstanceRouteInfo, OnCreated, RuntimeUpdates, ServerComponentDefinition, StudioNodeSubscriptionSource, StudioRuntime, StudioShared } from '@norskvideo/norsk-studio/lib/extension/runtime-types';
3
+ import { CustomSinkNode, SubscriptionOpts } from '@norskvideo/norsk-studio/lib/extension/base-nodes';
4
4
  import { HardwareAccelerationType, IceServer } from '@norskvideo/norsk-studio/lib/shared/config';
5
5
  import { ContextPromiseControl } from '@norskvideo/norsk-studio/lib/runtime/util';
6
+ import { components } from './types';
7
+ export type PreviewMode = 'video_passthrough' | 'video_encode' | 'image';
6
8
  export type PreviewOutputSettings = {
7
9
  id: string;
8
10
  displayName: string;
9
11
  notes?: string;
10
12
  bufferDelayMs?: SdkSettings['bufferDelayMs'];
11
- skipTranscode?: boolean;
13
+ previewMode: PreviewMode;
12
14
  showPreview?: boolean;
13
15
  __global: {
14
16
  iceServers: IceServer[];
15
17
  hardware?: HardwareAccelerationType;
16
18
  };
17
19
  };
18
- export type PreviewOutputState = {
19
- url?: string;
20
- levels?: {
21
- peak: number;
22
- rms: number;
23
- };
24
- };
20
+ export type PreviewOutputState = components['schemas']['latest_state'];
25
21
  export type PreviewOutputEvent = {
26
22
  type: 'url-published';
27
23
  url: string;
@@ -31,10 +27,13 @@ export type PreviewOutputEvent = {
31
27
  peak: number;
32
28
  rms: number;
33
29
  };
30
+ } | {
31
+ type: 'source-lost';
34
32
  };
35
33
  export type PreviewOutputCommand = object;
36
- export default class WhepOutputDefinition implements ServerComponentDefinition<PreviewOutputSettings, SimpleSinkWrapper, PreviewOutputState, PreviewOutputCommand, PreviewOutputEvent> {
37
- create(norsk: Norsk, cfg: PreviewOutputSettings, cb: OnCreated<SimpleSinkWrapper>, runtime: StudioRuntime<PreviewOutputState, PreviewOutputCommand, PreviewOutputEvent>): Promise<void>;
34
+ export default class WhepOutputDefinition implements ServerComponentDefinition<PreviewOutputSettings, PreviewOutput, PreviewOutputState, PreviewOutputCommand, PreviewOutputEvent> {
35
+ create(norsk: Norsk, cfg: PreviewOutputSettings, cb: OnCreated<PreviewOutput>, runtime: StudioRuntime<PreviewOutputState, PreviewOutputCommand, PreviewOutputEvent>): Promise<void>;
36
+ instanceRoutes(): Promise<InstanceRouteInfo<PreviewOutputSettings, PreviewOutput, PreviewOutputState, PreviewOutputCommand, PreviewOutputEvent>[]>;
38
37
  }
39
38
  export declare class PreviewOutput extends CustomSinkNode {
40
39
  initialised: Promise<void>;
@@ -44,10 +43,14 @@ export declare class PreviewOutput extends CustomSinkNode {
44
43
  cfg: PreviewOutputSettings;
45
44
  encoder?: SourceMediaNode;
46
45
  whep?: WhepOutputNode;
46
+ images?: ImagePreviewOutputNode;
47
47
  audioLevels?: AudioMeasureLevelsNode;
48
48
  context: ContextPromiseControl;
49
+ currentSources: StudioNodeSubscriptionSource[];
49
50
  constructor(norsk: Norsk, { updates, shared }: StudioRuntime<PreviewOutputState, PreviewOutputCommand, PreviewOutputEvent>, cfg: PreviewOutputSettings);
50
51
  initialise(): Promise<void>;
51
52
  subscribe(sources: StudioNodeSubscriptionSource[], _opts?: SubscriptionOpts | undefined): void;
53
+ sourceContextChange(_responseCallback: (error?: SubscriptionError) => void): Promise<boolean>;
52
54
  subscribeImpl(sources: StudioNodeSubscriptionSource[]): Promise<void>;
55
+ setupWhep(subscriptions: ReceiveFromAddressAuto[]): Promise<void>;
53
56
  }