@norskvideo/norsk-studio-built-ins 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +16 -0
  2. package/client/info.js +725 -456
  3. package/client/style.css +321 -112
  4. package/lib/info.js +2 -2
  5. package/lib/info.js.map +1 -1
  6. package/lib/input.rtmp/info.js +1 -1
  7. package/lib/input.rtmp/info.js.map +1 -1
  8. package/lib/input.silence/info.js +1 -0
  9. package/lib/input.silence/info.js.map +1 -1
  10. package/lib/input.srt-caller/info.js +6 -5
  11. package/lib/input.srt-caller/info.js.map +1 -1
  12. package/lib/input.srt-caller/runtime.d.ts +1 -1
  13. package/lib/input.srt-listener/info.js +7 -5
  14. package/lib/input.srt-listener/info.js.map +1 -1
  15. package/lib/input.srt-listener/runtime.d.ts +1 -1
  16. package/lib/input.udp-ts/info.d.ts +1 -1
  17. package/lib/input.udp-ts/info.js +5 -4
  18. package/lib/input.udp-ts/info.js.map +1 -1
  19. package/lib/input.udp-ts/runtime.d.ts +1 -1
  20. package/lib/input.videoTestCard/info.js +1 -0
  21. package/lib/input.videoTestCard/info.js.map +1 -1
  22. package/lib/output.autoCmaf/info.d.ts +1 -1
  23. package/lib/output.autoCmaf/info.js +54 -1
  24. package/lib/output.autoCmaf/info.js.map +1 -1
  25. package/lib/output.autoCmaf/runtime.d.ts +10 -0
  26. package/lib/output.autoCmaf/runtime.js +35 -4
  27. package/lib/output.autoCmaf/runtime.js.map +1 -1
  28. package/lib/output.autoCmaf/summary.js +23 -1
  29. package/lib/output.autoCmaf/summary.js.map +1 -1
  30. package/lib/output.preview/info.js +1 -0
  31. package/lib/output.preview/info.js.map +1 -1
  32. package/lib/output.preview/runtime.js +8 -4
  33. package/lib/output.preview/runtime.js.map +1 -1
  34. package/lib/output.rtmp/info.js +1 -0
  35. package/lib/output.rtmp/info.js.map +1 -1
  36. package/lib/output.srt/info.js +6 -5
  37. package/lib/output.srt/info.js.map +1 -1
  38. package/lib/output.srt/runtime.d.ts +1 -1
  39. package/lib/output.statistics/info.js +1 -0
  40. package/lib/output.statistics/info.js.map +1 -1
  41. package/lib/output.udpTs/info.d.ts +1 -1
  42. package/lib/output.udpTs/info.js +4 -3
  43. package/lib/output.udpTs/info.js.map +1 -1
  44. package/lib/output.udpTs/runtime.d.ts +1 -1
  45. package/lib/output.whep/info.js +1 -0
  46. package/lib/output.whep/info.js.map +1 -1
  47. package/lib/processor.browserOverlay/info.d.ts +2 -2
  48. package/lib/processor.browserOverlay/info.js +55 -1
  49. package/lib/processor.browserOverlay/info.js.map +1 -1
  50. package/lib/processor.browserOverlay/inline-view.d.ts +6 -0
  51. package/lib/processor.browserOverlay/inline-view.js +8 -0
  52. package/lib/processor.browserOverlay/inline-view.js.map +1 -0
  53. package/lib/processor.browserOverlay/openApi.d.ts +174 -0
  54. package/lib/processor.browserOverlay/openApi.js +3 -0
  55. package/lib/processor.browserOverlay/openApi.js.map +1 -0
  56. package/lib/processor.browserOverlay/runtime.d.ts +40 -6
  57. package/lib/processor.browserOverlay/runtime.js +147 -18
  58. package/lib/processor.browserOverlay/runtime.js.map +1 -1
  59. package/lib/processor.browserOverlay/summary-view.d.ts +4 -0
  60. package/lib/processor.browserOverlay/summary-view.js +27 -0
  61. package/lib/processor.browserOverlay/summary-view.js.map +1 -0
  62. package/lib/processor.browserOverlay/types.yaml +65 -0
  63. package/lib/processor.cascadingSwitch/info.js +1 -0
  64. package/lib/processor.cascadingSwitch/info.js.map +1 -1
  65. package/lib/processor.fixedLadder/codec-editor.js +1 -1
  66. package/lib/processor.fixedLadder/codec-editor.js.map +1 -1
  67. package/lib/processor.fixedLadder/codec-view.js +1 -1
  68. package/lib/processor.fixedLadder/codec-view.js.map +1 -1
  69. package/lib/processor.fixedLadder/info.js +1 -0
  70. package/lib/processor.fixedLadder/info.js.map +1 -1
  71. package/lib/processor.fixedLadder/rung-view.js +1 -1
  72. package/lib/processor.fixedLadder/rung-view.js.map +1 -1
  73. package/lib/processor.onscreenGraphic/image-selection.d.ts +9 -0
  74. package/lib/{processor.dynamicBug/bug-selection.js → processor.onscreenGraphic/image-selection.js} +10 -10
  75. package/lib/processor.onscreenGraphic/image-selection.js.map +1 -0
  76. package/lib/processor.onscreenGraphic/info.d.ts +3 -0
  77. package/lib/{processor.dynamicBug → processor.onscreenGraphic}/info.js +12 -12
  78. package/lib/processor.onscreenGraphic/info.js.map +1 -0
  79. package/lib/processor.onscreenGraphic/runtime.d.ts +67 -0
  80. package/lib/{processor.dynamicBug → processor.onscreenGraphic}/runtime.js +109 -161
  81. package/lib/processor.onscreenGraphic/runtime.js.map +1 -0
  82. package/lib/processor.onscreenGraphic/summary-view.d.ts +4 -0
  83. package/lib/processor.onscreenGraphic/summary-view.js +128 -0
  84. package/lib/processor.onscreenGraphic/summary-view.js.map +1 -0
  85. package/lib/processor.onscreenGraphic/types.d.ts +257 -0
  86. package/lib/processor.onscreenGraphic/types.js.map +1 -0
  87. package/lib/processor.onscreenGraphic/types.yaml +162 -0
  88. package/lib/processor.whisper-transcribe/info.js +3 -2
  89. package/lib/processor.whisper-transcribe/info.js.map +1 -1
  90. package/lib/shared/drm/axinom.d.ts +2 -0
  91. package/lib/shared/drm/axinom.js +120 -0
  92. package/lib/shared/drm/axinom.js.map +1 -0
  93. package/lib/shared/drm/cpix.d.ts +24 -0
  94. package/lib/shared/drm/cpix.js +97 -0
  95. package/lib/shared/drm/cpix.js.map +1 -0
  96. package/lib/shared/drm/ezdrm.d.ts +2 -0
  97. package/lib/shared/drm/ezdrm.js +26 -0
  98. package/lib/shared/drm/ezdrm.js.map +1 -0
  99. package/lib/shared/srt-socket-options.js +6 -6
  100. package/lib/shared/srt-socket-options.js.map +1 -1
  101. package/lib/test/{dynamic-bug.js → onscreen-graphic.js} +79 -79
  102. package/lib/test/onscreen-graphic.js.map +1 -0
  103. package/lib/test/srt-input-caller.js +5 -5
  104. package/lib/test/srt-input-caller.js.map +1 -1
  105. package/lib/test/srt-input-listener.js +18 -18
  106. package/lib/test/srt-input-listener.js.map +1 -1
  107. package/lib/test/srt-output.js +2 -2
  108. package/lib/test/srt-output.js.map +1 -1
  109. package/lib/test/udp-output.js +2 -2
  110. package/lib/test/udp-output.js.map +1 -1
  111. package/lib/test/udp-ts-input.js +2 -2
  112. package/lib/test/udp-ts-input.js.map +1 -1
  113. package/lib/util.stats.latency/info.js +1 -0
  114. package/lib/util.stats.latency/info.js.map +1 -1
  115. package/lib/util.stats.ma35d/info.js +1 -0
  116. package/lib/util.stats.ma35d/info.js.map +1 -1
  117. package/lib/util.timestamps/info.js +1 -0
  118. package/lib/util.timestamps/info.js.map +1 -1
  119. package/package.json +10 -6
  120. package/Readme.adoc +0 -16
  121. package/lib/processor.dynamicBug/bug-selection.d.ts +0 -9
  122. package/lib/processor.dynamicBug/bug-selection.js.map +0 -1
  123. package/lib/processor.dynamicBug/info.d.ts +0 -3
  124. package/lib/processor.dynamicBug/info.js.map +0 -1
  125. package/lib/processor.dynamicBug/runtime.d.ts +0 -67
  126. package/lib/processor.dynamicBug/runtime.js.map +0 -1
  127. package/lib/processor.dynamicBug/summary-view.d.ts +0 -4
  128. package/lib/processor.dynamicBug/summary-view.js +0 -128
  129. package/lib/processor.dynamicBug/summary-view.js.map +0 -1
  130. package/lib/processor.dynamicBug/types.d.ts +0 -19
  131. package/lib/processor.dynamicBug/types.js.map +0 -1
  132. package/lib/processor.dynamicBug/types.yaml +0 -25
  133. package/lib/test/dynamic-bug.js.map +0 -1
  134. /package/lib/{processor.dynamicBug → processor.onscreenGraphic}/types.js +0 -0
  135. /package/lib/test/{dynamic-bug.d.ts → onscreen-graphic.d.ts} +0 -0
package/client/info.js CHANGED
@@ -172,117 +172,24 @@ var init_summary_view2 = __esm({
172
172
  }
173
173
  });
174
174
 
175
- // external-global-plugin:hls.js
176
- var require_hls = __commonJS({
177
- "external-global-plugin:hls.js"(exports, module) {
178
- module.exports = window.HlsJs;
179
- }
180
- });
181
-
182
- // build/output.autoCmaf/summary.js
183
- var summary_exports = {};
184
- __export(summary_exports, {
185
- default: () => summary_default
186
- });
187
- function InlineView5({ state, config }) {
188
- const url = state.url;
189
- const id = config.id;
190
- const previewVideo = (0, import_react4.useRef)(null);
191
- (0, import_react4.useEffect)(() => {
192
- if (!url)
193
- return;
194
- if (!previewVideo.current)
195
- return;
196
- if (import_hls.default.isSupported()) {
197
- const hls = new import_hls.default();
198
- hls.loadSource(url);
199
- hls.attachMedia(previewVideo.current);
200
- } else if (previewVideo.current.canPlayType("application/vnd.apple.mpegurl")) {
201
- previewVideo.current.src = url;
202
- }
203
- }, [state.url]);
204
- if (!url)
205
- return (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children: "..." });
206
- return (0, import_jsx_runtime6.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime6.jsx)("video", { ref: previewVideo, autoPlay: true, muted: true, id: `${id}-video` }) });
207
- }
208
- var import_jsx_runtime6, import_react4, import_hls, summary_default;
209
- var init_summary = __esm({
210
- "build/output.autoCmaf/summary.js"() {
211
- "use strict";
212
- import_jsx_runtime6 = __toESM(require_jsx_runtime());
213
- import_react4 = __toESM(require_react());
214
- import_hls = __toESM(require_hls());
215
- summary_default = InlineView5;
216
- }
217
- });
218
-
219
- // build/output.autoCmaf/fullscreen.js
220
- var fullscreen_exports = {};
221
- __export(fullscreen_exports, {
222
- default: () => fullscreen_default
223
- });
224
- function FullscreenView({ state, config }) {
225
- const url = state.url;
226
- const id = config.id;
227
- (0, import_react5.useEffect)(() => {
228
- if (!url)
229
- return;
230
- const element = document.getElementById(`${id}-video`);
231
- if (import_hls2.default.isSupported()) {
232
- const hls = new import_hls2.default();
233
- hls.loadSource(url);
234
- hls.attachMedia(element);
235
- } else if (element.canPlayType("application/vnd.apple.mpegurl")) {
236
- element.src = url;
237
- }
238
- }, [state.url]);
239
- if (!url)
240
- return (0, import_jsx_runtime7.jsx)(import_jsx_runtime7.Fragment, { children: "..." });
241
- {
242
- }
243
- return (0, import_jsx_runtime7.jsx)("div", { children: (0, import_jsx_runtime7.jsx)("video", { controls: true, autoPlay: true, muted: true, id: `${id}-video` }) });
244
- }
245
- var import_jsx_runtime7, import_react5, import_hls2, fullscreen_default;
246
- var init_fullscreen = __esm({
247
- "build/output.autoCmaf/fullscreen.js"() {
248
- "use strict";
249
- import_jsx_runtime7 = __toESM(require_jsx_runtime());
250
- import_react5 = __toESM(require_react());
251
- import_hls2 = __toESM(require_hls());
252
- fullscreen_default = FullscreenView;
253
- }
254
- });
255
-
256
- // build/output.autoCmaf/form-views.js
257
- var form_views_exports = {};
258
- __export(form_views_exports, {
259
- S3Destination: () => S3Destination,
260
- SegmentConfiguration: () => SegmentConfiguration
261
- });
262
- function S3Destination(destination) {
263
- return (0, import_jsx_runtime8.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Host" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.host }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Path" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.prefix }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Include Ads" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.includeAdInsertions ? "yes" : "no" })] });
264
- }
265
- function SegmentConfiguration(cfg) {
266
- return (0, import_jsx_runtime8.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Segments" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: cfg.defaultSegmentCount == 0 ? "all" : cfg.defaultSegmentCount }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Segment Target" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.targetSegmentDuration, "s"] }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Part Target" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.targetPartDuration, "s"] }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Retention" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.retentionPeriod, "s"] })] });
267
- }
268
- var import_jsx_runtime8;
269
- var init_form_views = __esm({
270
- "build/output.autoCmaf/form-views.js"() {
271
- "use strict";
272
- import_jsx_runtime8 = __toESM(require_jsx_runtime());
273
- }
274
- });
275
-
276
175
  // ../../node_modules/@norskvideo/norsk-studio/lib/shared/shared-views.js
