@norskvideo/norsk-studio-built-ins 1.12.0-2025-02-03-6cdc30e8 → 1.12.0-2025-02-04-9551fc82

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 CHANGED
@@ -823,6 +823,39 @@ var init_info = __esm({
823
823
  }
824
824
  });
825
825
 
826
+ // build/output.whep/summary-view.js
827
+ var summary_view_exports3 = {};
828
+ __export(summary_view_exports3, {
829
+ default: () => summary_view_default3
830
+ });
831
+ function SummaryView5({ state, sendCommand }) {
832
+ const handleEnableOutput = () => {
833
+ void enableOutput();
834
+ };
835
+ const enableOutput = async () => {
836
+ sendCommand({
837
+ type: "enable-output"
838
+ });
839
+ };
840
+ const handleDisableOutput = () => {
841
+ void disableOutput();
842
+ };
843
+ const disableOutput = async () => {
844
+ sendCommand({
845
+ type: "disable-output"
846
+ });
847
+ };
848
+ return (0, import_jsx_runtime11.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, import_jsx_runtime11.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, import_jsx_runtime11.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, import_jsx_runtime11.jsx)("div", { children: state.enabled ? (0, import_jsx_runtime11.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" }) : (0, import_jsx_runtime11.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" }) })] }) });
849
+ }
850
+ var import_jsx_runtime11, summary_view_default3;
851
+ var init_summary_view3 = __esm({
852
+ "build/output.whep/summary-view.js"() {
853
+ "use strict";
854
+ import_jsx_runtime11 = __toESM(require_jsx_runtime());
855
+ summary_view_default3 = SummaryView5;
856
+ }
857
+ });
858
+
826
859
  // build/output.whep/inline-view.js
827
860
  var inline_view_exports6 = {};
828
861
  __export(inline_view_exports6, {
@@ -870,19 +903,19 @@ function InlineView8({ state, config, raise }) {
870
903
  }, [config.showPreview]);
871
904
  raise && (0, import_react11.useEffect)(raise, []);
872
905
  if (!url)
873
- return (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, { children: "..." });
906
+ return (0, import_jsx_runtime12.jsx)(import_jsx_runtime12.Fragment, { children: "..." });
874
907
  const videoStyles = `
875
908
  #whep-${id} video::-webkit-media-controls-play-button {
876
909
  display: none;
877
910
  }
878
911
  `;
879
- return (0, import_jsx_runtime11.jsxs)("div", { className: "whep-container", children: [(0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime11.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime11.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime11.jsx)("div", { className: "whep-video", id: `whep-${id}`, children: (0, import_jsx_runtime11.jsx)("style", { children: videoStyles }) }) : (0, import_jsx_runtime11.jsx)("div", { className: "whep-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" })] });
912
+ return (0, import_jsx_runtime12.jsxs)("div", { className: "whep-container", children: [(0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, import_jsx_runtime12.jsx)("input", { type: "checkbox", id: `video-toggle-${id}`, checked: showPreview, onChange: (e) => setShowPreview(e.target.checked), className: "h-4 w-4" }), (0, import_jsx_runtime12.jsx)("label", { htmlFor: `video-toggle-${id}`, className: "text-sm", children: "Show Preview" })] }), showPreview ? (0, import_jsx_runtime12.jsx)("div", { className: "whep-video", id: `whep-${id}`, children: (0, import_jsx_runtime12.jsx)("style", { children: videoStyles }) }) : (0, import_jsx_runtime12.jsx)("div", { className: "whep-video bg-black flex items-center justify-center text-white h-full", children: "Preview turned off" })] });
880
913
  }