277
176
  var require_shared_views = __commonJS({
278
177
  "../../node_modules/@norskvideo/norsk-studio/lib/shared/shared-views.js"(exports) {
279
178
  "use strict";
280
179
  Object.defineProperty(exports, "__esModule", { value: true });
281
180
  exports.GlobalIceServerView = GlobalIceServerView;
181
+ exports.EzDrmConfigView = EzDrmConfigView;
182
+ exports.AxinomConfigView = AxinomConfigView;
282
183
  var jsx_runtime_1 = require_jsx_runtime();
283
184
  function GlobalIceServerView(i) {
284
185
  return (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "URL" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-2", children: i.url }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Reported URL" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-2", children: i.reportedUrl ?? "" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Username" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-2", children: i.username ?? "" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Password" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-2", children: i.credential ?? "" })] });
285
186
  }
187
+ function EzDrmConfigView(i) {
188
+ return (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-2 text-sm", children: [(0, jsx_runtime_1.jsx)("div", { className: "col-span-2 node-editor-helper-text", children: "For Encryption (required)" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Token" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: i.token?.trim() ? "Yes" : "No" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-2 node-editor-helper-text", children: "For Local Preview (optional)" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "pX" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: i.pX?.trim() ? "Yes" : "No" })] });
189
+ }
190
+ function AxinomConfigView(i) {
191
+ return (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-2 text-sm", children: [(0, jsx_runtime_1.jsx)("div", { className: "col-span-2 node-editor-helper-text", children: "For Encryption (required)" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Tenant ID" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: i.tenantId?.trim() ? "Yes" : "No" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Management Key" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: i.managementKey?.trim() ? "Yes" : "No" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-2 node-editor-helper-text", children: "For Local Preview (optional)" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Communication ID" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: i.comKeyId?.trim() ? "Yes" : "No" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: "Communication Key" }), (0, jsx_runtime_1.jsx)("div", { className: "col-span-1", children: i.comKey?.trim() ? "Yes" : "No" })] });
192
+ }
286
193
  }
287
194
  });
288
195
 
@@ -327,6 +234,8 @@ var require_config = __commonJS({
327
234
  };
328
235
  Object.defineProperty(exports, "__esModule", { value: true });
329
236
  exports.GlobalIceServers = GlobalIceServers3;
237
+ exports.GlobalEzDrmConfig = GlobalEzDrmConfig2;
238
+ exports.GlobalAxinomConfig = GlobalAxinomConfig2;
330
239
  exports.contractHardwareAcceleration = contractHardwareAcceleration;
331
240
  exports.HardwareSelection = HardwareSelection5;
332
241
  exports.RootDataDir = RootDataDir;
@@ -382,6 +291,87 @@ var require_config = __commonJS({
382
291
  }
383
292
  };
384
293
  }
294
+ function GlobalEzDrmConfig2(_f) {
295
+ const EzDrmConfigView = react_1.default.lazy(async () => {
296
+ const views = await Promise.resolve().then(() => __importStar(require_shared_views()));
297
+ return { default: views.EzDrmConfigView };
298
+ });
299
+ return {
300
+ id: "ezdrm-config",
301
+ form: {
302
+ help: "Configuration for EZDRM",
303
+ hint: {
304
+ envOverride: true,
305
+ type: "form-item",
306
+ optional: true,
307
+ form: {
308
+ token: {
309
+ help: "Token for EZDRM",
310
+ hint: {
311
+ envOverride: true,
312
+ type: "text"
313
+ }
314
+ },
315
+ pX: {
316
+ help: "The last six digits of your Widevine Profile ID",
317
+ hint: {
318
+ envOverride: true,
319
+ type: "text"
320
+ }
321
+ }
322
+ },
323
+ view: EzDrmConfigView
324
+ }
325
+ }
326
+ };
327
+ }
328
+ function GlobalAxinomConfig2(_f) {
329
+ const AxinomConfigView = react_1.default.lazy(async () => {
330
+ const views = await Promise.resolve().then(() => __importStar(require_shared_views()));
331
+ return { default: views.AxinomConfigView };
332
+ });
333
+ return {
334
+ id: "axinom-config",
335
+ form: {
336
+ help: "Configuration for Axinom DRM",
337
+ hint: {
338
+ envOverride: true,
339
+ type: "form-item",
340
+ form: {
341
+ tenantId: {
342
+ help: "Tenant ID from your Axinom DRM account",
343
+ hint: {
344
+ envOverride: true,
345
+ type: "text"
346
+ }
347
+ },
348
+ managementKey: {
349
+ help: "Management Key from your Axinom DRM account",
350
+ hint: {
351
+ envOverride: true,
352
+ type: "text"
353
+ }
354
+ },
355
+ comKeyId: {
356
+ help: "Communication Key ID from your Axinom DRM account",
357
+ hint: {
358
+ envOverride: true,
359
+ type: "text"
360
+ }
361
+ },
362
+ comKey: {
363
+ help: "Communication Key from your Axinom DRM account",
364
+ hint: {
365
+ envOverride: true,
366
+ type: "text"
367
+ }
368
+ }
369
+ },
370
+ view: AxinomConfigView
371
+ }
372
+ }
373
+ };
374
+ }
385
375
  function contractHardwareAcceleration(value, accepted) {
386
376
  if (!value)
387
377
  return void 0;
@@ -424,6 +414,129 @@ var require_config = __commonJS({
424
414
  }
425
415
  });
426
416
 
417
+ // external-global-plugin:hls.js
418
+ var require_hls = __commonJS({
419
+ "external-global-plugin:hls.js"(exports, module) {
420
+ module.exports = window.HlsJs;
421
+ }
422
+ });
423
+
424
+ // build/output.autoCmaf/summary.js
425
+ var summary_exports = {};
426
+ __export(summary_exports, {
427
+ default: () => summary_default
428
+ });
429
+ function InlineView5({ state, config }) {
430
+ const url = state.url;
431
+ const id = config.id;
432
+ const previewVideo = (0, import_react4.useRef)(null);
433
+ (0, import_react4.useEffect)(() => {
434
+ if (!url)
435
+ return;
436
+ if (!previewVideo.current)
437
+ return;
438
+ if (import_hls.default.isSupported()) {
439
+ let widevineLicenseUrl;
440
+ const headers = {};
441
+ if (config.drmProvider === "ezdrm") {
442
+ if (config.__global?.ezdrmConfig?.pX || state.drmToken) {
443
+ widevineLicenseUrl = `https://widevine-dash.ezdrm.com/widevine-php/widevine-foreignkey.php?pX=${config.__global?.ezdrmConfig?.pX || state.drmToken}`;
444
+ }
445
+ }
446
+ if (config.drmProvider === "axinom") {
447
+ widevineLicenseUrl = `https://drm-widevine-licensing.axprod.net/AcquireLicense`;
448
+ headers["X-AxDrm-Message"] = state.drmToken;
449
+ }
450
+ const hls = new import_hls.default({
451
+ widevineLicenseUrl,
452
+ emeEnabled: !!widevineLicenseUrl,
453
+ licenseXhrSetup: (xhr) => {
454
+ for (const k in headers) {
455
+ const v = headers[k];
456
+ if (v !== void 0) {
457
+ xhr.setRequestHeader(k, v);
458
+ }
459
+ }
460
+ }
461
+ });
462
+ hls.loadSource(url);
463
+ hls.attachMedia(previewVideo.current);
464
+ } else if (previewVideo.current.canPlayType("application/vnd.apple.mpegurl")) {
465
+ previewVideo.current.src = url;
466
+ }
467
+ }, [state.url]);
468
+ if (!url)
469
+ return (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children: "..." });
470
+ return (0, import_jsx_runtime6.jsx)("div", { className: "mb-5", children: (0, import_jsx_runtime6.jsx)("video", { ref: previewVideo, autoPlay: true, muted: true, id: `${id}-video` }) });
471
+ }
472
+ var import_jsx_runtime6, import_react4, import_hls, summary_default;
473
+ var init_summary = __esm({
474
+ "build/output.autoCmaf/summary.js"() {
475
+ "use strict";
476
+ import_jsx_runtime6 = __toESM(require_jsx_runtime());
477
+ import_react4 = __toESM(require_react());
478
+ import_hls = __toESM(require_hls());
479
+ summary_default = InlineView5;
480
+ }
481
+ });
482
+
483
+ // build/output.autoCmaf/fullscreen.js
484
+ var fullscreen_exports = {};
485
+ __export(fullscreen_exports, {
486
+ default: () => fullscreen_default
487
+ });
488
+ function FullscreenView({ state, config }) {
489
+ const url = state.url;
490
+ const id = config.id;
491
+ (0, import_react5.useEffect)(() => {
492
+ if (!url)
493
+ return;
494
+ const element = document.getElementById(`${id}-video`);
495
+ if (import_hls2.default.isSupported()) {
496
+ const hls = new import_hls2.default();
497
+ hls.loadSource(url);
498
+ hls.attachMedia(element);
499
+ } else if (element.canPlayType("application/vnd.apple.mpegurl")) {
500
+ element.src = url;
501
+ }
502
+ }, [state.url]);
503
+ if (!url)
504
+ return (0, import_jsx_runtime7.jsx)(import_jsx_runtime7.Fragment, { children: "..." });
505
+ {
506
+ }
507
+ return (0, import_jsx_runtime7.jsx)("div", { children: (0, import_jsx_runtime7.jsx)("video", { controls: true, autoPlay: true, muted: true, id: `${id}-video` }) });
508
+ }
509
+ var import_jsx_runtime7, import_react5, import_hls2, fullscreen_default;
510
+ var init_fullscreen = __esm({
511
+ "build/output.autoCmaf/fullscreen.js"() {
512
+ "use strict";
513
+ import_jsx_runtime7 = __toESM(require_jsx_runtime());
514
+ import_react5 = __toESM(require_react());
515
+ import_hls2 = __toESM(require_hls());
516
+ fullscreen_default = FullscreenView;
517
+ }
518
+ });
519
+
520
+ // build/output.autoCmaf/form-views.js
521
+ var form_views_exports = {};
522
+ __export(form_views_exports, {
523
+ S3Destination: () => S3Destination,
524
+ SegmentConfiguration: () => SegmentConfiguration
525
+ });
526
+ function S3Destination(destination) {
527
+ return (0, import_jsx_runtime8.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Host" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.host }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Path" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.prefix }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Include Ads" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: destination.includeAdInsertions ? "yes" : "no" })] });
528
+ }
529
+ function SegmentConfiguration(cfg) {
530
+ return (0, import_jsx_runtime8.jsxs)("div", { className: "grid grid-flow-row-dense grid-cols-3 text-sm", children: [(0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Segments" }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-2", children: cfg.defaultSegmentCount == 0 ? "all" : cfg.defaultSegmentCount }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Segment Target" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.targetSegmentDuration, "s"] }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Part Target" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.targetPartDuration, "s"] }), (0, import_jsx_runtime8.jsx)("div", { className: "col-span-1", children: "Retention" }), (0, import_jsx_runtime8.jsxs)("div", { className: "col-span-2", children: [cfg.retentionPeriod, "s"] })] });
531
+ }
532
+ var import_jsx_runtime8;
533
+ var init_form_views = __esm({
534
+ "build/output.autoCmaf/form-views.js"() {
535
+ "use strict";
536
+ import_jsx_runtime8 = __toESM(require_jsx_runtime());
537
+ }
538
+ });
539
+
427
540
  // external-global-plugin:@norskvideo/webrtc-client
428
541
  var require_webrtc_client = __commonJS({
429
542
  "external-global-plugin:@norskvideo/webrtc-client"(exports, module) {
@@ -531,11 +644,12 @@ var init_inline_view5 = __esm({
531
644
 
532
645
  // build/output.statistics/info.js
533
646
  function info_default11({ defineComponent, All }) {
534
- const InlineView13 = import_react11.default.lazy(async () => Promise.resolve().then(() => (init_inline_view5(), inline_view_exports5)));
647
+ const InlineView15 = import_react11.default.lazy(async () => Promise.resolve().then(() => (init_inline_view5(), inline_view_exports5)));
535
648
  return defineComponent({
536
649
  identifier: "output.statistics",
537
650
  category: "output",
538
651
  name: "Statistics",
652
+ description: "This component accepts multiple media streams, captures and reports metrics or statistical data related to the media streams.",
539
653
  subscription: {
540
654
  // No validation required
541
655
  accepts: {
@@ -559,7 +673,7 @@ function info_default11({ defineComponent, All }) {
559
673
  }
560
674
  return { ...state };
561
675
  },
562
- inline: InlineView13
676
+ inline: InlineView15
563
677
  },
564
678
  configForm: {
565
679
  form: {}
@@ -577,21 +691,73 @@ var init_info = __esm({
577
691
  }
578
692
  });
579
693
 
694
+ // build/processor.browserOverlay/summary-view.js
695
+ var summary_view_exports3 = {};
696
+ __export(summary_view_exports3, {
697
+ default: () => summary_view_default3
698
+ });
699
+ function SummaryView5({ state, sendCommand }) {
700
+ const [url, setUrl] = (0, import_react12.useState)(state.currentUrl);
701
+ const [enabled, setEnabled] = (0, import_react12.useState)(state.enabled);
702
+ const stateChanged = (0, import_react12.useMemo)(() => {
703
+ return url !== state.currentUrl || enabled !== state.enabled;
704
+ }, [url, enabled]);
705
+ 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";
706
+ 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: () => {
707
+ if (url !== state.currentUrl) {
708
+ sendCommand({ type: "change-url", url });
709
+ }
710
+ if (enabled !== state.enabled) {
711
+ if (enabled) {
712
+ sendCommand({ type: "enable" });
713
+ } else {
714
+ sendCommand({ type: "disable" });
715
+ }
716
+ }
717
+ }, children: "Commit" })] });
718
+ }
719
+ var import_jsx_runtime12, import_react12, summary_view_default3;
720
+ var init_summary_view3 = __esm({
721
+ "build/processor.browserOverlay/summary-view.js"() {
722
+ "use strict";
723
+ import_jsx_runtime12 = __toESM(require_jsx_runtime());
724
+ import_react12 = __toESM(require_react());
725
+ summary_view_default3 = SummaryView5;
726
+ }
727
+ });
728
+
729
+ // build/processor.browserOverlay/inline-view.js
730
+ var inline_view_exports6 = {};
731
+ __export(inline_view_exports6, {
732
+ default: () => inline_view_default6
733
+ });
734
+ function InlineView9({ state, config }) {
735
+ 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" })] }) })] }) });
736
+ }
737
+ var import_jsx_runtime13, inline_view_default6;
738
+ var init_inline_view6 = __esm({
739
+ "build/processor.browserOverlay/inline-view.js"() {
740
+ "use strict";
741
+ import_jsx_runtime13 = __toESM(require_jsx_runtime());
742
+ inline_view_default6 = InlineView9;
743
+ }
744
+ });
745
+
580
746
  // build/processor.cascadingSwitch/source-selection.js
581
747
  var source_selection_exports = {};
582
748
  __export(source_selection_exports, {
583
749
  default: () => source_selection_default
584
750
  });
585
751
  function OrderInput(props) {
586
- (0, import_react12.useEffect)(() => {
752
+ (0, import_react14.useEffect)(() => {
587
753
  props.onChanged(props.defaultValue ?? []);
588
754
  }, [props.defaultValue]);
589
- const [value, setValue] = (0, import_react12.useState)(props.defaultValue ?? []);
755
+ const [value, setValue] = (0, import_react14.useState)(props.defaultValue ?? []);
590
756
  if (value.length == 0) {
591
- return (0, import_jsx_runtime12.jsx)("p", { className: "node-editor-helper-text", children: "Sources will appear here when subscriptions have been added to this node" });
757
+ 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" });
592
758
  } else {
593
- return (0, import_jsx_runtime12.jsx)("div", { id: props.id, children: (0, import_jsx_runtime12.jsx)("ul", { children: value.map((v, ix) => {
594
- return (0, import_jsx_runtime12.jsxs)("li", { className: "flex", children: [(0, import_jsx_runtime12.jsx)("span", { className: "node-editor-label flex-grow", children: v }), ix == 0 ? (0, import_jsx_runtime12.jsx)(import_jsx_runtime12.Fragment, {}) : (0, import_jsx_runtime12.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_runtime12.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18" }) }), ix == value.length - 1 ? (0, import_jsx_runtime12.jsx)(import_jsx_runtime12.Fragment, {}) : (0, import_jsx_runtime12.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_runtime12.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3" }) })] }, v);
759
+ return (0, import_jsx_runtime14.jsx)("div", { id: props.id, children: (0, import_jsx_runtime14.jsx)("ul", { children: value.map((v, ix) => {
760
+ 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);
595
761
  }) }) });
596
762
  }
597
763
  function moveUp(ix) {
@@ -613,49 +779,119 @@ function OrderInput(props) {
613
779
  };
614
780
  }
615
781
  }
616
- var import_jsx_runtime12, import_react12, source_selection_default;
782
+ var import_jsx_runtime14, import_react14, source_selection_default;
617
783
  var init_source_selection = __esm({
618
784
  "build/processor.cascadingSwitch/source-selection.js"() {
619
785
  "use strict";
620
- import_jsx_runtime12 = __toESM(require_jsx_runtime());
621
- import_react12 = __toESM(require_react());
786
+ import_jsx_runtime14 = __toESM(require_jsx_runtime());
787
+ import_react14 = __toESM(require_react());
622
788
  source_selection_default = OrderInput;
623
789
  }
624
790
  });
625
791
 
626
792
  // build/processor.cascadingSwitch/inline-view.js
627
- var inline_view_exports6 = {};
628
- __export(inline_view_exports6, {
629
- default: () => inline_view_default6
793
+ var inline_view_exports7 = {};
794
+ __export(inline_view_exports7, {
795
+ default: () => inline_view_default7
630
796
  });
631
- function InlineView9({ state, config }) {
632
- return (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [(0, import_jsx_runtime13.jsx)("h5", { children: "Sources" }), (0, import_jsx_runtime13.jsxs)("ul", { children: [config.sources.map((s, i) => state.activeSource == s ? (0, import_jsx_runtime13.jsxs)("li", { className: activeClasses, children: [s, " <--"] }, i) : state.availableSources.includes(s) ? (0, import_jsx_runtime13.jsxs)("li", { className: availableClasses, children: [s, " (available)"] }, i) : (0, import_jsx_runtime13.jsxs)("li", { className: inactiveClasses, children: [s, " (inactive)"] }, i)), (0, import_jsx_runtime13.jsx)("li", { className: state.activeSource == "fallback" ? activeClasses : availableClasses, children: "fallback" }, "fallback")] })] });
797
+ function InlineView11({ state, config }) {
798
+ 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")] })] });
633
799
  }
634
- var import_jsx_runtime13, activeClasses, availableClasses, inactiveClasses, inline_view_default6;
635
- var init_inline_view6 = __esm({
800
+ var import_jsx_runtime15, activeClasses, availableClasses, inactiveClasses, inline_view_default7;
801
+ var init_inline_view7 = __esm({
636
802
  "build/processor.cascadingSwitch/inline-view.js"() {
637
803
  "use strict";
638
- import_jsx_runtime13 = __toESM(require_jsx_runtime());
804
+ import_jsx_runtime15 = __toESM(require_jsx_runtime());
639
805
  activeClasses = "active text-green-300 dark:text-green-300";
640
806
  availableClasses = "available text-green-300 dark:text-green-300";
641
807
  inactiveClasses = "inactive text-orange-300 dark:text-orange-300";
642
- inline_view_default6 = InlineView9;
808
+ inline_view_default7 = InlineView11;
809
+ }
810
+ });
811
+
812
+ // build/processor.fixedLadder/rung-view.js
813
+ var rung_view_exports = {};
814
+ __export(rung_view_exports, {
815
+ default: () => rung_view_default
816
+ });
817
+ function rung_view_default(rung) {
818
+ return (0, import_jsx_runtime16.jsx)("div", { className: "text-gray-900 dark:text-white", children: rung.name });
819
+ }
820
+ var import_jsx_runtime16;
821
+ var init_rung_view = __esm({
822
+ "build/processor.fixedLadder/rung-view.js"() {
823
+ "use strict";
824
+ import_jsx_runtime16 = __toESM(require_jsx_runtime());
825
+ }
826
+ });
827
+
828
+ // build/processor.fixedLadder/codec-editor.js
829
+ var codec_editor_exports = {};
830
+ __export(codec_editor_exports, {
831
+ default: () => CodecEditor
832
+ });
833
+ function CodecEditor(props) {
834
+ (0, import_react15.useEffect)(() => {
835
+ if (props.defaultValue)
836
+ props.onChanged(props.defaultValue);
837
+ }, [props.defaultValue]);
838
+ const textAreaRef = (0, import_react15.useRef)(null);
839
+ const [value, setValue] = (0, import_react15.useState)(props.defaultValue);
840
+ (0, import_react15.useEffect)(() => {
841
+ if (textAreaRef.current) {
842
+ const target = textAreaRef.current;
843
+ target.style.height = "";
844
+ target.style.height = target.scrollHeight + "px";
845
+ }
846
+ }, []);
847
+ 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) => {
848
+ const target = e.currentTarget;
849
+ try {
850
+ const codec = JSON.parse(target.value);
851
+ setValue(codec);
852
+ props.onChanged(codec);
853
+ } catch (e2) {
854
+ }
855
+ }, defaultValue: JSON.stringify(value, void 0, 2) });
856
+ }
857
+ var import_jsx_runtime17, import_react15;
858
+ var init_codec_editor = __esm({
859
+ "build/processor.fixedLadder/codec-editor.js"() {
860
+ "use strict";
861
+ import_jsx_runtime17 = __toESM(require_jsx_runtime());
862
+ import_react15 = __toESM(require_react());
863
+ }
864
+ });
865
+
866
+ // build/processor.fixedLadder/codec-view.js
867
+ var codec_view_exports = {};
868
+ __export(codec_view_exports, {
869
+ default: () => CodecEditor2
870
+ });
871
+ function CodecEditor2(props) {
872
+ return (0, import_jsx_runtime18.jsxs)("div", { className: "text-gray-900 dark:text-white", children: [props.width, "x", props.height] });
873
+ }
874
+ var import_jsx_runtime18;
875
+ var init_codec_view = __esm({
876
+ "build/processor.fixedLadder/codec-view.js"() {
877
+ "use strict";
878
+ import_jsx_runtime18 = __toESM(require_jsx_runtime());
643
879
  }
644
880
  });
645
881
 
646
- // build/processor.dynamicBug/bug-selection.js
647
- var bug_selection_exports = {};
648
- __export(bug_selection_exports, {
649
- default: () => bug_selection_default
882
+ // build/processor.onscreenGraphic/image-selection.js
883
+ var image_selection_exports = {};
884
+ __export(image_selection_exports, {
885
+ default: () => image_selection_default
650
886
  });
651
- function BugSelection(props) {
652
- const [loading, setLoading] = (0, import_react13.useState)(true);
653
- (0, import_react13.useEffect)(() => {
887
+ function GraphicSelection(props) {
888
+ const [loading, setLoading] = (0, import_react17.useState)(true);
889
+ (0, import_react17.useEffect)(() => {
654
890
  const fn = async () => {
655
- const result2 = await fetch("components/processor.dynamicBug/bugs");
891
+ const result2 = await fetch("components/processor.onscreenGraphic/graphics");
656
892
  if (result2.ok && result2.body) {
657
- const bugs2 = await result2.json();
658
- setBugs(bugs2);
893
+ const graphics = await result2.json();
894
+ setGraphics(graphics);
659
895
  setLoading(false);
660
896
  if (props.defaultValue)
661
897
  props.onChanged(props.defaultValue);
@@ -666,65 +902,65 @@ function BugSelection(props) {
666
902
  };
667
903
  fn().catch(console.error);
668
904
  }, []);
669
- const [bugs, setBugs] = (0, import_react13.useState)([]);
905
+ const [graphcs, setGraphics] = (0, import_react17.useState)([]);
670
906
  if (loading) {
671
- return (0, import_jsx_runtime14.jsx)("div", { children: "Loading.." });
907
+ return (0, import_jsx_runtime19.jsx)("div", { children: "Loading.." });
672
908
  }
673
- if (bugs.length == 0) {
674
- return (0, import_jsx_runtime14.jsx)("div", { children: "No bugs loaded" });
909
+ if (graphcs.length == 0) {
910
+ return (0, import_jsx_runtime19.jsx)("div", { children: "No graphics loaded" });
675
911
  }
676
- return (0, import_jsx_runtime14.jsx)("div", { children: (0, import_jsx_runtime14.jsxs)("select", { defaultValue: props.defaultValue, className: `node-editor-select-input`, id: props.id, onChange: myOnChange, onBlur: myOnChange, children: [(0, import_jsx_runtime14.jsx)("option", { value: "", children: "---" }, "empty"), bugs.map((o, i) => {
677
- return (0, import_jsx_runtime14.jsx)("option", { value: o, children: o }, i);
912
+ 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) => {
913
+ return (0, import_jsx_runtime19.jsx)("option", { value: o, children: o }, i);
678
914
  })] }) });
679
915
  function myOnChange(e) {
680
916
  props.onChanged(e.target.value);
681
917
  }
682
918
  }
683
- var import_jsx_runtime14, import_react13, bug_selection_default;
684
- var init_bug_selection = __esm({
685
- "build/processor.dynamicBug/bug-selection.js"() {
919
+ var import_jsx_runtime19, import_react17, image_selection_default;
920
+ var init_image_selection = __esm({
921
+ "build/processor.onscreenGraphic/image-selection.js"() {
686
922
  "use strict";
687
- import_jsx_runtime14 = __toESM(require_jsx_runtime());
688
- import_react13 = __toESM(require_react());
689
- bug_selection_default = BugSelection;
923
+ import_jsx_runtime19 = __toESM(require_jsx_runtime());
924
+ import_react17 = __toESM(require_react());
925
+ image_selection_default = GraphicSelection;
690
926
  }
691
927
  });
692
928
 
693
- // build/processor.dynamicBug/summary-view.js
694
- var summary_view_exports3 = {};
695
- __export(summary_view_exports3, {
696
- default: () => summary_view_default3
929
+ // build/processor.onscreenGraphic/summary-view.js
930
+ var summary_view_exports4 = {};
931
+ __export(summary_view_exports4, {
932
+ default: () => summary_view_default4
697
933
  });
698
- function SummaryView5({ state, sendCommand, urls }) {
699
- const [bug, setBug] = (0, import_react14.useState)(state.activeBug?.file);
700
- const [position, setPosition] = (0, import_react14.useState)(state.activeBug?.position);
701
- const [bugs, setBugs] = (0, import_react14.useState)([]);
702
- const [fileToUpload, setFileToUpload] = (0, import_react14.useState)(void 0);
703
- const [showFileInput, setShowFileInput] = (0, import_react14.useState)(false);
704
- const [showUploadButton, setShowUploadButton] = (0, import_react14.useState)(false);
705
- const [uploadStatus, setUploadStatus] = (0, import_react14.useState)({ success: false, message: null });
706
- const [showDeleteDropdown, setShowDeleteDropdown] = (0, import_react14.useState)(false);
707
- const [bugToDelete, setBugToDelete] = (0, import_react14.useState)("");
708
- const updateBugs = (0, import_react14.useCallback)(async () => {
934
+ function SummaryView7({ state, sendCommand, urls }) {
935
+ const [graphic, setGraphic] = (0, import_react18.useState)(state.activeGraphic?.file);
936
+ const [position, setPosition] = (0, import_react18.useState)(state.activeGraphic?.position);
937
+ const [graphics, setGraphics] = (0, import_react18.useState)([]);
938
+ const [fileToUpload, setFileToUpload] = (0, import_react18.useState)(void 0);
939
+ const [showFileInput, setShowFileInput] = (0, import_react18.useState)(false);
940
+ const [showUploadButton, setShowUploadButton] = (0, import_react18.useState)(false);
941
+ const [uploadStatus, setUploadStatus] = (0, import_react18.useState)({ success: false, message: null });
942
+ const [showDeleteDropdown, setShowDeleteDropdown] = (0, import_react18.useState)(false);
943
+ const [graphicToDelete, setGraphicToDelete] = (0, import_react18.useState)("");
944
+ const updateGraphics = (0, import_react18.useCallback)(async () => {
709
945
  try {
710
- const result2 = await fetch(`${urls.componentUrl}/bugs`);
946
+ const result2 = await fetch(`${urls.componentUrl}/graphics`);
711
947
  if (result2.ok) {
712
- const newBugs = await result2.json();
713
- setBugs(newBugs);
948
+ const newGraphics = await result2.json();
949
+ setGraphics(newGraphics);
714
950
  } else {
715
951
  throw new Error(await result2.text());
716
952
  }
717
953
  } catch (error) {
718
- console.error("Failed to update bugs:", error);
954
+ console.error("Failed to update graphics:", error);
719
955
  setUploadStatus({
720
956
  success: false,
721
- message: "Failed to update bug list."
957
+ message: "Failed to update graphic list."
722
958
  });
723
959
  }
724
960
  }, [urls.componentUrl]);
725
- (0, import_react14.useEffect)(() => {
726
- updateBugs().catch(console.error);
727
- }, [updateBugs]);
961
+ (0, import_react18.useEffect)(() => {
962
+ updateGraphics().catch(console.error);
963
+ }, [updateGraphics]);
728
964
  const onFileChange = (e) => {
729
965
  const file = e.target.files?.[0];
730
966
  setFileToUpload(file);
@@ -737,7 +973,7 @@ function SummaryView5({ state, sendCommand, urls }) {
737
973
  try {
738
974
  const form = new FormData();
739
975
  form.append("file", fileToUpload);
740
- const response = await fetch(`${urls.componentUrl}/bugs`, {
976
+ const response = await fetch(`${urls.componentUrl}/graphics`, {
741
977
  method: "POST",
742
978
  body: form
743
979
  });
@@ -745,7 +981,7 @@ function SummaryView5({ state, sendCommand, urls }) {
745
981
  const errorData = await response.json();
746
982
  setUploadStatus({
747
983
  success: false,
748
- message: `${errorData.error}. Delete the existing bug first if you want to replace it.`
984
+ message: `${errorData.error}. Delete the existing graphic first if you want to replace it.`
749
985
  });
750
986
  } else if (!response.ok) {
751
987
  throw new Error("Upload failed");
@@ -754,138 +990,68 @@ function SummaryView5({ state, sendCommand, urls }) {
754
990
  setShowFileInput(false);
755
991
  setUploadStatus({
756
992
  success: true,
757
- message: "Bug uploaded successfully!"
993
+ message: "Graphic uploaded successfully!"
758
994
  });
759
- await updateBugs();
995
+ await updateGraphics();
760
996
  }
761
997
  } catch (error) {
762
998
  console.error("Failed to upload file:", error);
763
- setUploadStatus({ success: false, message: "Failed to upload bug." });
999
+ setUploadStatus({ success: false, message: "Failed to upload graphic." });
764
1000
  }
765
1001
  setTimeout(() => setUploadStatus({ success: false, message: null }), 5e3);
766
1002
  };
767
1003
  const deleteBug = async () => {
768
- if (!bugToDelete)
1004
+ if (!graphicToDelete)
769
1005
  return;
770
1006
  try {
771
- const response = await fetch(`${urls.componentUrl}/bug`, {
1007
+ const response = await fetch(`${urls.componentUrl}/graphic`, {
772
1008
  method: "DELETE",
773
1009
  headers: {
774
1010
  "Content-Type": "application/json"
775
1011
  },
776
- body: JSON.stringify({ filename: bugToDelete })
1012
+ body: JSON.stringify({ filename: graphicToDelete })
777
1013
  });
778
1014
  if (response.ok) {
779
1015
  setUploadStatus({
780
1016
  success: true,
781
- message: "Bug deleted successfully!"
1017
+ message: "Graphic deleted successfully!"
782
1018
  });
783
- await updateBugs();
784
- if (bug === bugToDelete) {
785
- setBug(void 0);
1019
+ await updateGraphics();
1020
+ if (graphic === graphicToDelete) {
1021
+ setGraphic(void 0);
786
1022
  sendCommand({
787
- type: "change-bug",
1023
+ type: "change-graphic",
788
1024
  file: void 0,
789
1025
  position: void 0
790
1026
  });
791
1027
  }
792
- setBugToDelete("");
1028
+ setGraphicToDelete("");
793
1029
  setShowDeleteDropdown(false);
794
1030
  } else {
795
1031
  const errorData = await response.json();
796
1032
  setUploadStatus({
797
1033
  success: false,
798
- message: errorData.error || "Failed to delete bug"
1034
+ message: errorData.error || "Failed to delete graphic"
799
1035
  });
800
1036
  }
801
1037
  } catch (error) {
802
- console.error("Failed to delete bug:", error);
803
- setUploadStatus({ success: false, message: "Failed to delete bug" });
1038
+ console.error("Failed to delete graphic:", error);
1039
+ setUploadStatus({ success: false, message: "Failed to delete graphic" });
804
1040
  }
805
1041
  setTimeout(() => setUploadStatus({ success: false, message: null }), 3e3);
806
- };
807
- 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";
808
- 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";
809
- 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";
810
- return (0, import_jsx_runtime15.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime15.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime15.jsxs)("div", { children: [(0, import_jsx_runtime15.jsx)("label", { htmlFor: "select-bug", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime15.jsxs)("select", { id: "select-bug", className: "w-full node-editor-select-input", value: bug || "", onChange: (e) => setBug(e.target.value || void 0), children: [(0, import_jsx_runtime15.jsx)("option", { value: "", children: "---" }), bugs.map((s) => (0, import_jsx_runtime15.jsx)("option", { value: s, children: s }, s))] })] }), bug && (0, import_jsx_runtime15.jsxs)("div", { children: [(0, import_jsx_runtime15.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Position" }), (0, import_jsx_runtime15.jsxs)("select", { id: "select-position", className: "w-full node-editor-select-input", value: position, onChange: (e) => setPosition(e.target.value), children: [(0, import_jsx_runtime15.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime15.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime15.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime15.jsx)("option", { value: "bottomright", children: "Bottom Right" })] })] }), (bug !== state.activeBug?.file || position !== state.activeBug?.position) && (0, import_jsx_runtime15.jsx)("button", { type: "button", className: buttonClass, onClick: () => sendCommand({ type: "change-bug", file: bug, position }), children: "Commit" }), !showFileInput && !uploadStatus.success && (0, import_jsx_runtime15.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Bug" }), showFileInput && (0, import_jsx_runtime15.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime15.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime15.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime15.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Bugs" }), showDeleteDropdown && (0, import_jsx_runtime15.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime15.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Bug to Delete" }), (0, import_jsx_runtime15.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: bugToDelete, onChange: (e) => setBugToDelete(e.target.value), children: [(0, import_jsx_runtime15.jsx)("option", { value: "", children: " Select a bug" }), bugs.map((bugName) => (0, import_jsx_runtime15.jsx)("option", { value: bugName, children: bugName }, bugName))] }), (0, import_jsx_runtime15.jsx)("button", { onClick: deleteBug, disabled: !bugToDelete, className: `${deleteButtonClass} ${!bugToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Bug" })] }), uploadStatus.message && (0, import_jsx_runtime15.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
811
- }
812
- var import_jsx_runtime15, import_react14, summary_view_default3;
813
- var init_summary_view3 = __esm({
814
- "build/processor.dynamicBug/summary-view.js"() {
815
- "use strict";
816
- import_jsx_runtime15 = __toESM(require_jsx_runtime());
817
- import_react14 = __toESM(require_react());
818
- summary_view_default3 = SummaryView5;
819
- }
820
- });
821
-
822
- // build/processor.fixedLadder/rung-view.js
823
- var rung_view_exports = {};
824
- __export(rung_view_exports, {
825
- default: () => rung_view_default
826
- });
827
- function rung_view_default(rung) {
828
- return (0, import_jsx_runtime16.jsx)("div", { className: "", children: rung.name });
829
- }
830
- var import_jsx_runtime16;
831
- var init_rung_view = __esm({
832
- "build/processor.fixedLadder/rung-view.js"() {
833
- "use strict";
834
- import_jsx_runtime16 = __toESM(require_jsx_runtime());
835
- }
836
- });
837
-
838
- // build/processor.fixedLadder/codec-editor.js
839
- var codec_editor_exports = {};
840
- __export(codec_editor_exports, {
841
- default: () => CodecEditor
842
- });
843
- function CodecEditor(props) {
844
- (0, import_react16.useEffect)(() => {
845
- if (props.defaultValue)
846
- props.onChanged(props.defaultValue);
847
- }, [props.defaultValue]);
848
- const textAreaRef = (0, import_react16.useRef)(null);
849
- const [value, setValue] = (0, import_react16.useState)(props.defaultValue);
850
- (0, import_react16.useEffect)(() => {
851
- if (textAreaRef.current) {
852
- const target = textAreaRef.current;
853
- target.style.height = "";
854
- target.style.height = target.scrollHeight + "px";
855
- }
856
- }, []);
857
- return (0, import_jsx_runtime17.jsx)("textarea", { ref: textAreaRef, className: "w-full min-h-fit dark:text-white dark:bg-black", onChange: (e) => {
858
- const target = e.currentTarget;
859
- try {
860
- const codec = JSON.parse(target.value);
861
- setValue(codec);
862
- props.onChanged(codec);
863
- } catch (e2) {
864
- }
865
- }, defaultValue: JSON.stringify(value, void 0, 2) });
866
- }
867
- var import_jsx_runtime17, import_react16;
868
- var init_codec_editor = __esm({
869
- "build/processor.fixedLadder/codec-editor.js"() {
870
- "use strict";
871
- import_jsx_runtime17 = __toESM(require_jsx_runtime());
872
- import_react16 = __toESM(require_react());
873
- }
874
- });
875
-
876
- // build/processor.fixedLadder/codec-view.js
877
- var codec_view_exports = {};
878
- __export(codec_view_exports, {
879
- default: () => CodecEditor2
880
- });
881
- function CodecEditor2(props) {
882
- return (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [props.width, "x", props.height] });
1042
+ };
1043
+ 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";
1044
+ 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";
1045
+ 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";
1046
+ 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: "Position" }), (0, import_jsx_runtime20.jsxs)("select", { id: "select-position", className: "w-full node-editor-select-input", value: position, onChange: (e) => setPosition(e.target.value), 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" })] })] }), (graphic !== state.activeGraphic?.file || position !== state.activeGraphic?.position) && (0, import_jsx_runtime20.jsx)("button", { type: "button", className: buttonClass, onClick: () => sendCommand({ type: "change-graphic", file: graphic, position }), 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 })] });
883
1047
  }
884
- var import_jsx_runtime18;
885
- var init_codec_view = __esm({
886
- "build/processor.fixedLadder/codec-view.js"() {
1048
+ var import_jsx_runtime20, import_react18, summary_view_default4;
1049
+ var init_summary_view4 = __esm({
1050
+ "build/processor.onscreenGraphic/summary-view.js"() {
887
1051
  "use strict";
888
- import_jsx_runtime18 = __toESM(require_jsx_runtime());
1052
+ import_jsx_runtime20 = __toESM(require_jsx_runtime());
1053
+ import_react18 = __toESM(require_react());
1054
+ summary_view_default4 = SummaryView7;
889
1055
  }
890
1056
  });
891
1057
 
@@ -15214,13 +15380,13 @@ var init_auto = __esm({
15214
15380
  });
15215
15381
 
15216
15382
  // build/util.stats.latency/inline-view.js
15217
- var inline_view_exports7 = {};
15218
- __export(inline_view_exports7, {
15219
- default: () => inline_view_default7
15383
+ var inline_view_exports8 = {};
15384
+ __export(inline_view_exports8, {
15385
+ default: () => inline_view_default8
15220
15386
  });
15221
- function InlineView10({ state, config: _2 }) {
15222
- const chartContainer = (0, import_react18.useRef)(null);
15223
- const [chartControl, setChartControl] = (0, import_react18.useState)(void 0);
15387
+ function InlineView12({ state, config: _2 }) {
15388
+ const chartContainer = (0, import_react20.useRef)(null);
15389
+ const [chartControl, setChartControl] = (0, import_react20.useState)(void 0);
15224
15390
  function makeDataSet(key, color2, values) {
15225
15391
  return {
15226
15392
  label: key,
@@ -15237,7 +15403,7 @@ function InlineView10({ state, config: _2 }) {
15237
15403
  datasets: [makeDataSet("latency", "rgba(255, 0, 0, 255)", state2.values)]
15238
15404
  };
15239
15405
  }
15240
- (0, import_react18.useEffect)(() => {
15406
+ (0, import_react20.useEffect)(() => {
15241
15407
  if (!chartContainer.current)
15242
15408
  return;
15243
15409
  auto_default.defaults.color = "#FFF";
@@ -15275,21 +15441,21 @@ function InlineView10({ state, config: _2 }) {
15275
15441
  chart.update();
15276
15442
  }, 100);
15277
15443
  }, [chartContainer]);
15278
- (0, import_react18.useEffect)(() => {
15444
+ (0, import_react20.useEffect)(() => {
15279
15445
  if (!chartControl)
15280
15446
  return;
15281
15447
  chartControl.data = makeData(state);
15282
15448
  }, [state]);
15283
- return (0, import_jsx_runtime19.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime19.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15449
+ 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 }) });
15284
15450
  }
15285
- var import_jsx_runtime19, import_react18, inline_view_default7;
15286
- var init_inline_view7 = __esm({
15451
+ var import_jsx_runtime21, import_react20, inline_view_default8;
15452
+ var init_inline_view8 = __esm({
15287
15453
  "build/util.stats.latency/inline-view.js"() {
15288
15454
  "use strict";
15289
- import_jsx_runtime19 = __toESM(require_jsx_runtime());
15290
- import_react18 = __toESM(require_react());
15455
+ import_jsx_runtime21 = __toESM(require_jsx_runtime());
15456
+ import_react20 = __toESM(require_react());
15291
15457
  init_auto();
15292
- inline_view_default7 = InlineView10;
15458
+ inline_view_default8 = InlineView12;
15293
15459
  }
15294
15460
  });
15295
15461
 
@@ -15299,34 +15465,34 @@ __export(source_node_selection_exports, {
15299
15465
  default: () => source_node_selection_default
15300
15466
  });
15301
15467
  function SourceNodeSelection(props) {
15302
- 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"), Object.values(props.latestDocument.components).map((o, i) => {
15468
+ 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) => {
15303
15469
  if (o.id == props.id)
15304
- return (0, import_jsx_runtime20.jsx)(import_jsx_runtime20.Fragment, {});
15470
+ return (0, import_jsx_runtime22.jsx)(import_jsx_runtime22.Fragment, {});
15305
15471
  if (o.info.category === "output")
15306
15472
  return;
15307
- return (0, import_jsx_runtime20.jsx)("option", { value: o.id, children: o.config.displayName }, i);
15473
+ return (0, import_jsx_runtime22.jsx)("option", { value: o.id, children: o.config.displayName }, i);
15308
15474
  })] }) });
15309
15475
  function myOnChange(e) {
15310
15476
  props.onChanged(e.target.value);
15311
15477
  }
15312
15478
  }
15313
- var import_jsx_runtime20, source_node_selection_default;
15479
+ var import_jsx_runtime22, source_node_selection_default;
15314
15480
  var init_source_node_selection = __esm({
15315
15481
  "build/util.stats.latency/source-node-selection.js"() {
15316
15482
  "use strict";
15317
- import_jsx_runtime20 = __toESM(require_jsx_runtime());
15483
+ import_jsx_runtime22 = __toESM(require_jsx_runtime());
15318
15484
  source_node_selection_default = SourceNodeSelection;
15319
15485
  }
15320
15486
  });
15321
15487
 
15322
15488
  // build/util.stats.ma35d/inline-view.js
15323
- var inline_view_exports8 = {};
15324
- __export(inline_view_exports8, {
15325
- default: () => inline_view_default8
15489
+ var inline_view_exports9 = {};
15490
+ __export(inline_view_exports9, {
15491
+ default: () => inline_view_default9
15326
15492
  });
15327
- function InlineView11({ state, config: _2 }) {
15328
- const chartContainer = (0, import_react20.useRef)(null);
15329
- const [chartControl, setChartControl] = (0, import_react20.useState)(void 0);
15493
+ function InlineView13({ state, config: _2 }) {
15494
+ const chartContainer = (0, import_react22.useRef)(null);
15495
+ const [chartControl, setChartControl] = (0, import_react22.useState)(void 0);
15330
15496
  function makeDataSet(key, color2, values) {
15331
15497
  return {
15332
15498
  label: key,
@@ -15347,7 +15513,7 @@ function InlineView11({ state, config: _2 }) {
15347
15513
  ]
15348
15514
  };
15349
15515
  }
15350
- (0, import_react20.useEffect)(() => {
15516
+ (0, import_react22.useEffect)(() => {
15351
15517
  if (!chartContainer.current)
15352
15518
  return;
15353
15519
  auto_default.defaults.color = "#FFF";
@@ -15385,33 +15551,33 @@ function InlineView11({ state, config: _2 }) {
15385
15551
  chart.update();
15386
15552
  }, 100);
15387
15553
  }, [chartContainer]);
15388
- (0, import_react20.useEffect)(() => {
15554
+ (0, import_react22.useEffect)(() => {
15389
15555
  if (!chartControl)
15390
15556
  return;
15391
15557
  chartControl.data = makeData(state);
15392
15558
  }, [state]);
15393
- 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 }) });
15559
+ return (0, import_jsx_runtime23.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime23.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15394
15560
  }
15395
- var import_jsx_runtime21, import_react20, inline_view_default8;
15396
- var init_inline_view8 = __esm({
15561
+ var import_jsx_runtime23, import_react22, inline_view_default9;
15562
+ var init_inline_view9 = __esm({
15397
15563
  "build/util.stats.ma35d/inline-view.js"() {
15398
15564
  "use strict";
15399
- import_jsx_runtime21 = __toESM(require_jsx_runtime());
15400
- import_react20 = __toESM(require_react());
15565
+ import_jsx_runtime23 = __toESM(require_jsx_runtime());
15566
+ import_react22 = __toESM(require_react());
15401
15567
  init_auto();
15402
- inline_view_default8 = InlineView11;
15568
+ inline_view_default9 = InlineView13;
15403
15569
  }
15404
15570
  });
15405
15571
 
15406
15572
  // build/util.timestamps/inline-view.js
15407
- var inline_view_exports9 = {};
15408
- __export(inline_view_exports9, {
15409
- default: () => inline_view_default9
15573
+ var inline_view_exports10 = {};
15574
+ __export(inline_view_exports10, {
15575
+ default: () => inline_view_default10
15410
15576
  });
15411
- function InlineView12({ state, config: _2 }) {
15412
- const chartContainer = (0, import_react22.useRef)(null);
15413
- const [chartControl, setChartControl] = (0, import_react22.useState)(void 0);
15414
- (0, import_react22.useEffect)(() => {
15577
+ function InlineView14({ state, config: _2 }) {
15578
+ const chartContainer = (0, import_react24.useRef)(null);
15579
+ const [chartControl, setChartControl] = (0, import_react24.useState)(void 0);
15580
+ (0, import_react24.useEffect)(() => {
15415
15581
  if (!chartContainer.current)
15416
15582
  return;
15417
15583
  if (state.timestamps.length < 2)
@@ -15473,7 +15639,7 @@ function InlineView12({ state, config: _2 }) {
15473
15639
  chart.update();
15474
15640
  }, 100);
15475
15641
  }, [chartContainer]);
15476
- (0, import_react22.useEffect)(() => {
15642
+ (0, import_react24.useEffect)(() => {
15477
15643
  if (!chartControl)
15478
15644
  return;
15479
15645
  chartControl.data = {
@@ -15496,16 +15662,16 @@ function InlineView12({ state, config: _2 }) {
15496
15662
  })
15497
15663
  };
15498
15664
  }, [state]);
15499
- 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 }) });
15665
+ return (0, import_jsx_runtime24.jsx)("div", { className: "bg-gray-50 dark:bg-gray-700 rounded", style: { width: "360px", height: "200px", padding: "10px" }, children: (0, import_jsx_runtime24.jsx)("canvas", { className: "bg-gray-50 dark:bg-gray-700 rounded", ref: chartContainer }) });
15500
15666
  }
15501
- var import_jsx_runtime22, import_react22, inline_view_default9;
15502
- var init_inline_view9 = __esm({
15667
+ var import_jsx_runtime24, import_react24, inline_view_default10;
15668
+ var init_inline_view10 = __esm({
15503
15669
  "build/util.timestamps/inline-view.js"() {
15504
15670
  "use strict";
15505
- import_jsx_runtime22 = __toESM(require_jsx_runtime());
15506
- import_react22 = __toESM(require_react());
15671
+ import_jsx_runtime24 = __toESM(require_jsx_runtime());
15672
+ import_react24 = __toESM(require_react());
15507
15673
  init_auto();
15508
- inline_view_default9 = InlineView12;
15674
+ inline_view_default10 = InlineView14;
15509
15675
  }
15510
15676
  });
15511
15677
 
@@ -15564,7 +15730,7 @@ function info_default({ defineComponent, Av, validation: { Z, Port, SourceName,
15564
15730
  configForm: {
15565
15731
  form: {
15566
15732
  port: { help: "The port this RTMP input will listen on", hint: { type: "numeric", validation: Port, defaultValue: defaultPort, global: unique("port") } },
15567
- ssl: { help: "Optional: SSL", hint: { type: "boolean" } },
15733
+ ssl: { help: "Optional: SSL", hint: { type: "boolean", optional: true } },
15568
15734
  appName: { help: "Name of the app", hint: { type: "text", validation: Z.string().min(1), defaultValue: "norsk" } },
15569
15735
  streamNames: {
15570
15736
  help: "List of stream names to assign to the accepted streams",
@@ -15589,6 +15755,7 @@ function info_default2({ defineComponent, Audio }) {
15589
15755
  identifier: "input.silence",
15590
15756
  category: "input",
15591
15757
  name: "Silence Generator",
15758
+ description: "A component that produces silent audio streams with configurable sample rate and channel layout.",
15592
15759
  subscription: {
15593
15760
  produces: {
15594
15761
  type: "single-stream",
@@ -15636,6 +15803,7 @@ var result = ({ Z }) => ({
15636
15803
  help: "The latency value in the receiving direction of the socket (SRTO_RCVLATENCY)",
15637
15804
  hint: {
15638
15805
  type: "numeric",
15806
+ optional: true,
15639
15807
  validation: Z.optional(Z.number())
15640
15808
  }
15641
15809
  },
@@ -15643,13 +15811,15 @@ var result = ({ Z }) => ({
15643
15811
  help: "The latency value provided by the sender side as a minimum value for the receiver (SRTO_PEERLATENCY)",
15644
15812
  hint: {
15645
15813
  type: "numeric",
15814
+ optional: true,
15646
15815
  validation: Z.optional(Z.number())
15647
15816
  }
15648
15817
  },
15649
15818
  inputBandwidth: {
15650
- help: "Input bandwidth (SRTO_INPUTBW xxx",
15819
+ help: "Input bandwidth (SRTO_INPUTBW)",
15651
15820
  hint: {
15652
15821
  type: "numeric",
15822
+ optional: true,
15653
15823
  validation: Z.optional(Z.number())
15654
15824
  }
15655
15825
  },
@@ -15657,6 +15827,7 @@ var result = ({ Z }) => ({
15657
15827
  help: "Overhead bandwidth (SRTO_OHEADBW)",
15658
15828
  hint: {
15659
15829
  type: "numeric",
15830
+ optional: true,
15660
15831
  validation: Z.optional(Z.number())
15661
15832
  }
15662
15833
  },
@@ -15664,6 +15835,7 @@ var result = ({ Z }) => ({
15664
15835
  help: "Max bandwidth (SRTO_MAXBW)",
15665
15836
  hint: {
15666
15837
  type: "numeric",
15838
+ optional: true,
15667
15839
  validation: Z.optional(Z.number())
15668
15840
  }
15669
15841
  }
@@ -15673,7 +15845,7 @@ var srt_socket_options_default = result;
15673
15845
  // build/input.srt-caller/info.js
15674
15846
  var import_react2 = __toESM(require_react());
15675
15847
  function info_default3({ defineComponent, Av, validation }) {
15676
- const { Port, IpAddress, SourceName, SrtPassphrase, SrtStreamId } = validation;
15848
+ const { Port, Hostname, SourceName, SrtPassphrase, SrtStreamId } = validation;
15677
15849
  const SocketConfiguration2 = import_react2.default.lazy(async () => {
15678
15850
  const views = await Promise.resolve().then(() => (init_srt_form_views(), srt_form_views_exports));
15679
15851
  return { default: views.SocketConfiguration };
@@ -15682,6 +15854,7 @@ function info_default3({ defineComponent, Av, validation }) {
15682
15854
  identifier: "input.srt-caller",
15683
15855
  category: "input",
15684
15856
  name: "SRT Ingest (Caller)",
15857
+ description: "This component allows you to receive Secure Reliable Transport (SRT) streams by calling a remote SRT listener.",
15685
15858
  subscription: {
15686
15859
  accepts: void 0,
15687
15860
  produces: {
@@ -15692,16 +15865,16 @@ function info_default3({ defineComponent, Av, validation }) {
15692
15865
  display: (desc) => {
15693
15866
  return {
15694
15867
  port: desc.config.port.toString(),
15695
- ip: desc.config.ip
15868
+ ip: desc.config.host
15696
15869
  };
15697
15870
  },
15698
15871
  configForm: {
15699
15872
  form: {
15700
15873
  port: { help: "The port this SRT input will connect to", hint: { type: "numeric", validation: Port, defaultValue: 5001 } },
15701
- ip: { help: "The IP address this SRT input will connect to", hint: { type: "text", validation: IpAddress, defaultValue: "0.0.0.0" } },
15874
+ host: { help: "The IP address/hostname this SRT input will connect to", hint: { type: "text", validation: Hostname, defaultValue: "0.0.0.0" } },
15702
15875
  sourceName: { help: "Source name to identify this by", hint: { type: "text", validation: SourceName, defaultValue: "camera1" } },
15703
- passphrase: { help: "Optional: Authentication for this SRT input", hint: { type: "text", validation: SrtPassphrase } },
15704
- streamId: { help: "Optional: StreamId to use when calling the remote listener", hint: { type: "text", validation: SrtStreamId } },
15876
+ passphrase: { help: "Optional: Authentication for this SRT input", hint: { type: "text", optional: true, validation: SrtPassphrase } },
15877
+ streamId: { help: "Optional: StreamId to use when calling the remote listener", hint: { type: "text", optional: true, validation: SrtStreamId } },
15705
15878
  socketOptions: {
15706
15879
  help: "Socket Options",
15707
15880
  hint: {
@@ -15720,7 +15893,7 @@ var import_react3 = __toESM(require_react());
15720
15893
  var InlineView4 = import_react3.default.lazy(async () => Promise.resolve().then(() => (init_inline_view2(), inline_view_exports2)));
15721
15894
  var SummaryView4 = import_react3.default.lazy(async () => Promise.resolve().then(() => (init_summary_view2(), summary_view_exports2)));
15722
15895
  function info_default4({ defineComponent, Av, validation }) {
15723
- const { Z, Port, IpAddress, SourceName, SrtPassphrase, unique } = validation;
15896
+ const { Z, Port, Hostname, SourceName, SrtPassphrase, unique } = validation;
15724
15897
  const SocketConfiguration2 = import_react3.default.lazy(async () => {
15725
15898
  const views = await Promise.resolve().then(() => (init_srt_form_views(), srt_form_views_exports));
15726
15899
  return { default: views.SocketConfiguration };
@@ -15729,6 +15902,7 @@ function info_default4({ defineComponent, Av, validation }) {
15729
15902
  identifier: "input.srt-listener",
15730
15903
  category: "input",
15731
15904
  name: "SRT Ingest (Listener)",
15905
+ description: "This component handles media ingest via the SRT(Secure Reliable Transport) protocol. It acts as a listener, receiving media streams from remote SRT sources and is highly configurable, allowing for custom IP addresses, ports, and stream handling behaviours.",
15732
15906
  subscription: {
15733
15907
  accepts: void 0,
15734
15908
  produces: {
@@ -15749,7 +15923,7 @@ function info_default4({ defineComponent, Av, validation }) {
15749
15923
  display: (desc) => {
15750
15924
  return {
15751
15925
  port: desc.config.port.toString(),
15752
- ip: desc.config.ip
15926
+ ip: desc.config.host
15753
15927
  };
15754
15928
  },
15755
15929
  runtime: {
@@ -15783,11 +15957,11 @@ function info_default4({ defineComponent, Av, validation }) {
15783
15957
  envOverride: true
15784
15958
  }
15785
15959
  },
15786
- ip: {
15787
- help: "The IP address this SRT input will listen on",
15960
+ host: {
15961
+ help: "The IP address/hostname this SRT input will listen on",
15788
15962
  hint: {
15789
15963
  type: "text",
15790
- validation: IpAddress,
15964
+ validation: Hostname,
15791
15965
  defaultValue: "0.0.0.0",
15792
15966
  envOverride: true
15793
15967
  }
@@ -15796,6 +15970,7 @@ function info_default4({ defineComponent, Av, validation }) {
15796
15970
  help: "Optional: Authentication for this SRT input",
15797
15971
  hint: {
15798
15972
  type: "text",
15973
+ optional: true,
15799
15974
  validation: SrtPassphrase,
15800
15975
  envOverride: true
15801
15976
  }
@@ -15837,11 +16012,12 @@ function assertUnreachable2(_) {
15837
16012
  }
15838
16013
 
15839
16014
  // build/input.udp-ts/info.js
15840
- function info_default5({ defineComponent, Av, validation: { Z, Port, IpAddress, SourceName, unique } }) {
16015
+ function info_default5({ defineComponent, Av, validation: { Z, Port, Hostname, SourceName, unique } }) {
15841
16016
  return defineComponent({
15842
16017
  identifier: "input.udp-ts",
15843
16018
  category: "input",
15844
16019
  name: "UDP TS ingest",
16020
+ description: "This component receives and processes MPEG Transport Streams (TS) over UDP.",
15845
16021
  subscription: {
15846
16022
  accepts: void 0,
15847
16023
  produces: {
@@ -15852,15 +16028,15 @@ function info_default5({ defineComponent, Av, validation: { Z, Port, IpAddress,
15852
16028
  display: (desc) => {
15853
16029
  return {
15854
16030
  port: desc.config.port.toString(),
15855
- ip: desc.config.ip
16031
+ ip: desc.config.host
15856
16032
  };
15857
16033
  },
15858
16034
  configForm: {
15859
16035
  form: {
15860
16036
  port: { help: "The receiving port", hint: { type: "numeric", validation: Port, defaultValue: 5001, global: unique("port") } },
15861
- ip: { help: "The receiving IP address", hint: { type: "text", validation: IpAddress, defaultValue: "127.0.0.1" } },
16037
+ host: { help: "The receiving IP address/hostname", hint: { type: "text", validation: Hostname, defaultValue: "127.0.0.1" } },
15862
16038
  sourceName: { help: "Source name to identify this by", hint: { type: "text", validation: SourceName, defaultValue: "udp-ts", global: unique("sourceName") } },
15863
- interface: { help: "Optional interface to bind to", hint: { type: "text", validation: Z.union([Z.string().min(2).max(32), Z.string().length(0)]).optional() } },
16039
+ interface: { help: "Optional interface to bind to", hint: { type: "text", optional: true, validation: Z.union([Z.string().min(2).max(32), Z.string().length(0)]).optional() } },
15864
16040
  timeout: { help: "Timeout in milliseconds before determining the input is closed", hint: { type: "numeric", validation: Z.number().refine((value) => value > 0 && value < 6e5, "Timeout must be less than 10 minutes"), defaultValue: 1e3 } },
15865
16041
  rtpDecapsulate: { help: "Whether to expect the input TS to be encapsulated in RTP via RFC 2250 (default: false)", hint: { type: "boolean" } }
15866
16042
  }
@@ -15874,6 +16050,7 @@ function info_default6({ defineComponent, Video, validation: { SourceName }, com
15874
16050
  identifier: "input.videoTestCard",
15875
16051
  category: "input",
15876
16052
  name: "Video Test Card",
16053
+ description: "The Video Test Card component generates a test card video stream with customizable settings.",
15877
16054
  subscription: {
15878
16055
  accepts: void 0,
15879
16056
  produces: {
@@ -15911,9 +16088,11 @@ function info_default6({ defineComponent, Video, validation: { SourceName }, com
15911
16088
  }
15912
16089
 
15913
16090
  // build/output.autoCmaf/info.js
16091
+ var import_config = __toESM(require_config());
15914
16092
  var import_react6 = __toESM(require_react());
15915
- function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
15916
- const SummaryView6 = import_react6.default.lazy(async () => Promise.resolve().then(() => (init_summary(), summary_exports)));
16093
+ function info_default7(R) {
16094
+ const { defineComponent, All, validation: { Z, Hostname } } = R;
16095
+ const SummaryView8 = import_react6.default.lazy(async () => Promise.resolve().then(() => (init_summary(), summary_exports)));
15917
16096
  const FullscreenView2 = import_react6.default.lazy(async () => Promise.resolve().then(() => (init_fullscreen(), fullscreen_exports)));
15918
16097
  const SegmentConfiguration2 = import_react6.default.lazy(async () => {
15919
16098
  const views = await Promise.resolve().then(() => (init_form_views(), form_views_exports));
@@ -15927,6 +16106,7 @@ function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
15927
16106
  identifier: "output.autoCmaf",
15928
16107
  category: "output",
15929
16108
  name: "Auto CMAF",
16109
+ description: "This component handles the creation of CMAF outputs from multiple video and audio streams.",
15930
16110
  subscription: {
15931
16111
  // Again, accept anything
15932
16112
  // but reject the same stream twice
@@ -15941,6 +16121,32 @@ function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
15941
16121
  if (audioStreams.length == 0) {
15942
16122
  ctx.addError("AutoCMAF requires at least one audio stream");
15943
16123
  }
16124
+ const uniqueVideoStreamNodes = ctx.subscriptions.reduce((acc, s) => {
16125
+ if (s.streams.select.includes("video")) {
16126
+ if (!acc.includes(s.source)) {
16127
+ acc.push(s.source);
16128
+ }
16129
+ }
16130
+ return acc;
16131
+ }, []);
16132
+ if (uniqueVideoStreamNodes.length > 1) {
16133
+ ctx.addWarning("More than one video source detected, did you mean to do this? (For example: Did you subscribe to both a source *and* a ladder?)");
16134
+ }
16135
+ if (ctx.config.drmProvider && ctx.config.__global) {
16136
+ if (ctx.config.drmProvider === "ezdrm") {
16137
+ if (!ctx.config.__global.ezdrmConfig?.token) {
16138
+ ctx.addError("Provide EZDRM token in global configuration");
16139
+ }
16140
+ }
16141
+ if (ctx.config.drmProvider === "axinom") {
16142
+ if (!ctx.config.__global.axinomConfig?.tenantId) {
16143
+ ctx.addError("Provide Axinom DRM Tenant ID in global configuration");
16144
+ }
16145
+ if (!ctx.config.__global.axinomConfig?.managementKey) {
16146
+ ctx.addError("Provide Axinom DRM Management Key in global configuration");
16147
+ }
16148
+ }
16149
+ }
15944
16150
  },
15945
16151
  display: (desc) => {
15946
16152
  return {
@@ -15954,16 +16160,21 @@ function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
15954
16160
  switch (evType) {
15955
16161
  case "url-published":
15956
16162
  state.url = ev.url;
16163
+ state.drmToken = ev.drmToken;
15957
16164
  break;
15958
16165
  default:
15959
16166
  assertUnreachable3(evType);
15960
16167
  }
15961
16168
  return { ...state };
15962
16169
  },
15963
- summary: SummaryView6,
16170
+ summary: SummaryView8,
15964
16171
  fullscreen: FullscreenView2
15965
16172
  },
15966
16173
  configForm: {
16174
+ global: {
16175
+ ezdrmConfig: (0, import_config.GlobalEzDrmConfig)(R),
16176
+ axinomConfig: (0, import_config.GlobalAxinomConfig)(R)
16177
+ },
15967
16178
  form: {
15968
16179
  name: {
15969
16180
  help: "The name of the multivariant/dash playlist",
@@ -16031,6 +16242,7 @@ function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
16031
16242
  help: "How many segments back should a player start",
16032
16243
  hint: {
16033
16244
  type: "numeric",
16245
+ optional: true,
16034
16246
  validation: Z.number().min(3).max(10).int().optional()
16035
16247
  }
16036
16248
  },
@@ -16038,6 +16250,7 @@ function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
16038
16250
  help: "How many parts back should a player start",
16039
16251
  hint: {
16040
16252
  type: "numeric",
16253
+ optional: true,
16041
16254
  validation: Z.number().min(3).max(10).int().optional()
16042
16255
  }
16043
16256
  }
@@ -16075,6 +16288,23 @@ function info_default7({ defineComponent, All, validation: { Z, Hostname } }) {
16075
16288
  }
16076
16289
  }
16077
16290
  }
16291
+ },
16292
+ drmProvider: {
16293
+ help: "Encrypt with a DRM provider (if configured globally)",
16294
+ hint: {
16295
+ type: "select",
16296
+ optional: true,
16297
+ options: [
16298
+ {
16299
+ display: "EZDRM",
16300
+ value: "ezdrm"
16301
+ },
16302
+ {
16303
+ display: "Axinom DRM",
16304
+ value: "axinom"
16305
+ }
16306
+ ]
16307
+ }
16078
16308
  }
16079
16309
  }
16080
16310
  }
@@ -16086,14 +16316,15 @@ function assertUnreachable3(_) {
16086
16316
 
16087
16317
  // build/output.preview/info.js
16088
16318
  var import_react8 = __toESM(require_react());
16089
- var import_config = __toESM(require_config());
16319
+ var import_config2 = __toESM(require_config());
16090
16320
  function info_default8(R) {
16091
16321
  const { defineComponent, Av, validation: { JitterBuffer } } = R;
16092
- const InlineView13 = import_react8.default.lazy(async () => Promise.resolve().then(() => (init_inline_view3(), inline_view_exports3)));
16322
+ const InlineView15 = import_react8.default.lazy(async () => Promise.resolve().then(() => (init_inline_view3(), inline_view_exports3)));
16093
16323
  return defineComponent({
16094
16324
  identifier: "output.preview",
16095
16325
  category: "output",
16096
16326
  name: "Preview",
16327
+ description: "Preview allows for the real-time preview of media streams. It provides a way to visualize and monitor the output from various media sources before final processing or distribution.",
16097
16328
  subscription: {
16098
16329
  accepts: {
16099
16330
  type: "single-stream",
@@ -16139,12 +16370,12 @@ function info_default8(R) {
16139
16370
  }
16140
16371
  return { ...state };
16141
16372
  },
16142
- inline: InlineView13
16373
+ inline: InlineView15
16143
16374
  },
16144
16375
  configForm: {
16145
16376
  global: {
16146
- iceServers: (0, import_config.GlobalIceServers)(R),
16147
- hardware: (0, import_config.HardwareSelection)()
16377
+ iceServers: (0, import_config2.GlobalIceServers)(R),
16378
+ hardware: (0, import_config2.HardwareSelection)()
16148
16379
  },
16149
16380
  form: {
16150
16381
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } }
@@ -16159,11 +16390,12 @@ function assertUnreachable4(_) {
16159
16390
  // build/output.rtmp/info.js
16160
16391
  var import_react9 = __toESM(require_react());
16161
16392
  function info_default9({ defineComponent, Av, validation: { Z, JitterBuffer } }) {
16162
- const InlineView13 = import_react9.default.lazy(async () => Promise.resolve().then(() => (init_inline_view4(), inline_view_exports4)));
16393
+ const InlineView15 = import_react9.default.lazy(async () => Promise.resolve().then(() => (init_inline_view4(), inline_view_exports4)));
16163
16394
  return defineComponent({
16164
16395
  identifier: "output.rtmp",
16165
16396
  category: "output",
16166
16397
  name: "RTMP Egest",
16398
+ description: "This component handles the output of RTMP (Real-Time Messaging Protocol) streams. It is used to connect to a remote RTMP server and manage the streaming of media. ",
16167
16399
  subscription: {
16168
16400
  // No validation?
16169
16401
  // Accept either *just* audio, or *just* video, or audio *and* video
@@ -16197,7 +16429,7 @@ function info_default9({ defineComponent, Av, validation: { Z, JitterBuffer } })
16197
16429
  }
16198
16430
  return { ...state };
16199
16431
  },
16200
- inline: InlineView13
16432
+ inline: InlineView15
16201
16433
  },
16202
16434
  configForm: {
16203
16435
  form: {
@@ -16217,7 +16449,7 @@ function assertUnreachable5(_) {
16217
16449
  var import_react10 = __toESM(require_react());
16218
16450
  function info_default10(registration) {
16219
16451
  const { defineComponent, All, validation } = registration;
16220
- const { Port, IpAddress, JitterBuffer, SrtPassphrase, SrtStreamId } = validation;
16452
+ const { Port, Hostname, JitterBuffer, SrtPassphrase, SrtStreamId } = validation;
16221
16453
  const SocketConfiguration2 = import_react10.default.lazy(async () => {
16222
16454
  const views = await Promise.resolve().then(() => (init_srt_form_views(), srt_form_views_exports));
16223
16455
  return { default: views.SocketConfiguration };
@@ -16226,6 +16458,7 @@ function info_default10(registration) {
16226
16458
  identifier: "output.srt",
16227
16459
  category: "output",
16228
16460
  name: "SRT Egest",
16461
+ description: "This component manages the sending of SRT (Secure Reliable Transport) streams. It allows you to configure various settings to control how the SRT output is handled, including connection details, buffer settings, and delay options.",
16229
16462
  subscription: {
16230
16463
  // No validation?
16231
16464
  // Streams have to be unique? That's a stretch goal
@@ -16237,7 +16470,7 @@ function info_default10(registration) {
16237
16470
  display: (desc) => {
16238
16471
  return {
16239
16472
  port: desc.config.port?.toString() ?? "",
16240
- ip: desc.config.ip,
16473
+ host: desc.config.host,
16241
16474
  mode: desc.config.mode,
16242
16475
  bufferDelayMs: desc.config.bufferDelayMs?.toString() ?? "none"
16243
16476
  };
@@ -16257,7 +16490,7 @@ function info_default10(registration) {
16257
16490
  }
16258
16491
  }
16259
16492
  },
16260
- ip: { help: "The IP address this SRT output will connect to or listen on", hint: { type: "text", validation: IpAddress, defaultValue: "0.0.0.0" } },
16493
+ host: { help: "The IP address/Hostname this SRT output will connect to or listen on", hint: { type: "text", validation: Hostname, defaultValue: "0.0.0.0" } },
16261
16494
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16262
16495
  avDelayMs: { help: "How many milliseconds to delay A/V to account for subtitles/ancillary data", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 50 } },
16263
16496
  mode: {
@@ -16277,8 +16510,8 @@ function info_default10(registration) {
16277
16510
  ]
16278
16511
  }
16279
16512
  },
16280
- passphrase: { help: "Optional: Authentication for this SRT output", hint: { type: "text", validation: SrtPassphrase } },
16281
- streamId: { help: "Optional: StreamId to use when calling a remote listener", hint: { type: "text", validation: SrtStreamId } },
16513
+ passphrase: { help: "Optional: Authentication for this SRT output", hint: { type: "text", optional: true, validation: SrtPassphrase } },
16514
+ streamId: { help: "Optional: StreamId to use when calling a remote listener", hint: { type: "text", optional: true, validation: SrtStreamId } },
16282
16515
  socketOptions: {
16283
16516
  help: "Socket Options",
16284
16517
  hint: {
@@ -16296,11 +16529,12 @@ function info_default10(registration) {
16296
16529
  init_info();
16297
16530
 
16298
16531
  // build/output.udpTs/info.js
16299
- function info_default12({ defineComponent, All, validation: { Port, IpAddress, JitterBuffer, Iface, Z } }) {
16532
+ function info_default12({ defineComponent, All, validation: { Port, Hostname, JitterBuffer, Iface, Z } }) {
16300
16533
  return defineComponent({
16301
16534
  identifier: "output.udpTs",
16302
16535
  category: "output",
16303
16536
  name: "UDP TS Egest",
16537
+ description: "This component outputs multiple media streams over UDP in TS (Transport Stream) format. It accepts multiple input streams and sends them to a specified IP address and port.",
16304
16538
  subscription: {
16305
16539
  // Just works with no validation
16306
16540
  // although uniqueness again, stretch goal
@@ -16312,7 +16546,7 @@ function info_default12({ defineComponent, All, validation: { Port, IpAddress, J
16312
16546
  display: (desc) => {
16313
16547
  return {
16314
16548
  port: desc.config.port.toString(),
16315
- destinationIp: desc.config.destinationIp,
16549
+ destinationIp: desc.config.destinationHost,
16316
16550
  interface: desc.config.interface,
16317
16551
  bufferDelayMs: desc.config.bufferDelayMs?.toString() ?? "none"
16318
16552
  };
@@ -16320,7 +16554,7 @@ function info_default12({ defineComponent, All, validation: { Port, IpAddress, J
16320
16554
  configForm: {
16321
16555
  form: {
16322
16556
  port: { help: "The port this UDP TS output will send to", hint: { type: "numeric", validation: Port, defaultValue: 8001 } },
16323
- destinationIp: { help: "The IP address this UDP TS output will send to", hint: { type: "text", validation: IpAddress, defaultValue: "127.0.0.1" } },
16557
+ destinationHost: { help: "The IP address/Hostname this UDP TS output will send to", hint: { type: "text", validation: Hostname, defaultValue: "127.0.0.1" } },
16324
16558
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } },
16325
16559
  interface: { help: "Which interface to bind to for publishing", hint: { type: "text", validation: Z.union([Z.string().length(0), Iface]), defaultValue: "any" } }
16326
16560
  }
@@ -16329,13 +16563,14 @@ function info_default12({ defineComponent, All, validation: { Port, IpAddress, J
16329
16563
  }
16330
16564
 
16331
16565
  // build/output.whep/info.js
16332
- var import_config2 = __toESM(require_config());
16566
+ var import_config3 = __toESM(require_config());
16333
16567
  function info_default13(R) {
16334
16568
  const { defineComponent, Av, validation: { JitterBuffer } } = R;
16335
16569
  return defineComponent({
16336
16570
  identifier: "output.whep",
16337
16571
  category: "output",
16338
16572
  name: "WHEP Egest",
16573
+ description: "This component allows us to use WebRTC egress for outputs.",
16339
16574
  subscription: {
16340
16575
  // No validation?
16341
16576
  // Accept either *just* audio, or *just* video, or audio *and* video
@@ -16352,7 +16587,7 @@ function info_default13(R) {
16352
16587
  },
16353
16588
  configForm: {
16354
16589
  global: {
16355
- iceServers: (0, import_config2.GlobalIceServers)(R)
16590
+ iceServers: (0, import_config3.GlobalIceServers)(R)
16356
16591
  },
16357
16592
  form: {
16358
16593
  bufferDelayMs: { help: "How many milliseconds in the jitter buffer", hint: { type: "numeric", validation: JitterBuffer, defaultValue: 500 } }
@@ -16362,12 +16597,16 @@ function info_default13(R) {
16362
16597
  }
16363
16598
 
16364
16599
  // build/processor.browserOverlay/info.js
16365
- var import_config3 = __toESM(require_config());
16600
+ var import_config4 = __toESM(require_config());
16601
+ var import_react13 = __toESM(require_react());
16602
+ var SummaryView6 = import_react13.default.lazy(async () => Promise.resolve().then(() => (init_summary_view3(), summary_view_exports3)));
16603
+ var InlineView10 = import_react13.default.lazy(async () => Promise.resolve().then(() => (init_inline_view6(), inline_view_exports6)));
16366
16604
  function info_default14({ defineComponent, Video, validation: { Z } }) {
16367
16605
  return defineComponent({
16368
16606
  identifier: "processor.browserOverlay",
16369
16607
  category: "processor",
16370
16608
  name: "Browser Overlay",
16609
+ description: "Capture a live URL and overlay onto a video",
16371
16610
  subscription: {
16372
16611
  // Only accept a single video stream
16373
16612
  accepts: {
@@ -16384,12 +16623,33 @@ function info_default14({ defineComponent, Video, validation: { Z } }) {
16384
16623
  },
16385
16624
  display: (desc) => {
16386
16625
  return {
16387
- url: desc.config?.url
16626
+ url: desc.config.url
16388
16627
  };
16389
16628
  },
16629
+ runtime: {
16630
+ summary: SummaryView6,
16631
+ inline: InlineView10,
16632
+ initialState: () => ({
16633
+ currentUrl: "",
16634
+ enabled: true
16635
+ }),
16636
+ handleEvent: (ev, state) => {
16637
+ const evType = ev.type;
16638
+ switch (evType) {
16639
+ case "url-changed":
16640
+ return { ...state, currentUrl: ev.url };
16641
+ case "enabled":
16642
+ return { ...state, enabled: true };
16643
+ case "disabled":
16644
+ return { ...state, enabled: false };
16645
+ default:
16646
+ assertUnreachable7(evType);
16647
+ }
16648
+ }
16649
+ },
16390
16650
  configForm: {
16391
16651
  global: {
16392
- hardware: (0, import_config3.HardwareSelection)()
16652
+ hardware: (0, import_config4.HardwareSelection)()
16393
16653
  },
16394
16654
  form: {
16395
16655
  url: { help: "URL to render on top of the video", hint: { type: "text", validation: Z.string().url(), defaultValue: "" } }
@@ -16397,15 +16657,19 @@ function info_default14({ defineComponent, Video, validation: { Z } }) {
16397
16657
  }
16398
16658
  });
16399
16659
  }
16660
+ function assertUnreachable7(_) {
16661
+ throw new Error("Didn't expect to get here");
16662
+ }
16400
16663
 
16401
16664
  // build/processor.cascadingSwitch/info.js
16402
- function info_default15({ defineComponent, Av, React: React14, common: { Resolutions, FrameRates } }) {
16403
- const SourceSelection = React14.lazy(async () => Promise.resolve().then(() => (init_source_selection(), source_selection_exports)));
16404
- const InlineView13 = React14.lazy(async () => Promise.resolve().then(() => (init_inline_view6(), inline_view_exports6)));
16665
+ function info_default15({ defineComponent, Av, React: React15, common: { Resolutions, FrameRates } }) {
16666
+ const SourceSelection = React15.lazy(async () => Promise.resolve().then(() => (init_source_selection(), source_selection_exports)));
16667
+ const InlineView15 = React15.lazy(async () => Promise.resolve().then(() => (init_inline_view7(), inline_view_exports7)));
16405
16668
  return defineComponent({
16406
16669
  identifier: "processor.cascadingSwitch",
16407
16670
  category: "processor",
16408
16671
  name: "Cascading Switch",
16672
+ description: "This component manages multiple A/V (audio and video) sources based on priority, allowing for the configuration of settings such as resolution, frame rate, sample rate, and channel layout.",
16409
16673
  subscription: {
16410
16674
  // This needs to change anyway
16411
16675
  // but it'll be the same as MCS
@@ -16479,12 +16743,12 @@ function info_default15({ defineComponent, Av, React: React14, common: { Resolut
16479
16743
  state.availableSources.splice(state.availableSources.indexOf(ev.source), 1);
16480
16744
  return { ...state };
16481
16745
  default:
16482
- assertUnreachable7(evType);
16746
+ assertUnreachable8(evType);
16483
16747
  }
16484
16748
  },
16485
- inline: InlineView13,
16486
- summary: InlineView13,
16487
- fullscreen: InlineView13
16749
+ inline: InlineView15,
16750
+ summary: InlineView15,
16751
+ fullscreen: InlineView15
16488
16752
  },
16489
16753
  configForm: {
16490
16754
  form: {
@@ -16530,98 +16794,22 @@ function info_default15({ defineComponent, Av, React: React14, common: { Resolut
16530
16794
  }
16531
16795
  });
16532
16796
  }
16533
- function assertUnreachable7(_) {
16534
- throw new Error("Didn't expect to get here");
16535
- }
16536
-
16537
- // build/processor.dynamicBug/info.js
16538
- var import_config4 = __toESM(require_config());
16539
- var import_react15 = __toESM(require_react());
16540
- function info_default16({ defineComponent, Video }) {
16541
- const BugSelection2 = import_react15.default.lazy(async () => Promise.resolve().then(() => (init_bug_selection(), bug_selection_exports)));
16542
- const SummaryView6 = import_react15.default.lazy(async () => Promise.resolve().then(() => (init_summary_view3(), summary_view_exports3)));
16543
- return defineComponent({
16544
- identifier: "processor.dynamicBug",
16545
- category: "processor",
16546
- name: "Dynamic Bug",
16547
- description: "",
16548
- subscription: {
16549
- // Only accept a single video stream
16550
- accepts: {
16551
- type: "single-stream",
16552
- media: Video
16553
- },
16554
- produces: {
16555
- type: "single-stream",
16556
- media: Video
16557
- }
16558
- },
16559
- extraValidation: function(ctx) {
16560
- ctx.requireVideo(1);
16561
- },
16562
- display: (desc) => {
16563
- return {
16564
- default: desc.config.initialBug ?? "none"
16565
- };
16566
- },
16567
- runtime: {
16568
- summary: SummaryView6,
16569
- initialState: () => ({}),
16570
- handleEvent: (ev, state) => {
16571
- const evType = ev.type;
16572
- switch (evType) {
16573
- case "bug-changed":
16574
- return { ...state, activeBug: { file: ev.file, position: ev.position } };
16575
- default:
16576
- assertUnreachable8(evType);
16577
- }
16578
- }
16579
- },
16580
- configForm: {
16581
- global: {
16582
- hardware: (0, import_config4.HardwareSelection)()
16583
- },
16584
- form: {
16585
- initialBug: {
16586
- help: "The initial bug to render on the video (if any)",
16587
- hint: {
16588
- type: "custom",
16589
- optional: true,
16590
- component: BugSelection2
16591
- }
16592
- },
16593
- initialPosition: {
16594
- help: "The initial location at which to render the bug",
16595
- hint: {
16596
- type: "select",
16597
- optional: true,
16598
- options: [
16599
- { value: "topleft", display: "Top Left" },
16600
- { value: "topright", display: "Top Right" },
16601
- { value: "bottomleft", display: "Bottom Left" },
16602
- { value: "bottomright", display: "Bottom Right" }
16603
- ]
16604
- }
16605
- }
16606
- }
16607
- }
16608
- });
16609
- }
16610
16797
  function assertUnreachable8(_) {
16611
16798
  throw new Error("Didn't expect to get here");
16612
16799
  }
16613
16800
 
16614
16801
  // build/processor.fixedLadder/info.js
16615
- var import_react17 = __toESM(require_react());
16802
+ var import_react16 = __toESM(require_react());
16616
16803
  var import_config5 = __toESM(require_config());
16617
- function info_default17({ defineComponent, Video }) {
16618
- const RungView = import_react17.default.lazy(async () => Promise.resolve().then(() => (init_rung_view(), rung_view_exports)));
16619
- const CodecEditor3 = import_react17.default.lazy(async () => Promise.resolve().then(() => (init_codec_editor(), codec_editor_exports)));
16620
- const CodecView = import_react17.default.lazy(async () => Promise.resolve().then(() => (init_codec_view(), codec_view_exports)));
16804
+ function info_default16({ defineComponent, Video }) {
16805
+ const RungView = import_react16.default.lazy(async () => Promise.resolve().then(() => (init_rung_view(), rung_view_exports)));
16806
+ const CodecEditor3 = import_react16.default.lazy(async () => Promise.resolve().then(() => (init_codec_editor(), codec_editor_exports)));
16807
+ const CodecView = import_react16.default.lazy(async () => Promise.resolve().then(() => (init_codec_view(), codec_view_exports)));
16621
16808
  return defineComponent({
16622
16809
  identifier: "processor.fixedLadder",
16623
16810
  category: "processor",
16624
16811
  name: "Encode Ladder",
16812
+ description: "The Fixed Ladder Encoder is a processor component for encoding a single input video stream into multiple encoded renditions. It creates an encoding ladder, where each `rung` represents a different quality level or rendition of the original video, typically varying in resolution and bitrate.",
16625
16813
  subscription: {
16626
16814
  // Only accept a single video stream
16627
16815
  accepts: {
@@ -16937,12 +17125,90 @@ function assertUnreachable9(_) {
16937
17125
  throw new Error("Didn't expect to get here");
16938
17126
  }
16939
17127
 
17128
+ // build/processor.onscreenGraphic/info.js
17129
+ var import_config6 = __toESM(require_config());
17130
+ var import_react19 = __toESM(require_react());
17131
+ function info_default17({ defineComponent, Video }) {
17132
+ const GraphicSelection2 = import_react19.default.lazy(async () => Promise.resolve().then(() => (init_image_selection(), image_selection_exports)));
17133
+ const SummaryView8 = import_react19.default.lazy(async () => Promise.resolve().then(() => (init_summary_view4(), summary_view_exports4)));
17134
+ return defineComponent({
17135
+ identifier: "processor.onscreenGraphic",
17136
+ category: "processor",
17137
+ name: "Onscreen Graphic",
17138
+ description: "Overlay graphics onto a video",
17139
+ subscription: {
17140
+ // Only accept a single video stream
17141
+ accepts: {
17142
+ type: "single-stream",
17143
+ media: Video
17144
+ },
17145
+ produces: {
17146
+ type: "single-stream",
17147
+ media: Video
17148
+ }
17149
+ },
17150
+ extraValidation: function(ctx) {
17151
+ ctx.requireVideo(1);
17152
+ },
17153
+ display: (desc) => {
17154
+ return {
17155
+ default: desc.config.initialGraphic ?? "none"
17156
+ };
17157
+ },
17158
+ runtime: {
17159
+ summary: SummaryView8,
17160
+ initialState: () => ({}),
17161
+ handleEvent: (ev, state) => {
17162
+ const evType = ev.type;
17163
+ switch (evType) {
17164
+ case "graphic-changed":
17165
+ return { ...state, activeGraphic: { file: ev.file, position: ev.position } };
17166
+ default:
17167
+ assertUnreachable10(evType);
17168
+ }
17169
+ }
17170
+ },
17171
+ configForm: {
17172
+ global: {
17173
+ hardware: (0, import_config6.HardwareSelection)()
17174
+ },
17175
+ form: {
17176
+ initialGraphic: {
17177
+ help: "The initial graphic to render on the video (if any)",
17178
+ hint: {
17179
+ type: "custom",
17180
+ optional: true,
17181
+ component: GraphicSelection2
17182
+ }
17183
+ },
17184
+ initialPosition: {
17185
+ help: "The initial location at which to render the graphic",
17186
+ hint: {
17187
+ type: "select",
17188
+ optional: true,
17189
+ options: [
17190
+ { value: "topleft", display: "Top Left" },
17191
+ { value: "topright", display: "Top Right" },
17192
+ { value: "bottomleft", display: "Bottom Left" },
17193
+ { value: "bottomright", display: "Bottom Right" }
17194
+ ]
17195
+ }
17196
+ }
17197
+ }
17198
+ }
17199
+ });
17200
+ }
17201
+ function assertUnreachable10(_) {
17202
+ throw new Error("Didn't expect to get here");
17203
+ }
17204
+
16940
17205
  // build/processor.whisper-transcribe/info.js
16941
17206
  function info_default18({ defineComponent, Av, Subtitle, validation: { Z } }) {
16942
17207
  return defineComponent({
16943
17208
  identifier: "processor.whisper-transcribe",
16944
17209
  category: "processor",
16945
17210
  name: "Whisper Transcribe",
17211
+ description: "This component transcribes audio from a video stream.",
16946
17212
  subscription: {
16947
17213
  accepts: {
16948
17214
  type: "single-stream",
@@ -16972,23 +17238,24 @@ function info_default18({ defineComponent, Av, Subtitle, validation: { Z } }) {
16972
17238
  configForm: {
16973
17239
  form: {
16974
17240
  model: { help: "The ggml model path", hint: { type: "text", validation: Z.string().min(1, "Choosing a model is mandatory") } },
16975
- translate: { help: "Whether to translate the output to English", hint: { type: "boolean", defaultValue: false } },
16976
- language: { help: "Source language (otherwise automatic)", hint: { type: "text", validation: Z.union([Z.string().length(0), Z.string().min(1)]) } }
17241
+ translate: { help: "Whether to translate the output to English", hint: { type: "boolean", optional: true, defaultValue: false } },
17242
+ language: { help: "Source language (otherwise automatic)", hint: { type: "text", optional: true, validation: Z.union([Z.string().length(0), Z.string().min(1)]) } }
16977
17243
  }
16978
17244
  }
16979
17245
  });
16980
17246
  }
16981
17247
 
16982
17248
  // build/util.stats.latency/info.js
16983
- var import_react19 = __toESM(require_react());
17249
+ var import_react21 = __toESM(require_react());
16984
17250
  function info_default19(R) {
16985
17251
  const { defineComponent } = R;
16986
- const InlineView13 = import_react19.default.lazy(async () => Promise.resolve().then(() => (init_inline_view7(), inline_view_exports7)));
16987
- const SourceNodeSelection2 = import_react19.default.lazy(async () => Promise.resolve().then(() => (init_source_node_selection(), source_node_selection_exports)));
17252
+ const InlineView15 = import_react21.default.lazy(async () => Promise.resolve().then(() => (init_inline_view8(), inline_view_exports8)));
17253
+ const SourceNodeSelection2 = import_react21.default.lazy(async () => Promise.resolve().then(() => (init_source_node_selection(), source_node_selection_exports)));
16988
17254
  return defineComponent({
16989
17255
  identifier: "util.stats.latency",
16990
17256
  category: "output",
16991
17257
  name: "Latency Probe",
17258
+ description: "This component tracks and processes latency statistics within a media processing pipeline.",
16992
17259
  subscription: {
16993
17260
  accepts: void 0,
16994
17261
  produces: void 0
@@ -17011,11 +17278,11 @@ function info_default19(R) {
17011
17278
  break;
17012
17279
  }
17013
17280
  default:
17014
- assertUnreachable10(evType);
17281
+ assertUnreachable11(evType);
17015
17282
  }
17016
17283
  return { ...state };
17017
17284
  },
17018
- inline: InlineView13
17285
+ inline: InlineView15
17019
17286
  },
17020
17287
  configForm: {
17021
17288
  form: {
@@ -17065,19 +17332,20 @@ function info_default19(R) {
17065
17332
  }
17066
17333
  });
17067
17334
  }
17068
- function assertUnreachable10(_) {
17335
+ function assertUnreachable11(_) {
17069
17336
  throw new Error("Didn't expect to get here");
17070
17337
  }
17071
17338
 
17072
17339
  // build/util.stats.ma35d/info.js
17073
- var import_react21 = __toESM(require_react());
17340
+ var import_react23 = __toESM(require_react());
17074
17341
  function info_default20(R) {
17075
17342
  const { defineComponent } = R;
17076
- const InlineView13 = import_react21.default.lazy(async () => Promise.resolve().then(() => (init_inline_view8(), inline_view_exports8)));
17343
+ const InlineView15 = import_react23.default.lazy(async () => Promise.resolve().then(() => (init_inline_view9(), inline_view_exports9)));
17077
17344
  return defineComponent({
17078
17345
  identifier: "util.stats.ma35d",
17079
17346
  category: "output",
17080
17347
  name: "MA35D Stats",
17348
+ description: "Tracks and processes statistics for the AMD MA35D processor which is used for the encoding, scaling and decoding of media.",
17081
17349
  subscription: {
17082
17350
  accepts: void 0,
17083
17351
  produces: void 0
@@ -17106,30 +17374,31 @@ function info_default20(R) {
17106
17374
  break;
17107
17375
  }
17108
17376
  default:
17109
- assertUnreachable11(evType);
17377
+ assertUnreachable12(evType);
17110
17378
  }
17111
17379
  return { ...state };
17112
17380
  },
17113
- inline: InlineView13
17381
+ inline: InlineView15
17114
17382
  },
17115
17383
  configForm: {
17116
17384
  form: {}
17117
17385
  }
17118
17386
  });
17119
17387
  }
17120
- function assertUnreachable11(_) {
17388
+ function assertUnreachable12(_) {
17121
17389
  throw new Error("Didn't expect to get here");
17122
17390
  }
17123
17391
 
17124
17392
  // build/util.timestamps/info.js
17125
- var import_react23 = __toESM(require_react());
17393
+ var import_react25 = __toESM(require_react());
17126
17394
  function info_default21(R) {
17127
17395
  const { defineComponent, All } = R;
17128
- const InlineView13 = import_react23.default.lazy(async () => Promise.resolve().then(() => (init_inline_view9(), inline_view_exports9)));
17396
+ const InlineView15 = import_react25.default.lazy(async () => Promise.resolve().then(() => (init_inline_view10(), inline_view_exports10)));
17129
17397
  return defineComponent({
17130
17398
  identifier: "util.timestamps",
17131
17399
  category: "output",
17132
17400
  name: "Jitter",
17401
+ description: "A jitter utility which processes and tracks timestamps.",
17133
17402
  subscription: {
17134
17403
  accepts: {
17135
17404
  type: "multi-stream",
@@ -17160,18 +17429,18 @@ function info_default21(R) {
17160
17429
  break;
17161
17430
  }
17162
17431
  default:
17163
- assertUnreachable12(evType);
17432
+ assertUnreachable13(evType);
17164
17433
  }
17165
17434
  return { ...state };
17166
17435
  },
17167
- inline: InlineView13
17436
+ inline: InlineView15
17168
17437
  },
17169
17438
  configForm: {
17170
17439
  form: {}
17171
17440
  }
17172
17441
  });
17173
17442
  }
17174
- function assertUnreachable12(_) {
17443
+ function assertUnreachable13(_) {
17175
17444
  throw new Error("Didn't expect to get here");
17176
17445
  }
17177
17446