881
- var import_jsx_runtime11, import_react11, import_webrtc_client2, inline_view_default6;
914
+ var import_jsx_runtime12, import_react11, import_webrtc_client2, inline_view_default6;
882
915
  var init_inline_view6 = __esm({
883
916
  "build/output.whep/inline-view.js"() {
884
917
  "use strict";
885
- import_jsx_runtime11 = __toESM(require_jsx_runtime());
918
+ import_jsx_runtime12 = __toESM(require_jsx_runtime());
886
919
  import_react11 = __toESM(require_react());
887
920
  import_webrtc_client2 = __toESM(require_webrtc_client());
888
921
  inline_view_default6 = InlineView8;
@@ -890,18 +923,18 @@ var init_inline_view6 = __esm({
890
923
  });
891
924
 
892
925
  // build/processor.browserOverlay/summary-view.js
893
- var summary_view_exports3 = {};
894
- __export(summary_view_exports3, {
895
- default: () => summary_view_default3
926
+ var summary_view_exports4 = {};
927
+ __export(summary_view_exports4, {
928
+ default: () => summary_view_default4
896
929
  });
897
- function SummaryView5({ state, sendCommand }) {
930
+ function SummaryView7({ state, sendCommand }) {
898
931
  const [url, setUrl] = (0, import_react13.useState)(state.currentUrl);
899
932
  const [enabled, setEnabled] = (0, import_react13.useState)(state.enabled);
900
933
  const stateChanged = (0, import_react13.useMemo)(() => {
901
934
  return url !== state.currentUrl || enabled !== state.enabled;
902
935
  }, [url, enabled]);
903
936
  const buttonClass = "mt-2 mb-5 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";
904
- return (0, import_jsx_runtime12.jsxs)("div", { className: "space-y-3 mb-5", children: [(0, import_jsx_runtime12.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime12.jsxs)("div", { className: "mb-5", children: [(0, import_jsx_runtime12.jsx)("label", { htmlFor: "url", className: "mb-2 mr-2 text-sm font-medium text-gray-900 dark:text-white", children: "URL" }), (0, import_jsx_runtime12.jsx)("input", { type: "email", id: "url", className: "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500", value: url, onChange: (e) => setUrl(e.target.value), required: true })] }), (0, import_jsx_runtime12.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime12.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime12.jsx)("span", { className: "me-3 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Enabled" }), (0, import_jsx_runtime12.jsx)("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked), className: "sr-only peer" }), (0, import_jsx_runtime12.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) }), (0, import_jsx_runtime12.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, disabled: !stateChanged, onClick: () => {
937
+ return (0, import_jsx_runtime13.jsxs)("div", { className: "space-y-3 mb-5", children: [(0, import_jsx_runtime13.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime13.jsxs)("div", { className: "mb-5", children: [(0, import_jsx_runtime13.jsx)("label", { htmlFor: "url", className: "mb-2 mr-2 text-sm font-medium text-gray-900 dark:text-white", children: "URL" }), (0, import_jsx_runtime13.jsx)("input", { type: "email", id: "url", className: "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500", value: url, onChange: (e) => setUrl(e.target.value), required: true })] }), (0, import_jsx_runtime13.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime13.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime13.jsx)("span", { className: "me-3 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Enabled" }), (0, import_jsx_runtime13.jsx)("input", { type: "checkbox", checked: enabled, onChange: (e) => setEnabled(e.target.checked), className: "sr-only peer" }), (0, import_jsx_runtime13.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) }), (0, import_jsx_runtime13.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, disabled: !stateChanged, onClick: () => {
905
938
  if (url !== state.currentUrl) {
906
939
  sendCommand({ type: "change-url", url });
907
940
  }
@@ -914,13 +947,13 @@ function SummaryView5({ state, sendCommand }) {
914
947
  }
915
948
  }, children: "Commit" })] });
916
949
  }
917
- var import_jsx_runtime12, import_react13, summary_view_default3;
918
- var init_summary_view3 = __esm({
950
+ var import_jsx_runtime13, import_react13, summary_view_default4;
951
+ var init_summary_view4 = __esm({
919
952
  "build/processor.browserOverlay/summary-view.js"() {
920
953
  "use strict";
921
- import_jsx_runtime12 = __toESM(require_jsx_runtime());
954
+ import_jsx_runtime13 = __toESM(require_jsx_runtime());
922
955
  import_react13 = __toESM(require_react());
923
- summary_view_default3 = SummaryView5;
956
+ summary_view_default4 = SummaryView7;
924
957
  }
925
958
  });
926
959
 
@@ -930,13 +963,13 @@ __export(inline_view_exports7, {
930
963
  default: () => inline_view_default7
931
964
  });
932
965
  function InlineView9({ state, config }) {
933
- return (0, import_jsx_runtime13.jsx)("div", { id: `browser-overlay-${config.id}`, children: (0, import_jsx_runtime13.jsxs)("div", { className: "w-64 grid grid-cols-[min-content,1fr] gap-2", children: [(0, import_jsx_runtime13.jsx)("div", { children: "URL:" }), (0, import_jsx_runtime13.jsx)("div", { className: "truncate", children: state.currentUrl }), (0, import_jsx_runtime13.jsx)("div", { children: "Enabled:" }), (0, import_jsx_runtime13.jsx)("div", { children: (0, import_jsx_runtime13.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime13.jsx)("input", { type: "checkbox", checked: state.enabled, disabled: true, className: "sr-only peer" }), (0, import_jsx_runtime13.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) })] }) });
966
+ return (0, import_jsx_runtime14.jsx)("div", { id: `browser-overlay-${config.id}`, children: (0, import_jsx_runtime14.jsxs)("div", { className: "w-64 grid grid-cols-[min-content,1fr] gap-2", children: [(0, import_jsx_runtime14.jsx)("div", { children: "URL:" }), (0, import_jsx_runtime14.jsx)("div", { className: "truncate", children: state.currentUrl }), (0, import_jsx_runtime14.jsx)("div", { children: "Enabled:" }), (0, import_jsx_runtime14.jsx)("div", { children: (0, import_jsx_runtime14.jsxs)("label", { className: "inline-flex items-center cursor-pointer", children: [(0, import_jsx_runtime14.jsx)("input", { type: "checkbox", checked: state.enabled, disabled: true, className: "sr-only peer" }), (0, import_jsx_runtime14.jsx)("div", { className: "relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600" })] }) })] }) });
934
967
  }
935
- var import_jsx_runtime13, inline_view_default7;
968
+ var import_jsx_runtime14, inline_view_default7;
936
969
  var init_inline_view7 = __esm({
937
970
  "build/processor.browserOverlay/inline-view.js"() {
938
971
  "use strict";
939
- import_jsx_runtime13 = __toESM(require_jsx_runtime());
972
+ import_jsx_runtime14 = __toESM(require_jsx_runtime());
940
973
  inline_view_default7 = InlineView9;
941
974
  }
942
975
  });
@@ -952,10 +985,10 @@ function OrderInput(props) {
952
985
  }, [props.defaultValue]);
953
986
  const [value, setValue] = (0, import_react15.useState)(props.defaultValue ?? []);
954
987
  if (value.length == 0) {
955
- return (0, import_jsx_runtime14.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
988
+ return (0, import_jsx_runtime15.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
956
989
  } else {
957
- return (0, import_jsx_runtime14.jsx)("div", { id: props.id, children: (0, import_jsx_runtime14.jsx)("ul", { children: value.map((v, ix) => {
958
- return (0, import_jsx_runtime14.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime14.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime14.jsx)(import_jsx_runtime14.Fragment, {}) : (0, import_jsx_runtime14.jsx)("svg", { onClick: moveUp(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime14.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime14.jsx)(import_jsx_runtime14.Fragment, {}) : (0, import_jsx_runtime14.jsx)("svg", { onClick: moveDown(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime14.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
990
+ return (0, import_jsx_runtime15.jsx)("div", { id: props.id, children: (0, import_jsx_runtime15.jsx)("ul", { children: value.map((v, ix) => {
991
+ return (0, import_jsx_runtime15.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime15.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, {}) : (0, import_jsx_runtime15.jsx)("svg", { onClick: moveUp(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, {}) : (0, import_jsx_runtime15.jsx)("svg", { onClick: moveDown(ix), xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, className: "w-4 h-6 shrink cursor-pointer stroke-gray-700 dark:stroke-gray-50", children: (0, import_jsx_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
959
992
  }) }) });
960
993
  }
961
994
  function moveUp(ix) {
@@ -977,11 +1010,11 @@ function OrderInput(props) {
977
1010
  };
978
1011
  }
979
1012
  }
980
- var import_jsx_runtime14, import_react15, source_selection_default;
1013
+ var import_jsx_runtime15, import_react15, source_selection_default;
981
1014
  var init_source_selection = __esm({
982
1015
  "build/processor.cascadingSwitch/source-selection.js"() {
983
1016
  "use strict";
984
- import_jsx_runtime14 = __toESM(require_jsx_runtime());
1017
+ import_jsx_runtime15 = __toESM(require_jsx_runtime());
985
1018
  import_react15 = __toESM(require_react());
986
1019
  source_selection_default = OrderInput;
987
1020
  }
@@ -993,13 +1026,13 @@ __export(inline_view_exports8, {
993
1026
  default: () => inline_view_default8
994
1027
  });
995
1028
  function InlineView11({ state, config }) {
996
- return (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [(0, import_jsx_runtime15.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime15.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime15.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime15.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime15.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime15.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
1029
+ return (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [(0, import_jsx_runtime16.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime16.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime16.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime16.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime16.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime16.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
997
1030
  }
998
- var import_jsx_runtime15, activeClasses, availableClasses, inactiveClasses, inline_view_default8;
1031
+ var import_jsx_runtime16, activeClasses, availableClasses, inactiveClasses, inline_view_default8;
999
1032
  var init_inline_view8 = __esm({
1000
1033
  "build/processor.cascadingSwitch/inline-view.js"() {
1001
1034
  "use strict";
1002
- import_jsx_runtime15 = __toESM(require_jsx_runtime());
1035
+ import_jsx_runtime16 = __toESM(require_jsx_runtime());
1003
1036
  activeClasses = "active text-green-500 dark:text-green-300";
1004
1037
  availableClasses = "available text-green-500 dark:text-green-300";
1005
1038
  inactiveClasses = "inactive text-orange-500 dark:text-orange-300";
@@ -1013,13 +1046,13 @@ __export(rung_view_exports, {
1013
1046
  default: () => rung_view_default
1014
1047
  });
1015
1048
  function rung_view_default(rung) {
1016
- return (0, import_jsx_runtime16.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
1049
+ return (0, import_jsx_runtime17.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
1017
1050
  }
1018
- var import_jsx_runtime16;
1051
+ var import_jsx_runtime17;
1019
1052
  var init_rung_view = __esm({
1020
1053
  "build/processor.fixedLadder/rung-view.js"() {
1021
1054
  "use strict";
1022
- import_jsx_runtime16 = __toESM(require_jsx_runtime());
1055
+ import_jsx_runtime17 = __toESM(require_jsx_runtime());
1023
1056
  }
1024
1057
  });
1025
1058
 
@@ -1042,7 +1075,7 @@ function CodecEditor(props) {
1042
1075
  target.style.height = target.scrollHeight + "px";
1043
1076
  }
1044
1077
  }, []);
1045
- return (0, import_jsx_runtime17.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit bg-white text-gray-900 dark:text-white dark:bg-black", onChange: (e) => {
1078
+ return (0, import_jsx_runtime18.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit bg-white text-gray-900 dark:text-white dark:bg-black", onChange: (e) => {
1046
1079
  const target = e.currentTarget;
1047
1080
  try {
1048
1081
  const codec = JSON.parse(target.value);
@@ -1052,11 +1085,11 @@ function CodecEditor(props) {
1052
1085
  }
1053
1086
  }, defaultValue: JSON.stringify(value, void 0, 2) });
1054
1087
  }
1055
- var import_jsx_runtime17, import_react16;
1088
+ var import_jsx_runtime18, import_react16;
1056
1089
  var init_codec_editor = __esm({
1057
1090
  "build/processor.fixedLadder/codec-editor.js"() {
1058
1091
  "use strict";
1059
- import_jsx_runtime17 = __toESM(require_jsx_runtime());
1092
+ import_jsx_runtime18 = __toESM(require_jsx_runtime());
1060
1093
  import_react16 = __toESM(require_react());
1061
1094
  }
1062
1095
  });
@@ -1067,13 +1100,13 @@ __export(codec_view_exports, {
1067
1100
  default: () => CodecEditor2
1068
1101
  });
1069
1102
  function CodecEditor2(props) {
1070
- return (0, import_jsx_runtime18.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props.width, "x", props.height] });
1103
+ return (0, import_jsx_runtime19.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props.width, "x", props.height] });
1071
1104
  }
1072
- var import_jsx_runtime18;
1105
+ var import_jsx_runtime19;
1073
1106
  var init_codec_view = __esm({
1074
1107
  "build/processor.fixedLadder/codec-view.js"() {
1075
1108
  "use strict";
1076
- import_jsx_runtime18 = __toESM(require_jsx_runtime());
1109
+ import_jsx_runtime19 = __toESM(require_jsx_runtime());
1077
1110
  }
1078
1111
  });
1079
1112
 
@@ -1102,34 +1135,34 @@ function GraphicSelection(props) {
1102
1135
  }, []);
1103
1136
  const [graphcs, setGraphics] = (0, import_react18.useState)([]);
1104
1137
  if (loading) {
1105
- return (0, import_jsx_runtime19.jsx)("div", { children: "Loading.." });
1138
+ return (0, import_jsx_runtime20.jsx)("div", { children: "Loading.." });
1106
1139
  }
1107
1140
  if (graphcs.length == 0) {
1108
- return (0, import_jsx_runtime19.jsx)("div", { children: "No graphics loaded" });
1141
+ return (0, import_jsx_runtime20.jsx)("div", { children: "No graphics loaded" });
1109
1142
  }
1110
- return (0, import_jsx_runtime19.jsx)("div", { children: (0, import_jsx_runtime19.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime19.jsx)("option", { value: "", children: "---" }, "empty"), graphcs.map((o, i) => {
1111
- return (0, import_jsx_runtime19.jsx)("option", { value: o, children: o }, i);
1143
+ return (0, import_jsx_runtime20.jsx)("div", { children: (0, import_jsx_runtime20.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime20.jsx)("option", { value: "", children: "---" }, "empty"), graphcs.map((o, i) => {
1144
+ return (0, import_jsx_runtime20.jsx)("option", { value: o, children: o }, i);
1112
1145
  })] }) });
1113
1146
  function myOnChange(e) {
1114
1147
  props.onChanged(e.target.value);
1115
1148
  }
1116
1149
  }
1117
- var import_jsx_runtime19, import_react18, image_selection_default;
1150
+ var import_jsx_runtime20, import_react18, image_selection_default;
1118
1151
  var init_image_selection = __esm({
1119
1152
  "build/processor.onscreenGraphic/image-selection.js"() {
1120
1153
  "use strict";
1121
- import_jsx_runtime19 = __toESM(require_jsx_runtime());
1154
+ import_jsx_runtime20 = __toESM(require_jsx_runtime());
1122
1155
  import_react18 = __toESM(require_react());
1123
1156
  image_selection_default = GraphicSelection;
1124
1157
  }
1125
1158
  });
1126
1159
 
1127
1160
  // build/processor.onscreenGraphic/summary-view.js
1128
- var summary_view_exports4 = {};
1129
- __export(summary_view_exports4, {
1130
- default: () => summary_view_default4
1161
+ var summary_view_exports5 = {};
1162
+ __export(summary_view_exports5, {
1163
+ default: () => summary_view_default5
1131
1164
  });
1132
- function SummaryView7({ state, sendCommand, urls }) {
1165
+ function SummaryView9({ state, sendCommand, urls }) {
1133
1166
  const [graphic, setGraphic] = (0, import_react19.useState)(state.activeGraphic?.file);
1134
1167
  const [position, setPosition] = (0, import_react19.useState)(state.activeGraphic?.position ?? { type: "named", position: "topleft" });
1135
1168
  const [graphics, setGraphics] = (0, import_react19.useState)([]);
@@ -1264,7 +1297,7 @@ function SummaryView7({ state, sendCommand, urls }) {
1264
1297
  const buttonClass = "mt-2 mb-5 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";
1265
1298
  const deleteButtonClass = "mt-2 text-white w-full justify-center bg-red-600 hover:bg-red-700 focus:ring-4 focus:outline-none focus:ring-red-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-red-700 dark:hover:bg-red-800 dark:focus:ring-red-900";
1266
1299
  const fileInputClass = "block w-full text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400";
1267
- return (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime20.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime20.jsxs)("div", { children: [(0, import_jsx_runtime20.jsx)("label", { htmlFor: "select-graphic", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime20.jsxs)("select", { id: "select-graphic", className: "w-full node-editor-select-input", value: graphic || "", onChange: (e) => setGraphic(e.target.value || void 0), children: [(0, import_jsx_runtime20.jsx)("option", { value: "", children: "---" }), graphics.map((s) => (0, import_jsx_runtime20.jsx)("option", { value: s, children: s }, s))] })] }), graphic && (0, import_jsx_runtime20.jsxs)("div", { children: [(0, import_jsx_runtime20.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Graphic position" }), (0, import_jsx_runtime20.jsx)(PositionSelector, { initialPosition: position, onChange: setPosition, graphicChanged, ...state })] }), (0, import_jsx_runtime20.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, onClick: () => sendCommand({ type: "change-graphic", file: graphic, position }), disabled: !stateChanged, children: "Commit" }), !showFileInput && !uploadStatus.success && (0, import_jsx_runtime20.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Graphic" }), showFileInput && (0, import_jsx_runtime20.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime20.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime20.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime20.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Graphics" }), showDeleteDropdown && (0, import_jsx_runtime20.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime20.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Graphic to Delete" }), (0, import_jsx_runtime20.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: graphicToDelete, onChange: (e) => setGraphicToDelete(e.target.value), children: [(0, import_jsx_runtime20.jsx)("option", { value: "", children: " Select a graphic" }), graphics.map((graphicName) => (0, import_jsx_runtime20.jsx)("option", { value: graphicName, children: graphicName }, graphicName))] }), (0, import_jsx_runtime20.jsx)("button", { onClick: deleteBug, disabled: !graphicToDelete, className: `${deleteButtonClass} ${!graphicToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Graphic" })] }), uploadStatus.message && (0, import_jsx_runtime20.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
1300
+ return (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime21.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsx)("label", { htmlFor: "select-graphic", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime21.jsxs)("select", { id: "select-graphic", className: "w-full node-editor-select-input", value: graphic || "", onChange: (e) => setGraphic(e.target.value || void 0), children: [(0, import_jsx_runtime21.jsx)("option", { value: "", children: "---" }), graphics.map((s) => (0, import_jsx_runtime21.jsx)("option", { value: s, children: s }, s))] })] }), graphic && (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Graphic position" }), (0, import_jsx_runtime21.jsx)(PositionSelector, { initialPosition: position, onChange: setPosition, graphicChanged, ...state })] }), (0, import_jsx_runtime21.jsx)("button", { type: "button", className: `${buttonClass} ${!stateChanged ? "opacity-50 cursor-not-allowed" : ""}`, onClick: () => sendCommand({ type: "change-graphic", file: graphic, position }), disabled: !stateChanged, children: "Commit" }), !showFileInput && !uploadStatus.success && (0, import_jsx_runtime21.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Graphic" }), showFileInput && (0, import_jsx_runtime21.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime21.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime21.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime21.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Graphics" }), showDeleteDropdown && (0, import_jsx_runtime21.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime21.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Graphic to Delete" }), (0, import_jsx_runtime21.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: graphicToDelete, onChange: (e) => setGraphicToDelete(e.target.value), children: [(0, import_jsx_runtime21.jsx)("option", { value: "", children: " Select a graphic" }), graphics.map((graphicName) => (0, import_jsx_runtime21.jsx)("option", { value: graphicName, children: graphicName }, graphicName))] }), (0, import_jsx_runtime21.jsx)("button", { onClick: deleteBug, disabled: !graphicToDelete, className: `${deleteButtonClass} ${!graphicToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Graphic" })] }), uploadStatus.message && (0, import_jsx_runtime21.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
1268
1301
  }
1269
1302
  function convertPosition(givenPosition, currentVideo, currentGraphic) {
1270
1303
  if (!givenPosition)
@@ -1310,11 +1343,11 @@ function clamp(min, num, max) {
1310
1343
  function assertUnreachable12(_) {
1311
1344
  throw new Error("Didn't expect to get here");
1312
1345
  }
1313
- var import_jsx_runtime20, import_react19, PositionSelector, summary_view_default4;
1314
- var init_summary_view4 = __esm({
1346
+ var import_jsx_runtime21, import_react19, PositionSelector, summary_view_default5;
1347
+ var init_summary_view5 = __esm({
1315
1348
  "build/processor.onscreenGraphic/summary-view.js"() {
1316
1349
  "use strict";
1317
- import_jsx_runtime20 = __toESM(require_jsx_runtime());
1350
+ import_jsx_runtime21 = __toESM(require_jsx_runtime());
1318
1351
  import_react19 = __toESM(require_react());
1319
1352
  PositionSelector = ({ initialPosition: givenPosition = { type: "named", position: "topleft" }, onChange, currentVideo, currentGraphic, graphicChanged }) => {
1320
1353
  const convertPos = (pos) => convertPosition(pos, currentVideo, currentGraphic);
@@ -1382,7 +1415,7 @@ var init_summary_view4 = __esm({
1382
1415
  window.removeEventListener("mouseup", handleMouseUp);
1383
1416
  };
1384
1417
  }, [isDragging]);
1385
- return (0, import_jsx_runtime20.jsxs)("div", { className: "relative w-full max-w-lg mx-auto mt-4 mb-8", children: [(0, import_jsx_runtime20.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime20.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Type:" }), (0, import_jsx_runtime20.jsxs)("select", { value: position.type, onChange: (e) => {
1418
+ return (0, import_jsx_runtime21.jsxs)("div", { className: "relative w-full max-w-lg mx-auto mt-4 mb-8", children: [(0, import_jsx_runtime21.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime21.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Type:" }), (0, import_jsx_runtime21.jsxs)("select", { value: position.type, onChange: (e) => {
1386
1419
  const newType = e.target.value;
1387
1420
  if (newType === "named") {
1388
1421
  setPosition(convertPos({ type: "named", position: "topleft" }));
@@ -1390,12 +1423,12 @@ var init_summary_view4 = __esm({
1390
1423
  setPositionUnit("%");
1391
1424
  setPosition({ ...convertPos(position), type: "percentage" });
1392
1425
  }
1393
- }, className: "node-editor-select-input", children: [(0, import_jsx_runtime20.jsx)("option", { value: "coordinate", children: "Custom Position" }), (0, import_jsx_runtime20.jsx)("option", { value: "named", children: "Preset Position" })] })] }), position.type === "named" ? (0, import_jsx_runtime20.jsx)("div", { className: "mb-4", children: (0, import_jsx_runtime20.jsxs)("select", { value: position.position, onChange: (e) => {
1426
+ }, className: "node-editor-select-input", children: [(0, import_jsx_runtime21.jsx)("option", { value: "coordinate", children: "Custom Position" }), (0, import_jsx_runtime21.jsx)("option", { value: "named", children: "Preset Position" })] })] }), position.type === "named" ? (0, import_jsx_runtime21.jsx)("div", { className: "mb-4", children: (0, import_jsx_runtime21.jsxs)("select", { value: position.position, onChange: (e) => {
1394
1427
  setPosition(convertPos({
1395
1428
  type: "named",
1396
1429
  position: e.target.value
1397
1430
  }));
1398
- }, className: "w-full node-editor-select-input", children: [(0, import_jsx_runtime20.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime20.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime20.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime20.jsx)("option", { value: "bottomright", children: "Bottom Right" }), (0, import_jsx_runtime20.jsx)("option", { value: "center", children: "Centered" })] }) }) : (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [(0, import_jsx_runtime20.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime20.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Unit:" }), (0, import_jsx_runtime20.jsxs)("select", { value: positionUnit, onChange: (e) => {
1431
+ }, className: "w-full node-editor-select-input", children: [(0, import_jsx_runtime21.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime21.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime21.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime21.jsx)("option", { value: "bottomright", children: "Bottom Right" }), (0, import_jsx_runtime21.jsx)("option", { value: "center", children: "Centered" })] }) }) : (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [(0, import_jsx_runtime21.jsxs)("div", { className: "mb-4 flex items-center gap-2", children: [(0, import_jsx_runtime21.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: "Position Unit:" }), (0, import_jsx_runtime21.jsxs)("select", { value: positionUnit, onChange: (e) => {
1399
1432
  setPositionUnit(e.target.value);
1400
1433
  if (e.target.value === "px" && position.type !== "coordinate" && currentVideo && currentGraphic) {
1401
1434
  const { width: videoWidth, height: videoHeight } = currentVideo;
@@ -1420,18 +1453,18 @@ var init_summary_view4 = __esm({
1420
1453
  yStr: void 0
1421
1454
  });
1422
1455
  }
1423
- }, className: "node-editor-select-input", children: [(0, import_jsx_runtime20.jsx)("option", { value: "px", children: "Pixels" }), (0, import_jsx_runtime20.jsx)("option", { value: "%", children: "Percentage" })] })] }), (0, import_jsx_runtime20.jsxs)("div", { className: "relative bg-gray-200 dark:bg-gray-700 rounded-lg", style: {
1456
+ }, className: "node-editor-select-input", children: [(0, import_jsx_runtime21.jsx)("option", { value: "px", children: "Pixels" }), (0, import_jsx_runtime21.jsx)("option", { value: "%", children: "Percentage" })] })] }), (0, import_jsx_runtime21.jsxs)("div", { className: "relative bg-gray-200 dark:bg-gray-700 rounded-lg", style: {
1424
1457
  width: "100%",
1425
1458
  userSelect: "none",
1426
1459
  aspectRatio: currentVideo ? `${currentVideo.width} / ${currentVideo.height}` : `3 / 2`
1427
- }, ref: previewAreaRef, children: [(0, import_jsx_runtime20.jsxs)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400", children: [(0, import_jsx_runtime20.jsx)("span", { children: currentVideo ? "Video Preview Area" : "Video Dimensions Unknown" }), " ", currentVideo ? (0, import_jsx_runtime20.jsxs)("span", { children: [currentVideo.width, "x", currentVideo.height, "px"] }) : ""] }), (0, import_jsx_runtime20.jsx)("div", { className: `absolute cursor-move ${currentGraphic && !graphicChanged ? "" : "p-2"} rounded-lg bg-primary-500 bg-opacity-50 hover:bg-opacity-75 transition-colors
1460
+ }, ref: previewAreaRef, children: [(0, import_jsx_runtime21.jsxs)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-gray-500 dark:text-gray-400", children: [(0, import_jsx_runtime21.jsx)("span", { children: currentVideo ? "Video Preview Area" : "Video Dimensions Unknown" }), " ", currentVideo ? (0, import_jsx_runtime21.jsxs)("span", { children: [currentVideo.width, "x", currentVideo.height, "px"] }) : ""] }), (0, import_jsx_runtime21.jsx)("div", { className: `absolute cursor-move ${currentGraphic && !graphicChanged ? "" : "p-2"} rounded-lg bg-primary-500 bg-opacity-50 hover:bg-opacity-75 transition-colors
1428
1461
  ${isDragging ? "bg-opacity-75" : ""}`, style: {
1429
1462
  left: `${position.xPct}%`,
1430
1463
  top: `${position.yPct}%`,
1431
1464
  transform: `translate(-${position.xPct}%, -${position.yPct}%)`,
1432
1465
  aspectRatio: currentGraphic && !graphicChanged ? `${currentGraphic.width} / ${currentGraphic.height}` : `1`,
1433
1466
  width: currentGraphic && currentVideo && !graphicChanged ? currentGraphic.width / currentVideo.width * 100 + "%" : void 0
1434
- }, onMouseDown: handleMouseDown, ref: previewTargetRef, children: (0, import_jsx_runtime20.jsx)("svg", { className: `${currentGraphic && !graphicChanged ? "w-full h-full" : "w-6 h-6"} text-white`, "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: (0, import_jsx_runtime20.jsx)("path", { stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 6v12m-6-6h12m-6-6 1.5 1.5M12 6l-1.5 1.5m1.5 10.5L10.5 16.5M12 18l1.5-1.5M6 12l1.5-1.5M7.5 13.5 6 12m12 0-1.5-1.5M16.5 13.5 18 12" }) }) })] }), (0, import_jsx_runtime20.jsxs)("div", { className: "mt-2 text-sm text-gray-600 dark:text-gray-300 text-center", children: ["Position:", " ", position.type === "percentage" ? `${position.xPct.toFixed(1)}%, ${position.yPct.toFixed(1)}%` : `${Math.round(position.x)}px, ${Math.round(position.y)}px`] }), (0, import_jsx_runtime20.jsxs)("div", { className: "mt-2 flex gap-4", children: [(0, import_jsx_runtime20.jsxs)("div", { children: [(0, import_jsx_runtime20.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["X Position ", positionUnit] }), (0, import_jsx_runtime20.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.xStr ?? (positionUnit === "%" ? position.xPct.toFixed(1) : Math.round(position.x)), onChange: (e) => {
1467
+ }, onMouseDown: handleMouseDown, ref: previewTargetRef, children: (0, import_jsx_runtime21.jsx)("svg", { className: `${currentGraphic && !graphicChanged ? "w-full h-full" : "w-6 h-6"} text-white`, "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: (0, import_jsx_runtime21.jsx)("path", { stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 6v12m-6-6h12m-6-6 1.5 1.5M12 6l-1.5 1.5m1.5 10.5L10.5 16.5M12 18l1.5-1.5M6 12l1.5-1.5M7.5 13.5 6 12m12 0-1.5-1.5M16.5 13.5 18 12" }) }) })] }), (0, import_jsx_runtime21.jsxs)("div", { className: "mt-2 text-sm text-gray-600 dark:text-gray-300 text-center", children: ["Position:", " ", position.type === "percentage" ? `${position.xPct.toFixed(1)}%, ${position.yPct.toFixed(1)}%` : `${Math.round(position.x)}px, ${Math.round(position.y)}px`] }), (0, import_jsx_runtime21.jsxs)("div", { className: "mt-2 flex gap-4", children: [(0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["X Position ", positionUnit] }), (0, import_jsx_runtime21.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.xStr ?? (positionUnit === "%" ? position.xPct.toFixed(1) : Math.round(position.x)), onChange: (e) => {
1435
1468
  const newX = Number(e.target.value);
1436
1469
  setPosition(convertPos({
1437
1470
  type: positionUnit === "%" ? "percentage" : "coordinate",
@@ -1440,7 +1473,7 @@ var init_summary_view4 = __esm({
1440
1473
  y: position.y,
1441
1474
  yStr: position.yStr
1442
1475
  }));
1443
- }, className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm dark:bg-gray-700 dark:border-gray-600" })] }), (0, import_jsx_runtime20.jsxs)("div", { children: [(0, import_jsx_runtime20.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["Y Position ", positionUnit] }), (0, import_jsx_runtime20.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.yStr ?? (positionUnit === "%" ? position.yPct.toFixed(1) : Math.round(position.y)), onChange: (e) => {
1476
+ }, className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm dark:bg-gray-700 dark:border-gray-600" })] }), (0, import_jsx_runtime21.jsxs)("div", { children: [(0, import_jsx_runtime21.jsxs)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300", children: ["Y Position ", positionUnit] }), (0, import_jsx_runtime21.jsx)("input", { type: "number", step: positionUnit === "%" ? "0.1" : "1", value: position.yStr ?? (positionUnit === "%" ? position.yPct.toFixed(1) : Math.round(position.y)), onChange: (e) => {
1444
1477
  const newY = Number(e.target.value);
1445
1478
  setPosition(convertPos({
1446
1479
  type: positionUnit === "%" ? "percentage" : "coordinate",
@@ -1451,7 +1484,7 @@ var init_summary_view4 = __esm({
1451
1484
  }));
1452
1485
  }, className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm dark:bg-gray-700 dark:border-gray-600" })] })] })] })] });
1453
1486
  };
1454
- summary_view_default4 = SummaryView7;
1487
+ summary_view_default5 = SummaryView9;
1455
1488
  }
1456
1489
  });
1457
1490
 
@@ -15840,13 +15873,13 @@ function InlineView12({ state, config: _2 }) {
15840
15873
  return;
15841
15874
  chartControl.data = makeData(state);
15842
15875
  }, [state]);
15843
- return (0, import_jsx_runtime21.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime21.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15876
+ return (0, import_jsx_runtime22.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime22.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15844
15877
  }
15845
- var import_jsx_runtime21, import_react21, inline_view_default9;
15878
+ var import_jsx_runtime22, import_react21, inline_view_default9;
15846
15879
  var init_inline_view9 = __esm({
15847
15880
  "build/util.stats.latency/inline-view.js"() {
15848
15881
  "use strict";
15849
- import_jsx_runtime21 = __toESM(require_jsx_runtime());
15882
+ import_jsx_runtime22 = __toESM(require_jsx_runtime());
15850
15883
  import_react21 = __toESM(require_react());
15851
15884
  init_auto();
15852
15885
  inline_view_default9 = InlineView12;
@@ -15859,22 +15892,22 @@ __export(source_node_selection_exports, {
15859
15892
  default: () => source_node_selection_default
15860
15893
  });
15861
15894
  function SourceNodeSelection(props) {
15862
- return (0, import_jsx_runtime22.jsx)("div", { children: (0, import_jsx_runtime22.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime22.jsx)("option", { value: "", children: "---" }, "empty"), Object.values(props.latestDocument.components).map((o, i) => {
15895
+ return (0, import_jsx_runtime23.jsx)("div", { children: (0, import_jsx_runtime23.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime23.jsx)("option", { value: "", children: "---" }, "empty"), Object.values(props.latestDocument.components).map((o, i) => {
15863
15896
  if (o.id == props.id)
15864
- return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
15897
+ return (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, {});
15865
15898
  if (o.info.category === "output")
15866
15899
  return;
15867
- return (0, import_jsx_runtime22.jsx)("option", { value: o.id, children: o.config.displayName }, i);
15900
+ return (0, import_jsx_runtime23.jsx)("option", { value: o.id, children: o.config.displayName }, i);
15868
15901
  })] }) });
15869
15902
  function myOnChange(e) {
15870
15903
  props.onChanged(e.target.value);
15871
15904
  }
15872
15905
  }
15873
- var import_jsx_runtime22, source_node_selection_default;
15906
+ var import_jsx_runtime23, source_node_selection_default;
15874
15907
  var init_source_node_selection = __esm({
15875
15908
  "build/util.stats.latency/source-node-selection.js"() {
15876
15909
  "use strict";
15877
- import_jsx_runtime22 = __toESM(require_jsx_runtime());
15910
+ import_jsx_runtime23 = __toESM(require_jsx_runtime());
15878
15911
  source_node_selection_default = SourceNodeSelection;
15879
15912
  }
15880
15913
  });
@@ -16871,6 +16904,7 @@ function info_default12({ defineComponent, All, validation: { Port, Hostname, Ji
16871
16904
  // build/output.whep/info.js
16872
16905
  var import_config3 = __toESM(require_config());
16873
16906
  var import_react12 = __toESM(require_react());
16907
+ var SummaryView6 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_summary_view3(), summary_view_exports3)));
16874
16908
  function info_default13(R) {
16875
16909
  const { defineComponent, Av, validation: { JitterBuffer } } = R;
16876
16910
  const InlineView13 = import_react12.default.lazy(async () => Promise.resolve().then(() => (init_inline_view6(), inline_view_exports6)));
@@ -16895,19 +16929,26 @@ function info_default13(R) {
16895
16929
  },
16896
16930
  css: ["styles.css"],
16897
16931
  runtime: {
16898
- initialState: () => ({}),
16932
+ initialState: () => ({ enabled: true }),
16899
16933
  handleEvent(ev, state) {
16900
16934
  const evType = ev.type;
16901
16935
  switch (evType) {
16902
16936
  case "url-published":
16903
16937
  state.url = ev.url;
16904
16938
  break;
16939
+ case "output-enabled":
16940
+ state.enabled = true;
16941
+ break;
16942
+ case "output-disabled":
16943
+ state.enabled = false;
16944
+ break;
16905
16945
  default:
16906
16946
  assertUnreachable8(evType);
16907
16947
  }
16908
16948
  return { ...state };
16909
16949
  },
16910
- inline: InlineView13
16950
+ inline: InlineView13,
16951
+ summary: SummaryView6
16911
16952
  },
16912
16953
  configForm: {
16913
16954
  global: {
@@ -16928,7 +16969,7 @@ function assertUnreachable8(_) {
16928
16969
  // build/processor.browserOverlay/info.js
16929
16970
  var import_config4 = __toESM(require_config());
16930
16971
  var import_react14 = __toESM(require_react());
16931
- var SummaryView6 = import_react14.default.lazy(async () => Promise.resolve().then(() => (init_summary_view3(), summary_view_exports3)));
16972
+ var SummaryView8 = import_react14.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
16932
16973
  var InlineView10 = import_react14.default.lazy(async () => Promise.resolve().then(() => (init_inline_view7(), inline_view_exports7)));
16933
16974
  function info_default14({ defineComponent, Video, validation: { Z } }) {
16934
16975
  return defineComponent({
@@ -16956,7 +16997,7 @@ function info_default14({ defineComponent, Video, validation: { Z } }) {
16956
16997
  };
16957
16998
  },
16958
16999
  runtime: {
16959
- summary: SummaryView6,
17000
+ summary: SummaryView8,
16960
17001
  inline: InlineView10,
16961
17002
  initialState: () => ({
16962
17003
  currentUrl: "",
@@ -17463,7 +17504,7 @@ var import_config6 = __toESM(require_config());
17463
17504
  var import_react20 = __toESM(require_react());
17464
17505
  function info_default17({ defineComponent, Video }) {
17465
17506
  const GraphicSelection2 = import_react20.default.lazy(async () => Promise.resolve().then(() => (init_image_selection(), image_selection_exports)));
17466
- const SummaryView8 = import_react20.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
17507
+ const SummaryView10 = import_react20.default.lazy(async () => Promise.resolve().then(() => (init_summary_view5(), summary_view_exports5)));
17467
17508
  return defineComponent({
17468
17509
  identifier: "processor.onscreenGraphic",
17469
17510
  category: "processor",
@@ -17489,7 +17530,7 @@ function info_default17({ defineComponent, Video }) {
17489
17530
  };
17490
17531
  },
17491
17532
  runtime: {
17492
- summary: SummaryView8,
17533
+ summary: SummaryView10,
17493
17534
  initialState: () => ({}),
17494
17535
  handleEvent: (ev, state) => {
17495
17536
  const evType = ev.type;
package/client/style.css CHANGED
@@ -193,6 +193,10 @@
193
193
  display: block;
194
194
  }
195
195
 
196
+ .inline-block {
197
+ display: inline-block;
198
+ }
199
+
196
200
  .inline {
197
201
  display: inline;
198
202
  }
@@ -213,6 +217,10 @@
213
217
  display: none;
214
218
  }
215
219
 
220
+ .h-2 {
221
+ height: 0.5rem;
222
+ }
223
+
216
224
  .h-4 {
217
225
  height: 1rem;
218
226
  }
@@ -242,6 +250,10 @@
242
250
  width: 2.75rem;
243
251
  }
244
252
 
253
+ .w-2 {
254
+ width: 0.5rem;
255
+ }
256
+
245
257
  .w-4 {
246
258
  width: 1rem;
247
259
  }
@@ -413,6 +425,11 @@
413
425
  background-color: rgb(0 0 0 / var(--tw-bg-opacity));
414
426
  }
415
427
 
428
+ .bg-blue-500 {
429
+ --tw-bg-opacity: 1;
430
+ background-color: rgb(63 131 248 / var(--tw-bg-opacity));
431
+ }
432
+
416
433
  .bg-blue-600 {
417
434
  --tw-bg-opacity: 1;
418
435
  background-color: rgb(28 100 242 / var(--tw-bg-opacity));
@@ -443,6 +460,11 @@
443
460
  background-color: rgb(29 78 216 / var(--tw-bg-opacity));
444
461
  }
445
462
 
463
+ .bg-red-500 {
464
+ --tw-bg-opacity: 1;
465
+ background-color: rgb(240 82 82 / var(--tw-bg-opacity));
466
+ }
467
+
446
468
  .bg-red-600 {
447
469
  --tw-bg-opacity: 1;
448
470
  background-color: rgb(224 36 36 / var(--tw-bg-opacity));
@@ -1,3 +1,3 @@
1
- import { type WhepOutputEvent, type WhepOutputSettings, type WhepOutputState } from "./runtime";
1
+ import { WhepOutputCommand, type WhepOutputEvent, type WhepOutputSettings, type WhepOutputState } 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<WhepOutputSettings, WhepOutputState, object, WhepOutputEvent>;
3
+ export default function (R: Registration): import("@norskvideo/norsk-studio/lib/extension/client-types").NodeInfo<WhepOutputSettings, WhepOutputState, WhepOutputCommand, WhepOutputEvent>;
@@ -29,6 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.default = default_1;
30
30
  const config_1 = require("@norskvideo/norsk-studio/lib/shared/config");
31
31
  const react_1 = __importDefault(require("react"));
32
+ const SummaryView = react_1.default.lazy(async () => Promise.resolve().then(() => __importStar(require('./summary-view'))));
32
33
  function default_1(R) {
33
34
  const { defineComponent, Av, validation: { JitterBuffer }, } = R;
34
35
  const InlineView = react_1.default.lazy(async () => Promise.resolve().then(() => __importStar(require('./inline-view'))));
@@ -46,19 +47,26 @@ function default_1(R) {
46
47
  display: (_desc) => { return {}; },
47
48
  css: ["styles.css"],
48
49
  runtime: {
49
- initialState: () => ({}),
50
+ initialState: () => ({ enabled: true }),
50
51
  handleEvent(ev, state) {
51
52
  const evType = ev.type;
52
53
  switch (evType) {
53
54
  case 'url-published':
54
55
  state.url = ev.url;
55
56
  break;
57
+ case "output-enabled":
58
+ state.enabled = true;
59
+ break;
60
+ case "output-disabled":
61
+ state.enabled = false;
62
+ break;
56
63
  default:
57
64
  assertUnreachable(evType);
58
65
  }
59
66
  return { ...state };
60
67
  },
61
- inline: InlineView
68
+ inline: InlineView,
69
+ summary: SummaryView
62
70
  },
63
71
  configForm: {
64
72
  global: {
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/output.whep/info.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,4BAoDC;AAvDD,uEAA6E;AAC7E,kDAA0B;AAE1B,mBAAwB,CAAe;IACrC,MAAM,EACJ,eAAe,EACf,EAAE,EACF,UAAU,EAAE,EAAE,YAAY,EAAE,GAC7B,GAAG,CAAC,CAAC;IACN,MAAM,UAAU,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,mDAAQ,eAAe,GAAC,CAAC,CAAC;IAEnE,OAAO,eAAe,CAA0E;QAC9F,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,4DAA4D;QACzE,YAAY,EAAE;YAMZ,OAAO,EAAE;gBACP,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,EAAE;aACV;SACF;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;QAClC,GAAG,EAAE,CAAC,YAAY,CAAC;QACnB,OAAO,EAAE;YACP,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;YACxB,WAAW,CAAC,EAAE,EAAE,KAAK;gBACnB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;gBACvB,QAAQ,MAAM,EAAE,CAAC;oBACf,KAAK,eAAe;wBAClB,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;wBACnB,MAAM;oBACR;wBACE,iBAAiB,CAAC,MAAM,CAAC,CAAA;gBAC7B,CAAC;gBACD,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;YACtB,CAAC;YACD,MAAM,EAAE,UAAU;SACnB;QACD,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,UAAU,EAAE,IAAA,yBAAgB,EAAC,CAAC,CAAC;aAChC;YACD,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;gBACrF,aAAa,EAAE,EAAE,IAAI,EAAE,4CAA4C,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE;gBAC/I,WAAW,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAC;aACzF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAQ;IACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/output.whep/info.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,4BA2DC;AAhED,uEAA6E;AAC7E,kDAA0B;AAC1B,MAAM,WAAW,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,mDAAQ,gBAAgB,GAAC,CAAC,CAAC;AAGrE,mBAAwB,CAAe;IACrC,MAAM,EACJ,eAAe,EACf,EAAE,EACF,UAAU,EAAE,EAAE,YAAY,EAAE,GAC7B,GAAG,CAAC,CAAC;IACN,MAAM,UAAU,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,mDAAQ,eAAe,GAAC,CAAC,CAAC;IAEnE,OAAO,eAAe,CAA0E;QAC9F,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,4DAA4D;QACzE,YAAY,EAAE;YAMZ,OAAO,EAAE;gBACP,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,EAAE;aACV;SACF;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;QAClC,GAAG,EAAE,CAAC,YAAY,CAAC;QACnB,OAAO,EAAE;YACP,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvC,WAAW,CAAC,EAAE,EAAE,KAAK;gBACnB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;gBACvB,QAAQ,MAAM,EAAE,CAAC;oBACf,KAAK,eAAe;wBAClB,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;wBACnB,MAAM;oBACR,KAAK,gBAAgB;wBACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;wBACrB,MAAM;oBACR,KAAK,iBAAiB;wBACpB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;wBACtB,MAAM;oBACR;wBACE,iBAAiB,CAAC,MAAM,CAAC,CAAA;gBAC7B,CAAC;gBACD,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;YACtB,CAAC;YACD,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,WAAW;SACrB;QACD,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,UAAU,EAAE,IAAA,yBAAgB,EAAC,CAAC,CAAC;aAChC;YACD,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;gBACrF,aAAa,EAAE,EAAE,IAAI,EAAE,4CAA4C,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE;gBAC/I,WAAW,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAC;aACzF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAQ;IACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC/C,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { WhepOutputState, WhepOutputSettings } from "./runtime";
1
+ import type { WhepOutputState, WhepOutputSettings, WhepOutputCommand } from "./runtime";
2
2
  import type { ViewProps } from "@norskvideo/norsk-studio/lib/extension/client-types";
3
- declare function InlineView({ state, config, raise }: ViewProps<WhepOutputSettings, WhepOutputState>): import("react/jsx-runtime").JSX.Element;
3
+ declare function InlineView({ state, config, raise }: ViewProps<WhepOutputSettings, WhepOutputState, WhepOutputCommand>): import("react/jsx-runtime").JSX.Element;
4
4
  export default InlineView;
@@ -1 +1 @@
1
- {"version":3,"file":"inline-view.js","sourceRoot":"","sources":["../../src/output.whep/inline-view.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-view.js","sourceRoot":"","sources":["../../src/output.whep/inline-view.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { Norsk, WhepOutputSettings as SdkSettings, 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 { AutoProcessorMediaNode, Norsk, WhepOutputSettings as SdkSettings, WhepOutputNode } from '@norskvideo/norsk-sdk';
2
+ import { CreatedMediaNode, InstanceRouteInfo, OnCreated, ServerComponentDefinition, StudioNodeSubscriptionSource, StudioRuntime } from '@norskvideo/norsk-studio/lib/extension/runtime-types';
3
+ import { CustomSinkNode, SubscriptionOpts } from '@norskvideo/norsk-studio/lib/extension/base-nodes';
4
4
  import { IceServer } from '@norskvideo/norsk-studio/lib/shared/config';
5
5
  import { ContextPromiseControl } from '@norskvideo/norsk-studio/lib/runtime/util';
6
6
  export type WhepOutputSettings = {
@@ -15,24 +15,38 @@ export type WhepOutputSettings = {
15
15
  };
16
16
  export type WhepOutputState = {
17
17
  url?: string;
18
+ enabled: boolean;
18
19
  };
19
20
  export type WhepOutputEvent = {
21
+ type: 'output-enabled' | 'output-disabled';
22
+ } | {
20
23
  type: 'url-published';
21
24
  url: string;
22
25
  };
23
- export type WhepOutputCommand = object;
26
+ export type WhepOutputCommand = {
27
+ type: "enable-output" | "disable-output";
28
+ };
24
29
  export declare class WhepOutput extends CustomSinkNode {
25
- initialised: Promise<void>;
26
30
  norsk: Norsk;
27
- updates: RuntimeUpdates<WhepOutputState, WhepOutputCommand, WhepOutputEvent>;
28
- shared: StudioShared;
31
+ runtime: StudioRuntime<WhepOutputState, WhepOutputCommand, WhepOutputEvent>;
29
32
  cfg: WhepOutputSettings;
30
33
  whep?: WhepOutputNode;
31
34
  context: ContextPromiseControl;
32
- constructor(norsk: Norsk, { updates, shared }: StudioRuntime<WhepOutputState, WhepOutputCommand, WhepOutputEvent>, cfg: WhepOutputSettings);
35
+ currentSources: Map<CreatedMediaNode, StudioNodeSubscriptionSource>;
36
+ currentMedia: {
37
+ node: AutoProcessorMediaNode<string>;
38
+ }[];
39
+ initialised: Promise<void>;
40
+ enabled: boolean;
41
+ static create(norsk: Norsk, cfg: WhepOutputSettings, runtime: StudioRuntime<WhepOutputState, WhepOutputCommand, WhepOutputEvent>): Promise<WhepOutput>;
42
+ constructor(cfg: WhepOutputSettings, norsk: Norsk, runtime: StudioRuntime<WhepOutputState, WhepOutputCommand, WhepOutputEvent>);
33
43
  subscribe(sources: StudioNodeSubscriptionSource[], _opts?: SubscriptionOpts): void;
34
44
  subscribeImpl(sources: StudioNodeSubscriptionSource[]): Promise<void>;
45
+ enableOutput(): Promise<void>;
46
+ disableOutput(): Promise<void>;
35
47
  }
36
- export default class WhepOutputDefinition implements ServerComponentDefinition<WhepOutputSettings, SimpleSinkWrapper, WhepOutputState, WhepOutputCommand, WhepOutputEvent> {
37
- create(norsk: Norsk, cfg: WhepOutputSettings, cb: OnCreated<SimpleSinkWrapper>, runtime: StudioRuntime<WhepOutputState, WhepOutputCommand, WhepOutputEvent>): Promise<void>;
48
+ export default class WhepOutputDefinition implements ServerComponentDefinition<WhepOutputSettings, WhepOutput, WhepOutputState, WhepOutputCommand, WhepOutputEvent> {
49
+ create(norsk: Norsk, cfg: WhepOutputSettings, cb: OnCreated<WhepOutput>, runtime: StudioRuntime<WhepOutputState, WhepOutputCommand, WhepOutputEvent>): Promise<void>;
50
+ handleCommand(node: WhepOutput, command: WhepOutputCommand): Promise<void>;
51
+ instanceRoutes(): Promise<InstanceRouteInfo<WhepOutputSettings, WhepOutput, WhepOutputState, WhepOutputCommand, WhepOutputEvent>[]>;
38
52
  }
@@ -1,29 +1,51 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.WhepOutput = void 0;
4
7
  const base_nodes_1 = require("@norskvideo/norsk-studio/lib/extension/base-nodes");
5
8
  const webrtcSettings_1 = require("../shared/webrtcSettings");
6
9
  const util_1 = require("@norskvideo/norsk-studio/lib/runtime/util");
10
+ const logging_1 = require("@norskvideo/norsk-studio/lib/server/logging");
11
+ const json_refs_1 = require("json-refs");
12
+ const promises_1 = __importDefault(require("fs/promises"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const yaml_1 = __importDefault(require("yaml"));
7
15
  class WhepOutput extends base_nodes_1.CustomSinkNode {
8
- initialised;
9
16
  norsk;
10
- updates;
11
- shared;
17
+ runtime;
12
18
  cfg;
13
19
  whep;
14
20
  context = new util_1.ContextPromiseControl(this.subscribeImpl.bind(this));
15
- constructor(norsk, { updates, shared }, cfg) {
21
+ currentSources = new Map();
22
+ currentMedia = [];
23
+ initialised;
24
+ enabled = true;
25
+ static async create(norsk, cfg, runtime) {
26
+ const node = new WhepOutput(cfg, norsk, runtime);
27
+ await node.initialised;
28
+ return node;
29
+ }
30
+ constructor(cfg, norsk, runtime) {
16
31
  super(cfg.id);
17
32
  this.cfg = cfg;
18
33
  this.norsk = norsk;
19
- this.updates = updates;
20
- this.shared = shared;
34
+ this.runtime = runtime;
21
35
  this.initialised = Promise.resolve();
22
36
  }
23
37
  subscribe(sources, _opts) {
38
+ this.currentSources = new Map();
39
+ sources.forEach((s) => {
40
+ this.currentSources.set(s.source, s);
41
+ });
24
42
  this.context.setSources(sources);
25
43
  }
26
44
  async subscribeImpl(sources) {
45
+ if (!this.enabled) {
46
+ (0, logging_1.debuglog)("Skipping subscription - output disabled", { id: this.id });
47
+ return;
48
+ }
27
49
  const videoSource = sources.filter((s) => s.streams.select.includes("video")).at(0)?.selectVideo();
28
50
  const audioSource = sources.filter((s) => s.streams.select.includes("audio")).at(0)?.selectAudio();
29
51
  const subscriptions = [];
@@ -41,8 +63,11 @@ class WhepOutput extends base_nodes_1.CustomSinkNode {
41
63
  onPublishStart: () => {
42
64
  const url = this.whep?.endpointUrl;
43
65
  if (url) {
44
- this.updates.raiseEvent({ type: 'url-published', url });
45
- this.updates.update({ url });
66
+ this.runtime.updates.raiseEvent({ type: 'url-published', url });
67
+ this.runtime.updates.update({
68
+ url,
69
+ enabled: true,
70
+ });
46
71
  }
47
72
  },
48
73
  ...(0, webrtcSettings_1.webRtcSettings)(this.cfg.__global.iceServers)
@@ -56,18 +81,126 @@ class WhepOutput extends base_nodes_1.CustomSinkNode {
56
81
  else {
57
82
  await this.whep?.close();
58
83
  this.whep = undefined;
59
- this.updates.update({});
84
+ this.runtime.updates.update({
85
+ enabled: false
86
+ });
87
+ }
88
+ }
89
+ async enableOutput() {
90
+ if (!this.enabled) {
91
+ this.enabled = true;
92
+ const sources = Array.from(this.currentSources.values());
93
+ (0, logging_1.debuglog)("Sources", sources);
94
+ await this.subscribeImpl(sources);
95
+ this.runtime.updates.raiseEvent({ type: 'output-enabled' });
96
+ this.runtime.updates.update({
97
+ enabled: true
98
+ });
99
+ (0, logging_1.debuglog)("Output enabled", { id: this.id });
100
+ }
101
+ }
102
+ async disableOutput() {
103
+ if (this.enabled) {
104
+ this.enabled = false;
105
+ if (this.whep) {
106
+ await this.whep.close();
107
+ this.whep = undefined;
108
+ }
109
+ this.runtime.updates.raiseEvent({ type: 'output-disabled' });
110
+ this.runtime.updates.update({
111
+ enabled: false
112
+ });
113
+ (0, logging_1.debuglog)("Output disabled", { id: this.id });
60
114
  }
61
115
  }
62
116
  }
63
117
  exports.WhepOutput = WhepOutput;
118
+ function coreInfo(path, op) {
119
+ return {
120
+ url: path,
121
+ summary: op.summary,
122
+ description: op.description,
123
+ requestBody: op.requestBody,
124
+ responses: op.responses,
125
+ };
126
+ }
127
+ function post(path, paths) {
128
+ return {
129
+ ...coreInfo(path, paths[path]['post']),
130
+ method: 'POST',
131
+ };
132
+ }
64
133
  class WhepOutputDefinition {
65
134
  async create(norsk, cfg, cb, runtime) {
66
- const node = new WhepOutput(norsk, runtime, cfg);
135
+ const node = new WhepOutput(cfg, norsk, runtime);
67
136
  runtime.report.registerOutput(cfg.id, node.whep?.endpointUrl);
68
137
  await node.initialised;
69
138
  cb(node);
70
139
  }
140
+ async handleCommand(node, command) {
141
+ switch (command.type) {
142
+ case 'enable-output':
143
+ await node.enableOutput();
144
+ break;
145
+ case 'disable-output':
146
+ await node.disableOutput();
147
+ break;
148
+ }
149
+ }
150
+ async instanceRoutes() {
151
+ const types = await promises_1.default.readFile(path_1.default.join(__dirname, 'types.yaml'));
152
+ const root = yaml_1.default.parse(types.toString());
153
+ const resolved = await (0, json_refs_1.resolveRefs)(root, {}).then((r) => r.resolved);
154
+ const paths = resolved.paths;
155
+ return [
156
+ {
157
+ ...post('/enable', paths),
158
+ handler: ({ runtime }) => async (_req, res) => {
159
+ try {
160
+ const state = runtime.updates.latest();
161
+ if (state.enabled) {
162
+ return res.status(400).json({ error: 'Output is already enabled' });
163
+ }
164
+ runtime.updates.update({ ...state, enabled: true });
165
+ runtime.updates.sendCommand({
166
+ type: 'enable-output'
167
+ });
168
+ runtime.updates.raiseEvent({
169
+ type: 'output-enabled'
170
+ });
171
+ res.sendStatus(204);
172
+ }
173
+ catch (error) {
174
+ console.error('Error in enable handler:', error);
175
+ res.status(500).json({ error: 'Failed to enable output' });
176
+ }
177
+ }
178
+ },
179
+ {
180
+ ...post('/disable', paths),
181
+ handler: ({ runtime }) => async (_req, res) => {
182
+ try {
183
+ const state = runtime.updates.latest();
184
+ if (!state.enabled) {
185
+ return res.status(400).json({ error: 'Output is already disabled' });
186
+ }
187
+ runtime.updates.update({ ...state, enabled: false });
188
+ runtime.updates.sendCommand({
189
+ type: 'disable-output'
190
+ });
191
+ runtime.updates.raiseEvent({
192
+ type: 'output-disabled'
193
+ });
194
+ res.sendStatus(204);
195
+ }
196
+ catch (error) {
197
+ console.error('Error in disable handler:', error);
198
+ res.status(500).json({ error: 'Failed to disable output' });
199
+ }
200
+ }
201
+ }
202
+ ];
203
+ }
71
204
  }
72
205
  exports.default = WhepOutputDefinition;
73
206
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/output.whep/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/output.whep/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WhepOutputSettings, WhepOutputCommand, WhepOutputState } from "./runtime";
2
+ import { ViewProps } from "@norskvideo/norsk-studio/lib/extension/client-types";
3
+ declare function SummaryView({ state, sendCommand, }: ViewProps<WhepOutputSettings, WhepOutputState, WhepOutputCommand>): import("react/jsx-runtime").JSX.Element;
4
+ export default SummaryView;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ function SummaryView({ state, sendCommand, }) {
5
+ const handleEnableOutput = () => {
6
+ void enableOutput();
7
+ };
8
+ const enableOutput = async () => {
9
+ sendCommand({
10
+ type: "enable-output",
11
+ });
12
+ };
13
+ const handleDisableOutput = () => {
14
+ void disableOutput();
15
+ };
16
+ const disableOutput = async () => {
17
+ sendCommand({
18
+ type: "disable-output",
19
+ });
20
+ };
21
+ return ((0, jsx_runtime_1.jsx)("div", { className: "mb-5", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center space-x-2", children: [(0, jsx_runtime_1.jsx)("span", { className: `inline-block w-2 h-2 rounded-full ${state.enabled ? "bg-blue-500" : "bg-red-500"}` }), (0, jsx_runtime_1.jsxs)("span", { className: "text-sm", children: ["Status: ", state.enabled ? "Enabled" : "Disabled"] })] }), (0, jsx_runtime_1.jsx)("div", { children: state.enabled ? ((0, jsx_runtime_1.jsx)("button", { onClick: handleDisableOutput, className: "px-3 py-1 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Disable Output" })) : ((0, jsx_runtime_1.jsx)("button", { onClick: handleEnableOutput, className: "px-3 py-1 text-sm bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Enable Output" })) })] }) }));
22
+ }
23
+ exports.default = SummaryView;
24
+ //# sourceMappingURL=summary-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-view.js","sourceRoot":"","sources":["../../src/output.whep/summary-view.tsx"],"names":[],"mappings":";;;AAOA,SAAS,WAAW,CAAC,EACnB,KAAK,EACL,WAAW,GACuD;IAElE,MAAM,kBAAkB,GAAG,GAAS,EAAE;QACpC,KAAK,YAAY,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,WAAW,CAAC;YACV,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,GAAS,EAAE;QACrC,KAAK,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,WAAW,CAAC;YACV,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,gCAAK,SAAS,EAAC,MAAM,YACnB,iCAAK,SAAS,EAAC,wCAAwC,aACrD,iCAAK,SAAS,EAAC,6BAA6B,aAC1C,iCACE,SAAS,EAAE,qCACT,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAClC,EAAE,GACI,EACR,kCAAM,SAAS,EAAC,SAAS,yBACd,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,IAC1C,IACH,EACN,0CACG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACf,mCACE,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAC,kEAAkE,+BAGrE,CACV,CAAC,CAAC,CAAC,CACF,mCACE,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAC,oEAAoE,8BAGvE,CACV,GACG,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,kBAAe,WAAW,CAAC"}
@@ -38,6 +38,8 @@ const puppeteer_1 = __importDefault(require("puppeteer"));
38
38
  const info_1 = __importDefault(require("../output.whep/info"));
39
39
  const client_types_1 = require("@norskvideo/norsk-studio/lib/extension/client-types");
40
40
  const runtime_types_1 = require("@norskvideo/norsk-studio/lib/extension/runtime-types");
41
+ const node_fetch_1 = __importDefault(require("node-fetch"));
42
+ const express_1 = __importDefault(require("express"));
41
43
  async function defaultRuntime() {
42
44
  const runtime = (0, builder_1.emptyRuntime)();
43
45
  await (0, __1.registerAll)(runtime);
@@ -58,9 +60,21 @@ describe("WHEP Output", () => {
58
60
  let whep = undefined;
59
61
  let source = undefined;
60
62
  afterEach(async () => {
61
- await norsk?.close();
62
- await page?.close();
63
- await browser?.close();
63
+ try {
64
+ if (page) {
65
+ await page.close().catch(() => { });
66
+ }
67
+ if (browser) {
68
+ await browser.close().catch(() => { });
69
+ }
70
+ if (norsk) {
71
+ await norsk.close().catch(() => { });
72
+ }
73
+ await new Promise(f => setTimeout(f, 1000));
74
+ }
75
+ catch (error) {
76
+ console.error('Error in afterEach cleanup:', error);
77
+ }
64
78
  });
65
79
  beforeEach(async () => {
66
80
  norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
@@ -141,5 +155,172 @@ describe("WHEP Output", () => {
141
155
  void doIt();
142
156
  });
143
157
  });
158
+ describe("WHEP Output API", () => {
159
+ let norsk = undefined;
160
+ let whep = undefined;
161
+ let source = undefined;
162
+ let browser = undefined;
163
+ let page = undefined;
164
+ let app;
165
+ let server;
166
+ let port;
167
+ let testCounter = 0;
168
+ beforeEach(async () => {
169
+ norsk = await norsk_sdk_1.Norsk.connect({ onShutdown: () => { } });
170
+ app = (0, express_1.default)();
171
+ app.use(express_1.default.json());
172
+ server = app.listen(0);
173
+ port = server.address().port;
174
+ testCounter++;
175
+ const compiled = await testDocument();
176
+ const result = await (0, execution_1.default)(norsk, compiled, app);
177
+ whep = result.components["whep"];
178
+ source = await (0, sources_1.videoAndAudio)(norsk, `source-${testCounter}`);
179
+ whep.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(source, (0, sources_1.testSourceDescription)(), { type: "take-all-streams", select: client_types_1.Av })]);
180
+ });
181
+ afterEach(async () => {
182
+ try {
183
+ if (page) {
184
+ await page.close().catch(() => { });
185
+ }
186
+ if (browser) {
187
+ await browser.close().catch(() => { });
188
+ }
189
+ if (server) {
190
+ await new Promise((resolve) => {
191
+ server?.close(() => resolve());
192
+ });
193
+ }
194
+ if (norsk) {
195
+ await norsk.close().catch(() => { });
196
+ }
197
+ await new Promise(f => setTimeout(f, 1000));
198
+ }
199
+ catch (error) {
200
+ console.error('Error in afterEach cleanup:', error);
201
+ }
202
+ });
203
+ it("should handle initial state correctly", async () => {
204
+ browser = await puppeteer_1.default.launch({
205
+ headless: 'new',
206
+ executablePath: process.env.BROWSER_FOR_TESTING ? process.env.BROWSER_FOR_TESTING : undefined,
207
+ args: ['--no-sandbox', '--disable-setuid-sandbox']
208
+ });
209
+ page = await browser.newPage();
210
+ await new Promise((r) => {
211
+ async function doIt() {
212
+ await page?.goto('http://127.0.0.1:8080/whep/whep/whep.html');
213
+ await page?.waitForSelector('video', { timeout: 100.0 })
214
+ .catch(() => {
215
+ setTimeout(() => void doIt(), 100.0);
216
+ }).then((v) => {
217
+ (0, chai_1.expect)(v).exist;
218
+ }).finally(() => {
219
+ r();
220
+ });
221
+ }
222
+ void doIt();
223
+ });
224
+ });
225
+ it("should handle disable and enable cycle", async () => {
226
+ browser = await puppeteer_1.default.launch({
227
+ headless: 'new',
228
+ executablePath: process.env.BROWSER_FOR_TESTING ? process.env.BROWSER_FOR_TESTING : undefined,
229
+ args: ['--no-sandbox', '--disable-setuid-sandbox']
230
+ });
231
+ page = await browser.newPage();
232
+ await new Promise((r) => {
233
+ async function doIt() {
234
+ await page?.goto('http://127.0.0.1:8080/whep/whep/whep.html');
235
+ await page?.waitForSelector('video', { timeout: 100.0 })
236
+ .catch(() => {
237
+ setTimeout(() => void doIt(), 100.0);
238
+ }).then((v) => {
239
+ (0, chai_1.expect)(v).exist;
240
+ }).finally(() => {
241
+ r();
242
+ });
243
+ }
244
+ void doIt();
245
+ });
246
+ const disableResponse = await (0, node_fetch_1.default)(`http://localhost:${port}/${whep.id}/disable`, {
247
+ method: 'POST'
248
+ });
249
+ (0, chai_1.expect)(disableResponse.status).to.equal(204);
250
+ await page.reload();
251
+ await new Promise((r) => {
252
+ async function doIt() {
253
+ await page?.waitForSelector('video', { timeout: 1000.0 })
254
+ .catch(() => {
255
+ }).then((v) => {
256
+ (0, chai_1.expect)(v).not.exist;
257
+ }).finally(() => {
258
+ r();
259
+ });
260
+ }
261
+ void doIt();
262
+ });
263
+ const enableResponse = await (0, node_fetch_1.default)(`http://localhost:${port}/${whep.id}/enable`, {
264
+ method: 'POST'
265
+ });
266
+ (0, chai_1.expect)(enableResponse.status).to.equal(204);
267
+ await page.reload();
268
+ await new Promise((r) => {
269
+ async function doIt() {
270
+ await page?.goto('http://127.0.0.1:8080/whep/whep/whep.html');
271
+ await page?.waitForSelector('video', { timeout: 100.0 })
272
+ .catch(() => {
273
+ setTimeout(() => void doIt(), 100.0);
274
+ }).then((v) => {
275
+ (0, chai_1.expect)(v).exist;
276
+ }).finally(() => {
277
+ r();
278
+ });
279
+ }
280
+ void doIt();
281
+ });
282
+ });
283
+ it("handles invalid API requests appropriately", async () => {
284
+ const alreadyEnabledResponse = await (0, node_fetch_1.default)(`http://localhost:${port}/${whep.id}/enable`, {
285
+ method: 'POST'
286
+ });
287
+ (0, chai_1.expect)(alreadyEnabledResponse.status).to.equal(400);
288
+ const disableResponse = await (0, node_fetch_1.default)(`http://localhost:${port}/${whep.id}/disable`, {
289
+ method: 'POST'
290
+ });
291
+ (0, chai_1.expect)(disableResponse.status).to.equal(204);
292
+ const alreadyDisabledResponse = await (0, node_fetch_1.default)(`http://localhost:${port}/${whep.id}/disable`, {
293
+ method: 'POST'
294
+ });
295
+ (0, chai_1.expect)(alreadyDisabledResponse.status).to.equal(400);
296
+ });
297
+ it("should maintain disabled state across source changes", async () => {
298
+ browser = await puppeteer_1.default.launch({
299
+ headless: 'new',
300
+ executablePath: process.env.BROWSER_FOR_TESTING ? process.env.BROWSER_FOR_TESTING : undefined,
301
+ args: ['--no-sandbox', '--disable-setuid-sandbox']
302
+ });
303
+ page = await browser.newPage();
304
+ const disableResponse = await (0, node_fetch_1.default)(`http://localhost:${port}/${whep.id}/disable`, {
305
+ method: 'POST'
306
+ });
307
+ (0, chai_1.expect)(disableResponse.status).to.equal(204);
308
+ const newSource = await (0, sources_1.videoAndAudio)(norsk, 'new-source');
309
+ whep.subscribe([new runtime_types_1.StudioNodeSubscriptionSource(newSource, (0, sources_1.testSourceDescription)(), { type: "take-all-streams", select: client_types_1.Av })]);
310
+ await page.goto('http://127.0.0.1:8080/whep/whep/whep.html');
311
+ await new Promise((r) => {
312
+ async function doIt() {
313
+ await page?.waitForSelector('video', { timeout: 1000.0 })
314
+ .catch(() => {
315
+ }).then((v) => {
316
+ (0, chai_1.expect)(v).not.exist;
317
+ }).finally(() => {
318
+ r();
319
+ });
320
+ }
321
+ void doIt();
322
+ });
323
+ });
324
+ });
144
325
  });
145
326
  //# sourceMappingURL=whep-output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whep-output.js","sourceRoot":"","sources":["../../src/test/whep-output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"whep-output.js","sourceRoot":"","sources":["../../src/test/whep-output.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@norskvideo/norsk-studio-built-ins",
3
- "version": "1.12.0-2025-02-03-6cdc30e8",
3
+ "version": "1.12.0-2025-02-04-9551fc82",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "clean": "rm -rf lib",
@@ -21,8 +21,8 @@
21
21
  ],
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "@norskvideo/norsk-sdk": "^1.0.400-2025-02-03-647e31f7",
25
- "@norskvideo/norsk-studio": "^1.20.1-2025-02-03-13810d33",
24
+ "@norskvideo/norsk-sdk": "^1.0.400-2025-02-04-effc9d4a",
25
+ "@norskvideo/norsk-studio": "^1.20.1-2025-02-04-5160b6de",
26
26
  "@norskvideo/webrtc-client": "^0.1.2",
27
27
  "body-parser": "^1.20.2",
28
28
  "cors": "^2.8.5",